summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am3
-rwxr-xr-xbootstrap8
-rw-r--r--common/Makefile.am7
-rw-r--r--common/arch.h2
-rw-r--r--common/d3des.c510
-rw-r--r--common/d3des.h56
-rw-r--r--common/file.c4
-rw-r--r--common/log.c9
-rw-r--r--common/os_calls.c441
-rw-r--r--common/os_calls.h60
-rw-r--r--common/parse.h4
-rw-r--r--common/ssl_calls.c2
-rw-r--r--common/trans.c336
-rw-r--r--common/trans.h20
-rw-r--r--configure.ac43
-rw-r--r--design.txt2
-rw-r--r--docs/man/xrdp-keygen.84
-rw-r--r--[-rwxr-xr-x]fontdump/Makefile0
-rw-r--r--[-rwxr-xr-x]fontdump/fontdump.c0
-rw-r--r--genkeymap/Makefile.am7
-rw-r--r--install.txt6
-rw-r--r--instfiles/Makefile.am70
-rw-r--r--instfiles/init.d/xrdp4
-rw-r--r--instfiles/km-100c.ini659
-rw-r--r--instfiles/rc.d/Makefile.am4
-rw-r--r--instfiles/rc.d/xrdp84
-rw-r--r--instfiles/xrdp-sesman.service4
-rw-r--r--instfiles/xrdp.service3
-rw-r--r--keygen/Makefile.am6
-rw-r--r--libxrdp/Makefile.am13
-rw-r--r--libxrdp/libxrdp.c12
-rw-r--r--libxrdp/libxrdp.h2
-rw-r--r--libxrdp/libxrdpinc.h2
-rw-r--r--libxrdp/xrdp_channel.c2
-rw-r--r--libxrdp/xrdp_fastpath.c2
-rw-r--r--libxrdp/xrdp_iso.c4
-rw-r--r--libxrdp/xrdp_jpeg_compress.c2
-rw-r--r--libxrdp/xrdp_mcs.c2
-rw-r--r--libxrdp/xrdp_orders.c4
-rw-r--r--libxrdp/xrdp_orders_rail.c6
-rw-r--r--libxrdp/xrdp_sec.c29
-rw-r--r--m4/.gitignore1
-rw-r--r--mc/Makefile.am6
-rw-r--r--mc/mc.h21
-rw-r--r--neutrinordp/Makefile.am6
-rw-r--r--neutrinordp/xrdp-neutrinordp.h21
-rw-r--r--prog_std.txt2
-rw-r--r--rdp/Makefile.am6
-rw-r--r--rdp/rdp.h2
-rw-r--r--rdp/rdp_mcs.c2
-rw-r--r--rdp/rdp_orders.c2
-rw-r--r--rdp/rdp_tcp.c2
-rw-r--r--readme.txt12
-rw-r--r--sesman/Makefile.am12
-rw-r--r--sesman/access.c2
-rw-r--r--sesman/chansrv/Makefile.am18
-rw-r--r--sesman/chansrv/chansrv.c2
-rw-r--r--sesman/chansrv/chansrv_fuse.c19
-rw-r--r--sesman/chansrv/clipboard.c8
-rw-r--r--sesman/chansrv/clipboard_file.c3
-rw-r--r--sesman/chansrv/pulse/module-xrdp-sink.c2
-rw-r--r--sesman/chansrv/pulse/module-xrdp-source.c2
-rw-r--r--sesman/chansrv/rail.c2
-rw-r--r--sesman/env.c47
-rw-r--r--sesman/libscp/Makefile.am6
-rw-r--r--sesman/libscp/libscp_lock.c2
-rw-r--r--sesman/libscp/libscp_lock.h4
-rw-r--r--sesman/libscp/libscp_v1s.c7
-rw-r--r--sesman/lock.c121
-rw-r--r--sesman/lock.h104
-rw-r--r--sesman/scp.c10
-rw-r--r--sesman/scp_v0.c14
-rw-r--r--sesman/scp_v1.c2
-rw-r--r--sesman/sesman.c32
-rw-r--r--sesman/sesman.h5
-rw-r--r--sesman/session.c243
-rw-r--r--sesman/session.h9
-rw-r--r--sesman/sessvc/Makefile.am6
-rw-r--r--sesman/sessvc/sessvc.c2
-rw-r--r--sesman/thread.c173
-rw-r--r--sesman/thread.h56
-rw-r--r--sesman/tools/Makefile.am14
-rw-r--r--sesman/tools/config.c1
-rw-r--r--sesman/tools/sesadmin.c13
-rw-r--r--sesman/tools/sestest.c13
-rw-r--r--sesman/tools/xcon.c1
-rw-r--r--tcutils/README.txt2
-rw-r--r--tcutils/moc_mainwindow.cpp104
-rw-r--r--tcutils/qrc_resources.cpp1191
-rw-r--r--tcutils/tcutils.pro30
-rw-r--r--tcutils/ui_mainwindow.h105
-rw-r--r--tests/gtcp_proxy/gtcp-proxy.c4
-rw-r--r--tests/tcp_proxy/main.c4
-rw-r--r--vnc/Makefile.am6
-rw-r--r--vnc/vnc.c422
-rw-r--r--vnc/vnc.h28
-rw-r--r--xorg/X11R7.6/rdp/rdp.h4
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyFillRect.c8
-rw-r--r--xorg/X11R7.6/rdp/rdpinput.c18
-rw-r--r--xorg/X11R7.6/rdp/rdpmain.c2
-rw-r--r--xorg/X11R7.6/rdp/rdpup.c10
-rw-r--r--xorg/X11R7.6/x11_file_list.txt2
-rw-r--r--xorg/tests/randr/trandr.c2
-rw-r--r--xorg/tests/xdemo/yosemite.bmpbin1843254 -> 1843254 bytes
m---------xorgxrdp0
-rw-r--r--xrdp/Makefile.am14
-rw-r--r--[-rwxr-xr-x]xrdp/ad256.bmpbin19766 -> 19766 bytes
-rw-r--r--xrdp/lang.c2
-rw-r--r--xrdp/rdp-scan-codes.txt2
-rw-r--r--xrdp/rsakeys.ini5
-rw-r--r--[-rwxr-xr-x]xrdp/sans-10.fv1bin658956 -> 658956 bytes
-rw-r--r--xrdp/xrdp.c66
-rw-r--r--xrdp/xrdp.h6
-rw-r--r--[-rwxr-xr-x]xrdp/xrdp256.bmpbin49278 -> 49278 bytes
-rw-r--r--xrdp/xrdp_bitmap.c2
-rw-r--r--xrdp/xrdp_mm.c33
-rw-r--r--xrdp/xrdp_process.c6
-rw-r--r--xrdp/xrdp_types.h20
-rw-r--r--xrdp/xrdp_wm.c9
-rw-r--r--xrdp/xrdpwin.c8
-rw-r--r--xrdpapi/Makefile.am6
-rw-r--r--xrdpapi/xrdpapi.c15
-rw-r--r--xrdpvr/Makefile.am6
-rw-r--r--xup/Makefile.am6
-rw-r--r--xup/xup.c439
-rw-r--r--xup/xup.h26
127 files changed, 2247 insertions, 3843 deletions
diff --git a/.gitignore b/.gitignore
index 7b45b684..0437bf57 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,7 +5,6 @@ autom4te.cache/
ChangeLog
config_ac.h
config_ac-h.in
-config.c
config.guess
config.log
config.status
diff --git a/Makefile.am b/Makefile.am
index e8905c98..8e6e18b8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,3 +1,6 @@
+ACLOCAL_AMFLAGS = -I m4
+AM_DISTCHECK_CONFIGURE_FLAGS = --without-systemdsystemunitdir
+
EXTRA_DIST = bootstrap COPYING design.txt faq-compile.txt faq-general.txt file-loc.txt install.txt prog_std.txt readme.txt
if XRDP_NEUTRINORDP
diff --git a/bootstrap b/bootstrap
index 61de66ee..be61972e 100755
--- a/bootstrap
+++ b/bootstrap
@@ -14,7 +14,7 @@ then
exit 1
fi
-which libtool
+which libtool || which libtoolize
if ! test $? -eq 0
then
echo "error, install libtool"
@@ -28,10 +28,4 @@ then
exit 1
fi
-touch configure.ac
-touch NEWS
-touch AUTHORS
-touch README
-touch ChangeLog
-ln -s ../config.c $PWD/sesman/tools/config.c
autoreconf -fvi
diff --git a/common/Makefile.am b/common/Makefile.am
index 8c7aa62c..c8501586 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -1,6 +1,5 @@
EXTRA_DIST = \
arch.h \
- d3des.h \
defines.h \
file.h \
file_loc.h \
@@ -17,9 +16,10 @@ EXTRA_DIST = \
trans.h \
xrdp_client_info.h \
xrdp_constants.h \
- xrdp_rail.h
+ xrdp_rail.h \
+ crc16.h
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
@@ -30,7 +30,6 @@ lib_LTLIBRARIES = \
libcommon.la
libcommon_la_SOURCES = \
- d3des.c \
file.c \
list.c \
list16.c \
diff --git a/common/arch.h b/common/arch.h
index 14ab9d7d..d3ae460e 100644
--- a/common/arch.h
+++ b/common/arch.h
@@ -22,7 +22,7 @@
/* you can define L_ENDIAN or B_ENDIAN and NEED_ALIGN or NO_NEED_ALIGN
in the makefile to override */
-/* check endianess */
+/* check endianness */
#if !(defined(L_ENDIAN) || defined(B_ENDIAN))
#if !defined(__BYTE_ORDER) && defined(__linux__)
#include <endian.h>
diff --git a/common/d3des.c b/common/d3des.c
deleted file mode 100644
index 16ee7cde..00000000
--- a/common/d3des.c
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * This is D3DES (V5.09) by Richard Outerbridge with the double and
- * triple-length support removed for use in VNC. Also the bytebit[] array
- * has been reversed so that the most significant bit in each byte of the
- * key is ignored, not the least significant.
- *
- * These changes are:
- * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* D3DES (V5.09) -
- *
- * A portable, public domain, version of the Data Encryption Standard.
- *
- * Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge.
- * Thanks to: Dan Hoey for his excellent Initial and Inverse permutation
- * code; Jim Gillogly & Phil Karn for the DES key schedule code; Dennis
- * Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau,
- * for humouring me on.
- *
- * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge.
- * (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992.
- */
-
-#include "d3des.h"
-
-static void scrunch(unsigned char *, unsigned long *);
-static void unscrun(unsigned long *, unsigned char *);
-static void desfunc(unsigned long *, unsigned long *);
-static void cookey(unsigned long *);
-
-static unsigned long KnL[32] = { 0L };
-/*
-static unsigned long KnR[32] = { 0L };
-static unsigned long Kn3[32] = { 0L };
-static unsigned char Df_Key[24] = {
- 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
- 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
- 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 };
-*/
-
-static unsigned short bytebit[8] =
-{
- 01, 02, 04, 010, 020, 040, 0100, 0200
-};
-
-static unsigned long bigbyte[24] =
-{
- 0x800000L, 0x400000L, 0x200000L, 0x100000L,
- 0x80000L, 0x40000L, 0x20000L, 0x10000L,
- 0x8000L, 0x4000L, 0x2000L, 0x1000L,
- 0x800L, 0x400L, 0x200L, 0x100L,
- 0x80L, 0x40L, 0x20L, 0x10L,
- 0x8L, 0x4L, 0x2L, 0x1L
-};
-
-/* Use the key schedule specified in the Standard (ANSI X3.92-1981). */
-
-static unsigned char pc1[56] =
-{
- 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
- 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
- 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
- 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3
-};
-
-static unsigned char totrot[16] =
-{
- 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28
-};
-
-static unsigned char pc2[48] =
-{
- 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
- 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
- 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
- 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31
-};
-
-/* Thanks to James Gillogly & Phil Karn! */
-void rfbDesKey(unsigned char *key, int edf)
-{
- register int i, j, l, m, n;
- unsigned char pc1m[56], pcr[56];
- unsigned long kn[32];
-
- for ( j = 0; j < 56; j++ )
- {
- l = pc1[j];
- m = l & 07;
- pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
- }
-
- for ( i = 0; i < 16; i++ )
- {
- if ( edf == DE1 )
- {
- m = (15 - i) << 1;
- }
- else
- {
- m = i << 1;
- }
-
- n = m + 1;
- kn[m] = kn[n] = 0L;
-
- for ( j = 0; j < 28; j++ )
- {
- l = j + totrot[i];
-
- if ( l < 28 )
- {
- pcr[j] = pc1m[l];
- }
- else
- {
- pcr[j] = pc1m[l - 28];
- }
- }
-
- for ( j = 28; j < 56; j++ )
- {
- l = j + totrot[i];
-
- if ( l < 56 )
- {
- pcr[j] = pc1m[l];
- }
- else
- {
- pcr[j] = pc1m[l - 28];
- }
- }
-
- for ( j = 0; j < 24; j++ )
- {
- if ( pcr[pc2[j]] )
- {
- kn[m] |= bigbyte[j];
- }
-
- if ( pcr[pc2[j + 24]] )
- {
- kn[n] |= bigbyte[j];
- }
- }
- }
-
- cookey(kn);
- return;
-}
-
-static void cookey(register unsigned long *raw1)
-{
- register unsigned long *cook, *raw0;
- unsigned long dough[32];
- register int i;
-
- cook = dough;
-
- for ( i = 0; i < 16; i++, raw1++ )
- {
- raw0 = raw1++;
- *cook = (*raw0 & 0x00fc0000L) << 6;
- *cook |= (*raw0 & 0x00000fc0L) << 10;
- *cook |= (*raw1 & 0x00fc0000L) >> 10;
- *cook++ |= (*raw1 & 0x00000fc0L) >> 6;
- *cook = (*raw0 & 0x0003f000L) << 12;
- *cook |= (*raw0 & 0x0000003fL) << 16;
- *cook |= (*raw1 & 0x0003f000L) >> 4;
- *cook++ |= (*raw1 & 0x0000003fL);
- }
-
- rfbUseKey(dough);
- return;
-}
-
-void rfbCPKey(register unsigned long *into)
-{
- register unsigned long *from, *endp;
-
- from = KnL, endp = &KnL[32];
-
- while ( from < endp )
- {
- *into++ = *from++;
- }
-
- return;
-}
-
-void rfbUseKey(register unsigned long *from)
-{
- register unsigned long *to, *endp;
-
- to = KnL, endp = &KnL[32];
-
- while ( to < endp )
- {
- *to++ = *from++;
- }
-
- return;
-}
-
-void rfbDes(unsigned char *inblock, unsigned char *outblock)
-{
- unsigned long work[2];
-
- scrunch(inblock, work);
- desfunc(work, KnL);
- unscrun(work, outblock);
- return;
-}
-
-static void scrunch(register unsigned char *outof, register unsigned long *into)
-{
- *into = (*outof++ & 0xffL) << 24;
- *into |= (*outof++ & 0xffL) << 16;
- *into |= (*outof++ & 0xffL) << 8;
- *into++ |= (*outof++ & 0xffL);
- *into = (*outof++ & 0xffL) << 24;
- *into |= (*outof++ & 0xffL) << 16;
- *into |= (*outof++ & 0xffL) << 8;
- *into |= (*outof & 0xffL);
- return;
-}
-
-static void unscrun(register unsigned long *outof, register unsigned char *into)
-{
- *into++ = (unsigned char)((*outof >> 24) & 0xffL);
- *into++ = (unsigned char)((*outof >> 16) & 0xffL);
- *into++ = (unsigned char)((*outof >> 8) & 0xffL);
- *into++ = (unsigned char)( *outof++ & 0xffL);
- *into++ = (unsigned char)((*outof >> 24) & 0xffL);
- *into++ = (unsigned char)((*outof >> 16) & 0xffL);
- *into++ = (unsigned char)((*outof >> 8) & 0xffL);
- *into = (unsigned char)( *outof & 0xffL);
- return;
-}
-
-static unsigned long SP1[64] =
-{
- 0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
- 0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
- 0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
- 0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
- 0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
- 0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
- 0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
- 0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
- 0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
- 0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
- 0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
- 0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
- 0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
- 0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
- 0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
- 0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L
-};
-
-static unsigned long SP2[64] =
-{
- 0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
- 0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
- 0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
- 0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
- 0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
- 0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
- 0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
- 0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
- 0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
- 0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
- 0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
- 0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
- 0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
- 0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
- 0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
- 0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L
-};
-
-static unsigned long SP3[64] =
-{
- 0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
- 0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
- 0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
- 0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
- 0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
- 0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
- 0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
- 0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
- 0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
- 0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
- 0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
- 0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
- 0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
- 0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
- 0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
- 0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L
-};
-
-static unsigned long SP4[64] =
-{
- 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
- 0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
- 0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
- 0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
- 0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
- 0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
- 0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
- 0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
- 0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
- 0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
- 0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
- 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
- 0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
- 0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
- 0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
- 0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L
-};
-
-static unsigned long SP5[64] =
-{
- 0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
- 0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
- 0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
- 0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
- 0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
- 0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
- 0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
- 0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
- 0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
- 0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
- 0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
- 0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
- 0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
- 0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
- 0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
- 0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L
-};
-
-static unsigned long SP6[64] =
-{
- 0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
- 0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
- 0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
- 0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
- 0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
- 0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
- 0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
- 0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
- 0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
- 0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
- 0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
- 0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
- 0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
- 0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
- 0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
- 0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L
-};
-
-static unsigned long SP7[64] =
-{
- 0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
- 0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
- 0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
- 0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
- 0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
- 0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
- 0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
- 0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
- 0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
- 0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
- 0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
- 0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
- 0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
- 0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
- 0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
- 0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L
-};
-
-static unsigned long SP8[64] =
-{
- 0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
- 0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
- 0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
- 0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
- 0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
- 0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
- 0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
- 0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
- 0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
- 0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
- 0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
- 0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
- 0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
- 0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
- 0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
- 0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L
-};
-
-static void desfunc(register unsigned long *block, register unsigned long *keys)
-{
- register unsigned long fval, work, right, leftt;
- register int round;
-
- leftt = block[0];
- right = block[1];
- work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
- right ^= work;
- leftt ^= (work << 4);
- work = ((leftt >> 16) ^ right) & 0x0000ffffL;
- right ^= work;
- leftt ^= (work << 16);
- work = ((right >> 2) ^ leftt) & 0x33333333L;
- leftt ^= work;
- right ^= (work << 2);
- work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
- leftt ^= work;
- right ^= (work << 8);
- right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
- work = (leftt ^ right) & 0xaaaaaaaaL;
- leftt ^= work;
- right ^= work;
- leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
-
- for ( round = 0; round < 8; round++ )
- {
- work = (right << 28) | (right >> 4);
- work ^= *keys++;
- fval = SP7[ work & 0x3fL];
- fval |= SP5[(work >> 8) & 0x3fL];
- fval |= SP3[(work >> 16) & 0x3fL];
- fval |= SP1[(work >> 24) & 0x3fL];
- work = right ^ *keys++;
- fval |= SP8[ work & 0x3fL];
- fval |= SP6[(work >> 8) & 0x3fL];
- fval |= SP4[(work >> 16) & 0x3fL];
- fval |= SP2[(work >> 24) & 0x3fL];
- leftt ^= fval;
- work = (leftt << 28) | (leftt >> 4);
- work ^= *keys++;
- fval = SP7[ work & 0x3fL];
- fval |= SP5[(work >> 8) & 0x3fL];
- fval |= SP3[(work >> 16) & 0x3fL];
- fval |= SP1[(work >> 24) & 0x3fL];
- work = leftt ^ *keys++;
- fval |= SP8[ work & 0x3fL];
- fval |= SP6[(work >> 8) & 0x3fL];
- fval |= SP4[(work >> 16) & 0x3fL];
- fval |= SP2[(work >> 24) & 0x3fL];
- right ^= fval;
- }
-
- right = (right << 31) | (right >> 1);
- work = (leftt ^ right) & 0xaaaaaaaaL;
- leftt ^= work;
- right ^= work;
- leftt = (leftt << 31) | (leftt >> 1);
- work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
- right ^= work;
- leftt ^= (work << 8);
- work = ((leftt >> 2) ^ right) & 0x33333333L;
- right ^= work;
- leftt ^= (work << 2);
- work = ((right >> 16) ^ leftt) & 0x0000ffffL;
- leftt ^= work;
- right ^= (work << 16);
- work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
- leftt ^= work;
- right ^= (work << 4);
- *block++ = right;
- *block = leftt;
- return;
-}
-
-/* Validation sets:
- *
- * Single-length key, single-length plaintext -
- * Key : 0123 4567 89ab cdef
- * Plain : 0123 4567 89ab cde7
- * Cipher : c957 4425 6a5e d31d
- *
- * Double-length key, single-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210
- * Plain : 0123 4567 89ab cde7
- * Cipher : 7f1d 0a77 826b 8aff
- *
- * Double-length key, double-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210
- * Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
- * Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
- *
- * Triple-length key, single-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
- * Plain : 0123 4567 89ab cde7
- * Cipher : de0b 7c06 ae5e 0ed5
- *
- * Triple-length key, double-length plaintext -
- * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
- * Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
- * Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
- *
- * d3des V5.0a rwo 9208.07 18:44 Graven Imagery
- **********************************************************************/
diff --git a/common/d3des.h b/common/d3des.h
deleted file mode 100644
index e3761ca2..00000000
--- a/common/d3des.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef D3DES_H
-#define D3DES_H
-
-/*
- * This is D3DES (V5.09) by Richard Outerbridge with the double and
- * triple-length support removed for use in VNC.
- *
- * These changes are:
- * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* d3des.h -
- *
- * Headers and defines for d3des.c
- * Graven Imagery, 1992.
- *
- * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge
- * (GEnie : OUTER; CIS : [71755,204])
- */
-
-#define EN0 0 /* MODE == encrypt */
-#define DE1 1 /* MODE == decrypt */
-
-extern void rfbDesKey(unsigned char *, int);
-/* hexkey[8] MODE
- * Sets the internal key register according to the hexadecimal
- * key contained in the 8 bytes of hexkey, according to the DES,
- * for encryption or decryption according to MODE.
- */
-
-extern void rfbUseKey(unsigned long *);
-/* cookedkey[32]
- * Loads the internal key register with the data in cookedkey.
- */
-
-extern void rfbCPKey(unsigned long *);
-/* cookedkey[32]
- * Copies the contents of the internal key register into the storage
- * located at &cookedkey[0].
- */
-
-extern void rfbDes(unsigned char *, unsigned char *);
-/* from[8] to[8]
- * Encrypts/Decrypts (according to the key currently loaded in the
- * internal key register) one block of eight bytes at address 'from'
- * into the block at address 'to'. They can be the same.
- */
-
-/* d3des.h V5.09 rwo 9208.04 15:06 Graven Imagery
- ********************************************************************/
-
-#endif
diff --git a/common/file.c b/common/file.c
index b51a37cc..9fd14c29 100644
--- a/common/file.c
+++ b/common/file.c
@@ -346,7 +346,7 @@ file_read_sections(int fd, struct list *names)
/*****************************************************************************/
/* return error */
-/* this function should be prefered over file_read_sections because it can
+/* this function should be preferred over file_read_sections because it can
read any file size */
int APP_CC
file_by_name_read_sections(const char *file_name, struct list *names)
@@ -386,7 +386,7 @@ file_read_section(int fd, const char *section,
/*****************************************************************************/
/* return error */
-/* this function should be prefered over file_read_section because it can
+/* this function should be preferred over file_read_section because it can
read any file size */
int APP_CC
file_by_name_read_section(const char *file_name, const char *section,
diff --git a/common/log.c b/common/log.c
index 97053178..b3ae9c22 100644
--- a/common/log.c
+++ b/common/log.c
@@ -59,6 +59,13 @@ internal_log_file_open(const char *fname)
S_IRUSR | S_IWUSR);
}
+#ifdef FD_CLOEXEC
+ if (ret != -1)
+ {
+ fcntl(ret, F_SETFD, FD_CLOEXEC);
+ }
+#endif
+
return ret;
}
@@ -186,7 +193,7 @@ internal_log_end(struct log_config *l_cfg)
/* closing log file */
log_message(LOG_LEVEL_ALWAYS, "shutting down log subsystem...");
- if (0 > l_cfg->fd)
+ if (-1 != l_cfg->fd)
{
/* closing logfile... */
g_file_close(l_cfg->fd);
diff --git a/common/os_calls.c b/common/os_calls.c
index 04b2ac38..0034cb5b 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -100,23 +100,10 @@ extern char **environ;
#define INADDR_NONE ((unsigned long)-1)
#endif
-static char g_temp_base[128] = "";
-static char g_temp_base_org[128] = "";
-
/*****************************************************************************/
int APP_CC
g_rm_temp_dir(void)
{
- if (g_temp_base[0] != 0)
- {
- if (!g_remove_dir(g_temp_base))
- {
- printf("g_rm_temp_dir: removing temp directory [%s] failed\n", g_temp_base);
- }
-
- g_temp_base[0] = 0;
- }
-
return 0;
}
@@ -124,58 +111,19 @@ g_rm_temp_dir(void)
int APP_CC
g_mk_temp_dir(const char *app_name)
{
- if (app_name != 0)
+ if (!g_directory_exist("/tmp/.xrdp"))
{
- if (app_name[0] != 0)
+ if (!g_create_dir("/tmp/.xrdp"))
{
+ /* if failed, still check if it got created by someone else */
if (!g_directory_exist("/tmp/.xrdp"))
{
- if (!g_create_dir("/tmp/.xrdp"))
- {
- /* if failed, still check if it got created by someone else */
- if (!g_directory_exist("/tmp/.xrdp"))
- {
- printf("g_mk_temp_dir: g_create_dir failed\n");
- return 1;
- }
- }
-
- g_chmod_hex("/tmp/.xrdp", 0x1777);
- }
-
- snprintf(g_temp_base, sizeof(g_temp_base),
- "/tmp/.xrdp/%s-XXXXXX", app_name);
- snprintf(g_temp_base_org, sizeof(g_temp_base_org),
- "/tmp/.xrdp/%s-XXXXXX", app_name);
-
- if (mkdtemp(g_temp_base) == 0)
- {
- printf("g_mk_temp_dir: mkdtemp failed [%s]\n", g_temp_base);
+ printf("g_mk_temp_dir: g_create_dir failed\n");
return 1;
}
}
- else
- {
- printf("g_mk_temp_dir: bad app name\n");
- return 1;
- }
+ g_chmod_hex("/tmp/.xrdp", 0x1777);
}
- else
- {
- if (g_temp_base_org[0] == 0)
- {
- printf("g_mk_temp_dir: g_temp_base_org not set\n");
- return 1;
- }
-
- g_strncpy(g_temp_base, g_temp_base_org, 127);
-
- if (mkdtemp(g_temp_base) == 0)
- {
- printf("g_mk_temp_dir: mkdtemp failed [%s]\n", g_temp_base);
- }
- }
-
return 0;
}
@@ -621,7 +569,7 @@ g_sck_get_recv_buffer_bytes(int sck, int *bytes)
/*****************************************************************************/
int APP_CC
-g_tcp_local_socket(void)
+g_sck_local_socket(void)
{
#if defined(_WIN32)
return 0;
@@ -695,7 +643,7 @@ g_sck_get_peer_cred(int sck, int *pid, int *uid, int *gid)
/*****************************************************************************/
void APP_CC
-g_tcp_close(int sck)
+g_sck_close(int sck)
{
char ip[256];
@@ -798,7 +746,7 @@ g_tcp_connect(int sck, const char* address, const char* port)
/*****************************************************************************/
/* returns error, zero is good */
int APP_CC
-g_tcp_local_connect(int sck, const char *port)
+g_sck_local_connect(int sck, const char *port)
{
#if defined(_WIN32)
return -1;
@@ -816,7 +764,7 @@ g_tcp_local_connect(int sck, const char *port)
/*****************************************************************************/
int APP_CC
-g_tcp_set_non_blocking(int sck)
+g_sck_set_non_blocking(int sck)
{
unsigned long i;
@@ -828,7 +776,7 @@ g_tcp_set_non_blocking(int sck)
i = i | O_NONBLOCK;
if (fcntl(sck, F_SETFL, i) < 0)
{
- log_message(LOG_LEVEL_ERROR, "g_tcp_set_non_blocking: fcntl() failed\n");
+ log_message(LOG_LEVEL_ERROR, "g_sck_set_non_blocking: fcntl() failed\n");
}
#endif
return 0;
@@ -960,7 +908,7 @@ g_tcp_bind(int sck, const char* port)
/*****************************************************************************/
int APP_CC
-g_tcp_local_bind(int sck, const char *port)
+g_sck_local_bind(int sck, const char *port)
{
#if defined(_WIN32)
return -1;
@@ -1008,7 +956,7 @@ g_tcp_bind_address(int sck, const char* port, const char* address)
/*****************************************************************************/
/* returns error, zero is good */
int APP_CC
-g_tcp_listen(int sck)
+g_sck_listen(int sck)
{
return listen(sck, 2);
}
@@ -1124,7 +1072,7 @@ g_sleep(int msecs)
/*****************************************************************************/
int APP_CC
-g_tcp_last_error_would_block(int sck)
+g_sck_last_error_would_block(int sck)
{
#if defined(_WIN32)
return WSAGetLastError() == WSAEWOULDBLOCK;
@@ -1135,7 +1083,7 @@ g_tcp_last_error_would_block(int sck)
/*****************************************************************************/
int APP_CC
-g_tcp_recv(int sck, void *ptr, int len, int flags)
+g_sck_recv(int sck, void *ptr, int len, int flags)
{
#if defined(_WIN32)
return recv(sck, (char *)ptr, len, flags);
@@ -1146,7 +1094,7 @@ g_tcp_recv(int sck, void *ptr, int len, int flags)
/*****************************************************************************/
int APP_CC
-g_tcp_send(int sck, const void *ptr, int len, int flags)
+g_sck_send(int sck, const void *ptr, int len, int flags)
{
#if defined(_WIN32)
return send(sck, (const char *)ptr, len, flags);
@@ -1158,7 +1106,7 @@ g_tcp_send(int sck, const void *ptr, int len, int flags)
/*****************************************************************************/
/* returns boolean */
int APP_CC
-g_tcp_socket_ok(int sck)
+g_sck_socket_ok(int sck)
{
#if defined(_WIN32)
int opt;
@@ -1185,7 +1133,7 @@ g_tcp_socket_ok(int sck)
/* wait 'millis' milliseconds for the socket to be able to write */
/* returns boolean */
int APP_CC
-g_tcp_can_send(int sck, int millis)
+g_sck_can_send(int sck, int millis)
{
fd_set wfds;
struct timeval time;
@@ -1202,7 +1150,7 @@ g_tcp_can_send(int sck, int millis)
if (rv > 0)
{
- return g_tcp_socket_ok(sck);
+ return 1;
}
}
@@ -1213,12 +1161,13 @@ g_tcp_can_send(int sck, int millis)
/* wait 'millis' milliseconds for the socket to be able to receive */
/* returns boolean */
int APP_CC
-g_tcp_can_recv(int sck, int millis)
+g_sck_can_recv(int sck, int millis)
{
fd_set rfds;
struct timeval time;
int rv;
+ g_memset(&time, 0, sizeof(time));
time.tv_sec = millis / 1000;
time.tv_usec = (millis * 1000) % 1000000;
FD_ZERO(&rfds);
@@ -1230,7 +1179,7 @@ g_tcp_can_recv(int sck, int millis)
if (rv > 0)
{
- return g_tcp_socket_ok(sck);
+ return 1;
}
}
@@ -1239,18 +1188,14 @@ g_tcp_can_recv(int sck, int millis)
/*****************************************************************************/
int APP_CC
-g_tcp_select(int sck1, int sck2)
+g_sck_select(int sck1, int sck2)
{
fd_set rfds;
struct timeval time;
- int max = 0;
- int rv = 0;
+ int max;
+ int rv;
- g_memset(&rfds, 0, sizeof(fd_set));
g_memset(&time, 0, sizeof(struct timeval));
-
- time.tv_sec = 0;
- time.tv_usec = 0;
FD_ZERO(&rfds);
if (sck1 > 0)
@@ -1295,93 +1240,91 @@ g_tcp_select(int sck1, int sck2)
}
/*****************************************************************************/
-/* returns 0 on error */
-tbus APP_CC
-g_create_wait_obj(char *name)
+/* returns boolean */
+static int APP_CC
+g_fd_can_read(int fd)
{
-#ifdef _WIN32
- tbus obj;
-
- obj = (tbus)CreateEvent(0, 1, 0, name);
- return obj;
-#else
- tbus obj;
- struct sockaddr_un sa;
- size_t len;
- tbus sck;
- int i;
- int safety;
- int unnamed;
+ fd_set rfds;
+ struct timeval time;
+ int rv;
- if (g_temp_base[0] == 0)
+ g_memset(&time, 0, sizeof(time));
+ FD_ZERO(&rfds);
+ FD_SET(((unsigned int)fd), &rfds);
+ rv = select(fd + 1, &rfds, 0, 0, &time);
+ if (rv == 1)
{
- return 0;
+ return 1;
}
+ return 0;
+}
- sck = socket(PF_UNIX, SOCK_DGRAM, 0);
+/*****************************************************************************/
+/* returns error */
+/* O_NONBLOCK = 0x00000800 */
+static int APP_CC
+g_set_nonblock(int fd)
+{
+ int error;
+ int flags;
- if (sck < 0)
+ error = fcntl(fd, F_GETFL);
+ if (error < 0)
{
- return 0;
+ return 1;
}
-
- safety = 0;
- g_memset(&sa, 0, sizeof(sa));
- sa.sun_family = AF_UNIX;
- unnamed = 1;
-
- if (name != 0)
+ flags = error;
+ if ((flags & O_NONBLOCK) != O_NONBLOCK)
{
- if (name[0] != 0)
+ flags |= O_NONBLOCK;
+ error = fcntl(fd, F_SETFL, flags);
+ if (error < 0)
{
- unnamed = 0;
+ return 1;
}
}
+ return 0;
+}
- if (unnamed)
- {
- do
- {
- if (safety > 100)
- {
- break;
- }
+/*****************************************************************************/
+/* returns 0 on error */
+tintptr APP_CC
+g_create_wait_obj(char *name)
+{
+#ifdef _WIN32
+ tintptr obj;
- safety++;
- g_random((char *)&i, sizeof(i));
- len = sizeof(sa.sun_path);
- g_snprintf(sa.sun_path, len, "%s/auto_%8.8x", g_temp_base, i);
- len = sizeof(sa);
- }
- while (bind(sck, (struct sockaddr *)&sa, len) < 0);
+ obj = (tintptr)CreateEvent(0, 1, 0, name);
+ return obj;
+#else
+ int fds[2];
+ int error;
+
+ error = pipe(fds);
+ if (error != 0)
+ {
+ return 0;
}
- else
+ if (g_set_nonblock(fds[0]) != 0)
{
- do
- {
- if (safety > 100)
- {
- break;
- }
-
- safety++;
- g_random((char *)&i, sizeof(i));
- len = sizeof(sa.sun_path);
- g_snprintf(sa.sun_path, len, "%s/%s_%8.8x", g_temp_base, name, i);
- len = sizeof(sa);
- }
- while (bind(sck, (struct sockaddr *)&sa, len) < 0);
+ close(fds[0]);
+ close(fds[1]);
+ return 0;
}
-
- obj = (tbus)sck;
- return obj;
+ if (g_set_nonblock(fds[1]) != 0)
+ {
+ close(fds[0]);
+ close(fds[1]);
+ return 0;
+ }
+ return (fds[1] << 16) | fds[0];
#endif
}
/*****************************************************************************/
/* returns 0 on error */
-tbus APP_CC
-g_create_wait_obj_from_socket(tbus socket, int write)
+tintptr APP_CC
+g_create_wait_obj_from_socket(tintptr socket, int write)
{
#ifdef _WIN32
/* Create and return corresponding event handle for WaitForMultipleObjets */
@@ -1409,7 +1352,7 @@ g_create_wait_obj_from_socket(tbus socket, int write)
/*****************************************************************************/
void APP_CC
-g_delete_wait_obj_from_socket(tbus wait_obj)
+g_delete_wait_obj_from_socket(tintptr wait_obj)
{
#ifdef _WIN32
@@ -1426,54 +1369,60 @@ g_delete_wait_obj_from_socket(tbus wait_obj)
/*****************************************************************************/
/* returns error */
int APP_CC
-g_set_wait_obj(tbus obj)
+g_set_wait_obj(tintptr obj)
{
#ifdef _WIN32
-
if (obj == 0)
{
return 0;
}
-
SetEvent((HANDLE)obj);
return 0;
#else
- socklen_t sa_size;
- int s;
- struct sockaddr_un sa;
+ int error;
+ int fd;
+ int written;
+ int to_write;
+ char buf[4] = "sig";
if (obj == 0)
{
return 0;
}
-
- if (g_tcp_can_recv((int)obj, 0))
+ fd = obj & 0xffff;
+ if (g_fd_can_read(fd))
{
/* already signalled */
return 0;
}
-
- sa_size = sizeof(sa);
-
- if (getsockname((int)obj, (struct sockaddr *)&sa, &sa_size) < 0)
+ fd = obj >> 16;
+ to_write = 4;
+ written = 0;
+ while (written < to_write)
{
- return 1;
- }
-
- s = socket(PF_UNIX, SOCK_DGRAM, 0);
-
- if (s < 0)
- {
- return 1;
- }
-
- if (sendto(s, "sig", 4, 0, (struct sockaddr *)&sa, sa_size) < 0)
- {
- close(s);
- return 1;
+ error = write(fd, buf + written, to_write - written);
+ if (error == -1)
+ {
+ error = errno;
+ if ((error == EAGAIN) || (error == EWOULDBLOCK) ||
+ (error == EINPROGRESS) || (error == EINTR))
+ {
+ /* ok */
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (error > 0)
+ {
+ written += error;
+ }
+ else
+ {
+ return 1;
+ }
}
-
- close(s);
return 0;
#endif
}
@@ -1481,30 +1430,46 @@ g_set_wait_obj(tbus obj)
/*****************************************************************************/
/* returns error */
int APP_CC
-g_reset_wait_obj(tbus obj)
+g_reset_wait_obj(tintptr obj)
{
#ifdef _WIN32
-
if (obj == 0)
{
return 0;
}
-
ResetEvent((HANDLE)obj);
return 0;
#else
- char buf[64];
+ char buf[4];
+ int error;
+ int fd;
if (obj == 0)
{
return 0;
}
-
- while (g_tcp_can_recv((int)obj, 0))
+ fd = obj & 0xffff;
+ while (g_fd_can_read(fd))
{
- recvfrom((int)obj, &buf, 64, 0, 0, 0);
+ error = read(fd, buf, 4);
+ if (error == -1)
+ {
+ error = errno;
+ if ((error == EAGAIN) || (error == EWOULDBLOCK) ||
+ (error == EINPROGRESS) || (error == EINTR))
+ {
+ /* ok */
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (error == 0)
+ {
+ return 1;
+ }
}
-
return 0;
#endif
}
@@ -1512,86 +1477,55 @@ g_reset_wait_obj(tbus obj)
/*****************************************************************************/
/* returns boolean */
int APP_CC
-g_is_wait_obj_set(tbus obj)
+g_is_wait_obj_set(tintptr obj)
{
#ifdef _WIN32
-
if (obj == 0)
{
return 0;
}
-
if (WaitForSingleObject((HANDLE)obj, 0) == WAIT_OBJECT_0)
{
return 1;
}
-
return 0;
#else
-
if (obj == 0)
{
return 0;
}
-
- return g_tcp_can_recv((int)obj, 0);
+ return g_fd_can_read(obj & 0xffff);
#endif
}
/*****************************************************************************/
/* returns error */
int APP_CC
-g_delete_wait_obj(tbus obj)
+g_delete_wait_obj(tintptr obj)
{
#ifdef _WIN32
-
if (obj == 0)
{
return 0;
}
-
/* Close event handle */
CloseHandle((HANDLE)obj);
return 0;
#else
- socklen_t sa_size;
- struct sockaddr_un sa;
-
if (obj == 0)
{
return 0;
}
-
- sa_size = sizeof(sa);
-
- if (getsockname((int)obj, (struct sockaddr *)&sa, &sa_size) < 0)
- {
- return 1;
- }
-
- close((int)obj);
- unlink(sa.sun_path);
+ close(obj & 0xffff);
+ close(obj >> 16);
return 0;
#endif
}
/*****************************************************************************/
/* returns error */
-/* close but do not delete the wait obj, used after fork */
-int APP_CC
-g_close_wait_obj(tbus obj)
-{
-#ifdef _WIN32
-#else
- close((int)obj);
-#endif
- return 0;
-}
-
-/*****************************************************************************/
-/* returns error */
int APP_CC
-g_obj_wait(tbus *read_objs, int rcount, tbus *write_objs, int wcount,
+g_obj_wait(tintptr *read_objs, int rcount, tintptr *write_objs, int wcount,
int mstimeout)
{
#ifdef _WIN32
@@ -1631,24 +1565,20 @@ g_obj_wait(tbus *read_objs, int rcount, tbus *write_objs, int wcount,
fd_set rfds;
fd_set wfds;
struct timeval time;
- struct timeval *ptime = (struct timeval *)NULL;
+ struct timeval *ptime;
int i = 0;
int res = 0;
int max = 0;
int sck = 0;
- g_memset(&rfds, 0, sizeof(fd_set));
- g_memset(&wfds, 0, sizeof(fd_set));
- g_memset(&time, 0, sizeof(struct timeval));
-
max = 0;
-
if (mstimeout < 1)
{
- ptime = (struct timeval *)NULL;
+ ptime = 0;
}
else
{
+ g_memset(&time, 0, sizeof(struct timeval));
time.tv_sec = mstimeout / 1000;
time.tv_usec = (mstimeout % 1000) * 1000;
ptime = &time;
@@ -1662,7 +1592,7 @@ g_obj_wait(tbus *read_objs, int rcount, tbus *write_objs, int wcount,
{
for (i = 0; i < rcount; i++)
{
- sck = (int)(read_objs[i]);
+ sck = read_objs[i] & 0xffff;
if (sck > 0)
{
@@ -1873,7 +1803,7 @@ g_file_read(int fd, char *ptr, int len)
}
/*****************************************************************************/
-/* write to file, returns the number of bytes writen or -1 on error */
+/* write to file, returns the number of bytes written or -1 on error */
int APP_CC
g_file_write(int fd, char *ptr, int len)
{
@@ -3400,3 +3330,60 @@ g_gethostname(char *name, int len)
{
return gethostname(name, len);
}
+
+static unsigned char g_reverse_byte[0x100] =
+{
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+/*****************************************************************************/
+/* mirror each byte while copying */
+int APP_CC
+g_mirror_memcpy(void *dst, const void *src, int len)
+{
+ tui8 *dst8;
+ const tui8 *src8;
+
+ dst8 = (tui8 *) dst;
+ src8 = (const tui8 *) src;
+ while (len > 0)
+ {
+ *dst8 = g_reverse_byte[*src8];
+ dst8++;
+ src8++;
+ len--;
+ }
+ return 0;
+}
+
diff --git a/common/os_calls.h b/common/os_calls.h
index d954a075..acfbe475 100644
--- a/common/os_calls.h
+++ b/common/os_calls.h
@@ -27,6 +27,20 @@
#include "arch.h"
+#define g_tcp_can_recv g_sck_can_recv
+#define g_tcp_can_send g_sck_can_send
+#define g_tcp_recv g_sck_recv
+#define g_tcp_send g_sck_send
+#define g_tcp_close g_sck_close
+#define g_tcp_last_error_would_block g_sck_last_error_would_block
+#define g_tcp_set_non_blocking g_sck_set_non_blocking
+#define g_tcp_local_socket g_sck_local_socket
+#define g_tcp_local_connect g_sck_local_connect
+#define g_tcp_listen g_sck_listen
+#define g_tcp_local_bind g_sck_local_bind
+#define g_tcp_select g_sck_select
+#define g_close_wait_obj g_delete_wait_obj
+
int APP_CC g_rm_temp_dir(void);
int APP_CC g_mk_temp_dir(const char* app_name);
void APP_CC g_init(const char* app_name);
@@ -49,39 +63,36 @@ int APP_CC g_sck_set_send_buffer_bytes(int sck, int bytes);
int APP_CC g_sck_get_send_buffer_bytes(int sck, int *bytes);
int APP_CC g_sck_set_recv_buffer_bytes(int sck, int bytes);
int APP_CC g_sck_get_recv_buffer_bytes(int sck, int *bytes);
-int APP_CC g_tcp_local_socket(void);
+int APP_CC g_sck_local_socket(void);
int APP_CC g_sck_get_peer_cred(int sck, int *pid, int *uid, int *gid);
-void APP_CC g_tcp_close(int sck);
+void APP_CC g_sck_close(int sck);
int APP_CC g_tcp_connect(int sck, const char* address, const char* port);
-int APP_CC g_tcp_local_connect(int sck, const char* port);
-int APP_CC g_tcp_force_send(int sck, char* data, int len);
-int APP_CC g_tcp_force_recv(int sck, char* data, int len);
-int APP_CC g_tcp_set_non_blocking(int sck);
+int APP_CC g_sck_local_connect(int sck, const char* port);
+int APP_CC g_sck_set_non_blocking(int sck);
int APP_CC g_tcp_bind(int sck, const char *port);
-int APP_CC g_tcp_local_bind(int sck, const char* port);
+int APP_CC g_sck_local_bind(int sck, const char* port);
int APP_CC g_tcp_bind_address(int sck, const char* port, const char* address);
-int APP_CC g_tcp_listen(int sck);
+int APP_CC g_sck_listen(int sck);
int APP_CC g_tcp_accept(int sck);
int APP_CC g_sck_accept(int sck, char *addr, int addr_bytes,
char *port, int port_bytes);
-int APP_CC g_tcp_recv(int sck, void* ptr, int len, int flags);
-int APP_CC g_tcp_send(int sck, const void* ptr, int len, int flags);
-int APP_CC g_tcp_last_error_would_block(int sck);
-int APP_CC g_tcp_socket_ok(int sck);
-int APP_CC g_tcp_can_send(int sck, int millis);
-int APP_CC g_tcp_can_recv(int sck, int millis);
-int APP_CC g_tcp_select(int sck1, int sck2);
+int APP_CC g_sck_recv(int sck, void* ptr, int len, int flags);
+int APP_CC g_sck_send(int sck, const void* ptr, int len, int flags);
+int APP_CC g_sck_last_error_would_block(int sck);
+int APP_CC g_sck_socket_ok(int sck);
+int APP_CC g_sck_can_send(int sck, int millis);
+int APP_CC g_sck_can_recv(int sck, int millis);
+int APP_CC g_sck_select(int sck1, int sck2);
void APP_CC g_write_ip_address(int rcv_sck, char* ip_address, int bytes);
void APP_CC g_sleep(int msecs);
-tbus APP_CC g_create_wait_obj(char* name);
-tbus APP_CC g_create_wait_obj_from_socket(tbus socket, int write);
-void APP_CC g_delete_wait_obj_from_socket(tbus wait_obj);
-int APP_CC g_set_wait_obj(tbus obj);
-int APP_CC g_reset_wait_obj(tbus obj);
-int APP_CC g_is_wait_obj_set(tbus obj);
-int APP_CC g_delete_wait_obj(tbus obj);
-int APP_CC g_close_wait_obj(tbus obj);
-int APP_CC g_obj_wait(tbus* read_objs, int rcount, tbus* write_objs,
+tintptr APP_CC g_create_wait_obj(char* name);
+tintptr APP_CC g_create_wait_obj_from_socket(tintptr socket, int write);
+void APP_CC g_delete_wait_obj_from_socket(tintptr wait_obj);
+int APP_CC g_set_wait_obj(tintptr obj);
+int APP_CC g_reset_wait_obj(tintptr obj);
+int APP_CC g_is_wait_obj_set(tintptr obj);
+int APP_CC g_delete_wait_obj(tintptr obj);
+int APP_CC g_obj_wait(tintptr* read_objs, int rcount, tintptr* write_objs,
int wcount,int mstimeout);
void APP_CC g_random(char* data, int len);
int APP_CC g_abs(int i);
@@ -167,5 +178,6 @@ int APP_CC g_text2bool(const char *s);
void * APP_CC g_shmat(int shmid);
int APP_CC g_shmdt(const void *shmaddr);
int APP_CC g_gethostname(char *name, int len);
+int APP_CC g_mirror_memcpy(void *dst, const void *src, int len);
#endif
diff --git a/common/parse.h b/common/parse.h
index 2ae3927b..b7f93bfe 100644
--- a/common/parse.h
+++ b/common/parse.h
@@ -40,13 +40,17 @@ struct stream
char *end;
char *data;
int size;
+ int pad0;
/* offsets of various headers */
char *iso_hdr;
char *mcs_hdr;
char *sec_hdr;
char *rdp_hdr;
char *channel_hdr;
+ /* other */
char *next_packet;
+ struct stream *next;
+ int *source;
};
/******************************************************************************/
diff --git a/common/ssl_calls.c b/common/ssl_calls.c
index 7bc33fcb..43002a40 100644
--- a/common/ssl_calls.c
+++ b/common/ssl_calls.c
@@ -841,6 +841,6 @@ ssl_tls_can_recv(struct ssl_tls *tls, int sck, int millis)
return 1;
}
g_reset_wait_obj(tls->rwo);
- return g_tcp_can_recv(sck, millis);
+ return g_sck_can_recv(sck, millis);
}
diff --git a/common/trans.c b/common/trans.c
index 3828a174..2c44f28c 100644
--- a/common/trans.c
+++ b/common/trans.c
@@ -24,6 +24,8 @@
#include "parse.h"
#include "ssl_calls.h"
+#define MAX_SBYTES 0
+
/*****************************************************************************/
int APP_CC
trans_tls_recv(struct trans *self, void *ptr, int len)
@@ -75,7 +77,7 @@ trans_tcp_send(struct trans *self, const void *data, int len)
int APP_CC
trans_tcp_can_recv(struct trans *self, int sck, int millis)
{
- return g_tcp_can_recv(sck, millis);
+ return g_sck_can_recv(sck, millis);
}
/*****************************************************************************/
@@ -169,13 +171,29 @@ trans_get_wait_objs(struct trans *self, tbus *objs, int *count)
/*****************************************************************************/
int APP_CC
trans_get_wait_objs_rw(struct trans *self, tbus *robjs, int *rcount,
- tbus *wobjs, int *wcount)
+ tbus *wobjs, int *wcount, int *timeout)
{
- if (trans_get_wait_objs(self, robjs, rcount) != 0)
+ if (self == 0)
+ {
+ return 1;
+ }
+
+ if (self->status != TRANS_STATUS_UP)
{
return 1;
}
+ if ((self->si != 0) && (self->si->source[self->my_source] > MAX_SBYTES))
+ {
+ }
+ else
+ {
+ if (trans_get_wait_objs(self, robjs, rcount) != 0)
+ {
+ return 1;
+ }
+ }
+
if (self->wait_s != 0)
{
wobjs[*wcount] = self->sck;
@@ -187,7 +205,7 @@ trans_get_wait_objs_rw(struct trans *self, tbus *robjs, int *rcount,
/*****************************************************************************/
int APP_CC
-send_waiting(struct trans *self, int block)
+trans_send_waiting(struct trans *self, int block)
{
struct stream *temp_s;
int bytes;
@@ -209,9 +227,13 @@ send_waiting(struct trans *self, int block)
if (sent > 0)
{
temp_s->p += sent;
+ if (temp_s->source != 0)
+ {
+ temp_s->source[0] -= sent;
+ }
if (temp_s->p >= temp_s->end)
{
- self->wait_s = (struct stream *) (temp_s->next_packet);
+ self->wait_s = temp_s->next;
free_stream(temp_s);
}
}
@@ -227,6 +249,18 @@ send_waiting(struct trans *self, int block)
}
}
}
+ else if (block)
+ {
+ /* check for term here */
+ if (self->is_term != 0)
+ {
+ if (self->is_term())
+ {
+ /* term */
+ return 1;
+ }
+ }
+ }
}
else
{
@@ -247,6 +281,7 @@ trans_check_wait_objs(struct trans *self)
int to_read = 0;
int read_so_far = 0;
int rv = 0;
+ int cur_source;
if (self == 0)
{
@@ -262,7 +297,7 @@ trans_check_wait_objs(struct trans *self)
if (self->type1 == TRANS_TYPE_LISTENER) /* listening */
{
- if (g_tcp_can_recv(self->sck, 0))
+ if (g_sck_can_recv(self->sck, 0))
{
in_sck = g_sck_accept(self->sck, self->addr, sizeof(self->addr),
self->port, sizeof(self->port));
@@ -310,8 +345,17 @@ trans_check_wait_objs(struct trans *self)
}
else /* connected server or client (2 or 3) */
{
- if (self->trans_can_recv(self, self->sck, 0))
+ if (self->si != 0 && self->si->source[self->my_source] > MAX_SBYTES)
+ {
+ }
+ else if (self->trans_can_recv(self, self->sck, 0))
{
+ cur_source = 0;
+ if (self->si != 0)
+ {
+ cur_source = self->si->cur_source;
+ self->si->cur_source = self->my_source;
+ }
read_so_far = (int) (self->in_s->end - self->in_s->data);
to_read = self->header_size - read_so_far;
@@ -329,6 +373,10 @@ trans_check_wait_objs(struct trans *self)
{
/* error */
self->status = TRANS_STATUS_DOWN;
+ if (self->si != 0)
+ {
+ self->si->cur_source = cur_source;
+ }
return 1;
}
}
@@ -336,6 +384,10 @@ trans_check_wait_objs(struct trans *self)
{
/* error */
self->status = TRANS_STATUS_DOWN;
+ if (self->si != 0)
+ {
+ self->si->cur_source = cur_source;
+ }
return 1;
}
else
@@ -357,8 +409,12 @@ trans_check_wait_objs(struct trans *self)
}
}
}
+ if (self->si != 0)
+ {
+ self->si->cur_source = cur_source;
+ }
}
- if (send_waiting(self, 0) != 0)
+ if (trans_send_waiting(self, 0) != 0)
{
/* error */
self->status = TRANS_STATUS_DOWN;
@@ -368,6 +424,7 @@ trans_check_wait_objs(struct trans *self)
return rv;
}
+
/*****************************************************************************/
int APP_CC
trans_force_read_s(struct trans *self, struct stream *in_s, int size)
@@ -378,7 +435,6 @@ trans_force_read_s(struct trans *self, struct stream *in_s, int size)
{
return 1;
}
-
while (size > 0)
{
/* make sure stream has room */
@@ -386,47 +442,47 @@ trans_force_read_s(struct trans *self, struct stream *in_s, int size)
{
return 1;
}
-
- rcvd = self->trans_recv(self, in_s->end, size);
-
- if (rcvd == -1)
+ if (self->trans_can_recv(self, self->sck, 100))
{
- if (g_tcp_last_error_would_block(self->sck))
+ rcvd = self->trans_recv(self, in_s->end, size);
+ if (rcvd == -1)
{
- if (!g_tcp_can_recv(self->sck, 100))
+ if (g_tcp_last_error_would_block(self->sck))
{
- /* check for term here */
- if (self->is_term != 0)
- {
- if (self->is_term())
- {
- /* term */
- self->status = TRANS_STATUS_DOWN;
- return 1;
- }
- }
+ }
+ else
+ {
+ /* error */
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
}
}
- else
+ else if (rcvd == 0)
{
/* error */
self->status = TRANS_STATUS_DOWN;
return 1;
}
- }
- else if (rcvd == 0)
- {
- /* error */
- self->status = TRANS_STATUS_DOWN;
- return 1;
+ else
+ {
+ in_s->end += rcvd;
+ size -= rcvd;
+ }
}
else
{
- in_s->end += rcvd;
- size -= rcvd;
+ /* check for term here */
+ if (self->is_term != 0)
+ {
+ if (self->is_term())
+ {
+ /* term */
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
+ }
+ }
}
}
-
return 0;
}
@@ -449,57 +505,55 @@ trans_force_write_s(struct trans *self, struct stream *out_s)
{
return 1;
}
-
size = (int) (out_s->end - out_s->data);
total = 0;
-
- if (send_waiting(self, 1) != 0)
+ if (trans_send_waiting(self, 1) != 0)
{
self->status = TRANS_STATUS_DOWN;
return 1;
}
-
while (total < size)
{
- sent = self->trans_send(self, out_s->data + total, size - total);
-
- if (sent == -1)
+ if (g_tcp_can_send(self->sck, 100))
{
- if (g_tcp_last_error_would_block(self->sck))
+ sent = self->trans_send(self, out_s->data + total, size - total);
+ if (sent == -1)
{
- if (!g_tcp_can_send(self->sck, 100))
+ if (g_tcp_last_error_would_block(self->sck))
{
- /* check for term here */
- if (self->is_term != 0)
- {
- if (self->is_term())
- {
- /* term */
- self->status = TRANS_STATUS_DOWN;
- return 1;
- }
- }
+ }
+ else
+ {
+ /* error */
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
}
}
- else
+ else if (sent == 0)
{
/* error */
self->status = TRANS_STATUS_DOWN;
return 1;
}
- }
- else if (sent == 0)
- {
- /* error */
- self->status = TRANS_STATUS_DOWN;
- return 1;
+ else
+ {
+ total = total + sent;
+ }
}
else
{
- total = total + sent;
+ /* check for term here */
+ if (self->is_term != 0)
+ {
+ if (self->is_term())
+ {
+ /* term */
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
+ }
+ }
}
}
-
return 0;
}
@@ -512,23 +566,69 @@ trans_force_write(struct trans *self)
/*****************************************************************************/
int APP_CC
-trans_write_copy(struct trans *self)
+trans_write_copy_s(struct trans *self, struct stream *out_s)
{
int size;
- struct stream *out_s;
+ int sent;
struct stream *wait_s;
struct stream *temp_s;
+ char *out_data;
if (self->status != TRANS_STATUS_UP)
{
return 1;
}
-
- out_s = self->out_s;
+ /* try to send any left over */
+ if (trans_send_waiting(self, 0) != 0)
+ {
+ /* error */
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
+ }
+ out_data = out_s->data;
+ sent = 0;
size = (int) (out_s->end - out_s->data);
+ if (self->wait_s == 0)
+ {
+ /* if no left over, try to send this new data */
+ if (g_tcp_can_send(self->sck, 0))
+ {
+ sent = self->trans_send(self, out_s->data, size);
+ if (sent > 0)
+ {
+ out_data += sent;
+ size -= sent;
+ }
+ else if (sent == 0)
+ {
+ return 1;
+ }
+ else
+ {
+ if (!g_tcp_last_error_would_block(self->sck))
+ {
+ return 1;
+ }
+ }
+ }
+ }
+ if (size < 1)
+ {
+ return 0;
+ }
+ /* did not send right away, have to copy */
make_stream(wait_s);
init_stream(wait_s, size);
- out_uint8a(wait_s, out_s->data, size);
+ if (self->si != 0)
+ {
+ if ((self->si->cur_source != 0) &&
+ (self->si->cur_source != self->my_source))
+ {
+ self->si->source[self->si->cur_source] += size;
+ wait_s->source = self->si->source + self->si->cur_source;
+ }
+ }
+ out_uint8a(wait_s, out_data, size);
s_mark_end(wait_s);
wait_s->p = wait_s->data;
if (self->wait_s == 0)
@@ -538,53 +638,110 @@ trans_write_copy(struct trans *self)
else
{
temp_s = self->wait_s;
- while (temp_s->next_packet != 0)
+ while (temp_s->next != 0)
{
- temp_s = (struct stream *) (temp_s->next_packet);
+ temp_s = temp_s->next;
}
- temp_s->next_packet = (char *) wait_s;
- }
-
- /* try to send */
- if (send_waiting(self, 0) != 0)
- {
- /* error */
- self->status = TRANS_STATUS_DOWN;
- return 1;
+ temp_s->next = wait_s;
}
-
return 0;
}
/*****************************************************************************/
int APP_CC
+trans_write_copy(struct trans* self)
+{
+ return trans_write_copy_s(self, self->out_s);
+}
+
+/*****************************************************************************/
+int APP_CC
trans_connect(struct trans *self, const char *server, const char *port,
int timeout)
{
int error;
+ int now;
+ int start_time;
+
+ start_time = g_time3();
if (self->sck != 0)
{
g_tcp_close(self->sck);
+ self->sck = 0;
}
if (self->mode == TRANS_MODE_TCP) /* tcp */
{
self->sck = g_tcp_socket();
if (self->sck < 0)
+ {
+ self->status = TRANS_STATUS_DOWN;
return 1;
-
+ }
g_tcp_set_non_blocking(self->sck);
- error = g_tcp_connect(self->sck, server, port);
+ while (1)
+ {
+ error = g_tcp_connect(self->sck, server, port);
+ if (error == 0)
+ {
+ break;
+ }
+ else
+ {
+ if (timeout < 1)
+ {
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
+ }
+ now = g_time3();
+ if (now - start_time < timeout)
+ {
+ g_sleep(timeout / 5);
+ }
+ else
+ {
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
+ }
+ }
+ }
}
else if (self->mode == TRANS_MODE_UNIX) /* unix socket */
{
self->sck = g_tcp_local_socket();
if (self->sck < 0)
+ {
+ self->status = TRANS_STATUS_DOWN;
return 1;
-
+ }
g_tcp_set_non_blocking(self->sck);
- error = g_tcp_local_connect(self->sck, port);
+ while (1)
+ {
+ error = g_tcp_local_connect(self->sck, port);
+ if (error == 0)
+ {
+ break;
+ }
+ else
+ {
+ if (timeout < 1)
+ {
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
+ }
+ now = g_time3();
+ if (now - start_time < timeout)
+ {
+ g_sleep(timeout / 5);
+ }
+ else
+ {
+ self->status = TRANS_STATUS_DOWN;
+ return 1;
+ }
+ }
+ }
}
else
{
@@ -596,6 +753,15 @@ trans_connect(struct trans *self, const char *server, const char *port,
{
if (g_tcp_last_error_would_block(self->sck))
{
+ now = g_time3();
+ if (now - start_time < timeout)
+ {
+ timeout = timeout - (now - start_time);
+ }
+ else
+ {
+ timeout = 0;
+ }
if (g_tcp_can_send(self->sck, timeout))
{
self->status = TRANS_STATUS_UP; /* ok */
@@ -717,6 +883,7 @@ trans_get_out_s(struct trans *self, int size)
return rv;
}
+
/*****************************************************************************/
/* returns error */
int APP_CC
@@ -742,6 +909,7 @@ trans_set_tls_mode(struct trans *self, const char *key, const char *cert)
return 0;
}
+
/*****************************************************************************/
/* returns error */
int APP_CC
diff --git a/common/trans.h b/common/trans.h
index c2a10762..639e64d1 100644
--- a/common/trans.h
+++ b/common/trans.h
@@ -45,6 +45,20 @@ typedef int (APP_CC *trans_recv_proc) (struct trans *self, void *ptr, int len);
typedef int (APP_CC *trans_send_proc) (struct trans *self, const void *data, int len);
typedef int (APP_CC *trans_can_recv_proc) (struct trans *self, int sck, int millis);
+/* optional source info */
+
+#define XRDP_SOURCE_NONE 0
+#define XRDP_SOURCE_CLIENT 1
+#define XRDP_SOURCE_SESMAN 2
+#define XRDP_SOURCE_CHANSRV 3
+#define XRDP_SOURCE_MOD 4
+
+struct source_info
+{
+ int cur_source;
+ int source[7];
+};
+
struct trans
{
tbus sck; /* socket handle */
@@ -68,6 +82,8 @@ struct trans
trans_recv_proc trans_recv;
trans_send_proc trans_send;
trans_can_recv_proc trans_can_recv;
+ struct source_info *si;
+ int my_source;
};
struct trans* APP_CC
@@ -79,7 +95,7 @@ trans_get_wait_objs(struct trans* self, tbus* objs, int* count);
int APP_CC
trans_get_wait_objs_rw(struct trans *self,
tbus *robjs, int *rcount,
- tbus *wobjs, int *wcount);
+ tbus *wobjs, int *wcount, int *timeout);
int APP_CC
trans_check_wait_objs(struct trans* self);
int APP_CC
@@ -93,6 +109,8 @@ trans_force_write(struct trans* self);
int APP_CC
trans_write_copy(struct trans* self);
int APP_CC
+trans_write_copy_s(struct trans* self, struct stream* out_s);
+int APP_CC
trans_connect(struct trans* self, const char* server, const char* port,
int timeout);
int APP_CC
diff --git a/configure.ac b/configure.ac
index 26917325..7535620d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,13 +1,35 @@
# Process this file with autoconf to produce a configure script
AC_PREREQ(2.59)
-AC_INIT([xrdp], [0.9.0], [xrdp-devel@lists.sourceforge.net])
+AC_INIT([xrdp], [0.9.0], [xrdp-devel@googlegroups.com])
AC_CONFIG_HEADERS(config_ac.h:config_ac-h.in)
AM_INIT_AUTOMAKE([1.6 foreign])
+AC_CONFIG_MACRO_DIRS([m4])
AC_PROG_CC
AC_C_CONST
AC_PROG_LIBTOOL
PKG_PROG_PKG_CONFIG
+
+case $host_os in
+ *linux*)
+ linux=yes
+ ;;
+ *freebsd*)
+ freebsd=yes
+ ;;
+ *netbsd*)
+ netbsd=yes
+ ;;
+ *openbsd*)
+ openbsd=yes
+ ;;
+esac
+
+AM_CONDITIONAL(LINUX, [test "x$linux" = xyes])
+AM_CONDITIONAL(FREEBSD, [test "x$freebsd" = xyes])
+AM_CONDITIONAL(OPENBSD, [test "x$openbsd" = xyes])
+AM_CONDITIONAL(NETBSD, [test "x$netbsd" = xyes])
+
AC_ARG_WITH([systemdsystemunitdir],
AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
[], [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
@@ -80,8 +102,6 @@ AC_ARG_ENABLE(opus, AS_HELP_STRING([--enable-opus],
[], [enable_opus=no])
AM_CONDITIONAL(XRDP_OPUS, [test x$enable_opus = xyes])
-AM_CONDITIONAL(GOT_PREFIX, test "x${prefix}" != "xNONE"])
-
# checking for openssl
AC_CHECK_HEADER([openssl/rc4.h], [],
[AC_MSG_ERROR([please install libssl-dev or openssl-devel])],
@@ -183,16 +203,26 @@ else
fi
fi
-# checking for Xlib, Xfixes
-AC_CHECK_HEADER([X11/Xlib.h], [],
- [AC_MSG_ERROR([please install libx11-dev or libX11-devel])])
+AC_PATH_XTRA
+if test "x$no_x" == "xyes"; then
+ AC_MSG_ERROR([please install libx11-dev or libX11-devel])
+fi
+
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $X_CFLAGS"
+
+# checking for Xfixes
AC_CHECK_HEADER([X11/extensions/Xfixes.h], [],
[AC_MSG_ERROR([please install libx11-dev and libxfixes-dev or libXfixes-devel])],
[#include <X11/Xlib.h>])
+
+# checking for Xrandr
AC_CHECK_HEADER([X11/extensions/Xrandr.h], [],
[AC_MSG_ERROR([please install libxrandr-dev or libXrandr-devel])],
[#include <X11/Xlib.h>])
+CFLAGS="$save_CFLAGS"
+
libdir="${libdir}/xrdp";
if test "x${prefix}" = "xNONE" ; then
sysconfdir="/etc";
@@ -218,6 +248,7 @@ AC_CONFIG_FILES([Makefile
instfiles/Makefile
instfiles/pam.d/Makefile
instfiles/init.d/Makefile
+ instfiles/rc.d/Makefile
instfiles/default/Makefile
instfiles/pulse/Makefile
genkeymap/Makefile
diff --git a/design.txt b/design.txt
index 431bcbd1..3b120c89 100644
--- a/design.txt
+++ b/design.txt
@@ -31,5 +31,5 @@ is lost, the session remains.
For X11, start the XServer after the user is
authenticated. First check for the next available X11 display,
-create a user session, start the XServer and set the DISPLAY enviromenet
+create a user session, start the XServer and set the DISPLAY environment
variable.
diff --git a/docs/man/xrdp-keygen.8 b/docs/man/xrdp-keygen.8
index 71269f5c..4a7e627e 100644
--- a/docs/man/xrdp-keygen.8
+++ b/docs/man/xrdp-keygen.8
@@ -1,4 +1,8 @@
.\" Hey, EMACS: -*- nroff -*-
+.\"-
+.\" Copyright © 2007, 2008 Vincent Bernat <bernat@debian.org>
+.\" License: GPL-2+
+.\"-
.TH xrdp\-keygen 8 "0.7.0" "xrdp team"
.SH NAME
xrdp\-keygen \- xrdp RSA key generation utility
diff --git a/fontdump/Makefile b/fontdump/Makefile
index 0a742582..0a742582 100755..100644
--- a/fontdump/Makefile
+++ b/fontdump/Makefile
diff --git a/fontdump/fontdump.c b/fontdump/fontdump.c
index 03609cf0..03609cf0 100755..100644
--- a/fontdump/fontdump.c
+++ b/fontdump/fontdump.c
diff --git a/genkeymap/Makefile.am b/genkeymap/Makefile.am
index aed72512..25767395 100644
--- a/genkeymap/Makefile.am
+++ b/genkeymap/Makefile.am
@@ -1,9 +1,12 @@
+AM_CFLAGS = $(X_CFLAGS)
bin_PROGRAMS = \
xrdp-genkeymap
xrdp_genkeymap_SOURCES = genkeymap.c evdev-map.c
+xrdp_genkeymap_LDFLAGS = \
+ $(X_LIBS)
+
xrdp_genkeymap_LDADD = \
- -L/usr/X11R6/lib \
- -lX11
+ $(X_PRE_LIBS) -lX11 $(X_EXTRA_LIBS)
diff --git a/install.txt b/install.txt
index 5683d1e5..dd36f4e3 100644
--- a/install.txt
+++ b/install.txt
@@ -11,11 +11,11 @@ You can build sesman without pam, there is a Makefile parameter
for that.
I also have a replacement ssl_calls.c to avoid the openssl dependency
email me(Jay) for it or see http://server1.xrdp.org/xrdp/openssl.
-Due to the licence, I can't include it in this project.
+Due to the license, I can't include it in this project.
http://server1.xrdp.org/xrdp/openssl/
-unpackage the tarball
+unpack the tarball
tar -zxvf xrdp-0.1.tar.gz
@@ -28,7 +28,7 @@ run make
as root, run make install
This will install most of the files in /usr/local/xrdp.
-Some files install in /etc/xrdp. These are configuation
+Some files install in /etc/xrdp. These are configuration
files.
files and location
diff --git a/instfiles/Makefile.am b/instfiles/Makefile.am
index 00847c58..99f37b61 100644
--- a/instfiles/Makefile.am
+++ b/instfiles/Makefile.am
@@ -1,39 +1,65 @@
-EXTRA_DIST = xrdp.sh km-0407.ini km-0409.ini km-040c.ini km-0410.ini km-0419.ini km-041d.ini km-0816.ini \
-xrdp-sesman.service \
-xrdp.service
-
-SUBDIRS = \
- pam.d \
- pulse
-
-if HAVE_SYSTEMD
-systemdsystemunit_DATA = \
- xrdp-sesman.service \
- xrdp.service
-else
-SUBDIRS+= \
- default \
- init.d
-endif
+EXTRA_DIST = \
+ xrdp.sh \
+ xrdp-sesman.service \
+ xrdp.service \
+ $(startscript_DATA)
+#
+# files for all platforms
+#
startscriptdir=$(sysconfdir)/xrdp
startscript_DATA = \
- xrdp.sh \
km-0407.ini \
km-0409.ini \
km-040c.ini \
km-0410.ini \
km-0411.ini \
+ km-0414.ini \
km-0415.ini \
+ km-0416.ini \
km-0419.ini \
km-041d.ini \
km-0807.ini \
+ km-080c.ini \
+ km-0813.ini \
km-0816.ini \
+ km-100c.ini \
km-e0010411.ini \
km-e0200411.ini \
km-e0210411.ini
+#
+# platform specific files
+#
+SUBDIRS=
+if LINUX
+SUBDIRS+= \
+ pam.d \
+ pulse
+startscript_DATA+= xrdp.sh
+if HAVE_SYSTEMD
+systemdsystemunit_DATA = \
+ xrdp-sesman.service \
+ xrdp.service
+else
+SUBDIRS+= \
+ default \
+ init.d
+endif # HAVE_SYSTEMD
+endif # LINUX
+
+if FREEBSD
+SUBDIRS+= \
+ pam.d \
+ rc.d \
+ pulse
+endif
+
+#
+# install-data-hook for each platform
+#
+if LINUX
# must be tab below
install-data-hook:
chmod 755 $(DESTDIR)$(sysconfdir)/xrdp/xrdp.sh
@@ -41,3 +67,11 @@ install-data-hook:
chmod 755 $(DESTDIR)$(sysconfdir)/init.d/xrdp; \
sed -i 's|__BASE__|$(prefix)|' $(DESTDIR)$(sysconfdir)/init.d/xrdp; \
fi
+endif
+
+if FREEBSD
+# must be tab below
+install-data-hook:
+ chmod 755 $(DESTDIR)$(sysconfdir)/rc.d/xrdp
+ sed -i '' 's|%%PREFIX%%|$(prefix)|g' $(DESTDIR)$(sysconfdir)/rc.d/xrdp
+endif
diff --git a/instfiles/init.d/xrdp b/instfiles/init.d/xrdp
index dcdb01a4..8e5f42d1 100644
--- a/instfiles/init.d/xrdp
+++ b/instfiles/init.d/xrdp
@@ -18,7 +18,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
BASE=__BASE__
DAEMON=${BASE}/sbin/xrdp
SDAEMON=${BASE}/sbin/xrdp-sesman
-PIDDIR=/var/run/xrdp/
+PIDDIR=/var/run/
SESMAN_START=yes
#USERID=xrdp
# the X11rdp backend only works as root at the moment - GH 20/03/2013
@@ -139,7 +139,7 @@ case "$1" in
;;
force-stop)
$0 stop
- # because it doesn't allways die the right way
+ # because it doesn't always die the right way
force_stop
;;
restart|force-reload)
diff --git a/instfiles/km-100c.ini b/instfiles/km-100c.ini
new file mode 100644
index 00000000..fd963fc0
--- /dev/null
+++ b/instfiles/km-100c.ini
@@ -0,0 +1,659 @@
+[noshift]
+Key8=0:0
+Key9=65307:27
+Key10=49:49
+Key11=50:50
+Key12=51:51
+Key13=52:52
+Key14=53:53
+Key15=54:54
+Key16=55:55
+Key17=56:56
+Key18=57:57
+Key19=48:48
+Key20=39:39
+Key21=65106:94
+Key22=65288:8
+Key23=65289:9
+Key24=113:113
+Key25=119:119
+Key26=101:101
+Key27=114:114
+Key28=116:116
+Key29=122:122
+Key30=117:117
+Key31=105:105
+Key32=111:111
+Key33=112:112
+Key34=232:232
+Key35=65111:168
+Key36=65293:13
+Key37=65507:0
+Key38=97:97
+Key39=115:115
+Key40=100:100
+Key41=102:102
+Key42=103:103
+Key43=104:104
+Key44=106:106
+Key45=107:107
+Key46=108:108
+Key47=233:233
+Key48=224:224
+Key49=167:167
+Key50=65505:0
+Key51=36:36
+Key52=121:121
+Key53=120:120
+Key54=99:99
+Key55=118:118
+Key56=98:98
+Key57=110:110
+Key58=109:109
+Key59=44:44
+Key60=46:46
+Key61=45:45
+Key62=65506:0
+Key63=65450:42
+Key64=65513:0
+Key65=32:32
+Key66=65509:0
+Key67=65470:0
+Key68=65471:0
+Key69=65472:0
+Key70=65473:0
+Key71=65474:0
+Key72=65475:0
+Key73=65476:0
+Key74=65477:0
+Key75=65478:0
+Key76=65479:0
+Key77=65407:0
+Key78=65300:0
+Key79=65429:0
+Key80=65431:0
+Key81=65434:0
+Key82=65453:45
+Key83=65430:0
+Key84=65437:0
+Key85=65432:0
+Key86=65451:43
+Key87=65436:0
+Key88=65433:0
+Key89=65435:0
+Key90=65438:0
+Key91=65439:0
+Key92=0:0
+Key93=65406:0
+Key94=60:60
+Key95=65480:0
+Key96=65481:0
+Key97=65360:0
+Key98=65362:0
+Key99=65365:0
+Key100=65361:0
+Key101=0:0
+Key102=65363:0
+Key103=65367:0
+Key104=65364:0
+Key105=65366:0
+Key106=65379:0
+Key107=65535:127
+Key108=65421:13
+Key109=65508:0
+Key110=65299:0
+Key111=65377:0
+Key112=65455:47
+Key113=65027:0
+Key114=0:0
+Key115=0:0
+Key116=0:0
+Key117=0:0
+Key118=0:0
+Key119=0:0
+Key120=0:0
+Key121=0:0
+Key122=0:0
+Key123=0:0
+Key124=65027:0
+Key125=0:0
+Key126=65469:61
+Key127=0:0
+Key128=0:0
+Key129=0:0
+Key130=0:0
+Key131=0:0
+Key132=0:0
+Key133=0:0
+Key134=0:0
+Key135=0:0
+Key136=0:0
+Key137=0:0
+
+[shift]
+Key8=0:0
+Key9=65307:27
+Key10=43:43
+Key11=34:34
+Key12=42:42
+Key13=231:231
+Key14=37:37
+Key15=38:38
+Key16=47:47
+Key17=40:40
+Key18=41:41
+Key19=61:61
+Key20=63:63
+Key21=65104:96
+Key22=65288:8
+Key23=65056:0
+Key24=81:81
+Key25=87:87
+Key26=69:69
+Key27=82:82
+Key28=84:84
+Key29=90:90
+Key30=85:85
+Key31=73:73
+Key32=79:79
+Key33=80:80
+Key34=252:252
+Key35=33:33
+Key36=65293:13
+Key37=65507:0
+Key38=65:65
+Key39=83:83
+Key40=68:68
+Key41=70:70
+Key42=71:71
+Key43=72:72
+Key44=74:74
+Key45=75:75
+Key46=76:76
+Key47=246:246
+Key48=228:228
+Key49=176:176
+Key50=65505:0
+Key51=163:163
+Key52=89:89
+Key53=88:88
+Key54=67:67
+Key55=86:86
+Key56=66:66
+Key57=78:78
+Key58=77:77
+Key59=59:59
+Key60=58:58
+Key61=95:95
+Key62=65506:0
+Key63=65450:42
+Key64=65511:0
+Key65=32:32
+Key66=65509:0
+Key67=65470:0
+Key68=65471:0
+Key69=65472:0
+Key70=65473:0
+Key71=65474:0
+Key72=65475:0
+Key73=65476:0
+Key74=65477:0
+Key75=65478:0
+Key76=65479:0
+Key77=65273:0
+Key78=65300:0
+Key79=65463:55
+Key80=65464:56
+Key81=65465:57
+Key82=65453:45
+Key83=65460:52
+Key84=65461:53
+Key85=65462:54
+Key86=65451:43
+Key87=65457:49
+Key88=65458:50
+Key89=65459:51
+Key90=65456:48
+Key91=65454:46
+Key92=0:0
+Key93=65406:0
+Key94=62:62
+Key95=65480:0
+Key96=65481:0
+Key97=65360:0
+Key98=65362:0
+Key99=65365:0
+Key100=65361:0
+Key101=0:0
+Key102=65363:0
+Key103=65367:0
+Key104=65364:0
+Key105=65366:0
+Key106=65379:0
+Key107=65535:127
+Key108=65421:13
+Key109=65508:0
+Key110=65299:0
+Key111=65377:0
+Key112=65455:47
+Key113=65312:0
+Key114=0:0
+Key115=0:0
+Key116=0:0
+Key117=0:0
+Key118=0:0
+Key119=0:0
+Key120=0:0
+Key121=0:0
+Key122=0:0
+Key123=0:0
+Key124=65027:0
+Key125=65513:0
+Key126=65469:61
+Key127=65515:0
+Key128=65517:0
+Key129=0:0
+Key130=0:0
+Key131=0:0
+Key132=0:0
+Key133=0:0
+Key134=0:0
+Key135=0:0
+Key136=0:0
+Key137=0:0
+
+[altgr]
+Key8=0:0
+Key9=65307:27
+Key10=124:124
+Key11=64:64
+Key12=35:35
+Key13=188:188
+Key14=189:189
+Key15=172:172
+Key16=166:166
+Key17=162:162
+Key18=93:93
+Key19=125:125
+Key20=65105:180
+Key21=65107:126
+Key22=65288:8
+Key23=65289:9
+Key24=64:64
+Key25=435:322
+Key26=8364:8364
+Key27=182:182
+Key28=956:359
+Key29=2299:8592
+Key30=2302:8595
+Key31=2301:8594
+Key32=248:248
+Key33=254:254
+Key34=91:91
+Key35=93:93
+Key36=65293:13
+Key37=65507:0
+Key38=230:230
+Key39=223:223
+Key40=240:240
+Key41=496:273
+Key42=959:331
+Key43=689:295
+Key44=106:106
+Key45=930:312
+Key46=435:322
+Key47=65105:180
+Key48=123:123
+Key49=172:172
+Key50=65505:0
+Key51=125:125
+Key52=171:171
+Key53=187:187
+Key54=162:162
+Key55=2770:8220
+Key56=2771:8221
+Key57=110:110
+Key58=181:181
+Key59=2211:0
+Key60=183:183
+Key61=65120:0
+Key62=65506:0
+Key63=65450:42
+Key64=65513:0
+Key65=32:32
+Key66=65509:0
+Key67=65470:0
+Key68=65471:0
+Key69=65472:0
+Key70=65473:0
+Key71=65474:0
+Key72=65475:0
+Key73=65476:0
+Key74=65477:0
+Key75=65478:0
+Key76=65479:0
+Key77=65407:0
+Key78=65300:0
+Key79=65429:0
+Key80=65431:0
+Key81=65434:0
+Key82=65453:45
+Key83=65430:0
+Key84=65437:0
+Key85=65432:0
+Key86=65451:43
+Key87=65436:0
+Key88=65433:0
+Key89=65435:0
+Key90=65438:0
+Key91=65439:0
+Key92=0:0
+Key93=65406:0
+Key94=92:92
+Key95=65480:0
+Key96=65481:0
+Key97=65360:0
+Key98=65362:0
+Key99=65365:0
+Key100=65361:0
+Key101=0:0
+Key102=65363:0
+Key103=65367:0
+Key104=65364:0
+Key105=65366:0
+Key106=65379:0
+Key107=65535:127
+Key108=65421:13
+Key109=65508:0
+Key110=65299:0
+Key111=0:0
+Key112=65455:47
+Key113=65027:0
+Key114=0:0
+Key115=0:0
+Key116=0:0
+Key117=0:0
+Key118=0:0
+Key119=0:0
+Key120=0:0
+Key121=0:0
+Key122=0:0
+Key123=0:0
+Key124=65027:0
+Key125=0:0
+Key126=65469:61
+Key127=0:0
+Key128=0:0
+Key129=0:0
+Key130=0:0
+Key131=0:0
+Key132=0:0
+Key133=0:0
+Key134=0:0
+Key135=0:0
+Key136=0:0
+Key137=0:0
+
+[capslock]
+Key8=0:0
+Key9=65307:27
+Key10=49:49
+Key11=50:50
+Key12=51:51
+Key13=52:52
+Key14=53:53
+Key15=54:54
+Key16=55:55
+Key17=56:56
+Key18=57:57
+Key19=48:48
+Key20=39:39
+Key21=65106:94
+Key22=65288:8
+Key23=65289:9
+Key24=81:81
+Key25=87:87
+Key26=69:69
+Key27=82:82
+Key28=84:84
+Key29=90:90
+Key30=85:85
+Key31=73:73
+Key32=79:79
+Key33=80:80
+Key34=200:200
+Key35=65111:168
+Key36=65293:13
+Key37=65507:0
+Key38=65:65
+Key39=83:83
+Key40=68:68
+Key41=70:70
+Key42=71:71
+Key43=72:72
+Key44=74:74
+Key45=75:75
+Key46=76:76
+Key47=201:201
+Key48=192:192
+Key49=167:167
+Key50=65505:0
+Key51=36:36
+Key52=89:89
+Key53=88:88
+Key54=67:67
+Key55=86:86
+Key56=66:66
+Key57=78:78
+Key58=77:77
+Key59=44:44
+Key60=46:46
+Key61=45:45
+Key62=65506:0
+Key63=65450:42
+Key64=65513:0
+Key65=32:32
+Key66=65509:0
+Key67=65470:0
+Key68=65471:0
+Key69=65472:0
+Key70=65473:0
+Key71=65474:0
+Key72=65475:0
+Key73=65476:0
+Key74=65477:0
+Key75=65478:0
+Key76=65479:0
+Key77=65407:0
+Key78=65300:0
+Key79=65429:0
+Key80=65431:0
+Key81=65434:0
+Key82=65453:45
+Key83=65430:0
+Key84=65437:0
+Key85=65432:0
+Key86=65451:43
+Key87=65436:0
+Key88=65433:0
+Key89=65435:0
+Key90=65438:0
+Key91=65439:0
+Key92=0:0
+Key93=65406:0
+Key94=60:60
+Key95=65480:0
+Key96=65481:0
+Key97=65360:0
+Key98=65362:0
+Key99=65365:0
+Key100=65361:0
+Key101=0:0
+Key102=65363:0
+Key103=65367:0
+Key104=65364:0
+Key105=65366:0
+Key106=65379:0
+Key107=65535:127
+Key108=65421:13
+Key109=65508:0
+Key110=65299:0
+Key111=65377:0
+Key112=65455:47
+Key113=65027:0
+Key114=0:0
+Key115=0:0
+Key116=0:0
+Key117=0:0
+Key118=0:0
+Key119=0:0
+Key120=0:0
+Key121=0:0
+Key122=0:0
+Key123=0:0
+Key124=65027:0
+Key125=0:0
+Key126=65469:61
+Key127=0:0
+Key128=0:0
+Key129=0:0
+Key130=0:0
+Key131=0:0
+Key132=0:0
+Key133=0:0
+Key134=0:0
+Key135=0:0
+Key136=0:0
+Key137=0:0
+
+[shiftcapslock]
+Key8=0:0
+Key9=65307:27
+Key10=43:43
+Key11=34:34
+Key12=42:42
+Key13=199:199
+Key14=37:37
+Key15=38:38
+Key16=47:47
+Key17=40:40
+Key18=41:41
+Key19=61:61
+Key20=63:63
+Key21=65104:96
+Key22=65288:8
+Key23=65056:0
+Key24=113:113
+Key25=119:119
+Key26=101:101
+Key27=114:114
+Key28=116:116
+Key29=122:122
+Key30=117:117
+Key31=105:105
+Key32=111:111
+Key33=112:112
+Key34=220:220
+Key35=33:33
+Key36=65293:13
+Key37=65507:0
+Key38=97:97
+Key39=115:115
+Key40=100:100
+Key41=102:102
+Key42=103:103
+Key43=104:104
+Key44=106:106
+Key45=107:107
+Key46=108:108
+Key47=214:214
+Key48=196:196
+Key49=176:176
+Key50=65505:0
+Key51=163:163
+Key52=121:121
+Key53=120:120
+Key54=99:99
+Key55=118:118
+Key56=98:98
+Key57=110:110
+Key58=109:109
+Key59=59:59
+Key60=58:58
+Key61=95:95
+Key62=65506:0
+Key63=65450:42
+Key64=65511:0
+Key65=32:32
+Key66=65509:0
+Key67=65470:0
+Key68=65471:0
+Key69=65472:0
+Key70=65473:0
+Key71=65474:0
+Key72=65475:0
+Key73=65476:0
+Key74=65477:0
+Key75=65478:0
+Key76=65479:0
+Key77=65273:0
+Key78=65300:0
+Key79=65463:55
+Key80=65464:56
+Key81=65465:57
+Key82=65453:45
+Key83=65460:52
+Key84=65461:53
+Key85=65462:54
+Key86=65451:43
+Key87=65457:49
+Key88=65458:50
+Key89=65459:51
+Key90=65456:48
+Key91=65454:46
+Key92=0:0
+Key93=65406:0
+Key94=62:62
+Key95=65480:0
+Key96=65481:0
+Key97=65360:0
+Key98=65362:0
+Key99=65365:0
+Key100=65361:0
+Key101=0:0
+Key102=65363:0
+Key103=65367:0
+Key104=65364:0
+Key105=65366:0
+Key106=65379:0
+Key107=65535:127
+Key108=65421:13
+Key109=65508:0
+Key110=65299:0
+Key111=65377:0
+Key112=65455:47
+Key113=65312:0
+Key114=0:0
+Key115=0:0
+Key116=0:0
+Key117=0:0
+Key118=0:0
+Key119=0:0
+Key120=0:0
+Key121=0:0
+Key122=0:0
+Key123=0:0
+Key124=65027:0
+Key125=65513:0
+Key126=65469:61
+Key127=65515:0
+Key128=65517:0
+Key129=0:0
+Key130=0:0
+Key131=0:0
+Key132=0:0
+Key133=0:0
+Key134=0:0
+Key135=0:0
+Key136=0:0
+Key137=0:0
diff --git a/instfiles/rc.d/Makefile.am b/instfiles/rc.d/Makefile.am
new file mode 100644
index 00000000..5edb8ccc
--- /dev/null
+++ b/instfiles/rc.d/Makefile.am
@@ -0,0 +1,4 @@
+EXTRA_DIST = xrdp
+startscriptdir=$(sysconfdir)/rc.d
+startscript_DATA = xrdp
+
diff --git a/instfiles/rc.d/xrdp b/instfiles/rc.d/xrdp
new file mode 100644
index 00000000..d20f8108
--- /dev/null
+++ b/instfiles/rc.d/xrdp
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# Copyright (c) 1992-2015 The FreeBSD Project. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+# REQUIRE: DAEMON
+# PROVIDE: xrdp xrdp_sesman
+#
+
+. /etc/rc.subr
+
+name="xrdp"
+rcvar=xrdp_enable
+xrdp_daemons="xrdp"
+
+# Read settings and set default values.
+load_rc_config "$name"
+: ${xrdp_enable="NO"}
+
+# Enable/disable dependent daemon.
+if [ -n "${rcvar}" ] && checkyesno "xrdp_sesman_enable"; then
+ xrdp_daemons="xrdp xrdp_sesman"
+fi
+
+# Commands.
+extra_commands="reload status"
+start_cmd="xrdp_cmd"
+stop_cmd="xrdp_cmd"
+status_cmd="xrdp_cmd"
+reload_cmd="xrdp_cmd"
+rcvar_cmd="xrdp_cmd"
+
+# Command wrapper to call each of them per daemon.
+xrdp_cmd() {
+ local name rcvar command pidfile xrdp_daemons
+ # Prevent recursive calling.
+ unset "${rc_arg}_cmd"
+ # Stop processes in the reverse to order.
+ if [ "${rc_arg}" = "stop" ] ; then
+ xrdp_daemons=$(reverse_list ${xrdp_daemons})
+ fi
+ # Generate rsakeys.ini on start
+ if [ "${rc_arg}" = "start" -a ! -f %%PREFIX%%/etc/xrdp/rsakeys.ini ] ; then
+ %%PREFIX%%/bin/xrdp-keygen xrdp %%PREFIX%%/etc/xrdp/rsakeys.ini
+ fi
+
+ # Apply to all the daemons.
+ for name in ${xrdp_daemons}; do
+ rcvar=${name}_enable
+ if [ "${name}" = "xrdp_sesman" ]; then
+ command="%%PREFIX%%/sbin/xrdp-sesman"
+ pidfile="/var/run/xrdp-sesman.pid"
+ else
+ command="%%PREFIX%%/sbin/${name}"
+ pidfile="/var/run/${name}.pid"
+ fi
+
+ run_rc_command "${_rc_prefix}${rc_arg}" ${rc_extra_args}
+ done
+}
+
+run_rc_command "$1"
diff --git a/instfiles/xrdp-sesman.service b/instfiles/xrdp-sesman.service
index d40150cd..0ce9a4e5 100644
--- a/instfiles/xrdp-sesman.service
+++ b/instfiles/xrdp-sesman.service
@@ -2,11 +2,13 @@
Description=xrdp session manager
After=syslog.target network.target
StopWhenUnneeded=true
+BindTo=xrdp.service
[Service]
Type=forking
PIDFile=/var/run/xrdp-sesman.pid
-EnvironmentFile=/etc/sysconfig/xrdp
+EnvironmentFile=-/etc/sysconfig/xrdp
+EnvironmentFile=-/etc/default/xrdp
ExecStart=/usr/sbin/xrdp-sesman $SESMAN_OPTIONS
ExecStop=/usr/sbin/xrdp-sesman $SESMAN_OPTIONS --kill
diff --git a/instfiles/xrdp.service b/instfiles/xrdp.service
index 7bb076d1..fca4bd66 100644
--- a/instfiles/xrdp.service
+++ b/instfiles/xrdp.service
@@ -6,7 +6,8 @@ After=syslog.target network.target xrdp-sesman.service
[Service]
Type=forking
PIDFile=/var/run/xrdp.pid
-EnvironmentFile=/etc/sysconfig/xrdp
+EnvironmentFile=-/etc/sysconfig/xrdp
+EnvironmentFile=-/etc/default/xrdp
ExecStart=/usr/sbin/xrdp $XRDP_OPTIONS
ExecStop=/usr/sbin/xrdp $XRDP_OPTIONS --kill
diff --git a/keygen/Makefile.am b/keygen/Makefile.am
index c28c063d..353f74df 100644
--- a/keygen/Makefile.am
+++ b/keygen/Makefile.am
@@ -1,11 +1,9 @@
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common
bin_PROGRAMS = \
diff --git a/libxrdp/Makefile.am b/libxrdp/Makefile.am
index bd37cad4..5b89b0c3 100644
--- a/libxrdp/Makefile.am
+++ b/libxrdp/Makefile.am
@@ -1,4 +1,4 @@
-EXTRA_DIST = libxrdp.h libxrdpinc.h
+EXTRA_DIST = libxrdp.h libxrdpinc.h xrdp_orders_rail.h
EXTRA_DEFINES =
EXTRA_INCLUDES =
@@ -28,19 +28,12 @@ EXTRA_LIBS += -ljpeg
endif
endif
-if GOT_PREFIX
-EXTRA_INCLUDES += -I$(prefix)/include
-EXTRA_FLAGS += -L$(prefix)/lib -Wl,-rpath -Wl,$(prefix)/lib
-endif
-
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
-DXRDP_PID_PATH=\"${localstatedir}/run\" \
- $(EXTRA_DEFINES)
-
-INCLUDES = \
+ $(EXTRA_DEFINES) \
-I$(top_srcdir)/common \
$(EXTRA_INCLUDES)
diff --git a/libxrdp/libxrdp.c b/libxrdp/libxrdp.c
index 32ee2098..834e6ae3 100644
--- a/libxrdp/libxrdp.c
+++ b/libxrdp/libxrdp.c
@@ -105,7 +105,7 @@ libxrdp_get_pdu_bytes(const char *aheader)
}
/******************************************************************************/
-/* only used durring connection */
+/* only used during connection */
struct stream * APP_CC
libxrdp_force_read(struct trans* trans)
{
@@ -982,14 +982,6 @@ libxrdp_reset(struct xrdp_session *session,
return 1;
}
- /* process till up and running */
- session->up_and_running = 0;
-
- if (libxrdp_process_data(session, 0) != 0)
- {
- g_writeln("non handled error from libxrdp_process_data");
- }
-
return 0;
}
@@ -1082,7 +1074,7 @@ libxrdp_query_channel(struct xrdp_session *session, int index,
}
/*****************************************************************************/
-/* returns a zero based index of the channel, -1 if error or it dosen't
+/* returns a zero based index of the channel, -1 if error or it doesn't
exist */
int EXPORT_CC
libxrdp_get_channel_id(struct xrdp_session *session, char *name)
diff --git a/libxrdp/libxrdp.h b/libxrdp/libxrdp.h
index 5f60183d..6058c9ac 100644
--- a/libxrdp/libxrdp.h
+++ b/libxrdp/libxrdp.h
@@ -281,7 +281,7 @@ struct xrdp_mppc_enc
char *outputBuffer; /* contains compressed data */
char *outputBufferPlus;
int historyOffset; /* next free slot in historyBuffer */
- int buf_len; /* length of historyBuffer, protocol dependant */
+ int buf_len; /* length of historyBuffer, protocol dependent */
int bytes_in_opb; /* compressed bytes available in outputBuffer */
int flags; /* PACKET_COMPRESSED, PACKET_AT_FRONT, PACKET_FLUSHED etc */
int flagsHold;
diff --git a/libxrdp/libxrdpinc.h b/libxrdp/libxrdpinc.h
index 8d99814c..e3e79564 100644
--- a/libxrdp/libxrdpinc.h
+++ b/libxrdp/libxrdpinc.h
@@ -72,6 +72,8 @@ struct xrdp_session
int up_and_running;
int (*is_term)(void);
int in_process_data; /* inc / dec libxrdp_process_data calls */
+
+ struct source_info si;
};
struct xrdp_session * DEFAULT_CC
diff --git a/libxrdp/xrdp_channel.c b/libxrdp/xrdp_channel.c
index 7d3909d5..2da0ecdb 100644
--- a/libxrdp/xrdp_channel.c
+++ b/libxrdp/xrdp_channel.c
@@ -173,7 +173,7 @@ xrdp_channel_call_callback(struct xrdp_channel *self, struct stream *s,
/*****************************************************************************/
/* returns error */
-/* This is called from the secure layer to process an incomming non global
+/* This is called from the secure layer to process an incoming non global
channel packet.
'chanid' passed in here is the mcs channel id so it MCS_GLOBAL_CHANNEL
plus something. */
diff --git a/libxrdp/xrdp_fastpath.c b/libxrdp/xrdp_fastpath.c
index 5bf63b29..6a0cdfc0 100644
--- a/libxrdp/xrdp_fastpath.c
+++ b/libxrdp/xrdp_fastpath.c
@@ -137,7 +137,7 @@ xrdp_fastpath_session_callback(struct xrdp_fastpath *self, int msg,
int APP_CC
xrdp_fastpath_send(struct xrdp_fastpath *self, struct stream *s)
{
- if (trans_force_write_s(self->trans, s) != 0)
+ if (trans_write_copy_s(self->trans, s) != 0)
{
return 1;
}
diff --git a/libxrdp/xrdp_iso.c b/libxrdp/xrdp_iso.c
index 1a2fb08a..8369226c 100644
--- a/libxrdp/xrdp_iso.c
+++ b/libxrdp/xrdp_iso.c
@@ -286,7 +286,7 @@ xrdp_iso_send_cc(struct xrdp_iso *self)
len_ptr[1] = len;
len_indicator_ptr[0] = len_indicator;
- if (trans_force_write_s(self->trans, s) != 0)
+ if (trans_write_copy_s(self->trans, s) != 0)
{
free_stream(s);
return 1;
@@ -409,7 +409,7 @@ xrdp_iso_send(struct xrdp_iso *self, struct stream *s)
out_uint8(s, ISO_PDU_DT);
out_uint8(s, 0x80);
- if (trans_force_write_s(self->trans, s) != 0)
+ if (trans_write_copy_s(self->trans, s) != 0)
{
return 1;
}
diff --git a/libxrdp/xrdp_jpeg_compress.c b/libxrdp/xrdp_jpeg_compress.c
index e4ce64fe..27c31639 100644
--- a/libxrdp/xrdp_jpeg_compress.c
+++ b/libxrdp/xrdp_jpeg_compress.c
@@ -220,7 +220,7 @@ struct mydata_comp
};
/*****************************************************************************/
-/* called at begining */
+/* called at beginning */
static void DEFAULT_CC
my_init_destination(j_compress_ptr cinfo)
{
diff --git a/libxrdp/xrdp_mcs.c b/libxrdp/xrdp_mcs.c
index 0ff57b0c..03e6bca7 100644
--- a/libxrdp/xrdp_mcs.c
+++ b/libxrdp/xrdp_mcs.c
@@ -183,7 +183,7 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
}
else
{
- log_message(LOG_LEVEL_DEBUG,"Recieved an unhandled appid:%d",appid);
+ log_message(LOG_LEVEL_DEBUG,"Received an unhandled appid:%d",appid);
}
break;
diff --git a/libxrdp/xrdp_orders.c b/libxrdp/xrdp_orders.c
index 7d969514..b2f1e582 100644
--- a/libxrdp/xrdp_orders.c
+++ b/libxrdp/xrdp_orders.c
@@ -286,7 +286,7 @@ xrdp_orders_last_bounds(struct xrdp_orders *self, struct xrdp_rect *rect)
}
/*****************************************************************************/
-/* check if all coords are withing 256 bytes */
+/* check if all coords are within 256 bytes */
/* returns boolean */
static int APP_CC
xrdp_orders_send_delta(struct xrdp_orders *self, int *vals, int count)
@@ -2719,7 +2719,7 @@ xrdp_orders_out_v3(struct xrdp_orders *self, int cache_id, int cache_idx,
out_uint8(self->out_s, RDP_ORDER_BMPCACHE3); /* type */
/* cache index */
out_uint16_le(self->out_s, cache_idx);
- /* persistant cache key 1/2 */
+ /* persistent cache key 1/2 */
out_uint32_le(self->out_s, 0);
out_uint32_le(self->out_s, 0);
/* bitmap data */
diff --git a/libxrdp/xrdp_orders_rail.c b/libxrdp/xrdp_orders_rail.c
index 91d4b607..3c5d5b63 100644
--- a/libxrdp/xrdp_orders_rail.c
+++ b/libxrdp/xrdp_orders_rail.c
@@ -333,6 +333,12 @@ xrdp_orders_send_window_new_update(struct xrdp_orders *self, int window_id,
order_size += 8 * window_state->num_visibility_rects;
}
+ if (order_size < 12)
+ {
+ /* no flags set */
+ return 0;
+ }
+
if (xrdp_orders_check(self, order_size) != 0)
{
return 1;
diff --git a/libxrdp/xrdp_sec.c b/libxrdp/xrdp_sec.c
index 1d3b0061..06dfdda7 100644
--- a/libxrdp/xrdp_sec.c
+++ b/libxrdp/xrdp_sec.c
@@ -1871,6 +1871,10 @@ xrdp_sec_process_mcs_data_monitors(struct xrdp_sec *self, struct stream *s)
int index;
int monitorCount;
int flags;
+ int x1;
+ int y1;
+ int x2;
+ int y2;
struct xrdp_client_info *client_info = (struct xrdp_client_info *)NULL;
client_info = &(self->rdp_layer->client_info);
@@ -1904,6 +1908,10 @@ xrdp_sec_process_mcs_data_monitors(struct xrdp_sec *self, struct stream *s)
client_info->monitorCount = monitorCount;
+ x1 = 0;
+ y1 = 0;
+ x2 = 0;
+ y2 = 0;
/* Add client_monitor_data to client_info struct, will later pass to X11rdp */
for (index = 0; index < monitorCount; index++)
{
@@ -1912,10 +1920,31 @@ xrdp_sec_process_mcs_data_monitors(struct xrdp_sec *self, struct stream *s)
in_uint32_le(s, client_info->minfo[index].right);
in_uint32_le(s, client_info->minfo[index].bottom);
in_uint32_le(s, client_info->minfo[index].is_primary);
+ if (index == 0)
+ {
+ x1 = client_info->minfo[index].left;
+ y1 = client_info->minfo[index].top;
+ x2 = client_info->minfo[index].right;
+ y2 = client_info->minfo[index].bottom;
+ }
+ else
+ {
+ x1 = MIN(x1, client_info->minfo[index].left);
+ y1 = MIN(y1, client_info->minfo[index].top);
+ x2 = MAX(x2, client_info->minfo[index].right);
+ y2 = MAX(y2, client_info->minfo[index].bottom);
+ }
g_writeln("got a monitor: left= %d, top= %d, right= %d, bottom= %d, is_primary?= %d", client_info->minfo[index].left,
client_info->minfo[index].top, client_info->minfo[index].right, client_info->minfo[index].bottom, client_info->minfo[index].is_primary);
}
+
+ if ((x2 > x1) && (y2 > y1))
+ {
+ client_info->width = (x2 - x1) + 1;
+ client_info->height = (y2 - y1) + 1;
+ }
+
return 0;
}
diff --git a/m4/.gitignore b/m4/.gitignore
new file mode 100644
index 00000000..0f4126cd
--- /dev/null
+++ b/m4/.gitignore
@@ -0,0 +1 @@
+*.m4
diff --git a/mc/Makefile.am b/mc/Makefile.am
index eb000085..f56dac5f 100644
--- a/mc/Makefile.am
+++ b/mc/Makefile.am
@@ -1,12 +1,10 @@
EXTRA_DIST = mc.h
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common
lib_LTLIBRARIES = \
diff --git a/mc/mc.h b/mc/mc.h
index 684219c7..4af932f0 100644
--- a/mc/mc.h
+++ b/mc/mc.h
@@ -24,7 +24,7 @@
#include "os_calls.h"
#include "defines.h"
-#define CURRENT_MOD_VER 2
+#define CURRENT_MOD_VER 3
struct mod
{
@@ -42,8 +42,8 @@ struct mod
int (*mod_get_wait_objs)(struct mod* v, tbus* read_objs, int* rcount,
tbus* write_objs, int* wcount, int* timeout);
int (*mod_check_wait_objs)(struct mod* v);
- long mod_dumby[100 - 9]; /* align, 100 minus the number of mod
- functions above */
+ tintptr mod_dumby[100 - 9]; /* align, 100 minus the number of mod
+ functions above */
/* server functions */
int (*server_begin_update)(struct mod* v);
int (*server_end_update)(struct mod* v);
@@ -67,7 +67,7 @@ struct mod
int (*server_set_pen)(struct mod* v, int style,
int width);
int (*server_draw_line)(struct mod* v, int x1, int y1, int x2, int y2);
- int (*server_add_char)(struct mod* v, int font, int charactor,
+ int (*server_add_char)(struct mod* v, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int (*server_draw_text)(struct mod* v, int font,
@@ -85,14 +85,15 @@ struct mod
char* data, int data_len,
int total_data_len, int flags);
int (*server_bell_trigger)(struct mod* v);
- long server_dumby[100 - 25]; /* align, 100 minus the number of server
- functions above */
+ tintptr server_dumby[100 - 25]; /* align, 100 minus the number of server
+ functions above */
/* common */
- long handle; /* pointer to self as long */
- long wm;
- long painter;
- int sck;
+ tintptr handle; /* pointer to self as long */
+ tintptr wm;
+ tintptr painter;
+ tintptr si;
/* mod data */
+ int sck;
int width;
int height;
int bpp;
diff --git a/neutrinordp/Makefile.am b/neutrinordp/Makefile.am
index 93e1196a..58fe9bc2 100644
--- a/neutrinordp/Makefile.am
+++ b/neutrinordp/Makefile.am
@@ -7,14 +7,12 @@ else
EXTRA_DEFINES += -DXRDP_NODEBUG
endif
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
-DXRDP_PID_PATH=\"${localstatedir}/run\" \
- $(EXTRA_DEFINES)
-
-INCLUDES = \
+ $(EXTRA_DEFINES) \
-I$(top_srcdir)/common \
$(FREERDP_CFLAGS)
diff --git a/neutrinordp/xrdp-neutrinordp.h b/neutrinordp/xrdp-neutrinordp.h
index aaff6d5a..8606efe2 100644
--- a/neutrinordp/xrdp-neutrinordp.h
+++ b/neutrinordp/xrdp-neutrinordp.h
@@ -58,7 +58,7 @@ struct pointer_item
int bpp;
};
-#define CURRENT_MOD_VER 2
+#define CURRENT_MOD_VER 3
struct mod
{
@@ -76,8 +76,8 @@ struct mod
int (*mod_get_wait_objs)(struct mod* v, tbus* read_objs, int* rcount,
tbus* write_objs, int* wcount, int* timeout);
int (*mod_check_wait_objs)(struct mod* v);
- long mod_dumby[100 - 9]; /* align, 100 minus the number of mod
- functions above */
+ tintptr mod_dumby[100 - 9]; /* align, 100 minus the number of mod
+ functions above */
/* server functions */
int (*server_begin_update)(struct mod* v);
int (*server_end_update)(struct mod* v);
@@ -101,7 +101,7 @@ struct mod
int (*server_set_pen)(struct mod* v, int style,
int width);
int (*server_draw_line)(struct mod* v, int x1, int y1, int x2, int y2);
- int (*server_add_char)(struct mod* v, int font, int charactor,
+ int (*server_add_char)(struct mod* v, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int (*server_draw_text)(struct mod* v, int font,
@@ -152,14 +152,15 @@ struct mod
int (*server_set_pointer_ex)(struct mod* mod, int x, int y, char* data,
char* mask, int bpp);
- long server_dumby[100 - 37]; /* align, 100 minus the number of server
- functions above */
+ tintptr server_dumby[100 - 37]; /* align, 100 minus the number of server
+ functions above */
/* common */
- tbus handle; /* pointer to self as long */
- tbus wm;
- tbus painter;
- int sck;
+ tintptr handle; /* pointer to self as long */
+ tintptr wm;
+ tintptr painter;
+ tintptr si;
/* mod data */
+ int sck;
int width;
int height;
int bpp;
diff --git a/prog_std.txt b/prog_std.txt
index c358a470..671172f2 100644
--- a/prog_std.txt
+++ b/prog_std.txt
@@ -1,5 +1,5 @@
-This is an atempt to explain my odd programming standard used for this project.
+This is an attempt to explain my odd programming standard used for this project.
Not to defend any of these but its my default standard and make it easy
for me to read.
Some files break these rules, they will be updated eventually.
diff --git a/rdp/Makefile.am b/rdp/Makefile.am
index 9b519d7c..6d23b287 100644
--- a/rdp/Makefile.am
+++ b/rdp/Makefile.am
@@ -7,14 +7,12 @@ else
EXTRA_DEFINES += -DXRDP_NODEBUG
endif
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
-DXRDP_PID_PATH=\"${localstatedir}/run\" \
- $(EXTRA_DEFINES)
-
-INCLUDES = \
+ $(EXTRA_DEFINES) \
-I$(top_srcdir)/common
lib_LTLIBRARIES = \
diff --git a/rdp/rdp.h b/rdp/rdp.h
index 9a755a38..36a20f57 100644
--- a/rdp/rdp.h
+++ b/rdp/rdp.h
@@ -292,7 +292,7 @@ struct mod
int (*server_set_pen)(struct mod* v, int style,
int width);
int (*server_draw_line)(struct mod* v, int x1, int y1, int x2, int y2);
- int (*server_add_char)(struct mod* v, int font, int charactor,
+ int (*server_add_char)(struct mod* v, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int (*server_draw_text)(struct mod* v, int font,
diff --git a/rdp/rdp_mcs.c b/rdp/rdp_mcs.c
index 18c33ac4..536ba7d1 100644
--- a/rdp/rdp_mcs.c
+++ b/rdp/rdp_mcs.c
@@ -19,7 +19,7 @@
*/
#include "rdp.h"
-#include "common/log.h"
+#include "log.h"
/*****************************************************************************/
struct rdp_mcs *APP_CC
diff --git a/rdp/rdp_orders.c b/rdp/rdp_orders.c
index 0e4d42ad..3372a815 100644
--- a/rdp/rdp_orders.c
+++ b/rdp/rdp_orders.c
@@ -1435,7 +1435,7 @@ rdp_orders_process_orders(struct rdp_orders *self, struct stream *s,
}
/*****************************************************************************/
-/* returns pointer, it might return bmpdata if the data dosen't need to
+/* returns pointer, it might return bmpdata if the data doesn't need to
be converted, else it mallocs it. The calling function must free
it if needed */
char *APP_CC
diff --git a/rdp/rdp_tcp.c b/rdp/rdp_tcp.c
index f0a76d7d..0200e777 100644
--- a/rdp/rdp_tcp.c
+++ b/rdp/rdp_tcp.c
@@ -74,7 +74,7 @@ rdp_tcp_recv(struct rdp_tcp *self, struct stream *s, int len)
{
if (g_tcp_last_error_would_block(self->sck))
{
- g_tcp_can_recv(self->sck, 10);
+ g_sck_can_recv(self->sck, 10);
}
else
{
diff --git a/readme.txt b/readme.txt
index aa2b2742..b051ef02 100644
--- a/readme.txt
+++ b/readme.txt
@@ -9,8 +9,8 @@ Credits
Mark from up 19.9 was the first to work with rdp server code.
Tested with linux on i386, x64, sparc, and ppc.
-I've got it compiling and working in windows with borland free tools.
-Non of the sesman or Xserver stuff works in windows of course.
+I've got it compiling and working in windows with Borland free tools.
+None of the sesman or Xserver stuff works in windows of course.
xrdp directory is the main server code
vnc directory is a simple vnc client module for xrdp
@@ -19,11 +19,11 @@ libxrdp directory is a static library needed by xrdp
rdp is an rdp client module for connecting to another rdp server
xup is a module used to connect to an rdp specific X11 server
Xserver is the files needed to build an rdp specific X11 server
-COPYING is the licence file
-design.txt is an attempt to expain the project design
-prog_std.txt is an attemp to explain the programming standard used
+COPYING is the license file
+design.txt is an attempt to explain the project design
+prog_std.txt is an attempt to explain the programming standard used
-since version 0.5.0 we switch to autotool to build xrdp
+since version 0.5.0 we switch to autotools to build xrdp
to build and install
diff --git a/sesman/Makefile.am b/sesman/Makefile.am
index 516639f4..979f72d9 100644
--- a/sesman/Makefile.am
+++ b/sesman/Makefile.am
@@ -1,12 +1,12 @@
-EXTRA_DIST = sesman.ini startwm.sh sesman.h access.h auth.h config.h env.h lock.h scp.h scp_v0.h scp_v1.h scp_v1_mng.h session.h sig.h thread.h
-AM_CFLAGS = \
+EXTRA_DIST = sesman.ini startwm.sh sesman.h access.h auth.h config.h env.h \
+scp.h scp_v0.h scp_v1.h scp_v1_mng.h session.h sig.h
+
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common \
-I$(top_srcdir)/sesman/libscp
@@ -44,8 +44,6 @@ xrdp_sesman_SOURCES = \
sesman.c \
session.c \
sig.c \
- thread.c \
- lock.c \
access.c \
config.c \
env.c \
diff --git a/sesman/access.c b/sesman/access.c
index 1ba22df4..269b9e77 100644
--- a/sesman/access.c
+++ b/sesman/access.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/sesman/chansrv/Makefile.am b/sesman/chansrv/Makefile.am
index ed55ae02..45397b73 100644
--- a/sesman/chansrv/Makefile.am
+++ b/sesman/chansrv/Makefile.am
@@ -10,7 +10,11 @@ EXTRA_DIST = \
sound.h \
xcommon.h \
mlog.h \
- chansrv_common.h
+ chansrv_common.h \
+ irp.h \
+ smartcard.h \
+ smartcard_pcsc.h \
+ fifo.h
EXTRA_DEFINES =
EXTRA_INCLUDES =
@@ -27,17 +31,17 @@ EXTRA_DEFINES += -DXRDP_OPUS
EXTRA_LIBS += -lopus
endif
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
-DXRDP_PID_PATH=\"${localstatedir}/run\" \
- $(EXTRA_DEFINES)
-
-INCLUDES = \
+ $(EXTRA_DEFINES) \
-I$(top_srcdir)/common \
$(EXTRA_INCLUDES)
+AM_CFLAGS = $(X_CFLAGS)
+
sbin_PROGRAMS = \
xrdp-chansrv
@@ -58,10 +62,10 @@ xrdp_chansrv_SOURCES = \
chansrv_common.c
xrdp_chansrv_LDFLAGS = \
+ $(X_LIBS) \
$(EXTRA_FLAGS)
xrdp_chansrv_LDADD = \
- -L/usr/X11R6/lib \
$(top_builddir)/common/libcommon.la \
- -lX11 -lXfixes -lXrandr \
+ $(X_PRE_LIBS) -lXfixes -lXrandr -lX11 $(X_EXTRA_LIBS) \
$(EXTRA_LIBS)
diff --git a/sesman/chansrv/chansrv.c b/sesman/chansrv/chansrv.c
index 29e8c106..9752b7f3 100644
--- a/sesman/chansrv/chansrv.c
+++ b/sesman/chansrv/chansrv.c
@@ -1184,7 +1184,7 @@ channel_thread_loop(void *in_val)
num_objs++;
trans_get_wait_objs(g_lis_trans, objs, &num_objs);
trans_get_wait_objs_rw(g_con_trans, objs, &num_objs,
- wobjs, &num_wobjs);
+ wobjs, &num_wobjs, &timeout);
trans_get_wait_objs(g_api_lis_trans, objs, &num_objs);
if (g_api_con_trans_list != 0)
diff --git a/sesman/chansrv/chansrv_fuse.c b/sesman/chansrv/chansrv_fuse.c
index b3499ad6..ed180454 100644
--- a/sesman/chansrv/chansrv_fuse.c
+++ b/sesman/chansrv/chansrv_fuse.c
@@ -62,8 +62,8 @@ char g_fuse_clipboard_path[256] = ""; /* for clipboard use */
#include "chansrv_fuse.h"
/* dummy calls when XRDP_FUSE is not defined */
-int xfuse_init() { return 0; }
-int xfuse_deinit() { return 0; }
+int xfuse_init(void) { return 0; }
+int xfuse_deinit(void) { return 0; }
int xfuse_check_wait_objs(void) { return 0; }
int xfuse_get_wait_objs(tbus *objs, int *count, int *timeout) { return 0; }
int xfuse_clear_clip_dir(void) { return 0; }
@@ -74,7 +74,7 @@ int xfuse_create_share(tui32 device_id, char *dirname) { r
void xfuse_devredir_cb_open_file(void *vp, tui32 IoStatus, tui32 DeviceId, tui32 FileId) {}
void xfuse_devredir_cb_write_file(void *vp, char *buf, size_t length) {}
void xfuse_devredir_cb_read_file(void *vp, char *buf, size_t length) {}
-int xfuse_devredir_cb_enum_dir(void *vp, struct xrdp_inode *xinode) {}
+int xfuse_devredir_cb_enum_dir(void *vp, struct xrdp_inode *xinode) { return 0; }
void xfuse_devredir_cb_enum_dir_done(void *vp, tui32 IoStatus) {}
void xfuse_devredir_cb_rmdir_or_file(void *vp, tui32 IoStatus) {}
void xfuse_devredir_cb_rename_file(void *vp, tui32 IoStatus) {}
@@ -253,8 +253,8 @@ static int g_fd = 0;
static tintptr g_bufsize = 0;
/* forward declarations for internal access */
-static int xfuse_init_xrdp_fs();
-static int xfuse_deinit_xrdp_fs();
+static int xfuse_init_xrdp_fs(void);
+static int xfuse_deinit_xrdp_fs(void);
static int xfuse_init_lib(struct fuse_args *args);
static int xfuse_is_inode_valid(int ino);
@@ -264,7 +264,7 @@ static void xfuse_create_file(fuse_req_t req, fuse_ino_t parent,
const char *name, mode_t mode, int type);
#endif
-static void xfuse_dump_fs();
+static void xfuse_dump_fs(void);
static void xfuse_dump_xrdp_inode(struct xrdp_inode *xino);
static tui32 xfuse_get_device_id_for_inode(tui32 ino, char *full_path);
static void fuse_reverse_pathname(char *full_path, char *reverse_path);
@@ -281,7 +281,7 @@ static int xfuse_delete_file(int parent, char *name);
static int xfuse_delete_file_with_xinode(XRDP_INODE *xinode);
static int xfuse_delete_dir_with_xinode(XRDP_INODE *xinode);
static int xfuse_recursive_delete_dir_with_xinode(XRDP_INODE *xinode);
-static void xfuse_update_xrdpfs_size();
+static void xfuse_update_xrdpfs_size(void);
static void xfuse_enum_dir(fuse_req_t req, fuse_ino_t ino, size_t size,
off_t off, struct fuse_file_info *fi);
@@ -693,6 +693,11 @@ int xfuse_clear_clip_dir(void)
log_debug("entered");
+ if (g_xrdp_fs.inode_table == NULL)
+ {
+ return 0;
+ }
+
/* xinode for .clipboard */
xip = g_xrdp_fs.inode_table[2];
diff --git a/sesman/chansrv/clipboard.c b/sesman/chansrv/clipboard.c
index 310e2093..11c37a16 100644
--- a/sesman/chansrv/clipboard.c
+++ b/sesman/chansrv/clipboard.c
@@ -176,6 +176,8 @@ x-special/gnome-copied-files
#define LOG_ERROR 0
#define LOG_INFO 1
#define LOG_DEBUG 2
+
+#undef LOG_LEVEL
#define LOG_LEVEL LOG_ERROR
#define log_error(_params...) \
@@ -271,7 +273,7 @@ static int g_cliprdr_flags = CB_USE_LONG_FORMAT_NAMES |
CB_FILECLIP_NO_FILE_PATHS;
/* from client to server */
-/* last recieved CLIPRDR_FORMAT_LIST(CLIPRDR_FORMAT_ANNOUNCE) */
+/* last received CLIPRDR_FORMAT_LIST(CLIPRDR_FORMAT_ANNOUNCE) */
static int g_formatIds[16];
static int g_num_formatIds = 0;
@@ -1547,7 +1549,7 @@ clipboard_data_in(struct stream *s, int chan_id, int chan_flags, int length,
{
log_error("aborting clipboard_data_in - clipboard has not "
"been initialized");
- /* we return 0 here to indicate no protocol problem occured */
+ /* we return 0 here to indicate no protocol problem occurred */
return 0;
}
@@ -1887,7 +1889,7 @@ clipboard_event_selection_notify(XEvent *xevent)
XDeleteProperty(g_display, lxevent->requestor, lxevent->property);
if (type == g_incr_atom)
{
- /* nothing more to do here, the data is comming in through
+ /* nothing more to do here, the data is coming in through
PropertyNotify */
log_debug("clipboard_event_selection_notify: type is INCR "
"data_size %d property name %s type %s", data_size,
diff --git a/sesman/chansrv/clipboard_file.c b/sesman/chansrv/clipboard_file.c
index c1fb0909..4f3f1ade 100644
--- a/sesman/chansrv/clipboard_file.c
+++ b/sesman/chansrv/clipboard_file.c
@@ -22,6 +22,7 @@
* CLIPRDR_FILEDESCRIPTOR
* http://msdn.microsoft.com/en-us/library/ff362447%28prot.20%29.aspx */
+#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/extensions/Xfixes.h>
@@ -553,7 +554,7 @@ clipboard_process_file_request(struct stream *s, int clip_msg_status,
}
/*****************************************************************************/
-/* server requested info about the file and this is the responce
+/* server requested info about the file and this is the response
it's either the file size or file data */
int APP_CC
clipboard_process_file_response(struct stream *s, int clip_msg_status,
diff --git a/sesman/chansrv/pulse/module-xrdp-sink.c b/sesman/chansrv/pulse/module-xrdp-sink.c
index 8606f412..5d6256d4 100644
--- a/sesman/chansrv/pulse/module-xrdp-sink.c
+++ b/sesman/chansrv/pulse/module-xrdp-sink.c
@@ -309,7 +309,7 @@ static int data_send(struct userdata *u, pa_memchunk *chunk) {
s.sun_family = AF_UNIX;
bytes = sizeof(s.sun_path) - 1;
snprintf(s.sun_path, bytes, CHANSRV_PORT_STR, u->display_num);
- pa_log_debug("trying to conenct to %s", s.sun_path);
+ pa_log_debug("trying to connect to %s", s.sun_path);
if (connect(fd, (struct sockaddr *)&s,
sizeof(struct sockaddr_un)) != 0) {
u->failed_connect_time = pa_rtclock_now();
diff --git a/sesman/chansrv/pulse/module-xrdp-source.c b/sesman/chansrv/pulse/module-xrdp-source.c
index 37c0bb4e..52409606 100644
--- a/sesman/chansrv/pulse/module-xrdp-source.c
+++ b/sesman/chansrv/pulse/module-xrdp-source.c
@@ -313,7 +313,7 @@ static void thread_func(void *userdata) {
} else {
if (u->want_src_data)
{
- /* we dont want source data anymore */
+ /* we don't want source data anymore */
char buf[12];
buf[0] = 0;
diff --git a/sesman/chansrv/rail.c b/sesman/chansrv/rail.c
index f3777970..f12d8e3f 100644
--- a/sesman/chansrv/rail.c
+++ b/sesman/chansrv/rail.c
@@ -1775,7 +1775,7 @@ rail_configure_window(XConfigureEvent *config)
/*****************************************************************************/
static int
-rail_desktop_resize(lxevent)
+rail_desktop_resize(XEvent *lxevent)
{
LOG(0, ("rail_desktop_resize:"));
return 0;
diff --git a/sesman/env.c b/sesman/env.c
index 227f6bbf..b2f06160 100644
--- a/sesman/env.c
+++ b/sesman/env.c
@@ -25,36 +25,56 @@
*/
#include "list.h"
-
#include "sesman.h"
-
-#include "sys/types.h"
#include "grp.h"
+#include "ssl_calls.h"
extern unsigned char g_fixedkey[8]; /* in sesman.c */
extern struct config_sesman *g_cfg; /* in sesman.c */
/******************************************************************************/
int DEFAULT_CC
-env_check_password_file(char *filename, char *password)
+env_check_password_file(char *filename, char *passwd)
{
char encryptedPasswd[16];
+ char key[24];
+ char passwd_hash[20];
+ char passwd_hash_text[40];
int fd;
-
- g_memset(encryptedPasswd, 0, 16);
- g_strncpy(encryptedPasswd, password, 8);
- rfbDesKey(g_fixedkey, 0);
- rfbDes((unsigned char *)encryptedPasswd, (unsigned char *)encryptedPasswd);
- fd = g_file_open(filename);
-
+ int passwd_bytes;
+ void *des;
+ void *sha1;
+
+ /* create password hash from passowrd */
+ passwd_bytes = g_strlen(passwd);
+ sha1 = ssl_sha1_info_create();
+ ssl_sha1_transform(sha1, "xrdp_vnc", 8);
+ ssl_sha1_transform(sha1, passwd, passwd_bytes);
+ ssl_sha1_transform(sha1, passwd, passwd_bytes);
+ ssl_sha1_complete(sha1, passwd_hash);
+ ssl_sha1_info_delete(sha1);
+ g_snprintf(passwd_hash_text, 39, "%2.2x%2.2x%2.2x%2.2x",
+ (tui8)passwd_hash[0], (tui8)passwd_hash[1],
+ (tui8)passwd_hash[2], (tui8)passwd_hash[3]);
+ passwd_hash_text[39] = 0;
+ passwd = passwd_hash_text;
+
+ /* create file from password */
+ g_memset(encryptedPasswd, 0, sizeof(encryptedPasswd));
+ g_strncpy(encryptedPasswd, passwd, 8);
+ g_memset(key, 0, sizeof(key));
+ g_mirror_memcpy(key, g_fixedkey, 8);
+ des = ssl_des3_encrypt_info_create(key, 0);
+ ssl_des3_encrypt(des, 8, encryptedPasswd, encryptedPasswd);
+ ssl_des3_info_delete(des);
+ fd = g_file_open_ex(filename, 0, 1, 1, 1);
if (fd == -1)
{
log_message(LOG_LEVEL_WARNING,
- "can't read vnc password file - %s",
+ "can't write vnc password hash file - %s",
filename);
return 1;
}
-
g_file_write(fd, encryptedPasswd, 8);
g_file_close(fd);
return 0;
@@ -110,7 +130,6 @@ env_set_user(char *username, char *passwd_file, int display,
g_set_current_dir(pw_dir);
g_sprintf(text, ":%d.0", display);
g_setenv("DISPLAY", text, 1);
- g_setenv("LANG", "en_US.UTF-8", 1);
g_setenv("XRDP_SESSION", "1", 1);
if ((env_names != 0) && (env_values != 0) &&
(env_names->count == env_values->count))
diff --git a/sesman/libscp/Makefile.am b/sesman/libscp/Makefile.am
index eaf518a8..3172f2cb 100644
--- a/sesman/libscp/Makefile.am
+++ b/sesman/libscp/Makefile.am
@@ -1,13 +1,11 @@
EXTRA_DIST = libscp_connection.h libscp_commands.h libscp.h libscp_session.h libscp_types_mng.h libscp_v1c_mng.h libscp_vX.h libscp_commands_mng.h libscp_init.h libscp_tcp.h libscp_v0.h libscp_v1s.h libscp_lock.h \
libscp_types.h libscp_v1c.h libscp_v1s_mng.h
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common
lib_LTLIBRARIES = \
diff --git a/sesman/libscp/libscp_lock.c b/sesman/libscp/libscp_lock.c
index 4db05422..d35e3c9c 100644
--- a/sesman/libscp/libscp_lock.c
+++ b/sesman/libscp/libscp_lock.c
@@ -57,7 +57,7 @@ scp_lock_fork_request(void)
if (lock_fork_blockers_count == 0)
{
- /* if noone is blocking fork(), then we're allowed to fork */
+ /* if no one is blocking fork(), then we're allowed to fork */
sem_post(&lock_fork_req);
}
diff --git a/sesman/libscp/libscp_lock.h b/sesman/libscp/libscp_lock.h
index b4e93c52..ae2c361b 100644
--- a/sesman/libscp/libscp_lock.h
+++ b/sesman/libscp/libscp_lock.h
@@ -52,8 +52,8 @@ scp_lock_fork_release(void);
*
* @brief starts a section that is critical for forking
*
- * starts a section that is critical for forking, that is noone can fork()
- * while i'm in a critical section. But if someone wanted to fork we have
+ * starts a section that is critical for forking, that is no one can fork()
+ * while I'm in a critical section. But if someone wanted to fork we have
* to wait until he finishes with lock_fork_release()
*
* @return
diff --git a/sesman/libscp/libscp_v1s.c b/sesman/libscp/libscp_v1s.c
index 69997ab2..fb137433 100644
--- a/sesman/libscp/libscp_v1s.c
+++ b/sesman/libscp/libscp_v1s.c
@@ -435,8 +435,11 @@ scp_v1s_list_sessions(struct SCP_CONNECTION *c, int sescnt, struct SCP_DISCONNEC
}
/* then we wait for client ack */
-#warning maybe this message could say if the session should be resized on
-#warning server side or client side
+
+ /*
+ * Maybe this message could say if the session should be resized on
+ * server side or client side.
+ */
init_stream(c->in_s, c->in_s->size);
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
diff --git a/sesman/lock.c b/sesman/lock.c
deleted file mode 100644
index 6337a541..00000000
--- a/sesman/lock.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * xrdp: A Remote Desktop Protocol server.
- *
- * Copyright (C) Jay Sorg 2004-2013
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * session manager
- * linux only
- */
-
-#include "sesman.h"
-
-extern struct config_sesman *g_cfg; /* in sesman.c */
-
-static tbus g_sync_mutex = 0;
-static tbus g_lock_chain = 0;
-static tbus g_sync_sem = 0;
-static tbus g_lock_socket = 0;
-
-/******************************************************************************/
-void APP_CC
-lock_init(void)
-{
- g_sync_mutex = tc_mutex_create();
- g_lock_chain = tc_mutex_create();
- g_sync_sem = tc_sem_create(0);
- g_lock_socket = tc_sem_create(1);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_deinit(void)
-{
- tc_mutex_delete(g_sync_mutex);
- tc_mutex_delete(g_lock_chain);
- tc_sem_delete(g_sync_sem);
- tc_sem_delete(g_lock_socket);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_chain_acquire(void)
-{
- /* lock the chain */
- LOG_DBG("lock_chain_acquire()");
- tc_mutex_lock(g_lock_chain);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_chain_release(void)
-{
- /* unlock the chain */
- LOG_DBG("lock_chain_release()");
- tc_mutex_unlock(g_lock_chain);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_socket_acquire(void)
-{
- /* lock socket variable */
- LOG_DBG("lock_socket_acquire()");
- tc_sem_dec(g_lock_socket);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_socket_release(void)
-{
- /* unlock socket variable */
- LOG_DBG("lock_socket_release()");
- tc_sem_inc(g_lock_socket);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_sync_acquire(void)
-{
- /* lock sync variable */
- LOG_DBG("lock_sync_acquire()");
- tc_mutex_lock(g_sync_mutex);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_sync_release(void)
-{
- /* unlock socket variable */
- LOG_DBG("lock_sync_release()");
- tc_mutex_unlock(g_sync_mutex);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_sync_sem_acquire(void)
-{
- /* dec sem */
- LOG_DBG("lock_sync_sem_acquire()");
- tc_sem_dec(g_sync_sem);
-}
-
-/******************************************************************************/
-void APP_CC
-lock_sync_sem_release(void)
-{
- /* inc sem */
- LOG_DBG("lock_sync_sem_release()");
- tc_sem_inc(g_sync_sem);
-}
diff --git a/sesman/lock.h b/sesman/lock.h
deleted file mode 100644
index 1fd968ef..00000000
--- a/sesman/lock.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * xrdp: A Remote Desktop Protocol server.
- *
- * Copyright (C) Jay Sorg 2004-2013
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef LOCK_H
-#define LOCK_H
-
-#include "sesman.h"
-
-/**
- *
- * @brief initializes all the locks
- *
- */
-void APP_CC
-lock_init(void);
-
-/**
- *
- * @brief cleanup all the locks
- *
- */
-void APP_CC
-lock_deinit(void);
-
-/**
- *
- * @brief acquires the lock for the session chain
- *
- */
-void APP_CC
-lock_chain_acquire(void);
-
-/**
- *
- * @brief releases the session chain lock
- *
- */
-void APP_CC
-lock_chain_release(void);
-
-/**
- *
- * @brief request the socket lock
- *
- */
-void APP_CC
-lock_socket_acquire(void);
-
-/**
- *
- * @brief releases the socket lock
- *
- */
-void APP_CC
-lock_socket_release(void);
-
-/**
- *
- * @brief request the main sync lock
- *
- */
-void APP_CC
-lock_sync_acquire(void);
-
-/**
- *
- * @brief releases the main sync lock
- *
- */
-void APP_CC
-lock_sync_release(void);
-
-/**
- *
- * @brief request the sync sem lock
- *
- */
-void APP_CC
-lock_sync_sem_acquire(void);
-
-/**
- *
- * @brief releases the sync sem lock
- *
- */
-void APP_CC
-lock_sync_sem_release(void);
-
-#endif
diff --git a/sesman/scp.c b/sesman/scp.c
index 076d57b2..fdb81a04 100644
--- a/sesman/scp.c
+++ b/sesman/scp.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,7 +29,6 @@
#include "sesman.h"
-extern int g_thread_sck; /* in thread.c */
extern struct config_sesman *g_cfg; /* in sesman.c */
/******************************************************************************/
@@ -39,14 +38,9 @@ scp_process_start(void *sck)
struct SCP_CONNECTION scon;
struct SCP_SESSION *sdata;
- /* making a local copy of the socket (it's on the stack) */
- /* probably this is just paranoia */
- scon.in_sck = g_thread_sck;
+ scon.in_sck = (int)(tintptr)sck;
LOG_DBG("started scp thread on socket %d", scon.in_sck);
- /* unlocking g_thread_sck */
- lock_socket_release();
-
make_stream(scon.in_s);
make_stream(scon.out_s);
diff --git a/sesman/scp_v0.c b/sesman/scp_v0.c
index ce528d46..efa9080c 100644
--- a/sesman/scp_v0.c
+++ b/sesman/scp_v0.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,9 +35,9 @@ scp_v0_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
int display = 0;
tbus data;
struct session_item *s_item;
- int errorcode = 0 ;
+ int errorcode = 0;
- data = auth_userpass(s->username, s->password,&errorcode);
+ data = auth_userpass(s->username, s->password, &errorcode);
if (s->type == SCP_GW_AUTHENTICATION)
{
@@ -55,7 +55,7 @@ scp_v0_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
}
else
{
- scp_v0s_replyauthentication(c, 32+3); /* all first 32 are reserved for PAM errors */
+ scp_v0s_replyauthentication(c, 32 + 3); /* all first 32 are reserved for PAM errors */
log_message(LOG_LEVEL_INFO, "Username okey but group problem for "
"user: %s", s->username);
/* g_writeln("user password ok, but group problem"); */
@@ -128,11 +128,11 @@ scp_v0_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
display = session_start(s->width, s->height, s->bpp, s->username,
s->password, data, SESMAN_SESSION_TYPE_XRDP,
s->domain, s->program, s->directory,
- s->client_ip);
- }
+ s->client_ip);
+ }
else if (SCP_SESSION_TYPE_XORG == s->type)
{
- /* type is SCP_SESSION_TYPE_XORG */
+ /* type is SCP_SESSION_TYPE_XORG */
log_message(LOG_LEVEL_INFO, "starting Xorg session...");
display = session_start(s->width, s->height, s->bpp, s->username,
s->password, data, SESMAN_SESSION_TYPE_XORG,
diff --git a/sesman/scp_v1.c b/sesman/scp_v1.c
index 2324b750..a0fff6d9 100644
--- a/sesman/scp_v1.c
+++ b/sesman/scp_v1.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/sesman/sesman.c b/sesman/sesman.c
index 9a3e915e..924a7ae8 100644
--- a/sesman/sesman.c
+++ b/sesman/sesman.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,10 +31,7 @@ int g_pid;
unsigned char g_fixedkey[8] = { 23, 82, 107, 6, 35, 78, 88, 7 };
struct config_sesman *g_cfg; /* defined in config.h */
-tbus g_term_event = 0;
-tbus g_sync_event = 0;
-
-extern int g_thread_sck; /* in thread.c */
+tintptr g_term_event = 0;
/******************************************************************************/
/**
@@ -49,6 +46,7 @@ sesman_main_loop(void)
int error;
int robjs_count;
int cont;
+ int pid;
tbus sck_obj;
tbus robjs[8];
@@ -80,7 +78,6 @@ sesman_main_loop(void)
robjs_count = 0;
robjs[robjs_count++] = sck_obj;
robjs[robjs_count++] = g_term_event;
- robjs[robjs_count++] = g_sync_event;
/* wait */
if (g_obj_wait(robjs, robjs_count, 0, 0, -1) != 0)
@@ -94,12 +91,6 @@ sesman_main_loop(void)
break;
}
- if (g_is_wait_obj_set(g_sync_event)) /* sync */
- {
- g_reset_wait_obj(g_sync_event);
- session_sync_start();
- }
-
if (g_is_wait_obj_set(sck_obj)) /* incoming connection */
{
in_sck = g_tcp_accept(g_sck);
@@ -118,8 +109,8 @@ sesman_main_loop(void)
{
/* we've got a connection, so we pass it to scp code */
LOG_DBG("new connection");
- thread_scp_start(in_sck);
- /* todo, do we have to wait here ? */
+ scp_process_start((void*)(tintptr)in_sck);
+ g_sck_close(in_sck);
}
}
}
@@ -138,9 +129,7 @@ sesman_main_loop(void)
"port '%s': %d (%s)", g_cfg->listen_port,
g_get_errno(), g_get_strerror());
}
-
- if (g_sck != -1)
- g_tcp_close(g_sck);
+ g_tcp_close(g_sck);
}
/******************************************************************************/
@@ -292,6 +281,9 @@ main(int argc, char **argv)
g_writeln("error opening log file [%s]. quitting.",
getLogFile(text, 255));
break;
+ default:
+ g_writeln("error");
+ break;
}
g_deinit();
@@ -329,9 +321,6 @@ main(int argc, char **argv)
}
}
- /* initializing locks */
- lock_init();
-
/* signal handling */
g_pid = g_getpid();
/* old style signal handling is now managed synchronously by a
@@ -387,8 +376,6 @@ main(int argc, char **argv)
g_snprintf(text, 255, "xrdp_sesman_%8.8x_main_term", g_pid);
g_term_event = g_create_wait_obj(text);
- g_snprintf(text, 255, "xrdp_sesman_%8.8x_main_sync", g_pid);
- g_sync_event = g_create_wait_obj(text);
sesman_main_loop();
@@ -399,7 +386,6 @@ main(int argc, char **argv)
}
g_delete_wait_obj(g_term_event);
- g_delete_wait_obj(g_sync_event);
if (!daemon)
{
diff --git a/sesman/sesman.h b/sesman/sesman.h
index 71688987..09b781bc 100644
--- a/sesman/sesman.h
+++ b/sesman/sesman.h
@@ -30,7 +30,6 @@
#if defined(HAVE_CONFIG_H)
#include "config_ac.h"
#endif
-#include "d3des.h"
#include "arch.h"
#include "parse.h"
#include "os_calls.h"
@@ -39,14 +38,10 @@
#include "env.h"
#include "auth.h"
#include "config.h"
-//#include "tcp.h"
#include "sig.h"
#include "session.h"
#include "access.h"
#include "scp.h"
-#include "thread.h"
-#include "lock.h"
-#include "thread_calls.h"
#include "libscp.h"
diff --git a/sesman/session.c b/sesman/session.c
index 40ff3480..8c3ccc17 100644
--- a/sesman/session.c
+++ b/sesman/session.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* BSD process grouping by:
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland.
@@ -32,30 +32,13 @@
#include "sesman.h"
#include "libscp_types.h"
-#include <errno.h>
-//#include <time.h>
-
-extern tbus g_sync_event;
extern unsigned char g_fixedkey[8];
extern struct config_sesman *g_cfg; /* in sesman.c */
extern int g_sck; /* in sesman.c */
-extern int g_thread_sck; /* in thread.c */
struct session_chain *g_sessions;
int g_session_count;
-static int g_sync_width;
-static int g_sync_height;
-static int g_sync_bpp;
-static char *g_sync_username;
-static char *g_sync_password;
-static char *g_sync_domain;
-static char *g_sync_program;
-static char *g_sync_directory;
-static char *g_sync_client_ip;
-static tbus g_sync_data;
-static tui8 g_sync_type;
-static int g_sync_result;
-static int g_sync_cmd;
+extern tbus g_term_event; /* in sesman.c */
/**
* Creates a string consisting of all parameters that is hosted in the param list
@@ -68,7 +51,6 @@ char *APP_CC
dumpItemsToString(struct list *self, char *outstr, int len)
{
int index;
- tbus item;
int totalLen = 0;
g_memset(outstr, 0, len);
@@ -100,9 +82,6 @@ session_get_bydata(char *name, int width, int height, int bpp, int type, char *c
struct session_chain *tmp;
enum SESMAN_CFG_SESS_POLICY policy = g_cfg->sess.policy;
- /*THREAD-FIX require chain lock */
- lock_chain_acquire();
-
tmp = g_sessions;
/* convert from SCP_SESSION_TYPE namespace to SESMAN_SESSION_TYPE namespace */
@@ -119,7 +98,6 @@ session_get_bydata(char *name, int width, int height, int bpp, int type, char *c
type = SESMAN_SESSION_TYPE_XORG;
break;
default:
- lock_chain_release();
return 0;
}
@@ -141,27 +119,9 @@ session_get_bydata(char *name, int width, int height, int bpp, int type, char *c
tmp->item->client_ip);
#endif
- if (type == SESMAN_SESSION_TYPE_XRDP)
- {
- /* only name and bpp need to match for X11rdp, it can resize */
- if (g_strncmp(name, tmp->item->name, 255) == 0 &&
- (!(policy & SESMAN_CFG_SESS_POLICY_D) ||
- (tmp->item->width == width && tmp->item->height == height)) &&
- (!(policy & SESMAN_CFG_SESS_POLICY_I) ||
- (g_strncmp_d(client_ip, tmp->item->client_ip, ':', 255) == 0)) &&
- (!(policy & SESMAN_CFG_SESS_POLICY_C) ||
- (g_strncmp(client_ip, tmp->item->client_ip, 255) == 0)) &&
- tmp->item->bpp == bpp &&
- tmp->item->type == type)
- {
- /*THREAD-FIX release chain lock */
- lock_chain_release();
- return tmp->item;
- }
- }
-
if (g_strncmp(name, tmp->item->name, 255) == 0 &&
- (tmp->item->width == width && tmp->item->height == height) &&
+ (!(policy & SESMAN_CFG_SESS_POLICY_D) ||
+ (tmp->item->width == width && tmp->item->height == height)) &&
(!(policy & SESMAN_CFG_SESS_POLICY_I) ||
(g_strncmp_d(client_ip, tmp->item->client_ip, ':', 255) == 0)) &&
(!(policy & SESMAN_CFG_SESS_POLICY_C) ||
@@ -169,16 +129,12 @@ session_get_bydata(char *name, int width, int height, int bpp, int type, char *c
tmp->item->bpp == bpp &&
tmp->item->type == type)
{
- /*THREAD-FIX release chain lock */
- lock_chain_release();
return tmp->item;
}
tmp = tmp->next;
}
- /*THREAD-FIX release chain lock */
- lock_chain_release();
return 0;
}
@@ -282,7 +238,6 @@ x_server_running(int display)
{
char text[256];
int x_running;
- int sck;
g_sprintf(text, "/tmp/.X11-unix/X%d", display);
x_running = g_file_exist(text);
@@ -324,9 +279,9 @@ session_start_sessvc(int xpid, int wmpid, long data, char *username, int display
/* building parameters */
g_snprintf(exe_path, 261, "%s/xrdp-sessvc", XRDP_SBIN_PATH);
- list_add_item(sessvc_params, (long)g_strdup(exe_path));
- list_add_item(sessvc_params, (long)g_strdup(xpid_str));
- list_add_item(sessvc_params, (long)g_strdup(wmpid_str));
+ list_add_item(sessvc_params, (tintptr)g_strdup(exe_path));
+ list_add_item(sessvc_params, (tintptr)g_strdup(xpid_str));
+ list_add_item(sessvc_params, (tintptr)g_strdup(wmpid_str));
list_add_item(sessvc_params, 0); /* mandatory */
env_set_user(username, 0, display,
@@ -344,7 +299,7 @@ session_start_sessvc(int xpid, int wmpid, long data, char *username, int display
/* no problem calling strerror for thread safety: other threads
are blocked */
log_message(LOG_LEVEL_DEBUG, "errno: %d, description: %s",
- errno, g_get_strerror());
+ g_get_errno(), g_get_strerror());
log_message(LOG_LEVEL_DEBUG, "execve parameter list:");
for (i = 0; i < (sessvc_params->count); i++)
@@ -398,7 +353,6 @@ session_get_aval_display_from_chain(void)
int display;
display = g_cfg->sess.x11_display_offset;
- lock_chain_acquire();
while ((display - g_cfg->sess.x11_display_offset) <= g_cfg->sess.max_sessions)
{
@@ -406,7 +360,6 @@ session_get_aval_display_from_chain(void)
{
if (!x_server_running_check_ports(display))
{
- lock_chain_release();
return display;
}
}
@@ -414,7 +367,6 @@ session_get_aval_display_from_chain(void)
display++;
}
- lock_chain_release();
log_message(LOG_LEVEL_ERROR, "X server -- no display in range is available");
return 0;
}
@@ -518,15 +470,16 @@ session_start_fork(int width, int height, int bpp, char *username,
return 0;
}
- pid = g_fork();
+ pid = g_fork(); /* parent is fork from tcp accpet,
+ child forks X and wm, then becomes scp */
if (pid == -1)
{
}
- else if (pid == 0) /* child sesman */
+ else if (pid == 0)
{
+ g_tcp_close(g_term_event);
g_tcp_close(g_sck);
- g_tcp_close(g_thread_sck);
g_sprintf(geometry, "%dx%d", width, height);
g_sprintf(depth, "%d", bpp);
g_sprintf(screen, ":%d", display);
@@ -566,19 +519,21 @@ session_start_fork(int width, int height, int bpp, char *username,
g_waitpid(bsdsespid);
#endif
- wmpid = g_fork();
+ wmpid = g_fork(); /* parent becomes X,
+ child forks wm, and waits, todo */
if (wmpid == -1)
{
}
- else if (wmpid == 0) /* child (child sesman) xserver */
+ else if (wmpid == 0)
{
wait_for_xserver(display);
auth_start_session(data, display);
- pampid = g_fork();
+ pampid = g_fork(); /* parent waits, todo
+ child becomes wm */
if (pampid == -1)
{
}
- else if (pampid == 0) /* child: X11/client */
+ else if (pampid == 0)
{
env_set_user(username, 0, display,
g_cfg->session_variables1,
@@ -614,7 +569,7 @@ session_start_fork(int width, int height, int bpp, char *username,
"wm for user %s - pid %d", username, g_getpid());
/* logging parameters */
log_message(LOG_LEVEL_DEBUG, "errno: %d, "
- "description: %s", errno, g_get_strerror());
+ "description: %s", g_get_errno(), g_get_strerror());
log_message(LOG_LEVEL_DEBUG, "execlp3 parameter "
"list:");
log_message(LOG_LEVEL_DEBUG, " argv[0] = %s",
@@ -632,7 +587,7 @@ session_start_fork(int width, int height, int bpp, char *username,
"wm for user %s - pid %d", username, g_getpid());
/* logging parameters */
log_message(LOG_LEVEL_DEBUG, "errno: %d, description: "
- "%s", errno, g_get_strerror());
+ "%s", g_get_errno(), g_get_strerror());
log_message(LOG_LEVEL_DEBUG, "execlp3 parameter list:");
log_message(LOG_LEVEL_DEBUG, " argv[0] = %s",
text);
@@ -647,7 +602,7 @@ session_start_fork(int width, int height, int bpp, char *username,
"for user %s - pid %d", username, g_getpid());
/* logging parameters */
log_message(LOG_LEVEL_DEBUG, "errno: %d, description: "
- "%s", errno, g_get_strerror());
+ "%s", g_get_errno(), g_get_strerror());
}
else
{
@@ -666,10 +621,10 @@ session_start_fork(int width, int height, int bpp, char *username,
g_exit(0);
}
}
- else /* parent (child sesman) */
+ else
{
- xpid = g_fork();
-
+ xpid = g_fork(); /* parent becomes scp,
+ child becomes X */
if (xpid == -1)
{
}
@@ -697,8 +652,8 @@ session_start_fork(int width, int height, int bpp, char *username,
xserver_params->auto_free = 1;
/* these are the must have parameters */
- list_add_item(xserver_params, (long) g_strdup("/usr/bin/Xorg"));
- list_add_item(xserver_params, (long) g_strdup(screen));
+ list_add_item(xserver_params, (tintptr) g_strdup("Xorg"));
+ list_add_item(xserver_params, (tintptr) g_strdup(screen));
/* additional parameters from sesman.ini file */
list_append_list_strdup(g_cfg->xorg_params, xserver_params, 0);
@@ -718,7 +673,7 @@ session_start_fork(int width, int height, int bpp, char *username,
g_setenv("XRDP_START_HEIGHT", geometry, 1);
/* fire up Xorg */
- g_execvp("/usr/bin/Xorg", pp1);
+ g_execvp("Xorg", pp1);
}
else if (type == SESMAN_SESSION_TYPE_XVNC)
{
@@ -727,14 +682,14 @@ session_start_fork(int width, int height, int bpp, char *username,
xserver_params->auto_free = 1;
/* these are the must have parameters */
- list_add_item(xserver_params, (long)g_strdup("Xvnc"));
- list_add_item(xserver_params, (long)g_strdup(screen));
- list_add_item(xserver_params, (long)g_strdup("-geometry"));
- list_add_item(xserver_params, (long)g_strdup(geometry));
- list_add_item(xserver_params, (long)g_strdup("-depth"));
- list_add_item(xserver_params, (long)g_strdup(depth));
- list_add_item(xserver_params, (long)g_strdup("-rfbauth"));
- list_add_item(xserver_params, (long)g_strdup(passwd_file));
+ list_add_item(xserver_params, (tintptr)g_strdup("Xvnc"));
+ list_add_item(xserver_params, (tintptr)g_strdup(screen));
+ list_add_item(xserver_params, (tintptr)g_strdup("-geometry"));
+ list_add_item(xserver_params, (tintptr)g_strdup(geometry));
+ list_add_item(xserver_params, (tintptr)g_strdup("-depth"));
+ list_add_item(xserver_params, (tintptr)g_strdup(depth));
+ list_add_item(xserver_params, (tintptr)g_strdup("-rfbauth"));
+ list_add_item(xserver_params, (tintptr)g_strdup(passwd_file));
/* additional parameters from sesman.ini file */
//config_read_xserver_params(SESMAN_SESSION_TYPE_XVNC,
@@ -753,12 +708,12 @@ session_start_fork(int width, int height, int bpp, char *username,
xserver_params->auto_free = 1;
/* these are the must have parameters */
- list_add_item(xserver_params, (long)g_strdup("X11rdp"));
- list_add_item(xserver_params, (long)g_strdup(screen));
- list_add_item(xserver_params, (long)g_strdup("-geometry"));
- list_add_item(xserver_params, (long)g_strdup(geometry));
- list_add_item(xserver_params, (long)g_strdup("-depth"));
- list_add_item(xserver_params, (long)g_strdup(depth));
+ list_add_item(xserver_params, (tintptr)g_strdup("X11rdp"));
+ list_add_item(xserver_params, (tintptr)g_strdup(screen));
+ list_add_item(xserver_params, (tintptr)g_strdup("-geometry"));
+ list_add_item(xserver_params, (tintptr)g_strdup(geometry));
+ list_add_item(xserver_params, (tintptr)g_strdup("-depth"));
+ list_add_item(xserver_params, (tintptr)g_strdup(depth));
/* additional parameters from sesman.ini file */
//config_read_xserver_params(SESMAN_SESSION_TYPE_XRDP,
@@ -784,7 +739,7 @@ session_start_fork(int width, int height, int bpp, char *username,
/* logging parameters */
log_message(LOG_LEVEL_DEBUG, "errno: %d, description: "
- "%s", errno, g_get_strerror());
+ "%s", g_get_errno(), g_get_strerror());
log_message(LOG_LEVEL_DEBUG, "execve parameter list size: "
"%d", (xserver_params)->count);
@@ -797,7 +752,7 @@ session_start_fork(int width, int height, int bpp, char *username,
list_delete(xserver_params);
g_exit(1);
}
- else /* parent (child sesman)*/
+ else
{
wait_for_xserver(display);
g_snprintf(text, 255, "%d", display);
@@ -809,7 +764,7 @@ session_start_fork(int width, int height, int bpp, char *username,
}
}
}
- else /* parent sesman process */
+ else
{
temp->item->pid = pid;
temp->item->display = display;
@@ -833,16 +788,10 @@ session_start_fork(int width, int height, int bpp, char *username,
temp->item->type = type;
temp->item->status = SESMAN_SESSION_STATUS_ACTIVE;
- /*THREAD-FIX require chain lock */
- lock_chain_acquire();
-
temp->next = g_sessions;
g_sessions = temp;
g_session_count++;
- /*THREAD-FIX release chain lock */
- lock_chain_release();
-
return display;
}
@@ -889,32 +838,9 @@ session_start(int width, int height, int bpp, char *username, char *password,
long data, tui8 type, char *domain, char *program,
char *directory, char *client_ip)
{
- int display;
-
- /* lock mutex */
- lock_sync_acquire();
- /* set shared vars */
- g_sync_cmd = 0;
- g_sync_width = width;
- g_sync_height = height;
- g_sync_bpp = bpp;
- g_sync_username = username;
- g_sync_password = password;
- g_sync_domain = domain;
- g_sync_program = program;
- g_sync_directory = directory;
- g_sync_client_ip = client_ip;
- g_sync_data = data;
- g_sync_type = type;
- /* set event for main thread to see */
- g_set_wait_obj(g_sync_event);
- /* wait for main thread to get done */
- lock_sync_sem_acquire();
- /* read result(display) from shared var */
- display = g_sync_result;
- /* unlock mutex */
- lock_sync_release();
- return display;
+ return session_start_fork(width, height, bpp, username,
+ password, data, type, domain,
+ program, directory, client_ip);
}
/******************************************************************************/
@@ -923,42 +849,7 @@ session_start(int width, int height, int bpp, char *username, char *password,
int DEFAULT_CC
session_reconnect(int display, char *username)
{
- /* lock mutex */
- lock_sync_acquire();
- /* set shared vars */
- g_sync_cmd = 1;
- g_sync_width = display;
- g_sync_username = username;
- /* set event for main thread to see */
- g_set_wait_obj(g_sync_event);
- /* wait for main thread to get done */
- lock_sync_sem_acquire();
- /* unlock mutex */
- lock_sync_release();
- return 0;
-}
-
-/******************************************************************************/
-/* called with the main thread */
-int APP_CC
-session_sync_start(void)
-{
- if (g_sync_cmd == 0)
- {
- g_sync_result = session_start_fork(g_sync_width, g_sync_height, g_sync_bpp,
- g_sync_username, g_sync_password,
- g_sync_data, g_sync_type, g_sync_domain,
- g_sync_program, g_sync_directory,
- g_sync_client_ip);
- }
- else
- {
- /* g_sync_width is really display */
- g_sync_result = session_reconnect_fork(g_sync_width, g_sync_username);
- }
-
- lock_sync_sem_release();
- return 0;
+ return session_reconnect_fork(display, username);
}
/******************************************************************************/
@@ -968,9 +859,6 @@ session_kill(int pid)
struct session_chain *tmp;
struct session_chain *prev;
- /*THREAD-FIX require chain lock */
- lock_chain_acquire();
-
tmp = g_sessions;
prev = 0;
@@ -992,8 +880,6 @@ session_kill(int pid)
prev->next = tmp->next;
}
- /*THREAD-FIX release chain lock */
- lock_chain_release();
return SESMAN_SESSION_KILL_NULLITEM;
}
@@ -1016,8 +902,6 @@ session_kill(int pid)
g_free(tmp);
g_session_count--;
- /*THREAD-FIX release chain lock */
- lock_chain_release();
return SESMAN_SESSION_KILL_OK;
}
@@ -1026,8 +910,6 @@ session_kill(int pid)
tmp = tmp->next;
}
- /*THREAD-FIX release chain lock */
- lock_chain_release();
return SESMAN_SESSION_KILL_NOTFOUND;
}
@@ -1037,9 +919,6 @@ session_sigkill_all()
{
struct session_chain *tmp;
- /*THREAD-FIX require chain lock */
- lock_chain_acquire();
-
tmp = g_sessions;
while (tmp != 0)
@@ -1057,9 +936,6 @@ session_sigkill_all()
/* go on */
tmp = tmp->next;
}
-
- /*THREAD-FIX release chain lock */
- lock_chain_release();
}
/******************************************************************************/
@@ -1077,9 +953,6 @@ session_get_bypid(int pid)
return 0;
}
- /*THREAD-FIX require chain lock */
- lock_chain_acquire();
-
tmp = g_sessions;
while (tmp != 0)
@@ -1088,18 +961,13 @@ session_get_bypid(int pid)
{
log_message(LOG_LEVEL_ERROR, "session descriptor for "
"pid %d is null!", pid);
- /*THREAD-FIX release chain lock */
- lock_chain_release();
g_free(dummy);
return 0;
}
if (tmp->item->pid == pid)
{
- /*THREAD-FIX release chain lock */
g_memcpy(dummy, tmp->item, sizeof(struct session_item));
- lock_chain_release();
- /*return tmp->item;*/
return dummy;
}
@@ -1107,8 +975,6 @@ session_get_bypid(int pid)
tmp = tmp->next;
}
- /*THREAD-FIX release chain lock */
- lock_chain_release();
g_free(dummy);
return 0;
}
@@ -1124,9 +990,6 @@ session_get_byuser(char *user, int *cnt, unsigned char flags)
count = 0;
- /*THREAD-FIX require chain lock */
- lock_chain_acquire();
-
tmp = g_sessions;
while (tmp != 0)
@@ -1152,8 +1015,6 @@ session_get_byuser(char *user, int *cnt, unsigned char flags)
if (count == 0)
{
(*cnt) = 0;
- /*THREAD-FIX release chain lock */
- lock_chain_release();
return 0;
}
@@ -1163,8 +1024,6 @@ session_get_byuser(char *user, int *cnt, unsigned char flags)
if (sess == 0)
{
(*cnt) = 0;
- /*THREAD-FIX release chain lock */
- lock_chain_release();
return 0;
}
@@ -1173,7 +1032,7 @@ session_get_byuser(char *user, int *cnt, unsigned char flags)
while (tmp != 0)
{
-#warning FIXME: we should get only disconnected sessions!
+/* #warning FIXME: we should get only disconnected sessions! */
if ((NULL == user) || (!g_strncasecmp(user, tmp->item->name, 256)))
{
if ((tmp->item->status) & flags)
@@ -1183,7 +1042,7 @@ session_get_byuser(char *user, int *cnt, unsigned char flags)
(sess[index]).height = tmp->item->height;
(sess[index]).width = tmp->item->width;
(sess[index]).bpp = tmp->item->bpp;
-#warning FIXME: setting idle times and such
+/* #warning FIXME: setting idle times and such */
/*(sess[index]).connect_time.year = tmp->item->connect_time.year;
(sess[index]).connect_time.month = tmp->item->connect_time.month;
(sess[index]).connect_time.day = tmp->item->connect_time.day;
@@ -1216,8 +1075,6 @@ session_get_byuser(char *user, int *cnt, unsigned char flags)
tmp = tmp->next;
}
- /*THREAD-FIX release chain lock */
- lock_chain_release();
(*cnt) = count;
return sess;
}
diff --git a/sesman/session.h b/sesman/session.h
index 05e3b3a9..7bd8c8f8 100644
--- a/sesman/session.h
+++ b/sesman/session.h
@@ -112,15 +112,6 @@ session_reconnect(int display, char* username);
/**
*
- * @brief starts a session
- * @return error
- *
- */
-int APP_CC
-session_sync_start(void);
-
-/**
- *
* @brief kills a session
* @param pid the pid of the session to be killed
* @return
diff --git a/sesman/sessvc/Makefile.am b/sesman/sessvc/Makefile.am
index 8ba24abd..c2714b94 100644
--- a/sesman/sessvc/Makefile.am
+++ b/sesman/sessvc/Makefile.am
@@ -1,11 +1,9 @@
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common
sbin_PROGRAMS = \
diff --git a/sesman/sessvc/sessvc.c b/sesman/sessvc/sessvc.c
index b3e42178..ce62cb47 100644
--- a/sesman/sessvc/sessvc.c
+++ b/sesman/sessvc/sessvc.c
@@ -101,7 +101,7 @@ main(int argc, char **argv)
wm_pid = g_atoi(argv[2]);
g_writeln("xrdp-sessvc: waiting for X (pid %d) and WM (pid %d)",
x_pid, wm_pid);
- /* run xrdp-chansrv as a seperate process */
+ /* run xrdp-chansrv as a separate process */
chansrv_pid = g_fork();
if (chansrv_pid == -1)
diff --git a/sesman/thread.c b/sesman/thread.c
deleted file mode 100644
index 0ed1182a..00000000
--- a/sesman/thread.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/**
- * xrdp: A Remote Desktop Protocol server.
- *
- * Copyright (C) Jay Sorg 2004-2013
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- *
- * @file thread.c
- * @brief thread stuff...
- * @author Simone Fedele
- *
- */
-
-#include "sesman.h"
-
-#include <errno.h>
-#include <signal.h>
-#include <pthread.h>
-
-extern struct config_sesman *g_cfg; /* in sesman.c */
-
-static pthread_t g_thread_sighandler;
-//static pthread_t g_thread_updater;
-
-/* a variable to pass the socket of s connection to a thread */
-int g_thread_sck;
-
-/******************************************************************************/
-int DEFAULT_CC
-thread_sighandler_start(void)
-{
- int ret;
- sigset_t sigmask;
- sigset_t oldmask;
- sigset_t waitmask;
-
- /* mask signals to be able to wait for them... */
- sigfillset(&sigmask);
- pthread_sigmask(SIG_BLOCK, &sigmask, &oldmask);
-
- /* unblock some signals... */
- sigemptyset(&waitmask);
-
- /* it is a good idea not to block SIGILL SIGSEGV */
- /* SIGFPE -- see sigaction(2) NOTES */
- sigaddset(&waitmask, SIGILL);
- sigaddset(&waitmask, SIGSEGV);
- sigaddset(&waitmask, SIGFPE);
- pthread_sigmask(SIG_UNBLOCK, &waitmask, NULL);
-
- log_message(LOG_LEVEL_INFO, "starting signal handling thread...");
-
- ret = pthread_create(&g_thread_sighandler, NULL, sig_handler_thread, "");
- pthread_detach(g_thread_sighandler);
-
- if (ret == 0)
- {
- log_message(LOG_LEVEL_INFO, "signal handler thread started successfully");
- return 0;
- }
-
- /* if something happened while starting a new thread... */
- switch (ret)
- {
- case EINVAL:
- log_message(LOG_LEVEL_ERROR, "invalid attributes for signal handling thread (creation returned EINVAL)");
- break;
- case EAGAIN:
- log_message(LOG_LEVEL_ERROR, "not enough resources to start signal handling thread (creation returned EAGAIN)");
- break;
- case EPERM:
- log_message(LOG_LEVEL_ERROR, "invalid permissions for signal handling thread (creation returned EPERM)");
- break;
- default:
- log_message(LOG_LEVEL_ERROR, "unknown error starting signal handling thread");
- }
-
- return 1;
-}
-
-#ifdef JUST_TO_AVOID_COMPILER_ERRORS
-/******************************************************************************/
-int DEFAULT_CC
-thread_session_update_start(void)
-{
- int ret;
- //starts the session update thread
- //that checks for idle time, destroys sessions, ecc...
-
-#warning this thread should always request lock_fork before read or write
-#warning (so we can Fork() In Peace)
- ret = pthread_create(&g_thread_updater, NULL, , "");
- pthread_detach(g_thread_updater);
-
- if (ret == 0)
- {
- log_message(&(g_cfg->log), LOG_LEVEL_INFO, "session update thread started successfully");
- return 0;
- }
-
- /* if something happened while starting a new thread... */
- switch (ret)
- {
- case EINVAL:
- log_message(LOG_LEVEL_ERROR, "invalid attributes for session update thread (creation returned EINVAL)");
- break;
- case EAGAIN:
- log_message(LOG_LEVEL_ERROR, "not enough resources to start session update thread (creation returned EAGAIN)");
- break;
- case EPERM:
- log_message(LOG_LEVEL_ERROR, "invalid permissions for session update thread (creation returned EPERM)");
- break;
- default:
- log_message(LOG_LEVEL_ERROR, "unknown error starting session update thread");
- }
-
- return 1;
-}
-#endif
-
-/******************************************************************************/
-int DEFAULT_CC
-thread_scp_start(int skt)
-{
- int ret;
- pthread_t th;
-
- /* blocking the use of thread_skt */
- lock_socket_acquire();
- g_thread_sck = skt;
-
- /* start a thread that processes a connection */
- ret = pthread_create(&th, NULL, scp_process_start, "");
- //ret = pthread_create(&th, NULL, scp_process_start, (void*) (&g_thread_sck));
- pthread_detach(th);
-
- if (ret == 0)
- {
- log_message(LOG_LEVEL_INFO, "scp thread on sck %d started successfully", skt);
- return 0;
- }
-
- /* if something happened while starting a new thread... */
- switch (ret)
- {
- case EINVAL:
- log_message(LOG_LEVEL_ERROR, "invalid attributes for scp thread on sck %d (creation returned EINVAL)", skt);
- break;
- case EAGAIN:
- log_message(LOG_LEVEL_ERROR, "not enough resources to start scp thread on sck %d (creation returned EAGAIN)", skt);
- break;
- case EPERM:
- log_message(LOG_LEVEL_ERROR, "invalid permissions for scp thread on sck %d (creation returned EPERM)", skt);
- break;
- default:
- log_message(LOG_LEVEL_ERROR, "unknown error starting scp thread on sck %d");
- }
-
- return 1;
-}
diff --git a/sesman/thread.h b/sesman/thread.h
deleted file mode 100644
index 83a4b63d..00000000
--- a/sesman/thread.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * xrdp: A Remote Desktop Protocol server.
- *
- * Copyright (C) Jay Sorg 2004-2013
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- *
- * @file thread.h
- * @brief thread stuff...
- * @author Simone Fedele
- *
- */
-
-#ifndef THREAD_H
-#define THREAD_H
-
-/**
- *
- * @brief Starts the signal handling thread
- * @retval 0 on success
- * @retval 1 on error
- *
- */
-int DEFAULT_CC
-thread_sighandler_start(void);
-
-/**
- *
- * @brief Starts the session update thread
- *
- */
-int DEFAULT_CC
-thread_session_update_start(void);
-
-/**
- *
- * @brief Starts a thread to handle an incoming connection
- *
- */
-int DEFAULT_CC
-thread_scp_start(int skt);
-
-#endif
diff --git a/sesman/tools/Makefile.am b/sesman/tools/Makefile.am
index 140c6820..066039b0 100644
--- a/sesman/tools/Makefile.am
+++ b/sesman/tools/Makefile.am
@@ -1,16 +1,16 @@
EXTRA_DIST = tcp.h
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common \
-I$(top_srcdir)/sesman/libscp \
-I$(top_srcdir)/sesman
+AM_CFLAGS = $(X_CFLAGS)
+
bin_PROGRAMS = \
xrdp-sesrun \
xrdp-sesadmin \
@@ -48,6 +48,8 @@ xrdp_sesadmin_LDADD = \
$(top_builddir)/common/libcommon.la \
$(top_builddir)/sesman/libscp/libscp.la
+xrdp_xcon_LDFLAGS = \
+ $(X_LIBS)
+
xrdp_xcon_LDADD = \
- -L/usr/X11R6/lib \
- -lX11
+ $(X_PRE_LIBS) -lX11 $(X_EXTRA_LIBS)
diff --git a/sesman/tools/config.c b/sesman/tools/config.c
new file mode 100644
index 00000000..0f1399cc
--- /dev/null
+++ b/sesman/tools/config.c
@@ -0,0 +1 @@
+#include "../config.c"
diff --git a/sesman/tools/sesadmin.c b/sesman/tools/sesadmin.c
index 32789c6d..203bc023 100644
--- a/sesman/tools/sesadmin.c
+++ b/sesman/tools/sesadmin.c
@@ -2,6 +2,19 @@
* sesadmin.c - an sesman administration tool
* (c) 2008 Simone Fedele
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "arch.h"
diff --git a/sesman/tools/sestest.c b/sesman/tools/sestest.c
index d42b31de..cf28f803 100644
--- a/sesman/tools/sestest.c
+++ b/sesman/tools/sestest.c
@@ -2,6 +2,19 @@
* sestest.c - an scp_v1 testing tool
* (c) 2008 Simone Fedele
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "arch.h"
diff --git a/sesman/tools/xcon.c b/sesman/tools/xcon.c
index 80832276..4150d6af 100644
--- a/sesman/tools/xcon.c
+++ b/sesman/tools/xcon.c
@@ -19,6 +19,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/types.h>
#include <X11/Xlib.h>
Display *g_display = 0;
diff --git a/tcutils/README.txt b/tcutils/README.txt
index de75f1b2..31ebb1f8 100644
--- a/tcutils/README.txt
+++ b/tcutils/README.txt
@@ -1,4 +1,4 @@
-A QT based utility program for thinclients using xrdp and NeutrinoRDP
+A QT based utility program for thin clients using xrdp and NeutrinoRDP
This program sends commands to NeutrinoRDP to do something
useful on the client end (such as unmounting a USB drive,
diff --git a/tcutils/moc_mainwindow.cpp b/tcutils/moc_mainwindow.cpp
deleted file mode 100644
index 85806598..00000000
--- a/tcutils/moc_mainwindow.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
-** Meta object code from reading C++ file 'mainwindow.h'
-**
-** Created: Sun Aug 25 15:11:44 2013
-** by: The Qt Meta Object Compiler version 63 (Qt 4.8.1)
-**
-** WARNING! All changes made in this file will be lost!
-*****************************************************************************/
-
-#include "mainwindow.h"
-#if !defined(Q_MOC_OUTPUT_REVISION)
-#error "The header file 'mainwindow.h' doesn't include <QObject>."
-#elif Q_MOC_OUTPUT_REVISION != 63
-#error "This file was generated using the moc from 4.8.1. It"
-#error "cannot be used with the include files from this version of Qt."
-#error "(The moc has changed too much.)"
-#endif
-
-QT_BEGIN_MOC_NAMESPACE
-static const uint qt_meta_data_MainWindow[] = {
-
- // content:
- 6, // revision
- 0, // classname
- 0, 0, // classinfo
- 5, 14, // methods
- 0, 0, // properties
- 0, 0, // enums/sets
- 0, 0, // constructors
- 0, // flags
- 0, // signalCount
-
- // slots: signature, parameters, type, tag, flags
- 12, 11, 11, 11, 0x08,
- 34, 11, 11, 11, 0x08,
- 56, 11, 11, 11, 0x08,
- 71, 11, 11, 11, 0x08,
- 88, 11, 11, 11, 0x08,
-
- 0 // eod
-};
-
-static const char qt_meta_stringdata_MainWindow[] = {
- "MainWindow\0\0onBtnRefreshClicked()\0"
- "onBtnUnmountClicked()\0onActionQuit()\0"
- "onActionLaunch()\0"
- "onSystemTrayClicked(QSystemTrayIcon::ActivationReason)\0"
-};
-
-void MainWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
-{
- if (_c == QMetaObject::InvokeMetaMethod) {
- Q_ASSERT(staticMetaObject.cast(_o));
- MainWindow *_t = static_cast<MainWindow *>(_o);
- switch (_id) {
- case 0: _t->onBtnRefreshClicked(); break;
- case 1: _t->onBtnUnmountClicked(); break;
- case 2: _t->onActionQuit(); break;
- case 3: _t->onActionLaunch(); break;
- case 4: _t->onSystemTrayClicked((*reinterpret_cast< QSystemTrayIcon::ActivationReason(*)>(_a[1]))); break;
- default: ;
- }
- }
-}
-
-const QMetaObjectExtraData MainWindow::staticMetaObjectExtraData = {
- 0, qt_static_metacall
-};
-
-const QMetaObject MainWindow::staticMetaObject = {
- { &QMainWindow::staticMetaObject, qt_meta_stringdata_MainWindow,
- qt_meta_data_MainWindow, &staticMetaObjectExtraData }
-};
-
-#ifdef Q_NO_DATA_RELOCATION
-const QMetaObject &MainWindow::getStaticMetaObject() { return staticMetaObject; }
-#endif //Q_NO_DATA_RELOCATION
-
-const QMetaObject *MainWindow::metaObject() const
-{
- return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
-}
-
-void *MainWindow::qt_metacast(const char *_clname)
-{
- if (!_clname) return 0;
- if (!strcmp(_clname, qt_meta_stringdata_MainWindow))
- return static_cast<void*>(const_cast< MainWindow*>(this));
- return QMainWindow::qt_metacast(_clname);
-}
-
-int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
-{
- _id = QMainWindow::qt_metacall(_c, _id, _a);
- if (_id < 0)
- return _id;
- if (_c == QMetaObject::InvokeMetaMethod) {
- if (_id < 5)
- qt_static_metacall(this, _c, _id, _a);
- _id -= 5;
- }
- return _id;
-}
-QT_END_MOC_NAMESPACE
diff --git a/tcutils/qrc_resources.cpp b/tcutils/qrc_resources.cpp
deleted file mode 100644
index 3f2366cb..00000000
--- a/tcutils/qrc_resources.cpp
+++ /dev/null
@@ -1,1191 +0,0 @@
-/****************************************************************************
-** Resource object code
-**
-** Created: Sun Aug 25 15:11:45 2013
-** by: The Resource Compiler for Qt version 4.8.1
-**
-** WARNING! All changes made in this file will be lost!
-*****************************************************************************/
-
-#include <QtCore/qglobal.h>
-
-static const unsigned char qt_resource_data[] = {
- // /home/lk/projects/jtech/nlabs_xrdp_tcutils/tcutils/resources/images/tools.gif
- 0x0,0x0,0x45,0x65,
- 0x47,
- 0x49,0x46,0x38,0x39,0x61,0xab,0x0,0xb7,0x0,0xe7,0xff,0x0,0x22,0x26,0x9a,0x18,
- 0x2a,0x95,0x24,0x29,0x8f,0x1d,0x2e,0x92,0x1d,0x32,0x71,0x23,0x33,0x64,0x15,0x37,
- 0x6c,0x16,0x34,0x96,0x22,0x31,0x96,0x1f,0x37,0x65,0x25,0x3b,0x5a,0x28,0x35,0x93,
- 0x1d,0x38,0x9a,0x2c,0x38,0x70,0x1f,0x39,0x95,0x24,0x3a,0x87,0x14,0x3d,0x9f,0x15,
- 0x3e,0x99,0x2a,0x40,0x65,0x24,0x3f,0x81,0x1f,0x41,0x7d,0x21,0x42,0x6e,0x25,0x3d,
- 0x99,0x29,0x40,0x70,0x2c,0x3e,0x7b,0x1b,0x41,0x9c,0x24,0x42,0x78,0xd,0x46,0x99,
- 0x10,0x46,0xa0,0x29,0x40,0x97,0x1f,0x43,0x9e,0x1f,0x44,0x99,0x2b,0x40,0x9e,0x1e,
- 0x45,0x93,0x24,0x44,0x8c,0x21,0x43,0xa6,0x1e,0x49,0x84,0x23,0x45,0xa1,0x16,0x49,
- 0xa3,0x29,0x43,0xab,0x2a,0x48,0x77,0x22,0x49,0x8a,0x19,0x4b,0x99,0x26,0x47,0x9d,
- 0x30,0x45,0x95,0x2b,0x49,0x7f,0x1a,0x4b,0x9f,0x1c,0x4a,0xac,0x3d,0x47,0x6f,0x28,
- 0x48,0xa4,0x31,0x48,0x8a,0x28,0x49,0x9f,0x2e,0x4a,0x87,0x1c,0x4e,0x95,0x1d,0x4c,
- 0xa7,0x29,0x4a,0x98,0x27,0x4e,0x79,0x1e,0x4d,0xa1,0x2a,0x4a,0xa0,0x1d,0x50,0x90,
- 0x11,0x51,0xab,0x25,0x4f,0x84,0x37,0x4a,0x82,0x2c,0x4f,0x73,0x2c,0x4a,0xa7,0x12,
- 0x52,0xa5,0x11,0x53,0x9f,0x21,0x4e,0xa3,0x20,0x4f,0x9d,0x2a,0x4d,0x95,0x2a,0x4e,
- 0x90,0x22,0x4f,0xa4,0x33,0x4e,0x7d,0x2d,0x4d,0x9c,0x29,0x50,0x8c,0x32,0x4f,0x86,
- 0x23,0x51,0x9f,0x25,0x50,0xa5,0x30,0x4c,0xb1,0x16,0x56,0x9c,0x30,0x4e,0xa4,0x18,
- 0x55,0xa8,0x30,0x4f,0x9f,0x26,0x50,0xb3,0x26,0x52,0xa1,0x1a,0x54,0xb5,0x1a,0x56,
- 0xa3,0x28,0x51,0xad,0x1a,0x55,0xaf,0x26,0x54,0x9b,0x9,0x5b,0xad,0x25,0x55,0x96,
- 0x31,0x51,0x9b,0x28,0x53,0xa2,0x29,0x53,0xa8,0x29,0x54,0xa3,0x38,0x53,0x83,0x1e,
- 0x57,0xab,0x34,0x53,0x96,0x2a,0x55,0xa4,0x31,0x55,0x91,0x1e,0x59,0xa6,0x1e,0x5a,
- 0xa0,0x2c,0x55,0xab,0x3c,0x56,0x75,0x1e,0x5b,0x9c,0x2c,0x56,0xa5,0x2a,0x58,0x9a,
- 0x22,0x58,0xb3,0x32,0x58,0x84,0x22,0x59,0xad,0x3c,0x55,0x8d,0x2c,0x58,0xa0,0x30,
- 0x55,0xb2,0x2e,0x57,0xa6,0x2a,0x5a,0x95,0x22,0x5b,0xa8,0x32,0x59,0x8f,0x46,0x55,
- 0x7d,0x3a,0x54,0xac,0x47,0x53,0x9a,0x3c,0x59,0x7f,0x2e,0x5b,0x9d,0x32,0x59,0xaf,
- 0x3a,0x58,0xa3,0x2b,0x5a,0xbe,0x3a,0x59,0x9c,0x41,0x59,0x89,0x46,0x55,0xa6,0x38,
- 0x5b,0x98,0x26,0x60,0xa7,0x33,0x5d,0xa5,0x2a,0x60,0xaf,0x2c,0x5f,0xb4,0x39,0x5c,
- 0xba,0x30,0x63,0xa1,0x37,0x62,0xa5,0x40,0x61,0x9f,0x3e,0x60,0xb0,0x32,0x63,0xb8,
- 0x40,0x63,0x90,0x40,0x62,0x9a,0x48,0x62,0x83,0x46,0x63,0x89,0x44,0x61,0xa5,0x49,
- 0x62,0x92,0x50,0x61,0x94,0x40,0x66,0xb0,0x37,0x69,0xb2,0x53,0x63,0x9e,0x3a,0x6a,
- 0xb9,0x50,0x6d,0x85,0x52,0x6e,0x9d,0x58,0x71,0x99,0x58,0x73,0x94,0x54,0x72,0xab,
- 0x5e,0x71,0xa6,0x65,0x7c,0x95,0x61,0x7b,0xac,0x63,0x7d,0xa5,0x6b,0x7a,0xad,0x64,
- 0x7f,0xa1,0x60,0x80,0xbf,0x68,0x7d,0xd4,0x78,0x86,0xbb,0x6f,0x89,0xb9,0x71,0x8a,
- 0xb3,0x73,0x8b,0xae,0x75,0x8d,0xa8,0x82,0x8f,0xc1,0x82,0x95,0xc5,0x7c,0x99,0xb8,
- 0x7c,0x99,0xc4,0x78,0x99,0xd9,0x7c,0x99,0xce,0x88,0x98,0xba,0x8c,0xa7,0xb8,0x8e,
- 0xa4,0xd2,0x8e,0xa6,0xc7,0x9c,0xa5,0xc9,0x96,0xb2,0xe4,0x9a,0xb3,0xcf,0xa4,0xb1,
- 0xd0,0x94,0xb5,0xda,0x9f,0xb4,0xdb,0xa5,0xb3,0xe0,0xa4,0xb4,0xf0,0xa5,0xbf,0xf3,
- 0xb0,0xc1,0xd4,0xb1,0xbf,0xeb,0xb7,0xbe,0xed,0xab,0xc3,0xeb,0xad,0xc4,0xe1,0xb9,
- 0xc7,0xd4,0xb6,0xcd,0xf6,0xbb,0xd0,0xf0,0xc0,0xce,0xfd,0xb8,0xd7,0xed,0xcd,0xd3,
- 0xeb,0xc3,0xd6,0xf0,0xbf,0xd8,0xff,0xc5,0xde,0xfd,0xcd,0xdc,0xfe,0xb7,0xe3,0xff,
- 0xd4,0xe4,0xfe,0xdd,0xe5,0xeb,0xd1,0xeb,0xff,0xdd,0xea,0xff,0xf1,0xed,0xe4,0xcb,
- 0xf6,0xfe,0xf0,0xec,0xff,0xe4,0xf0,0xfe,0xdd,0xf3,0xff,0xeb,0xef,0xff,0xf1,0xef,
- 0xf7,0xe6,0xf3,0xf4,0xf0,0xf2,0xef,0xed,0xf4,0xe9,0xe9,0xf5,0xef,0xf8,0xf1,0xf0,
- 0xf1,0xf5,0xe4,0xef,0xf4,0xf7,0xed,0xf5,0xfe,0xe7,0xf8,0xff,0xff,0xf1,0xfe,0xf5,
- 0xf5,0xff,0xe2,0xfb,0xff,0xfb,0xf4,0xff,0xdf,0xfd,0xfa,0xdb,0xfe,0xff,0xf9,0xf8,
- 0xee,0xf0,0xf9,0xff,0xf9,0xf7,0xfb,0xff,0xf7,0xf0,0xee,0xfb,0xfc,0xf7,0xf9,0xf6,
- 0xff,0xf6,0xfd,0xed,0xfd,0xf0,0xfe,0xf8,0xf6,0xf5,0xfa,0xfd,0xff,0xfa,0xea,0xec,
- 0xff,0xf8,0xea,0xff,0xfe,0xfa,0xfe,0xe6,0xf4,0xfe,0xf9,0xf9,0xfe,0xed,0xfd,0xfb,
- 0xff,0xf7,0xfe,0xf3,0xf1,0xff,0xff,0xff,0xfc,0xfa,0xf9,0xfe,0xff,0xfc,0xfe,0xfb,
- 0xff,0xfe,0xf5,0xff,0xfd,0xff,0xfe,0xff,0xfc,0xff,0xff,0xff,0x21,0xfe,0x11,0x43,
- 0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,
- 0x0,0x21,0xf9,0x4,0x1,0xa,0x0,0xff,0x0,0x2c,0x0,0x0,0x0,0x0,0xab,0x0,
- 0xb7,0x0,0x0,0x8,0xfe,0x0,0xbb,0x78,0x19,0xe8,0x25,0x48,0x97,0x2e,0x63,0xbe,
- 0x28,0x5c,0xc8,0xb0,0xe1,0x98,0x87,0x10,0x23,0x4a,0x9c,0x48,0xb1,0xa2,0x45,0x88,
- 0xd,0x33,0x6a,0xdc,0xc8,0xb1,0x21,0x93,0x8f,0x20,0x43,0x8a,0x64,0x42,0xa4,0xa4,
- 0xc9,0x92,0x39,0x52,0xaa,0x74,0xc1,0xd2,0xc5,0x8c,0x15,0x33,0x5e,0xae,0xe0,0x40,
- 0xb3,0xa6,0x4d,0xf,0x1e,0x32,0xe8,0xd4,0xe9,0x80,0x81,0xc0,0x81,0x41,0xbe,0x1c,
- 0x4c,0xd8,0x91,0xe1,0xc5,0xa3,0x48,0x93,0x5e,0x2c,0xca,0x94,0xe3,0xc8,0xa7,0x20,
- 0x4f,0x9e,0x1c,0x32,0x44,0x65,0xe,0x96,0x29,0x63,0x6a,0x9d,0x61,0xb3,0x2b,0x4d,
- 0x9c,0x3b,0x4b,0x58,0x80,0x40,0x30,0x4a,0xd0,0x83,0x4d,0x17,0x2a,0x5d,0xcb,0xf6,
- 0x68,0xda,0xb7,0xb,0xa1,0x42,0x95,0x6a,0x92,0x6a,0xd5,0x94,0x58,0x73,0xe8,0x98,
- 0xa1,0x63,0xef,0xc,0x13,0x26,0xbc,0xde,0x4,0x6b,0x1,0x84,0x87,0xb2,0x6,0xd1,
- 0xbe,0x6d,0xcb,0xb8,0xf1,0x43,0xb8,0x70,0xe5,0x3e,0xa5,0x5b,0xf2,0x88,0x5d,0xab,
- 0x29,0xfb,0x6a,0xfe,0xb,0x58,0x70,0x4d,0x9c,0x1e,0x20,0x80,0xc8,0x50,0xf6,0x8b,
- 0x15,0x2e,0x59,0xe0,0x3a,0x5e,0x4d,0x51,0x8d,0xeb,0xd7,0xae,0x21,0xbf,0x95,0x3c,
- 0x92,0x32,0x91,0x23,0x96,0xa9,0x62,0xd6,0xac,0x19,0x70,0x67,0xcf,0x1c,0x70,0x1a,
- 0x26,0x3d,0x30,0x8a,0xe9,0x2c,0xa9,0x17,0xb3,0x5e,0xfe,0x10,0x36,0x6c,0xd9,0x69,
- 0x69,0x8b,0xb4,0x8d,0x3b,0xf7,0x6e,0xde,0x3a,0x7c,0x7,0x6,0x2e,0xbc,0x4,0x87,
- 0x33,0x67,0xbc,0xfe,0x3c,0xb4,0x92,0xc5,0xca,0x46,0xe6,0xe8,0xd3,0x4b,0x3c,0x4f,
- 0x71,0x63,0x6d,0x22,0x50,0xed,0x5e,0x56,0x89,0x3d,0xbb,0x76,0xee,0xa0,0x3f,0x84,
- 0xf,0xf3,0xd8,0x8a,0x7f,0x8d,0xea,0x5,0x88,0x1e,0x7b,0x13,0x6d,0xd4,0x45,0x6d,
- 0xf1,0xc9,0x77,0x57,0x66,0xd8,0x69,0xb7,0x9d,0x60,0xa0,0x79,0xf0,0x81,0x17,0xfc,
- 0x99,0xe6,0xdf,0x7f,0x19,0x9,0xa8,0xe1,0x6a,0x4,0xae,0xa7,0xd1,0x41,0xd2,0x7d,
- 0xa4,0xe0,0x82,0x7a,0x35,0xe8,0xa0,0x67,0x11,0x76,0xf0,0x98,0x85,0xfe,0x6d,0xe8,
- 0xe2,0x80,0x0,0xb6,0xf7,0x21,0x88,0xd2,0x8d,0x68,0x55,0x7d,0x36,0x38,0xf8,0xe0,
- 0x60,0x1d,0xf4,0xa8,0x10,0x86,0xa,0xbd,0x28,0x24,0x87,0x31,0x16,0x38,0x23,0x8d,
- 0x92,0xd9,0x48,0x1f,0x76,0x36,0x34,0x79,0x62,0x57,0x1e,0x74,0xf0,0xc1,0x7,0x19,
- 0x5c,0x68,0x9e,0x15,0x43,0x66,0xd9,0x58,0x87,0x11,0x19,0x78,0x10,0x92,0x9,0xca,
- 0x77,0x23,0x93,0x4d,0xe6,0xe8,0x9b,0x57,0x51,0x4e,0x99,0x41,0x79,0x17,0x8e,0xc1,
- 0x9f,0x73,0xaf,0x69,0x29,0xa7,0x87,0x19,0xca,0x98,0xd1,0x97,0x5f,0x26,0xa9,0xe0,
- 0x98,0xbc,0x95,0x69,0xe6,0x6f,0x37,0x7d,0xc0,0x2,0xb,0x55,0x5a,0x9,0x11,0x9c,
- 0xae,0x31,0x67,0xe5,0x85,0xb0,0x85,0xe1,0xe8,0xa3,0x88,0x46,0x3a,0x86,0xa1,0x10,
- 0x61,0xe9,0x5c,0x45,0x5c,0x62,0xa4,0x11,0x41,0x78,0xca,0xb5,0xe7,0x8d,0x7a,0x69,
- 0x85,0x5d,0x4c,0x3b,0x7e,0x35,0x25,0x95,0x6d,0x3a,0x16,0x29,0xa2,0x65,0xc0,0x61,
- 0x86,0x19,0xfe,0x65,0xc4,0x2a,0xc7,0xa3,0x61,0xb0,0x61,0x6b,0x1c,0xb6,0x82,0xa7,
- 0xeb,0xae,0xbc,0x86,0xd1,0x2a,0x1c,0xc0,0xc6,0x5a,0xc6,0x6b,0xb4,0x86,0xa1,0xc6,
- 0x5a,0x6f,0x45,0x31,0x50,0x13,0x5e,0x1c,0x84,0xdc,0xb3,0x59,0x7c,0x54,0x59,0x75,
- 0x47,0x34,0x61,0xad,0xb5,0x96,0x59,0x15,0xd3,0xa,0xdc,0x76,0xeb,0x6d,0x4d,0xa7,
- 0x96,0xc0,0xdc,0xaa,0x70,0xc6,0xa,0xab,0xb0,0xb3,0x3e,0x6a,0xeb,0xba,0x67,0x14,
- 0xeb,0xee,0xa3,0x72,0x58,0x1,0xac,0x19,0xc1,0x96,0xe1,0x9f,0x6b,0xb4,0x1e,0xab,
- 0x54,0xb2,0xcb,0x36,0xdb,0x5,0xb4,0xc8,0x49,0xb,0x1f,0x13,0xd4,0x5e,0xdb,0x44,
- 0x6e,0x43,0xdc,0x70,0x43,0x4b,0x2d,0x79,0xcb,0xad,0x60,0xe3,0x92,0x2b,0xb1,0x1a,
- 0x72,0x54,0x6c,0xb1,0xc5,0x70,0xac,0xa1,0xf1,0xc6,0x1c,0x73,0x4c,0xaf,0x7f,0x70,
- 0xc8,0x6b,0x85,0xbd,0x58,0x12,0xd9,0x94,0xb2,0x9c,0xfe,0xb,0x2d,0x48,0x54,0x95,
- 0x24,0x5,0x11,0x52,0x8c,0x94,0xc4,0xcc,0xa,0x33,0xcc,0x92,0xc3,0x33,0x79,0x15,
- 0xf1,0xc4,0xae,0xf1,0x8a,0xe8,0x85,0x19,0x77,0x2c,0x34,0xc7,0x21,0xab,0xb1,0xe8,
- 0xd1,0x2d,0x22,0x9b,0x96,0xb2,0xcc,0xfa,0xfb,0xaf,0x48,0xb9,0x9d,0xf4,0x72,0xcc,
- 0x53,0x27,0x71,0x12,0x5e,0xd,0x3b,0xc,0xf1,0x72,0x3c,0xe3,0xeb,0x45,0x78,0xe0,
- 0x1d,0x2a,0x2f,0xb0,0x1a,0xc3,0x41,0x71,0x18,0xb3,0xa6,0x8d,0xf6,0xda,0x69,0xcb,
- 0xe1,0x1c,0xc8,0x70,0x0,0xc,0x7,0x5b,0xfc,0xa6,0x8c,0x64,0x75,0x2d,0x4b,0x65,
- 0xf5,0xfe,0xde,0x52,0xad,0x74,0xb3,0xd6,0x3a,0x73,0xdd,0x75,0x18,0x5f,0x83,0x27,
- 0x9e,0x14,0x63,0x18,0xd,0x6c,0xc6,0xc0,0x3a,0xda,0xee,0xe3,0x61,0x40,0xe,0x39,
- 0xad,0x15,0x1b,0x3d,0x36,0xb4,0x73,0x2b,0x9d,0x56,0x10,0x76,0x1f,0xc8,0xc4,0xc1,
- 0xb8,0xd9,0x30,0xc4,0x11,0x52,0x94,0x6e,0xfa,0xcc,0x49,0x48,0x81,0xfa,0xd,0x39,
- 0x24,0xe1,0xb7,0x4c,0xdd,0x6e,0xcd,0x5a,0xd7,0x14,0xeb,0x7a,0xec,0xed,0x6f,0xab,
- 0x21,0xac,0xee,0xbc,0xf,0xeb,0x7b,0xef,0x91,0x53,0xee,0xf6,0x78,0x63,0x87,0xac,
- 0x39,0x74,0x2,0x61,0xb,0x5,0x14,0x7e,0xe2,0x36,0xa2,0x6e,0x39,0x2c,0xe8,0x3a,
- 0x5e,0xdb,0xc6,0x1e,0xf8,0xec,0xb4,0xc3,0x76,0xb1,0xc5,0x94,0xb,0xeb,0xfd,0xf7,
- 0xde,0xbf,0xeb,0x76,0xc9,0x94,0xee,0xb,0x9d,0x42,0xcb,0x36,0xb1,0x3c,0xf3,0x7e,
- 0x5e,0xd1,0x24,0xf3,0x43,0xbc,0xef,0xa7,0xd,0x3a,0x4c,0x7f,0x55,0xf5,0xf,0x5f,
- 0x9f,0x54,0xf6,0xac,0xc2,0x21,0x8,0xb0,0x56,0xa0,0x3,0x21,0xe8,0x50,0x8,0x37,
- 0xb8,0x61,0x5d,0x71,0xe0,0x81,0xaf,0xe8,0xc0,0xc0,0x58,0x5,0x90,0xe,0x8b,0x4a,
- 0x97,0xbb,0xa,0xc1,0xc0,0x2b,0x95,0x21,0x5e,0xcb,0xd9,0x88,0x7f,0xe,0x12,0x4,
- 0xce,0x79,0xc1,0x5a,0x4,0x39,0x82,0xe,0x6c,0x70,0x85,0x2a,0x5c,0xe1,0x84,0x36,
- 0xa0,0x49,0x1c,0x52,0x68,0x82,0x32,0x5d,0x21,0x7,0x52,0x60,0x49,0xe9,0xb8,0x55,
- 0x3d,0xd9,0xed,0x8f,0x7f,0xce,0x29,0xc3,0x13,0x9e,0x20,0x88,0x1e,0x6e,0x30,0x8,
- 0xfe,0x6e,0x28,0x4,0x1b,0x6c,0x0,0x84,0x2b,0xb0,0x61,0xf,0x95,0x1b,0x3,0x88,
- 0x2c,0xa6,0xc4,0x2f,0xc9,0xc1,0x7b,0xc,0x84,0xa0,0x15,0xe4,0xa0,0x85,0x2a,0x76,
- 0x50,0x5f,0x26,0x6b,0xc8,0x6,0xbb,0xd0,0x41,0x82,0x84,0x27,0x7,0x47,0x90,0x83,
- 0x14,0x36,0x80,0xc2,0xf7,0x7d,0x6d,0x42,0x50,0xc8,0x80,0x7,0xae,0x10,0x87,0x12,
- 0xd4,0xf,0x2b,0x2e,0xf8,0xc0,0x11,0x6a,0xa8,0x3f,0xa4,0xe0,0x30,0x87,0x82,0x48,
- 0xc3,0x13,0xcc,0xd0,0xc3,0x28,0x76,0x1,0x8c,0x67,0xd8,0x3,0x1b,0xae,0xa0,0x3,
- 0x2f,0xec,0xa1,0x10,0x88,0xdc,0xc3,0x19,0x98,0x15,0x48,0x44,0x16,0x42,0x11,0x59,
- 0xd0,0x98,0x1e,0xf4,0x40,0x2f,0x38,0x8,0x90,0xe,0x61,0xe8,0xa0,0x16,0x8,0x81,
- 0x45,0xc7,0x68,0xd0,0x3c,0xb,0xe9,0xa0,0x1b,0xbc,0x10,0xb3,0x1b,0x84,0x80,0x8,
- 0x72,0x70,0x41,0xe,0x48,0x29,0x5,0x2e,0x70,0xa1,0x8,0xaf,0xbc,0x81,0x18,0x37,
- 0xe0,0x82,0x3d,0xac,0x80,0x96,0x78,0x59,0x81,0x5f,0xf2,0xd7,0x15,0xb6,0xdc,0x11,
- 0x36,0x65,0x10,0x84,0x19,0xf6,0xf8,0xaa,0x2c,0xd4,0x20,0xb,0x8b,0x23,0x49,0x17,
- 0xe0,0xe0,0x7,0x31,0xc8,0x40,0x6,0x13,0x90,0x81,0x11,0xc4,0xe0,0x87,0x6a,0x8a,
- 0xc1,0x8,0xd0,0xa4,0x80,0x12,0x7a,0x50,0x87,0x3a,0xcc,0x81,0xc,0x5b,0xd8,0x81,
- 0x1e,0x42,0xc6,0x40,0x2d,0x84,0x21,0xa,0x9d,0xdc,0x52,0x46,0x2e,0xc4,0x90,0xe,
- 0x9e,0x21,0x75,0x7c,0x18,0x44,0xdc,0x8e,0x99,0x5,0x23,0xa4,0x60,0x2,0x18,0xfe,
- 0xa0,0x81,0xf,0xf4,0x89,0x81,0x9,0x4c,0xc0,0x8,0x59,0xe0,0x82,0xea,0xae,0xa2,
- 0xca,0x1c,0x68,0x85,0x97,0x36,0xf1,0xe5,0x2f,0x5d,0x53,0x6,0x21,0x94,0x81,0xe,
- 0x65,0xc8,0x82,0x19,0x26,0xb9,0x86,0x40,0x4,0x62,0x9,0x2d,0x68,0xc1,0x1b,0x22,
- 0xa1,0x9,0x54,0xd4,0x62,0x18,0xcf,0xa0,0xc6,0x37,0xa8,0x21,0xf,0x79,0x88,0x83,
- 0x1a,0xcf,0x48,0xc6,0x30,0x86,0xb1,0x8a,0x53,0x64,0x22,0xf,0x48,0x40,0x2,0x37,
- 0x95,0xb0,0x6,0x44,0xc0,0xa1,0x6,0x44,0xa0,0x83,0x25,0x4a,0x96,0xc5,0x85,0x58,
- 0x29,0x94,0x6,0x91,0x3,0x1f,0x6a,0x90,0x2,0x23,0x90,0x81,0xc,0x4b,0xb8,0x0,
- 0xa,0x22,0xa1,0x8a,0x5e,0x28,0x83,0x19,0xf8,0x98,0xc6,0x33,0x98,0x91,0xb,0x4c,
- 0x5c,0x80,0x2,0x2,0x2d,0xdd,0x7,0x5c,0xd0,0x84,0x5d,0xe6,0xac,0x97,0x6b,0x59,
- 0xa8,0x6b,0xe4,0xe0,0x6,0x47,0x95,0x61,0x10,0x7a,0x58,0xc3,0x36,0x51,0x80,0x84,
- 0x47,0x98,0xe2,0x16,0xc9,0xf8,0x6,0x3e,0xf4,0x41,0x57,0x7c,0xd8,0xf5,0x1d,0x78,
- 0xb5,0xeb,0x5d,0xe5,0x6a,0xd7,0x6f,0x24,0x43,0x16,0x9f,0x60,0x44,0xf,0x7a,0x40,
- 0x86,0x35,0xc8,0xf3,0xb,0x4c,0x60,0x8e,0x46,0x16,0xa5,0x90,0xa0,0xa8,0x41,0x5,
- 0x45,0xa8,0xa8,0x12,0x48,0x0,0x86,0x4c,0xd4,0x82,0x1a,0x76,0xf5,0xc6,0x3b,0xf4,
- 0x11,0x8e,0x77,0x54,0xe3,0x19,0x76,0x1d,0x6,0x26,0x44,0xf0,0x1,0x29,0x0,0x22,
- 0x8e,0x2f,0xa1,0x23,0x58,0x95,0x22,0x56,0x35,0xd4,0xa,0xb,0x7b,0x50,0xfe,0x4,
- 0x21,0x88,0xba,0x4,0x4c,0xb0,0x22,0x19,0xf2,0xd0,0xab,0x3e,0xba,0x81,0xe,0x74,
- 0xd8,0xe3,0xb7,0xbd,0xfd,0xad,0x70,0xfd,0x41,0xdc,0x73,0x6c,0x56,0x1f,0x76,0x35,
- 0xa9,0x30,0x5c,0xd1,0x88,0xa2,0xe,0x62,0x10,0x3c,0xed,0xe9,0x8f,0x7e,0xba,0x10,
- 0x39,0x30,0x73,0xd,0x24,0xe8,0x81,0x2b,0x9c,0x61,0xd7,0x73,0x78,0x83,0xb7,0xee,
- 0x8,0x6f,0x3e,0xf4,0x81,0xd7,0x73,0xe0,0x43,0x1e,0xa2,0x18,0x63,0xe9,0x36,0x30,
- 0x25,0xd5,0x26,0x34,0xac,0xac,0xda,0x1d,0xc5,0xb6,0xf7,0x1a,0x39,0xec,0x41,0x3c,
- 0x70,0x48,0x41,0xb,0x4a,0x21,0xc,0xbd,0xaa,0xc3,0x1b,0xea,0x98,0x2b,0x71,0xc3,
- 0x1b,0x5e,0x7b,0x10,0xf8,0xc0,0xc4,0xa5,0x6b,0x79,0xbd,0xf1,0x8d,0x6f,0x88,0x43,
- 0x1e,0xe4,0x20,0x86,0x28,0xec,0x9,0xdd,0xc,0xae,0x13,0x94,0xa,0x71,0x96,0x11,
- 0x76,0xa0,0x1,0x30,0xc4,0x82,0xa4,0xd,0x9e,0xab,0x3e,0x8,0xec,0xf,0x7e,0xa4,
- 0x23,0x1d,0xc4,0x55,0xc7,0x35,0xbe,0x21,0x8f,0x56,0x88,0xa0,0x8,0x49,0xf8,0x80,
- 0xe,0xae,0x0,0x18,0x9c,0xe5,0xac,0x22,0xb4,0xfb,0x15,0xbd,0x2e,0xe8,0xa8,0x2,
- 0x46,0x81,0x82,0x1,0xbc,0x20,0x1f,0x68,0x60,0x87,0x55,0x4c,0x43,0x1f,0xe7,0x10,
- 0xae,0x3d,0xf4,0xe1,0xf,0x7a,0xd0,0x23,0xc0,0x78,0x55,0x32,0x3b,0xa6,0xfc,0xdb,
- 0x75,0xac,0x83,0xae,0x75,0xd5,0xab,0x49,0xa9,0x51,0xe,0x72,0x94,0xc3,0x15,0x84,
- 0x35,0x1b,0x9c,0xe8,0xf6,0xa1,0x30,0xb8,0x21,0x25,0x84,0x10,0x41,0xfe,0x23,0x90,
- 0x90,0x7,0x54,0x40,0xd5,0xb3,0xe8,0xc0,0x7,0x3d,0xc8,0xfb,0x5b,0x76,0x18,0x38,
- 0x1d,0xe6,0xe0,0x7,0x3f,0xe8,0xa1,0x8d,0x6,0xcb,0xc3,0x13,0x3e,0xb8,0x81,0xe,
- 0xe2,0x70,0x80,0x17,0x0,0xc1,0x6,0x2e,0x50,0x98,0xc2,0x56,0x50,0x2,0x71,0xb5,
- 0xa6,0x6b,0xad,0x7a,0x15,0x8f,0x1d,0xf5,0x81,0x1f,0x77,0x81,0x10,0x82,0xa8,0x1,
- 0x22,0x44,0x40,0x6,0x56,0x70,0xf7,0x1a,0xd8,0xe0,0x87,0x3b,0xd0,0x61,0x67,0x7b,
- 0xf8,0xe3,0x1e,0xf4,0x10,0xb1,0x3f,0xc,0x4c,0x65,0x7b,0xa0,0x23,0x1c,0x9d,0xed,
- 0x2b,0x33,0x7a,0x11,0xb,0x53,0x64,0x2,0x13,0x91,0xf8,0xc3,0x1f,0x1a,0xb1,0x9,
- 0x51,0x4,0x82,0x4,0x6b,0x10,0xf3,0xa5,0x8e,0xa7,0x16,0x20,0x82,0x31,0xc,0x44,
- 0xd0,0x83,0x1,0xf2,0x50,0x8b,0xb9,0x86,0xc3,0x1a,0x76,0x76,0x32,0x9d,0xed,0x31,
- 0xe5,0x6d,0xb8,0x43,0xcf,0x4d,0xee,0x2b,0x3e,0x90,0x81,0x4,0xd2,0x42,0xe0,0x5,
- 0x2f,0x68,0x52,0xa2,0x15,0xfd,0x81,0x46,0xe3,0x18,0xd2,0x92,0x2e,0x3,0xad,0xa,
- 0x41,0x8,0x22,0xa0,0xd5,0x8,0x81,0xd0,0x80,0x2b,0x70,0xfb,0x8d,0x6b,0x94,0x18,
- 0x1a,0xee,0xa0,0x76,0xa9,0x89,0xeb,0x6a,0xdf,0xfa,0xc3,0x1d,0xc4,0xbd,0x32,0x72,
- 0xf1,0x41,0xd,0x5c,0x98,0xe2,0xf,0xfb,0xa4,0x0,0x5,0x68,0xf0,0x86,0x66,0xfa,
- 0x21,0xb,0x45,0x18,0x4,0x1f,0xe2,0x29,0x29,0x62,0x7,0xc9,0xb,0xd5,0xa,0xc3,
- 0xd,0xe0,0x40,0x2,0x46,0xc,0x43,0xae,0xef,0xf0,0xad,0x81,0xfe,0x4b,0xbc,0x8f,
- 0x3a,0xb3,0x3,0x1d,0xd7,0xe6,0xc7,0x3a,0xb0,0xd1,0x8d,0x73,0xa8,0x43,0xa4,0xf2,
- 0x70,0x85,0x8,0xf6,0x50,0x82,0x29,0x34,0x69,0x6,0x2c,0x21,0xb7,0xb9,0x1f,0xcd,
- 0xb3,0x5f,0xc5,0xca,0xcc,0x3d,0xb6,0xc2,0x20,0xc4,0x30,0x87,0x1e,0xfc,0x41,0x18,
- 0x25,0xb5,0x2b,0x3d,0xb2,0x71,0x8f,0x7f,0x2b,0xf9,0xe9,0xbf,0x5,0xb8,0x3f,0xf0,
- 0x11,0x60,0x6a,0x0,0xe3,0x13,0x60,0x50,0x82,0x1e,0xc4,0x20,0x6,0x2e,0x4c,0x9c,
- 0xf,0xc3,0xab,0xd8,0x7,0x1d,0x95,0x3,0xb7,0x8d,0xd9,0xe2,0x5f,0x18,0x43,0x13,
- 0x72,0xe0,0x86,0x2f,0x14,0x41,0xc,0x91,0x40,0x6,0xd5,0xcf,0xc1,0x64,0x7f,0xa0,
- 0x63,0x1b,0xd8,0xce,0x77,0xd4,0xb7,0x41,0x5c,0x7f,0x60,0x59,0x1d,0xf2,0x70,0x46,
- 0x29,0xde,0xf0,0x0,0x2f,0x44,0xc0,0x7d,0x3a,0x68,0xc9,0xd,0xb8,0x55,0x6e,0x47,
- 0x4f,0x24,0x7b,0x3f,0x37,0xb3,0x1,0xc3,0xc0,0x4,0x4a,0x90,0xa1,0xe,0x60,0x30,
- 0x5,0x66,0xa9,0xae,0xe,0x27,0xdf,0xe3,0x1e,0xda,0xd0,0x7,0xd4,0x9f,0x8e,0xe,
- 0xe4,0x9a,0xb4,0x16,0x8f,0x40,0xc1,0x1c,0x10,0x41,0x7,0x15,0x54,0x4c,0x89,0x1f,
- 0x4,0x61,0xe1,0x78,0x50,0x88,0x45,0xb8,0xc1,0xec,0xc3,0x36,0x5f,0x43,0xc2,0x60,
- 0x2,0x36,0x9c,0x81,0x8,0x46,0x78,0xc3,0x2f,0xf0,0xf1,0xc,0xba,0xaf,0x1a,0x1b,
- 0xd8,0x58,0x87,0x9e,0xd3,0xa1,0xf7,0x91,0xfb,0xe3,0x1d,0xc6,0x7d,0xc7,0x33,0x90,
- 0x91,0x89,0x16,0x50,0xa0,0x8,0x63,0x58,0xc1,0x22,0x3e,0xfe,0x90,0x92,0x9a,0x31,
- 0xba,0xd1,0x3b,0x7f,0x7c,0x8e,0x2b,0x26,0x79,0x2d,0x4,0x73,0xd,0x3d,0x68,0x3,
- 0x2e,0xe6,0xba,0x59,0xcf,0xd7,0xa3,0x1e,0xa8,0x16,0xfd,0xd3,0xd9,0xe1,0x8e,0x6d,
- 0x6c,0x63,0xc9,0xf8,0x60,0xc6,0x2d,0x70,0xd0,0x83,0x39,0xac,0xa1,0x6,0x2a,0x70,
- 0x69,0xb7,0x67,0x40,0x4,0x58,0x56,0x3d,0x26,0x79,0x68,0x83,0x28,0x64,0xb6,0x7b,
- 0x3c,0x40,0x4a,0x62,0x40,0x3,0xc3,0xb7,0x59,0xae,0xb6,0xd,0x56,0x46,0x5c,0xcb,
- 0xd7,0x7c,0x9b,0xf5,0xe,0x0,0xf6,0xd,0xc2,0x0,0xa,0x6,0x40,0x1,0x46,0x0,
- 0x7,0x44,0x30,0x4,0x53,0x82,0x6c,0x26,0xe1,0x2,0x2b,0x0,0x2,0x20,0x0,0x7e,
- 0xe7,0xd6,0x35,0x12,0x14,0x6,0x10,0x65,0x6,0x87,0xa0,0x1,0x98,0x90,0xc,0xf8,
- 0x50,0xd,0xa2,0xa7,0x7c,0xfc,0xf0,0x79,0xa8,0xe6,0x77,0xf2,0xa7,0x64,0x27,0xb6,
- 0x64,0xcf,0x80,0xb,0x9e,0x30,0x1,0x83,0x0,0x41,0xbe,0x52,0x6,0xb0,0x62,0x5,
- 0x66,0xc0,0x40,0x82,0xd0,0x40,0xae,0xc2,0x47,0x52,0x8,0x7,0xc3,0x72,0x76,0xba,
- 0xc7,0x10,0xb5,0x92,0x3,0x4c,0xf0,0x6,0xa0,0x30,0x57,0xd6,0x60,0x60,0x52,0x57,
- 0x81,0x7a,0x56,0x60,0x79,0x35,0xd,0x54,0x7,0xc,0x91,0x50,0x0,0x13,0x0,0x9,
- 0xb1,0xa4,0x6,0x1f,0x50,0x8,0x41,0xa0,0x2,0x44,0x50,0x4,0x44,0xb0,0x30,0x25,
- 0x30,0x2,0x23,0xc0,0x82,0x3c,0x37,0x31,0xea,0x86,0x36,0x15,0xa3,0x84,0xd8,0x55,
- 0xa,0xdc,0x75,0xe,0xe8,0xe0,0xf,0xe9,0xc0,0xf,0xfe,0xe6,0x90,0x67,0xfc,0xd0,
- 0x64,0x73,0x86,0x65,0xc2,0x25,0x75,0xfa,0xf0,0xc,0xa6,0xb0,0x4,0x45,0x70,0x6,
- 0x46,0xc4,0x6,0x8e,0x42,0x7,0xaf,0x92,0x47,0xaf,0xb2,0x43,0xaf,0x92,0x6,0x87,
- 0xa0,0x31,0x3b,0x90,0x6,0x69,0xa0,0x7,0x55,0x98,0x7b,0x49,0x1,0x20,0x8a,0x54,
- 0x4,0x2d,0x40,0xd,0x38,0x8,0x86,0xe1,0xb5,0xe,0xc4,0x45,0xf,0xfe,0x50,0x72,
- 0x79,0x75,0x5e,0xe2,0x80,0x7a,0x15,0xd0,0x2,0x7e,0xc0,0x5,0x2c,0x70,0x3,0x6e,
- 0x70,0x4,0x2e,0xe0,0x5,0xf,0x10,0x4,0x44,0x50,0x3,0x35,0x40,0x87,0x33,0x70,
- 0x87,0x79,0x18,0x7e,0x12,0x91,0x63,0x61,0x60,0x9,0xa6,0x41,0x8,0x4f,0x90,0x6,
- 0x24,0xc0,0xa,0x98,0xa5,0x59,0x29,0xc7,0x7c,0x52,0xe7,0x83,0x4d,0xd6,0x77,0xfb,
- 0xe0,0xe,0xeb,0x60,0x57,0xbc,0x90,0x7,0x2d,0x20,0x6,0x61,0x10,0x7,0x55,0xb0,
- 0x8e,0x98,0x8,0x88,0x6b,0x60,0x6,0x6b,0x90,0x6,0xf1,0x48,0x8a,0xf4,0x98,0x6,
- 0x73,0x70,0x8f,0xc1,0x46,0x3b,0xe7,0xa6,0x29,0x63,0xe0,0x5,0x5f,0x60,0x4,0xb4,
- 0x80,0xf,0xde,0x80,0x72,0x7,0x6,0x70,0x4e,0x46,0xf,0xfb,0x30,0x70,0xf2,0x40,
- 0xd,0xab,0xf0,0x3,0xfc,0xa7,0x4,0x35,0x20,0x5,0x65,0xc2,0x3,0x65,0x92,0x3,
- 0x41,0x20,0x4,0xc8,0x88,0x53,0xcb,0x88,0x87,0x7a,0x28,0x7e,0x3d,0x27,0x7,0x2,
- 0x4,0x7,0x3b,0x40,0x6,0x3d,0xe0,0x69,0xf2,0xe0,0xd,0xde,0x50,0x62,0x87,0x58,
- 0x60,0xbf,0x85,0x65,0x4e,0x96,0xd,0x4d,0x66,0xfe,0x65,0xfa,0x20,0xf,0xb2,0x80,
- 0x3,0x38,0xd0,0x8,0x82,0x50,0x2b,0x6c,0x50,0x5,0xb6,0xe2,0x2b,0xf3,0x12,0x85,
- 0xaf,0xf2,0x2a,0x43,0x43,0x2f,0xfa,0xf8,0x68,0xfc,0x48,0x4,0x70,0x50,0x7,0x50,
- 0xd5,0xd,0x86,0xc8,0x8d,0xe1,0xc5,0x88,0xf4,0xd0,0xd,0xde,0x80,0xf,0xc9,0xc0,
- 0xa,0x6d,0x50,0x1,0x3d,0xa0,0x4,0x5b,0x10,0x2d,0x3c,0x0,0x6e,0x36,0x40,0x91,
- 0x4d,0x62,0x91,0xc7,0x88,0x8c,0x44,0xb0,0x91,0xcd,0xe8,0x78,0xcf,0x8,0x69,0x56,
- 0xc0,0x4,0x70,0x80,0x8,0x64,0xd0,0x2,0xd8,0x98,0x59,0x4c,0x76,0x62,0xa2,0xf6,
- 0x74,0x74,0x45,0xf,0x3c,0xf8,0x64,0x91,0xc8,0xa,0x73,0xa0,0x4,0x87,0xb0,0x5,
- 0x35,0x20,0x40,0xe6,0xe4,0x28,0xc3,0x33,0x5f,0x95,0x3,0x27,0x8c,0x62,0x5,0xd9,
- 0xb3,0x8f,0x2b,0xf2,0x5,0x5c,0x60,0x4,0xac,0x40,0x75,0xca,0x77,0x62,0xee,0x60,
- 0x67,0x6,0x49,0x8b,0xfa,0xf0,0xd,0x9d,0x0,0x53,0x4a,0x90,0x2,0xcf,0xf2,0x39,
- 0x57,0xe0,0x95,0xf3,0x93,0x3,0x73,0x48,0x96,0x2e,0xc0,0x8c,0x1d,0x99,0x96,0x5d,
- 0x43,0x1e,0x5b,0x30,0x7,0x8c,0x10,0xa,0x98,0x35,0xd,0xe7,0x30,0x60,0xd8,0xc0,
- 0x8d,0x50,0x47,0x5c,0xd9,0xe0,0x64,0x7d,0x75,0xa,0x29,0x20,0x4,0x94,0x40,0x9,
- 0x35,0xf0,0x4,0xc0,0x19,0x2c,0xae,0xc5,0x2b,0xe0,0xe1,0x2e,0xc6,0x89,0x7b,0x13,
- 0xc3,0x98,0x44,0x91,0x5,0x7e,0xa0,0x1,0xcc,0x90,0x5b,0xf7,0x50,0xf,0x75,0xb9,
- 0x6f,0x9f,0x47,0xf,0xd7,0x80,0xf,0x97,0xfe,0x80,0x4,0x24,0xe0,0x7,0x1f,0xd1,
- 0x41,0x41,0xd0,0x4,0x3c,0xe0,0x3e,0x3c,0x10,0x3f,0x65,0xa2,0x3,0x37,0x30,0x87,
- 0x74,0x78,0x9a,0x1c,0xe9,0x8c,0x11,0x91,0x63,0x6d,0x79,0x79,0x99,0x20,0xe,0xf8,
- 0x40,0x77,0xfb,0xe0,0xf,0x2b,0x17,0x70,0xfc,0xa6,0x64,0xb3,0x38,0x67,0x66,0xf8,
- 0xa,0x60,0xf0,0x4,0x10,0x15,0x40,0xc2,0x84,0x4c,0xc4,0x19,0x39,0xc7,0x49,0x2b,
- 0xba,0x12,0x3c,0x8e,0x93,0x80,0x5d,0xc3,0x9c,0xa,0x91,0x5,0x34,0x80,0x9,0xb,
- 0xa9,0xf,0xd3,0x59,0x9d,0xbf,0x55,0x62,0xf7,0xc0,0xf,0xd8,0xe0,0xd,0xc0,0x80,
- 0x4,0x62,0x70,0x3,0x7b,0xc0,0x3,0x24,0x8a,0x2d,0x96,0x31,0x33,0x7a,0x51,0x26,
- 0x33,0x90,0x9e,0x45,0xb0,0x30,0x26,0x50,0x2,0x2f,0x90,0x9a,0xef,0x9,0x69,0x82,
- 0xb0,0x3,0x75,0xd0,0x6,0xce,0xf0,0xd,0xfa,0x50,0x88,0xe6,0x80,0x67,0x2,0xa7,
- 0xf,0xf4,0xb0,0x88,0x4a,0x26,0x8e,0xd9,0xa6,0xe,0xbf,0x0,0x6,0x21,0x28,0x8,
- 0xfe,0x1,0x41,0xee,0x66,0x39,0xdf,0x33,0x5f,0x14,0x63,0x98,0x17,0x3,0x2f,0x45,
- 0x29,0x7e,0x9a,0x92,0x5,0x1a,0x80,0xb,0xb9,0x45,0xf,0xf0,0x67,0xe,0xcd,0xf7,
- 0x5b,0xfc,0x50,0xf,0xdc,0xe0,0x77,0xdf,0x80,0x9,0x7e,0xb0,0x2,0x24,0x74,0x5,
- 0x3c,0x70,0x30,0xaa,0x63,0x12,0x29,0xa,0x4,0x40,0x80,0x73,0x8a,0x86,0x82,0xe0,
- 0xe7,0x9e,0x87,0x2,0x69,0xd5,0xd8,0x3,0xc8,0x20,0xf,0xfa,0x60,0xd,0x88,0x8,
- 0xd,0x26,0xe6,0x77,0xe6,0xf5,0x79,0xfe,0x42,0xa,0x86,0xb2,0xa8,0xf,0xd3,0xf0,
- 0xd,0x91,0x20,0x3,0x19,0x73,0x8,0x4f,0x90,0x5,0x4,0x74,0x6,0x50,0x70,0x7,
- 0xed,0xf2,0x44,0x66,0x40,0x8a,0x42,0x13,0x94,0x9a,0xea,0x3d,0x55,0x9a,0x96,0x57,
- 0xfa,0x7,0xcf,0x20,0x57,0x5c,0xfa,0x79,0xc2,0x55,0x6a,0x61,0x4a,0x9d,0x48,0x96,
- 0xb,0x13,0xb0,0x2,0x71,0xf0,0x2,0x26,0x34,0x4,0x49,0x50,0x4,0xb2,0x9a,0x8c,
- 0x49,0xa0,0x3,0x40,0x10,0x3,0xb8,0xba,0xa2,0x8a,0xb6,0x2,0x2f,0x2a,0xa3,0x77,
- 0xfa,0x1a,0xb1,0x12,0x29,0x70,0x10,0x6f,0xb7,0x40,0x9f,0x29,0x99,0xe,0xf0,0x0,
- 0xf,0x26,0x76,0x65,0x9b,0x75,0x9d,0xab,0x6,0x86,0xe9,0x90,0x90,0xf8,0x20,0xc,
- 0x14,0x30,0x9,0x72,0x70,0x8,0x73,0x90,0x6,0x66,0xa0,0x98,0x8a,0x44,0xa9,0x68,
- 0xa3,0x84,0x98,0x3a,0x94,0xef,0xa8,0xa9,0xb0,0x92,0x3d,0xd1,0xf5,0x10,0x95,0x83,
- 0x25,0xfe,0x21,0x6,0x9e,0xa0,0x57,0xed,0x0,0x7f,0xfc,0x0,0x75,0xfc,0x0,0xf,
- 0xf3,0x0,0xf,0x64,0xfa,0x6,0x52,0x0,0x4,0xe0,0x6,0x4,0x3a,0x20,0xab,0x46,
- 0x60,0x4,0xb2,0x2a,0x68,0x44,0x4,0xa7,0xe8,0xe9,0x7d,0xbc,0xa,0x7e,0x91,0xf2,
- 0x3d,0x21,0x43,0x1e,0xc0,0xc2,0x26,0x56,0xb0,0x5,0x48,0x10,0xa,0xdf,0x60,0x5c,
- 0x4c,0xa6,0x83,0x63,0xa8,0x77,0x7a,0xf6,0x83,0x6,0x96,0x67,0xc8,0x55,0xb,0x2d,
- 0xc0,0x7,0x44,0x0,0x8f,0xef,0x18,0x6c,0xc0,0xe2,0xa4,0xde,0x3,0x94,0x8b,0x93,
- 0xb2,0x8b,0x13,0xac,0x2e,0x68,0xfe,0x2c,0xc4,0x93,0x38,0x66,0xa6,0x5,0x10,0xc5,
- 0x4c,0x24,0x20,0xc,0x66,0x88,0xf,0x4c,0xf7,0x79,0xeb,0xa0,0x77,0x27,0x77,0x6d,
- 0xef,0xc7,0xf,0x9,0x59,0xb,0x22,0xe0,0x3e,0x57,0xe0,0x4,0x40,0xc0,0x5,0x7e,
- 0x20,0x2,0x65,0x70,0x3,0x2c,0xb0,0x2,0x65,0xd4,0x4,0x67,0xb0,0x1,0x21,0x50,
- 0xab,0xba,0x4,0x4,0x8,0x1b,0x5f,0xb1,0x92,0xb2,0x6,0xba,0x38,0x56,0xa0,0x4,
- 0x30,0x60,0xc,0xfa,0x80,0x83,0xfa,0x20,0x8b,0x25,0x26,0x6a,0x2c,0x99,0x60,0xd3,
- 0xa6,0xa1,0x53,0x27,0xb,0x60,0x0,0x7,0xf1,0x2,0x94,0xf0,0x8,0x8f,0x2b,0x7b,
- 0x41,0x4f,0x4,0x3e,0x76,0xcb,0xb2,0x3c,0x93,0x2e,0x93,0x72,0x28,0x8e,0xe2,0x6,
- 0x4c,0x30,0x8,0x6b,0xb0,0x5,0x8c,0xf0,0xc,0xc7,0x45,0xa8,0x56,0xf6,0x74,0xf9,
- 0xe0,0xf,0xf0,0x50,0xf,0xc9,0xea,0xf,0xe2,0x40,0x6,0x39,0x60,0x2,0x2f,0x70,
- 0x2,0x40,0xf0,0x62,0x44,0xf0,0x5,0x52,0x0,0x5,0x3a,0xc0,0x1,0x36,0x80,0x89,
- 0x4d,0xb0,0x1,0x30,0xf3,0x0,0x2c,0xd0,0x55,0x19,0x70,0xb5,0xe5,0x22,0x2c,0x0,
- 0x4,0x32,0xf6,0xf2,0x50,0x6a,0x90,0x2,0x99,0x40,0x5e,0x74,0xa7,0xf,0xd8,0x60,
- 0x81,0xff,0xd6,0x7c,0x68,0xfb,0xe,0x19,0xba,0x83,0xa9,0xf6,0xa1,0xac,0xf7,0x2b,
- 0x51,0xe8,0x2a,0x29,0xeb,0x3b,0x77,0x3b,0xbc,0xb4,0xa3,0xb7,0x3c,0xe5,0x5a,0xe7,
- 0x24,0x2f,0x7a,0x90,0x2,0x91,0x79,0xa1,0x88,0xb8,0xe,0xa3,0x47,0xa4,0x8a,0xb,
- 0xf,0xd8,0xa0,0xe,0xac,0xfe,0x20,0x2,0x5e,0xf0,0x2,0x23,0x70,0x7,0x1d,0x70,
- 0x3,0x63,0x40,0x4,0x1f,0x30,0x3,0x5e,0x80,0x5,0x3c,0xc0,0x12,0x44,0xf0,0x4a,
- 0xae,0x24,0x5,0x1f,0x10,0x1,0x6d,0xd4,0x68,0x9,0x8b,0xba,0xf5,0xd2,0x40,0x2,
- 0xd4,0xba,0xc0,0xa0,0xf,0xde,0xa0,0x60,0xf8,0xd9,0x77,0x5f,0x7a,0xbb,0xb9,0xcb,
- 0xf,0xda,0x40,0x70,0x28,0x80,0x8,0x23,0x3,0xbf,0x2a,0x4b,0x85,0xc3,0x7b,0xc0,
- 0xc5,0xeb,0x28,0xcf,0xe8,0x28,0x41,0x40,0x8d,0xbf,0x36,0xc,0xfa,0xc0,0xb8,0x63,
- 0x58,0x67,0x4a,0x96,0xb8,0x53,0xf7,0xe,0x7a,0x66,0xf,0xef,0x20,0xe,0x3d,0x60,
- 0x89,0x32,0x36,0x42,0x61,0xe0,0x2,0x67,0x90,0x42,0x1c,0x90,0x3,0x7,0x51,0x3,
- 0x5b,0x60,0x4,0xfe,0xf4,0x0,0x80,0x0,0x5,0x1c,0xd0,0xab,0x9,0x6b,0xc0,0xdf,
- 0x23,0xbf,0x84,0x20,0x7,0x3b,0x40,0xd,0xb0,0x86,0xbf,0xb3,0x5b,0xbb,0xfc,0xe9,
- 0x83,0xb8,0x6b,0x6a,0x79,0x46,0xf,0x53,0x89,0x9,0x4a,0x90,0x5,0x74,0xbb,0x3d,
- 0x27,0x3b,0xb7,0x7,0xcc,0xa9,0x2d,0x9b,0x4e,0xae,0x65,0x10,0x82,0xa0,0x56,0x98,
- 0xf0,0xd,0xb0,0xa8,0x64,0xc1,0x55,0x8b,0xe6,0x90,0xd,0xff,0x8b,0xf,0xa1,0x76,
- 0x72,0xf8,0x70,0xa,0x22,0x10,0x7,0x39,0xb0,0x1,0xfa,0xa,0x46,0x1c,0x80,0x5,
- 0x67,0x30,0x4,0x48,0x29,0x6,0x14,0x90,0x51,0x9b,0xa0,0xb,0x7e,0x10,0x2,0x13,
- 0x2,0xc3,0xa7,0x2b,0xc3,0xb2,0x2,0x92,0x20,0x19,0x45,0x81,0xf0,0xd,0x9b,0xd5,
- 0xd,0x63,0x4b,0xb6,0xfe,0x3c,0xfc,0x88,0x3e,0x88,0x65,0x25,0x66,0xe,0xcf,0x87,
- 0xf,0xbf,0xa0,0x1,0x6b,0x60,0x5,0xef,0x92,0x80,0xbe,0x5b,0x2f,0x4b,0x8c,0xb7,
- 0x7c,0x98,0x28,0x8f,0x91,0x38,0x6e,0xe0,0x2,0xd4,0xd8,0x8,0x2d,0x10,0xb,0xf8,
- 0x30,0xe,0xa5,0x36,0x65,0xbd,0x15,0x70,0x7,0x89,0x5c,0xe2,0x20,0xe,0xfa,0x70,
- 0x7f,0xec,0xf0,0xe,0xdf,0x90,0x2,0x2e,0x90,0x5,0x44,0xd0,0xaa,0xdf,0x71,0x6,
- 0x1f,0xb0,0x1,0x6c,0xc9,0x61,0x17,0x90,0x9,0xbf,0x50,0x52,0xa2,0x20,0x2,0x72,
- 0xf0,0x1,0x74,0x9c,0x43,0x46,0xa3,0x3b,0x47,0x9c,0x2e,0xc,0xf4,0x5,0x84,0xd0,
- 0x8,0x3a,0xba,0x5b,0xf8,0x9,0xc8,0x5f,0x9a,0xa1,0x58,0x56,0x77,0x2a,0xe7,0x77,
- 0x4,0x87,0x9,0x64,0x0,0x7,0x8d,0xfc,0xad,0x2a,0x1b,0xc9,0xf2,0xd5,0x73,0x94,
- 0x1c,0x24,0x66,0x36,0x6,0x74,0xb0,0x6,0x75,0xf0,0x7,0x50,0x35,0xe,0xe0,0x50,
- 0x6a,0xe8,0xb0,0xe,0x9f,0xd7,0xe,0xed,0xa0,0x57,0xcf,0xa0,0xc,0xa5,0xf0,0x9,
- 0xcf,0xf0,0x85,0xdb,0x80,0xd,0xf8,0x50,0xa,0x22,0xf0,0x4,0x4c,0x70,0x42,0x1c,
- 0xe0,0x5,0x2e,0x80,0x94,0x6b,0xa0,0x1,0x15,0xf0,0x9,0xc3,0x80,0xf,0x7e,0x46,
- 0xb,0x4,0xc0,0x4,0x1b,0xf0,0xcb,0x88,0x39,0x56,0x16,0xa3,0x5,0x41,0x0,0x83,
- 0xd,0x45,0x8,0x9b,0x80,0xf,0xef,0xe0,0xc7,0xfe,0x30,0xbb,0x64,0x3b,0x7a,0x4b,
- 0x46,0xc8,0xb5,0x88,0x9f,0xa4,0x2c,0xb,0x28,0xe0,0x7,0x67,0xd3,0x2e,0x98,0xf8,
- 0x28,0x91,0x46,0xfe,0xb2,0xda,0x2c,0xc9,0x12,0xe3,0x3b,0x58,0x82,0x3e,0x8e,0x32,
- 0x5b,0x8d,0xa0,0x1,0x9f,0x20,0x90,0xf6,0x0,0xe,0xe0,0xd0,0x92,0x4e,0xd6,0xe,
- 0xf1,0xd0,0x57,0xc3,0x0,0xa,0x1a,0xa0,0x4,0x6,0xf0,0xa,0xf6,0x60,0xd,0xe1,
- 0x15,0xe,0xca,0xd0,0x3,0x3b,0x90,0x5,0x39,0xb0,0x48,0x37,0xf0,0x98,0x6d,0x5c,
- 0xa,0x36,0x68,0xd1,0xe1,0x50,0xd,0xf9,0xd7,0x0,0x59,0xb0,0x78,0xee,0x1b,0x29,
- 0x8a,0x79,0x36,0x31,0xdd,0xc0,0x84,0x20,0x4,0xfe,0x83,0xcc,0x1,0x77,0x9f,0x80,
- 0xcc,0xd1,0xcf,0xac,0x9f,0xdb,0x90,0x57,0xdf,0xf0,0x9,0x4a,0x50,0x4,0x1,0x14,
- 0x6,0x6c,0x77,0xd2,0x68,0xe3,0x2a,0xef,0x68,0xc7,0x4b,0x9c,0x63,0xe,0x44,0x14,
- 0x40,0x41,0x4,0x7e,0xd0,0x8,0x15,0x60,0xb,0x73,0x65,0xf,0xf7,0x47,0x5e,0x33,
- 0x9,0x61,0x10,0x56,0xb,0x98,0x40,0x3,0x83,0x62,0x4,0x4b,0x0,0xaa,0x84,0xed,
- 0x6a,0xdf,0x10,0xa,0x10,0x99,0x5,0x2a,0x10,0x2,0x7c,0x80,0x1,0x6f,0x90,0xa,
- 0x72,0x57,0x9f,0xc0,0x65,0xd,0x91,0xb8,0x4,0x62,0x10,0x2,0x7,0x8b,0x28,0xb8,
- 0xa7,0x36,0x99,0x24,0x40,0x44,0xd0,0x43,0x29,0xf0,0x7,0xcd,0x70,0x9f,0x7d,0x57,
- 0x81,0xcf,0xa,0x75,0x69,0xdd,0x77,0xf7,0xe7,0x72,0x54,0xd9,0x3,0x89,0x20,0x6,
- 0x35,0xa0,0x6,0x8a,0x90,0x3,0x8b,0x70,0xd2,0xd6,0x15,0xb7,0x78,0x8d,0xc0,0x90,
- 0xb6,0xd7,0xfd,0x38,0x10,0x43,0x50,0x6,0x8e,0x9d,0x9,0xcf,0x40,0x57,0xd9,0xb0,
- 0x67,0xfa,0xfe,0x10,0x60,0x25,0x25,0xf,0xb0,0x70,0x9,0x79,0xf0,0x6,0x13,0x70,
- 0x7,0xa3,0xd0,0xa,0x3d,0x80,0x4,0xb3,0x10,0xd9,0xec,0xa0,0xf,0xc5,0x60,0x0,
- 0x8d,0xa0,0x4,0x4a,0x20,0x3,0x6f,0x10,0xb,0xca,0x60,0x57,0xd5,0x10,0xe,0xf6,
- 0x60,0x62,0x95,0x69,0xbf,0x48,0x7a,0x3,0x7f,0x51,0x2,0xa6,0x5d,0x5f,0xc5,0x62,
- 0x9,0x4c,0x10,0x49,0x15,0x85,0x2,0xc1,0x90,0x7c,0xc9,0x47,0x5c,0xb0,0x8d,0xd6,
- 0x75,0xa7,0xbf,0xbf,0xa5,0x81,0xe7,0xf5,0xb,0x2d,0x50,0x7,0x89,0xe0,0xca,0x96,
- 0xd0,0x4,0xf0,0x62,0xd7,0x3b,0xb6,0xd2,0x7a,0x6d,0x2f,0xf,0x41,0x10,0x39,0x0,
- 0xb8,0x6,0x30,0xb,0x73,0xb5,0xe,0xef,0x47,0xf,0x7e,0x46,0xd,0xb2,0xf0,0x3,
- 0x68,0x80,0x6,0x12,0x80,0x4,0xf3,0xb6,0x90,0x91,0x80,0x2,0x76,0xf0,0x6c,0xd4,
- 0xb6,0xe,0xf2,0xa0,0x9,0xe9,0xd7,0x6,0xb1,0x30,0xd,0x62,0x1b,0xe,0xbe,0x65,
- 0x62,0x80,0x6a,0xf,0xe1,0xe0,0xd,0x3e,0x10,0xa2,0xf7,0x9d,0xdf,0x6a,0xd0,0x2e,
- 0xf0,0x2,0x41,0x19,0xb3,0x5,0x4a,0xf0,0x6,0x76,0x30,0xd,0x1,0x7,0xc8,0xfb,
- 0x49,0xdb,0x7d,0x37,0x60,0x4a,0xf6,0xe,0x80,0x27,0xf,0xbf,0xb0,0x54,0x64,0x90,
- 0x5,0x8a,0x70,0x4,0x46,0x3e,0xdc,0xaf,0x52,0xdc,0xc4,0x7b,0xdc,0x18,0x4e,0x10,
- 0x1f,0x34,0x8,0x64,0x0,0x6,0xcc,0xf0,0xe,0xeb,0x60,0xe,0xf3,0xc0,0xd,0x76,
- 0xf5,0xc,0xa9,0xf0,0x6,0x3e,0xf0,0x7,0x12,0x80,0x6,0xb0,0x80,0x59,0x23,0x45,
- 0x93,0xfe,0x17,0x70,0x1,0xb6,0xa0,0xf,0xe3,0x60,0xf,0x57,0x56,0xc,0xcc,0x86,
- 0x59,0xd5,0x60,0xf,0xe3,0xf0,0x85,0x82,0x9e,0xac,0x41,0x58,0xd,0xcc,0xa0,0x1,
- 0x5c,0xb0,0x78,0x2f,0x4a,0xe4,0x46,0x4e,0x98,0x74,0x20,0x4,0x88,0xb0,0x5,0x8d,
- 0x50,0x7,0x59,0x2a,0x7a,0x4f,0x39,0xe5,0xa0,0xbe,0x9f,0x7,0x1e,0xe5,0x76,0x36,
- 0x70,0x72,0x5,0xc,0x12,0xa0,0xdb,0x70,0xf0,0x5,0xf0,0x12,0x69,0x15,0xae,0xcd,
- 0x39,0xd6,0x26,0x66,0x3e,0x6,0x45,0xa0,0x4,0xac,0xa0,0xe,0xe7,0x90,0x72,0x76,
- 0x35,0xb,0x4,0x20,0x3,0x22,0x20,0x3,0x92,0x50,0xb,0xf4,0x99,0x5b,0xc8,0x35,
- 0x52,0x76,0x80,0x4,0x76,0x80,0xf,0xf0,0xed,0xf,0xff,0x4b,0x52,0x37,0xf8,0x74,
- 0x6d,0xae,0x88,0xee,0xb0,0x59,0xaa,0x2a,0x68,0x80,0x81,0xdf,0x70,0xe2,0x36,0x95,
- 0x8e,0xd2,0x59,0xb0,0x3,0x73,0x90,0x54,0xa9,0xa0,0xec,0xf6,0xc7,0x77,0x1f,0x1d,
- 0xea,0xa2,0xe,0xea,0xfa,0x96,0xa1,0x73,0x66,0xd0,0xf8,0x0,0xc,0x15,0xf0,0x6,
- 0x46,0x40,0x7,0xe9,0xf2,0x44,0x76,0x2d,0xe6,0x77,0x1b,0xeb,0x2d,0x32,0x10,0x58,
- 0x20,0x1e,0x45,0xf0,0x6,0xcc,0xa0,0xe,0x65,0xeb,0xf,0xde,0x30,0xd,0x92,0x20,
- 0x3,0x80,0x30,0x9,0xba,0x90,0x5b,0x72,0x46,0xa8,0x51,0x89,0xf,0xab,0x50,0x1,
- 0x28,0xd0,0xb,0x3b,0x2a,0x8e,0xa9,0xc6,0xa7,0xd4,0x86,0x60,0xba,0x9b,0x90,0xc8,
- 0xc5,0x9,0x45,0xd0,0x1,0x57,0x10,0x3,0x93,0x9e,0xed,0x9,0xa,0x2f,0x5d,0x20,
- 0xfe,0x8,0x29,0x10,0x8,0x2d,0x80,0x9,0x50,0xa5,0xb1,0xae,0x66,0x6a,0x53,0x8e,
- 0x6d,0x2d,0xd9,0x64,0x8b,0xf8,0x6f,0xad,0xa6,0xce,0xed,0x10,0x60,0x72,0x35,0xc,
- 0x1a,0x10,0x8,0x66,0x43,0x98,0x3a,0x66,0xef,0x76,0x8b,0xef,0x58,0xa2,0xef,0xcd,
- 0x92,0x5,0xad,0x20,0xf,0xdf,0x50,0x62,0xf0,0xb0,0xf,0xc6,0x45,0xa,0x18,0x80,
- 0x7,0xba,0x10,0x60,0x9d,0xb7,0xa1,0xa2,0x96,0xb8,0xf8,0xe0,0xc,0x38,0xe0,0x7,
- 0x92,0xe0,0xd,0xf0,0xbd,0xd,0xf0,0xa7,0xcc,0x94,0x49,0xe0,0xda,0x30,0x67,0x1,
- 0x36,0xad,0x34,0x90,0x4,0x30,0xa,0xf2,0xd8,0xee,0x1c,0x2f,0x88,0x36,0xf2,0x12,
- 0x8,0x9e,0x60,0x95,0xb0,0xa9,0xe,0x9c,0x15,0x75,0xe1,0x25,0x72,0x1d,0xdd,0x77,
- 0xf2,0x37,0xea,0x4e,0xe7,0x5b,0xf7,0xa9,0xbb,0x74,0xc5,0x62,0xbf,0x20,0xda,0x63,
- 0xa0,0x2b,0xd6,0xa5,0x31,0x95,0x54,0xc0,0x90,0xcc,0xc4,0xda,0x43,0x31,0x59,0x5b,
- 0xb2,0x55,0x48,0x38,0xf,0x91,0x5,0x81,0x40,0x9f,0xef,0x80,0x77,0xf0,0xb0,0xd,
- 0xf6,0xcb,0xc,0x3e,0x80,0x1,0x95,0xf0,0x5f,0x4c,0xd6,0xa3,0xa2,0xc6,0x77,0xe7,
- 0x65,0xa,0xfa,0x74,0xc,0x39,0x8,0x7f,0xb4,0x78,0x81,0xe9,0xa0,0x7c,0x7,0x69,
- 0xd0,0x7f,0x36,0x1,0x1f,0xa0,0xbd,0x6a,0x8f,0x28,0x66,0x46,0xbe,0x6e,0x40,0x4,
- 0x90,0x40,0x3,0x48,0x90,0xa3,0xff,0xd5,0x59,0xa2,0x67,0xd6,0xe4,0x5e,0xd4,0xae,
- 0xd6,0x59,0xd0,0x97,0x81,0xa,0xf6,0xcc,0x60,0x68,0x81,0x84,0xba,0x88,0x48,0xfe,
- 0x86,0xf,0xbd,0x80,0x1,0xf9,0xa,0x4,0x71,0x10,0x5,0x35,0x0,0x8a,0xe3,0x4a,
- 0xae,0xc1,0x7b,0x41,0x59,0x1b,0xf9,0x8e,0xe3,0x36,0x64,0xf3,0x8e,0xb5,0x52,0x8,
- 0x51,0x0,0xd0,0x45,0xb7,0xa7,0xe2,0x3e,0x86,0xf6,0x8b,0xf,0xae,0x40,0x3,0x14,
- 0x80,0xc,0x38,0x1e,0xe8,0xd6,0x16,0x5e,0x99,0x79,0xf5,0x17,0x60,0x7,0xa1,0xa0,
- 0xf0,0xf1,0xd0,0xe,0x3d,0x58,0x7f,0xe1,0x85,0x67,0x0,0xc1,0x8f,0x9e,0x3c,0x71,
- 0xf2,0x62,0xd1,0x8,0x31,0xe5,0xc4,0x89,0x11,0x26,0x4a,0xa8,0x81,0x18,0x51,0x4d,
- 0x98,0x42,0x3c,0xa,0xd,0xe1,0x23,0x6,0x8c,0xad,0x69,0xde,0xd6,0x7d,0x5c,0xe7,
- 0xce,0x1f,0x3f,0x73,0xeb,0xfc,0x85,0xb4,0x67,0x4f,0xdf,0x3b,0x96,0xf8,0x5c,0x4e,
- 0xc3,0xd7,0x52,0xdf,0xca,0x99,0x1f,0x4f,0x9a,0xf4,0x37,0x92,0x9f,0xbf,0x6e,0xfa,
- 0xa6,0xf9,0x92,0x1,0x8,0xc8,0x95,0x42,0x82,0x52,0x1c,0x5a,0x3,0xc7,0xcc,0x52,
- 0x33,0x6b,0x9a,0xc2,0x81,0x5a,0xa6,0x8c,0x1c,0xa9,0x70,0xa4,0x4e,0xc,0x13,0xe6,
- 0x8c,0x1c,0x35,0x4a,0xd7,0xa4,0x31,0xb3,0xc8,0x46,0xa1,0x20,0x70,0xf4,0xd4,0xa9,
- 0x20,0x8b,0x5a,0x4c,0x7d,0xee,0xf8,0xf1,0x73,0xa7,0xf2,0x1b,0xb2,0x1e,0x4b,0x3c,
- 0xc5,0xb4,0xc7,0x2e,0x65,0x5c,0x7d,0xdf,0xf0,0x7d,0xf3,0xe4,0x23,0xc1,0x30,0x79,
- 0xf2,0xe2,0xdd,0xbb,0xe7,0x2f,0xa5,0x3d,0x77,0x22,0xfd,0x69,0x53,0xe7,0xb7,0x16,
- 0x98,0x14,0x52,0x46,0x20,0x38,0x11,0xc3,0xa1,0xc4,0x88,0x72,0xc2,0x10,0xfe,0x62,
- 0x42,0xc7,0x8f,0x6,0x56,0xf8,0xce,0xbd,0x5b,0xb7,0xaf,0xb1,0xbb,0x7c,0xeb,0x76,
- 0xfa,0x7b,0x37,0xd3,0x9b,0x3e,0x7c,0xcc,0x6c,0xa1,0xa,0x75,0x4a,0x96,0xad,0x61,
- 0x7e,0x5d,0x7a,0x8b,0xad,0x2f,0xa7,0x3f,0x74,0x8b,0xf7,0xe5,0x5c,0x17,0x1b,0xdf,
- 0x2e,0xc,0x62,0xf8,0x30,0x51,0x21,0xa8,0x6,0x54,0xa8,0x4b,0x95,0x52,0xb7,0xaa,
- 0x46,0xea,0xf6,0x32,0x10,0xe5,0x78,0xfe,0x5e,0x46,0xa9,0x19,0x38,0x61,0xd8,0xe4,
- 0x20,0x82,0x68,0x4e,0x8f,0x50,0xe2,0x5c,0xbe,0xf3,0xe7,0xd6,0x1c,0x3c,0x7e,0xfa,
- 0xa8,0xc9,0xb,0x85,0xa3,0xc2,0xb0,0x98,0xe7,0xf4,0x75,0x8b,0xed,0x1b,0x79,0x70,
- 0xa9,0x84,0xb,0x40,0x8,0xc8,0xc5,0x25,0xc4,0xf8,0xc9,0x8b,0x1d,0x76,0xb6,0xf1,
- 0x7,0x9b,0x9e,0x5c,0xc2,0x25,0x92,0x6,0x8a,0x90,0xc2,0x84,0x17,0x5e,0xd0,0xec,
- 0x21,0xce,0xb4,0x93,0x4a,0x10,0x23,0x1a,0xc1,0x64,0xad,0x95,0x4c,0xda,0x67,0x9b,
- 0x6d,0xf6,0x31,0xe9,0xbf,0x99,0xde,0xa1,0xf0,0x11,0x1c,0xc0,0x0,0x3,0x5,0x14,
- 0x5a,0x68,0xc1,0x8e,0x4c,0x6c,0x79,0x46,0x1d,0x7c,0x66,0x12,0x6e,0x31,0x21,0xed,
- 0x81,0xd,0x46,0x7c,0x7e,0xb9,0x20,0x90,0x1a,0x6e,0xd8,0x23,0xc,0xaa,0xaa,0xc2,
- 0x8e,0x3a,0xee,0xb8,0xeb,0xec,0x3b,0xaa,0x40,0x94,0x23,0x8a,0x30,0xe8,0xc8,0x62,
- 0x87,0x3a,0x18,0x59,0x8b,0xad,0x93,0x46,0x82,0xa7,0x9e,0x7b,0x7c,0x2c,0x46,0x1,
- 0x34,0x56,0x91,0xc7,0x19,0x7c,0xe4,0xf1,0x51,0x1e,0x5e,0x1c,0xb9,0xfe,0xc0,0x8f,
- 0x7,0x58,0x10,0x85,0x99,0xd8,0xde,0x8a,0xcb,0x41,0x22,0xb1,0x99,0xe9,0x9c,0x69,
- 0x7a,0xf1,0xa1,0x39,0x2e,0x1e,0x70,0xe1,0x8c,0xf,0x4c,0xd8,0xec,0x43,0xf1,0xb6,
- 0xd8,0xa2,0xe,0x30,0x9c,0xf1,0x4b,0x1f,0x7b,0x70,0x72,0x67,0x1b,0xc7,0x92,0xd3,
- 0xe7,0x99,0x37,0x4d,0x89,0x64,0x89,0x3a,0x2,0x21,0x63,0xb,0x3d,0x6,0xe1,0xc2,
- 0x8f,0x37,0xc0,0xc8,0x43,0x16,0x97,0x56,0x7a,0x27,0x25,0x3f,0xed,0x41,0x7,0x9d,
- 0x9c,0xe8,0xc1,0xc7,0x47,0x5e,0x2a,0x20,0x83,0x8f,0x2b,0xae,0xd8,0xca,0x4a,0x2b,
- 0xb9,0xc3,0x8e,0x2b,0x88,0xa6,0xfc,0x2e,0x2b,0x65,0x8f,0x20,0x24,0x8b,0x35,0xea,
- 0x40,0x81,0x9a,0x6f,0xd4,0x89,0xed,0x26,0x7b,0xf6,0xa9,0xa7,0x1e,0x6e,0x70,0xc5,
- 0xa7,0x13,0x34,0x24,0x70,0x86,0x1c,0x71,0xc9,0x81,0x5,0x8d,0xa,0x68,0xf4,0x81,
- 0x14,0x65,0x58,0x1a,0xd2,0x4f,0x7a,0xb4,0xd1,0xc7,0x1b,0x75,0xa6,0x21,0x65,0x82,
- 0x3b,0x59,0xb8,0x21,0x84,0x10,0x44,0x50,0x61,0x86,0x46,0x39,0xb3,0x62,0xd,0x25,
- 0xa0,0xfd,0xc5,0xbd,0xd8,0x18,0x6b,0x8c,0x56,0x91,0x0,0xa5,0xed,0x4d,0x56,0x7a,
- 0x50,0x62,0x8d,0x53,0x7,0x29,0xa3,0x8b,0x26,0x86,0x90,0xc3,0xf,0x25,0x34,0xc8,
- 0x63,0x15,0x13,0x63,0xb5,0x67,0x1c,0x91,0x85,0x1c,0xe9,0x9e,0x77,0xf1,0x29,0x6,
- 0x5,0x31,0x62,0x88,0xe3,0xc,0x65,0x5f,0x76,0x52,0x3b,0xea,0xac,0x0,0xf,0xc4,
- 0xed,0x3c,0x33,0x8f,0xd,0x9d,0xe5,0x80,0xc3,0x88,0x55,0x9f,0xfe,0xf9,0xe6,0x45,
- 0xc6,0x70,0xda,0x87,0x9f,0x7a,0xde,0x4a,0xee,0x18,0x5,0x18,0x71,0xa5,0x9c,0x65,
- 0x68,0x79,0x44,0x1,0x47,0x7e,0x40,0xc2,0x14,0x66,0xf0,0xf1,0xa6,0x1a,0x69,0x86,
- 0x5c,0xec,0xcd,0xfb,0x7e,0xa9,0x44,0x84,0x7,0x74,0x0,0xc2,0x83,0x19,0xa4,0x28,
- 0x42,0x84,0x22,0x5c,0xf8,0x57,0x22,0x38,0x94,0x88,0xa4,0x8d,0x55,0xf0,0x99,0x66,
- 0xa6,0xf8,0x12,0xde,0xeb,0x2d,0x7f,0xfa,0xc2,0x7,0x97,0xb,0xc8,0xd0,0x3,0x8e,
- 0x2e,0x82,0xd0,0xf2,0x8c,0x33,0xbc,0x8,0x82,0x88,0x41,0x10,0x59,0x55,0x96,0xab,
- 0x2d,0x45,0x67,0x1b,0x7b,0x24,0x37,0xee,0x9e,0x6c,0xef,0xd1,0x6,0x1f,0x61,0x30,
- 0x0,0xe4,0xe,0x97,0x61,0x56,0x96,0x2a,0xec,0x26,0xe2,0x6a,0xca,0x32,0xb2,0x62,
- 0x23,0x8e,0x2a,0xd8,0xa0,0x23,0x85,0x46,0xc0,0x40,0xe6,0x47,0x4b,0x73,0x72,0xe7,
- 0x38,0x9a,0x86,0xb3,0x27,0x1c,0x7d,0x1e,0x41,0xa1,0x8e,0x56,0x94,0x68,0x1,0x9,
- 0x14,0xd0,0x80,0xc5,0x3d,0x6a,0x2d,0xb5,0x87,0x1f,0x78,0xe6,0x39,0x7a,0x6f,0x7c,
- 0xa,0x72,0xc6,0x94,0x16,0x64,0x60,0x61,0x6,0x10,0x40,0x0,0x2,0xa,0x29,0xb8,
- 0xa8,0x61,0xed,0xb6,0x23,0x82,0x23,0x10,0x30,0x34,0x9,0xf3,0x1a,0x7f,0xf6,0xc9,
- 0xc7,0x9d,0xe2,0x52,0x5a,0x27,0x1d,0xb8,0xde,0x39,0xe7,0x19,0x14,0xde,0x40,0x44,
- 0x70,0x37,0xa,0x29,0x84,0x8d,0x42,0xb2,0x72,0x83,0x2a,0x2b,0x6a,0x48,0x84,0x1,
- 0x62,0xf1,0xb1,0xa2,0xed,0x24,0x25,0xe8,0x10,0x89,0xd1,0xfe,0xea,0x41,0xf,0x1f,
- 0xf5,0x42,0x6,0x52,0x18,0x83,0x1a,0x3c,0xe3,0x32,0x36,0xbc,0x4c,0x3c,0x4f,0xc1,
- 0xca,0x93,0x6e,0x86,0xba,0x38,0xb4,0x2c,0xb,0x75,0x40,0x82,0x30,0xb0,0x86,0x40,
- 0xb7,0xc0,0x65,0x6f,0xca,0x41,0x9e,0x5e,0xaa,0x1,0xc,0x14,0x90,0x60,0x7,0x5b,
- 0x20,0x1,0x18,0x72,0xe1,0xd,0x7c,0xc4,0xe3,0x1a,0xfa,0xa8,0x55,0xf2,0xe6,0xb1,
- 0xc3,0x5,0xba,0x44,0x1e,0xd4,0x58,0x5,0xa,0x34,0x20,0x6,0x11,0xac,0x40,0x7,
- 0x71,0x0,0x41,0x9,0x80,0xf0,0x81,0x1b,0x70,0xe1,0x6,0xfe,0xf2,0x10,0x67,0xe0,
- 0xf0,0x86,0x48,0x50,0x4a,0x1d,0xfa,0xa0,0xc7,0x4e,0xe2,0x22,0x24,0x77,0xb8,0x4f,
- 0x72,0xfa,0x78,0x5,0x12,0x96,0x20,0x6,0x2b,0x28,0x4b,0x67,0x6e,0x60,0xca,0xe9,
- 0x9c,0x34,0x6,0x48,0x90,0x26,0x68,0xf4,0xe0,0x46,0x3d,0xe8,0xb3,0xe,0x92,0x19,
- 0xed,0x1e,0xfa,0xf0,0x91,0x2f,0x68,0xe0,0x87,0x1a,0x58,0x81,0x10,0x61,0x70,0xc1,
- 0xfd,0x42,0xe7,0x95,0x35,0x64,0x90,0x3b,0x74,0xa0,0x3,0x21,0xba,0x90,0xa8,0x33,
- 0x8c,0x81,0x2,0x98,0xe0,0xf,0x3e,0xc2,0x91,0x40,0xbd,0xed,0xad,0x61,0x3f,0x12,
- 0xd2,0x3b,0x1e,0x71,0x81,0x16,0x70,0x62,0x17,0x31,0x41,0x7,0x3d,0xcc,0xf4,0x91,
- 0xc6,0x28,0xf0,0x1e,0xf1,0x78,0x53,0x31,0x58,0x21,0x46,0x25,0x18,0xa1,0x8,0x45,
- 0xb8,0x81,0xe,0x74,0x60,0x3,0x1b,0xcc,0xc0,0x96,0xb6,0x5c,0xc1,0xf7,0x20,0x2,
- 0x7,0x1a,0xfc,0xc2,0x37,0xda,0x20,0x9,0x5c,0x86,0xfe,0xe4,0x96,0x74,0xb8,0x43,
- 0x77,0xca,0x40,0x41,0x23,0xe0,0x80,0x15,0x9d,0x39,0x29,0xd,0x87,0x0,0x8b,0x1b,
- 0xcc,0x73,0x86,0x1b,0x24,0x2,0x5,0x73,0xc3,0x87,0xe5,0xb2,0xb5,0x8f,0x3,0xa6,
- 0xc4,0x1f,0xf7,0xd8,0x89,0x7f,0x6,0xd5,0x82,0x44,0x18,0x21,0xb,0x72,0x50,0xc4,
- 0x6,0xf2,0x97,0x15,0x9e,0x35,0x65,0xd,0x34,0x73,0x52,0x78,0xe4,0x20,0x4,0x2b,
- 0x10,0x81,0xe,0x83,0xe8,0x82,0x1c,0x8c,0x80,0x89,0x63,0xe4,0xea,0x1c,0x8c,0x79,
- 0x4b,0x25,0x67,0xe2,0x92,0x1f,0xdd,0x2d,0x25,0xcc,0x78,0xc5,0x2f,0xde,0x53,0x9c,
- 0xe1,0xc,0x87,0x45,0xd,0xa3,0x6,0x2f,0x34,0xf1,0x3,0x1c,0x18,0x81,0x8,0x44,
- 0x28,0xc2,0x45,0x89,0x70,0x83,0x1b,0xb8,0x40,0x7,0x33,0xb0,0x41,0xc,0x4a,0xa0,
- 0x19,0x5d,0x76,0xc5,0xf,0x6e,0x9a,0x16,0x1c,0xf9,0x34,0xcc,0x74,0xa4,0x43,0x2f,
- 0x7f,0xf1,0x84,0x12,0xe0,0x80,0xb3,0xcf,0xc1,0x21,0xd,0x73,0x0,0x8b,0x16,0x74,
- 0xc6,0x6,0x37,0x14,0x61,0x9,0x38,0x80,0x85,0x4b,0x44,0x59,0x8f,0x9c,0x70,0x11,
- 0x27,0x34,0x39,0x92,0x6,0xea,0x90,0x88,0x1a,0xa8,0x40,0x11,0x4d,0x18,0xa4,0x3b,
- 0x97,0x69,0x25,0x65,0x31,0xc1,0x12,0x83,0x10,0x81,0x1e,0x2,0xa1,0x4,0x4c,0x30,
- 0xa3,0x52,0xc2,0xf1,0x7,0x34,0x2,0x9a,0x13,0x20,0xb9,0x44,0x27,0x7a,0xd3,0x87,
- 0x7f,0xde,0xa1,0xbb,0x94,0x8c,0x43,0x25,0x40,0xa2,0x8d,0x3a,0x90,0xa1,0x8a,0x46,
- 0xb4,0xa0,0x7,0x6d,0x98,0x43,0x12,0x6c,0xa0,0xfe,0x83,0x1c,0x24,0x1,0xa3,0xaf,
- 0xdc,0xe8,0xc,0x80,0x10,0x83,0x11,0x8c,0xa0,0x43,0x1f,0x52,0xc3,0x18,0xfc,0xf0,
- 0x8d,0x69,0xa9,0x3,0x9c,0x6f,0x19,0x66,0x7c,0xb6,0x81,0x8e,0x70,0xbc,0xa9,0x11,
- 0x5b,0x80,0x67,0x56,0x76,0x79,0xd3,0x34,0x94,0x41,0xb,0xe6,0xa1,0x48,0x16,0xc8,
- 0xd0,0x86,0x1f,0xa0,0xa2,0x1c,0xf8,0xa0,0x7,0x3d,0x70,0xc7,0x45,0xe4,0x74,0xc3,
- 0x25,0xbf,0xa8,0xc0,0x1f,0x94,0x50,0x3,0x39,0x4,0xe1,0x73,0xed,0x7c,0x8a,0x55,
- 0xd4,0xc8,0x4e,0x22,0x84,0x4f,0x52,0x9f,0xb8,0xda,0x6c,0x56,0x72,0x9c,0x80,0xbe,
- 0x6,0x48,0xa9,0x5,0x27,0x3c,0x94,0x4b,0x12,0x6c,0x1c,0x27,0x27,0xc,0xb,0x47,
- 0x35,0x68,0xf8,0x8d,0x61,0xc4,0x42,0x12,0x32,0x10,0x1,0x17,0x98,0x20,0x82,0x14,
- 0x30,0xc1,0x6,0x2f,0xb0,0x1,0x14,0xfc,0x5a,0x84,0xee,0x5,0x76,0xb0,0x85,0x2d,
- 0x41,0x49,0xd5,0x70,0x3,0x5d,0xc8,0x3,0x1f,0xd7,0xc8,0x86,0xd1,0x14,0xa3,0x17,
- 0x6f,0xc6,0x87,0x1d,0xe1,0x38,0x87,0x38,0x68,0x41,0x1,0x41,0x4c,0x85,0x9d,0x5d,
- 0xc1,0xce,0x54,0x3c,0xa3,0x5,0x2e,0xed,0xa0,0x11,0x3d,0xc0,0x1,0x2b,0xdc,0x3,
- 0x2b,0xda,0x2d,0x66,0x7d,0x64,0xf5,0xb,0x30,0x62,0x9b,0x88,0x2c,0x74,0x21,0x74,
- 0x17,0x5c,0x83,0x53,0xac,0x92,0xb3,0x33,0xe4,0x80,0xf,0x46,0x0,0x61,0x28,0xfc,
- 0xe2,0x8d,0x9c,0xd8,0xca,0x26,0xd,0xb5,0x64,0x4e,0x8a,0x5b,0x5c,0x73,0xec,0x84,
- 0x61,0xbf,0x61,0xc6,0x2e,0x48,0x91,0x8,0xfe,0x19,0x4c,0xe0,0x95,0x45,0xb0,0x98,
- 0x9,0x6c,0xd0,0x87,0xd,0x1,0xc1,0x6,0x43,0x18,0x6f,0x46,0x3b,0x6a,0x3,0x20,
- 0x70,0xe8,0xb0,0x1f,0x1a,0x83,0x14,0xc4,0x20,0xc,0xf7,0xc0,0x91,0xa8,0xd,0xaa,
- 0x6f,0x71,0xfa,0x12,0x8b,0x16,0x20,0x42,0x8,0x5a,0x90,0x66,0x18,0xc4,0x3,0x87,
- 0x2c,0x24,0x59,0xa,0xc7,0xa,0xd1,0x13,0x4,0xb1,0x85,0x35,0x88,0xc1,0x8,0xae,
- 0xa0,0xc6,0x8b,0x54,0x6b,0x92,0x2d,0x7a,0x73,0x27,0x7c,0x63,0x61,0x1d,0x8c,0x30,
- 0x8,0x9c,0x89,0xce,0x9d,0x4e,0x39,0x5d,0xea,0xe2,0x50,0x88,0x2e,0x24,0xe2,0x2,
- 0xa7,0xf8,0xcb,0x3b,0x8e,0xe3,0xe,0x9c,0x8c,0x69,0x38,0x40,0xca,0x47,0x25,0x1b,
- 0xda,0xd2,0x74,0xac,0x83,0x36,0xf2,0x48,0x46,0x2c,0x3c,0xf1,0x6,0xec,0x72,0x54,
- 0xa,0x6e,0x50,0x84,0xa2,0x22,0xd0,0x41,0x8,0xbc,0xc0,0xc7,0x36,0xc8,0x1,0x90,
- 0x93,0xc0,0x51,0x17,0x78,0x94,0x51,0xa7,0x8e,0xa2,0x44,0xc6,0x70,0x7,0x11,0xfc,
- 0xa1,0x16,0xf8,0x68,0x7,0x62,0xfa,0x44,0xdf,0x9c,0xbc,0xc3,0x53,0xb2,0x40,0x81,
- 0x12,0x28,0x61,0x5,0x37,0xf4,0x5a,0xb,0xe2,0x59,0x43,0x16,0xee,0x30,0x94,0x33,
- 0xa8,0xa1,0x29,0x69,0x78,0xe6,0x13,0xe8,0x10,0x6,0x1b,0x18,0x82,0x5,0xb1,0x60,
- 0x86,0xdd,0xb2,0x25,0x4c,0xe3,0xbc,0x85,0x36,0x6b,0xf9,0x85,0x6,0x2,0x31,0x8,
- 0x43,0x42,0xe5,0x2b,0x60,0xc9,0x73,0x15,0xe2,0xb0,0x7,0x3e,0x8,0xf0,0x55,0x23,
- 0x71,0x1f,0x3f,0xd6,0x81,0xd,0x7f,0xfe,0xa8,0x96,0xac,0x40,0x5a,0x4d,0x4a,0x80,
- 0xb4,0x18,0xbd,0x78,0xa3,0x16,0x8c,0xa8,0x3,0xd,0x52,0x90,0x2,0x23,0x6c,0xe1,
- 0x9,0x65,0xc4,0xc2,0x86,0xfa,0x10,0x7,0x26,0xca,0x41,0x7,0x50,0x8,0x2f,0x14,
- 0x14,0xe,0x5,0xbe,0xf2,0x35,0x7,0x2e,0xe8,0x28,0x14,0x11,0xab,0x6,0x2f,0xe0,
- 0x81,0x2,0x76,0xe0,0x45,0xae,0x66,0x32,0xcc,0xbe,0xc8,0x83,0x15,0x28,0x0,0x9c,
- 0x10,0x8,0xe1,0xeb,0xaa,0xf8,0x81,0xb,0x57,0x98,0xc2,0x15,0xbc,0xd0,0x95,0x6f,
- 0x8b,0x99,0xe,0x5e,0x30,0xc4,0x14,0xee,0x40,0x80,0x58,0xf8,0x85,0x1e,0x96,0x33,
- 0x20,0xc9,0x4e,0xf2,0x23,0xbf,0xfc,0xa2,0x5,0x46,0x18,0x83,0xe1,0xb6,0x2,0x87,
- 0x6f,0x27,0x25,0xc,0xaa,0x9b,0x42,0x1c,0xa4,0x30,0x1,0x5a,0xc8,0xc3,0xe6,0xf7,
- 0x68,0x31,0x49,0x6e,0xd5,0xee,0xd4,0xe,0x27,0x1f,0x6,0x55,0xc9,0xab,0x74,0x87,
- 0x50,0x24,0x68,0x1b,0xe,0x4c,0xe0,0xc3,0x20,0xb2,0xe0,0x6f,0x2b,0xc,0xe1,0xbb,
- 0x4e,0x18,0x1,0x10,0xb6,0x27,0x82,0x24,0xe4,0x20,0x7,0xb,0xa7,0xa5,0x2c,0x75,
- 0x50,0x6a,0x88,0xbb,0x0,0x8a,0x63,0xc0,0x7b,0x95,0xe4,0x10,0x2,0x31,0xd0,0x0,
- 0x5,0xae,0x32,0xd,0x4b,0xe8,0x28,0x6f,0x79,0xb4,0xc2,0x9c,0x35,0xc8,0x2,0x21,
- 0xe8,0x10,0x1e,0x28,0x59,0x41,0xd,0x2e,0x13,0x5d,0x80,0xfd,0xcb,0xce,0x9,0x28,
- 0x18,0xb5,0x2b,0x3d,0xe0,0x40,0xfd,0x61,0x8e,0xbd,0x9d,0x3,0x1f,0xbd,0xa0,0x81,
- 0x14,0x80,0x90,0x74,0x37,0xd4,0xfe,0xa0,0x11,0x87,0x38,0x44,0x16,0xbc,0xd0,0x7,
- 0x27,0x38,0xe1,0x4,0x71,0x10,0x41,0x2e,0xdc,0x3,0xeb,0x58,0xa3,0x98,0xea,0xa9,
- 0x55,0xb4,0xf2,0xc4,0xea,0xf,0x98,0x14,0x86,0x1a,0xb1,0x78,0x43,0xa,0xb8,0xc0,
- 0x87,0x2f,0xc8,0x81,0x9,0xc7,0xef,0xc2,0xf1,0x99,0x70,0x84,0x23,0x34,0x81,0xf9,
- 0x47,0x18,0xc2,0x45,0x93,0x30,0x84,0x21,0xb8,0x3d,0x7,0x72,0x9f,0xfb,0x2d,0xed,
- 0xbe,0x82,0x12,0x94,0x0,0xef,0x11,0xf4,0x8e,0x1c,0xec,0xc9,0x87,0x2c,0x88,0xe1,
- 0xd,0xa6,0x8,0xd3,0x8f,0xba,0x91,0x92,0x73,0xb4,0x2,0x34,0x8a,0xb7,0x2,0x1d,
- 0xac,0x60,0x3a,0xfa,0xd7,0x7f,0x3b,0x4d,0xb0,0x84,0x12,0x58,0x21,0xf,0xe1,0x34,
- 0x86,0xbe,0xe8,0x8,0xe,0x9d,0x80,0xd,0x9f,0x0,0xa,0x45,0x18,0x8a,0x42,0xa0,
- 0x84,0x1d,0x38,0x84,0x1d,0xb0,0x82,0x3d,0x40,0xb9,0x11,0xb8,0x83,0x9,0xc8,0x5,
- 0xdf,0x88,0x35,0x93,0x51,0x8c,0xbd,0x51,0x31,0xc4,0x78,0xac,0xd7,0x8,0x28,0x9,
- 0xc9,0x15,0x79,0xd8,0x85,0x39,0x10,0x83,0x22,0x90,0x83,0x3d,0x38,0x82,0xf0,0x6a,
- 0x82,0x2e,0x50,0x41,0xe5,0x63,0xc1,0x16,0xa4,0xbe,0x17,0xac,0xbe,0x87,0xb3,0xbb,
- 0x19,0xc0,0xbe,0xee,0xf3,0xbe,0xbc,0xb,0xbf,0x31,0x50,0x84,0x1b,0x50,0x81,0x49,
- 0x20,0x83,0x1e,0x30,0x85,0x36,0xf9,0x8b,0x1f,0xa9,0x86,0x57,0x48,0x1,0x7b,0x22,
- 0x4,0x2b,0x88,0x3f,0xfb,0x63,0x42,0xd3,0x69,0x96,0x1f,0x7c,0x5,0x50,0x12,0x89,
- 0x2d,0x9a,0x37,0xe7,0xb2,0xfe,0xa4,0xe5,0x68,0xe,0x3e,0xb8,0x28,0x41,0xc8,0x2,
- 0x4a,0x90,0xe,0x33,0xd0,0x18,0x14,0x88,0x24,0x75,0x58,0xb3,0xf5,0x21,0x12,0xdb,
- 0x43,0x43,0x6c,0x68,0x11,0x1,0x31,0x5,0x88,0xc9,0x82,0x65,0xba,0x18,0x28,0x18,
- 0x82,0x14,0x5c,0xc1,0x16,0xb4,0x43,0x18,0xa4,0x3e,0xb7,0x2b,0x35,0x5b,0xaa,0xc1,
- 0xee,0xfb,0xbe,0x2a,0x9,0x82,0x5e,0x93,0x3,0x3a,0x78,0x1b,0x14,0x78,0x4,0x72,
- 0x28,0x8c,0xc2,0x38,0x85,0xb,0x10,0x3,0x42,0x0,0xd,0x22,0x88,0x3f,0x3a,0x68,
- 0xc2,0x49,0x84,0x83,0x31,0xdb,0x2,0x32,0x68,0x1,0x55,0xf8,0x6,0x96,0x10,0x40,
- 0x95,0x18,0x12,0x9e,0xa0,0xa1,0x23,0x49,0x92,0x2c,0x60,0x2,0x37,0x68,0x2,0x17,
- 0x48,0x8f,0x46,0x68,0x3,0x34,0x28,0x6,0x79,0x20,0x7,0xd4,0x9a,0x2f,0x5a,0x43,
- 0x43,0xdc,0x29,0xaa,0xb7,0x52,0x87,0x67,0xc8,0x4,0x14,0x58,0x82,0xa4,0xb0,0x82,
- 0x2f,0x8,0x83,0x3d,0x68,0x82,0x15,0xa0,0xc3,0xe4,0xb3,0x43,0x17,0xc4,0x43,0x3d,
- 0x9c,0xc1,0x3e,0xbc,0x41,0xf0,0x93,0x20,0x39,0x58,0x84,0x40,0x5c,0x84,0x23,0x20,
- 0x2,0x3d,0x98,0x83,0x36,0xc8,0x84,0x5b,0x48,0x6,0x64,0x88,0x84,0x16,0x8,0x84,
- 0x2c,0x90,0x3f,0x48,0x2c,0x3,0x25,0x9c,0xc4,0x26,0x34,0x83,0x34,0xd8,0x82,0x1a,
- 0x40,0x15,0x19,0xd0,0xc4,0x1f,0xc1,0x39,0x59,0x39,0x20,0x5b,0xd9,0x7,0x7a,0xc0,
- 0x23,0x7c,0xd8,0x95,0x40,0x98,0x84,0x2b,0x78,0x1,0x43,0x68,0x82,0x41,0xa8,0xc6,
- 0x65,0x28,0x7,0x44,0xfe,0x7c,0xaf,0xe2,0x0,0x7,0x70,0xa0,0x2f,0xae,0x31,0xc8,
- 0xbd,0x89,0x8c,0x64,0x40,0x82,0x4,0x68,0x84,0x35,0x28,0xaf,0x2e,0xf0,0x2,0xe7,
- 0x1b,0x46,0x62,0x2c,0x46,0xe5,0xc3,0xc3,0x18,0xdc,0x43,0x1a,0x94,0x3b,0x1b,0xfc,
- 0xc3,0xf0,0x5b,0x4,0x2f,0xe0,0x81,0x33,0x28,0x4,0x37,0x30,0x8b,0x39,0xa8,0x83,
- 0x1e,0xa8,0x83,0x39,0x28,0xa7,0xaf,0x93,0x8a,0x25,0x5c,0xc2,0x71,0xb4,0x3f,0x33,
- 0x58,0x40,0x38,0x20,0x2,0x39,0x28,0x82,0x14,0x18,0x20,0xd4,0x2,0xa7,0x7c,0x60,
- 0x7,0xb7,0xaa,0x23,0x93,0xc9,0x1c,0x5e,0x50,0x19,0x20,0xe8,0x83,0x13,0x58,0x84,
- 0x2e,0x78,0x24,0x34,0x40,0x85,0x62,0x28,0x7,0x79,0xf8,0x27,0x76,0x20,0xc8,0xc6,
- 0x50,0xc,0x83,0x5c,0xc,0xb2,0x9a,0x6,0x6a,0x10,0x6,0x14,0x40,0x82,0x46,0x48,
- 0x1,0x74,0xac,0xa7,0xe5,0xb,0xb5,0x31,0x60,0x2,0x15,0xa4,0xc8,0x8a,0x64,0x82,
- 0x8b,0x44,0x46,0x3e,0xdc,0x48,0x3f,0xc4,0xc1,0x66,0x54,0x81,0xfb,0x39,0x3,0x69,
- 0xea,0x2,0x33,0x40,0x4,0x12,0xb8,0xac,0x14,0xc8,0x2,0x4b,0xd8,0x80,0x41,0x44,
- 0x24,0x71,0x94,0x44,0x98,0xac,0x3f,0xa5,0xa0,0x4,0x22,0x70,0x83,0x3d,0xb8,0x1,
- 0x3f,0x68,0x1,0x59,0x70,0x93,0xfe,0xd3,0x8b,0x82,0x24,0x12,0xc4,0x30,0x93,0xcc,
- 0xf9,0x5,0xce,0x89,0x3,0xd6,0xbb,0x2,0x39,0xd8,0x82,0x43,0xe8,0x81,0x16,0x88,
- 0x84,0x5d,0xf8,0x86,0x73,0xd8,0x1a,0xe5,0x79,0x8d,0xa9,0xe4,0x1a,0x4b,0xb2,0x8f,
- 0x5d,0xd0,0x80,0xfe,0x25,0x48,0x4,0x31,0x78,0xc3,0x2e,0xb8,0xa8,0x60,0x91,0x82,
- 0x1b,0x18,0xcb,0x3a,0x34,0xcb,0xb3,0x3c,0x46,0x19,0x54,0x4b,0x59,0xe2,0xc8,0xb6,
- 0xfc,0xe,0x42,0x20,0x82,0x1c,0x38,0x9c,0x30,0x70,0x83,0xff,0x81,0xa6,0x35,0xa0,
- 0xb3,0x21,0xf0,0x2,0x39,0x98,0xbf,0x70,0x94,0x44,0x22,0x0,0x4c,0xfb,0xb3,0x82,
- 0x2e,0x18,0x49,0x37,0xa0,0x83,0x1a,0x98,0x83,0x4,0x90,0x85,0x5,0x5b,0x8d,0xf8,
- 0x58,0x9f,0xab,0xd3,0xa6,0x76,0x68,0x20,0x19,0x10,0x2c,0x27,0xb8,0x3,0x29,0xc8,
- 0x2,0x74,0xe4,0x3,0x39,0x10,0x81,0x4a,0xf0,0x85,0x1f,0x31,0x9a,0xd1,0x24,0xcd,
- 0xaa,0x2c,0x2b,0x5a,0x30,0x82,0x14,0xd0,0x3,0xf2,0xa2,0x3,0x22,0xf0,0xc5,0x28,
- 0x8,0x82,0x2e,0x18,0x83,0xef,0x20,0xcb,0xb2,0xac,0x48,0xb4,0xc4,0x4d,0x8d,0xd4,
- 0x4d,0xb6,0xfc,0x3e,0xbc,0x53,0x42,0x78,0x32,0x9c,0x30,0xe8,0xa,0xeb,0xc8,0x33,
- 0x36,0xd0,0xa0,0xe7,0x6c,0x42,0xcf,0xa8,0x20,0xaa,0x58,0x8a,0x35,0x68,0x4,0x3,
- 0x60,0x85,0xa0,0x41,0xa0,0xb1,0xa2,0x15,0x37,0x43,0x8c,0x21,0xd4,0x23,0x19,0xb8,
- 0x81,0x22,0x90,0x1,0x23,0xe0,0x2,0x29,0x80,0x2,0x20,0x30,0x84,0x8,0x34,0x85,
- 0x82,0x68,0x87,0xd4,0x72,0x37,0xac,0x53,0x9,0x18,0xf9,0x6,0x5e,0xa8,0x3,0x2e,
- 0xc8,0x82,0x2c,0xe8,0x45,0xbc,0xfb,0x82,0x2f,0x8,0x82,0xfe,0xc,0x50,0xb2,0xac,
- 0xcd,0xe3,0x7b,0x41,0xeb,0xa3,0x3b,0x17,0x58,0x81,0x15,0x98,0x81,0x26,0xe5,0x3e,
- 0x4,0x4d,0xfe,0xd0,0x31,0x80,0x8a,0xc4,0xf2,0x2,0xc3,0x51,0x4e,0xeb,0x98,0x88,
- 0x9d,0xa1,0xd0,0x71,0x3c,0xba,0x38,0xd0,0xb2,0x72,0x5c,0x8a,0x2c,0x40,0x4,0x1a,
- 0x50,0x85,0x82,0x52,0x20,0x7f,0xc8,0x87,0x1c,0x7a,0x4c,0x81,0x98,0x8d,0x41,0xf9,
- 0x84,0x58,0xf8,0x5,0x5c,0x28,0x85,0x46,0x10,0x83,0x10,0xd8,0x3,0x1b,0x38,0x3,
- 0x2e,0xa8,0x83,0x3c,0x68,0x45,0xf7,0xd2,0x7,0x93,0x30,0x89,0x6d,0x58,0xd3,0xb4,
- 0x72,0x89,0x60,0x40,0x83,0x2d,0x8,0x52,0xbc,0xd3,0x92,0x30,0x88,0x2,0xfe,0x24,
- 0xd2,0x22,0x15,0xd0,0x62,0x4c,0x52,0x64,0x2c,0xb5,0x26,0x7d,0xd2,0x26,0xdd,0xcd,
- 0x29,0xb5,0x2,0x2e,0xc3,0x3b,0x2f,0xb8,0x52,0x0,0x8b,0xa,0xad,0xd8,0x8a,0x2e,
- 0x9d,0xc4,0x30,0x10,0x37,0x2d,0x43,0x36,0xb0,0x20,0x84,0x26,0x52,0x47,0xa1,0x32,
- 0x93,0x5a,0xdc,0xb,0x9c,0x8,0x8e,0xe0,0x78,0x93,0x37,0x1,0x86,0x52,0x20,0x1,
- 0x3f,0xe8,0xd1,0x2d,0x68,0x84,0xa,0xb8,0x5,0x79,0xb8,0x6,0xf5,0x33,0x34,0xd8,
- 0xc8,0x95,0x62,0xb8,0x4,0x14,0xc8,0x82,0x47,0xc5,0x3b,0x65,0x79,0xd4,0x21,0xd,
- 0x82,0x2f,0x90,0xd4,0x23,0xb5,0xcd,0x18,0x94,0xc1,0x4b,0x75,0x52,0x28,0xdd,0xd4,
- 0x4,0xed,0xd4,0x2c,0xf8,0x2,0x29,0x38,0x9c,0x62,0xeb,0x54,0xa5,0x98,0xa,0xc3,
- 0xb1,0x19,0x53,0xad,0x3f,0x39,0x68,0xa6,0x72,0x4,0xb7,0x42,0x38,0x82,0xed,0x69,
- 0x81,0x57,0x70,0xaf,0x1a,0x8d,0x4f,0x7b,0xb8,0xba,0xf3,0x11,0x34,0x33,0x41,0xc,
- 0x54,0xfe,0x7a,0x1e,0x60,0x60,0x84,0x1e,0x8,0x84,0x35,0x30,0x82,0xba,0x64,0x13,
- 0xf7,0x2a,0xa8,0x2b,0xc4,0x87,0x64,0x68,0x3,0xbc,0xea,0xb2,0x30,0x18,0x3,0x87,
- 0x75,0xd8,0x28,0x10,0x52,0x68,0x8d,0x54,0xda,0x34,0xcb,0x4a,0xbd,0x56,0x26,0xcd,
- 0x56,0x4d,0x95,0xd2,0x4,0x85,0x8a,0xa0,0x3b,0x3,0x2c,0x30,0xd7,0x0,0xd3,0x2c,
- 0x74,0xad,0xd0,0x27,0x31,0x3,0xa9,0x90,0x3,0x37,0x8,0x82,0x1b,0x18,0x4,0xe0,
- 0xb1,0xbc,0x17,0x91,0x55,0x5a,0x61,0xa8,0x91,0xa8,0x87,0x79,0x88,0x23,0x70,0x42,
- 0xc8,0x6f,0x58,0x85,0xa,0x68,0x84,0x2c,0x70,0xd9,0x1e,0xf8,0x4,0x71,0xf0,0x8d,
- 0x17,0x71,0x89,0x64,0xf8,0x83,0x25,0x30,0x2,0x38,0x50,0xc2,0x31,0xb0,0x82,0x31,
- 0xf8,0x82,0x28,0x18,0x3,0x8a,0x5,0x55,0xc4,0x9,0x50,0x6a,0xc5,0xd8,0x25,0xc5,
- 0x54,0x6d,0xed,0xd8,0xef,0x73,0x3c,0xc3,0xd9,0xa9,0x62,0xab,0x8e,0xd,0x73,0x50,
- 0x93,0xb5,0xbf,0xf1,0x20,0xdb,0xac,0x20,0x84,0x2f,0x18,0x84,0x1a,0x58,0x83,0x1d,
- 0x20,0x81,0x1,0x52,0xb3,0xf3,0x41,0x89,0x10,0xd5,0x89,0x69,0x7b,0xb,0x35,0xdc,
- 0x9b,0x61,0x5,0x6,0x24,0x40,0x84,0x1b,0xe8,0x2,0xc4,0x8c,0x4,0xa7,0x93,0x1d,
- 0x3c,0x62,0x6,0x46,0x20,0x1,0x38,0xc8,0x81,0x26,0x70,0xda,0x5,0xfd,0xd1,0x20,
- 0x1d,0x52,0x50,0x7d,0xd4,0x61,0xc4,0xda,0x3c,0xb4,0x54,0x8d,0xcd,0xd4,0x28,0x5d,
- 0xc6,0x29,0x95,0xa0,0x33,0xd0,0xb3,0x38,0xa8,0xa0,0xb,0x4a,0x59,0xcf,0x30,0xdb,
- 0xfe,0x98,0x9c,0x83,0x39,0x30,0x3,0x75,0xed,0x20,0x36,0xe8,0x2,0x4a,0x20,0x33,
- 0x87,0x24,0x4,0x11,0x80,0x36,0xbb,0xc1,0x39,0xca,0x71,0x33,0xce,0x43,0x1e,0xd6,
- 0xea,0x86,0x6f,0x70,0x86,0x48,0x48,0x81,0x41,0xe0,0x3,0x55,0x41,0x82,0x64,0x20,
- 0x28,0xba,0xc9,0x83,0x25,0x18,0x84,0x15,0xe8,0x83,0x29,0x8,0x3,0xa6,0x75,0x5c,
- 0x69,0xed,0x2,0x21,0x7d,0x54,0x2f,0x88,0x2,0xca,0x3d,0xd2,0xac,0xa5,0xbb,0xad,
- 0xe5,0xd8,0xcd,0x4d,0x50,0x9,0xd2,0x8a,0x9d,0xca,0x8a,0xaa,0x50,0xd9,0x9,0x2d,
- 0x5d,0xee,0x30,0x83,0xd3,0x4d,0x5d,0x36,0x48,0x55,0x22,0x78,0x2,0xa4,0x30,0x3,
- 0x41,0x8,0x2,0x42,0xa0,0x80,0x9c,0x14,0xe,0xbd,0xd1,0x39,0xc5,0x40,0x9e,0x71,
- 0xa0,0x2f,0xa9,0xc4,0x23,0x67,0x28,0x5,0xa,0x20,0x41,0x23,0x58,0x82,0x3f,0x20,
- 0xc,0x82,0x70,0x4,0x24,0x8,0x4,0x26,0x60,0x83,0x29,0x78,0x1,0x2f,0x70,0x5c,
- 0x25,0x84,0xde,0x20,0x8d,0xda,0x28,0x88,0x48,0x23,0xbd,0x5e,0xcb,0xcd,0x58,0x28,
- 0xe5,0x5a,0xee,0xfd,0xbe,0x45,0xc5,0x8a,0x78,0x42,0x96,0xf2,0xd,0xcc,0xaf,0x18,
- 0x5d,0x76,0x12,0x5d,0xa6,0x30,0x3,0x3d,0x20,0x81,0xfd,0xdb,0xc4,0xfb,0x4d,0x31,
- 0xaa,0x34,0x89,0x77,0xe8,0x89,0x22,0x9c,0x0,0x3e,0x28,0x2,0x23,0x50,0x82,0x25,
- 0xf0,0xc7,0x3a,0xa8,0x3,0x32,0xa8,0x30,0x2f,0xb8,0x2,0x2c,0x88,0x2,0x49,0xfd,
- 0x2,0xa8,0xd,0xd2,0xc1,0x19,0xd2,0x26,0x50,0xe2,0xe7,0xa3,0x3e,0x26,0xb6,0xfe,
- 0x5c,0x6b,0xcd,0xd8,0x25,0xd5,0xd8,0x6d,0x4d,0x50,0x9,0xee,0xc8,0x89,0x13,0x61,
- 0xd3,0x19,0x8f,0xa5,0xd0,0xe2,0x2d,0x5e,0x8a,0x43,0x50,0x2,0x52,0xc0,0x9a,0xaa,
- 0x14,0x28,0xb0,0x9a,0x45,0xe4,0xc8,0x89,0x69,0x70,0x85,0x9,0x80,0x4,0x81,0x45,
- 0x84,0x35,0x10,0x85,0x27,0xe0,0xb2,0x5e,0xc,0x2,0xc4,0x89,0x56,0x9,0xb6,0x62,
- 0x9,0x36,0x52,0x25,0x76,0x3e,0xe6,0x6b,0x62,0x3f,0xc6,0x60,0xeb,0x8b,0x62,0x29,
- 0x76,0x1,0x2a,0xee,0xe0,0x45,0x6d,0x4b,0xc4,0xca,0xe2,0x29,0xf1,0xe2,0xb3,0x55,
- 0x8a,0x27,0xd8,0x1,0x3f,0x30,0xd3,0x77,0xa8,0x6,0x22,0x29,0x63,0x33,0xb6,0xbd,
- 0x13,0x6b,0x11,0x67,0xa0,0x85,0x16,0x20,0x81,0x40,0x60,0xcd,0x2f,0x80,0x8,0xbc,
- 0xeb,0x82,0x5,0xc5,0x63,0x3c,0x36,0x62,0xe8,0x4d,0x3e,0x3e,0x76,0x62,0x27,0x86,
- 0x62,0x25,0x25,0xe4,0x25,0x35,0x64,0x20,0x45,0x64,0x66,0x54,0xe4,0x45,0xde,0x8e,
- 0x46,0x1e,0x5f,0xc6,0xab,0x8a,0x27,0xd8,0x82,0x2c,0xf0,0x3,0xc,0x78,0x85,0xff,
- 0x18,0xab,0x33,0x46,0xb1,0x42,0x5b,0x7,0xd7,0x92,0x7,0x59,0x68,0x3,0x25,0x40,
- 0x4,0x88,0xc4,0x82,0x68,0xf6,0x82,0x2f,0xb0,0x82,0x1e,0x8d,0xde,0x53,0x2e,0x62,
- 0x3d,0x5e,0x41,0x56,0x6,0x64,0x57,0x16,0x64,0x58,0x8e,0xe5,0x52,0x9b,0xe5,0x54,
- 0xbe,0xe2,0x5b,0xc6,0xe5,0x13,0xd6,0x2d,0xd0,0x79,0x12,0x38,0x38,0x4,0x3d,0xe0,
- 0x2,0x2e,0x10,0x83,0x3f,0xf8,0x86,0xa1,0x62,0x90,0xfa,0x9a,0x45,0x9c,0xfe,0x28,
- 0xb4,0x99,0xf0,0xb,0x5b,0x0,0x3,0x31,0xf0,0xae,0x2a,0x10,0x37,0x2c,0xf8,0x82,
- 0x2c,0x30,0xc7,0x5e,0xc4,0xe6,0x54,0xde,0xe3,0x25,0xee,0x66,0x40,0x7e,0xe5,0xcb,
- 0x8d,0xe5,0x71,0xb6,0xe2,0x44,0x76,0x94,0x73,0xc6,0x30,0xf2,0x98,0xbc,0x97,0x31,
- 0x16,0x38,0xd8,0x82,0x1d,0x90,0x83,0xed,0xf1,0x84,0x79,0xde,0xa1,0x7a,0xb6,0xe7,
- 0x4c,0x46,0x8e,0x13,0x33,0x7,0x7a,0x80,0x11,0x5c,0x68,0x81,0x41,0xf0,0x82,0xe,
- 0x12,0xd9,0x81,0x2e,0x68,0x6c,0xce,0xe6,0x23,0xde,0x66,0x85,0x86,0xbe,0x21,0xf0,
- 0xe6,0x6f,0x1e,0x64,0x29,0x86,0xe8,0x5a,0x9e,0x38,0x30,0x3b,0x67,0xaf,0xb0,0xe8,
- 0x64,0xc1,0x68,0x35,0x8,0x98,0x1e,0x68,0x84,0xf,0xd8,0x83,0x7,0xf0,0x4,0x79,
- 0xc8,0x86,0x90,0x76,0x61,0x63,0x1e,0xe,0xfa,0xd8,0x9b,0x6f,0x38,0x8,0x15,0xb8,
- 0x52,0x2c,0x8,0x83,0x81,0x7e,0x82,0x27,0xb8,0xe6,0x53,0x46,0xe8,0x9a,0xee,0xe3,
- 0x9b,0xce,0xe9,0x6f,0xe,0x67,0xba,0xeb,0xe9,0x22,0x96,0x68,0xce,0xa0,0x68,0x74,
- 0xbe,0xe8,0x98,0x1,0x30,0x32,0xa0,0x85,0x4d,0x50,0x84,0xc,0x90,0x82,0x4d,0x28,
- 0x87,0x78,0xd8,0xa1,0xf8,0x94,0xea,0x92,0xce,0x9,0xe5,0x82,0xd,0x75,0x90,0x87,
- 0x52,0x20,0x3,0x32,0x7a,0x5a,0x69,0x85,0x60,0x99,0xe,0xeb,0x55,0xb6,0xe9,0x3f,
- 0xbe,0xe9,0x86,0xde,0x69,0x59,0xee,0xda,0x29,0xa5,0xec,0xca,0x6e,0xeb,0xea,0x48,
- 0xd9,0xc9,0x3b,0x2,0xf1,0xcb,0x82,0x41,0x48,0x1,0xb9,0x26,0x87,0xfe,0x52,0x10,
- 0x3d,0x28,0x50,0x82,0xbc,0x66,0x1e,0x77,0xd0,0x5f,0xb7,0xea,0x6b,0x14,0xab,0x24,
- 0xcf,0x13,0x7,0x56,0xa8,0x80,0x3a,0x30,0xce,0x2f,0xb8,0xd2,0x26,0xb8,0xe3,0x53,
- 0xbe,0x5a,0xe5,0x7b,0xbe,0xdd,0x7e,0xec,0xdb,0x3c,0x6b,0x8d,0xdd,0xde,0xca,0x16,
- 0xee,0xe1,0xbe,0x6c,0x29,0xf1,0xaf,0xef,0xe8,0x54,0x3f,0x20,0x83,0x37,0xa0,0x5,
- 0x6a,0x10,0x7,0x5c,0xe0,0x2,0x28,0xd8,0x83,0x14,0x28,0x6,0x72,0x68,0x87,0x7a,
- 0xe8,0x13,0xd5,0x5e,0xed,0xe1,0xd8,0xce,0x77,0xf0,0xb,0x20,0x8a,0xed,0x1d,0x28,
- 0x83,0x3d,0x28,0x81,0x38,0x98,0x66,0x6c,0xce,0xed,0xe3,0xe3,0x6d,0x57,0xf6,0xed,
- 0xb3,0xd6,0xe0,0x71,0x1e,0x6e,0xcb,0x2e,0xee,0x5d,0x2e,0x83,0x1e,0xd,0x84,0x46,
- 0x40,0x82,0x5f,0x70,0xaf,0x6f,0x60,0x6,0x1a,0xf8,0xcf,0x1a,0x38,0x5,0xf7,0xba,
- 0x87,0x2d,0xd2,0x8b,0xed,0xae,0xc5,0xc8,0xc9,0x89,0xcc,0x79,0x9e,0x4e,0x90,0x80,
- 0x3a,0xc8,0x82,0x1c,0xf8,0x95,0xf3,0xc6,0x6d,0xb,0x56,0xef,0xf5,0xee,0x6d,0x18,
- 0x74,0x68,0x29,0x7e,0xef,0xc9,0x8e,0x6f,0xf9,0x6e,0xeb,0x9b,0xe9,0xe,0x2e,0xb,
- 0x84,0x3a,0xb0,0x83,0xd8,0x1,0xe,0x18,0x91,0x4,0x31,0xe0,0x99,0x36,0x70,0x93,
- 0x77,0x58,0x9f,0x2,0x37,0x70,0xe2,0x98,0x1c,0x15,0x3b,0x19,0x79,0xe8,0x4,0x90,
- 0xe3,0x83,0xf,0x38,0x1c,0x99,0x4e,0xef,0xe5,0xb3,0xf0,0x8b,0xb4,0xdc,0xdf,0xde,
- 0x70,0xe,0xee,0x70,0xf,0xff,0xf0,0xf0,0xe8,0x54,0xd,0xb5,0xfe,0x3,0x65,0xc0,
- 0x9a,0x83,0xf1,0x86,0x83,0x80,0x83,0x41,0x58,0x61,0xfe,0x1b,0x12,0xf8,0x30,0xf0,
- 0x6a,0x71,0xd,0xb4,0x12,0x90,0x4c,0xe8,0x1,0x31,0x18,0x4,0xfd,0xe4,0x71,0xa,
- 0xf7,0xf1,0xf5,0x6,0x72,0x8c,0x74,0xef,0xd,0x2e,0xf2,0x22,0xff,0x70,0x1,0xb,
- 0xf,0xa2,0x23,0x3,0x24,0x58,0x8b,0xd9,0xc8,0x89,0x7c,0xb0,0x86,0x69,0x78,0x3,
- 0x52,0xac,0x81,0x37,0x48,0x6,0x4b,0x49,0x18,0xd8,0x30,0x70,0xb8,0x52,0x31,0x3,
- 0xb2,0x86,0x37,0xc1,0xb7,0x1d,0xf0,0xd1,0x30,0xb7,0x58,0xb,0xbf,0xf0,0x4a,0x15,
- 0x72,0x34,0x4f,0xf3,0xf8,0x6e,0x6b,0xef,0x5,0x61,0xa2,0x6b,0x84,0xa6,0xfc,0x11,
- 0xd7,0x68,0x31,0x7b,0xc0,0x7,0x56,0x10,0x3,0x48,0x4c,0x81,0x52,0x60,0x6,0x84,
- 0x49,0xb1,0xed,0x6e,0x18,0x77,0xe3,0x87,0x62,0xd2,0x8b,0xbe,0x20,0x87,0x7f,0x9d,
- 0x3,0x6f,0x45,0x6f,0x31,0x57,0xf4,0x32,0xcf,0x70,0xad,0x75,0xf4,0x47,0x17,0x6e,
- 0xa,0x8d,0x8a,0x26,0xec,0xb6,0x35,0x98,0x3,0x30,0x28,0xc,0xac,0xc9,0x9,0xf7,
- 0x49,0x7,0x7b,0x38,0x7,0x6a,0x50,0xa6,0x24,0x18,0x4,0xa,0xc0,0x85,0x6f,0xb8,
- 0x6,0xce,0x8b,0xf1,0x2b,0xd4,0x7,0x16,0x89,0xb7,0xdc,0xf1,0x8b,0x64,0x70,0x4,
- 0x1c,0xc0,0x2c,0x25,0xb4,0x66,0x8b,0xe1,0xe3,0x20,0x50,0x3e,0x29,0xf8,0x71,0x20,
- 0x77,0xbb,0xb9,0xcb,0x3e,0xbb,0x63,0x52,0xe0,0xd6,0x5c,0x5b,0x57,0x77,0x5b,0x8e,
- 0x8,0x28,0x31,0xee,0xf8,0x8b,0xbf,0xb5,0xed,0x2,0x8a,0xfe,0x8b,0x2,0x3a,0x10,
- 0x83,0x1e,0x40,0x2,0x11,0x93,0x9d,0x86,0xca,0x7,0xc9,0x41,0x7,0x7d,0xc8,0x5,
- 0xc,0xe0,0x82,0x81,0xc6,0x81,0xea,0x8e,0x7,0xb8,0x70,0x8c,0x9b,0x40,0x43,0xb8,
- 0x2,0x92,0x86,0x9a,0x1c,0x22,0xa1,0x89,0x66,0x40,0x3,0x32,0x68,0xdb,0x2d,0x98,
- 0x83,0x5f,0xee,0x82,0xef,0xda,0x10,0x1b,0x60,0x2,0x48,0x99,0xbe,0x32,0x7f,0x65,
- 0x59,0xda,0xab,0x5a,0x32,0x1,0x7f,0xc9,0xa5,0x15,0xe0,0x0,0x94,0xe7,0x0,0xf8,
- 0x5e,0x77,0xca,0x9e,0xb8,0x75,0xa6,0x8e,0x94,0x15,0x84,0x6f,0x64,0x2,0x35,0x88,
- 0x82,0x42,0x20,0x4,0xeb,0xac,0x80,0x50,0x38,0xb7,0xd5,0x1a,0x92,0x6a,0x48,0x5,
- 0x2,0x18,0x4,0x41,0xa8,0xc6,0x68,0x28,0x87,0xfe,0x3b,0xb1,0xf3,0x49,0x78,0xd3,
- 0xb4,0x1b,0x34,0x14,0xd4,0x86,0xa,0x86,0x1e,0x38,0x4,0x8b,0xbf,0xf8,0x2c,0x70,
- 0x81,0xb3,0x3,0x2f,0x26,0x18,0xbb,0x8f,0x97,0x75,0x41,0xa6,0x25,0x5a,0x3a,0xb5,
- 0xb0,0x37,0x1,0xe,0x20,0xfb,0x95,0xe7,0xf0,0x96,0x77,0xf9,0xf,0x91,0x83,0x6,
- 0x15,0x5d,0xb0,0x78,0x82,0x2c,0x28,0x3,0x3a,0xc0,0x1f,0x7,0xae,0x81,0x40,0x20,
- 0xd,0x79,0xa8,0x1b,0x4c,0xe6,0x1a,0xdd,0x79,0x6,0x49,0xa0,0x1,0x31,0x50,0xf,
- 0x46,0xc0,0x7b,0x5b,0x41,0x31,0x9d,0x63,0xf8,0x7b,0x6e,0x28,0x93,0xc0,0x87,0x5b,
- 0x68,0x81,0x46,0x20,0x81,0x5f,0xfe,0x0,0x2f,0xf8,0x7a,0x1b,0x60,0xbe,0xe3,0xe3,
- 0x7a,0x71,0xf7,0xfa,0xaf,0x17,0x7b,0x46,0x29,0x7b,0xfe,0xb2,0x67,0x79,0xb4,0x2f,
- 0xe7,0x88,0x8,0x83,0x68,0x1e,0xba,0x63,0x5b,0x40,0x65,0x73,0x83,0x33,0xb0,0x1,
- 0x17,0x80,0x83,0x39,0x48,0x4c,0x71,0xf0,0x91,0x6e,0xb0,0xbd,0x94,0xc0,0x86,0xc5,
- 0x88,0x8d,0xbe,0xa5,0x81,0x49,0x8,0x81,0x1b,0xd8,0x84,0x98,0x80,0x8f,0xd7,0xd8,
- 0x22,0x33,0x1c,0xe,0x7a,0x35,0xe6,0xe3,0x38,0x7,0x79,0xb8,0x85,0x4,0x20,0x83,
- 0x22,0x48,0x82,0x23,0x80,0x2,0xde,0x6e,0x2,0x1e,0xe0,0x81,0x50,0x3,0xf9,0x6f,
- 0xd6,0xfc,0xcd,0xef,0x7c,0xcf,0x3f,0x7b,0xd0,0xf,0x7d,0x88,0xf8,0x52,0xad,0x2e,
- 0x3,0x76,0x45,0x36,0x41,0x10,0x84,0x31,0x0,0x62,0x39,0x50,0x2,0x1c,0x8,0xd6,
- 0xf7,0x40,0xc3,0x33,0x94,0x71,0x7f,0xa0,0x21,0x59,0x40,0x82,0x22,0x50,0x88,0x19,
- 0x10,0x5,0x1f,0xd1,0x86,0xc4,0x50,0x8c,0xe2,0x28,0xc8,0xc,0x84,0x4f,0xa7,0x7,
- 0x8,0x7f,0x2,0xdf,0x7d,0x93,0xc7,0x8a,0x2,0x17,0x28,0x86,0x6c,0x1c,0x61,0x22,
- 0x44,0x8,0x13,0x1e,0x2f,0x5e,0x40,0x19,0x62,0xf1,0x22,0xc6,0x1c,0x1a,0x35,0xda,
- 0x30,0xe1,0xf1,0x23,0x87,0x90,0x22,0x45,0x96,0x28,0x39,0xe6,0x24,0xca,0x94,0x2a,
- 0x57,0xb2,0x4c,0xa9,0xe6,0x25,0x4c,0x35,0x61,0xae,0x5c,0xf1,0xe2,0x65,0xc,0x1c,
- 0x33,0x69,0xb6,0xac,0x11,0x94,0x85,0x8e,0xa5,0x23,0x45,0xc0,0xd4,0x12,0x87,0xf,
- 0x9f,0xbe,0x6b,0x2,0xf9,0x9,0xf4,0x67,0x4f,0x5f,0x53,0x7f,0x50,0xd7,0xe9,0xfb,
- 0xa6,0x4a,0x6,0x10,0x27,0x4e,0x1e,0x94,0x92,0xfe,0x7,0x15,0x9b,0x53,0x74,0xf6,
- 0xc6,0xda,0x6b,0xca,0x8f,0x69,0xd4,0xb4,0xfe,0xf6,0x35,0xdd,0xa7,0xef,0x9d,0x37,
- 0x7c,0xa0,0x26,0xb0,0xb8,0xe3,0xc5,0x61,0x96,0x2c,0x4d,0xae,0x4c,0xb4,0x81,0xf1,
- 0xef,0x90,0x8d,0x1a,0x3f,0x82,0x1c,0x69,0xb8,0x64,0x89,0x96,0x8a,0x17,0xab,0x8c,
- 0x9,0x33,0x8c,0xcd,0x33,0x5e,0x5e,0x5a,0xa9,0xc,0x7,0x4e,0x8d,0xcb,0x22,0x2,
- 0xfd,0xfa,0x76,0xb4,0x1b,0xbe,0xa5,0x68,0x9d,0xea,0xd3,0xb7,0x4e,0x20,0xb6,0xd3,
- 0xa5,0xf1,0x71,0xaa,0x3b,0x83,0xf,0x99,0x53,0xd3,0xf4,0x79,0xeb,0x6,0x55,0x2d,
- 0xee,0xb4,0xeb,0x4e,0xb,0xdc,0x2d,0x50,0xdf,0x39,0x7c,0x95,0xc4,0x24,0x91,0x82,
- 0xd7,0xca,0xde,0xbe,0x80,0x33,0xa,0x26,0x6c,0xc2,0x30,0x74,0xc4,0x8c,0xa7,0x2b,
- 0x76,0xc,0xf3,0xa4,0x1a,0x2f,0x67,0xb6,0x9f,0x9,0xd3,0x5,0x4e,0x16,0x32,0x3d,
- 0x1a,0x9,0xc3,0xa7,0xe,0xe9,0xd4,0xb3,0xa3,0xa5,0x9a,0xf6,0x77,0x9a,0xad,0xbf,
- 0x77,0xef,0xd4,0x71,0x9a,0x0,0xa9,0x48,0x8a,0x16,0xaf,0xbc,0xd1,0x2e,0xed,0x4f,
- 0xfd,0x59,0xec,0xdd,0x96,0x9b,0x7b,0xbc,0xe5,0xe3,0xe,0x3b,0xe8,0xc0,0x55,0x9f,
- 0x18,0x35,0x30,0xc1,0x44,0x10,0x7b,0x55,0x61,0x43,0x45,0xcb,0x59,0x24,0x58,0xe,
- 0xce,0x41,0x37,0x92,0x7,0xd2,0xb1,0xf4,0x5,0x88,0x21,0x82,0x68,0xdd,0x4b,0xd4,
- 0x9d,0x64,0xc5,0x13,0x4f,0x94,0x11,0xc6,0x19,0x6c,0xf4,0x51,0x45,0x1c,0x7b,0x14,
- 0xb1,0x6,0x12,0x8c,0x24,0x23,0xf,0x7a,0xfe,0x66,0xa9,0xf7,0x5b,0x69,0x3,0xa,
- 0x44,0x56,0x38,0xfa,0x38,0x73,0x49,0x1b,0x3d,0x3c,0x31,0x8,0x5,0xa4,0x78,0x16,
- 0xd7,0x3d,0xf5,0xcc,0x53,0xf,0x3c,0x68,0xd9,0x23,0x16,0x81,0x69,0xe5,0xc3,0xce,
- 0x38,0xf6,0xbc,0x83,0xf,0x33,0x99,0x18,0xa0,0x47,0x8,0x1f,0xb0,0xf1,0x9c,0x17,
- 0x47,0x98,0x79,0xc4,0x45,0x18,0x62,0x48,0xd8,0x86,0x22,0x79,0xf0,0xe6,0x9b,0x2d,
- 0x89,0x28,0x22,0x89,0x6a,0x98,0x38,0x86,0x15,0x3b,0x65,0xf1,0x85,0x17,0x71,0xf4,
- 0x31,0x5,0x10,0x2b,0x40,0xd2,0x42,0x1e,0xce,0x18,0xe5,0x23,0x80,0x4d,0xf5,0xe8,
- 0xa3,0x53,0x63,0xf9,0xa3,0xd,0x3d,0xe4,0x5c,0xc2,0xc8,0x13,0x61,0x70,0x31,0x1,
- 0x28,0x9e,0x5d,0x93,0x8d,0x93,0x4f,0x32,0x15,0x4e,0x96,0x65,0x55,0xd9,0x14,0x59,
- 0x53,0x82,0x56,0x4c,0x26,0x34,0x14,0xb1,0x87,0xd,0x7b,0xe4,0x10,0xc2,0x17,0x52,
- 0x98,0x99,0xa6,0x9a,0x1b,0xb1,0xd9,0x26,0x7,0x70,0xc6,0xf9,0xe1,0x9c,0x20,0xde,
- 0xd9,0x52,0x9e,0x73,0x3c,0x61,0x85,0x17,0x7c,0x1,0x1,0x84,0x22,0x13,0x60,0xe2,
- 0xc,0x35,0xf8,0xd0,0x33,0xaa,0x80,0x8c,0xea,0x33,0xd6,0x3a,0xf7,0xcc,0x13,0x4f,
- 0x39,0x9a,0x98,0xc1,0x3,0x14,0x52,0xc8,0xe0,0x9,0x8e,0xf8,0xb4,0xe3,0x24,0x37,
- 0xe6,0xac,0x13,0xe,0x59,0xd0,0xfe,0x98,0x25,0x3a,0x6c,0xe9,0x83,0x8f,0x33,0x60,
- 0xf8,0xf1,0xc1,0x1e,0x2b,0x7c,0x31,0x48,0x11,0xb2,0xa2,0x79,0x61,0xad,0x83,0x15,
- 0xd6,0xa6,0xae,0x1e,0xc8,0xd9,0xeb,0xfe,0x17,0xbf,0xb2,0x64,0xc5,0x16,0x87,0xc,
- 0x62,0xc5,0x11,0x5e,0xdc,0x71,0xc6,0xa5,0x98,0x7c,0xa3,0x8e,0x3a,0xf4,0xdc,0x3,
- 0x6d,0x8f,0x69,0x2d,0xba,0x4f,0x3d,0xf5,0xb4,0x23,0x4f,0x34,0x94,0x70,0x10,0x47,
- 0x4,0x93,0x28,0xd1,0x46,0xb8,0x16,0x33,0xe5,0x4e,0xa9,0xea,0x3a,0xc5,0xee,0x7f,
- 0xf7,0x9c,0x97,0xcc,0x1b,0x32,0xdc,0x20,0xc7,0xd,0x44,0x64,0xa1,0x2f,0xad,0xfd,
- 0xde,0xa,0xb0,0xae,0x3,0xf7,0x6a,0xf0,0xc1,0x84,0xd0,0x41,0x44,0x17,0x74,0xc0,
- 0xe1,0xc7,0x12,0x9e,0x9c,0xe7,0xcd,0x3a,0xfc,0x98,0xa3,0xd6,0xa2,0xfe,0x51,0xbd,
- 0xa8,0x3f,0xe6,0xdc,0x83,0x8f,0x38,0xc8,0x6c,0xd1,0x84,0xd,0x6c,0xa8,0x1,0x47,
- 0xf,0x79,0x34,0x7b,0x1e,0x54,0x7,0xa6,0xab,0xee,0xb4,0xd6,0x8,0x74,0xf,0x53,
- 0xe7,0x31,0x13,0x49,0xcd,0x5c,0x74,0x71,0xc3,0x99,0x3d,0xd7,0xfa,0xf3,0x86,0x1,
- 0xb,0x4d,0xf0,0xd0,0x26,0x86,0xc1,0x3,0x1b,0x77,0xd,0xb2,0x46,0xb,0x28,0x9c,
- 0x62,0xde,0x3b,0x65,0xa5,0xc3,0x54,0x3e,0x4f,0x91,0x55,0x35,0x6e,0x19,0x67,0xed,
- 0x4f,0x38,0xde,0x8,0xa3,0x41,0xa,0x74,0x34,0xb1,0x48,0x14,0x56,0xe8,0x51,0xc7,
- 0x1f,0xcc,0x1c,0x15,0xe,0x3a,0xfe,0xb8,0x93,0x8e,0xcb,0x3c,0xda,0xb6,0x1b,0x3f,
- 0xbb,0x81,0xf6,0x4d,0x26,0x14,0xe4,0x5b,0xd1,0xac,0xfc,0xba,0xb0,0x3b,0xef,0xbb,
- 0xf3,0xd,0x9d,0xdf,0xbc,0x2,0x1e,0x38,0x75,0x61,0x4c,0x31,0xc5,0x15,0x72,0xe8,
- 0xd1,0x43,0x1b,0xa8,0xc8,0x73,0xfe,0xde,0x3b,0x7,0xba,0xc3,0x72,0xa9,0xd3,0x52,
- 0x1e,0x95,0x3b,0x52,0x39,0x7b,0xcf,0x3d,0xf4,0xbc,0xe5,0xb,0x6,0x7e,0xe8,0xb1,
- 0x3,0x21,0x2e,0x10,0xa2,0x2,0x17,0x62,0xd0,0x20,0x89,0x32,0xef,0xe8,0x13,0xce,
- 0x7f,0xf0,0xd4,0xd3,0xba,0x3f,0xde,0xbf,0xa5,0x3a,0x36,0x52,0xbf,0x4b,0x4d,0x29,
- 0x13,0x44,0x10,0x7,0x14,0x72,0x17,0x98,0x1c,0xf4,0xae,0x77,0xbf,0x33,0x4c,0xf0,
- 0x84,0x37,0x3c,0x10,0x55,0xc6,0xa,0x63,0x88,0x89,0x65,0x2e,0xf3,0xc0,0x16,0xf5,
- 0xa1,0xf,0x3c,0xc8,0x82,0x12,0x70,0xb0,0x8a,0x70,0x75,0x3,0x1d,0xd3,0x9b,0xde,
- 0xe4,0xaa,0x66,0xb9,0x7c,0xfc,0x87,0x1f,0x4f,0xd1,0x7,0x3d,0x52,0x28,0x1f,0x62,
- 0x88,0x81,0xb,0x5c,0xe8,0x89,0x15,0xb4,0x10,0x84,0x30,0x44,0xe1,0xb,0x45,0x90,
- 0xc1,0x1b,0x88,0x81,0x8f,0xc6,0xf1,0x3,0x1e,0x51,0xd2,0x98,0x8,0xfd,0x41,0xc2,
- 0x14,0xaa,0x63,0x5a,0xa9,0x33,0x87,0xd6,0x8e,0x62,0x95,0x9,0xe4,0x4c,0xa,0x39,
- 0xd0,0x81,0xd,0x6c,0xa0,0x91,0x9c,0x11,0x81,0x8,0x2e,0x98,0x41,0xc,0x62,0x70,
- 0x40,0xe,0xc1,0x29,0x3,0x5d,0xf8,0x22,0x18,0xbb,0x50,0x30,0x96,0x90,0xc8,0xa,
- 0x62,0x10,0x3,0x9f,0x6c,0xe2,0x5,0x2b,0xd4,0x20,0xd,0x3b,0x21,0x44,0x21,0xaa,
- 0x70,0x3c,0xf,0xc8,0x21,0x10,0x38,0xa8,0x5,0x3e,0xf8,0x53,0x2a,0x51,0x89,0x70,
- 0x40,0x8b,0xb2,0x47,0x3e,0xce,0x62,0xae,0xf8,0xac,0xe6,0x17,0x8d,0x90,0xc1,0x20,
- 0xc6,0x50,0x86,0x20,0xa0,0xfe,0x24,0xc,0x34,0xec,0x42,0x16,0x52,0xf0,0x86,0xf2,
- 0x4c,0xe3,0x1c,0xa6,0x31,0xc7,0x59,0x54,0xe3,0xbe,0x3f,0x2,0x92,0x84,0x3c,0xf2,
- 0xa4,0x7b,0x7a,0xf4,0xe,0x5e,0x28,0xe0,0xd,0x45,0xd0,0x41,0xc,0x46,0xe0,0x84,
- 0x17,0xe4,0x80,0x8,0x35,0xd8,0x81,0x11,0x6e,0x50,0x82,0x13,0x9c,0x20,0x6,0x88,
- 0xb9,0x25,0x62,0xba,0x98,0x81,0x5d,0x5a,0x20,0x8c,0x61,0x6c,0x49,0x19,0xb7,0xb0,
- 0x5,0x3e,0x61,0x1,0xb,0x67,0x18,0x83,0x19,0x76,0x90,0x86,0x43,0x94,0xa1,0x9,
- 0x72,0x4c,0x9e,0x11,0x90,0x80,0x47,0x7c,0x58,0x63,0x8f,0x81,0x64,0x8a,0xe5,0xa2,
- 0xd2,0xa3,0xb1,0x4,0xd2,0x87,0xfe,0x40,0x47,0x90,0xf0,0x81,0xc,0x4c,0x50,0x0,
- 0x11,0x84,0x80,0x50,0x10,0x7c,0x35,0x6,0x47,0x8e,0xe1,0xb,0x70,0x20,0x43,0xb,
- 0x7e,0x61,0x1e,0x4b,0x66,0x6d,0x6a,0xeb,0x70,0x9f,0x6d,0xb6,0xc9,0x4d,0x50,0x46,
- 0xc5,0x37,0xee,0x11,0x88,0x31,0xec,0x40,0x17,0x43,0x38,0xe1,0x4,0x53,0xe0,0x80,
- 0x2b,0x61,0x29,0x4b,0x5a,0x8e,0x0,0x97,0xb8,0xd4,0xa5,0x5,0x22,0xea,0x4b,0x30,
- 0xde,0xc9,0x8c,0x68,0x54,0x63,0x77,0xac,0x20,0x8,0x33,0xd4,0xc0,0xa,0x84,0xd8,
- 0x83,0xb,0xe0,0x40,0x2,0x24,0x0,0xe3,0x28,0xea,0x10,0x22,0x59,0x48,0x18,0x20,
- 0x45,0xf9,0xa7,0x6a,0x80,0xcc,0x5a,0x26,0xe5,0x83,0xf,0x65,0x60,0xa2,0x5,0x34,
- 0xa8,0x1,0x1d,0xe4,0xb0,0x1,0x3a,0xa8,0x13,0x32,0x61,0x18,0x83,0xa,0xc4,0x50,
- 0x87,0x4,0xe0,0xe2,0xfe,0x28,0xee,0xeb,0x8d,0x6a,0x38,0xb9,0xb6,0x2a,0xa5,0x26,
- 0x3e,0xcc,0xc0,0xc4,0x4,0x42,0x0,0x84,0x17,0x80,0xa0,0xa,0xad,0x2c,0x42,0x11,
- 0x6e,0xd0,0x81,0x11,0x9c,0xc0,0xa1,0xf,0x7d,0x13,0x2f,0x25,0x3a,0xd1,0x2e,0xdc,
- 0xe9,0xb,0x59,0x18,0xd6,0x3a,0x6d,0x12,0x86,0x20,0x10,0xa1,0xc,0x82,0x10,0x82,
- 0x8,0xe0,0x80,0x88,0x16,0xfc,0x61,0x18,0xf8,0xf8,0x86,0xca,0x4,0xe2,0xe,0x95,
- 0xf2,0xe3,0x62,0x2c,0x2d,0x8d,0xe4,0xf2,0x21,0x58,0xd1,0x50,0xe5,0xae,0xdf,0xc0,
- 0x84,0x1,0x2,0x81,0x8,0x11,0x8,0xe1,0x68,0x3c,0xb5,0x2,0x88,0x7c,0x1a,0x85,
- 0x2e,0xd4,0x40,0x9,0x43,0x7d,0x85,0x79,0xf8,0x73,0xbf,0x7f,0xa,0x51,0xb0,0x91,
- 0xb3,0x1a,0x6e,0xf6,0xc1,0x1b,0xf7,0x74,0xe3,0x3c,0xa5,0xc0,0x80,0x14,0xa0,0x0,
- 0x4,0x8,0xd8,0x40,0x7,0x37,0x78,0xed,0xa,0x3a,0xe0,0xd5,0xaf,0x7a,0x20,0xac,
- 0xbd,0x1c,0xeb,0xdf,0x42,0xd4,0x5,0x2b,0x64,0xa1,0x81,0x69,0x65,0xc3,0x7,0xc2,
- 0x40,0x8,0x11,0xec,0x60,0xe,0x28,0xc8,0x84,0x32,0x8e,0x82,0xf,0xb8,0x61,0x52,
- 0x75,0x9e,0xec,0x6b,0xf7,0x78,0x64,0x4d,0xd1,0xf0,0x3,0x1b,0xef,0x9a,0x86,0x3c,
- 0x18,0xd1,0x83,0x39,0xec,0x20,0xb,0x82,0xb0,0x2,0x11,0x8,0x41,0x84,0xca,0x44,
- 0xd6,0xa7,0x44,0x0,0x4f,0xa,0x1a,0x91,0x80,0x52,0x68,0x4a,0xb3,0x60,0xa9,0x1c,
- 0xa3,0x9a,0x92,0x9a,0x75,0xc0,0x87,0x3d,0xd3,0xc0,0x7,0x2e,0x30,0x20,0x2,0xd5,
- 0x1e,0xcb,0x6,0xfe,0x33,0x70,0xc1,0x6b,0x37,0xb0,0x82,0xd9,0x96,0x4,0xa2,0x62,
- 0x9d,0x68,0x6e,0x43,0xd4,0xc0,0xcb,0x58,0x81,0x45,0x36,0x30,0x4,0xf,0x36,0x80,
- 0x88,0x3a,0xe0,0xe0,0x11,0xc9,0xb8,0x2f,0x7f,0xfc,0x1,0xd,0x7e,0x80,0x70,0x2c,
- 0xb7,0xb1,0xd8,0x6f,0xf6,0x68,0x8f,0xec,0xa9,0x87,0x2a,0xfa,0xc0,0xee,0x23,0x7a,
- 0xa0,0x4,0x3d,0xc0,0x21,0xbc,0x74,0x50,0x41,0x19,0x98,0x90,0x97,0x31,0x42,0xc6,
- 0xb,0x43,0x38,0x2f,0x1c,0x52,0x90,0x8,0x1a,0x94,0xc2,0x19,0x38,0xda,0xec,0xe3,
- 0x76,0xf4,0x9b,0xdc,0xc0,0x87,0xbe,0xa2,0xed,0xd1,0x7d,0x85,0xf1,0x87,0x9,0x24,
- 0x61,0x5,0x5a,0x34,0xc1,0xa,0x6e,0xa0,0x2,0x15,0xc,0x98,0xc0,0x6,0xbe,0x2d,
- 0x82,0x15,0xa8,0xdb,0x93,0xe4,0xe4,0x9,0x70,0x18,0xc3,0x19,0x1e,0x7c,0x5,0x45,
- 0x24,0xa2,0x2,0x97,0x70,0x6,0x52,0xac,0x81,0xba,0xbd,0x6e,0x43,0xc4,0xfe,0xf1,
- 0xeb,0xb4,0x44,0x5c,0x42,0x7e,0x94,0x26,0x2e,0x99,0x40,0xc1,0x1c,0xd6,0xa0,0x2,
- 0x42,0x84,0x81,0x8,0x74,0xb0,0x42,0x11,0xc0,0xb3,0xa7,0x93,0x38,0x52,0x32,0x8b,
- 0x70,0x1,0x13,0x26,0x21,0x2,0x2e,0x50,0xe0,0x13,0x68,0xfe,0xc6,0x3b,0xa8,0xbb,
- 0x52,0xa9,0x10,0x48,0xb4,0x6a,0xe9,0x86,0xfb,0x66,0xa,0xa,0x2,0x88,0x60,0x5,
- 0x2b,0x80,0xb2,0x94,0xa9,0x4c,0xe0,0x12,0x5c,0x79,0xac,0x64,0xd5,0x72,0x88,0xbc,
- 0x10,0x6,0x2b,0x98,0x61,0xd,0xc3,0xea,0x13,0x10,0xf6,0xc0,0x5,0x3,0x84,0x22,
- 0x1a,0x5e,0xfe,0x41,0xd7,0x58,0x10,0xe4,0xe6,0x37,0xff,0x48,0xc4,0xa2,0x62,0x8a,
- 0x72,0x43,0x81,0xe7,0x1d,0x78,0x74,0x3,0x41,0x60,0xab,0xd2,0x66,0x4c,0x63,0x9b,
- 0xb8,0xe1,0x8,0x7b,0x8,0x83,0xb,0xe4,0xc0,0x4,0x38,0x24,0x40,0x13,0x76,0xc5,
- 0x47,0x38,0xe,0x94,0xa8,0x21,0xe7,0xc6,0x37,0xeb,0x68,0xaa,0xa3,0xba,0x11,0x17,
- 0x6a,0x98,0xa2,0x5,0x36,0xe3,0x9d,0xa,0x6e,0x50,0xe5,0x5b,0x76,0xa8,0xc0,0x60,
- 0xcd,0x40,0x44,0xb1,0x2c,0x46,0x5f,0x2d,0xb0,0x57,0x47,0x70,0x3,0x8a,0x5c,0x3d,
- 0x8,0x37,0xdc,0xc1,0x6,0x80,0x90,0xc1,0x27,0xe4,0x21,0xf0,0x38,0x53,0x6f,0xc4,
- 0xd9,0x3,0x61,0x69,0x22,0xfd,0x2c,0x94,0x92,0x85,0x1d,0x64,0x1,0xcb,0x96,0xc4,
- 0x61,0xa,0x14,0x34,0x42,0xf,0x8d,0x75,0xa4,0x23,0xcd,0x9a,0x17,0xbb,0xcd,0x3b,
- 0xa,0x18,0x95,0x8c,0x1a,0xbf,0x30,0x87,0xa,0xd8,0x8,0x29,0x63,0xd9,0x86,0x90,
- 0x39,0xab,0x2e,0xb2,0x64,0x2f,0x85,0x47,0xb1,0xc5,0x5,0x68,0x20,0x2,0x29,0x7c,
- 0x60,0x5,0x19,0xe0,0x0,0x6d,0xdf,0xbd,0x4b,0x78,0x1f,0x78,0xde,0xf5,0x26,0x98,
- 0xaa,0x85,0x60,0x6,0x33,0x6c,0x21,0xb,0x4c,0x90,0x82,0x22,0x8a,0xb0,0x9,0x71,
- 0x8,0xdc,0x62,0x83,0xf4,0xc7,0x36,0xb2,0x37,0x67,0xf7,0xbc,0xb7,0x29,0x91,0x1b,
- 0x8b,0xc3,0xc5,0x82,0x8e,0xb7,0xe0,0x83,0xdc,0x60,0xa8,0x83,0xab,0x1b,0x5c,0x4c,
- 0x47,0xf2,0x76,0xe3,0x5f,0xc,0x51,0x14,0x3c,0x6e,0x93,0x62,0x16,0x33,0x8,0x35,
- 0xa8,0xfe,0x43,0x1d,0x2a,0x90,0x5c,0x6f,0x88,0x65,0x1b,0xbd,0xa1,0x5f,0xaf,0x47,
- 0x1c,0x33,0x7a,0xdc,0x15,0x18,0x48,0xa0,0xc1,0x3,0xce,0x40,0x6a,0x87,0xea,0x6a,
- 0xe7,0x3b,0x8f,0xb7,0x2f,0x7f,0x4e,0xb0,0x66,0x7f,0x7,0xe,0x4f,0xc8,0x8b,0x1f,
- 0x26,0x90,0x8a,0x89,0x21,0xa5,0x49,0xf5,0xb8,0xc7,0xd4,0x4,0x82,0x49,0x6e,0x70,
- 0xe3,0x49,0x97,0x5f,0xcf,0xd5,0xc7,0x52,0xcd,0xb7,0x54,0xe5,0x1b,0xac,0xd0,0x40,
- 0xf,0x12,0x91,0x19,0x39,0xb8,0x0,0xb,0x18,0x2f,0x7b,0x16,0xc0,0x8,0xa2,0x8e,
- 0xab,0xdd,0xb,0xc5,0xf4,0x2,0x11,0xd6,0x90,0x82,0x3a,0x5c,0x0,0x19,0xfc,0x89,
- 0x74,0x54,0x16,0xee,0xb2,0x52,0xb9,0x83,0x1f,0x1d,0xbb,0x47,0x55,0x92,0x81,0x4,
- 0x19,0x7c,0x20,0xe,0x10,0xc8,0xb9,0xe1,0xf,0xdf,0xf3,0xb3,0x2b,0x5e,0x44,0x6b,
- 0xa5,0x43,0x19,0x74,0xe6,0x7,0x44,0x50,0xc0,0x69,0x48,0xe9,0x46,0xcc,0xda,0xe1,
- 0xbd,0x77,0x74,0xa3,0x1b,0x51,0xeb,0x94,0xe7,0x2f,0x56,0x9a,0xc1,0x1e,0xdc,0xc3,
- 0xfa,0x78,0x6,0x3e,0x64,0xd1,0x82,0x1d,0x1c,0x62,0xd,0x35,0x58,0xe4,0x10,0x54,
- 0x1d,0x86,0x2f,0xc0,0xbe,0xb,0xc7,0x9e,0xfd,0x6e,0x9d,0x9d,0xda,0x61,0x81,0x17,
- 0x6c,0xc0,0x20,0x64,0x81,0x11,0xbc,0xc1,0x5,0x94,0x7,0x7a,0xc,0xc8,0x7a,0x8c,
- 0x4a,0xcb,0x9c,0xc5,0xe5,0x65,0xc3,0xbb,0x8,0x83,0xf,0xdc,0x80,0x3,0x34,0x54,
- 0x2e,0xe9,0x5c,0xf4,0xf1,0x9c,0x5,0x3c,0xc8,0x44,0x55,0x1f,0x88,0x1c,0x9b,0x1b,
- 0xfe,0x74,0x1,0x11,0xf0,0x81,0x18,0xbc,0xc1,0x1f,0xc8,0xc3,0x7d,0x5,0x49,0xf6,
- 0x68,0x83,0x49,0x1d,0x5,0x6d,0x58,0x4c,0xc7,0x78,0x9e,0x54,0x70,0xd3,0xd4,0xad,
- 0x83,0x6d,0x14,0x84,0x2c,0x80,0xc1,0xe,0x50,0x42,0xd,0x34,0x16,0x13,0xdc,0x9b,
- 0x17,0xd4,0xd0,0x17,0xf1,0x16,0xb1,0x78,0x41,0x3a,0xed,0x56,0x5e,0xf4,0xd6,0x17,
- 0x5,0x41,0x17,0xa8,0xd1,0x6,0xc8,0x1,0x7e,0x2c,0xc1,0x2,0x1e,0xc5,0x6c,0xe8,
- 0x43,0xfe,0xe0,0x5d,0x53,0x7c,0x50,0x9,0xd1,0x83,0x67,0xfc,0x2,0x1,0x48,0xc1,
- 0xe0,0x91,0x5a,0x6d,0x75,0xa0,0xe1,0xc5,0xdb,0x83,0x30,0x41,0xe2,0x55,0xdf,0x17,
- 0x35,0x4c,0xe,0x78,0x81,0x1c,0xe4,0xc7,0x2f,0x9c,0x87,0xf9,0xb5,0x19,0x3a,0x1c,
- 0x5,0x35,0xc,0x43,0x2e,0xf4,0x82,0xe9,0xbc,0x8b,0x36,0x30,0xd7,0x3a,0xec,0x51,
- 0x9,0x45,0x49,0x61,0xc9,0x3,0x2e,0x54,0xc0,0x12,0x98,0xc1,0x8b,0xc9,0x81,0x1c,
- 0x4,0x81,0x22,0xa8,0xdd,0x11,0x36,0x50,0xc8,0x41,0x52,0x13,0xe6,0x85,0x15,0x3c,
- 0x61,0x10,0xb0,0x1,0xf,0x7c,0x80,0x1c,0xb8,0x52,0x20,0x20,0x41,0x51,0xe5,0x91,
- 0x69,0x4c,0x9a,0xba,0x70,0x4f,0xa3,0xe4,0xda,0x69,0x94,0x96,0x5c,0x3c,0x80,0xe,
- 0x74,0x8,0x7,0xa2,0x61,0x4,0xa8,0xe1,0x1a,0x86,0x91,0x8,0x6,0xa0,0x17,0xb4,
- 0x8a,0x1a,0x28,0xb,0xd3,0xe9,0x83,0xd4,0xb8,0x3,0x38,0xd8,0xc3,0x37,0x98,0xc2,
- 0x5,0x60,0x80,0xc,0x4c,0x0,0xd,0x80,0x82,0x32,0x94,0x6,0xfc,0xd8,0x3,0xfe,
- 0xae,0xa5,0x4b,0xf,0xc1,0xc3,0xc5,0x7c,0xc3,0x1e,0x4a,0x40,0x1d,0x4,0x2,0x11,
- 0x84,0x81,0x1b,0xb8,0x41,0xe,0x4,0x1,0xce,0x84,0x51,0x3,0x45,0xa1,0x4d,0x40,
- 0x61,0x5e,0x88,0x81,0x30,0x35,0xe1,0x17,0x81,0xd,0x1b,0x5c,0x81,0x27,0xbe,0x90,
- 0x6,0x30,0x82,0x5d,0x65,0xd8,0x86,0xb5,0x8e,0xf1,0xd5,0x83,0xf7,0xd8,0x3,0x3b,
- 0x38,0xdc,0x36,0xb8,0x85,0x37,0xa8,0x3,0x31,0x10,0xc0,0xd,0x7c,0x80,0x2e,0xa1,
- 0x61,0x6,0x44,0xc0,0x2c,0x46,0xd4,0x1a,0xb2,0xa1,0x2d,0x56,0x9f,0x3,0xb9,0x41,
- 0x13,0xec,0x1,0x11,0x28,0x1,0x2b,0x98,0x47,0x73,0x55,0x53,0x35,0xd8,0xc1,0x1b,
- 0x88,0xc1,0xd,0x48,0x1,0x20,0xb0,0x0,0x6,0x80,0xc1,0x30,0x0,0x87,0x58,0x38,
- 0x5c,0x4a,0x4d,0xdd,0x79,0x0,0x43,0x5,0xf4,0x0,0x19,0x64,0x81,0x1b,0x44,0x41,
- 0x18,0xe4,0x80,0x23,0x4d,0xe1,0x44,0x65,0xa2,0x1a,0x41,0x61,0x17,0x70,0xc1,0x25,
- 0xe6,0xc5,0x83,0x34,0x41,0x1c,0x44,0x51,0xe,0x1c,0x81,0xd,0x21,0xc2,0x1b,0x80,
- 0x1,0x32,0xe0,0xc3,0x34,0x2c,0x85,0x5a,0x48,0x8e,0xa3,0x98,0x45,0xc7,0xdc,0x63,
- 0x3e,0x3a,0x5c,0xb5,0xbc,0x8b,0x32,0x10,0x0,0xb,0x74,0x40,0x2c,0xee,0x9c,0x41,
- 0x66,0x65,0xbc,0x9d,0x9,0x57,0x1e,0x81,0xa9,0x1,0x4e,0x16,0xe0,0x54,0x19,0x94,
- 0x81,0x1e,0xa0,0x40,0x32,0xbc,0xc3,0x3e,0x44,0x89,0x3d,0x9c,0xc3,0x37,0x6c,0x2,
- 0xd,0x88,0x81,0x14,0xa4,0x56,0xb7,0x88,0xc1,0x12,0xd8,0x41,0xb3,0x84,0xfe,0x3,
- 0x49,0xa6,0xce,0x6e,0x9c,0x6,0x55,0x78,0x6,0x30,0xb4,0x1,0x9,0x20,0x42,0x8b,
- 0x85,0xc8,0xb1,0xb5,0xa1,0x3a,0x5,0x81,0x1a,0x35,0xc1,0x17,0x25,0x64,0x42,0x1e,
- 0x1,0xf,0x5c,0x1,0xf,0x34,0x41,0x13,0x98,0x9,0x11,0xdc,0x50,0x25,0xc0,0x9f,
- 0x7c,0xf4,0xd3,0x40,0x6c,0x12,0x60,0xa9,0x4e,0xfd,0x74,0xcf,0x3e,0xe0,0x63,0x3e,
- 0xfa,0x3,0x37,0x78,0x8c,0x3c,0x20,0xc3,0x3,0x38,0xc0,0x40,0xc6,0x1b,0x6b,0xc6,
- 0x1b,0x4,0xbc,0x66,0x57,0x9e,0x89,0xa9,0x99,0x1a,0x26,0xb2,0xda,0x21,0x30,0x2,
- 0x35,0xf8,0x22,0x3c,0x68,0xcf,0x2e,0x18,0x1,0x17,0x48,0x41,0x13,0x40,0x1,0x4d,
- 0x78,0x41,0x78,0xa0,0x0,0x1e,0x4d,0x8b,0xc3,0x15,0x88,0x54,0xd8,0xc6,0x7d,0xfd,
- 0x65,0x1d,0x20,0x82,0xa,0xb8,0xc1,0x5a,0xcd,0xe6,0x44,0x25,0xa6,0x64,0x4a,0x66,
- 0x6c,0xc6,0xe6,0x75,0x1e,0x41,0x13,0x78,0x4b,0x25,0x18,0x65,0x69,0x7c,0x1b,0x6f,
- 0x58,0xcf,0x1f,0x35,0x45,0xa,0xad,0xc,0x3e,0xda,0x83,0xd6,0x74,0x8f,0x3c,0xfc,
- 0xc2,0x3,0x58,0x40,0x17,0x81,0x40,0x6b,0xce,0xe7,0x6b,0x42,0x40,0x76,0x7a,0x25,
- 0x75,0xfa,0x52,0x16,0xc0,0x81,0x10,0x58,0x41,0x19,0xa4,0x1,0x26,0x20,0x45,0x3a,
- 0xc0,0x43,0x3a,0xd8,0x3,0x3e,0xf4,0x4f,0xec,0x15,0x4b,0x15,0x54,0x1,0x16,0x74,
- 0xc1,0x16,0xa0,0x80,0x26,0x14,0x51,0xae,0x15,0x48,0x69,0x9c,0xc3,0x79,0xc,0x43,
- 0x1e,0xe0,0x99,0x18,0xd0,0x81,0xb,0xb8,0x81,0x4d,0xe6,0xe7,0x17,0xfe,0x59,0xe7,
- 0x76,0x66,0xe7,0x10,0x9c,0x9,0x13,0x60,0x67,0x13,0xdc,0x80,0x8,0xf0,0x98,0x51,
- 0x46,0x9a,0x68,0xf9,0x53,0xb4,0x88,0x8a,0x3f,0xa0,0x62,0x68,0x3a,0x4a,0x5f,0x1d,
- 0x85,0x3c,0x80,0x1,0x17,0x58,0xe5,0x19,0xca,0xe7,0x7c,0xb2,0x66,0x7d,0xde,0x27,
- 0x88,0x86,0xd1,0x79,0x8d,0x97,0x15,0xac,0x41,0x80,0x76,0xc3,0xe3,0xa4,0x43,0x38,
- 0xe0,0x3,0x26,0x28,0xc1,0x9e,0x60,0xc1,0x15,0x2c,0xe8,0x15,0x44,0x81,0x50,0xe5,
- 0x81,0x38,0xbc,0x85,0xc1,0xb9,0x4b,0x5c,0xa8,0x43,0x32,0xe4,0x1,0xe,0x2c,0x41,
- 0x20,0x14,0x1,0x13,0x1c,0x9a,0x17,0xc,0x69,0x88,0x5e,0xa7,0x9a,0xde,0xe7,0x11,
- 0xc4,0xe5,0x1a,0x72,0xa7,0x9,0x9c,0xc1,0xd,0x88,0x81,0xf,0x4c,0xe4,0x51,0xf6,
- 0xc6,0x7b,0x8d,0x56,0x54,0xd4,0x63,0x2a,0x16,0x1f,0x3f,0xe4,0x11,0x3e,0xa8,0xc2,
- 0x4,0x88,0xc0,0x7,0xa4,0xe1,0x8f,0x2,0x29,0x3,0x30,0xc0,0x7d,0x32,0x66,0x2d,
- 0x8e,0x15,0x11,0x7c,0x22,0x88,0x88,0x1,0x23,0xc8,0x83,0x37,0xa0,0x5c,0x3a,0x6c,
- 0x9d,0x26,0xf4,0xc0,0x16,0x84,0x41,0x31,0x1d,0x4f,0x15,0x10,0x67,0x1d,0x60,0xe9,
- 0xe,0xfd,0xd3,0x58,0x8c,0x9b,0x38,0x64,0x68,0x1d,0x74,0x57,0x17,0xe4,0xc0,0x19,
- 0xe8,0xc0,0x99,0xa2,0xa9,0x9a,0x62,0x27,0x9b,0x4a,0x41,0x15,0xad,0xa1,0x64,0x5e,
- 0x81,0x7f,0x89,0x80,0x2,0xca,0x93,0x35,0x50,0xcf,0xb7,0xad,0x5,0x6e,0xf0,0x29,
- 0x34,0xc2,0x20,0x3e,0xe8,0xc2,0x3,0xf0,0xc1,0x3,0x68,0x95,0xfe,0xf4,0x1d,0x6a,
- 0x44,0x25,0xaa,0xa2,0x66,0x27,0xa3,0x82,0xe0,0x44,0xb1,0xa1,0x1a,0x94,0xe8,0x77,
- 0x44,0x82,0x57,0xac,0xe,0x3f,0xb8,0xf,0x2a,0x54,0xc0,0x16,0x88,0x9d,0x1c,0x7d,
- 0x6a,0x16,0xb4,0x40,0x26,0x9c,0xc7,0x5a,0x30,0xc5,0x5a,0x56,0xc5,0xa9,0x6e,0xd7,
- 0xe,0xc0,0x41,0x8,0x48,0xc1,0x1e,0xd0,0xb,0x9a,0xa6,0xe3,0x9a,0xce,0x2a,0xad,
- 0x12,0x81,0xad,0xf2,0xa4,0x3,0x74,0x8b,0x8,0x90,0x1,0x12,0x24,0x83,0x11,0x8d,
- 0x45,0x53,0x5,0x6b,0xc7,0xd4,0xa8,0x3d,0xa4,0xd0,0xbb,0xe4,0xc2,0x3,0x74,0x40,
- 0x7,0xdc,0x40,0x8,0x74,0xc0,0xb2,0xfe,0xa8,0x3,0x38,0x80,0xb3,0x2e,0x6a,0xb4,
- 0x8e,0x15,0x13,0xa8,0x41,0x14,0xb6,0x69,0x16,0x2c,0xc1,0x33,0x4c,0x8b,0xd4,0xe9,
- 0x3,0x2f,0xa0,0x41,0x1d,0xc,0xcb,0x4c,0xd0,0x84,0x14,0x88,0x81,0x71,0x22,0x5,
- 0x3d,0x9c,0x85,0x75,0x79,0x83,0x37,0xc8,0x43,0x1e,0xd4,0x1,0x19,0xd4,0xc0,0x24,
- 0xdc,0x40,0x13,0xb4,0xea,0x1e,0xb4,0xe9,0xbc,0xd6,0x2b,0x9a,0x64,0xe7,0xbd,0x12,
- 0x1,0x4e,0x9e,0x28,0xd8,0xbc,0xc0,0x15,0xf0,0xab,0x12,0x44,0xc2,0xc7,0x5a,0x83,
- 0x58,0xec,0x15,0x52,0xee,0x69,0xc1,0xee,0xc3,0x26,0xdd,0x55,0x2f,0x2c,0x6c,0x6,
- 0x38,0x80,0xb,0x3c,0x6c,0xc4,0xb6,0xe6,0xc4,0x52,0x6c,0xa2,0x5a,0x6c,0xb4,0x32,
- 0xaa,0x14,0x7c,0xc1,0xd,0x84,0xc1,0x64,0x16,0x41,0x3,0x10,0x83,0xfb,0x0,0xdf,
- 0x96,0x74,0x42,0x1b,0xcc,0xc1,0xb7,0xda,0x84,0x14,0x70,0xfe,0x81,0xf,0xfc,0xc1,
- 0x7d,0xbd,0xc3,0x8e,0x54,0x43,0xd7,0x65,0x82,0x4a,0x3e,0x1,0x1d,0x30,0x41,0x21,
- 0x84,0x19,0x14,0xac,0xc0,0xc,0x48,0x1,0xc6,0x46,0x6b,0xbd,0x5a,0x4,0xd0,0x56,
- 0x11,0x17,0xd4,0x80,0xd1,0x71,0xe7,0xb,0x1c,0x4f,0x9,0x9c,0xa9,0x8,0xe8,0x47,
- 0x35,0xbc,0xf,0xc1,0x4d,0x9d,0x8e,0xfc,0x86,0x72,0xf5,0x2,0x6,0x3c,0x40,0x9,
- 0x44,0x14,0x7,0xcc,0x80,0xa1,0x4a,0xec,0xc4,0x3a,0xab,0x85,0x84,0x6d,0xb4,0x8e,
- 0x6d,0x1c,0x9e,0xc1,0xc,0x84,0x0,0x24,0x28,0x89,0x3e,0x58,0xc3,0xda,0x12,0xc4,
- 0x23,0x14,0x9,0x19,0xf8,0x81,0x1f,0xc8,0x0,0xd,0xd8,0xc1,0x32,0x96,0xe2,0x6e,
- 0x6e,0x9,0x35,0x64,0x42,0x2,0x4,0x42,0xd,0x10,0x1,0x62,0x3e,0xe6,0xd1,0x6,
- 0x90,0x71,0xa8,0x2e,0x63,0xb2,0x69,0x6c,0xc6,0x65,0x12,0x8,0xad,0x83,0x9c,0xa8,
- 0xd,0x4c,0xc4,0xb,0x48,0x11,0x11,0xd0,0x80,0x4,0xbc,0x82,0xfb,0x4,0x9,0x3a,
- 0x9c,0x46,0xca,0x7d,0x93,0x3d,0x60,0x3,0x3d,0x9c,0xc7,0x37,0xfc,0x2,0x6,0x54,
- 0xe5,0xce,0x81,0x0,0x8,0x94,0x6e,0x44,0x75,0xad,0xfc,0xa2,0xee,0x72,0x38,0x6f,
- 0xb4,0xde,0x40,0xe,0x4,0xe7,0xc,0x14,0xc1,0x1b,0xa8,0xc3,0xc7,0x7a,0x83,0xfb,
- 0x58,0x83,0x3a,0x88,0xc3,0x2a,0xe0,0x0,0xa,0xb4,0x80,0x6,0xfc,0x81,0x29,0x3c,
- 0x83,0x37,0x58,0x52,0xd4,0x98,0xd0,0x5d,0x7d,0xc2,0xd7,0x4d,0x40,0x22,0x15,0x13,
- 0x4d,0x2c,0x6f,0x9b,0xda,0x6f,0x63,0x42,0x6f,0x57,0xfe,0xe,0xc1,0xbd,0xd6,0x0,
- 0x17,0xc,0xe1,0xf5,0xf6,0x45,0xe,0xdc,0x80,0x11,0x5c,0x0,0xc,0xc4,0x23,0x7f,
- 0xe8,0xa9,0xa2,0xd8,0x83,0x35,0xa0,0x10,0x35,0xa,0x3,0x5d,0x74,0xc0,0x7,0xd4,
- 0x70,0x6,0xb8,0x2f,0xfc,0xca,0xef,0xfc,0x26,0x6a,0xea,0x6a,0xf0,0x1a,0x12,0x81,
- 0x13,0xcd,0x80,0xe,0xa4,0xe8,0x4,0xc4,0x82,0x67,0x64,0xa1,0x82,0xe0,0x83,0x3c,
- 0xec,0x21,0x2e,0x10,0x3,0x3,0x3,0x16,0xf8,0xa9,0xc6,0x33,0x94,0xc2,0x5,0x2c,
- 0x81,0xfd,0x65,0x87,0x5,0x1f,0xad,0x64,0xba,0xa9,0xf,0xf,0x21,0x7,0x73,0xa5,
- 0x7,0xdf,0x2b,0x17,0x10,0xc1,0x11,0x8c,0x70,0xf6,0x6a,0x44,0x15,0x22,0x1,0x33,
- 0xa8,0x3,0x5c,0xac,0xc5,0x3e,0xbc,0xf1,0x1b,0x37,0xce,0xe5,0x36,0xc3,0x51,0xa8,
- 0xef,0x3,0xec,0xd2,0x7,0x84,0x40,0x98,0xb8,0xef,0xfb,0xda,0x96,0x5,0xe8,0x70,
- 0xd7,0x26,0xea,0x1,0xf4,0x70,0x17,0x13,0x1,0x9f,0xcc,0x80,0x9,0x74,0x4b,0x11,
- 0x50,0x40,0x32,0x18,0x55,0x8f,0xf4,0x23,0x52,0x70,0x26,0xd3,0xf6,0x88,0x9a,0x1d,
- 0xa8,0x6,0x90,0x81,0xfd,0x95,0x8f,0x17,0xf0,0x0,0x27,0x5f,0x67,0x17,0x6f,0x70,
- 0x6c,0x2e,0x47,0xe,0xb4,0x56,0xe,0x4c,0x2f,0x11,0x24,0xc1,0x10,0xd8,0xc0,0x54,
- 0x1,0x81,0x14,0xb5,0x12,0x17,0x18,0x1,0x5,0xfc,0x1,0x78,0xca,0x7,0x1c,0x1b,
- 0xac,0x96,0x6c,0xc9,0x2f,0x18,0x0,0xb,0x58,0x0,0x8,0x78,0xc0,0x6,0xe8,0xf1,
- 0x7,0x80,0xc0,0x9,0x40,0xc0,0x2e,0x1d,0x64,0xfe,0xfc,0x2,0xb2,0x3,0x1c,0x80,
- 0x32,0x13,0xb2,0xf,0x8f,0x97,0x8d,0x99,0x80,0xab,0xf2,0x81,0xb2,0x84,0x8b,0x37,
- 0x94,0x5,0x6d,0xd0,0xee,0xfb,0x58,0x83,0xdb,0x50,0xc5,0x39,0x60,0x98,0x2a,0x90,
- 0xc0,0x16,0xd4,0x40,0x11,0x98,0xe0,0x43,0xc6,0x6a,0x10,0x7c,0xf2,0x9b,0x92,0x28,
- 0x60,0x8c,0x32,0x29,0xe7,0xc,0xfe,0x42,0x51,0x14,0xb5,0xf2,0xd,0x6c,0x80,0x8a,
- 0xd2,0x40,0x80,0xe2,0x43,0x35,0x34,0xce,0x7,0x1,0xc9,0x96,0xf4,0x2,0x55,0x96,
- 0x0,0x4,0xbc,0x89,0x1e,0x87,0x89,0x5,0x40,0x80,0x5,0x14,0xa4,0x31,0xff,0x31,
- 0x32,0x2b,0xf3,0x20,0xd7,0xef,0x27,0x5b,0x1,0x13,0xc,0x1,0x14,0x44,0x91,0x6b,
- 0xc9,0x40,0xb,0x4,0xdc,0x37,0xcc,0x6e,0xf9,0x42,0x45,0xba,0x44,0x8d,0x54,0xb0,
- 0x25,0x35,0xe4,0x82,0x1,0x88,0x40,0x19,0xa8,0xc0,0x83,0x6c,0x0,0x37,0x5e,0xe7,
- 0x87,0xa2,0xb3,0x17,0x87,0xf2,0x72,0xf4,0x57,0x9,0x13,0xc1,0xd,0x24,0x1,0x14,
- 0xb1,0xb2,0xe,0x94,0xf0,0xd,0x70,0x80,0x9,0x7c,0x40,0x11,0x68,0x80,0x2a,0x44,
- 0x72,0xae,0x55,0xcf,0x34,0xf8,0x73,0x7,0xc4,0xc1,0x0,0xbc,0x40,0x9,0xe4,0x31,
- 0x30,0x43,0x6c,0x56,0x26,0x34,0x32,0x27,0xf3,0x32,0x3b,0x74,0x17,0x57,0x46,0x44,
- 0xc7,0xf3,0xa,0x30,0x1a,0xa,0x84,0x2,0x35,0x34,0x83,0x3d,0xd8,0x1d,0x8c,0xaa,
- 0x7,0x3d,0x5c,0xc3,0x5d,0xb1,0x82,0xf,0x18,0x1,0x1d,0x18,0xdb,0x18,0xb8,0x80,
- 0x4d,0x6c,0x80,0x27,0xef,0x56,0x65,0x54,0xfe,0x11,0x5c,0xc3,0x75,0xd8,0xde,0x67,
- 0xbf,0xf4,0x85,0x6b,0x55,0xd1,0xd,0xe8,0x80,0xe,0xd8,0xf4,0x6b,0xdd,0xc0,0x82,
- 0x46,0x40,0x8,0xf8,0x41,0x1,0xd8,0x2,0x0,0xfb,0x1a,0x3e,0xf0,0x42,0x3,0xb0,
- 0xc0,0x9,0x4,0xc0,0x30,0x2b,0x75,0x98,0xd4,0xf0,0x7,0x34,0x35,0x6b,0x3e,0x35,
- 0x43,0xe7,0x40,0x60,0x5c,0xb6,0x65,0xa3,0xf3,0x78,0xbd,0xa4,0x9,0xd8,0x80,0x5d,
- 0x10,0x81,0x1f,0x28,0xc1,0x5,0xe4,0xc1,0x30,0x58,0x92,0x7c,0x6c,0x92,0x4c,0xe1,
- 0xa8,0x33,0x7c,0x42,0xb,0xa4,0x40,0x16,0x4,0x1,0x37,0x6e,0xc0,0x19,0x34,0xc1,
- 0x6,0xec,0x41,0x18,0xaf,0x21,0x44,0xc7,0x75,0x5c,0xcf,0x75,0x76,0xd6,0xca,0x5e,
- 0x67,0xaf,0x6b,0xf5,0xb5,0x5e,0xf,0xf7,0x6b,0xe5,0x40,0x15,0xbc,0x0,0x16,0xdc,
- 0xc0,0x4,0x2c,0x41,0x2,0xd8,0xc2,0x69,0xbf,0x3,0x3a,0x44,0xf7,0x3b,0xd4,0x82,
- 0x4,0xc8,0x80,0x5,0x30,0x36,0x2,0x8c,0xc0,0x2f,0x6f,0x0,0x64,0xd7,0xb0,0x64,
- 0xc7,0x1b,0x32,0x2f,0x0,0x43,0xdf,0x34,0x79,0x5f,0xb6,0x85,0x58,0x48,0x15,0xf1,
- 0xcb,0x4d,0x97,0x70,0x11,0x64,0x81,0x8,0x4c,0x80,0x28,0xec,0x82,0xc0,0x29,0x97,
- 0xc0,0x9,0x1c,0x32,0x94,0x42,0x1d,0x90,0x40,0xa,0x74,0x57,0x4b,0x7f,0xf1,0x79,
- 0x2f,0xc7,0x7d,0x8a,0x32,0x45,0xff,0x17,0xef,0xc,0xf7,0xc,0x10,0xb8,0xb,0x74,
- 0x44,0x94,0x89,0x80,0xc,0xf0,0xae,0x2b,0x34,0x8b,0x51,0x3d,0x83,0x2a,0x50,0x0,
- 0xa1,0xde,0x70,0x2f,0xd7,0x56,0xa1,0xfe,0x16,0xf3,0x77,0x1f,0xb3,0xfc,0x2e,0x80,
- 0x87,0x8b,0x37,0x2,0x20,0xc0,0x70,0xf,0xb7,0x65,0xff,0xb7,0x89,0x5f,0xc4,0x19,
- 0xc,0x41,0x13,0xb8,0xc1,0x19,0x70,0xb7,0x8,0x44,0xc2,0x27,0xc4,0x82,0x30,0x20,
- 0x83,0x30,0xd0,0x82,0x2b,0x34,0x42,0x20,0x18,0x41,0xa,0x38,0x2e,0x1c,0x40,0xf4,
- 0x17,0xe7,0xcd,0x89,0x5f,0x44,0x80,0x2f,0xc7,0x15,0x1d,0xb8,0x91,0xb,0xb1,0xe,
- 0x1c,0xb8,0xa7,0x2d,0xb9,0xa7,0xb9,0x0,0xb,0xa8,0xa8,0x8,0x3c,0x0,0x24,0xb4,
- 0x2,0x31,0x10,0x43,0x2a,0x48,0x2,0x1,0x8,0x64,0xc0,0x9c,0x21,0x56,0x46,0x94,
- 0x41,0x4e,0xb6,0xe,0x7f,0xf8,0x2,0x84,0xb8,0x88,0x8f,0xb8,0x5e,0x7,0xf9,0x89,
- 0xdb,0x4,0x9a,0x34,0x81,0x4d,0x14,0x81,0x12,0x20,0xc1,0x1,0x6b,0x80,0x6,0xd0,
- 0x40,0xa,0x50,0xc0,0x8e,0x3b,0x2e,0x5c,0xff,0x38,0x90,0xa3,0xf9,0x90,0x3,0x46,
- 0x91,0x1f,0x39,0xa0,0x33,0xf9,0x47,0x2c,0x39,0xb,0xb0,0x80,0x8,0x44,0xf9,0x31,
- 0x12,0x80,0x31,0x6a,0x79,0xc0,0xc0,0xef,0x7c,0x2,0xb2,0x98,0x93,0xf9,0x81,0x9b,
- 0xb9,0x46,0xa0,0xf9,0x79,0x6f,0xc0,0x11,0x80,0x9c,0x76,0x7c,0x41,0xa,0xd0,0x80,
- 0xa7,0x9f,0x51,0xb,0xc1,0x1,0x1f,0xa8,0x1,0x13,0xdc,0x80,0xb,0xfc,0xa4,0x9e,
- 0xb,0x90,0xa5,0xaf,0x73,0xad,0x0,0xba,0xab,0x33,0xf9,0xba,0x95,0x4,0x64,0x3f,
- 0x40,0xa1,0x1b,0xfa,0xa1,0x3f,0x40,0x86,0x13,0x64,0x42,0x73,0x2d,0xa4,0x7f,0xb8,
- 0xa4,0x4f,0x3a,0x89,0x97,0xf8,0xfe,0xaa,0xff,0x45,0x13,0x58,0xb6,0xaa,0x79,0x41,
- 0xd6,0xf2,0x81,0xb,0x61,0xd5,0x6b,0xc5,0xa5,0x46,0xe8,0x80,0x70,0xd6,0x44,0x89,
- 0xea,0xf9,0xb0,0x8b,0x72,0xab,0xbb,0xba,0x92,0xc3,0xfa,0x80,0x8d,0x0,0xb7,0xbb,
- 0x9b,0xe,0x30,0x6c,0xd,0xe3,0x7a,0x6c,0x11,0xa4,0x7,0x9a,0x6e,0x87,0x7f,0xb8,
- 0x32,0x87,0xf8,0x0,0x10,0x2e,0xb0,0xeb,0xb5,0xb0,0x57,0xbb,0x45,0xb8,0xc1,0x10,
- 0x6c,0x80,0xb,0xb0,0xb9,0x76,0x7c,0xc0,0x6,0x14,0x87,0x14,0xd8,0xd8,0xc,0x4,
- 0xa7,0xd,0x5c,0x30,0xae,0x4e,0xfb,0x8f,0xc3,0xfb,0x5f,0xd4,0xca,0x9f,0x7,0xba,
- 0xb6,0x6f,0x3b,0xb7,0x8f,0x0,0x9c,0x94,0x0,0x42,0x1b,0x24,0xc3,0xea,0xfa,0xae,
- 0x83,0x79,0x98,0xa3,0xfb,0x1,0xc,0x0,0xc6,0x7b,0x9a,0x91,0x7,0x7b,0xbf,0xa8,
- 0x89,0x85,0x9c,0x3a,0x9b,0x37,0xc1,0xee,0xe8,0xc0,0x76,0x94,0x89,0x99,0x77,0x44,
- 0x14,0xd1,0x4,0xee,0x50,0xbb,0xa5,0xf7,0x4b,0x1,0xf1,0xe,0xb6,0xcf,0x40,0xc2,
- 0xc7,0x7a,0xbb,0x39,0x7c,0x9,0x0,0xc1,0x2e,0xd9,0x52,0x4,0x10,0x24,0xaf,0x3f,
- 0xb5,0x3,0x78,0x38,0x43,0x33,0x34,0xc6,0xaf,0xbb,0xc6,0x23,0xf9,0x7a,0x77,0x3c,
- 0x86,0x58,0xc8,0x4f,0x36,0x41,0x89,0x62,0x67,0x3c,0x73,0x32,0x4d,0x34,0xc1,0xa,
- 0xe8,0x35,0x14,0x54,0x3d,0x14,0xa0,0x3a,0xcb,0xa3,0xb9,0xcb,0xbf,0xfc,0xc1,0x1f,
- 0xf9,0xcc,0xaf,0xc0,0x7,0x3c,0x94,0xd,0xec,0x7c,0x49,0x14,0xa4,0xd,0xf0,0x3c,
- 0xc5,0x3f,0x35,0xd0,0x7,0xfe,0xfd,0xc5,0x63,0x7c,0xcc,0x23,0xbd,0xc7,0x5b,0xba,
- 0x3a,0x5b,0x44,0x12,0xd4,0x7d,0xa5,0x13,0xbc,0xde,0x8,0x6,0xd7,0xef,0x7d,0x91,
- 0x7f,0x3d,0xd8,0x77,0x37,0xe0,0x77,0x37,0x2,0x45,0x9f,0x56,0x82,0xb7,0xcf,0xaf,
- 0x3d,0xdb,0xb7,0xfd,0x0,0xbc,0x3d,0xdc,0xb,0xc6,0xaa,0xbb,0xf4,0x8d,0x99,0x32,
- 0x5c,0xa3,0x32,0xde,0xf,0x90,0x9a,0xf0,0x3d,0xd7,0xcb,0xfc,0xd7,0x77,0xf7,0x2f,
- 0xf,0x74,0x98,0x84,0xc0,0x6,0x70,0x37,0x64,0x87,0x4,0x97,0x6b,0xb8,0x53,0x1f,
- 0xbe,0x78,0x27,0xbe,0xe2,0xcf,0x7c,0xcc,0x63,0xbb,0xb,0xe0,0xbd,0x6e,0x57,0x66,
- 0x11,0xd4,0x80,0x38,0x53,0x3e,0xde,0xbb,0x3c,0xb6,0xfb,0xfd,0xe6,0x43,0xf6,0x2f,
- 0x8b,0x80,0xe7,0xf,0x74,0xe8,0xb,0xbe,0xe1,0x7d,0x79,0xda,0x57,0x3c,0xe2,0xb,
- 0xfd,0xd0,0x13,0xbd,0xb6,0xb7,0x3e,0xb6,0x37,0x7e,0xbf,0xc4,0xbe,0xec,0x63,0x55,
- 0x56,0x39,0x3f,0xf5,0x6f,0x44,0xd7,0x1b,0xb9,0xee,0x6b,0x7b,0xe0,0x77,0xbe,0xe7,
- 0x7,0x3e,0x64,0xf,0x3f,0xf1,0x73,0x78,0x78,0x5b,0x7c,0xd0,0x27,0xbf,0xf2,0xc3,
- 0xba,0x99,0xa7,0xff,0x88,0xcf,0x40,0xf5,0xab,0x49,0x5f,0xf7,0x75,0x15,0x61,0x95,
- 0x4c,0xb7,0x3f,0xf5,0x5f,0x91,0xfa,0xc7,0x7c,0xc2,0x7b,0x3f,0xbe,0xeb,0x3f,0x64,
- 0x47,0x3c,0xf8,0x17,0x3f,0x40,0x38,0x70,0xb0,0x80,0x60,0xc1,0x5,0x7,0x10,0x26,
- 0x1c,0xb0,0x90,0xe1,0x80,0x15,0xf,0x21,0x3e,0x9c,0x31,0x91,0x62,0x45,0x8b,0x2b,
- 0x5c,0xe4,0xd0,0xb8,0xfe,0x91,0x63,0x47,0x17,0x33,0x74,0x80,0x74,0x31,0xd2,0xc5,
- 0xd,0x93,0x27,0x6f,0x74,0x54,0xb9,0x52,0x25,0x49,0x97,0x1f,0x75,0xc4,0x94,0xa9,
- 0x23,0x62,0xcd,0x88,0x1f,0x70,0xe6,0xd4,0xb9,0x13,0x67,0x87,0xe,0x19,0x80,0x66,
- 0xb0,0x30,0xd4,0x42,0x4,0xa3,0x11,0x86,0xa,0x54,0xaa,0xd4,0xa0,0xc1,0x84,0xa,
- 0x1b,0x2e,0xb4,0x29,0xd1,0x62,0x55,0x8a,0x18,0x59,0xb6,0xc,0x69,0x63,0x86,0x8d,
- 0x99,0x19,0xb3,0x86,0xd,0xfb,0x92,0x24,0xc8,0x99,0x31,0xa7,0xda,0xe4,0xb9,0x33,
- 0x68,0x50,0xa2,0x16,0x20,0xc4,0x95,0x5b,0xf4,0xed,0x52,0xa6,0x4d,0xf,0x3e,0x3d,
- 0x10,0xb5,0x61,0xc4,0x91,0x37,0x3e,0xce,0x58,0x21,0x98,0xf0,0x60,0xc3,0x82,0x57,
- 0xe8,0xc8,0xa1,0x98,0xf1,0x62,0xc7,0x8c,0x43,0xce,0x88,0xd1,0xb5,0xeb,0xd9,0x99,
- 0x1a,0x33,0x66,0xce,0xa1,0x99,0xf3,0x63,0xc7,0x33,0x3e,0x86,0x6,0x1d,0x13,0x64,
- 0x69,0x9a,0x69,0x6f,0xae,0x58,0x8b,0xb3,0x2d,0x8,0x10,0x6f,0xe5,0xce,0xad,0x6b,
- 0x77,0x60,0xd3,0x3,0x79,0x11,0xe,0xd8,0xcb,0x77,0x21,0x88,0x12,0x25,0x3e,0x6c,
- 0x50,0x21,0x42,0xc5,0x60,0x13,0x33,0x8e,0x27,0x47,0xbe,0xfc,0xb8,0x57,0xe7,0x3a,
- 0x9e,0x47,0x27,0x3d,0x31,0x64,0xf5,0x98,0x8e,0x31,0x8b,0xd6,0xe,0x9a,0xbb,0x8b,
- 0x98,0xd2,0x95,0x2b,0x2f,0xb1,0x62,0x7c,0x79,0xf2,0x1f,0x80,0xa7,0x47,0xbf,0x5e,
- 0xbd,0x87,0xe,0xee,0xe1,0x7b,0x68,0x3b,0x5f,0xe8,0x5b,0xb8,0x72,0x19,0xe4,0xd7,
- 0xbf,0xff,0x29,0xfe,0x82,0x3,0xfe,0x75,0xe3,0x6d,0x80,0x5,0x6,0x10,0xc0,0x37,
- 0xf,0x3e,0x60,0x21,0x4,0x15,0x42,0x58,0xc1,0x84,0x7,0x21,0x8c,0x50,0x42,0x1b,
- 0x28,0xac,0xd0,0xc2,0xb,0xa7,0xb3,0xc8,0xb2,0xc,0xad,0xaa,0xea,0xc2,0xa,0x25,
- 0x84,0xf0,0xb7,0x11,0x49,0x2c,0xd1,0x44,0x12,0x3d,0x48,0x51,0xc5,0x14,0xe9,0x6b,
- 0xeb,0x28,0xa3,0xe0,0xda,0x4f,0x46,0xfe,0xfe,0x43,0xc0,0x46,0x4,0x4,0x2c,0x90,
- 0xa1,0x0,0x74,0x7a,0xe8,0x3,0x7,0x43,0xc,0x52,0xc8,0x21,0x27,0x9a,0xaa,0x43,
- 0xd4,0xa6,0x1a,0x32,0xc8,0x13,0x99,0x6c,0x72,0xc5,0x15,0x5b,0xcc,0xe0,0x45,0x18,
- 0x2d,0x98,0xd1,0xca,0x84,0x6e,0xc4,0x31,0x47,0x1,0xb8,0xc,0x20,0x80,0x1b,0x36,
- 0xf8,0xb1,0x44,0x25,0xc9,0x24,0x12,0xb1,0x9a,0x8e,0x44,0xb2,0xa6,0x32,0x23,0x6c,
- 0xf2,0xc4,0x27,0x55,0x8c,0x92,0xbe,0x29,0xa9,0xac,0xd2,0x4a,0x1a,0x11,0xba,0x31,
- 0xc7,0x2,0x5,0xf0,0xd2,0x4b,0x6,0x37,0xe0,0xa0,0x84,0x11,0x4e,0xf0,0x8d,0x83,
- 0x43,0x11,0x4d,0x54,0x51,0x36,0x1f,0x2c,0xd2,0xa6,0x34,0xd5,0x84,0x48,0x48,0x45,
- 0x11,0x75,0xd3,0x44,0x39,0x5b,0xb4,0x4f,0xd3,0xba,0xee,0xd4,0x4f,0x2f,0x1b,0xb7,
- 0xe4,0xb2,0x4f,0x0,0x0,0x8,0x40,0x85,0xd,0x56,0xe0,0x60,0x4,0x10,0xa,0x2d,
- 0x81,0xd2,0x57,0xf,0x65,0xd4,0x84,0x48,0x69,0x4d,0x6b,0xd2,0x57,0x2d,0x2d,0x11,
- 0x53,0xfa,0x36,0xdd,0x54,0xa0,0x4e,0x19,0xd0,0x6b,0x37,0x1,0x45,0xed,0x92,0xd4,
- 0x0,0x46,0x6f,0x12,0x74,0x84,0x55,0xd,0x85,0x95,0x52,0x59,0x6b,0x8d,0x36,0xa2,
- 0x5b,0x29,0xcd,0x95,0xc4,0x5d,0xe7,0xeb,0xd5,0x3e,0xa5,0xee,0x14,0x36,0xb7,0x50,
- 0x45,0xf5,0x33,0x0,0x41,0x5f,0x28,0xc1,0x3,0xd7,0x2c,0x70,0xd5,0xd9,0x45,0x19,
- 0x95,0xd6,0x5d,0x6a,0x15,0x65,0x12,0x4e,0x16,0xb1,0x75,0x4b,0x5b,0xa2,0xb8,0x9d,
- 0xd1,0xdb,0x6f,0x79,0x2b,0xb6,0x58,0x2f,0x5f,0x78,0x61,0x4,0x73,0x33,0xf0,0xe9,
- 0x83,0x75,0x11,0x8e,0x35,0x44,0x77,0xa5,0x4d,0x38,0x51,0x79,0xe7,0xad,0xd7,0xde,
- 0xa4,0x94,0xb2,0x80,0x36,0x7,0x3c,0xdd,0xf7,0xa9,0x7e,0xfd,0x15,0x75,0xa1,0x0,
- 0x2,0x2,0x0,0x3b,
-
-};
-
-static const unsigned char qt_resource_name[] = {
- // images
- 0x0,0x6,
- 0x7,0x3,0x7d,0xc3,
- 0x0,0x69,
- 0x0,0x6d,0x0,0x61,0x0,0x67,0x0,0x65,0x0,0x73,
- // resources
- 0x0,0x9,
- 0xa,0x6c,0x78,0x43,
- 0x0,0x72,
- 0x0,0x65,0x0,0x73,0x0,0x6f,0x0,0x75,0x0,0x72,0x0,0x63,0x0,0x65,0x0,0x73,
- // tools.gif
- 0x0,0x9,
- 0x6,0x36,0xbb,0x36,
- 0x0,0x74,
- 0x0,0x6f,0x0,0x6f,0x0,0x6c,0x0,0x73,0x0,0x2e,0x0,0x67,0x0,0x69,0x0,0x66,
-
-};
-
-static const unsigned char qt_resource_struct[] = {
- // :
- 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,
- // :/images
- 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2,
- // :/images/resources
- 0x0,0x0,0x0,0x12,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x3,
- // :/images/resources/images
- 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x4,
- // :/images/resources/images/tools.gif
- 0x0,0x0,0x0,0x2a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,
-
-};
-
-QT_BEGIN_NAMESPACE
-
-extern Q_CORE_EXPORT bool qRegisterResourceData
- (int, const unsigned char *, const unsigned char *, const unsigned char *);
-
-extern Q_CORE_EXPORT bool qUnregisterResourceData
- (int, const unsigned char *, const unsigned char *, const unsigned char *);
-
-QT_END_NAMESPACE
-
-
-int QT_MANGLE_NAMESPACE(qInitResources_resources)()
-{
- QT_PREPEND_NAMESPACE(qRegisterResourceData)
- (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
- return 1;
-}
-
-Q_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources_resources))
-
-int QT_MANGLE_NAMESPACE(qCleanupResources_resources)()
-{
- QT_PREPEND_NAMESPACE(qUnregisterResourceData)
- (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
- return 1;
-}
-
-Q_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources_resources))
-
diff --git a/tcutils/tcutils.pro b/tcutils/tcutils.pro
deleted file mode 100644
index a24029e8..00000000
--- a/tcutils/tcutils.pro
+++ /dev/null
@@ -1,30 +0,0 @@
-#-------------------------------------------------
-#
-# Project created by QtCreator 2013-08-18T13:54:44
-#
-#-------------------------------------------------
-
-QT += core gui
-
-TARGET = tcutils
-TEMPLATE = app
-
-
-SOURCES += main.cpp\
- mainwindow.cpp \
- utils.cpp
-
-HEADERS += mainwindow.h \
- utils.h
-
-FORMS += mainwindow.ui
-
-# added by LK Rashinkar
-INCLUDEPATH += ../xrdpapi
-
-LIBS += -Wl,-rpath
-LIBS += -Wl,/usr/local/lib/xrdp
-LIBS += -L../xrdpapi/.libs -lxrdpapi
-
-RESOURCES += \
- resources.qrc
diff --git a/tcutils/ui_mainwindow.h b/tcutils/ui_mainwindow.h
deleted file mode 100644
index 4c47aefa..00000000
--- a/tcutils/ui_mainwindow.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/********************************************************************************
-** Form generated from reading UI file 'mainwindow.ui'
-**
-** Created: Sun Aug 25 15:11:42 2013
-** by: Qt User Interface Compiler version 4.8.1
-**
-** WARNING! All changes made in this file will be lost when recompiling UI file!
-********************************************************************************/
-
-#ifndef UI_MAINWINDOW_H
-#define UI_MAINWINDOW_H
-
-#include <QtCore/QVariant>
-#include <QtGui/QAction>
-#include <QtGui/QApplication>
-#include <QtGui/QButtonGroup>
-#include <QtGui/QHeaderView>
-#include <QtGui/QListWidget>
-#include <QtGui/QMainWindow>
-#include <QtGui/QMenuBar>
-#include <QtGui/QPushButton>
-#include <QtGui/QStatusBar>
-#include <QtGui/QTabWidget>
-#include <QtGui/QToolBar>
-#include <QtGui/QWidget>
-
-QT_BEGIN_NAMESPACE
-
-class Ui_MainWindow
-{
-public:
- QWidget *centralWidget;
- QTabWidget *tabWidget;
- QWidget *tabUnmount;
- QListWidget *listWidget;
- QPushButton *btnUnmount;
- QPushButton *btnRefresh;
- QWidget *tab_2;
- QMenuBar *menuBar;
- QToolBar *mainToolBar;
- QStatusBar *statusBar;
-
- void setupUi(QMainWindow *MainWindow)
- {
- if (MainWindow->objectName().isEmpty())
- MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
- MainWindow->resize(541, 355);
- centralWidget = new QWidget(MainWindow);
- centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
- tabWidget = new QTabWidget(centralWidget);
- tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
- tabWidget->setGeometry(QRect(0, 0, 511, 291));
- tabUnmount = new QWidget();
- tabUnmount->setObjectName(QString::fromUtf8("tabUnmount"));
- listWidget = new QListWidget(tabUnmount);
- listWidget->setObjectName(QString::fromUtf8("listWidget"));
- listWidget->setGeometry(QRect(10, 10, 321, 221));
- btnUnmount = new QPushButton(tabUnmount);
- btnUnmount->setObjectName(QString::fromUtf8("btnUnmount"));
- btnUnmount->setGeometry(QRect(350, 60, 141, 27));
- btnRefresh = new QPushButton(tabUnmount);
- btnRefresh->setObjectName(QString::fromUtf8("btnRefresh"));
- btnRefresh->setGeometry(QRect(350, 10, 141, 27));
- tabWidget->addTab(tabUnmount, QString());
- tab_2 = new QWidget();
- tab_2->setObjectName(QString::fromUtf8("tab_2"));
- tabWidget->addTab(tab_2, QString());
- MainWindow->setCentralWidget(centralWidget);
- menuBar = new QMenuBar(MainWindow);
- menuBar->setObjectName(QString::fromUtf8("menuBar"));
- menuBar->setGeometry(QRect(0, 0, 541, 25));
- MainWindow->setMenuBar(menuBar);
- mainToolBar = new QToolBar(MainWindow);
- mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
- MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
- statusBar = new QStatusBar(MainWindow);
- statusBar->setObjectName(QString::fromUtf8("statusBar"));
- MainWindow->setStatusBar(statusBar);
-
- retranslateUi(MainWindow);
-
- tabWidget->setCurrentIndex(0);
-
-
- QMetaObject::connectSlotsByName(MainWindow);
- } // setupUi
-
- void retranslateUi(QMainWindow *MainWindow)
- {
- MainWindow->setWindowTitle(QApplication::translate("MainWindow", "TC Utils", 0, QApplication::UnicodeUTF8));
- btnUnmount->setText(QApplication::translate("MainWindow", "Unmount device", 0, QApplication::UnicodeUTF8));
- btnRefresh->setText(QApplication::translate("MainWindow", "Get device list", 0, QApplication::UnicodeUTF8));
- tabWidget->setTabText(tabWidget->indexOf(tabUnmount), QApplication::translate("MainWindow", "Tab 1", 0, QApplication::UnicodeUTF8));
- tabWidget->setTabText(tabWidget->indexOf(tab_2), QApplication::translate("MainWindow", "Tab 2", 0, QApplication::UnicodeUTF8));
- } // retranslateUi
-
-};
-
-namespace Ui {
- class MainWindow: public Ui_MainWindow {};
-} // namespace Ui
-
-QT_END_NAMESPACE
-
-#endif // UI_MAINWINDOW_H
diff --git a/tests/gtcp_proxy/gtcp-proxy.c b/tests/gtcp_proxy/gtcp-proxy.c
index 39555c76..7b6312b0 100644
--- a/tests/gtcp_proxy/gtcp-proxy.c
+++ b/tests/gtcp_proxy/gtcp-proxy.c
@@ -611,7 +611,7 @@ static gboolean on_delete_event(GtkWidget *widget, GdkEvent *ev, gpointer data)
static void on_destroy(GtkWidget *widget, gpointer data)
{
- /* this will destory all windows and return control to gtk_main() */
+ /* this will destroy all windows and return control to gtk_main() */
gtk_main_quit();
}
@@ -673,6 +673,6 @@ static void on_clear_clicked(GtkWidget *widget, gpointer data)
static void on_quit_clicked(GtkWidget *widget, gpointer data)
{
- /* this will destory all windows and return control to gtk_main() */
+ /* this will destroy all windows and return control to gtk_main() */
gtk_main_quit();
}
diff --git a/tests/tcp_proxy/main.c b/tests/tcp_proxy/main.c
index 2d283ed9..aa276c44 100644
--- a/tests/tcp_proxy/main.c
+++ b/tests/tcp_proxy/main.c
@@ -454,7 +454,7 @@ main_loop(char *local_port, char *remote_ip, char *remote_port, int hexdump)
g_writeln("bind failed");
}
- /* listen for an incomming connection */
+ /* listen for an incoming connection */
if (error == 0)
{
error = g_tcp_listen(lis_sck);
@@ -465,7 +465,7 @@ main_loop(char *local_port, char *remote_ip, char *remote_port, int hexdump)
}
}
- /* accept an incomming connection */
+ /* accept an incoming connection */
if (error == 0)
{
while ((!g_terminated) && (error == 0))
diff --git a/vnc/Makefile.am b/vnc/Makefile.am
index 24835011..a9a3aa14 100644
--- a/vnc/Makefile.am
+++ b/vnc/Makefile.am
@@ -1,12 +1,10 @@
EXTRA_DIST = vnc.h
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common
lib_LTLIBRARIES = \
diff --git a/vnc/vnc.c b/vnc/vnc.c
index 4deb55da..2e16ed21 100644
--- a/vnc/vnc.c
+++ b/vnc/vnc.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,8 @@
#include "vnc.h"
#include "log.h"
+#include "trans.h"
+#include "ssl_calls.h"
#define LLOG_LEVEL 1
#define LLOGLN(_level, _args) \
@@ -35,114 +37,53 @@
#define AS_LOG_MESSAGE log_message
+static int APP_CC
+lib_mod_process_message(struct vnc *v, struct stream *s);
+
+/******************************************************************************/
+static int APP_CC
+lib_send_copy(struct vnc *v, struct stream *s)
+{
+ return trans_write_copy_s(v->trans, s);
+}
+
/******************************************************************************/
/* taken from vncauth.c */
void DEFAULT_CC
rfbEncryptBytes(char *bytes, char *passwd)
{
- char key[12];
+ char key[24];
+ char passwd_hash[20];
+ char passwd_hash_text[40];
+ void *des;
+ void *sha1;
+ int len;
+ int passwd_bytes;
+
+ /* create password hash from passowrd */
+ passwd_bytes = g_strlen(passwd);
+ sha1 = ssl_sha1_info_create();
+ ssl_sha1_transform(sha1, "xrdp_vnc", 8);
+ ssl_sha1_transform(sha1, passwd, passwd_bytes);
+ ssl_sha1_transform(sha1, passwd, passwd_bytes);
+ ssl_sha1_complete(sha1, passwd_hash);
+ ssl_sha1_info_delete(sha1);
+ g_snprintf(passwd_hash_text, 39, "%2.2x%2.2x%2.2x%2.2x",
+ (tui8)passwd_hash[0], (tui8)passwd_hash[1],
+ (tui8)passwd_hash[2], (tui8)passwd_hash[3]);
+ passwd_hash_text[39] = 0;
+ passwd = passwd_hash_text;
/* key is simply password padded with nulls */
g_memset(key, 0, sizeof(key));
- g_strncpy(key, passwd, 8);
- rfbDesKey((unsigned char *)key, EN0); /* 0, encrypt */
- rfbDes((unsigned char *)bytes, (unsigned char *)bytes);
- rfbDes((unsigned char *)(bytes + 8), (unsigned char *)(bytes + 8));
-}
-
-/******************************************************************************/
-/* returns error */
-int DEFAULT_CC
-lib_recv(struct vnc *v, char *data, int len)
-{
- int rcvd;
-
- if (v->sck_closed)
- {
- return 1;
- }
-
- while (len > 0)
- {
- rcvd = g_tcp_recv(v->sck, data, len, 0);
-
- if (rcvd == -1)
- {
- if (g_tcp_last_error_would_block(v->sck))
- {
- if (v->server_is_term(v))
- {
- return 1;
- }
-
- g_tcp_can_recv(v->sck, 10);
- }
- else
- {
- log_message(LOG_LEVEL_DEBUG, "VNC lib_recv return 1");
- return 1;
- }
- }
- else if (rcvd == 0)
- {
- v->sck_closed = 1;
- return 1;
- }
- else
- {
- data += rcvd;
- len -= rcvd;
- }
- }
-
- return 0;
-}
-
-/*****************************************************************************/
-/* returns error */
-int DEFAULT_CC
-lib_send(struct vnc *v, char *data, int len)
-{
- int sent;
-
- if (v->sck_closed)
- {
- return 1;
- }
-
- while (len > 0)
- {
- sent = g_tcp_send(v->sck, data, len, 0);
-
- if (sent == -1)
- {
- if (g_tcp_last_error_would_block(v->sck))
- {
- if (v->server_is_term(v))
- {
- return 1;
- }
-
- g_tcp_can_send(v->sck, 10);
- }
- else
- {
- return 1;
- }
- }
- else if (sent == 0)
- {
- v->sck_closed = 1;
- return 1;
- }
- else
- {
- data += sent;
- len -= sent;
- }
- }
-
- return 0;
+ len = MIN(g_strlen(passwd), 8);
+ g_mirror_memcpy(key, passwd, len);
+ des = ssl_des3_encrypt_info_create(key, 0);
+ ssl_des3_encrypt(des, 8, bytes, bytes);
+ ssl_des3_info_delete(des);
+ des = ssl_des3_encrypt_info_create(key, 0);
+ ssl_des3_encrypt(des, 8, bytes + 8, bytes + 8);
+ ssl_des3_info_delete(des);
}
/******************************************************************************/
@@ -153,6 +94,7 @@ lib_process_channel_data(struct vnc *v, int chanid, int flags, int size,
int type;
int status;
int length;
+ int clip_bytes;
int index;
int format;
struct stream *out_s;
@@ -170,6 +112,18 @@ lib_process_channel_data(struct vnc *v, int chanid, int flags, int size,
case 2: /* CLIPRDR_FORMAT_ANNOUNCE */
AS_LOG_MESSAGE(LOG_LEVEL_DEBUG, "CLIPRDR_FORMAT_ANNOUNCE - "
"status %d length %d", status, length);
+ make_stream(out_s);
+ init_stream(out_s, 8192);
+ out_uint16_le(out_s, 3); // msg-type: CLIPRDR_FORMAT_ACK
+ out_uint16_le(out_s, 1); // msg-status-code: CLIPRDR_RESPONSE
+ out_uint32_le(out_s, 0); // null (?)
+ out_uint8s(out_s, 4); // pad
+ s_mark_end(out_s);
+ length = (int)(out_s->end - out_s->data);
+ v->server_send_to_channel(v, v->clip_chanid, out_s->data,
+ length, length, 3);
+ free_stream(out_s);
+#if 0
// Send the CLIPRDR_DATA_REQUEST message to the cliprdr channel.
//
make_stream(out_s);
@@ -184,7 +138,9 @@ lib_process_channel_data(struct vnc *v, int chanid, int flags, int size,
v->server_send_to_channel(v, v->clip_chanid, out_s->data,
length, length, 3);
free_stream(out_s);
+#endif
break;
+
case 3: /* CLIPRDR_FORMAT_ACK */
AS_LOG_MESSAGE(LOG_LEVEL_DEBUG, "CLIPRDR_FORMAT_ACK - "
"status %d length %d", status, length);
@@ -212,11 +168,11 @@ lib_process_channel_data(struct vnc *v, int chanid, int flags, int size,
if (format == 13) /* CF_UNICODETEXT */
{
- out_uint32_le(out_s, v->clip_data_size * 2 + 2);
+ out_uint32_le(out_s, v->clip_data_s->size * 2 + 2);
- for (index = 0; index < v->clip_data_size; index++)
+ for (index = 0; index < v->clip_data_s->size; index++)
{
- out_uint8(out_s, v->clip_data[index]);
+ out_uint8(out_s, v->clip_data_s->data[index]);
out_uint8(out_s, 0);
}
@@ -224,11 +180,11 @@ lib_process_channel_data(struct vnc *v, int chanid, int flags, int size,
}
else if (format == 1) /* CF_TEXT */
{
- out_uint32_le(out_s, v->clip_data_size + 1);
+ out_uint32_le(out_s, v->clip_data_s->size + 1);
- for (index = 0; index < v->clip_data_size; index++)
+ for (index = 0; index < v->clip_data_s->size; index++)
{
- out_uint8(out_s, v->clip_data[index]);
+ out_uint8(out_s, v->clip_data_s->data[index]);
}
out_uint8s(out_s, 1);
@@ -245,48 +201,26 @@ lib_process_channel_data(struct vnc *v, int chanid, int flags, int size,
case 5: /* CLIPRDR_DATA_RESPONSE */
AS_LOG_MESSAGE(LOG_LEVEL_DEBUG, "CLIPRDR_DATA_RESPONSE - "
"status %d length %d", status, length);
-
+ clip_bytes = MIN(length, 256);
// - Read the response data from the cliprdr channel, stream 's'.
// - Send the response data to the vnc server, stream 'out_s'.
//
make_stream(out_s);
-
// Send the RFB message type (CLIENT_CUT_TEXT) to the vnc server.
- init_stream(out_s, 8192);
+ init_stream(out_s, clip_bytes + 1 + 3 + 4 + 16);
out_uint8(out_s, 6); // RFB msg type: CLIENT_CUT_TEXT
out_uint8s(out_s, 3); // padding
- lib_send(v, out_s->data, 4);
-
// Send the length of the cut-text to the vnc server.
- init_stream(out_s, 8192);
- out_uint32_be(out_s, length);
- lib_send(v, out_s->data, 4);
-
+ out_uint32_be(out_s, clip_bytes);
// Send the cut-text (as read from 's') to the vnc server.
- init_stream(out_s, 8192);
- for (index = 0; index < length; index++)
+ for (index = 0; index < clip_bytes; index++)
{
char cur_char = '\0';
in_uint8(s, cur_char); // text in from 's'
out_uint8(out_s, cur_char); // text out to 'out_s'
}
- lib_send(v, out_s->data, length);
-
- free_stream(out_s);
-
- // Now send a CLIPRDR_FORMAT_ACK to the cliprdr channel.
- // This seems to be necessary for bi-directional copy/paste.
- //
- make_stream(out_s);
- init_stream(out_s, 8192);
- out_uint16_le(out_s, 3); // msg-type: CLIPRDR_FORMAT_ACK
- out_uint16_le(out_s, 1); // msg-status-code: CLIPRDR_RESPONSE
- out_uint32_le(out_s, 0); // null (?)
- out_uint8s(out_s, 4); // pad
s_mark_end(out_s);
- length = (int)(out_s->end - out_s->data);
- v->server_send_to_channel(v, v->clip_chanid, out_s->data,
- length, length, 3);
+ lib_send_copy(v, out_s);
free_stream(out_s);
break;
@@ -364,7 +298,8 @@ lib_mod_event(struct vnc *v, int msg, long param1, long param2,
out_uint8(s, 0); /* down flag */
out_uint8s(s, 2);
out_uint32_be(s, 65507); /* left control */
- lib_send(v, s->data, 8);
+ s_mark_end(s);
+ lib_send_copy(v, s);
}
}
@@ -373,7 +308,8 @@ lib_mod_event(struct vnc *v, int msg, long param1, long param2,
out_uint8(s, msg == 15); /* down flag */
out_uint8s(s, 2);
out_uint32_be(s, key);
- error = lib_send(v, s->data, 8);
+ s_mark_end(s);
+ error = lib_send_copy(v, s);
if (key == 65507) /* left control */
{
@@ -424,7 +360,8 @@ lib_mod_event(struct vnc *v, int msg, long param1, long param2,
out_uint8(s, v->mod_mouse_state);
out_uint16_be(s, param1);
out_uint16_be(s, param2);
- error = lib_send(v, s->data, 6);
+ s_mark_end(s);
+ error = lib_send_copy(v, s);
}
else if (msg == 200) /* invalidate */
{
@@ -440,7 +377,8 @@ lib_mod_event(struct vnc *v, int msg, long param1, long param2,
out_uint16_be(s, cx);
cy = param2 & 0xffff;
out_uint16_be(s, cy);
- error = lib_send(v, s->data, 10);
+ s_mark_end(s);
+ error = lib_send_copy(v, s);
}
free_stream(s);
@@ -634,7 +572,6 @@ make_color(int r, int g, int b, int bpp)
int DEFAULT_CC
lib_framebuffer_update(struct vnc *v)
{
- char *data;
char *d1;
char *d2;
char cursor_data[32 * (32 * 3)];
@@ -656,13 +593,11 @@ lib_framebuffer_update(struct vnc *v)
int r;
int g;
int b;
- int data_size;
- int need_size;
int error;
+ int need_size;
struct stream *s;
+ struct stream *pixel_s;
- data_size = 0;
- data = 0;
num_recs = 0;
Bpp = (v->mod_bpp + 7) / 8;
@@ -671,9 +606,11 @@ lib_framebuffer_update(struct vnc *v)
Bpp = 4;
}
+ make_stream(pixel_s);
+
make_stream(s);
init_stream(s, 8192);
- error = lib_recv(v, s->data, 3);
+ error = trans_force_read_s(v->trans, s, 3);
if (error == 0)
{
@@ -690,7 +627,7 @@ lib_framebuffer_update(struct vnc *v)
}
init_stream(s, 8192);
- error = lib_recv(v, s->data, 12);
+ error = trans_force_read_s(v->trans, s, 12);
if (error == 0)
{
@@ -703,25 +640,18 @@ lib_framebuffer_update(struct vnc *v)
if (encoding == 0) /* raw */
{
need_size = cx * cy * Bpp;
-
- if (need_size > data_size)
- {
- g_free(data);
- data = (char *)g_malloc(need_size, 0);
- data_size = need_size;
- }
-
- error = lib_recv(v, data, need_size);
+ init_stream(pixel_s, need_size);
+ error = trans_force_read_s(v->trans, pixel_s, need_size);
if (error == 0)
{
- error = v->server_paint_rect(v, x, y, cx, cy, data, cx, cy, 0, 0);
+ error = v->server_paint_rect(v, x, y, cx, cy, pixel_s->data, cx, cy, 0, 0);
}
}
else if (encoding == 1) /* copy rect */
{
init_stream(s, 8192);
- error = lib_recv(v, s->data, 4);
+ error = trans_force_read_s(v->trans, s, 4);
if (error == 0)
{
@@ -737,7 +667,7 @@ lib_framebuffer_update(struct vnc *v)
j = cx * cy * Bpp;
k = ((cx + 7) / 8) * cy;
init_stream(s, j + k);
- error = lib_recv(v, s->data, j + k);
+ error = trans_force_read_s(v->trans, s, j + k);
if (error == 0)
{
@@ -761,7 +691,7 @@ lib_framebuffer_update(struct vnc *v)
}
}
- /* keep these in 32x32, vnc cursor can be alot bigger */
+ /* keep these in 32x32, vnc cursor can be a lot bigger */
if (x > 31)
{
x = 31;
@@ -795,8 +725,6 @@ lib_framebuffer_update(struct vnc *v)
error = v->server_end_update(v);
}
- g_free(data);
-
if (error == 0)
{
/* FrambufferUpdateRequest */
@@ -807,14 +735,17 @@ lib_framebuffer_update(struct vnc *v)
out_uint16_be(s, 0);
out_uint16_be(s, v->mod_width);
out_uint16_be(s, v->mod_height);
- error = lib_send(v, s->data, 10);
+ s_mark_end(s);
+ error = lib_send_copy(v, s);
}
free_stream(s);
+ free_stream(pixel_s);
return error;
}
/******************************************************************************/
+/* clip data from the vnc server */
int DEFAULT_CC
lib_clip_data(struct vnc *v)
{
@@ -823,20 +754,19 @@ lib_clip_data(struct vnc *v)
int size;
int error;
- g_free(v->clip_data);
- v->clip_data = 0;
- v->clip_data_size = 0;
+ free_stream(v->clip_data_s);
+ v->clip_data_s = 0;
make_stream(s);
init_stream(s, 8192);
- error = lib_recv(v, s->data, 7);
+ error = trans_force_read_s(v->trans, s, 7);
if (error == 0)
{
in_uint8s(s, 3);
in_uint32_be(s, size);
- v->clip_data = (char *)g_malloc(size, 0);
- v->clip_data_size = size;
- error = lib_recv(v, v->clip_data, size);
+ make_stream(v->clip_data_s);
+ init_stream(v->clip_data_s, size);
+ error = trans_force_read_s(v->trans, v->clip_data_s, size);
}
if (error == 0)
@@ -880,7 +810,7 @@ lib_palette_update(struct vnc *v)
make_stream(s);
init_stream(s, 8192);
- error = lib_recv(v, s->data, 5);
+ error = trans_force_read_s(v->trans, s, 5);
if (error == 0)
{
@@ -888,7 +818,7 @@ lib_palette_update(struct vnc *v)
in_uint16_be(s, first_color);
in_uint16_be(s, num_colors);
init_stream(s, 8192);
- error = lib_recv(v, s->data, num_colors * 6);
+ error = trans_force_read_s(v->trans, s, num_colors * 6);
}
if (error == 0)
@@ -935,12 +865,21 @@ lib_bell_trigger(struct vnc *v)
int DEFAULT_CC
lib_mod_signal(struct vnc *v)
{
+ g_writeln("lib_mod_signal: not used");
+ return 0;
+}
+
+/******************************************************************************/
+static int APP_CC
+lib_mod_process_message(struct vnc *v, struct stream *s)
+{
char type;
int error;
char text[256];
- error = lib_recv(v, &type, 1);
+ in_uint8(s, type);
+ error = 0;
if (error == 0)
{
if (type == 0) /* framebuffer update */
@@ -1001,6 +940,39 @@ lib_open_clip_channel(struct vnc *v)
}
/******************************************************************************/
+static int APP_CC
+lib_data_in(struct trans *trans)
+{
+ struct vnc *self;
+ struct stream *s;
+
+ LLOGLN(10, ("lib_data_in:"));
+
+ if (trans == 0)
+ {
+ return 1;
+ }
+
+ self = (struct vnc *)(trans->callback_data);
+ s = trans_get_in_s(trans);
+
+ if (s == 0)
+ {
+ return 1;
+ }
+
+ if (lib_mod_process_message(self, s) != 0)
+ {
+ g_writeln("lib_data_in: lib_mod_process_message failed");
+ return 1;
+ }
+
+ init_stream(s, 0);
+
+ return 0;
+}
+
+/******************************************************************************/
/*
return error
*/
@@ -1016,6 +988,7 @@ lib_mod_connect(struct vnc *v)
int error;
int i;
int check_sec_result;
+ struct source_info *si;
v->server_msg(v, "VNC started connecting", 0);
check_sec_result = 1;
@@ -1039,16 +1012,15 @@ lib_mod_connect(struct vnc *v)
g_sprintf(con_port, "%s", v->port);
make_stream(pixel_format);
- v->sck = g_tcp_socket();
- if (v->sck < 0)
+ v->trans = trans_create(TRANS_MODE_TCP, 8 * 8192, 8192);
+ if (v->trans == 0)
{
- v->server_msg(v, "VNC error: socket create error, g_tcp_socket() failed", 0);
+ v->server_msg(v, "VNC error: trans_create() failed", 0);
free_stream(s);
free_stream(pixel_format);
return 1;
}
- v->sck_obj = g_create_wait_obj_from_socket(v->sck, 0);
v->sck_closed = 0;
if (v->delay_ms > 0)
{
@@ -1059,27 +1031,32 @@ lib_mod_connect(struct vnc *v)
g_sprintf(text, "VNC connecting to %s %s", v->ip, con_port);
v->server_msg(v, text, 0);
- error = g_tcp_connect(v->sck, v->ip, con_port);
+
+ si = (struct source_info *) (v->si);
+ v->trans->si = si;
+ v->trans->my_source = XRDP_SOURCE_MOD;
+
+ error = trans_connect(v->trans, v->ip, con_port, 3000);
if (error == 0)
{
v->server_msg(v, "VNC tcp connected", 0);
- g_tcp_set_non_blocking(v->sck);
- g_tcp_set_no_delay(v->sck);
- /* protocal version */
+ /* protocol version */
init_stream(s, 8192);
- error = lib_recv(v, s->data, 12);
-
+ error = trans_force_read_s(v->trans, s, 12);
if (error == 0)
{
- error = lib_send(v, "RFB 003.003\n", 12);
+ s->p = s->data;
+ out_uint8a(s, "RFB 003.003\n", 12);
+ s_mark_end(s);
+ error = trans_force_write_s(v->trans, s);
}
/* sec type */
if (error == 0)
{
init_stream(s, 8192);
- error = lib_recv(v, s->data, 4);
+ error = trans_force_read_s(v->trans, s, 4);
}
if (error == 0)
@@ -1095,12 +1072,15 @@ lib_mod_connect(struct vnc *v)
else if (i == 2) /* dec the password and the server random */
{
init_stream(s, 8192);
- error = lib_recv(v, s->data, 16);
+ error = trans_force_read_s(v->trans, s, 16);
if (error == 0)
{
+ init_stream(s, 8192);
rfbEncryptBytes(s->data, v->password);
- error = lib_send(v, s->data, 16);
+ s->p += 16;
+ s_mark_end(s);
+ error = trans_force_write_s(v->trans, s);
check_sec_result = 1; // not needed
}
}
@@ -1119,14 +1099,15 @@ lib_mod_connect(struct vnc *v)
if (error != 0)
{
- log_message(LOG_LEVEL_DEBUG, "VNC Error after security negotiation");
+ log_message(LOG_LEVEL_DEBUG, "VNC error %d after security negotiation",
+ error);
}
if (error == 0 && check_sec_result)
{
/* sec result */
init_stream(s, 8192);
- error = lib_recv(v, s->data, 4);
+ error = trans_force_read_s(v->trans, s, 4);
if (error == 0)
{
@@ -1149,7 +1130,9 @@ lib_mod_connect(struct vnc *v)
v->server_msg(v, "VNC sending share flag", 0);
init_stream(s, 8192);
s->data[0] = 1;
- error = lib_send(v, s->data, 1); /* share flag */
+ s->p++;
+ s_mark_end(s);
+ error = trans_force_write_s(v->trans, s); /* share flag */
}
else
{
@@ -1159,7 +1142,8 @@ lib_mod_connect(struct vnc *v)
if (error == 0)
{
v->server_msg(v, "VNC receiving server init", 0);
- error = lib_recv(v, s->data, 4); /* server init */
+ init_stream(s, 8192);
+ error = trans_force_read_s(v->trans, s, 4); /* server init */
}
else
{
@@ -1172,7 +1156,7 @@ lib_mod_connect(struct vnc *v)
in_uint16_be(s, v->mod_height);
init_stream(pixel_format, 8192);
v->server_msg(v, "VNC receiving pixel format", 0);
- error = lib_recv(v, pixel_format->data, 16);
+ error = trans_force_read_s(v->trans, pixel_format, 16);
}
else
{
@@ -1184,7 +1168,7 @@ lib_mod_connect(struct vnc *v)
v->mod_bpp = v->server_bpp;
init_stream(s, 8192);
v->server_msg(v, "VNC receiving name length", 0);
- error = lib_recv(v, s->data, 4); /* name len */
+ error = trans_force_read_s(v->trans, s, 4); /* name len */
}
else
{
@@ -1201,8 +1185,10 @@ lib_mod_connect(struct vnc *v)
}
else
{
+ init_stream(s, 8192);
v->server_msg(v, "VNC receiving name", 0);
- error = lib_recv(v, v->mod_name, i);
+ error = trans_force_read_s(v->trans, s, i); /* name len */
+ g_memcpy(v->mod_name, s->data, i);
v->mod_name[i] = 0;
}
}
@@ -1297,7 +1283,8 @@ lib_mod_connect(struct vnc *v)
out_uint8a(s, pixel_format->data, 16);
v->server_msg(v, "VNC sending pixel format", 0);
- error = lib_send(v, s->data, 20);
+ s_mark_end(s);
+ error = trans_force_write_s(v->trans, s);
}
if (error == 0)
@@ -1312,7 +1299,8 @@ lib_mod_connect(struct vnc *v)
out_uint32_be(s, 0xffffff11); /* cursor */
out_uint32_be(s, 0xffffff21); /* desktop size */
v->server_msg(v, "VNC sending encodings", 0);
- error = lib_send(v, s->data, 4 + 4 * 4);
+ s_mark_end(s);
+ error = trans_force_write_s(v->trans, s);
}
if (error == 0)
@@ -1331,7 +1319,8 @@ lib_mod_connect(struct vnc *v)
out_uint16_be(s, v->mod_width);
out_uint16_be(s, v->mod_height);
v->server_msg(v, "VNC sending framebuffer update request", 0);
- error = lib_send(v, s->data, 10);
+ s_mark_end(s);
+ error = trans_force_write_s(v->trans, s);
}
if (error == 0)
@@ -1368,6 +1357,22 @@ lib_mod_connect(struct vnc *v)
v->server_msg(v, "VNC error - problem connecting", 0);
}
+ if (error != 0)
+ {
+ trans_delete(v->trans);
+ v->trans = 0;
+ v->server_msg(v, "some problem", 0);
+ LIB_DEBUG(mod, "out lib_mod_connect error");
+ return 1;
+ }
+ else
+ {
+ v->server_msg(v, "connected ok", 0);
+ v->trans->trans_data_in = lib_data_in;
+ v->trans->header_size = 1;
+ v->trans->callback_data = v;
+ }
+
return error;
}
@@ -1379,9 +1384,7 @@ lib_mod_end(struct vnc *v)
{
}
- g_free(v->clip_data);
- v->clip_data = 0;
- v->clip_data_size = 0;
+ free_stream(v->clip_data_s);
return 0;
}
@@ -1423,19 +1426,17 @@ int DEFAULT_CC
lib_mod_get_wait_objs(struct vnc *v, tbus *read_objs, int *rcount,
tbus *write_objs, int *wcount, int *timeout)
{
- int i;
-
- i = *rcount;
+ LLOGLN(10, ("lib_mod_get_wait_objs:"));
if (v != 0)
{
- if (v->sck_obj != 0)
+ if (v->trans != 0)
{
- read_objs[i++] = v->sck_obj;
+ trans_get_wait_objs_rw(v->trans, read_objs, rcount,
+ write_objs, wcount, timeout);
}
}
- *rcount = i;
return 0;
}
@@ -1447,18 +1448,13 @@ lib_mod_check_wait_objs(struct vnc *v)
int rv;
rv = 0;
-
if (v != 0)
{
- if (v->sck_obj != 0)
+ if (v->trans != 0)
{
- if (g_is_wait_obj_set(v->sck_obj))
- {
- rv = lib_mod_signal(v);
- }
+ rv = trans_check_wait_objs(v->trans);
}
}
-
return rv;
}
@@ -1494,9 +1490,7 @@ mod_exit(struct vnc *v)
{
return 0;
}
-
- g_delete_wait_obj_from_socket(v->sck_obj);
- g_tcp_close(v->sck);
+ trans_delete(v->trans);
g_free(v);
return 0;
}
diff --git a/vnc/vnc.h b/vnc/vnc.h
index 6d265beb..af5e86e6 100644
--- a/vnc/vnc.h
+++ b/vnc/vnc.h
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2013
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,10 +22,9 @@
#include "arch.h"
#include "parse.h"
#include "os_calls.h"
-#include "d3des.h"
#include "defines.h"
-#define CURRENT_MOD_VER 2
+#define CURRENT_MOD_VER 3
struct vnc
{
@@ -43,8 +42,8 @@ struct vnc
int (*mod_get_wait_objs)(struct vnc* v, tbus* read_objs, int* rcount,
tbus* write_objs, int* wcount, int* timeout);
int (*mod_check_wait_objs)(struct vnc* v);
- long mod_dumby[100 - 9]; /* align, 100 minus the number of mod
- functions above */
+ tintptr mod_dumby[100 - 9]; /* align, 100 minus the number of mod
+ functions above */
/* server functions */
int (*server_begin_update)(struct vnc* v);
int (*server_end_update)(struct vnc* v);
@@ -68,7 +67,7 @@ struct vnc
int (*server_set_pen)(struct vnc* v, int style,
int width);
int (*server_draw_line)(struct vnc* v, int x1, int y1, int x2, int y2);
- int (*server_add_char)(struct vnc* v, int font, int charactor,
+ int (*server_add_char)(struct vnc* v, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int (*server_draw_text)(struct vnc* v, int font,
@@ -86,13 +85,13 @@ struct vnc
char* data, int data_len,
int total_data_len, int flags);
int (*server_bell_trigger)(struct vnc* v);
- long server_dumby[100 - 25]; /* align, 100 minus the number of server
- functions above */
+ tintptr server_dumby[100 - 25]; /* align, 100 minus the number of server
+ functions above */
/* common */
- long handle; /* pointer to self as long */
- long wm;
- long painter;
- int sck;
+ tintptr handle; /* pointer to self as long */
+ tintptr wm;
+ tintptr painter;
+ tintptr si;
/* mod data */
int server_width;
int server_height;
@@ -112,8 +111,7 @@ struct vnc
int shift_state; /* 0 up, 1 down */
int keylayout;
int clip_chanid;
- char* clip_data;
- int clip_data_size;
- tbus sck_obj;
+ struct stream *clip_data_s;
int delay_ms;
+ struct trans *trans;
};
diff --git a/xorg/X11R7.6/rdp/rdp.h b/xorg/X11R7.6/rdp/rdp.h
index 1d06509d..901e292b 100644
--- a/xorg/X11R7.6/rdp/rdp.h
+++ b/xorg/X11R7.6/rdp/rdp.h
@@ -582,10 +582,10 @@ rdpup_check_alpha_dirty(PixmapPtr pDirtyPixmap, rdpPixmapRec* pDirtyPriv);
int
rdpup_check_dirty_screen(rdpPixmapRec* pDirtyPriv);
int
-rdpup_add_char(int font, int charactor, short x, short y, int cx, int cy,
+rdpup_add_char(int font, int character, short x, short y, int cx, int cy,
char* bmpdata, int bmpdata_bytes);
int
-rdpup_add_char_alpha(int font, int charactor, short x, short y, int cx, int cy,
+rdpup_add_char_alpha(int font, int character, short x, short y, int cx, int cy,
char* bmpdata, int bmpdata_bytes);
int
rdpup_draw_text(int font, int flags, int mixmode,
diff --git a/xorg/X11R7.6/rdp/rdpPolyFillRect.c b/xorg/X11R7.6/rdp/rdpPolyFillRect.c
index 7db4be69..6d37f587 100644
--- a/xorg/X11R7.6/rdp/rdpPolyFillRect.c
+++ b/xorg/X11R7.6/rdp/rdpPolyFillRect.c
@@ -188,7 +188,7 @@ rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
pGC->alu == GXnoop ||
pGC->alu == GXand ||
pGC->alu == GXcopy /*||
- pGC->alu == GXxor*/)) /* todo, why dosen't xor work? */
+ pGC->alu == GXxor*/)) /* todo, why doesn't xor work? */
{
draw_item_add_fill_region(pDirtyPriv, fill_reg, pGC->fgPixel,
pGC->alu);
@@ -210,7 +210,7 @@ rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
pGC->alu == GXnoop ||
pGC->alu == GXand ||
pGC->alu == GXcopy /*||
- pGC->alu == GXxor*/)) /* todo, why dosen't xor work? */
+ pGC->alu == GXxor*/)) /* todo, why doesn't xor work? */
{
rdpup_set_fgcolor(pGC->fgPixel);
rdpup_set_opcode(pGC->alu);
@@ -253,7 +253,7 @@ rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
pGC->alu == GXnoop ||
pGC->alu == GXand ||
pGC->alu == GXcopy /*||
- pGC->alu == GXxor*/)) /* todo, why dosen't xor work? */
+ pGC->alu == GXxor*/)) /* todo, why doesn't xor work? */
{
LLOGLN(10, ("rdpPolyFillRect: 3"));
draw_item_add_fill_region(pDirtyPriv, &clip_reg,
@@ -280,7 +280,7 @@ rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
pGC->alu == GXnoop ||
pGC->alu == GXand ||
pGC->alu == GXcopy /*||
- pGC->alu == GXxor*/)) /* todo, why dosen't xor work? */
+ pGC->alu == GXxor*/)) /* todo, why doesn't xor work? */
{
rdpup_set_fgcolor(pGC->fgPixel);
rdpup_set_opcode(pGC->alu);
diff --git a/xorg/X11R7.6/rdp/rdpinput.c b/xorg/X11R7.6/rdp/rdpinput.c
index a13c7b5b..4801b79c 100644
--- a/xorg/X11R7.6/rdp/rdpinput.c
+++ b/xorg/X11R7.6/rdp/rdpinput.c
@@ -59,6 +59,8 @@ extern int g_alt_down; /* in rdpmain.c */
extern int g_ctrl_down; /* in rdpmain.c */
static int g_old_button_mask = 0;
+static int g_old_x = 0;
+static int g_old_y = 0;
/* this is toggled every time num lock key is released, not like the
above *_down vars */
static int g_scroll_lock_down = 0;
@@ -180,7 +182,7 @@ rdpChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
if (ctrls->enabled_ctrls & XkbRepeatKeysMask)
{
LLOGLN(10, ("rdpChangeKeyboardControl: autoRepeat on"));
- /* schedual to turn off the autorepeat after 100 ms so any app
+ /* schedule to turn off the autorepeat after 100 ms so any app
* polling it will be happy it's on */
g_kbtimer = TimerSet(g_kbtimer, 0, 100,
rdpInDeferredUpdateCallback, 0);
@@ -858,7 +860,12 @@ rdpDeferredInputCallback(OsTimerPtr timer, CARD32 now, pointer arg)
{
LLOGLN(10, ("rdpDeferredInputCallback:"));
g_timer_schedualed = 0;
- rdpEnqueueMotion(g_x, g_y);
+ if ((g_old_x != g_x) || (g_old_y != g_y))
+ {
+ rdpEnqueueMotion(g_x, g_y);
+ g_old_x = g_x;
+ g_old_y = g_x;
+ }
return 0;
}
@@ -886,7 +893,12 @@ PtrAddEvent(int buttonMask, int x, int y)
g_timer_schedualed = 0;
TimerCancel(g_timer);
}
- rdpEnqueueMotion(x, y);
+ if ((g_old_x != x) || (g_old_y != y))
+ {
+ rdpEnqueueMotion(x, y);
+ g_old_x = x;
+ g_old_y = y;
+ }
for (i = 0; i < 5; i++)
{
if ((buttonMask ^ g_old_button_mask) & (1 << i))
diff --git a/xorg/X11R7.6/rdp/rdpmain.c b/xorg/X11R7.6/rdp/rdpmain.c
index cce4e951..f173de57 100644
--- a/xorg/X11R7.6/rdp/rdpmain.c
+++ b/xorg/X11R7.6/rdp/rdpmain.c
@@ -590,7 +590,7 @@ rdpScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
/******************************************************************************/
/* this is the first function called, it can be called many times
returns the number or parameters processed
- if it dosen't apply to the rdp part, return 0 */
+ if it doesn't apply to the rdp part, return 0 */
int
ddxProcessArgument(int argc, char **argv, int i)
{
diff --git a/xorg/X11R7.6/rdp/rdpup.c b/xorg/X11R7.6/rdp/rdpup.c
index b72848d2..230c1538 100644
--- a/xorg/X11R7.6/rdp/rdpup.c
+++ b/xorg/X11R7.6/rdp/rdpup.c
@@ -1319,7 +1319,7 @@ rdpup_init(void)
g_disconnect_timeout_s = 60;
}
- rdpLog("kill disconencted [%d] timeout [%d] sec\n", g_do_kill_disconnected,
+ rdpLog("kill disconnected [%d] timeout [%d] sec\n", g_do_kill_disconnected,
g_disconnect_timeout_s);
return 1;
@@ -2823,7 +2823,7 @@ rdpup_check_alpha_dirty(PixmapPtr pDirtyPixmap, rdpPixmapRec* pDirtyPriv)
/******************************************************************************/
int
-rdpup_add_char(int font, int charactor, short x, short y, int cx, int cy,
+rdpup_add_char(int font, int character, short x, short y, int cx, int cy,
char* bmpdata, int bmpdata_bytes)
{
if (g_connected)
@@ -2834,7 +2834,7 @@ rdpup_add_char(int font, int charactor, short x, short y, int cx, int cy,
out_uint16_le(g_out_s, 18 + bmpdata_bytes); /* size */
g_count++;
out_uint16_le(g_out_s, font);
- out_uint16_le(g_out_s, charactor);
+ out_uint16_le(g_out_s, character);
out_uint16_le(g_out_s, x);
out_uint16_le(g_out_s, y);
out_uint16_le(g_out_s, cx);
@@ -2847,7 +2847,7 @@ rdpup_add_char(int font, int charactor, short x, short y, int cx, int cy,
/******************************************************************************/
int
-rdpup_add_char_alpha(int font, int charactor, short x, short y, int cx, int cy,
+rdpup_add_char_alpha(int font, int character, short x, short y, int cx, int cy,
char* bmpdata, int bmpdata_bytes)
{
if (g_connected)
@@ -2858,7 +2858,7 @@ rdpup_add_char_alpha(int font, int charactor, short x, short y, int cx, int cy,
out_uint16_le(g_out_s, 18 + bmpdata_bytes); /* size */
g_count++;
out_uint16_le(g_out_s, font);
- out_uint16_le(g_out_s, charactor);
+ out_uint16_le(g_out_s, character);
out_uint16_le(g_out_s, x);
out_uint16_le(g_out_s, y);
out_uint16_le(g_out_s, cx);
diff --git a/xorg/X11R7.6/x11_file_list.txt b/xorg/X11R7.6/x11_file_list.txt
index 254ac7a6..f868bb64 100644
--- a/xorg/X11R7.6/x11_file_list.txt
+++ b/xorg/X11R7.6/x11_file_list.txt
@@ -12,7 +12,7 @@ libxml2-sources-2.7.8.tar.gz : libxml2-2.7.8
libpng-1.2.46.tar.gz : libpng-1.2.46 :
pixman-0.30.0.tar.bz2 : pixman-0.30.0 : --disable-gtk
freetype-2.4.6.tar.bz2 : freetype-2.4.6 :
-fontconfig-2.8.0.tar.gz : fontconfig-2.8.0 :
+fontconfig-2.8.0.tar.gz : fontconfig-2.8.0 : --disable-docs
cairo-1.8.8.tar.gz : cairo-1.8.8 :
expat-2.0.1.tar.gz : expat-2.0.1 :
xextproto-7.1.2.tar.bz2 : xextproto-7.1.2 :
diff --git a/xorg/tests/randr/trandr.c b/xorg/tests/randr/trandr.c
index 4f7be527..6c51a000 100644
--- a/xorg/tests/randr/trandr.c
+++ b/xorg/tests/randr/trandr.c
@@ -143,4 +143,4 @@ main(int argc, char **argv)
}
return 0;
-} \ No newline at end of file
+}
diff --git a/xorg/tests/xdemo/yosemite.bmp b/xorg/tests/xdemo/yosemite.bmp
index c64aba75..da2e8eed 100644
--- a/xorg/tests/xdemo/yosemite.bmp
+++ b/xorg/tests/xdemo/yosemite.bmp
Binary files differ
diff --git a/xorgxrdp b/xorgxrdp
-Subproject 6edf9e519765e0257221c24b01f0a7eeb2aee1d
+Subproject 3379d2c483599b00b1af34a2f6ae5bbc358299a
diff --git a/xrdp/Makefile.am b/xrdp/Makefile.am
index 4fd9a689..308f01a4 100644
--- a/xrdp/Makefile.am
+++ b/xrdp/Makefile.am
@@ -1,4 +1,5 @@
-EXTRA_DIST = xrdp.ini ad24b.bmp ad256.bmp xrdp24b.bmp xrdp256.bmp xrdp_logo.bmp sans-10.fv1 cursor0.cur cursor1.cur xrdp.h xrdp_types.h
+EXTRA_DIST = xrdp.ini ad24b.bmp ad256.bmp xrdp24b.bmp xrdp256.bmp xrdp_logo.bmp sans-10.fv1 cursor0.cur cursor1.cur xrdp.h xrdp_types.h \
+xrdp_encoder.h xrdp_keyboard.ini
EXTRA_INCLUDES =
EXTRA_LIBS =
@@ -10,26 +11,19 @@ else
EXTRA_DEFINES = -DXRDP_NODEBUG
endif
-if GOT_PREFIX
-EXTRA_INCLUDES += -I$(prefix)/include
-EXTRA_FLAGS += -L$(prefix)/lib -Wl,-rpath -Wl,$(prefix)/lib
-endif
-
if XRDP_RFXCODEC
EXTRA_DEFINES += -DXRDP_RFXCODEC
EXTRA_INCLUDES += -I$(top_srcdir)/librfxcodec/include
EXTRA_LIBS += $(top_srcdir)/librfxcodec/src/librfxencode.a
endif
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
-DXRDP_PID_PATH=\"${localstatedir}/run\" \
-DXRDP_LIB_PATH=\"${libdir}\" \
- $(EXTRA_DEFINES)
-
-INCLUDES = \
+ $(EXTRA_DEFINES) \
-I$(top_builddir) \
-I$(top_srcdir)/common \
-I$(top_srcdir)/libxrdp \
diff --git a/xrdp/ad256.bmp b/xrdp/ad256.bmp
index 5e1946c0..5e1946c0 100755..100644
--- a/xrdp/ad256.bmp
+++ b/xrdp/ad256.bmp
Binary files differ
diff --git a/xrdp/lang.c b/xrdp/lang.c
index de81c681..fa284112 100644
--- a/xrdp/lang.c
+++ b/xrdp/lang.c
@@ -263,7 +263,7 @@ get_keymaps(int keylayout, struct xrdp_keymap *keymap)
if (g_memcmp(lkeymap, keymap, sizeof(struct xrdp_keymap)) != 0)
{
log_message(LOG_LEVEL_WARNING,
- "local keymap file for 0x%4.4x found and dosen't match "
+ "local keymap file for 0x%4.4x found and doesn't match "
"built in keymap, using local keymap file", keylayout);
}
diff --git a/xrdp/rdp-scan-codes.txt b/xrdp/rdp-scan-codes.txt
index 938ce4c5..5fe06e53 100644
--- a/xrdp/rdp-scan-codes.txt
+++ b/xrdp/rdp-scan-codes.txt
@@ -3,7 +3,7 @@ complete rdp key code listing
en-us
-4000s in the down flags columm is from repeating keys(holding a key down)
+4000s in the down flags column is from repeating keys(holding a key down)
When holding a key down, the down flags repeat but the up flags only
come once at the end.
Rdesktop does not do this as of yet. It always sends down and up
diff --git a/xrdp/rsakeys.ini b/xrdp/rsakeys.ini
deleted file mode 100644
index ee79a3ec..00000000
--- a/xrdp/rsakeys.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[keys]
-pub_exp=0x01,0x00,0x01,0x00
-pub_mod=0x67,0xab,0x0e,0x6a,0x9f,0xd6,0x2b,0xa3,0x32,0x2f,0x41,0xd1,0xce,0xee,0x61,0xc3,0x76,0x0b,0x26,0x11,0x70,0x48,0x8a,0x8d,0x23,0x81,0x95,0xa0,0x39,0xf7,0x5b,0xaa,0x3e,0xf1,0xed,0xb8,0xc4,0xee,0xce,0x5f,0x6a,0xf5,0x43,0xce,0x5f,0x60,0xca,0x6c,0x06,0x75,0xae,0xc0,0xd6,0xa4,0x0c,0x92,0xa4,0xc6,0x75,0xea,0x64,0xb2,0x50,0x5b
-pub_sig=0x6a,0x41,0xb1,0x43,0xcf,0x47,0x6f,0xf1,0xe6,0xcc,0xa1,0x72,0x97,0xd9,0xe1,0x85,0x15,0xb3,0xc2,0x39,0xa0,0xa6,0x26,0x1a,0xb6,0x49,0x01,0xfa,0xa6,0xda,0x60,0xd7,0x45,0xf7,0x2c,0xee,0xe4,0x8e,0x64,0x2e,0x37,0x49,0xf0,0x4c,0x94,0x6f,0x08,0xf5,0x63,0x4c,0x56,0x29,0x55,0x5a,0x63,0x41,0x2c,0x20,0x65,0x95,0x99,0xb1,0x15,0x7c
-pri_exp=0x41,0x93,0x05,0xB1,0xF4,0x38,0xFC,0x47,0x88,0xC4,0x7F,0x83,0x8C,0xEC,0x90,0xDA,0x0C,0x8A,0xB5,0xAE,0x61,0x32,0x72,0xF5,0x2B,0xD1,0x7B,0x5F,0x44,0xC0,0x7C,0xBD,0x8A,0x35,0xFA,0xAE,0x30,0xF6,0xC4,0x6B,0x55,0xA7,0x65,0xEF,0xF4,0xB2,0xAB,0x18,0x4E,0xAA,0xE6,0xDC,0x71,0x17,0x3B,0x4C,0xC2,0x15,0x4C,0xF7,0x81,0xBB,0xF0,0x03
diff --git a/xrdp/sans-10.fv1 b/xrdp/sans-10.fv1
index 047870fa..047870fa 100755..100644
--- a/xrdp/sans-10.fv1
+++ b/xrdp/sans-10.fv1
Binary files differ
diff --git a/xrdp/xrdp.c b/xrdp/xrdp.c
index 24953c2d..690508cb 100644
--- a/xrdp/xrdp.c
+++ b/xrdp/xrdp.c
@@ -401,39 +401,6 @@ main(int argc, char **argv)
g_exit(0);
}
- /* starting logging subsystem */
- error = log_start(cfg_file, "XRDP");
-
- if (error != LOG_STARTUP_OK)
- {
- switch (error)
- {
- case LOG_ERROR_MALLOC:
- g_writeln("error on malloc. cannot start logging. quitting.");
- break;
- case LOG_ERROR_FILE_OPEN:
- g_writeln("error opening log file [%s]. quitting.",
- getLogFile(text, 255));
- break;
- default:
- g_writeln("log_start error");
- break;
- }
-
- g_deinit();
- g_exit(1);
- }
-
-
-
- if (g_file_exist(pid_file)) /* xrdp.pid */
- {
- g_writeln("It looks like xrdp is allready running,");
- g_writeln("if not delete the xrdp.pid file and try again");
- g_deinit();
- g_exit(0);
- }
-
if (startup_params->kill)
{
g_writeln("stopping xrdp");
@@ -469,6 +436,39 @@ main(int argc, char **argv)
g_exit(0);
}
+ /* starting logging subsystem */
+ error = log_start(cfg_file, "XRDP");
+
+ if (error != LOG_STARTUP_OK)
+ {
+ switch (error)
+ {
+ case LOG_ERROR_MALLOC:
+ g_writeln("error on malloc. cannot start logging. quitting.");
+ break;
+ case LOG_ERROR_FILE_OPEN:
+ g_writeln("error opening log file [%s]. quitting.",
+ getLogFile(text, 255));
+ break;
+ default:
+ g_writeln("log_start error");
+ break;
+ }
+
+ g_deinit();
+ g_exit(1);
+ }
+
+
+
+ if (g_file_exist(pid_file)) /* xrdp.pid */
+ {
+ g_writeln("It looks like xrdp is already running,");
+ g_writeln("if not delete the xrdp.pid file and try again");
+ g_deinit();
+ g_exit(0);
+ }
+
if (startup_params->no_daemon)
{
no_daemon = 1;
diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h
index b23cdaf0..1199d01a 100644
--- a/xrdp/xrdp.h
+++ b/xrdp/xrdp.h
@@ -381,6 +381,8 @@ int APP_CC
xrdp_mm_check_chan(struct xrdp_mm *self);
int APP_CC
xrdp_mm_check_wait_objs(struct xrdp_mm* self);
+int APP_CC
+xrdp_mm_frame_ack(struct xrdp_mm *self, int frame_id);
int DEFAULT_CC
server_begin_update(struct xrdp_mod* mod);
int DEFAULT_CC
@@ -444,7 +446,7 @@ server_set_pen(struct xrdp_mod* mod, int style, int width);
int DEFAULT_CC
server_draw_line(struct xrdp_mod* mod, int x1, int y1, int x2, int y2);
int DEFAULT_CC
-server_add_char(struct xrdp_mod* mod, int font, int charactor,
+server_add_char(struct xrdp_mod* mod, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int DEFAULT_CC
@@ -509,6 +511,6 @@ server_monitored_desktop(struct xrdp_mod* mod,
struct rail_monitored_desktop_order* mdo,
int flags);
int DEFAULT_CC
-server_add_char_alpha(struct xrdp_mod* mod, int font, int charactor,
+server_add_char_alpha(struct xrdp_mod* mod, int font, int character,
int offset, int baseline,
int width, int height, char* data);
diff --git a/xrdp/xrdp256.bmp b/xrdp/xrdp256.bmp
index 6191514e..6191514e 100755..100644
--- a/xrdp/xrdp256.bmp
+++ b/xrdp/xrdp256.bmp
Binary files differ
diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c
index aafc19f2..3fd0fbb7 100644
--- a/xrdp/xrdp_bitmap.c
+++ b/xrdp/xrdp_bitmap.c
@@ -165,7 +165,7 @@ xrdp_bitmap_create_with_data(int width, int height,
if (((bpp >= 24) && (data_as_int & 3)) ||
(((bpp == 15) || (bpp == 16)) && (data_as_int & 1)))
{
- /* got to copy data here, it's not alligned
+ /* got to copy data here, it's not aligned
other calls in this file assume alignment */
Bpp = 4;
switch (bpp)
diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c
index a2e7446c..26e5c028 100644
--- a/xrdp/xrdp_mm.c
+++ b/xrdp/xrdp_mm.c
@@ -466,6 +466,7 @@ xrdp_mm_setup_mod1(struct xrdp_mm *self)
self->mod->server_paint_rect_bpp = server_paint_rect_bpp;
self->mod->server_composite = server_composite;
self->mod->server_paint_rects = server_paint_rects;
+ self->mod->si = (tintptr) &(self->wm->session->si);
}
}
@@ -577,6 +578,10 @@ xrdp_mm_setup_mod2(struct xrdp_mm *self)
else
{
xrdp_wm_show_log(self->wm);
+ if (self->wm->hide_log_window)
+ {
+ rv = 1;
+ }
}
}
@@ -1116,15 +1121,16 @@ xrdp_mm_connect_chansrv(struct xrdp_mm *self, char *ip, char *port)
{
/* unix socket */
self->chan_trans = trans_create(TRANS_MODE_UNIX, 8192, 8192);
- self->chan_trans->is_term = g_is_term;
}
else
{
/* tcp */
self->chan_trans = trans_create(TRANS_MODE_TCP, 8192, 8192);
- self->chan_trans->is_term = g_is_term;
}
+ self->chan_trans->is_term = g_is_term;
+ self->chan_trans->si = &(self->wm->session->si);
+ self->chan_trans->my_source = XRDP_SOURCE_CHANSRV;
self->chan_trans->trans_data_in = xrdp_mm_chan_data_in;
self->chan_trans->header_size = 8;
self->chan_trans->callback_data = self;
@@ -1229,6 +1235,10 @@ xrdp_mm_process_login_response(struct xrdp_mm *self, struct stream *s)
log_message(LOG_LEVEL_INFO,"xrdp_mm_process_login_response: "
"login failed");
xrdp_wm_show_log(self->wm);
+ if (self->wm->hide_log_window)
+ {
+ rv = 1;
+ }
}
cleanup_sesman_connection(self);
@@ -1448,7 +1458,7 @@ access_control(char *username, char *password, char *srv)
if (reply > 0)
{
/* We wait in 5 sec for a reply from sesman*/
- if (g_tcp_can_recv(socket, 5000))
+ if (g_sck_can_recv(socket, 5000))
{
reply = g_tcp_recv(socket, in_s->end, 500, 0);
@@ -1973,7 +1983,7 @@ xrdp_mm_connect(struct xrdp_mm *self)
if (xrdp_mm_setup_mod2(self) == 0)
{
xrdp_wm_set_login_mode(self->wm, 10);
- rv = 0; /*sucess*/
+ rv = 0; /*success*/
}
else
{
@@ -2004,7 +2014,7 @@ xrdp_mm_connect(struct xrdp_mm *self)
xrdp_mm_connect_chansrv(self, "", chansrvport);
}
- log_message(LOG_LEVEL_DEBUG,"returnvalue from xrdp_mm_connect %d", rv);
+ log_message(LOG_LEVEL_DEBUG,"return value from xrdp_mm_connect %d", rv);
return rv;
}
@@ -2153,6 +2163,11 @@ xrdp_mm_check_wait_objs(struct xrdp_mm *self)
if (trans_check_wait_objs(self->sesman_trans) != 0)
{
self->delete_sesman_trans = 1;
+ if (self->wm->hide_log_window)
+ {
+ /* if hide_log_window, this is fatal */
+ rv = 1;
+ }
}
}
@@ -2818,7 +2833,7 @@ server_draw_line(struct xrdp_mod *mod, int x1, int y1, int x2, int y2)
/*****************************************************************************/
int DEFAULT_CC
-server_add_char(struct xrdp_mod *mod, int font, int charactor,
+server_add_char(struct xrdp_mod *mod, int font, int character,
int offset, int baseline,
int width, int height, char *data)
{
@@ -2832,7 +2847,7 @@ server_add_char(struct xrdp_mod *mod, int font, int charactor,
fi.data = data;
fi.bpp = 1;
return libxrdp_orders_send_font(((struct xrdp_wm *)mod->wm)->session,
- &fi, font, charactor);
+ &fi, font, character);
}
/*****************************************************************************/
@@ -3455,7 +3470,7 @@ server_monitored_desktop(struct xrdp_mod *mod,
/*****************************************************************************/
int DEFAULT_CC
-server_add_char_alpha(struct xrdp_mod* mod, int font, int charactor,
+server_add_char_alpha(struct xrdp_mod* mod, int font, int character,
int offset, int baseline,
int width, int height, char* data)
{
@@ -3469,5 +3484,5 @@ server_add_char_alpha(struct xrdp_mod* mod, int font, int charactor,
fi.data = data;
fi.bpp = 8;
return libxrdp_orders_send_font(((struct xrdp_wm*)mod->wm)->session,
- &fi, font, charactor);
+ &fi, font, character);
}
diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c
index 5a7cd1d8..7d9c3a14 100644
--- a/xrdp/xrdp_process.c
+++ b/xrdp/xrdp_process.c
@@ -195,6 +195,8 @@ xrdp_process_main_loop(struct xrdp_process *self)
self->server_trans->callback_data = self;
init_stream(self->server_trans->in_s, 8192 * 4);
self->session = libxrdp_init((tbus)self, self->server_trans);
+ self->server_trans->si = &(self->session->si);
+ self->server_trans->my_source = XRDP_SOURCE_CLIENT;
/* this callback function is in xrdp_wm.c */
self->session->callback = callback;
/* this function is just above */
@@ -217,8 +219,8 @@ xrdp_process_main_loop(struct xrdp_process *self)
robjs[robjs_count++] = self->self_term_event;
xrdp_wm_get_wait_objs(self->wm, robjs, &robjs_count,
wobjs, &wobjs_count, &timeout);
- trans_get_wait_objs(self->server_trans, robjs, &robjs_count);
-
+ trans_get_wait_objs_rw(self->server_trans, robjs, &robjs_count,
+ wobjs, &wobjs_count, &timeout);
/* wait */
if (g_obj_wait(robjs, robjs_count, wobjs, wobjs_count, timeout) != 0)
{
diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h
index 21d00e9a..a2a4d5fd 100644
--- a/xrdp/xrdp_types.h
+++ b/xrdp/xrdp_types.h
@@ -48,8 +48,8 @@ struct xrdp_mod
tbus* write_objs, int* wcount, int* timeout);
int (*mod_check_wait_objs)(struct xrdp_mod* v);
int (*mod_frame_ack)(struct xrdp_mod* v, int flags, int frame_id);
- long mod_dumby[100 - 10]; /* align, 100 minus the number of mod
- functions above */
+ tintptr mod_dumby[100 - 10]; /* align, 100 minus the number of mod
+ functions above */
/* server functions */
int (*server_begin_update)(struct xrdp_mod* v);
int (*server_end_update)(struct xrdp_mod* v);
@@ -75,7 +75,7 @@ struct xrdp_mod
int (*server_set_pen)(struct xrdp_mod* v, int style,
int width);
int (*server_draw_line)(struct xrdp_mod* v, int x1, int y1, int x2, int y2);
- int (*server_add_char)(struct xrdp_mod* v, int font, int charactor,
+ int (*server_add_char)(struct xrdp_mod* v, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int (*server_draw_text)(struct xrdp_mod* v, int font,
@@ -125,7 +125,7 @@ struct xrdp_mod
int flags);
int (*server_set_pointer_ex)(struct xrdp_mod* v, int x, int y, char* data,
char* mask, int bpp);
- int (*server_add_char_alpha)(struct xrdp_mod* mod, int font, int charactor,
+ int (*server_add_char_alpha)(struct xrdp_mod* mod, int font, int character,
int offset, int baseline,
int width, int height, char* data);
@@ -146,13 +146,13 @@ struct xrdp_mod
int num_crects, short *crects,
char *data, int width, int height,
int flags, int frame_id);
- long server_dumby[100 - 43]; /* align, 100 minus the number of server
- functions above */
+ tintptr server_dumby[100 - 43]; /* align, 100 minus the number of server
+ functions above */
/* common */
- long handle; /* pointer to self as int */
- long wm; /* struct xrdp_wm* */
- long painter;
- int sck;
+ tintptr handle; /* pointer to self as int */
+ tintptr wm; /* struct xrdp_wm* */
+ tintptr painter;
+ tintptr si;
};
/* header for bmp file */
diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c
index e3af0f05..806a2532 100644
--- a/xrdp/xrdp_wm.c
+++ b/xrdp/xrdp_wm.c
@@ -560,7 +560,7 @@ xrdp_wm_init(struct xrdp_wm *self)
xrdp_wm_load_static_pointers(self);
self->screen->bg_color = self->xrdp_config->cfg_globals.ls_top_window_bg_color;
- if (self->session->client_info->rdp_autologin)
+ if (self->session->client_info->rdp_autologin || self->hide_log_window)
{
/*
* NOTE: this should eventually be accessed from self->xrdp_config
@@ -576,7 +576,8 @@ xrdp_wm_init(struct xrdp_wm *self)
values->auto_free = 1;
/* look for module name to be loaded */
- if (autorun_name[0] != 0) {
+ if (autorun_name[0] != 0)
+ {
/* if autorun is configured in xrdp.ini, we enforce that module to be loaded */
g_strncpy(section_name, autorun_name, 255);
}
@@ -1687,7 +1688,7 @@ xrdp_wm_process_channel_data(struct xrdp_wm *self,
}
/******************************************************************************/
-/* this is the callbacks comming from libxrdp.so */
+/* this is the callbacks coming from libxrdp.so */
int DEFAULT_CC
callback(long id, int msg, long param1, long param2, long param3, long param4)
{
@@ -1759,7 +1760,7 @@ xrdp_wm_login_mode_changed(struct xrdp_wm *self)
if (self->login_mode == 0)
{
- /* this is the inital state of the login window */
+ /* this is the initial state of the login window */
xrdp_wm_set_login_mode(self, 1); /* put the wm in login mode */
list_clear(self->log);
xrdp_wm_delete_all_childs(self);
diff --git a/xrdp/xrdpwin.c b/xrdp/xrdpwin.c
index ee78273b..f3ef1074 100644
--- a/xrdp/xrdpwin.c
+++ b/xrdp/xrdpwin.c
@@ -369,7 +369,7 @@ main(int argc, char **argv)
g_exit(0);
}
- /* check if service is allready installed */
+ /* check if service is already installed */
sc_ser = OpenService(sc_man, "xrdp", SERVICE_ALL_ACCESS);
if (sc_ser == 0)
@@ -383,7 +383,7 @@ main(int argc, char **argv)
}
else
{
- g_writeln("error service is allready installed");
+ g_writeln("error service is already installed");
CloseServiceHandle(sc_ser);
CloseServiceHandle(sc_man);
g_exit(0);
@@ -405,7 +405,7 @@ main(int argc, char **argv)
g_exit(0);
}
- /* check if service is allready installed */
+ /* check if service is already installed */
sc_ser = OpenService(sc_man, "xrdp", SERVICE_ALL_ACCESS);
if (sc_ser == 0)
@@ -540,7 +540,7 @@ main(int argc, char **argv)
if (g_file_exist(pid_file)) /* xrdp.pid */
{
- g_writeln("It looks like xrdp is allready running,");
+ g_writeln("It looks like xrdp is already running,");
g_writeln("if not delete the xrdp.pid file and try again");
g_exit(0);
}
diff --git a/xrdpapi/Makefile.am b/xrdpapi/Makefile.am
index 88ef100e..8107ffeb 100644
--- a/xrdpapi/Makefile.am
+++ b/xrdpapi/Makefile.am
@@ -5,10 +5,8 @@ EXTRA_INCLUDES =
EXTRA_LIBS =
EXTRA_FLAGS =
-AM_CFLAGS = \
- $(EXTRA_DEFINES)
-
-INCLUDES = \
+AM_CPPFLAGS = \
+ $(EXTRA_DEFINES) \
$(EXTRA_INCLUDES)
lib_LTLIBRARIES = \
diff --git a/xrdpapi/xrdpapi.c b/xrdpapi/xrdpapi.c
index 7e9eaa0c..974a094c 100644
--- a/xrdpapi/xrdpapi.c
+++ b/xrdpapi/xrdpapi.c
@@ -126,7 +126,7 @@ WTSVirtualChannelOpenEx(unsigned int SessionId, const char *pVirtualName,
/* we use unix domain socket to communicate with chansrv */
if ((wts->fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
{
- g_free(wts);
+ free(wts);
return NULL;
}
@@ -162,6 +162,14 @@ WTSVirtualChannelOpenEx(unsigned int SessionId, const char *pVirtualName,
return wts;
}
+/*
+ * Prevent receiving SIGPIPE on disconnect using either MSG_NOSIGNAL (Linux)
+ * or SO_NOSIGPIPE (Mac OS X)
+ */
+#if !defined(MSG_NOSIGNAL)
+#define MSG_NOSIGNAL 0
+#endif
+
/*****************************************************************************/
static int
mysend(int sck, const void* adata, int bytes)
@@ -170,6 +178,11 @@ mysend(int sck, const void* adata, int bytes)
int error;
const char* data;
+#if defined(SO_NOSIGPIPE)
+ const int on = 1;
+ setsockopt(sck, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on));
+#endif
+
data = (const char*)adata;
sent = 0;
while (sent < bytes)
diff --git a/xrdpvr/Makefile.am b/xrdpvr/Makefile.am
index 158baa90..f232ce41 100644
--- a/xrdpvr/Makefile.am
+++ b/xrdpvr/Makefile.am
@@ -5,10 +5,8 @@ EXTRA_INCLUDES =
EXTRA_LIBS =
EXTRA_FLAGS =
-AM_CFLAGS = \
- $(EXTRA_DEFINES)
-
-INCLUDES = \
+AM_CPPFLAGS = \
+ $(EXTRA_DEFINES) \
$(EXTRA_INCLUDES)
lib_LTLIBRARIES = \
diff --git a/xup/Makefile.am b/xup/Makefile.am
index 544c957a..d7017b42 100644
--- a/xup/Makefile.am
+++ b/xup/Makefile.am
@@ -1,12 +1,10 @@
EXTRA_DIST = xup.h
-AM_CFLAGS = \
+AM_CPPFLAGS = \
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
-DXRDP_SBIN_PATH=\"${sbindir}\" \
-DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \
- -DXRDP_PID_PATH=\"${localstatedir}/run\"
-
-INCLUDES = \
+ -DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common
lib_LTLIBRARIES = \
diff --git a/xup/xup.c b/xup/xup.c
index 8ddc079f..21fdedd5 100644
--- a/xup/xup.c
+++ b/xup/xup.c
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2014
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
#include "xup.h"
#include "log.h"
+#include "trans.h"
#define LOG_LEVEL 1
#define LLOG(_level, _args) \
@@ -27,98 +28,14 @@
#define LLOGLN(_level, _args) \
do { if (_level < LOG_LEVEL) { g_writeln _args ; } } while (0)
+static int APP_CC
+lib_mod_process_message(struct mod *mod, struct stream *s);
+
/******************************************************************************/
-/* returns error */
-int DEFAULT_CC
-lib_recv(struct mod *mod, char *data, int len)
+static int APP_CC
+lib_send_copy(struct mod *mod, struct stream *s)
{
- int rcvd;
-
- if (mod->sck_closed)
- {
- return 1;
- }
-
- while (len > 0)
- {
- rcvd = g_tcp_recv(mod->sck, data, len, 0);
-
- if (rcvd == -1)
- {
- if (g_tcp_last_error_would_block(mod->sck))
- {
- if (mod->server_is_term(mod))
- {
- return 1;
- }
-
- g_tcp_can_recv(mod->sck, 10);
- }
- else
- {
- return 1;
- }
- }
- else if (rcvd == 0)
- {
- mod->sck_closed = 1;
- return 1;
- }
- else
- {
- data += rcvd;
- len -= rcvd;
- }
- }
-
- return 0;
-}
-
-/*****************************************************************************/
-/* returns error */
-int DEFAULT_CC
-lib_send(struct mod *mod, char *data, int len)
-{
- int sent;
-
- if (mod->sck_closed)
- {
- return 1;
- }
-
- while (len > 0)
- {
- sent = g_tcp_send(mod->sck, data, len, 0);
-
- if (sent == -1)
- {
- if (g_tcp_last_error_would_block(mod->sck))
- {
- if (mod->server_is_term(mod))
- {
- return 1;
- }
-
- g_tcp_can_send(mod->sck, 10);
- }
- else
- {
- return 1;
- }
- }
- else if (sent == 0)
- {
- mod->sck_closed = 1;
- return 1;
- }
- else
- {
- data += sent;
- len -= sent;
- }
- }
-
- return 0;
+ return trans_write_copy_s(mod->trans, s);
}
/******************************************************************************/
@@ -144,7 +61,7 @@ lib_mod_log_peer(struct mod *mod)
int gid;
my_pid = g_getpid();
- if (g_sck_get_peer_cred(mod->sck, &pid, &uid, &gid) == 0)
+ if (g_sck_get_peer_cred(mod->trans->sck, &pid, &uid, &gid) == 0)
{
log_message(LOG_LEVEL_INFO, "lib_mod_log_peer: xrdp_pid=%d connected "
"to X11rdp_pid=%d X11rdp_uid=%d X11rdp_gid=%d "
@@ -162,6 +79,62 @@ lib_mod_log_peer(struct mod *mod)
}
/******************************************************************************/
+static int APP_CC
+lib_data_in(struct trans *trans)
+{
+ struct mod *self;
+ struct stream *s;
+ int len;
+
+ LLOGLN(10, ("lib_data_in:"));
+ if (trans == 0)
+ {
+ return 1;
+ }
+
+ self = (struct mod *)(trans->callback_data);
+ s = trans_get_in_s(trans);
+
+ if (s == 0)
+ {
+ return 1;
+ }
+
+ switch (trans->extra_flags)
+ {
+ case 1:
+ s->p = s->data;
+ in_uint8s(s, 4); /* processed later in lib_mod_process_message */
+ in_uint32_le(s, len);
+ if (len < 0 || len > 128 * 1024)
+ {
+ g_writeln("lib_data_in: bad size");
+ return 1;
+ }
+ if (len > 0)
+ {
+ trans->header_size = len + 8;
+ trans->extra_flags = 2;
+ break;
+ }
+ /* fall through */
+ case 2:
+ s->p = s->data;
+ if (lib_mod_process_message(self, s) != 0)
+ {
+ g_writeln("lib_data_in: lib_mod_process_message failed");
+ return 1;
+ }
+ init_stream(s, 0);
+ trans->header_size = 8;
+ trans->extra_flags = 1;
+ break;
+ }
+
+ return 0;
+}
+
+/******************************************************************************/
/* return error */
int DEFAULT_CC
lib_mod_connect(struct mod *mod)
@@ -169,10 +142,10 @@ lib_mod_connect(struct mod *mod)
int error;
int len;
int i;
- int index;
int use_uds;
struct stream *s;
char con_port[256];
+ struct source_info *si;
LIB_DEBUG(mod, "in lib_mod_connect");
@@ -207,64 +180,40 @@ lib_mod_connect(struct mod *mod)
mod->sck_closed = 0;
i = 0;
- while (1)
+ if (use_uds)
{
- if (use_uds)
+ mod->trans = trans_create(TRANS_MODE_UNIX, 8 * 8192, 8192);
+ if (mod->trans == 0)
{
- mod->sck = g_tcp_local_socket();
- if (mod->sck < 0)
- {
- free_stream(s);
- return 1;
- }
+ free_stream(s);
+ return 1;
}
- else
+ }
+ else
+ {
+ mod->trans = trans_create(TRANS_MODE_TCP, 8 * 8192, 8192);
+ if (mod->trans == 0)
{
- mod->sck = g_tcp_socket();
- if (mod->sck < 0)
- {
- free_stream(s);
- return 1;
- }
-
- g_tcp_set_non_blocking(mod->sck);
- g_tcp_set_no_delay(mod->sck);
+ free_stream(s);
+ return 1;
}
+ }
- /* mod->server_msg(mod, "connecting...", 0); */
+ si = (struct source_info *) (mod->si);
+ mod->trans->si = si;
+ mod->trans->my_source = XRDP_SOURCE_MOD;
- if (use_uds)
- {
- error = g_tcp_local_connect(mod->sck, con_port);
- }
- else
- {
- error = g_tcp_connect(mod->sck, mod->ip, con_port);
- }
-
- if (error == -1)
- {
- if (g_tcp_last_error_would_block(mod->sck))
- {
- error = 0;
- index = 0;
+ while (1)
+ {
- while (!g_tcp_can_send(mod->sck, 100))
- {
- index++;
+ /* mod->server_msg(mod, "connecting...", 0); */
- if ((index >= 30) || mod->server_is_term(mod))
- {
- mod->server_msg(mod, "connect timeout", 0);
- error = 1;
- break;
- }
- }
- }
- else
- {
- /* mod->server_msg(mod, "connect error", 0); */
- }
+ error = -1;
+ if (trans_connect(mod->trans, mod->ip, con_port, 3000) == 0)
+ {
+ LLOGLN(0, ("lib_mod_connect: connected to Xserver"
+ "(Xorg or X11rdp) sck %d", mod->trans->sck));
+ error = 0;
}
if (error == 0)
@@ -272,8 +221,6 @@ lib_mod_connect(struct mod *mod)
break;
}
- g_tcp_close(mod->sck);
- mod->sck = 0;
i++;
if (i >= 60)
@@ -308,7 +255,7 @@ lib_mod_connect(struct mod *mod)
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ lib_send_copy(mod, s);
}
if (error == 0)
@@ -326,7 +273,7 @@ lib_mod_connect(struct mod *mod)
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ lib_send_copy(mod, s);
}
if (error == 0)
@@ -348,13 +295,15 @@ lib_mod_connect(struct mod *mod)
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ lib_send_copy(mod, s);
}
free_stream(s);
if (error != 0)
{
+ trans_delete(mod->trans);
+ mod->trans = 0;
mod->server_msg(mod, "some problem", 0);
LIB_DEBUG(mod, "out lib_mod_connect error");
return 1;
@@ -362,7 +311,11 @@ lib_mod_connect(struct mod *mod)
else
{
mod->server_msg(mod, "connected ok", 0);
- mod->sck_obj = g_create_wait_obj_from_socket(mod->sck, 0);
+ mod->trans->trans_data_in = lib_data_in;
+ mod->trans->header_size = 8;
+ mod->trans->callback_data = mod;
+ mod->trans->no_stream_init_on_data_in = 1;
+ mod->trans->extra_flags = 1;
}
LIB_DEBUG(mod, "out lib_mod_connect");
@@ -411,7 +364,7 @@ lib_mod_event(struct mod *mod, int msg, tbus param1, tbus param2,
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ lib_send_copy(mod, s);
}
}
@@ -434,7 +387,7 @@ lib_mod_event(struct mod *mod, int msg, tbus param1, tbus param2,
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- rv = lib_send(mod, s->data, len);
+ rv = lib_send_copy(mod, s);
free_stream(s);
LIB_DEBUG(mod, "out lib_mod_event");
return rv;
@@ -844,7 +797,7 @@ process_server_add_char(struct mod *mod, struct stream *s)
{
int rv;
int font;
- int charactor;
+ int character;
int x;
int y;
int cx;
@@ -853,14 +806,14 @@ process_server_add_char(struct mod *mod, struct stream *s)
char *bmpdata;
in_uint16_le(s, font);
- in_uint16_le(s, charactor);
+ in_uint16_le(s, character);
in_sint16_le(s, x);
in_sint16_le(s, y);
in_uint16_le(s, cx);
in_uint16_le(s, cy);
in_uint16_le(s, len_bmpdata);
in_uint8p(s, bmpdata, len_bmpdata);
- rv = mod->server_add_char(mod, font, charactor, x, y, cx, cy, bmpdata);
+ rv = mod->server_add_char(mod, font, character, x, y, cx, cy, bmpdata);
return rv;
}
@@ -872,7 +825,7 @@ process_server_add_char_alpha(struct mod *mod, struct stream *s)
{
int rv;
int font;
- int charactor;
+ int character;
int x;
int y;
int cx;
@@ -881,14 +834,14 @@ process_server_add_char_alpha(struct mod *mod, struct stream *s)
char *bmpdata;
in_uint16_le(s, font);
- in_uint16_le(s, charactor);
+ in_uint16_le(s, character);
in_sint16_le(s, x);
in_sint16_le(s, y);
in_uint16_le(s, cx);
in_uint16_le(s, cy);
in_uint16_le(s, len_bmpdata);
in_uint8p(s, bmpdata, len_bmpdata);
- rv = mod->server_add_char_alpha(mod, font, charactor, x, y, cx, cy,
+ rv = mod->server_add_char_alpha(mod, font, character, x, y, cx, cy,
bmpdata);
return rv;
}
@@ -1092,7 +1045,7 @@ send_paint_rect_ack(struct mod *mod, int flags, int x, int y, int cx, int cy,
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ lib_send_copy(mod, s);
free_stream(s);
return 0;
}
@@ -1100,7 +1053,7 @@ send_paint_rect_ack(struct mod *mod, int flags, int x, int y, int cx, int cy,
/******************************************************************************/
/* return error */
static int APP_CC
-process_server_paint_rect_shmem(struct mod *mod, struct stream *s)
+process_server_paint_rect_shmem(struct mod *amod, struct stream *s)
{
int rv;
int x;
@@ -1132,37 +1085,33 @@ process_server_paint_rect_shmem(struct mod *mod, struct stream *s)
bmpdata = 0;
rv = 0;
-
- if (flags == 0) /* screen */
+ if (amod->screen_shmem_id_mapped == 0)
{
- if (mod->screen_shmem_id_mapped == 0)
+ amod->screen_shmem_id = shmem_id;
+ amod->screen_shmem_pixels = g_shmat(amod->screen_shmem_id);
+ if (amod->screen_shmem_pixels == (void*)-1)
{
- mod->screen_shmem_id = shmem_id;
- mod->screen_shmem_pixels = g_shmat(mod->screen_shmem_id);
- if (mod->screen_shmem_pixels == (void*)-1)
- {
- /* failed */
- mod->screen_shmem_id = 0;
- mod->screen_shmem_pixels = 0;
- mod->screen_shmem_id_mapped = 0;
- }
- else
- {
- mod->screen_shmem_id_mapped = 1;
- }
+ /* failed */
+ amod->screen_shmem_id = 0;
+ amod->screen_shmem_pixels = 0;
+ amod->screen_shmem_id_mapped = 0;
}
- if (mod->screen_shmem_pixels != 0)
+ else
{
- bmpdata = mod->screen_shmem_pixels + shmem_offset;
+ amod->screen_shmem_id_mapped = 1;
}
}
+ if (amod->screen_shmem_pixels != 0)
+ {
+ bmpdata = amod->screen_shmem_pixels + shmem_offset;
+ }
if (bmpdata != 0)
{
- rv = mod->server_paint_rect(mod, x, y, cx, cy,
- bmpdata, width, height,
- srcx, srcy);
+ rv = amod->server_paint_rect(amod, x, y, cx, cy,
+ bmpdata, width, height,
+ srcx, srcy);
}
- send_paint_rect_ack(mod, flags, x, y, cx, cy, frame_id);
+ send_paint_rect_ack(amod, flags, x, y, cx, cy, frame_id);
return rv;
}
@@ -1184,7 +1133,7 @@ send_paint_rect_ex_ack(struct mod *mod, int flags, int frame_id)
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ lib_send_copy(mod, s);
free_stream(s);
return 0;
}
@@ -1301,6 +1250,7 @@ lib_mod_process_orders(struct mod *mod, int type, struct stream *s)
{
int rv;
+ LLOGLN(10, ("lib_mod_process_orders: type %d", type));
rv = 0;
switch (type)
{
@@ -1421,17 +1371,16 @@ lib_send_client_info(struct mod *mod)
len = (int)(s->end - s->data);
s_pop_layer(s, iso_hdr);
out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ lib_send_copy(mod, s);
free_stream(s);
return 0;
}
/******************************************************************************/
/* return error */
-int DEFAULT_CC
-lib_mod_signal(struct mod *mod)
+static int APP_CC
+lib_mod_process_message(struct mod *mod, struct stream *s)
{
- struct stream *s;
int num_orders;
int index;
int rv;
@@ -1439,85 +1388,65 @@ lib_mod_signal(struct mod *mod)
int type;
char *phold;
- LIB_DEBUG(mod, "in lib_mod_signal");
- make_stream(s);
- init_stream(s, 8192);
- rv = lib_recv(mod, s->data, 8);
-
+ LLOGLN(10, ("lib_mod_process_message:"));
+ rv = 0;
if (rv == 0)
{
in_uint16_le(s, type);
in_uint16_le(s, num_orders);
in_uint32_le(s, len);
+ LLOGLN(10, ("lib_mod_process_message: type %d", type));
if (type == 1) /* original order list */
{
- init_stream(s, len);
- rv = lib_recv(mod, s->data, len);
-
- if (rv == 0)
+ for (index = 0; index < num_orders; index++)
{
- for (index = 0; index < num_orders; index++)
- {
- in_uint16_le(s, type);
- rv = lib_mod_process_orders(mod, type, s);
+ in_uint16_le(s, type);
+ rv = lib_mod_process_orders(mod, type, s);
- if (rv != 0)
- {
- break;
- }
+ if (rv != 0)
+ {
+ break;
}
}
}
else if (type == 2) /* caps */
{
- g_writeln("lib_mod_signal: type 2 len %d", len);
- init_stream(s, len);
- rv = lib_recv(mod, s->data, len);
-
- if (rv == 0)
+ g_writeln("lib_mod_process_message: type 2 len %d", len);
+ for (index = 0; index < num_orders; index++)
{
- for (index = 0; index < num_orders; index++)
+ phold = s->p;
+ in_uint16_le(s, type);
+ in_uint16_le(s, len);
+
+ switch (type)
{
- phold = s->p;
- in_uint16_le(s, type);
- in_uint16_le(s, len);
-
- switch (type)
- {
- default:
- g_writeln("lib_mod_signal: unknown cap type %d len %d",
- type, len);
- break;
- }
-
- s->p = phold + len;
+ default:
+ g_writeln("lib_mod_process_message: unknown cap type %d len %d",
+ type, len);
+ break;
}
- lib_send_client_info(mod);
+ s->p = phold + len;
}
+
+ lib_send_client_info(mod);
}
else if (type == 3) /* order list with len after type */
{
- init_stream(s, len);
- rv = lib_recv(mod, s->data, len);
-
- if (rv == 0)
+ for (index = 0; index < num_orders; index++)
{
- for (index = 0; index < num_orders; index++)
- {
- phold = s->p;
- in_uint16_le(s, type);
- in_uint16_le(s, len);
- rv = lib_mod_process_orders(mod, type, s);
-
- if (rv != 0)
- {
- break;
- }
+ phold = s->p;
+ in_uint16_le(s, type);
+ in_uint16_le(s, len);
+ rv = lib_mod_process_orders(mod, type, s);
- s->p = phold + len;
+ if (rv != 0)
+ {
+ break;
}
+
+ s->p = phold + len;
}
}
else
@@ -1526,14 +1455,21 @@ lib_mod_signal(struct mod *mod)
}
}
- free_stream(s);
- LIB_DEBUG(mod, "out lib_mod_signal");
return rv;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
+lib_mod_signal(struct mod *mod)
+{
+ g_writeln("lib_mod_signal: not used");
+ return 0;
+}
+
+/******************************************************************************/
+/* return error */
+int DEFAULT_CC
lib_mod_end(struct mod *mod)
{
if (mod->screen_shmem_pixels != 0)
@@ -1579,19 +1515,14 @@ int DEFAULT_CC
lib_mod_get_wait_objs(struct mod *mod, tbus *read_objs, int *rcount,
tbus *write_objs, int *wcount, int *timeout)
{
- int i;
-
- i = *rcount;
-
if (mod != 0)
{
- if (mod->sck_obj != 0)
+ if (mod->trans != 0)
{
- read_objs[i++] = mod->sck_obj;
+ trans_get_wait_objs_rw(mod->trans, read_objs, rcount,
+ write_objs, wcount, timeout);
}
}
-
- *rcount = i;
return 0;
}
@@ -1603,15 +1534,11 @@ lib_mod_check_wait_objs(struct mod *mod)
int rv;
rv = 0;
-
if (mod != 0)
{
- if (mod->sck_obj != 0)
+ if (mod->trans != 0)
{
- if (g_is_wait_obj_set(mod->sck_obj))
- {
- rv = lib_mod_signal(mod);
- }
+ rv = trans_check_wait_objs(mod->trans);
}
}
@@ -1658,9 +1585,7 @@ mod_exit(struct mod *mod)
{
return 0;
}
-
- g_delete_wait_obj_from_socket(mod->sck_obj);
- g_tcp_close(mod->sck);
+ trans_delete(mod->trans);
g_free(mod);
return 0;
}
diff --git a/xup/xup.h b/xup/xup.h
index 3a569c7f..70cdcf27 100644
--- a/xup/xup.h
+++ b/xup/xup.h
@@ -1,7 +1,7 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
- * Copyright (C) Jay Sorg 2004-2014
+ * Copyright (C) Jay Sorg 2004-2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
#include "xrdp_client_info.h"
#include "xrdp_rail.h"
-#define CURRENT_MOD_VER 2
+#define CURRENT_MOD_VER 3
struct mod
{
@@ -45,8 +45,8 @@ struct mod
tbus* write_objs, int* wcount, int* timeout);
int (*mod_check_wait_objs)(struct mod* v);
int (*mod_frame_ack)(struct mod* v, int flags, int frame_id);
- tbus mod_dumby[100 - 10]; /* align, 100 minus the number of mod
- functions above */
+ tintptr mod_dumby[100 - 10]; /* align, 100 minus the number of mod
+ functions above */
/* server functions */
int (*server_begin_update)(struct mod* v);
int (*server_end_update)(struct mod* v);
@@ -71,7 +71,7 @@ struct mod
int (*server_set_pen)(struct mod* v, int style,
int width);
int (*server_draw_line)(struct mod* v, int x1, int y1, int x2, int y2);
- int (*server_add_char)(struct mod* v, int font, int charactor,
+ int (*server_add_char)(struct mod* v, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int (*server_draw_text)(struct mod* v, int font,
@@ -121,7 +121,7 @@ struct mod
int flags);
int (*server_set_cursor_ex)(struct mod* v, int x, int y, char* data,
char* mask, int bpp);
- int (*server_add_char_alpha)(struct mod* v, int font, int charactor,
+ int (*server_add_char_alpha)(struct mod* v, int font, int character,
int offset, int baseline,
int width, int height, char* data);
int (*server_create_os_surface_bpp)(struct mod* v, int rdpindex,
@@ -140,13 +140,13 @@ struct mod
char *data, int width, int height,
int flags, int frame_id);
- tbus server_dumby[100 - 43]; /* align, 100 minus the number of server
- functions above */
+ tintptr server_dumby[100 - 43]; /* align, 100 minus the number of server
+ functions above */
/* common */
- tbus handle; /* pointer to self as long */
- tbus wm;
- tbus painter;
- int sck;
+ tintptr handle; /* pointer to self as long */
+ tintptr wm;
+ tintptr painter;
+ tintptr si;
/* mod data */
int width;
int height;
@@ -156,10 +156,10 @@ struct mod
char password[256];
char ip[256];
char port[256];
- tbus sck_obj;
int shift_state;
struct xrdp_client_info client_info;
int screen_shmem_id;
int screen_shmem_id_mapped; /* boolean */
char *screen_shmem_pixels;
+ struct trans *trans;
};