Reinhard Russinger 5 anni fa
parent
commit
79965dcab7
100 ha cambiato i file con 2553 aggiunte e 20939 eliminazioni
  1. 1 1
      board/GfA/Display001/BUILD
  2. 3 2
      board/GfA/Display001/rootfs/root/CopyEMMCtoSD.sh
  3. 3 2
      board/GfA/Display001/rootfs/root/CopySDtoEMMC.sh
  4. BIN
      board/GfA/Display001/rootfs/root/gfa_spi
  5. BIN
      board/GfA/Display001/rootfs/var/GfA/Display_GSM
  6. 3 3
      board/GfA/Display001/rootfs/var/GfA/WebVnc/index.vnc
  7. 382 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile
  8. 2 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.am
  9. 382 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.in
  10. 3 3
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/README
  11. 1 1
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/proxy.vnc
  12. 5 5
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ss_vncviewer
  13. 0 111
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/tightvnc-1.3dev7_javasrc-vncviewer-cursor-colors+no-tab-traversal.patch
  14. 0 2600
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.patch
  15. 0 5494
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultravnc-102-JavaViewer-ssl-etc.patch
  16. 54 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/CONTRIBUTING.md
  17. 84 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/LICENSE.txt
  18. 132 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/README.md
  19. 0 56
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/error-handler.js
  20. 0 92
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/alt.svg
  21. 0 106
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/clipboard.svg
  22. 0 96
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/connect.svg
  23. 0 96
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrl.svg
  24. 0 100
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrlaltdel.svg
  25. 0 94
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/disconnect.svg
  26. 0 71
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/drag.svg
  27. 0 81
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/error.svg
  28. 0 92
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/esc.svg
  29. 0 69
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/expander.svg
  30. 0 93
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/fullscreen.svg
  31. 0 82
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle.svg
  32. 0 172
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle_bg.svg
  33. 0 42
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/Makefile
  34. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-120x120.png
  35. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-144x144.png
  36. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-152x152.png
  37. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-16x16.png
  38. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-192x192.png
  39. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-24x24.png
  40. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-32x32.png
  41. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-48x48.png
  42. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-60x60.png
  43. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-64x64.png
  44. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-72x72.png
  45. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-76x76.png
  46. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-96x96.png
  47. 0 163
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon-sm.svg
  48. 0 163
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon.svg
  49. 0 81
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/info.svg
  50. 0 75
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/keyboard.svg
  51. 0 92
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_left.svg
  52. 0 92
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_middle.svg
  53. 0 92
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_none.svg
  54. 0 92
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_right.svg
  55. 0 87
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/power.svg
  56. 0 76
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/settings.svg
  57. 0 86
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/tab.svg
  58. 0 90
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/toggleextrakeys.svg
  59. 0 81
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/warning.svg
  60. 0 69
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/de.json
  61. 0 69
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/el.json
  62. 0 68
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/es.json
  63. 0 68
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/nl.json
  64. 0 69
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/pl.json
  65. 0 68
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/sv.json
  66. 0 69
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/tr.json
  67. 0 69
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/zh.json
  68. 0 170
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/localization.js
  69. 0 4
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/CREDITS
  70. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.mp3
  71. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.oga
  72. 0 902
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/base.css
  73. 0 63
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/lite.css
  74. 0 1669
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/ui.js
  75. 0 698
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/display.js
  76. 0 40
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/encodings.js
  77. 0 310
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/domkeytable.js
  78. 0 127
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/fixedkeys.js
  79. 0 314
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/keyboard.js
  80. 0 614
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/keysym.js
  81. 0 688
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/keysymdef.js
  82. 0 280
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/mouse.js
  83. 0 167
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/util.js
  84. 0 116
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/vkeys.js
  85. 0 171
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/xtscancodes.js
  86. 0 2540
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/rfb.js
  87. 0 69
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/browser.js
  88. 0 138
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/events.js
  89. 0 40
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/eventtarget.js
  90. 0 51
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/logging.js
  91. 0 54
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/polyfill.js
  92. 0 15
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/strings.js
  93. 0 316
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/websock.js
  94. 202 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.Apache-2.0
  95. 22 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.BSD-2-Clause
  96. 24 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.BSD-3-Clause
  97. 621 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.GPL-3
  98. 165 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.LGPL-3
  99. 373 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.MPL-2.0
  100. 91 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.OFL-1.1

+ 1 - 1
board/GfA/Display001/BUILD

@@ -1 +1 @@
-666
+667

+ 3 - 2
board/GfA/Display001/rootfs/root/CopyEMMCtoSD.sh

@@ -53,6 +53,7 @@ p
 t
 t
 e
 e
 a
 a
+1
 n
 n
 p
 p
 2
 2
@@ -61,8 +62,8 @@ p
 p
 p
 w
 w
 EOF
 EOF
-mkfs.vfat -F 16 /dev/mmcblk0p1
-mkfs.ext4 -F /dev/mmcblk0p2
+/sbin/mkfs.vfat -F 16 /dev/mmcblk0p1
+/usr/sbin/mkfs.ext4 -F /dev/mmcblk0p2
 # temp. mountdirectories
 # temp. mountdirectories
 mkdir /tmp/boot
 mkdir /tmp/boot
 mkdir /tmp/bootdata
 mkdir /tmp/bootdata

+ 3 - 2
board/GfA/Display001/rootfs/root/CopySDtoEMMC.sh

@@ -53,6 +53,7 @@ p
 t
 t
 e
 e
 a
 a
+1
 n
 n
 p
 p
 2
 2
@@ -61,8 +62,8 @@ p
 p
 p
 w
 w
 EOF
 EOF
-mkfs.vfat -F 16 /dev/mmcblk1p1
-mkfs.ext4 -F /dev/mmcblk1p2
+/sbin/mkfs.vfat -F 16 /dev/mmcblk1p1
+/usr/sbin/mkfs.ext4 -F /dev/mmcblk1p2
 # temp. mountdirectories
 # temp. mountdirectories
 mkdir /tmp/boot
 mkdir /tmp/boot
 mkdir /tmp/bootdata
 mkdir /tmp/bootdata

BIN
board/GfA/Display001/rootfs/root/gfa_spi


BIN
board/GfA/Display001/rootfs/var/GfA/Display_GSM


+ 3 - 3
board/GfA/Display001/rootfs/var/GfA/WebVnc/index.vnc

@@ -18,7 +18,7 @@ $USER's $DESKTOP desktop ($DISPLAY)
 <br/>
 <br/>
 <br/>
 <br/>
 
 
-If the above Java applet does not work, you can also try the new JavaScript-only <a href="https://novnc.com/">noVNC</a> viewer. You will need a HTML5-capable browser though.
+If the above Java applet does not work, you can also try the new JavaScript-only <a href="http://kanaka.github.com/noVNC/">noVNC</a> viewer. You will need a HTML5-capable browser though.
 <script language="JavaScript">
 <script language="JavaScript">
     <!--
     <!--
     function start_novnc(){
     function start_novnc(){
@@ -30,7 +30,7 @@ If the above Java applet does not work, you can also try the new JavaScript-only
 	   if(host.charAt(host.length-1) != "]")
 	   if(host.charAt(host.length-1) != "]")
 	      host = host + "]";
 	      host = host + "]";
 	}
 	}
-	open("novnc/vnc.html?autoconnect=true&host=" + host + "&port=$PORT");
+	open("novnc/vnc_auto.html?host=" + host + "&port=$PORT&true_color=1");
     }
     }
     -->
     -->
 </script>
 </script>
@@ -41,5 +41,5 @@ If the above Java applet does not work, you can also try the new JavaScript-only
 <br/>
 <br/>
 <br/>
 <br/>
 <br/>
 <br/>
-<A href="https://libvnc.github.io/">LibVNCServer/LibVNCClient Homepage</A>
+<A href="http://libvncserver.sf.net/">LibVNCServer/LibVNCClient Homepage</A>
 </HTML>
 </HTML>

+ 382 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile

@@ -0,0 +1,382 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# webclients/java-applet/ssl/Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+pkgdatadir = $(datadir)/LibVNCServer
+pkgincludedir = $(includedir)/LibVNCServer
+pkglibdir = $(libdir)/LibVNCServer
+pkglibexecdir = $(libexecdir)/LibVNCServer
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = arm-buildroot-linux-gnueabihf
+subdir = webclients/java-applet/ssl
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/rfbconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run aclocal-1.11
+AMTAR = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run tar
+AM_DEFAULT_VERBOSITY = 0
+AR = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-ar
+AS = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-as
+AUTOCONF = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run automake-1.11
+AVAHI_CFLAGS = 
+AVAHI_LIBS = 
+AWK = gawk
+CC = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-gcc
+CCDEPMODE = depmode=none
+CFLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -pipe -Os -g2 -Wall -I/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/include
+CPP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-cpp
+CPPFLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
+CRYPT_LIBS = -lcrypt
+CXX = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-g++
+CXXCPP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-g++ -E
+CXXDEPMODE = depmode=none
+CXXFLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -pipe -Os -g2
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DLLTOOL = dlltool
+ECHO = echo
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = /bin/grep -E
+EXEEXT = 
+F77 = 
+FFLAGS = 
+GNUTLS_CFLAGS = 
+GNUTLS_LIBS = 
+GREP = /bin/grep
+GTK_CFLAGS = 
+GTK_LIBS = 
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+JPEG_LDFLAGS = 
+LDFLAGS = 
+LIBGCRYPT_CFLAGS = -I/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/include
+LIBGCRYPT_CONFIG = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/bin/libgcrypt-config
+LIBGCRYPT_LIBS = -L/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib -lgcrypt -lgpg-error
+LIBOBJS =  ${LIBOBJDIR}lstat$U.o ${LIBOBJDIR}stat$U.o
+LIBS = -lnsl -lpthread -lz -lpng -ljpeg -lresolv -lssl -lcrypto -L/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib -lgcrypt -lgpg-error
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LN_S = ln -s
+LTLIBOBJS =  ${LIBOBJDIR}lstat$U.lo ${LIBOBJDIR}stat$U.lo
+MAKEINFO = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run makeinfo
+MKDIR_P = /bin/mkdir -p
+OBJDUMP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-objdump
+OBJEXT = o
+PACKAGE = LibVNCServer
+PACKAGE_BUGREPORT = http://sourceforge.net/projects/libvncserver
+PACKAGE_NAME = LibVNCServer
+PACKAGE_STRING = LibVNCServer 0.9.9
+PACKAGE_TARNAME = libvncserver
+PACKAGE_URL = 
+PACKAGE_VERSION = 0.9.9
+PATH_SEPARATOR = :
+PKG_CONFIG = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/pkg-config
+PKG_CONFIG_LIBDIR = 
+PKG_CONFIG_PATH = 
+RANLIB = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-ranlib
+RPMSOURCEDIR = NOT-FOUND
+SDL_CFLAGS = 
+SDL_LIBS = 
+SET_MAKE = 
+SHELL = /bin/bash
+SSL_LIBS = -lssl -lcrypto
+STRIP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-strip
+SYSTEM_LIBVNCSERVER_CFLAGS = 
+SYSTEM_LIBVNCSERVER_LIBS = 
+VERSION = 0.9.9
+WSOCKLIB = 
+XMKMF = 
+X_CFLAGS = 
+X_EXTRA_LIBS = 
+X_LIBS = 
+X_PRE_LIBS = 
+abs_builddir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/webclients/java-applet/ssl
+abs_srcdir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/webclients/java-applet/ssl
+abs_top_builddir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9
+abs_top_srcdir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9
+ac_ct_CC = 
+ac_ct_CXX = 
+ac_ct_F77 = 
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias = x86_64-unknown-linux-gnu
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = /usr
+host = arm-buildroot-linux-gnueabihf
+host_alias = arm-buildroot-linux-gnueabihf
+host_cpu = arm
+host_os = linux-gnueabihf
+host_vendor = buildroot
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = /var
+mandir = ${datarootdir}/man
+mkdir_p = /bin/mkdir -p
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr
+program_transform_name = s&^&&
+psdir = ${docdir}
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = /etc
+target_alias = arm-buildroot-linux-gnueabihf
+top_build_prefix = ../../../
+top_builddir = ../../..
+top_srcdir = ../../..
+with_ffmpeg = 
+EXTRA_DIST = VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc ultraproxy.vnc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 2 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.am

@@ -0,0 +1,2 @@
+EXTRA_DIST=VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc ultraproxy.vnc
+

+ 382 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.in

@@ -0,0 +1,382 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = webclients/java-applet/ssl
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/rfbconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AVAHI_CFLAGS = @AVAHI_CFLAGS@
+AVAHI_LIBS = @AVAHI_LIBS@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CRYPT_LIBS = @CRYPT_LIBS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GREP = @GREP@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JPEG_LDFLAGS = @JPEG_LDFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
+LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
+LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RPMSOURCEDIR = @RPMSOURCEDIR@
+SDL_CFLAGS = @SDL_CFLAGS@
+SDL_LIBS = @SDL_LIBS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SSL_LIBS = @SSL_LIBS@
+STRIP = @STRIP@
+SYSTEM_LIBVNCSERVER_CFLAGS = @SYSTEM_LIBVNCSERVER_CFLAGS@
+SYSTEM_LIBVNCSERVER_LIBS = @SYSTEM_LIBVNCSERVER_LIBS@
+VERSION = @VERSION@
+WSOCKLIB = @WSOCKLIB@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+with_ffmpeg = @with_ffmpeg@
+EXTRA_DIST = VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc ultraproxy.vnc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 3 - 3
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/README

@@ -42,9 +42,9 @@ Send full Java Console output for failures.
 Tips:
 Tips:
 
 
 When doing single-port proxy connections (e.g. both VNC and HTTPS
 When doing single-port proxy connections (e.g. both VNC and HTTPS
-through port 5900) it helps to move through the 'do you trust this site'
+thru port 5900) it helps to move through the 'do you trust this site'
 dialogs quickly.   x11vnc has to wait to see if the traffic is VNC or
 dialogs quickly.   x11vnc has to wait to see if the traffic is VNC or
-HTTP and this can cause timeouts if you don't move through them quickly.
+HTTP and this can cause timeouts if you don't move thru them quickly.
 
 
 You may have to restart your browser completely if it gets into a
 You may have to restart your browser completely if it gets into a
 weird state.  For one case we saw the JVM requesting VncViewer.class
 weird state.  For one case we saw the JVM requesting VncViewer.class
@@ -172,7 +172,7 @@ Both TightVNC and UltraVNC Java viewers:
 	Set to do a special HTTP GET (/request.https.vnc.connection)
 	Set to do a special HTTP GET (/request.https.vnc.connection)
 	to the vnc server that will cause it to switch to VNC instead.
 	to the vnc server that will cause it to switch to VNC instead.
 	This is to speedup/make more robust, the single port HTTPS and VNC
 	This is to speedup/make more robust, the single port HTTPS and VNC
-	mode of x11vnc (e.g. both services through port 5900, etc)
+	mode of x11vnc (e.g. both services thru port 5900, etc) 
 	
 	
   urlPrefix
   urlPrefix
 	string, default: none
 	string, default: none

+ 1 - 1
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/proxy.vnc

@@ -25,7 +25,7 @@ fails in the proxy environment.
 The applet is not allowed to open a socket connection to the proxy (since
 The applet is not allowed to open a socket connection to the proxy (since
 that would let it connect to just about any host, e.g. CONNECT method).
 that would let it connect to just about any host, e.g. CONNECT method).
 
 
-This is independent of SSL but of course fails for that socket connection
+This is indpendent of SSL but of course fails for that socket connection
 as well.  I.e. this is a problem for non-SSL VNC Viewers as well.
 as well.  I.e. this is a problem for non-SSL VNC Viewers as well.
 
 
 Solution?  Sign the applet and have the user click on "Yes" that they
 Solution?  Sign the applet and have the user click on "Yes" that they

+ 5 - 5
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ss_vncviewer

@@ -91,7 +91,7 @@
 #
 #
 #             [user1@]host1[:port1],[user2@]host2[:port2]
 #             [user1@]host1[:port1],[user2@]host2[:port2]
 #
 #
-#         in which case a ssh to host1 and through it via a -L redir a 2nd
+#         in which case a ssh to host1 and thru it via a -L redir a 2nd
 #         ssh is established to host2.  
 #         ssh is established to host2.  
 #
 #
 #         Examples:
 #         Examples:
@@ -109,10 +109,10 @@
 #
 #
 # -sshargs "args"  pass "args" to the ssh process, e.g. -L/-R port redirs.
 # -sshargs "args"  pass "args" to the ssh process, e.g. -L/-R port redirs.
 #
 #
-# -sshssl Tunnel the SSL connection through a SSH connection.  The tunnel as
-#         under -ssh is set up and the SSL connection goes through it.  Use
+# -sshssl Tunnel the SSL connection thru a SSH connection.  The tunnel as
+#         under -ssh is set up and the SSL connection goes thru it.  Use
 #         this if you want to have and end-to-end SSL connection but must
 #         this if you want to have and end-to-end SSL connection but must
-#         go through a SSH gateway host (e.g. not the vnc server).  Or use
+#         go thru a SSH gateway host (e.g. not the vnc server).  Or use
 #         this if you need to tunnel additional services via -R and -L 
 #         this if you need to tunnel additional services via -R and -L 
 #         (see -sshargs above).
 #         (see -sshargs above).
 #
 #
@@ -351,7 +351,7 @@ if [ "X$SKIP_STUNNEL_NO_SYSLOG" = "X" ]; then
 	STUNNEL_NO_SYSLOG=1; export STUNNEL_NO_SYSLOG
 	STUNNEL_NO_SYSLOG=1; export STUNNEL_NO_SYSLOG
 fi
 fi
 
 
-# this is the -t ssh option (gives better keyboard response through SSH tunnel)
+# this is the -t ssh option (gives better keyboard response thru SSH tunnel)
 targ="-t"
 targ="-t"
 if [ "X$SS_VNCVIEWER_NO_T" != "X" ]; then
 if [ "X$SS_VNCVIEWER_NO_T" != "X" ]; then
 	targ=""
 	targ=""

+ 0 - 111
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/tightvnc-1.3dev7_javasrc-vncviewer-cursor-colors+no-tab-traversal.patch

@@ -1,111 +0,0 @@
---- vnc_javasrc.orig/VncCanvas.java	2004-10-10 02:15:54.000000000 -0400
-+++ vnc_javasrc/VncCanvas.java	2010-11-30 21:01:15.000000000 -0500
-@@ -28,13 +28,14 @@
- import java.lang.*;
- import java.util.zip.*;
- 
-+import java.util.Collections;
- 
- //
- // VncCanvas is a subclass of Canvas which draws a VNC desktop on it.
- //
- 
- class VncCanvas extends Canvas
--  implements KeyListener, MouseListener, MouseMotionListener {
-+  implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener {
- 
-   VncViewer viewer;
-   RfbProto rfb;
-@@ -81,6 +82,20 @@
-     cm8 = new DirectColorModel(8, 7, (7 << 3), (3 << 6));
-     cm24 = new DirectColorModel(24, 0xFF0000, 0x00FF00, 0x0000FF);
- 
-+    // kludge to not show any Java cursor in the canvas since we are
-+    // showing the soft cursor (should be a user setting...)
-+    Cursor dot = Toolkit.getDefaultToolkit().createCustomCursor(
-+        Toolkit.getDefaultToolkit().createImage(new byte[4]), new Point(0,0),
-+        "dot");
-+    this.setCursor(dot);
-+
-+    // while we are at it... get rid of the keyboard traversals that
-+    // make it so we can't type a Tab character:
-+    this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
-+        Collections.EMPTY_SET);
-+    this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
-+        Collections.EMPTY_SET);
-+
-     colors = new Color[256];
-     for (int i = 0; i < 256; i++)
-       colors[i] = new Color(cm8.getRGB(i));
-@@ -169,6 +184,7 @@
-       inputEnabled = true;
-       addMouseListener(this);
-       addMouseMotionListener(this);
-+      addMouseWheelListener(this);
-       if (viewer.showControls) {
- 	viewer.buttonPanel.enableRemoteAccessControls(true);
-       }
-@@ -177,6 +193,7 @@
-       inputEnabled = false;
-       removeMouseListener(this);
-       removeMouseMotionListener(this);
-+      removeMouseWheelListener(this);
-       if (viewer.showControls) {
- 	viewer.buttonPanel.enableRemoteAccessControls(false);
-       }
-@@ -1190,6 +1207,9 @@
-   public void mouseDragged(MouseEvent evt) {
-     processLocalMouseEvent(evt, true);
-   }
-+  public void mouseWheelMoved(MouseWheelEvent evt) {
-+    processLocalMouseWheelEvent(evt);
-+  }
- 
-   public void processLocalKeyEvent(KeyEvent evt) {
-     if (viewer.rfb != null && rfb.inNormalProtocol) {
-@@ -1221,6 +1241,19 @@
-     evt.consume();
-   }
- 
-+  public void processLocalMouseWheelEvent(MouseWheelEvent evt) {
-+    if (viewer.rfb != null && rfb.inNormalProtocol) {
-+      synchronized(rfb) {
-+	try {
-+	  rfb.writeWheelEvent(evt);
-+	} catch (Exception e) {
-+	  e.printStackTrace();
-+	}
-+	rfb.notify();
-+      }
-+    }
-+  }
-+
-   public void processLocalMouseEvent(MouseEvent evt, boolean moved) {
-     if (viewer.rfb != null && rfb.inNormalProtocol) {
-       if (moved) {
-@@ -1387,9 +1420,9 @@
- 		result = cm8.getRGB(pixBuf[i]);
- 	      } else {
- 		result = 0xFF000000 |
--		  (pixBuf[i * 4 + 1] & 0xFF) << 16 |
--		  (pixBuf[i * 4 + 2] & 0xFF) << 8 |
--		  (pixBuf[i * 4 + 3] & 0xFF);
-+		  (pixBuf[i * 4 + 2] & 0xFF) << 16 |
-+		  (pixBuf[i * 4 + 1] & 0xFF) << 8 |
-+		  (pixBuf[i * 4 + 0] & 0xFF);
- 	      }
- 	    } else {
- 	      result = 0;	// Transparent pixel
-@@ -1403,9 +1436,9 @@
- 	      result = cm8.getRGB(pixBuf[i]);
- 	    } else {
- 	      result = 0xFF000000 |
--		(pixBuf[i * 4 + 1] & 0xFF) << 16 |
--		(pixBuf[i * 4 + 2] & 0xFF) << 8 |
--		(pixBuf[i * 4 + 3] & 0xFF);
-+		(pixBuf[i * 4 + 2] & 0xFF) << 16 |
-+		(pixBuf[i * 4 + 1] & 0xFF) << 8 |
-+		(pixBuf[i * 4 + 0] & 0xFF);
- 	    }
- 	  } else {
- 	    result = 0;		// Transparent pixel

+ 0 - 2600
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.patch

@@ -1,2600 +0,0 @@
-diff -Naur vnc_javasrc.orig/Makefile vnc_javasrc/Makefile
---- vnc_javasrc.orig/Makefile	2004-03-04 08:34:25.000000000 -0500
-+++ vnc_javasrc/Makefile	2010-05-18 20:56:26.000000000 -0400
-@@ -4,6 +4,7 @@
- 
- CP = cp
- JC = javac
-+JC_ARGS = -target 1.4 -source 1.4
- JAR = jar
- ARCHIVE = VncViewer.jar
- MANIFEST = MANIFEST.MF
-@@ -15,25 +16,29 @@
- 	  DesCipher.class CapabilityInfo.class CapsContainer.class \
- 	  RecordingFrame.class SessionRecorder.class AuthUnixLoginPanel.class \
- 	  SocketFactory.class HTTPConnectSocketFactory.class \
--	  HTTPConnectSocket.class ReloginPanel.class
-+	  HTTPConnectSocket.class ReloginPanel.class \
-+	  SSLSocketToMe.class
-+
-+SSL_CLASSES = SSLSocketToMe*.class TrustDialog.class
- 
- SOURCES = VncViewer.java RfbProto.java AuthPanel.java VncCanvas.java \
- 	  OptionsFrame.java ClipboardFrame.java ButtonPanel.java \
- 	  DesCipher.java CapabilityInfo.java CapsContainer.java \
- 	  RecordingFrame.java SessionRecorder.java AuthUnixLoginPanel.java \
- 	  SocketFactory.java HTTPConnectSocketFactory.java \
--	  HTTPConnectSocket.java ReloginPanel.java
-+	  HTTPConnectSocket.java ReloginPanel.java \
-+	  SSLSocketToMe.java
- 
- all: $(CLASSES) $(ARCHIVE)
- 
- $(CLASSES): $(SOURCES)
--	$(JC) -target 1.1 -O $(SOURCES)
-+	$(JC) $(JC_ARGS) -O $(SOURCES)
- 
- $(ARCHIVE): $(CLASSES) $(MANIFEST)
--	$(JAR) cfm $(ARCHIVE) $(MANIFEST) $(CLASSES)
-+	$(JAR) cfm $(ARCHIVE) $(MANIFEST) $(CLASSES) $(SSL_CLASSES)
- 
- install: $(CLASSES) $(ARCHIVE)
--	$(CP) $(CLASSES) $(ARCHIVE) $(PAGES) $(INSTALL_DIR)
-+	$(CP) $(CLASSES) $(SSL_CLASSES) $(ARCHIVE) $(PAGES) $(INSTALL_DIR)
- 
- export:: $(CLASSES) $(ARCHIVE) $(PAGES)
- 	@$(ExportJavaClasses)
-diff -Naur vnc_javasrc.orig/RfbProto.java vnc_javasrc/RfbProto.java
---- vnc_javasrc.orig/RfbProto.java	2004-03-04 08:34:25.000000000 -0500
-+++ vnc_javasrc/RfbProto.java	2010-11-30 22:05:12.000000000 -0500
-@@ -199,7 +199,21 @@
-     host = h;
-     port = p;
- 
--    if (viewer.socketFactory == null) {
-+    if (! viewer.disableSSL) {
-+	System.out.println("new SSLSocketToMe");
-+	SSLSocketToMe ssl;
-+	try {
-+		ssl = new SSLSocketToMe(host, port, v);
-+	} catch (Exception e) {
-+		throw new IOException(e.getMessage());
-+	}
-+
-+	try {
-+		sock = ssl.connectSock();
-+	} catch (Exception es) {
-+		throw new IOException(es.getMessage());
-+	}
-+    } else if (viewer.socketFactory == null) {
-       sock = new Socket(host, port);
-     } else {
-       try {
-@@ -255,7 +269,7 @@
- 	|| (b[10] < '0') || (b[10] > '9') || (b[11] != '\n'))
-     {
-       throw new Exception("Host " + host + " port " + port +
--			  " is not an RFB server");
-+			  " is not an RFB server: " + b);
-     }
- 
-     serverMajor = (b[4] - '0') * 100 + (b[5] - '0') * 10 + (b[6] - '0');
-@@ -892,6 +906,38 @@
-   final static int ALT_MASK   = InputEvent.ALT_MASK;
- 
- 
-+  void writeWheelEvent(MouseWheelEvent evt) throws IOException {
-+
-+    eventBufLen = 0;
-+
-+    int x = evt.getX();
-+    int y = evt.getY();
-+
-+    if (x < 0) x = 0;
-+    if (y < 0) y = 0;
-+
-+    int ptrmask;
-+
-+    int clicks = evt.getWheelRotation();
-+    System.out.println("writeWheelEvent: clicks: " + clicks);
-+    if (clicks > 0) {
-+    	ptrmask = 16;
-+    } else if (clicks < 0) {
-+    	ptrmask = 8;
-+    } else {
-+    	return;
-+    }
-+
-+    eventBuf[eventBufLen++] = (byte) PointerEvent;
-+    eventBuf[eventBufLen++] = (byte) ptrmask;
-+    eventBuf[eventBufLen++] = (byte) ((x >> 8) & 0xff);
-+    eventBuf[eventBufLen++] = (byte) (x & 0xff);
-+    eventBuf[eventBufLen++] = (byte) ((y >> 8) & 0xff);
-+    eventBuf[eventBufLen++] = (byte) (y & 0xff);
-+
-+    os.write(eventBuf, 0, eventBufLen);
-+  }
-+
-   //
-   // Write a pointer event message.  We may need to send modifier key events
-   // around it to set the correct modifier state.
-@@ -992,6 +1038,19 @@
-     boolean down = (evt.getID() == KeyEvent.KEY_PRESSED);
- 
-     int key;
-+	if (viewer.debugKeyboard) {
-+		System.out.println("----------------------------------------");
-+		System.out.println("evt.getKeyChar:      " + evt.getKeyChar());
-+		System.out.println("getKeyText:          " + KeyEvent.getKeyText(evt.getKeyCode()));
-+		System.out.println("evt.getKeyCode:      " + evt.getKeyCode());
-+		System.out.println("evt.getID:           " + evt.getID());
-+		System.out.println("evt.getKeyLocation:  " + evt.getKeyLocation());
-+		System.out.println("evt.isActionKey:     " + evt.isActionKey());
-+		System.out.println("evt.isControlDown:   " + evt.isControlDown());
-+		System.out.println("evt.getModifiers:    " + evt.getModifiers());
-+		System.out.println("getKeyModifiersText: " + KeyEvent.getKeyModifiersText(evt.getModifiers()));
-+		System.out.println("evt.paramString:     " + evt.paramString());
-+	}
-     if (evt.isActionKey()) {
- 
-       //
-@@ -1025,6 +1084,13 @@
-         return;
-       }
- 
-+      if(key == 0xffc2 && viewer.mapF5_to_atsign) {
-+	 if (viewer.debugKeyboard) {
-+	    System.out.println("Mapping: F5 -> AT ");
-+	 }
-+      	 key = 0x40;
-+      }
-+
-     } else {
- 
-       //
-@@ -1036,6 +1102,7 @@
- 
-       key = keyChar;
- 
-+
-       if (key < 0x20) {
-         if (evt.isControlDown()) {
-           key += 0x60;
-@@ -1121,6 +1188,16 @@
-   int oldModifiers = 0;
- 
-   void writeModifierKeyEvents(int newModifiers) {
-+    if(viewer.forbid_Ctrl_Alt) {
-+	if ((newModifiers & CTRL_MASK) != 0 && (newModifiers & ALT_MASK) != 0) {
-+		int orig = newModifiers;
-+		newModifiers &= ~ALT_MASK;
-+		newModifiers &= ~CTRL_MASK;
-+		if (viewer.debugKeyboard) {
-+			System.out.println("Ctrl+Alt modifiers: " + orig + " -> " + newModifiers);
-+		}
-+	}
-+    }
-     if ((newModifiers & CTRL_MASK) != (oldModifiers & CTRL_MASK))
-       writeKeyEvent(0xffe3, (newModifiers & CTRL_MASK) != 0);
- 
-diff -Naur vnc_javasrc.orig/SSLSocketToMe.java vnc_javasrc/SSLSocketToMe.java
---- vnc_javasrc.orig/SSLSocketToMe.java	1969-12-31 19:00:00.000000000 -0500
-+++ vnc_javasrc/SSLSocketToMe.java	2010-07-10 19:18:06.000000000 -0400
-@@ -0,0 +1,2067 @@
-+/*
-+ * SSLSocketToMe.java: add SSL encryption to Java VNC Viewer.
-+ *
-+ * Copyright (c) 2006 Karl J. Runge <runge@karlrunge.com>
-+ * All rights reserved.
-+ *
-+ *  This 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; version 2 of the License, or
-+ *  (at your option) any later version.
-+ *
-+ *  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.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this software; if not, write to the Free Software
-+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
-+ *  USA.
-+ *
-+ */
-+
-+import java.net.*;
-+import java.io.*;
-+import javax.net.ssl.*;
-+import java.util.*;
-+
-+import java.security.*;
-+import java.security.cert.*;
-+import java.security.spec.*;
-+import java.security.cert.Certificate;
-+import java.security.cert.CertificateFactory;
-+
-+import java.awt.*;
-+import java.awt.event.*;
-+
-+public class SSLSocketToMe {
-+
-+	/* basic member data: */
-+	String host;
-+	int port;
-+	VncViewer viewer;
-+
-+	boolean debug = true;
-+	boolean debug_certs = false;
-+
-+	/* sockets */
-+	SSLSocket socket = null;
-+	SSLSocketFactory factory;
-+
-+	/* fallback for Proxy connection */
-+	boolean proxy_in_use = false;
-+	boolean proxy_failure = false;
-+	public DataInputStream is = null;
-+	public OutputStream os = null;
-+
-+	/* strings from user WRT proxy: */
-+	String proxy_auth_string = null;
-+	String proxy_dialog_host = null;
-+	int proxy_dialog_port = 0;
-+
-+	Socket proxySock;
-+	DataInputStream proxy_is;
-+	OutputStream proxy_os;
-+
-+	/* trust contexts */
-+	SSLContext trustloc_ctx;
-+	SSLContext trustall_ctx;
-+	SSLContext trustsrv_ctx;
-+	SSLContext trusturl_ctx;
-+	SSLContext trustone_ctx;
-+
-+	/* corresponding trust managers */
-+	TrustManager[] trustAllCerts;
-+	TrustManager[] trustSrvCert;
-+	TrustManager[] trustUrlCert;
-+	TrustManager[] trustOneCert;
-+
-+	/* client-side SSL auth key (oneTimeKey=...) */
-+	KeyManager[] mykey = null;
-+
-+	boolean user_wants_to_see_cert = true;
-+	String cert_fail = null;
-+
-+	/* cert(s) we retrieve from Web server, VNC server, or serverCert param: */
-+	java.security.cert.Certificate[] trustallCerts = null;
-+	java.security.cert.Certificate[] trustsrvCerts = null;
-+	java.security.cert.Certificate[] trusturlCerts = null;
-+
-+	/* utility to decode hex oneTimeKey=... and serverCert=... */
-+	byte[] hex2bytes(String s) {
-+		byte[] bytes = new byte[s.length()/2];
-+		for (int i=0; i<s.length()/2; i++) {
-+			int j = 2*i;
-+			try {
-+				int val = Integer.parseInt(s.substring(j, j+2), 16);
-+				if (val > 127) {
-+					val -= 256;
-+				}
-+				Integer I = new Integer(val);
-+				bytes[i] = Byte.decode(I.toString()).byteValue();
-+				
-+			} catch (Exception e) {
-+				;
-+			}
-+		}
-+		return bytes;
-+	}
-+
-+	SSLSocketToMe(String h, int p, VncViewer v) throws Exception {
-+		host = h;
-+		port = p;
-+		viewer = v;
-+
-+		debug_certs = v.debugCerts;
-+
-+		/* we will first try default factory for certification: */
-+
-+		factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
-+
-+		dbg("SSL startup: " + host + " " + port);
-+
-+
-+		/* create trust managers to be used if initial handshake fails: */
-+
-+		trustAllCerts = new TrustManager[] {
-+		    /*
-+		     * this one accepts everything.  Only used if user
-+		     * has disabled checking (trustAllVncCerts=yes)
-+		     * or when we grab the cert to show it to them in
-+		     * a dialog and ask them to manually verify/accept it.
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) {
-+				/* empty */
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) {
-+				/* empty */
-+				dbg("ALL: an untrusted connect to grab cert.");
-+			}
-+		    }
-+		};
-+
-+		trustUrlCert = new TrustManager[] {
-+		    /*
-+		     * this one accepts only the retrieved server
-+		     * cert by SSLSocket by this applet and stored in
-+		     * trusturlCerts.
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				throw new CertificateException("No Clients (URL)");
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				/* we want to check 'certs' against 'trusturlCerts' */
-+				if (trusturlCerts == null) {
-+					throw new CertificateException(
-+					    "No Trust url Certs array.");
-+				}
-+				if (trusturlCerts.length < 1) {
-+					throw new CertificateException(
-+					    "No Trust url Certs.");
-+				}
-+				if (certs == null) {
-+					throw new CertificateException(
-+					    "No this-certs array.");
-+				}
-+				if (certs.length < 1) {
-+					throw new CertificateException(
-+					    "No this-certs Certs.");
-+				}
-+				if (certs.length != trusturlCerts.length) {
-+					throw new CertificateException(
-+					    "certs.length != trusturlCerts.length " + certs.length + " " + trusturlCerts.length);
-+				}
-+				boolean ok = true;
-+				for (int i = 0; i < certs.length; i++)  {
-+					if (! trusturlCerts[i].equals(certs[i])) {
-+						ok = false;
-+						dbg("URL: cert mismatch at i=" + i);
-+						dbg("URL: cert mismatch cert" + certs[i]);
-+						dbg("URL: cert mismatch  url" + trusturlCerts[i]);
-+						if (cert_fail == null) {
-+							cert_fail = "cert-mismatch";
-+						}
-+					}
-+					if (debug_certs) {
-+						dbg("\n***********************************************");
-+						dbg("URL: cert info at i=" + i);
-+						dbg("URL: cert info cert" + certs[i]);
-+						dbg("===============================================");
-+						dbg("URL: cert info  url" + trusturlCerts[i]);
-+						dbg("***********************************************");
-+					}
-+				}
-+				if (!ok) {
-+					throw new CertificateException(
-+					    "Server Cert Chain != URL Cert Chain.");
-+				}
-+				dbg("URL: trusturlCerts[i] matches certs[i] i=0:" + (certs.length-1));
-+			}
-+		    }
-+		};
-+
-+		trustSrvCert = new TrustManager[] {
-+		    /*
-+		     * this one accepts cert given to us in the serverCert
-+		     * Applet Parameter we were started with.  It is
-+		     * currently a fatal error if the VNC Server's cert
-+		     * doesn't match it.
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				throw new CertificateException("No Clients (SRV)");
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				/* we want to check 'certs' against 'trustsrvCerts' */
-+				if (trustsrvCerts == null) {
-+					throw new CertificateException(
-+					    "No Trust srv Certs array.");
-+				}
-+				if (trustsrvCerts.length < 1) {
-+					throw new CertificateException(
-+					    "No Trust srv Certs.");
-+				}
-+				if (certs == null) {
-+					throw new CertificateException(
-+					    "No this-certs array.");
-+				}
-+				if (certs.length < 1) {
-+					throw new CertificateException(
-+					    "No this-certs Certs.");
-+				}
-+				if (certs.length != trustsrvCerts.length) {
-+					throw new CertificateException(
-+					    "certs.length != trustsrvCerts.length " + certs.length + " " + trustsrvCerts.length);
-+				}
-+				boolean ok = true;
-+				for (int i = 0; i < certs.length; i++)  {
-+					if (! trustsrvCerts[i].equals(certs[i])) {
-+						ok = false;
-+						dbg("SRV: cert mismatch at i=" + i);
-+						dbg("SRV: cert mismatch cert" + certs[i]);
-+						dbg("SRV: cert mismatch  srv" + trustsrvCerts[i]);
-+						if (cert_fail == null) {
-+							cert_fail = "server-cert-mismatch";
-+						}
-+					}
-+					if (debug_certs) {
-+						dbg("\n***********************************************");
-+						dbg("SRV: cert info at i=" + i);
-+						dbg("SRV: cert info cert" + certs[i]);
-+						dbg("===============================================");
-+						dbg("SRV: cert info  srv" + trustsrvCerts[i]);
-+						dbg("***********************************************");
-+					}
-+				}
-+				if (!ok) {
-+					throw new CertificateException(
-+					    "Server Cert Chain != serverCert Applet Parameter Cert Chain.");
-+				}
-+				dbg("SRV: trustsrvCerts[i] matches certs[i] i=0:" + (certs.length-1));
-+			}
-+		    }
-+		};
-+
-+		trustOneCert = new TrustManager[] {
-+		    /*
-+		     * this one accepts only the retrieved server
-+		     * cert by SSLSocket by this applet we stored in
-+		     * trustallCerts that user has accepted or applet
-+		     * parameter trustAllVncCerts=yes is set.  This is
-+		     * for when we reconnect after the user has manually
-+		     * accepted the trustall cert in the dialog (or set
-+		     * trustAllVncCerts=yes applet param.)
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				throw new CertificateException("No Clients (ONE)");
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				/* we want to check 'certs' against 'trustallCerts' */
-+				if (trustallCerts == null) {
-+					throw new CertificateException(
-+					    "No Trust All Server Certs array.");
-+				}
-+				if (trustallCerts.length < 1) {
-+					throw new CertificateException(
-+					    "No Trust All Server Certs.");
-+				}
-+				if (certs == null) {
-+					throw new CertificateException(
-+					    "No this-certs array.");
-+				}
-+				if (certs.length < 1) {
-+					throw new CertificateException(
-+					    "No this-certs Certs.");
-+				}
-+				if (certs.length != trustallCerts.length) {
-+					throw new CertificateException(
-+					    "certs.length != trustallCerts.length " + certs.length + " " + trustallCerts.length);
-+				}
-+				boolean ok = true;
-+				for (int i = 0; i < certs.length; i++)  {
-+					if (! trustallCerts[i].equals(certs[i])) {
-+						ok = false;
-+						dbg("ONE: cert mismatch at i=" + i);
-+						dbg("ONE: cert mismatch cert" + certs[i]);
-+						dbg("ONE: cert mismatch  all" + trustallCerts[i]);
-+					}
-+					if (debug_certs) {
-+						dbg("\n***********************************************");
-+						dbg("ONE: cert info at i=" + i);
-+						dbg("ONE: cert info cert" + certs[i]);
-+						dbg("===============================================");
-+						dbg("ONE: cert info  all" + trustallCerts[i]);
-+						dbg("***********************************************");
-+					}
-+				}
-+				if (!ok) {
-+					throw new CertificateException(
-+					    "Server Cert Chain != TRUSTALL Cert Chain.");
-+				}
-+				dbg("ONE: trustallCerts[i] matches certs[i] i=0:" + (certs.length-1));
-+			}
-+		    }
-+		};
-+
-+		/* 
-+		 * The above TrustManagers are used:
-+		 *
-+		 * 1) to retrieve the server cert in case of failure to
-+		 *    display it to the user in a dialog.
-+		 * 2) to subsequently connect to the server if user agrees.
-+		 */
-+
-+		/*
-+		 * build oneTimeKey cert+key if supplied in applet parameter:
-+		 */
-+		if (viewer.oneTimeKey != null && viewer.oneTimeKey.equals("PROMPT")) {
-+			ClientCertDialog d = new ClientCertDialog();
-+			viewer.oneTimeKey = d.queryUser();
-+		}
-+		if (viewer.oneTimeKey != null && viewer.oneTimeKey.indexOf(",") > 0) {
-+			int idx = viewer.oneTimeKey.indexOf(",");
-+
-+			String onetimekey = viewer.oneTimeKey.substring(0, idx);
-+			byte[] key = hex2bytes(onetimekey);
-+			String onetimecert = viewer.oneTimeKey.substring(idx+1);
-+			byte[] cert = hex2bytes(onetimecert);
-+
-+			KeyFactory kf = KeyFactory.getInstance("RSA");
-+			PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );
-+			PrivateKey ff = kf.generatePrivate (keysp);
-+			if (debug_certs) {
-+				dbg("one time key " + ff);
-+			}
-+
-+			CertificateFactory cf = CertificateFactory.getInstance("X.509");
-+			Collection c = cf.generateCertificates(new ByteArrayInputStream(cert));
-+			Certificate[] certs = new Certificate[c.toArray().length];
-+			if (c.size() == 1) {
-+				Certificate tmpcert = cf.generateCertificate(new ByteArrayInputStream(cert));
-+				if (debug_certs) {
-+					dbg("one time cert" + tmpcert);
-+				}
-+				certs[0] = tmpcert;
-+			} else {
-+				certs = (Certificate[]) c.toArray();
-+			}
-+
-+			KeyStore ks = KeyStore.getInstance("JKS");
-+			ks.load(null, null);
-+			ks.setKeyEntry("onetimekey", ff, "".toCharArray(), certs);
-+			String da = KeyManagerFactory.getDefaultAlgorithm();
-+			KeyManagerFactory kmf = KeyManagerFactory.getInstance(da);
-+			kmf.init(ks, "".toCharArray());
-+
-+			mykey = kmf.getKeyManagers();
-+		}
-+
-+		/*
-+		 * build serverCert cert if supplied in applet parameter:
-+		 */
-+		if (viewer.serverCert != null) {
-+			CertificateFactory cf = CertificateFactory.getInstance("X.509");
-+			byte[] cert = hex2bytes(viewer.serverCert);
-+			Collection c = cf.generateCertificates(new ByteArrayInputStream(cert));
-+			trustsrvCerts = new Certificate[c.toArray().length];
-+			if (c.size() == 1) {
-+				Certificate tmpcert = cf.generateCertificate(new ByteArrayInputStream(cert));
-+				trustsrvCerts[0] = tmpcert;
-+			} else {
-+				trustsrvCerts = (Certificate[]) c.toArray();
-+			}
-+		}
-+
-+		/* the trust loc certs context: */
-+		try {
-+			trustloc_ctx = SSLContext.getInstance("SSL");
-+
-+			/*
-+			 * below is a failed attempt to get jvm's default
-+			 * trust manager using null (below) makes it so
-+			 * for HttpsURLConnection the server cannot be
-+			 * verified (no prompting.)
-+			 */
-+			if (false) {
-+				boolean didit = false;
-+				TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  
-+				tmf.init((KeyStore) null);
-+				TrustManager [] tml = tmf.getTrustManagers();
-+				for (int i = 0; i < tml.length; i++) {
-+					TrustManager tm = tml[i];
-+					if (tm instanceof X509TrustManager) {
-+						TrustManager tm1[] = new TrustManager[1];
-+						tm1[0] = tm;
-+						trustloc_ctx.init(mykey, tm1, null);
-+						didit = true;
-+						break;
-+					}
-+				}
-+				if (!didit) {
-+					trustloc_ctx.init(mykey, null, null);
-+				}
-+			} else {
-+				/* we have to set trust manager to null */
-+				trustloc_ctx.init(mykey, null, null);
-+			}
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustloc_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust all certs context: */
-+		try {
-+			trustall_ctx = SSLContext.getInstance("SSL");
-+			trustall_ctx.init(mykey, trustAllCerts, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustall_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust url certs context: */
-+		try {
-+			trusturl_ctx = SSLContext.getInstance("SSL");
-+			trusturl_ctx.init(mykey, trustUrlCert, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trusturl_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust srv certs context: */
-+		try {
-+			trustsrv_ctx = SSLContext.getInstance("SSL");
-+			trustsrv_ctx.init(mykey, trustSrvCert, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustsrv_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust the one cert from server context: */
-+		try {
-+			trustone_ctx = SSLContext.getInstance("SSL");
-+			trustone_ctx.init(mykey, trustOneCert, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustone_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+	}
-+
-+	/*
-+	 * we call this early on to 1) check for a proxy, 2) grab
-+	 * Browser/JVM accepted HTTPS cert.
-+	 */
-+	public void check_for_proxy_and_grab_vnc_server_cert() {
-+		
-+		trusturlCerts = null;
-+		proxy_in_use = false;
-+
-+		if (viewer.ignoreProxy) {
-+			/* applet param says skip it. */
-+			/* the downside is we do not set trusturlCerts for comparison later... */
-+			/* nor do we autodetect x11vnc for GET=1. */
-+			return;
-+		}
-+
-+		dbg("------------------------------------------------");
-+		dbg("Into check_for_proxy_and_grab_vnc_server_cert():");
-+
-+		dbg("TRYING HTTPS:");
-+		String ustr = "https://" + host + ":";
-+		if (viewer.httpsPort != null) {
-+			ustr += viewer.httpsPort;
-+		} else {
-+			ustr += port;
-+		}
-+		ustr += viewer.urlPrefix + "/check.https.proxy.connection";
-+		dbg("ustr is: " + ustr);
-+
-+		try {
-+			/* prepare for an HTTPS URL connection to host:port */
-+			URL url = new URL(ustr);
-+			HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
-+
-+			if (mykey != null) {
-+				/* with oneTimeKey (mykey) we can't use the default SSL context */
-+				if (trustsrvCerts != null) {
-+					dbg("passing trustsrv_ctx to HttpsURLConnection to provide client cert.");
-+					https.setSSLSocketFactory(trustsrv_ctx.getSocketFactory());	
-+				} else if (trustloc_ctx != null) {
-+					dbg("passing trustloc_ctx to HttpsURLConnection to provide client cert.");
-+					https.setSSLSocketFactory(trustloc_ctx.getSocketFactory());	
-+				}
-+			}
-+
-+			https.setUseCaches(false);
-+			https.setRequestMethod("GET");
-+			https.setRequestProperty("Pragma", "No-Cache");
-+			https.setRequestProperty("Proxy-Connection", "Keep-Alive");
-+			https.setDoInput(true);
-+
-+			dbg("trying https.connect()");
-+			https.connect();
-+
-+			dbg("trying https.getServerCertificates()");
-+			trusturlCerts = https.getServerCertificates();
-+
-+			if (trusturlCerts == null) {
-+				dbg("set trusturlCerts to null!");
-+			} else {
-+				dbg("set trusturlCerts to non-null");
-+			}
-+
-+			if (https.usingProxy()) {
-+				proxy_in_use = true;
-+				dbg("An HTTPS proxy is in use. There may be connection problems.");
-+			}
-+
-+			dbg("trying https.getContent()");
-+			Object output = https.getContent();
-+			dbg("trying https.disconnect()");
-+			https.disconnect();
-+			if (! viewer.GET) {
-+				String header = https.getHeaderField("VNC-Server");
-+				if (header != null && header.startsWith("x11vnc")) {
-+					dbg("detected x11vnc server (1), setting GET=1");
-+					viewer.GET = true;
-+				}
-+			}
-+
-+		} catch(Exception e) {
-+			dbg("HttpsURLConnection: " + e.getMessage());
-+		}
-+
-+		if (proxy_in_use) {
-+			dbg("exit check_for_proxy_and_grab_vnc_server_cert():");
-+			dbg("------------------------------------------------");
-+			return;
-+		} else if (trusturlCerts != null && !viewer.forceProxy) {
-+			/* Allow user to require HTTP check?  use forceProxy for now. */
-+			dbg("SKIPPING HTTP PROXY CHECK: got trusturlCerts, assuming proxy info is correct.");
-+			dbg("exit check_for_proxy_and_grab_vnc_server_cert():");
-+			dbg("------------------------------------------------");
-+			return;
-+		}
-+
-+		/*
-+		 * XXX need to remember scenario where this extra check
-+		 * gives useful info.  User's Browser proxy settings?
-+		 */
-+		dbg("TRYING HTTP:");
-+		ustr = "http://" + host + ":" + port;
-+		ustr += viewer.urlPrefix + "/index.vnc";
-+		dbg("ustr is: " + ustr);
-+
-+		try {
-+			/* prepare for an HTTP URL connection to the same host:port (but not httpsPort) */
-+			URL url = new URL(ustr);
-+			HttpURLConnection http = (HttpURLConnection)
-+			    url.openConnection();
-+
-+			http.setUseCaches(false);
-+			http.setRequestMethod("GET");
-+			http.setRequestProperty("Pragma", "No-Cache");
-+			http.setRequestProperty("Proxy-Connection", "Keep-Alive");
-+			http.setDoInput(true);
-+
-+			dbg("trying http.connect()");
-+			http.connect();
-+
-+			if (http.usingProxy()) {
-+				proxy_in_use = true;
-+				dbg("An HTTP proxy is in use. There may be connection problems.");
-+			}
-+			dbg("trying http.getContent()");
-+			Object output = http.getContent();
-+			dbg("trying http.disconnect()");
-+			http.disconnect();
-+			if (! viewer.GET) {
-+				String header = http.getHeaderField("VNC-Server");
-+				if (header != null && header.startsWith("x11vnc")) {
-+					dbg("detected x11vnc server (2), setting GET=1");
-+					viewer.GET = true;
-+				}
-+			}
-+		} catch(Exception e) {
-+			dbg("HttpURLConnection:  " + e.getMessage());
-+		}
-+		dbg("exit check_for_proxy_and_grab_vnc_server_cert():");
-+		dbg("------------------------------------------------");
-+	}
-+
-+	public Socket connectSock() throws IOException {
-+		/*
-+		 * first try a https connection to detect a proxy, and
-+		 * grab the VNC server cert at the same time:
-+		 */
-+		check_for_proxy_and_grab_vnc_server_cert();
-+
-+		boolean srv_cert = false;
-+		
-+		if (trustsrvCerts != null) {
-+			/* applet parameter suppled serverCert */
-+			dbg("viewer.trustSrvCert-0 using trustsrv_ctx");
-+			factory = trustsrv_ctx.getSocketFactory();
-+			srv_cert = true;
-+		} else if (viewer.trustAllVncCerts) {
-+			/* trust all certs (no checking) */
-+			dbg("viewer.trustAllVncCerts-0 using trustall_ctx");
-+			factory = trustall_ctx.getSocketFactory();
-+		} else if (trusturlCerts != null) {
-+			/* trust certs the Browser/JVM accepted in check_for_proxy... */
-+			dbg("using trusturl_ctx");
-+			factory = trusturl_ctx.getSocketFactory();
-+		} else {
-+			/* trust the local defaults */
-+			dbg("using trustloc_ctx");
-+			factory = trustloc_ctx.getSocketFactory();
-+		}
-+
-+		socket = null;
-+
-+		try {
-+			if (proxy_in_use && viewer.forceProxy) {
-+				throw new Exception("forcing proxy (forceProxy)");
-+			} else if (viewer.CONNECT != null) {
-+				throw new Exception("forcing CONNECT");
-+			}
-+
-+			int timeout = 6;
-+			if (timeout > 0) {
-+				socket = (SSLSocket) factory.createSocket();
-+				InetSocketAddress inetaddr = new InetSocketAddress(host, port);
-+				dbg("Using timeout of " + timeout + " secs to: " + host + ":" + port);
-+				socket.connect(inetaddr, timeout * 1000);
-+			} else {
-+				socket = (SSLSocket) factory.createSocket(host, port);
-+			}
-+
-+		} catch (Exception esock) {
-+			dbg("socket error: " + esock.getMessage());
-+			if (proxy_in_use || viewer.CONNECT != null) {
-+				proxy_failure = true;
-+				if (proxy_in_use) {
-+					dbg("HTTPS proxy in use. Trying to go with it.");
-+				} else {
-+					dbg("viewer.CONNECT reverse proxy in use. Trying to go with it.");
-+				}
-+				try {
-+					socket = proxy_socket(factory);
-+				} catch (Exception e) {
-+					dbg("proxy_socket error: " + e.getMessage());
-+				}
-+			} else {
-+				/* n.b. socket is left in error state to cause ex. below. */
-+			}
-+		}
-+
-+		try {
-+			socket.startHandshake();
-+
-+			dbg("The Server Connection Verified OK on 1st try.");
-+
-+			java.security.cert.Certificate[] currentTrustedCerts;
-+			BrowserCertsDialog bcd;
-+
-+			SSLSession sess = socket.getSession();
-+			currentTrustedCerts = sess.getPeerCertificates();
-+
-+			if (viewer.trustAllVncCerts) {
-+				dbg("viewer.trustAllVncCerts-1  keeping socket.");
-+			} else if (currentTrustedCerts == null || currentTrustedCerts.length < 1) {
-+				try {
-+					socket.close();
-+				} catch (Exception e) {
-+					dbg("socket is grumpy.");
-+				}
-+				socket = null;
-+				throw new SSLHandshakeException("no current certs");
-+			}
-+
-+			String serv = "";
-+			try {
-+				CertInfo ci = new CertInfo(currentTrustedCerts[0]);
-+				serv = ci.get_certinfo("CN");
-+			} catch (Exception e) {
-+				;
-+			}
-+
-+			if (viewer.trustAllVncCerts) {
-+				dbg("viewer.trustAllVncCerts-2  skipping browser certs dialog");
-+				user_wants_to_see_cert = false;
-+			} else if (viewer.serverCert != null && trustsrvCerts != null) {
-+				dbg("viewer.serverCert-1  skipping browser certs dialog");
-+				user_wants_to_see_cert = false;
-+			} else if (viewer.trustUrlVncCert) {
-+				dbg("viewer.trustUrlVncCert-1  skipping browser certs dialog");
-+				user_wants_to_see_cert = false;
-+			} else {
-+				/* have a dialog with the user: */
-+				bcd = new BrowserCertsDialog(serv, host + ":" + port);
-+				dbg("browser certs dialog begin.");
-+				bcd.queryUser();
-+				dbg("browser certs dialog finished.");
-+
-+				if (bcd.showCertDialog) {
-+					String msg = "user wants to see cert";
-+					dbg(msg);
-+					user_wants_to_see_cert = true;
-+					if (cert_fail == null) {
-+						cert_fail = "user-view";
-+					}
-+					throw new SSLHandshakeException(msg);
-+				} else {
-+					user_wants_to_see_cert = false;
-+					dbg("browser certs dialog: user said yes, accept it");
-+				}
-+			}
-+
-+		} catch (SSLHandshakeException eh)  {
-+			dbg("SSLHandshakeException: could not automatically verify Server.");
-+			dbg("msg: " + eh.getMessage());
-+
-+
-+			/* send a cleanup string just in case: */
-+			String getoutstr = "GET /index.vnc HTTP/1.0\r\nConnection: close\r\n\r\n";
-+
-+			try {
-+				OutputStream os = socket.getOutputStream();
-+				os.write(getoutstr.getBytes());
-+				socket.close();
-+			} catch (Exception e) {
-+				dbg("socket is grumpy!");
-+			}
-+
-+			/* reload */
-+
-+			socket = null;
-+
-+			String reason = null;
-+
-+			if (srv_cert) {
-+				/* for serverCert usage we make this a fatal error. */
-+				throw new IOException("Fatal: VNC Server's Cert does not match Applet Parameter 'serverCert=...'");
-+				/* see below in TrustDialog were we describe this case to user anyway */
-+			}
-+
-+			/*
-+			 * Reconnect, trusting any cert, so we can grab
-+			 * the cert to show it to the user in a dialog
-+			 * for him to manually accept.  This connection
-+			 * is not used for anything else.
-+			 */
-+			factory = trustall_ctx.getSocketFactory();
-+			if (proxy_failure) {
-+				socket = proxy_socket(factory);
-+			} else {
-+				socket = (SSLSocket) factory.createSocket(host, port);
-+			}
-+
-+			if (debug_certs) {
-+				dbg("trusturlCerts: " + trusturlCerts);
-+				dbg("trustsrvCerts: " + trustsrvCerts);
-+			}
-+			if (trusturlCerts == null && cert_fail == null) {
-+				cert_fail = "missing-certs";
-+			}
-+
-+			try {
-+				socket.startHandshake();
-+
-+				dbg("The TrustAll Server Cert-grab Connection (trivially) Verified OK.");
-+
-+				/* grab the cert: */
-+				try {
-+					SSLSession sess = socket.getSession();
-+					trustallCerts = sess.getPeerCertificates();
-+				} catch (Exception e) {
-+					throw new Exception("Could not get " + 
-+					    "Peer Certificate");	
-+				}
-+				if (debug_certs) {
-+					dbg("trustallCerts: " + trustallCerts);
-+				}
-+
-+				if (viewer.trustAllVncCerts) {
-+					dbg("viewer.trustAllVncCerts-3.  skipping dialog, trusting everything.");
-+				} else if (! browser_cert_match()) {
-+					/*
-+					 * close socket now, we will reopen after
-+					 * dialog if user agrees to use the cert.
-+					 */
-+					try {
-+						OutputStream os = socket.getOutputStream();
-+						os.write(getoutstr.getBytes());
-+						socket.close();
-+					} catch (Exception e) {
-+						dbg("socket is grumpy!!");
-+					}
-+					socket = null;
-+
-+					/* dialog with user to accept cert or not: */
-+
-+					TrustDialog td= new TrustDialog(host, port,
-+					    trustallCerts);
-+
-+					if (cert_fail == null) {
-+						;
-+					} else if (cert_fail.equals("user-view")) {
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        You Asked to View the Certificate.";
-+					} else if (cert_fail.equals("server-cert-mismatch")) {
-+						/* this is now fatal error, see above. */
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        The VNC Server's Certificate does not match the Certificate\n"
-+						       + "        specified in the supplied 'serverCert' Applet Parameter.";
-+					} else if (cert_fail.equals("cert-mismatch")) {
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        The VNC Server's Certificate does not match the Website's\n"
-+						       + "        HTTPS Certificate (that you previously accepted; either\n"
-+						       + "        manually or automatically via Certificate Authority.)";
-+					} else if (cert_fail.equals("missing-certs")) {
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        Not all Certificates could be obtained to check.";
-+					}
-+
-+					if (! td.queryUser(reason)) {
-+						String msg = "User decided against it.";
-+						dbg(msg);
-+						throw new IOException(msg);
-+					}
-+				}
-+
-+			} catch (Exception ehand2)  {
-+				dbg("** Could not TrustAll Verify Server!");
-+
-+				throw new IOException(ehand2.getMessage());
-+			}
-+
-+			/* reload again: */
-+
-+			if (socket != null) {
-+				try {
-+					socket.close();
-+				} catch (Exception e) {
-+					dbg("socket is grumpy!!!");
-+				}
-+				socket = null;
-+			}
-+
-+			/*
-+			 * Now connect a 3rd time, using the cert
-+			 * retrieved during connection 2 (sadly, that
-+			 * the user likely blindly agreed to...)
-+			 */
-+
-+			factory = trustone_ctx.getSocketFactory();
-+			if (proxy_failure) {
-+				socket = proxy_socket(factory);
-+			} else {
-+				socket = (SSLSocket) factory.createSocket(host, port);
-+			}
-+
-+			try {
-+				socket.startHandshake();
-+				dbg("TrustAll/TrustOne Server Connection Verified #3.");
-+
-+			} catch (Exception ehand3)  {
-+				dbg("** Could not TrustAll/TrustOne Verify Server #3.");
-+
-+				throw new IOException(ehand3.getMessage());
-+			}
-+		}
-+
-+		/* we have socket (possibly null) at this point, so proceed: */
-+
-+		/* handle x11vnc GET=1, if applicable: */
-+		if (socket != null && viewer.GET) {
-+			String str = "GET ";
-+			str += viewer.urlPrefix;
-+			str += "/request.https.vnc.connection";
-+			str += " HTTP/1.0\r\n";
-+			str += "Pragma: No-Cache\r\n";
-+			str += "\r\n";
-+
-+			System.out.println("sending: " + str);
-+    			OutputStream os = socket.getOutputStream();
-+			String type = "os";
-+
-+			if (type == "os") {
-+				os.write(str.getBytes());
-+				os.flush();
-+				System.out.println("used OutputStream");
-+			} else if (type == "bs") {
-+				BufferedOutputStream bs = new BufferedOutputStream(os);
-+				bs.write(str.getBytes());
-+				bs.flush();
-+				System.out.println("used BufferedOutputStream");
-+			} else if (type == "ds") {
-+				DataOutputStream ds = new DataOutputStream(os);
-+				ds.write(str.getBytes());
-+				ds.flush();
-+				System.out.println("used DataOutputStream");
-+			}
-+			if (false) {
-+				String rep = "";
-+				DataInputStream is = new DataInputStream(
-+				    new BufferedInputStream(socket.getInputStream(), 16384));
-+				while (true) {
-+					rep += readline(is);
-+					if (rep.indexOf("\r\n\r\n") >= 0) {
-+						break;
-+					}
-+				}
-+				System.out.println("rep: " + rep);
-+			}
-+		}
-+
-+		dbg("SSL returning socket to caller.");
-+		dbg("");
-+
-+		/* could be null, let caller handle that. */
-+		return (Socket) socket;
-+	}
-+
-+	boolean browser_cert_match() {
-+		String msg = "Browser URL accept previously accepted cert";
-+
-+		if (user_wants_to_see_cert) {
-+			return false;
-+		}
-+
-+		if (viewer.serverCert != null || trustsrvCerts != null) {
-+			if (cert_fail == null) {
-+				cert_fail = "server-cert-mismatch";
-+			}
-+		}
-+		if (trustallCerts != null && trusturlCerts != null) {
-+		    if (trustallCerts.length == trusturlCerts.length) {
-+			boolean ok = true;
-+			/* check toath trustallCerts (socket) equals trusturlCerts (browser) */
-+			for (int i = 0; i < trusturlCerts.length; i++)  {
-+				if (! trustallCerts[i].equals(trusturlCerts[i])) {
-+					dbg("BCM: cert mismatch at i=" + i);
-+					dbg("BCM: cert mismatch  url" + trusturlCerts[i]);
-+					dbg("BCM: cert mismatch  all" + trustallCerts[i]);
-+					ok = false;
-+				}
-+			}
-+			if (ok) {
-+				System.out.println(msg);
-+				if (cert_fail == null) {
-+					cert_fail = "did-not-fail";
-+				}
-+				return true;
-+			} else {
-+				if (cert_fail == null) {
-+					cert_fail = "cert-mismatch";
-+				}
-+				return false;
-+			}
-+		    }
-+		}
-+		if (cert_fail == null) {
-+			cert_fail = "missing-certs";
-+		}
-+		return false;
-+	}
-+
-+	private void dbg(String s) {
-+		if (debug) {
-+			System.out.println(s);
-+		}
-+	}
-+
-+	private int gint(String s) {
-+		int n = -1;
-+		try {
-+			Integer I = new Integer(s);
-+			n = I.intValue();
-+		} catch (Exception ex) {
-+			return -1;
-+		}
-+		return n;
-+	}
-+
-+	/* this will do the proxy CONNECT negotiation and hook us up.  */
-+
-+	private void proxy_helper(String proxyHost, int proxyPort) {
-+
-+		boolean proxy_auth = false;
-+		String proxy_auth_basic_realm = "";
-+		String hp = host + ":" + port;
-+		dbg("proxy_helper: " + proxyHost + ":" + proxyPort + " hp: " + hp);
-+
-+		/* we loop here a few times trying for the password case */
-+		for (int k=0; k < 2; k++) {
-+			dbg("proxy_in_use psocket: " + k);
-+
-+			if (proxySock != null) {
-+				try {
-+					proxySock.close();
-+				} catch (Exception e) {
-+					dbg("proxy socket is grumpy.");
-+				}
-+			}
-+
-+			proxySock = psocket(proxyHost, proxyPort);
-+			if (proxySock == null) {
-+				dbg("1-a sadly, returning a null socket");
-+				return;
-+			}
-+
-+			String req1 = "CONNECT " + hp + " HTTP/1.1\r\n"
-+			    + "Host: " + hp + "\r\n";
-+
-+			dbg("requesting via proxy: " + req1);
-+
-+			if (proxy_auth) {
-+				if (proxy_auth_string == null) {
-+					ProxyPasswdDialog pp = new ProxyPasswdDialog(proxyHost, proxyPort, proxy_auth_basic_realm);
-+					pp.queryUser();
-+					proxy_auth_string = pp.getAuth();
-+				}
-+				//dbg("auth1: " + proxy_auth_string);
-+
-+				String auth2 = Base64Coder.encodeString(proxy_auth_string);
-+				//dbg("auth2: " + auth2);
-+
-+				req1 += "Proxy-Authorization: Basic " + auth2 + "\r\n";
-+				//dbg("req1: " + req1);
-+
-+				dbg("added Proxy-Authorization: Basic ... to request");
-+			}
-+			req1 += "\r\n";
-+
-+			try {
-+				proxy_os.write(req1.getBytes());
-+				String reply = readline(proxy_is);
-+
-+				dbg("proxy replied: " + reply.trim());
-+
-+				if (reply.indexOf("HTTP/1.") == 0 && reply.indexOf(" 407 ") > 0) {
-+					proxy_auth = true;
-+					proxySock.close();
-+				} else if (reply.indexOf("HTTP/1.") < 0 && reply.indexOf(" 200") < 0) {
-+					proxySock.close();
-+					proxySock = psocket(proxyHost, proxyPort);
-+					if (proxySock == null) {
-+						dbg("2-a sadly, returning a null socket");
-+						return;
-+					}
-+				}
-+			} catch(Exception e) {
-+				dbg("some proxy socket problem: " + e.getMessage());
-+			}
-+
-+			/* read the rest of the HTTP headers */
-+			while (true) {
-+				String line = readline(proxy_is);
-+				dbg("proxy line: " + line.trim());
-+				if (proxy_auth) {
-+					String uc = line.toLowerCase();
-+					if (uc.indexOf("proxy-authenticate:") == 0) {
-+						if (uc.indexOf(" basic ") >= 0) {
-+							int idx = uc.indexOf(" realm");
-+							if (idx >= 0) {
-+								proxy_auth_basic_realm = uc.substring(idx+1);
-+							}
-+						}
-+					}
-+				}
-+				if (line.equals("\r\n") || line.equals("\n")) {
-+					break;
-+				}
-+			}
-+			if (!proxy_auth || proxy_auth_basic_realm.equals("")) {
-+				/* we only try once for the non-password case: */
-+				break;
-+			}
-+		}
-+	}
-+
-+	public SSLSocket proxy_socket(SSLSocketFactory factory) {
-+		Properties props = null;
-+		String proxyHost = null;
-+		int proxyPort = 0;
-+		String proxyHost_nossl = null;
-+		int proxyPort_nossl = 0;
-+		String str;
-+
-+		/* see if we can guess the proxy info from Properties: */
-+		try {
-+			props = System.getProperties();
-+		} catch (Exception e) {
-+			/* sandboxed applet might not be able to read it. */
-+			dbg("props failed: " + e.getMessage());
-+		}
-+		if (viewer.proxyHost != null) {
-+			dbg("Using supplied proxy " + viewer.proxyHost + " " + viewer.proxyPort + " applet parameters.");
-+			proxyHost = viewer.proxyHost;
-+			if (viewer.proxyPort != null) {
-+				proxyPort = gint(viewer.proxyPort);
-+			} else {
-+				proxyPort = 8080;
-+			}
-+			
-+		} else if (props != null) {
-+			dbg("\n---------------\nAll props:");
-+			props.list(System.out);
-+			dbg("\n---------------\n\n");
-+
-+			/* scrape throught properties looking for proxy info: */
-+
-+			for (Enumeration e = props.propertyNames(); e.hasMoreElements(); ) {
-+				String s = (String) e.nextElement();
-+				String v = System.getProperty(s);
-+				String s2 = s.toLowerCase();
-+				String v2 = v.toLowerCase();
-+
-+				if (s2.indexOf("proxy.https.host") >= 0) {
-+					proxyHost = v2;
-+					continue;
-+				}
-+				if (s2.indexOf("proxy.https.port") >= 0) {
-+					proxyPort = gint(v2);
-+					continue;
-+				}
-+				if (s2.indexOf("proxy.http.host") >= 0) {
-+					proxyHost_nossl = v2;
-+					continue;
-+				}
-+				if (s2.indexOf("proxy.http.port") >= 0) {
-+					proxyPort_nossl = gint(v2);
-+					continue;
-+				}
-+			}
-+
-+			for (Enumeration e = props.propertyNames(); e.hasMoreElements(); ) {
-+				String s = (String) e.nextElement();
-+				String v = System.getProperty(s);
-+				String s2 = s.toLowerCase();
-+				String v2 = v.toLowerCase();
-+
-+				if (proxyHost != null && proxyPort > 0) {
-+					break;
-+				}
-+
-+				// look for something like: javaplugin.proxy.config.list = http=10.0.2.1:8082
-+				if (s2.indexOf("proxy") < 0 && v2.indexOf("proxy") < 0) {
-+					continue;
-+				}
-+				if (v2.indexOf("http") < 0) {
-+					continue;
-+				}
-+
-+				String[] pieces = v.split("[,;]");
-+				for (int i = 0; i < pieces.length; i++) {
-+					String p = pieces[i];
-+					int j = p.indexOf("https");
-+					if (j < 0) {
-+						j = p.indexOf("http");
-+						if (j < 0) {
-+							continue;
-+						}
-+					}
-+					j = p.indexOf("=", j);
-+					if (j < 0) {
-+						continue;
-+					}
-+					p = p.substring(j+1);
-+					String [] hp = p.split(":");
-+					if (hp.length != 2) {
-+						continue;
-+					}
-+					if (hp[0].length() > 1 && hp[1].length() > 1) {
-+
-+						proxyPort = gint(hp[1]);
-+						if (proxyPort < 0) {
-+							continue;
-+						}
-+						proxyHost = new String(hp[0]);
-+						break;
-+					}
-+				}
-+			}
-+		}
-+		if (proxyHost != null) {
-+			if (proxyHost_nossl != null && proxyPort_nossl > 0) {
-+				dbg("Using http proxy info instead of https.");
-+				proxyHost = proxyHost_nossl;
-+				proxyPort = proxyPort_nossl;
-+			}
-+		}
-+
-+		if (proxy_in_use) {
-+			if (proxy_dialog_host != null && proxy_dialog_port > 0) {
-+				proxyHost = proxy_dialog_host;
-+				proxyPort = proxy_dialog_port;
-+			}
-+			if (proxyHost != null) {
-+				dbg("Lucky us! we figured out the Proxy parameters: " + proxyHost + " " + proxyPort);
-+			} else {
-+				/* ask user to help us: */
-+				ProxyDialog pd = new ProxyDialog(proxyHost, proxyPort);
-+				pd.queryUser();
-+				proxyHost = pd.getHost(); 
-+				proxyPort = pd.getPort();
-+				proxy_dialog_host = new String(proxyHost);
-+				proxy_dialog_port = proxyPort;
-+				dbg("User said host: " + pd.getHost() + " port: " + pd.getPort());
-+			}
-+
-+			proxy_helper(proxyHost, proxyPort);
-+			if (proxySock == null) {
-+				return null;
-+			}
-+		} else if (viewer.CONNECT != null) {
-+			dbg("viewer.CONNECT psocket:");
-+			proxySock = psocket(host, port);
-+			if (proxySock == null) {
-+				dbg("1-b sadly, returning a null socket");
-+				return null;
-+			}
-+		}
-+		
-+		if (viewer.CONNECT != null) {
-+			String hp = viewer.CONNECT;
-+			String req2 = "CONNECT " + hp + " HTTP/1.1\r\n"
-+			    + "Host: " + hp + "\r\n\r\n";
-+
-+			dbg("requesting2: " + req2);
-+
-+			try {
-+				proxy_os.write(req2.getBytes());
-+				String reply = readline(proxy_is);
-+
-+				dbg("proxy replied2: " + reply.trim());
-+
-+				if (reply.indexOf("HTTP/1.") < 0 && reply.indexOf(" 200") < 0) {
-+					proxySock.close();
-+					proxySock = psocket(proxyHost, proxyPort);
-+					if (proxySock == null) {
-+						dbg("2-b sadly, returning a null socket");
-+						return null;
-+					}
-+				}
-+			} catch(Exception e) {
-+				dbg("proxy socket problem-2: " + e.getMessage());
-+			}
-+
-+			while (true) {
-+				String line = readline(proxy_is);
-+				dbg("proxy line2: " + line.trim());
-+				if (line.equals("\r\n") || line.equals("\n")) {
-+					break;
-+				}
-+			}
-+		}
-+
-+		Socket sslsock = null;
-+		try {
-+			sslsock = factory.createSocket(proxySock, host, port, true);
-+		} catch(Exception e) {
-+			dbg("sslsock prob: " + e.getMessage());
-+			dbg("3 sadly, returning a null socket");
-+		}
-+
-+		return (SSLSocket) sslsock;
-+	}
-+
-+	Socket psocket(String h, int p) {
-+		Socket psock = null;
-+		try {
-+			psock = new Socket(h, p);
-+			proxy_is = new DataInputStream(new BufferedInputStream(
-+			    psock.getInputStream(), 16384));
-+			proxy_os = psock.getOutputStream();
-+		} catch(Exception e) {
-+			dbg("psocket prob: " + e.getMessage());
-+			return null;
-+		}
-+
-+		return psock;
-+	}
-+
-+	String readline(DataInputStream i) {
-+		byte[] ba = new byte[1];
-+		String s = new String("");
-+		ba[0] = 0;
-+		try {
-+			while (ba[0] != 0xa) {
-+				ba[0] = (byte) i.readUnsignedByte();
-+				s += new String(ba);
-+			}
-+		} catch (Exception e) {
-+			;
-+		}
-+		return s;
-+	}
-+}
-+
-+class TrustDialog implements ActionListener {
-+	String msg, host, text;
-+	int port;
-+	java.security.cert.Certificate[] trustallCerts = null;
-+	boolean viewing_cert = false;
-+	boolean trust_this_session = false;
-+
-+	/*
-+	 * this is the gui to show the user the cert and info and ask
-+	 * them if they want to continue using this cert.
-+	 */
-+
-+	Button ok, cancel, viewcert;
-+	TextArea textarea;
-+	Checkbox accept, deny;
-+	Dialog dialog;
-+
-+	String s1 = "Accept this certificate temporarily for this session";
-+	String s2 = "Do not accept this certificate and do not connect to"
-+	    + " this VNC server";
-+	String ln = "\n---------------------------------------------------\n\n";
-+		
-+	TrustDialog (String h, int p, java.security.cert.Certificate[] s) {
-+		host = h;
-+		port = p;
-+		trustallCerts = s;
-+
-+		msg = "VNC Server " + host + ":" + port + " Not Verified";
-+	}
-+
-+	public boolean queryUser(String reason) {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame(msg);
-+
-+		dialog = new Dialog(frame, true);
-+
-+		String infostr = "";
-+		if (trustallCerts.length == 1) {
-+			CertInfo ci = new CertInfo(trustallCerts[0]);
-+			infostr = ci.get_certinfo("all");
-+		}
-+		if (reason != null) {
-+			reason += "\n\n";
-+		}
-+
-+		text = "\n" 
-++ "Unable to verify the identity of\n"
-++ "\n"
-++ "        " + host + ":" + port + "\n" 
-++ "\n"
-++ infostr
-++ "\n"
-++ "as a trusted VNC server.\n"
-++ "\n"
-++ reason
-++ "In General not being able to verify the VNC Server and/or your seeing this Dialog\n"
-++ "is due to one of the following:\n"
-++ "\n"
-++ " - Your requesting to View the Certificate before accepting.\n"
-++ "\n"
-++ " - The VNC server is using a Self-Signed Certificate or a Certificate\n"
-++ "   Authority not recognized by your Web Browser or Java Plugin runtime.\n"
-++ "\n"
-++ " - The use of an Apache SSL portal scheme employing CONNECT proxying AND\n"
-++ "   the Apache Web server has a certificate *different* from the VNC server's.\n"
-++ "\n"
-++ " - No previously accepted Certificate (via Web Broswer/Java Plugin) could be\n"
-++ "   obtained by this applet to compare the VNC Server Certificate against.\n"
-++ "\n"
-++ " - The VNC Server's Certificate does not match the one specified in the\n"
-++ "   supplied 'serverCert' Java Applet Parameter.\n"
-++ "\n"
-++ " - A Man-In-The-Middle attack impersonating as the VNC server that you wish\n"
-++ "   to connect to.  (Wouldn't that be exciting!!)\n"
-++ "\n"
-++ "By safely copying the VNC server's Certificate (or using a common Certificate\n"
-++ "Authority certificate) you can configure your Web Browser and Java Plugin to\n"
-++ "automatically authenticate this VNC Server.\n"
-++ "\n"
-++ "If you do so, then you will only have to click \"Yes\" when this VNC Viewer\n"
-++ "applet asks you whether to trust your Browser/Java Plugin's acceptance of the\n"
-++ "certificate (except for the Apache portal case above where they don't match.)\n"
-++ "\n"
-++ "You can also set the applet parameter 'trustUrlVncCert=yes' to automatically\n"
-++ "accept certificates already accepted/trusted by your Web Browser/Java Plugin,\n"
-++ "and thereby see no dialog from this VNC Viewer applet.\n"
-+;
-+
-+		/* the accept / do-not-accept radio buttons: */
-+		CheckboxGroup checkbox = new CheckboxGroup();
-+		accept = new Checkbox(s1, true, checkbox);
-+		deny   = new Checkbox(s2, false, checkbox);
-+
-+		/* put the checkboxes in a panel: */
-+		Panel check = new Panel();
-+		check.setLayout(new GridLayout(2, 1));
-+
-+		check.add(accept);
-+		check.add(deny);
-+
-+		/* make the 3 buttons: */
-+		ok = new Button("OK");
-+		cancel = new Button("Cancel");
-+		viewcert = new Button("View Certificate");
-+
-+		ok.addActionListener(this);
-+		cancel.addActionListener(this);
-+		viewcert.addActionListener(this);
-+
-+		/* put the buttons in their own panel: */
-+		Panel buttonrow = new Panel();
-+		buttonrow.setLayout(new FlowLayout(FlowLayout.LEFT));
-+		buttonrow.add(viewcert);
-+		buttonrow.add(ok);
-+		buttonrow.add(cancel);
-+
-+		/* label at the top: */
-+		Label label = new Label(msg, Label.CENTER);
-+		label.setFont(new Font("Helvetica", Font.BOLD, 16));
-+
-+		/* textarea in the middle */
-+		textarea = new TextArea(text, 38, 64,
-+		    TextArea.SCROLLBARS_VERTICAL_ONLY);
-+		textarea.setEditable(false);
-+
-+		/* put the two panels in their own panel at bottom: */
-+		Panel bot = new Panel();
-+		bot.setLayout(new GridLayout(2, 1));
-+		bot.add(check);
-+		bot.add(buttonrow);
-+
-+		/* now arrange things inside the dialog: */
-+		dialog.setLayout(new BorderLayout());
-+
-+		dialog.add("North", label);
-+		dialog.add("South", bot);
-+		dialog.add("Center", textarea);
-+
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+
-+		return trust_this_session;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+
-+		if (evt.getSource() == viewcert) {
-+			/* View Certificate button clicked */
-+			if (viewing_cert) {
-+				/* show the original info text: */
-+				textarea.setText(text);
-+				viewcert.setLabel("View Certificate");
-+				viewing_cert = false;
-+			} else {
-+				int i;
-+				/* show all (likely just one) certs: */
-+				textarea.setText("");
-+				for (i=0; i < trustallCerts.length; i++) {
-+					int j = i + 1;
-+					textarea.append("Certificate[" +
-+					    j + "]\n\n");
-+					textarea.append(
-+					    trustallCerts[i].toString());
-+					textarea.append(ln);
-+				}
-+				viewcert.setLabel("View Info");
-+				viewing_cert = true;
-+
-+				textarea.setCaretPosition(0);
-+			}
-+
-+		} else if (evt.getSource() == ok) {
-+			/* OK button clicked */
-+			if (accept.getState()) {
-+				trust_this_session = true;
-+			} else {
-+				trust_this_session = false;
-+			}
-+			//dialog.dispose();
-+			dialog.hide();
-+
-+		} else if (evt.getSource() == cancel) {
-+			/* Cancel button clicked */
-+			trust_this_session = false;
-+
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+
-+	String get_certinfo() {
-+		String all = "";
-+		String fields[] = {"CN", "OU", "O", "L", "C"};
-+		int i;
-+		if (trustallCerts.length < 1) {
-+			all = "";
-+			return all;
-+		}
-+		String cert = trustallCerts[0].toString();
-+
-+		/*
-+		 * For now we simply scrape the cert string, there must
-+		 * be an API for this... perhaps optionValue?
-+		 */
-+
-+		for (i=0; i < fields.length; i++) {
-+			int f, t, t1, t2;
-+			String sub, mat = fields[i] + "=";
-+			
-+			f = cert.indexOf(mat, 0);
-+			if (f > 0) {
-+				t1 = cert.indexOf(", ", f);
-+				t2 = cert.indexOf("\n", f);
-+				if (t1 < 0 && t2 < 0) {
-+					continue;
-+				} else if (t1 < 0) {
-+					t = t2;
-+				} else if (t2 < 0) {
-+					t = t1;
-+				} else if (t1 < t2) {
-+					t = t1;
-+				} else {
-+					t = t2;
-+				}
-+				if (t > f) {
-+					sub = cert.substring(f, t);
-+					all = all + "        " + sub + "\n";
-+				}
-+			}
-+		}
-+		return all;
-+	}
-+}
-+
-+class ProxyDialog implements ActionListener {
-+	String guessedHost = null;
-+	String guessedPort = null;
-+	/*
-+	 * this is the gui to show the user the cert and info and ask
-+	 * them if they want to continue using this cert.
-+	 */
-+
-+	Button ok;
-+	Dialog dialog;
-+	TextField entry;
-+	String reply = "";
-+
-+	ProxyDialog (String h, int p) {
-+		guessedHost = h;
-+		try {
-+			guessedPort = Integer.toString(p);
-+		} catch (Exception e) {
-+			guessedPort = "8080";
-+		}
-+	}
-+
-+	public void queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Need Proxy host:port");
-+
-+		dialog = new Dialog(frame, true);
-+
-+
-+		Label label = new Label("Please Enter your https Proxy info as host:port", Label.CENTER);
-+		//label.setFont(new Font("Helvetica", Font.BOLD, 16));
-+		entry = new TextField(30);
-+		ok = new Button("OK");
-+		ok.addActionListener(this);
-+
-+		String guess = "";
-+		if (guessedHost != null) {
-+			guess = guessedHost + ":" + guessedPort;
-+		}
-+		entry.setText(guess);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", label);
-+		dialog.add("Center", entry);
-+		dialog.add("South", ok);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+		return;
-+	}
-+
-+	public String getHost() {
-+		int i = reply.indexOf(":");
-+		if (i < 0) {
-+			return "unknown";
-+		}
-+		String h = reply.substring(0, i);
-+		return h;
-+	}
-+
-+	public int getPort() {
-+		int i = reply.indexOf(":");
-+		int p = 8080;
-+		if (i < 0) {
-+			return p;
-+		}
-+		i++;
-+		String ps = reply.substring(i);
-+		try {
-+			Integer I = new Integer(ps);
-+			p = I.intValue();
-+		} catch (Exception e) {
-+			;
-+		}
-+		return p;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == ok) {
-+			reply = entry.getText();
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+}
-+
-+class ProxyPasswdDialog implements ActionListener {
-+	String guessedHost = null;
-+	String guessedPort = null;
-+	String guessedUser = null;
-+	String guessedPasswd = null;
-+	String realm = null;
-+	/*
-+	 * this is the gui to show the user the cert and info and ask
-+	 * them if they want to continue using this cert.
-+	 */
-+
-+	Button ok;
-+	Dialog dialog;
-+	TextField entry1;
-+	TextField entry2;
-+	String reply1 = "";
-+	String reply2 = "";
-+
-+	ProxyPasswdDialog (String h, int p, String realm) {
-+		guessedHost = h;
-+		try {
-+			guessedPort = Integer.toString(p);
-+		} catch (Exception e) {
-+			guessedPort = "8080";
-+		}
-+		this.realm = realm;
-+	}
-+
-+	public void queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Proxy Requires Username and Password");
-+
-+		dialog = new Dialog(frame, true);
-+
-+		//Label label = new Label("Please Enter your Web Proxy Username in the top Entry and Password in the bottom Entry", Label.CENTER);
-+		TextArea label = new TextArea("Please Enter your Web Proxy\nUsername in the Top Entry and\nPassword in the Bottom Entry,\nand then press OK.", 4, 20, TextArea.SCROLLBARS_NONE);
-+		entry1 = new TextField(30);
-+		entry2 = new TextField(30);
-+		entry2.setEchoChar('*');
-+		ok = new Button("OK");
-+		ok.addActionListener(this);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", label);
-+		dialog.add("Center", entry1);
-+		dialog.add("South",  entry2);
-+		dialog.add("East", ok);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+		return;
-+	}
-+
-+	public String getAuth() {
-+		return reply1 + ":" + reply2;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == ok) {
-+			reply1 = entry1.getText();
-+			reply2 = entry2.getText();
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+}
-+
-+class ClientCertDialog implements ActionListener {
-+
-+	Button ok;
-+	Dialog dialog;
-+	TextField entry;
-+	String reply = "";
-+
-+	ClientCertDialog() {
-+		;
-+	}
-+
-+	public String queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Enter SSL Client Cert+Key String");
-+
-+		dialog = new Dialog(frame, true);
-+
-+
-+		Label label = new Label("Please Enter the SSL Client Cert+Key String 308204c0...,...522d2d0a", Label.CENTER);
-+		entry = new TextField(30);
-+		ok = new Button("OK");
-+		ok.addActionListener(this);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", label);
-+		dialog.add("Center", entry);
-+		dialog.add("South", ok);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+		return reply;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == ok) {
-+			reply = entry.getText();
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+}
-+
-+class BrowserCertsDialog implements ActionListener {
-+	Button yes, no;
-+	Dialog dialog;
-+	String vncServer;
-+	String hostport;
-+	public boolean showCertDialog = true;
-+
-+	BrowserCertsDialog(String serv, String hp) {
-+		vncServer = serv;
-+		hostport = hp;
-+	}
-+
-+	public void queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Use Browser/JVM Certs?");
-+
-+		dialog = new Dialog(frame, true);
-+
-+		String m = "";
-+m += "\n";
-+m += "This VNC Viewer applet does not have its own keystore to track\n";
-+m += "SSL certificates, and so cannot authenticate the certificate\n";
-+m += "of the VNC Server:\n";
-+m += "\n";
-+m += "        " + hostport + "\n\n        " + vncServer + "\n";
-+m += "\n";
-+m += "on its own.\n";
-+m += "\n";
-+m += "However, it has noticed that your Web Browser and/or Java VM Plugin\n";
-+m += "has previously accepted the same certificate.  You may have set\n";
-+m += "this up permanently or just for this session, or the server\n";
-+m += "certificate was signed by a CA cert that your Web Browser or\n";
-+m += "Java VM Plugin has.\n";
-+m += "\n";
-+m += "If the VNC Server connection times out while you are reading this\n";
-+m += "dialog, then restart the connection and try again.\n";
-+m += "\n";
-+m += "Should this VNC Viewer applet now connect to the above VNC server?\n";
-+m += "\n";
-+
-+		TextArea textarea = new TextArea(m, 22, 64,
-+		    TextArea.SCROLLBARS_VERTICAL_ONLY);
-+		textarea.setEditable(false);
-+		yes = new Button("Yes");
-+		yes.addActionListener(this);
-+		no = new Button("No, Let Me See the Certificate.");
-+		no.addActionListener(this);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", textarea);
-+		dialog.add("Center", yes);
-+		dialog.add("South", no);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til Yes or No pressed. */
-+		System.out.println("done show()");
-+		return;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == yes) {
-+			showCertDialog = false;
-+			//dialog.dispose();
-+			dialog.hide();
-+		} else if (evt.getSource() == no) {
-+			showCertDialog = true;
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+		System.out.println("done actionPerformed()");
-+	}
-+}
-+
-+class CertInfo {
-+	String fields[] = {"CN", "OU", "O", "L", "C"};
-+	java.security.cert.Certificate cert;
-+	String certString = "";
-+
-+	CertInfo(java.security.cert.Certificate c) {
-+		cert = c;
-+		certString = cert.toString();
-+	}
-+	
-+	String get_certinfo(String which) {
-+		int i;
-+		String cs = new String(certString);
-+		String all = "";
-+
-+		/*
-+		 * For now we simply scrape the cert string, there must
-+		 * be an API for this... perhaps optionValue?
-+		 */
-+		for (i=0; i < fields.length; i++) {
-+			int f, t, t1, t2;
-+			String sub, mat = fields[i] + "=";
-+			
-+			f = cs.indexOf(mat, 0);
-+			if (f > 0) {
-+				t1 = cs.indexOf(", ", f);
-+				t2 = cs.indexOf("\n", f);
-+				if (t1 < 0 && t2 < 0) {
-+					continue;
-+				} else if (t1 < 0) {
-+					t = t2;
-+				} else if (t2 < 0) {
-+					t = t1;
-+				} else if (t1 < t2) {
-+					t = t1;
-+				} else {
-+					t = t2;
-+				}
-+				if (t > f) {
-+					sub = cs.substring(f, t);
-+					all = all + "        " + sub + "\n";
-+					if (which.equals(fields[i])) {
-+						return sub;
-+					}
-+				}
-+			}
-+		}
-+		if (which.equals("all")) {
-+			return all;
-+		} else {
-+			return "";
-+		}
-+	}
-+}
-+
-+class Base64Coder {
-+
-+	// Mapping table from 6-bit nibbles to Base64 characters.
-+	private static char[]    map1 = new char[64];
-+	   static {
-+	      int i=0;
-+	      for (char c='A'; c<='Z'; c++) map1[i++] = c;
-+	      for (char c='a'; c<='z'; c++) map1[i++] = c;
-+	      for (char c='0'; c<='9'; c++) map1[i++] = c;
-+	      map1[i++] = '+'; map1[i++] = '/'; }
-+
-+	// Mapping table from Base64 characters to 6-bit nibbles.
-+	private static byte[]    map2 = new byte[128];
-+	   static {
-+	      for (int i=0; i<map2.length; i++) map2[i] = -1;
-+	      for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }
-+
-+	/**
-+	* Encodes a string into Base64 format.
-+	* No blanks or line breaks are inserted.
-+	* @param s  a String to be encoded.
-+	* @return   A String with the Base64 encoded data.
-+	*/
-+	public static String encodeString (String s) {
-+	   return new String(encode(s.getBytes())); }
-+
-+	/**
-+	* Encodes a byte array into Base64 format.
-+	* No blanks or line breaks are inserted.
-+	* @param in  an array containing the data bytes to be encoded.
-+	* @return    A character array with the Base64 encoded data.
-+	*/
-+	public static char[] encode (byte[] in) {
-+	   return encode(in,in.length); }
-+
-+	/**
-+	* Encodes a byte array into Base64 format.
-+	* No blanks or line breaks are inserted.
-+	* @param in   an array containing the data bytes to be encoded.
-+	* @param iLen number of bytes to process in <code>in</code>.
-+	* @return     A character array with the Base64 encoded data.
-+	*/
-+	public static char[] encode (byte[] in, int iLen) {
-+	   int oDataLen = (iLen*4+2)/3;       // output length without padding
-+	   int oLen = ((iLen+2)/3)*4;         // output length including padding
-+	   char[] out = new char[oLen];
-+	   int ip = 0;
-+	   int op = 0;
-+	   while (ip < iLen) {
-+	      int i0 = in[ip++] & 0xff;
-+	      int i1 = ip < iLen ? in[ip++] & 0xff : 0;
-+	      int i2 = ip < iLen ? in[ip++] & 0xff : 0;
-+	      int o0 = i0 >>> 2;
-+	      int o1 = ((i0 &   3) << 4) | (i1 >>> 4);
-+	      int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
-+	      int o3 = i2 & 0x3F;
-+	      out[op++] = map1[o0];
-+	      out[op++] = map1[o1];
-+	      out[op] = op < oDataLen ? map1[o2] : '='; op++;
-+	      out[op] = op < oDataLen ? map1[o3] : '='; op++; }
-+	   return out; }
-+
-+	/**
-+	* Decodes a string from Base64 format.
-+	* @param s  a Base64 String to be decoded.
-+	* @return   A String containing the decoded data.
-+	* @throws   IllegalArgumentException if the input is not valid Base64 encoded data.
-+	*/
-+	public static String decodeString (String s) {
-+	   return new String(decode(s)); }
-+
-+	/**
-+	* Decodes a byte array from Base64 format.
-+	* @param s  a Base64 String to be decoded.
-+	* @return   An array containing the decoded data bytes.
-+	* @throws   IllegalArgumentException if the input is not valid Base64 encoded data.
-+	*/
-+	public static byte[] decode (String s) {
-+	   return decode(s.toCharArray()); }
-+
-+	/**
-+	* Decodes a byte array from Base64 format.
-+	* No blanks or line breaks are allowed within the Base64 encoded data.
-+	* @param in  a character array containing the Base64 encoded data.
-+	* @return    An array containing the decoded data bytes.
-+	* @throws    IllegalArgumentException if the input is not valid Base64 encoded data.
-+	*/
-+	public static byte[] decode (char[] in) {
-+	   int iLen = in.length;
-+	   if (iLen%4 != 0) throw new IllegalArgumentException ("Length of Base64 encoded input string is not a multiple of 4.");
-+	   while (iLen > 0 && in[iLen-1] == '=') iLen--;
-+	   int oLen = (iLen*3) / 4;
-+	   byte[] out = new byte[oLen];
-+	   int ip = 0;
-+	   int op = 0;
-+	   while (ip < iLen) {
-+	      int i0 = in[ip++];
-+	      int i1 = in[ip++];
-+	      int i2 = ip < iLen ? in[ip++] : 'A';
-+	      int i3 = ip < iLen ? in[ip++] : 'A';
-+	      if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
-+		 throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
-+	      int b0 = map2[i0];
-+	      int b1 = map2[i1];
-+	      int b2 = map2[i2];
-+	      int b3 = map2[i3];
-+	      if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
-+		 throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
-+	      int o0 = ( b0       <<2) | (b1>>>4);
-+	      int o1 = ((b1 & 0xf)<<4) | (b2>>>2);
-+	      int o2 = ((b2 &   3)<<6) |  b3;
-+	      out[op++] = (byte)o0;
-+	      if (op<oLen) out[op++] = (byte)o1;
-+	      if (op<oLen) out[op++] = (byte)o2; }
-+	   return out; }
-+
-+	// Dummy constructor.
-+	private Base64Coder() {}
-+
-+}
-diff -Naur vnc_javasrc.orig/VncCanvas.java vnc_javasrc/VncCanvas.java
---- vnc_javasrc.orig/VncCanvas.java	2004-10-10 02:15:54.000000000 -0400
-+++ vnc_javasrc/VncCanvas.java	2010-11-30 21:01:15.000000000 -0500
-@@ -28,13 +28,14 @@
- import java.lang.*;
- import java.util.zip.*;
- 
-+import java.util.Collections;
- 
- //
- // VncCanvas is a subclass of Canvas which draws a VNC desktop on it.
- //
- 
- class VncCanvas extends Canvas
--  implements KeyListener, MouseListener, MouseMotionListener {
-+  implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener {
- 
-   VncViewer viewer;
-   RfbProto rfb;
-@@ -81,6 +82,20 @@
-     cm8 = new DirectColorModel(8, 7, (7 << 3), (3 << 6));
-     cm24 = new DirectColorModel(24, 0xFF0000, 0x00FF00, 0x0000FF);
- 
-+    // kludge to not show any Java cursor in the canvas since we are
-+    // showing the soft cursor (should be a user setting...)
-+    Cursor dot = Toolkit.getDefaultToolkit().createCustomCursor(
-+        Toolkit.getDefaultToolkit().createImage(new byte[4]), new Point(0,0),
-+        "dot");
-+    this.setCursor(dot);
-+
-+    // while we are at it... get rid of the keyboard traversals that
-+    // make it so we can't type a Tab character:
-+    this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
-+        Collections.EMPTY_SET);
-+    this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
-+        Collections.EMPTY_SET);
-+
-     colors = new Color[256];
-     for (int i = 0; i < 256; i++)
-       colors[i] = new Color(cm8.getRGB(i));
-@@ -169,6 +184,7 @@
-       inputEnabled = true;
-       addMouseListener(this);
-       addMouseMotionListener(this);
-+      addMouseWheelListener(this);
-       if (viewer.showControls) {
- 	viewer.buttonPanel.enableRemoteAccessControls(true);
-       }
-@@ -177,6 +193,7 @@
-       inputEnabled = false;
-       removeMouseListener(this);
-       removeMouseMotionListener(this);
-+      removeMouseWheelListener(this);
-       if (viewer.showControls) {
- 	viewer.buttonPanel.enableRemoteAccessControls(false);
-       }
-@@ -1190,6 +1207,9 @@
-   public void mouseDragged(MouseEvent evt) {
-     processLocalMouseEvent(evt, true);
-   }
-+  public void mouseWheelMoved(MouseWheelEvent evt) {
-+    processLocalMouseWheelEvent(evt);
-+  }
- 
-   public void processLocalKeyEvent(KeyEvent evt) {
-     if (viewer.rfb != null && rfb.inNormalProtocol) {
-@@ -1221,6 +1241,19 @@
-     evt.consume();
-   }
- 
-+  public void processLocalMouseWheelEvent(MouseWheelEvent evt) {
-+    if (viewer.rfb != null && rfb.inNormalProtocol) {
-+      synchronized(rfb) {
-+	try {
-+	  rfb.writeWheelEvent(evt);
-+	} catch (Exception e) {
-+	  e.printStackTrace();
-+	}
-+	rfb.notify();
-+      }
-+    }
-+  }
-+
-   public void processLocalMouseEvent(MouseEvent evt, boolean moved) {
-     if (viewer.rfb != null && rfb.inNormalProtocol) {
-       if (moved) {
-@@ -1387,9 +1420,9 @@
- 		result = cm8.getRGB(pixBuf[i]);
- 	      } else {
- 		result = 0xFF000000 |
--		  (pixBuf[i * 4 + 1] & 0xFF) << 16 |
--		  (pixBuf[i * 4 + 2] & 0xFF) << 8 |
--		  (pixBuf[i * 4 + 3] & 0xFF);
-+		  (pixBuf[i * 4 + 2] & 0xFF) << 16 |
-+		  (pixBuf[i * 4 + 1] & 0xFF) << 8 |
-+		  (pixBuf[i * 4 + 0] & 0xFF);
- 	      }
- 	    } else {
- 	      result = 0;	// Transparent pixel
-@@ -1403,9 +1436,9 @@
- 	      result = cm8.getRGB(pixBuf[i]);
- 	    } else {
- 	      result = 0xFF000000 |
--		(pixBuf[i * 4 + 1] & 0xFF) << 16 |
--		(pixBuf[i * 4 + 2] & 0xFF) << 8 |
--		(pixBuf[i * 4 + 3] & 0xFF);
-+		(pixBuf[i * 4 + 2] & 0xFF) << 16 |
-+		(pixBuf[i * 4 + 1] & 0xFF) << 8 |
-+		(pixBuf[i * 4 + 0] & 0xFF);
- 	    }
- 	  } else {
- 	    result = 0;		// Transparent pixel
-diff -Naur vnc_javasrc.orig/VncViewer.java vnc_javasrc/VncViewer.java
---- vnc_javasrc.orig/VncViewer.java	2004-03-04 08:34:25.000000000 -0500
-+++ vnc_javasrc/VncViewer.java	2010-03-27 17:57:04.000000000 -0400
-@@ -29,6 +29,7 @@
- import java.awt.event.*;
- import java.io.*;
- import java.net.*;
-+import java.util.*;
- 
- public class VncViewer extends java.applet.Applet
-   implements java.lang.Runnable, WindowListener {
-@@ -80,7 +81,7 @@
-   // Variables read from parameter values.
-   String socketFactory;
-   String host;
--  int port;
-+  int port, vncserverport;
-   boolean showControls;
-   boolean offerRelogin;
-   boolean showOfflineDesktop;
-@@ -88,6 +89,24 @@
-   int deferCursorUpdates;
-   int deferUpdateRequests;
- 
-+  boolean disableSSL;
-+  boolean GET;
-+  String CONNECT;
-+  String urlPrefix;
-+  String httpsPort;
-+  String oneTimeKey;
-+  String serverCert;
-+  String proxyHost;
-+  String proxyPort;
-+  boolean forceProxy;
-+  boolean ignoreProxy;
-+  boolean trustAllVncCerts;
-+  boolean trustUrlVncCert;
-+  boolean debugCerts;
-+  boolean debugKeyboard;
-+  boolean mapF5_to_atsign;
-+  boolean forbid_Ctrl_Alt;
-+
-   // Reference to this applet for inter-applet communication.
-   public static java.applet.Applet refApplet;
- 
-@@ -282,10 +301,24 @@
-       validate();
-     }
- 
--    while (!tryAuthenticate()) {
--      authenticator.retry();
--      authenticatorUnixLogin.retry();
--    }
-+	if (false) {
-+		/* a bug on retries: 'Error: bad position: 8' sun.awt.X11.XTextFieldPeer.setCaretPosition(XTextFieldPeer.java:215) */
-+		while (!tryAuthenticate()) {
-+			authenticator.retry();
-+			authenticatorUnixLogin.retry();
-+		}
-+	} else {
-+		/* just try once and not forever... */
-+		if (!tryAuthenticate()) {
-+    			showConnectionStatus("Authentication Failed.");
-+			showMessage("Authentication Failed.");
-+			if (!offerRelogin) {
-+				fatalError("auth failed.");
-+			}
-+		} else {
-+			//showConnectionStatus("Authentication OK.");
-+		}
-+	}
-   }
- 
- 
-@@ -428,7 +461,10 @@
-     gbc.ipadx = 100;
-     gbc.ipady = 50;
-     gridbag.setConstraints(authPanel, gbc);
-+    try {
-     vncContainer.add(authPanel);
-+    } catch (Exception e) {
-+    }
- 
-     if (inSeparateFrame) {
-       vncFrame.pack();
-@@ -590,9 +626,28 @@
- 	fatalError("HOST parameter not specified");
-       }
-     }
-+    Date d = new Date();
-+    System.out.println("-\nSSL VNC Java Applet starting.  " + d);
- 
--    String str = readParameter("PORT", true);
--    port = Integer.parseInt(str);
-+    port = 0;
-+    String str = readParameter("PORT", false);
-+    if (str != null) {
-+	port = Integer.parseInt(str);
-+    }
-+    // When there is a proxy VNCSERVERPORT may be inaccessible (inside firewall).
-+    vncserverport = 0;
-+    str = readParameter("VNCSERVERPORT", false);
-+    if (str != null) {
-+	vncserverport = Integer.parseInt(str);
-+    }
-+    if (port == 0 && vncserverport == 0) {
-+	fatalError("Neither PORT nor VNCSERVERPORT parameters specified");
-+    }
-+    if (port == 0) {
-+	// Nevertheless, fall back to vncserverport if we have to.
-+	System.out.println("using vncserverport: '" + vncserverport + "' for PORT.");
-+	port = vncserverport;
-+    }
- 
-     if (inAnApplet) {
-       str = readParameter("Open New Window", false);
-@@ -626,6 +681,121 @@
- 
-     // SocketFactory.
-     socketFactory = readParameter("SocketFactory", false);
-+
-+    // SSL
-+    disableSSL = false;
-+    str = readParameter("DisableSSL", false);
-+    if (str != null && str.equalsIgnoreCase("Yes"))
-+      disableSSL = true;
-+
-+    httpsPort = readParameter("httpsPort", false);
-+
-+    // Extra GET, CONNECT string:
-+    CONNECT = readParameter("CONNECT", false);
-+    if (CONNECT != null) {
-+	CONNECT = CONNECT.replaceAll(" ", ":");
-+    }
-+
-+    GET = false;
-+    str = readParameter("GET", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+      GET = true;
-+    }
-+    if (str != null && str.equalsIgnoreCase("1")) {
-+      GET = true;
-+    }
-+
-+    urlPrefix = readParameter("urlPrefix", false);
-+    if (urlPrefix != null) {
-+	urlPrefix = urlPrefix.replaceAll("%2F", "/");
-+	urlPrefix = urlPrefix.replaceAll("%2f", "/");
-+	urlPrefix = urlPrefix.replaceAll("_2F_", "/");
-+	if (urlPrefix.indexOf("/") != 0) {
-+		urlPrefix = "/" + urlPrefix;
-+	}
-+    } else {
-+    	urlPrefix = "";
-+    }
-+    System.out.println("urlPrefix: '" + urlPrefix + "'");
-+
-+    oneTimeKey = readParameter("oneTimeKey", false);
-+    if (oneTimeKey != null) {
-+    	System.out.println("oneTimeKey is set.");
-+    }
-+
-+    serverCert = readParameter("serverCert", false);
-+    if (serverCert != null) {
-+    	System.out.println("serverCert is set.");
-+    }
-+
-+    forceProxy = false;
-+    proxyHost = null;
-+    proxyPort = null;
-+    str = readParameter("forceProxy", false);
-+    if (str != null) {
-+	    if (str.equalsIgnoreCase("Yes")) {
-+		forceProxy = true;
-+	    } else if (str.equalsIgnoreCase("No")) {
-+		forceProxy = false;
-+	    } else {
-+		forceProxy = true;
-+		String[] pieces = str.split(" ");
-+		proxyHost = new String(pieces[0]);
-+		if (pieces.length >= 2) {
-+			proxyPort = new String(pieces[1]);
-+		} else {
-+			proxyPort = new String("8080");
-+		}
-+	    }
-+    }
-+    str = readParameter("proxyHost", false);
-+    if (str != null) {
-+	proxyHost = new String(str);
-+    }
-+    str = readParameter("proxyPort", false);
-+    if (str != null) {
-+	proxyPort = new String(str);
-+    }
-+    if (proxyHost != null && proxyPort == null) {
-+    	proxyPort = new String("8080");
-+    }
-+
-+    ignoreProxy = false;
-+    str = readParameter("ignoreProxy", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	ignoreProxy = true;
-+    }
-+
-+    trustAllVncCerts = false;
-+    str = readParameter("trustAllVncCerts", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	trustAllVncCerts = true;
-+    }
-+    trustUrlVncCert = false;
-+    str = readParameter("trustUrlVncCert", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	trustUrlVncCert = true;
-+    }
-+    debugCerts = false;
-+    str = readParameter("debugCerts", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	debugCerts = true;
-+    }
-+    debugKeyboard = false;
-+    str = readParameter("debugKeyboard", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	debugKeyboard = true;
-+    }
-+    mapF5_to_atsign = false;
-+    str = readParameter("mapF5_to_atsign", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	mapF5_to_atsign = true;
-+    }
-+    forbid_Ctrl_Alt = false;
-+    str = readParameter("forbid_Ctrl_Alt", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	forbid_Ctrl_Alt = true;
-+    }
-   }
- 
-   public String readParameter(String name, boolean required) {

+ 0 - 5494
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultravnc-102-JavaViewer-ssl-etc.patch

@@ -1,5494 +0,0 @@
-diff -Naur JavaViewer.orig/ButtonPanel.java JavaViewer/ButtonPanel.java
---- JavaViewer.orig/ButtonPanel.java	2004-12-12 20:51:02.000000000 -0500
-+++ JavaViewer/ButtonPanel.java	2007-05-31 15:40:45.000000000 -0400
-@@ -43,30 +43,36 @@
-     viewer = v;
- 
-     setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
--    disconnectButton = new Button("Disconnect");
-+	if (v.ftpOnly) {
-+		disconnectButton = new Button("Quit");
-+	} else {
-+		disconnectButton = new Button("Close");
-+	}
-     disconnectButton.setEnabled(false);
-     add(disconnectButton);
-     disconnectButton.addActionListener(this);
--    optionsButton = new Button("Options");
--    add(optionsButton);
--    optionsButton.addActionListener(this);
--    clipboardButton = new Button("Clipboard");
--    clipboardButton.setEnabled(false);
--    add(clipboardButton);
--    clipboardButton.addActionListener(this);
--    if (viewer.rec != null) {
--      recordButton = new Button("Record");
--      add(recordButton);
--      recordButton.addActionListener(this);
--    }
--    ctrlAltDelButton = new Button("Send Ctrl-Alt-Del");
--    ctrlAltDelButton.setEnabled(false);
--    add(ctrlAltDelButton);
--    ctrlAltDelButton.addActionListener(this);
--    refreshButton = new Button("Refresh");
--    refreshButton.setEnabled(false);
--    add(refreshButton);
--    refreshButton.addActionListener(this);
-+	if (!v.ftpOnly) {
-+		optionsButton = new Button("Options");
-+		add(optionsButton);
-+		optionsButton.addActionListener(this);
-+		clipboardButton = new Button("Clipboard");
-+		clipboardButton.setEnabled(false);
-+		add(clipboardButton);
-+		clipboardButton.addActionListener(this);
-+		if (viewer.rec != null) {
-+			recordButton = new Button("Record");
-+			add(recordButton);
-+			recordButton.addActionListener(this);
-+		}
-+		ctrlAltDelButton = new Button("Send Ctrl-Alt-Del");
-+		ctrlAltDelButton.setEnabled(false);
-+		add(ctrlAltDelButton);
-+		ctrlAltDelButton.addActionListener(this);
-+		refreshButton = new Button("Refresh");
-+		refreshButton.setEnabled(false);
-+		add(refreshButton);
-+		refreshButton.addActionListener(this);
-+	}
-     ftpButton = new Button("File Transfer");
-     ftpButton.setEnabled(false);
-     add(ftpButton);
-@@ -79,9 +85,10 @@
- 
-   public void enableButtons() {
-     disconnectButton.setEnabled(true);
-+    ftpButton.setEnabled(true);
-+    if (viewer.ftpOnly) {return;}
-     clipboardButton.setEnabled(true);
-     refreshButton.setEnabled(true);
--    ftpButton.setEnabled(true);
-   }
- 
-   //
-@@ -89,6 +96,9 @@
-   //
- 
-   public void disableButtonsOnDisconnect() {
-+    ftpButton.setEnabled(false);
-+    if (viewer.ftpOnly) {return;}
-+
-     remove(disconnectButton);
-     disconnectButton = new Button("Hide desktop");
-     disconnectButton.setEnabled(true);
-@@ -99,7 +109,6 @@
-     clipboardButton.setEnabled(false);
-     ctrlAltDelButton.setEnabled(false);
-     refreshButton.setEnabled(false);
--    ftpButton.setEnabled(false);
- 
-     validate();
-   }
-@@ -110,6 +119,7 @@
-   //
- 
-   public void enableRemoteAccessControls(boolean enable) {
-+    if (viewer.ftpOnly) {return;}
-     ctrlAltDelButton.setEnabled(enable);
-   }
- 
-@@ -163,9 +173,19 @@
-     }
-     else if (evt.getSource() == ftpButton)
-     {
--		viewer.ftp.setVisible(!viewer.ftp.isVisible());
-+// begin runge/x11vnc
-+		if (viewer.ftpOnly) {
-+			viewer.vncFrame.setVisible(false);
-+		}
-+		viewer.ftp.setSavedLocations();
-+		if (viewer.ftp.isVisible()) {
-+			viewer.ftp.doClose();
-+		} else {
-+			viewer.ftp.doOpen();
-+		}
-+// end runge/x11vnc
- 		viewer.rfb.readServerDriveList();
--	
-+
-     }
-   }
- }
-diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
---- JavaViewer.orig/FTPFrame.java	2005-03-15 23:53:14.000000000 -0500
-+++ JavaViewer/FTPFrame.java	2009-01-13 09:48:30.000000000 -0500
-@@ -24,8 +24,17 @@
- import java.io.*;
- import java.util.ArrayList;
- import java.util.Vector;
-+import java.util.Date;
- import javax.swing.*;
- 
-+import java.nio.ByteBuffer;
-+import java.nio.CharBuffer;
-+import java.nio.charset.*;
-+
-+// begin runge/x11vnc
-+import java.util.Arrays;
-+// end runge/x11vnc
-+
- 
- /*
-  * Created on Feb 25, 2004
-@@ -74,12 +83,31 @@
- 	public javax.swing.JTextField connectionStatus = null;
- 	public boolean updateDriveList;
- 	private Vector remoteList = null;
-+	private Vector remoteListInfo = null;
- 	private Vector localList = null;
-+	private Vector localListInfo = null;
- 	private File currentLocalDirectory = null;	// Holds the current local Directory
- 	private File currentRemoteDirectory = null;	// Holds the current remote Directory
- 	private File localSelection = null;		// Holds the currently selected local file  
- 	private String remoteSelection = null;	// Holds the currently selected remote file
- 	public String selectedTable = null;
-+
-+// begin runge/x11vnc
-+	private javax.swing.JButton viewButton = null;
-+	private javax.swing.JButton refreshButton = null;
-+	public File saveLocalDirectory = null;
-+	public long saveLocalDirectoryTime = 0;
-+	public int saveLocalDirectoryCount = 0;
-+	public String saveRemoteDirectory = null;
-+	public long saveRemoteDirectoryTime = 0;
-+	public int saveRemoteDirectoryCount = 0;
-+	private boolean localCurrentIsDir = true;
-+	private int lastRemoteIndex = -1;
-+	private int lastLocalIndex = -1;
-+	private boolean doingShortcutDir = false;
-+	private boolean gotShortcutDir = false;
-+	private boolean ignore_events = false;
-+// end   runge/x11vnc
- 	
- //	 sf@2004 - Separate directories and files for better lisibility
- 	private ArrayList DirsList;
-@@ -125,11 +153,61 @@
- 	 
- 	 void refreshRemoteLocation()
- 	 {
-+
-+//System.out.println("refreshRemoteLocation1");
- 		remoteList.clear();
-+		remoteListInfo.clear();
- 		remoteFileTable.setListData(remoteList);	
-+System.out.println("refreshRemoteLocation '" + remoteLocation.getText() + "'");	// runge/x11vnc
- 		viewer.rfb.readServerDirectory(remoteLocation.getText());
- 	 }
- 	 
-+// begin runge/x11vnc
-+	 public void setSavedLocations() {
-+		saveLocalDirectory = currentLocalDirectory;
-+		saveLocalDirectoryTime = System.currentTimeMillis();
-+		saveLocalDirectoryCount = 0;
-+
-+		if (remoteLocation != null) {
-+			saveRemoteDirectory = remoteLocation.getText();
-+System.out.println("RemoteSave '" + saveRemoteDirectory + "'");
-+		}
-+		saveRemoteDirectoryTime = System.currentTimeMillis();
-+		saveRemoteDirectoryCount = 0;
-+	 }
-+
-+	private File saveLocalHack(File dir) {
-+		saveLocalDirectoryCount++;
-+//System.out.println("L " + saveLocalDirectoryCount + " dt: " + (System.currentTimeMillis() - saveLocalDirectoryTime) + " - " + saveLocalDirectory);
-+		if (System.currentTimeMillis() > saveLocalDirectoryTime + 2000 || saveLocalDirectoryCount > 2) {
-+			saveLocalDirectory = null;
-+		}
-+		if (saveLocalDirectory != null) {
-+			currentLocalDirectory = saveLocalDirectory;
-+			localLocation.setText(saveLocalDirectory.toString());
-+			return saveLocalDirectory;
-+		} else {
-+			return dir;
-+		}
-+	}
-+
-+	private String saveRemoteHack(String indrive) {
-+		saveRemoteDirectoryCount++;
-+//System.out.println("R " + saveRemoteDirectoryCount + " - " + saveRemoteDirectory);
-+		if (saveRemoteDirectory != null && saveRemoteDirectoryCount > 1) {
-+			saveRemoteDirectory = null;
-+		}
-+		if (saveRemoteDirectory != null) {
-+			if (! saveRemoteDirectory.equals("")) {
-+System.out.println("saveRemoteHack setText + refreshRemoteLocation '" + saveRemoteDirectory + "'");
-+				return saveRemoteDirectory;
-+			}
-+		}
-+		return indrive;
-+	}
-+// end runge/x11vnc
-+
-+
- 	/*
- 	 * Prints the list of drives on the remote directory and returns a String[].  
- 	 * str takes as string like A:fC:lD:lE:lF:lG:cH:c
-@@ -143,6 +221,9 @@
- 		int size = str.length();
- 		String driveType = null;
- 		String[] drive = new String[str.length() / 3];
-+		int idx = 0, C_drive = -1, O_drive = -1;
-+
-+System.out.println("ComboBox: Str   '" + str + "'");
- 
- 		// Loop through the string to create a String[]
- 		for (int i = 0; i < size; i = i + 3) {
-@@ -150,26 +231,68 @@
- 			driveType = str.substring(i + 2, i + 3);
- 			if (driveType.compareTo("f") == 0)
- 				drive[i / 3] += "\\ Floppy";
--			if (driveType.compareTo("l") == 0)
-+			if (driveType.compareTo("l") == 0) {
- 				drive[i / 3] += "\\ Local Disk";
-+				if (drive[i/3].substring(0,1).toUpperCase().equals("C")) {
-+					C_drive = idx;
-+				} else if (O_drive < 0) {
-+					O_drive = idx;
-+				}
-+			}
- 			if (driveType.compareTo("c") == 0)
- 				drive[i / 3] += "\\ CD-ROM";
- 			if (driveType.compareTo("n") == 0)
- 				drive[i / 3] += "\\ Network";
- 
- 			remoteDrivesComboBox.addItem(drive[i / 3]);
-+System.out.println("ComboBox: Add " + idx + " '" + drive[i/3] + "'");
-+			idx++;
-+		}
-+
-+		// runge
-+		if (viewer.ftpDropDown != null) {
-+			String[] dd = viewer.ftpDropDown.split("\\.");
-+			for (int i=0; i < dd.length; i++) {
-+				if (!dd[i].equals("")) {
-+					String s = dd[i];
-+					if (s.startsWith("TOP_")) {
-+						s = s.substring(4);
-+						remoteDrivesComboBox.insertItemAt(" [" + s + "]", 0);
-+					} else {
-+						remoteDrivesComboBox.addItem(" [" + s + "]");
-+					}
-+				}
-+			}
-+		} else {
-+			remoteDrivesComboBox.addItem(" [My Documents]");
-+			remoteDrivesComboBox.addItem(" [Desktop]");
-+			remoteDrivesComboBox.addItem(" [Home]");
- 		}
-+
- 		//sf@ - Select Drive C:as default if possible
- 		boolean bFound = false;
--		for(int i = 0; i < remoteDrivesComboBox.getItemCount() ; i++)
--		{
--			if(remoteDrivesComboBox.getItemAt(i).toString().substring(0,1).toUpperCase().equals("C"))
--			{
--				remoteDrivesComboBox.setSelectedIndex(i);
-+
-+		if (false) {
-+			for(int i = 0; i < remoteDrivesComboBox.getItemCount() ; i++) {
-+				if(remoteDrivesComboBox.getItemAt(i).toString().substring(0,1).toUpperCase().equals("C")) {
-+					remoteDrivesComboBox.setSelectedIndex(i);
-+					bFound = true;
-+				}
-+			}
-+		} else {
-+			if (C_drive >= 0) {
-+				remoteDrivesComboBox.setSelectedIndex(C_drive);
-+				bFound = true;
-+System.out.println("ComboBox: C_drive index: " + C_drive);
-+			} else if (O_drive >= 0) {
-+				remoteDrivesComboBox.setSelectedIndex(O_drive);
- 				bFound = true;
-+System.out.println("ComboBox: Other_drive index: " + O_drive);
- 			}
- 		}
-+
- 		if (!bFound) remoteDrivesComboBox.setSelectedIndex(0);
-+
- 		updateDriveList = false;
- 		return drive;
- 	}
-@@ -185,6 +308,8 @@
- 		stopButton.setVisible(true);
- 		stopButton.setEnabled(true);
- 		receiveButton.setEnabled(false);
-+		viewButton.setEnabled(false);	// runge/x11vnc
-+		refreshButton.setEnabled(false);
- 		remoteTopButton.setEnabled(false);
- 		sendButton.setEnabled(false);
- 		remoteFileTable.setEnabled(false);
-@@ -207,6 +332,8 @@
- 		stopButton.setVisible(false);
- 		stopButton.setEnabled(false);
- 		receiveButton.setEnabled(true);
-+		viewButton.setEnabled(true);	// runge/x11vnc
-+		refreshButton.setEnabled(true);
- 		remoteTopButton.setEnabled(true);
- 		sendButton.setEnabled(true);
- 		remoteFileTable.setEnabled(true);
-@@ -221,10 +348,11 @@
- 	/*
- 	 * Print Directory prints out all the contents of a directory
- 	 */
--	void printDirectory(ArrayList a) {
-+	void printDirectory(ArrayList a, ArrayList b) {
- 
- 		for (int i = 0; i < a.size(); i++) {
- 			remoteList.addElement(a.get(i));
-+			remoteListInfo.addElement(b.get(i));
- 		}
- 		remoteFileTable.setListData(remoteList);
- 	}
-@@ -235,10 +363,12 @@
- 	 * @return void
- 	 */
- 	private void initialize() {
-+		ignore_events = true;
- 		this.setSize(794, 500);
- 		this.setContentPane(getJContentPane());
-+		ignore_events = false;
- 		updateDriveList = true;
--		}
-+	}
- 	/**
- 	 * This method initializes jContentPane.  This is the main content pane
- 	 * 
-@@ -253,6 +383,33 @@
- 			jContentPane.add(getRemotePanel(), java.awt.BorderLayout.EAST);
- 			jContentPane.add(getLocalPanel(), java.awt.BorderLayout.WEST);
- 			jContentPane.add(getButtonPanel(), java.awt.BorderLayout.CENTER);
-+
-+			KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
-+			AbstractAction escapeAction = new AbstractAction() {
-+				public void actionPerformed(ActionEvent actionEvent) {
-+					System.out.println("Escape Pressed");
-+					if (viewer.ftpOnly) {
-+						System.out.println("exiting...");
-+						System.exit(0);
-+					} else {
-+						doClose();
-+					}
-+				}
-+			};
-+			jContentPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(stroke, "escapeAction");
-+			jContentPane.getInputMap().put(stroke, "escapeAction");
-+			jContentPane.getActionMap().put("escapeAction", escapeAction);
-+
-+			stroke = KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK);
-+			AbstractAction resetAction = new AbstractAction() {
-+				public void actionPerformed(ActionEvent actionEvent) {
-+					System.out.println("Ctrl-R Pressed");
-+					doReset();
-+				}
-+			};
-+			jContentPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(stroke, "resetAction");
-+			jContentPane.getInputMap().put(stroke, "resetAction");
-+			jContentPane.getActionMap().put("resetAction", resetAction);
- 		}
- 		return jContentPane;
- 	}
-@@ -270,6 +427,7 @@
- 			topPanelLocal.add(getLocalMachineLabel(), java.awt.BorderLayout.CENTER);
- 			topPanelLocal.add(getLocalTopButton(), java.awt.BorderLayout.EAST);
- 			topPanelLocal.setBackground(java.awt.Color.lightGray);
-+//System.out.println("getTopPanelLocal");
- 		}
- 		return topPanelLocal;
- 	}
-@@ -288,6 +446,7 @@
- 			topPanelRemote.add(getRemoteMachineLabel(), java.awt.BorderLayout.CENTER);
- 			topPanelRemote.add(getRemoteTopButton(), java.awt.BorderLayout.EAST);
- 			topPanelRemote.setBackground(java.awt.Color.lightGray);
-+//System.out.println("getTopPanelRemote");
- 		}
- 		return topPanelRemote;
- 	}
-@@ -301,6 +460,7 @@
- 		if (topPanelCenter == null) {
- 			topPanelCenter = new javax.swing.JPanel();
- 			topPanelCenter.add(getDummyButton(), null);
-+//System.out.println("getTopPanelCenter");
- 		}
- 		return topPanelCenter;
- 	}
-@@ -328,6 +488,7 @@
- 			topPanel.add(getRemoteTopButton(), null);
- 			topPanel.setBackground(java.awt.Color.lightGray);
- 			*/
-+//System.out.println("getTopPanel");
- 		}
- 		return topPanel;
- 	}
-@@ -348,6 +509,7 @@
- 			statusPanel.add(getJProgressBar(), null);
- 			statusPanel.add(getConnectionStatus(), null);
- 			statusPanel.setBackground(java.awt.Color.lightGray);
-+//System.out.println("getStatusPanel");
- 			
- 		}
- 		return statusPanel;
-@@ -368,6 +530,7 @@
- 			remotePanel.add(getRemoteScrollPane(), null);
- 			remotePanel.add(getRemoteStatus(), null);
- 			remotePanel.setBackground(java.awt.Color.lightGray);
-+//System.out.println("getRemotePanel");
- 		}
- 		return remotePanel;
- 	}
-@@ -390,6 +553,7 @@
- 			localPanel.setComponentOrientation(
- 				java.awt.ComponentOrientation.UNKNOWN);
- 			localPanel.setName("localPanel");
-+//System.out.println("getLocalPanel");
- 		}
- 		return localPanel;
- 	}
-@@ -405,12 +569,15 @@
- 			buttonPanel = new javax.swing.JPanel();
- 			buttonPanel.setLayout(null);
- 			buttonPanel.add(getReceiveButton(), null);
-+			buttonPanel.add(getRefreshButton(), null);	// runge/x11vnc
-+			buttonPanel.add(getViewButton(), null);	// runge/x11vnc
- 			buttonPanel.add(getNewFolderButton(), null);
- 			buttonPanel.add(getCloseButton(), null);
- 			buttonPanel.add(getDeleteButton(), null);
- 			buttonPanel.add(getSendButton(), null);
- 			buttonPanel.add(getStopButton(), null);
- 			buttonPanel.setBackground(java.awt.Color.lightGray);
-+//System.out.println("getButtonPanel");
- 		}
- 		return buttonPanel;
- 	}
-@@ -422,10 +589,11 @@
- 	private javax.swing.JButton getSendButton() {
- 		if (sendButton == null) {
- 			sendButton = new javax.swing.JButton();
--			sendButton.setBounds(20, 30, 97, 25);
-+			sendButton.setBounds(15, 30, 107, 25);	// runge/x11vnc
- 			sendButton.setText("Send >>");
- 			sendButton.setName("sendButton");
- 			sendButton.addActionListener(this);
-+//System.out.println("getSendButton");
- 
- 		}
- 		return sendButton;
-@@ -438,7 +606,7 @@
- 	private javax.swing.JButton getReceiveButton() {
- 		if (receiveButton == null) {
- 			receiveButton = new javax.swing.JButton();
--			receiveButton.setBounds(20, 60, 97, 25);
-+			receiveButton.setBounds(15, 60, 107, 25);	// runge/x11vnc
- 			receiveButton.setText("<< Receive");
- 			receiveButton.setName("receiveButton");
- 			receiveButton.addActionListener(this);
-@@ -453,7 +621,7 @@
- 	private javax.swing.JButton getDeleteButton() {
- 		if (deleteButton == null) {
- 			deleteButton = new javax.swing.JButton();
--			deleteButton.setBounds(20, 110, 97, 25);
-+			deleteButton.setBounds(15, 110, 107, 25);	// runge/x11vnc
- 			deleteButton.setText("Delete File");
- 			deleteButton.setName("deleteButton");
- 			deleteButton.addActionListener(this);
-@@ -468,7 +636,7 @@
- 	private javax.swing.JButton getNewFolderButton() {
- 		if (newFolderButton == null) {
- 			newFolderButton = new javax.swing.JButton();
--			newFolderButton.setBounds(20, 140, 97, 25);
-+			newFolderButton.setBounds(15, 140, 107, 25);	// runge/x11vnc
- 			newFolderButton.setText("New Folder");
- 			newFolderButton.setName("newFolderButton");
- 			newFolderButton.addActionListener(this);
-@@ -476,6 +644,39 @@
- 		return newFolderButton;
- 	}
- 	
-+// begin runge/x11vnc
-+	/**
-+	 * This method initializes refreshButton
-+	 * 
-+	 * @return javax.swing.JButton
-+	 */
-+	private javax.swing.JButton getRefreshButton() {
-+		if (refreshButton == null) {
-+			refreshButton = new javax.swing.JButton();
-+			refreshButton.setBounds(15, 170, 107, 25);
-+			refreshButton.setText("Refresh");
-+			refreshButton.setName("refreshButton");
-+			refreshButton.addActionListener(this);
-+		}
-+		return refreshButton;
-+	}
-+	/**
-+	 * This method initializes viewButton
-+	 * 
-+	 * @return javax.swing.JButton
-+	 */
-+	private javax.swing.JButton getViewButton() {
-+		if (viewButton == null) {
-+			viewButton = new javax.swing.JButton();
-+			viewButton.setBounds(15, 200, 107, 25);
-+			viewButton.setText("View File");
-+			viewButton.setName("viewButton");
-+			viewButton.addActionListener(this);
-+		}
-+		return viewButton;
-+	}
-+// end   runge/x11vnc
-+
- 	/**
- 	 * This method initializes stopButton
- 	 * 
-@@ -486,7 +687,7 @@
- 		if (stopButton == null)
- 		{
- 			stopButton = new javax.swing.JButton();
--			stopButton.setBounds(20, 200, 97, 25);
-+			stopButton.setBounds(15, 230, 107, 25);	// runge/x11vnc
- 			stopButton.setText("Stop");
- 			stopButton.setName("stopButton");
- 			stopButton.addActionListener(this);
-@@ -503,8 +704,12 @@
- 	private javax.swing.JButton getCloseButton() {
- 		if (closeButton == null) {
- 			closeButton = new javax.swing.JButton();
--			closeButton.setBounds(20, 325, 97, 25);
--			closeButton.setText("Close");
-+			closeButton.setBounds(15, 325, 107, 25);	// runge/x11vnc
-+			if (viewer.ftpOnly) {
-+				closeButton.setText("Quit");
-+			} else {
-+				closeButton.setText("Close");
-+			}
- 			closeButton.setName("closeButton");
- 			closeButton.addActionListener(this);
- 		}
-@@ -551,6 +756,7 @@
- 			//Select the second entry (e.g. C:\)
- 			// localDrivesComboBox.setSelectedIndex(1);
- 			localDrivesComboBox.addActionListener(this);
-+//System.out.println("getLocalDrivesComboBox");
- 		}
- 		updateDriveList = false;
- 		return localDrivesComboBox;
-@@ -567,6 +773,7 @@
- 			remoteDrivesComboBox.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
- 			remoteDrivesComboBox.addActionListener(this);
-+//System.out.println("getRemoteDrivesComboBox");
- 
- 		}
- 		return remoteDrivesComboBox;
-@@ -587,6 +794,7 @@
- 			localMachineLabel.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.BOLD, 11));
- 			localMachineLabel.setEditable(false);
-+//System.out.println("getLocalMachineLabel");
- 		}
- 		return localMachineLabel;
- 	}
-@@ -622,6 +830,7 @@
- 			localTopButton.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));
- 			localTopButton.addActionListener(this);
-+//System.out.println("getLocalTopButton");
- 		}
- 		return localTopButton;
- 	}
-@@ -638,6 +847,7 @@
- 			remoteTopButton.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));
- 			remoteTopButton.addActionListener(this);
-+//System.out.println("getRemoteTopButton");
- 		}
- 		return remoteTopButton;
- 	}
-@@ -650,9 +860,24 @@
- 	private javax.swing.JList getLocalFileTable() {
- 		if (localFileTable == null) {
- 			localList = new Vector(0);
-+			localListInfo = new Vector(0);
- 			localFileTable = new JList(localList);
-+			MouseMotionListener mlisten = new MouseMotionAdapter() {
-+				public void mouseMoved(MouseEvent e) {
-+					int index = localFileTable.locationToIndex(e.getPoint());
-+					if (index == lastLocalIndex) {
-+						return;
-+					} else if (index < 0) {
-+						return;
-+					}
-+					lastLocalIndex = index;
-+					connectionStatus.setText((String) localListInfo.get(index));
-+				}
-+			};
- 			localFileTable.addMouseListener(this);
-+			localFileTable.addMouseMotionListener(mlisten);
- 			localFileTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-+//System.out.println("getLocalFileTable");
- 		}
- 		return localFileTable;
- 	}
-@@ -669,6 +894,7 @@
- 			localScrollPane.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
- 			localScrollPane.setName("localFileList");
-+//System.out.println("getLocalScrollPane");
- 		}
- 		return localScrollPane;
- 	}
-@@ -680,10 +906,25 @@
- 	private javax.swing.JList getRemoteFileTable() {
- 		if (remoteFileTable == null) {
- 			remoteList = new Vector(0);
-+			remoteListInfo = new Vector(0);
- 			remoteFileTable = new JList(remoteList);
-+			MouseMotionListener mlisten = new MouseMotionAdapter() {
-+				public void mouseMoved(MouseEvent e) {
-+					int index = remoteFileTable.locationToIndex(e.getPoint());
-+					if (index == lastRemoteIndex) {
-+						return;
-+					} else if (index < 0) {
-+						return;
-+					}
-+					lastRemoteIndex = index;
-+					connectionStatus.setText((String) remoteListInfo.get(index));
-+				}
-+			};
- 			remoteFileTable.addMouseListener(this);
-+			remoteFileTable.addMouseMotionListener(mlisten);
- 			remoteFileTable.setSelectedValue("C:\\", false);
- 			remoteFileTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-+//System.out.println("getRemoteFileTable");
- 			
- 		}
- 		return remoteFileTable;
-@@ -698,6 +939,7 @@
- 			remoteScrollPane = new javax.swing.JScrollPane();
- 			remoteScrollPane.setViewportView(getRemoteFileTable());
- 			remoteScrollPane.setPreferredSize(new java.awt.Dimension(325, 418));
-+//System.out.println("getRemoteScrollPane");
- 		}
- 		return remoteScrollPane;
- 	}
-@@ -716,6 +958,7 @@
- 			remoteLocation.setBackground(new Color(255,255,238));
- 			remoteLocation.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
-+//System.out.println("getRemoteLocation");
- 		}
- 		return remoteLocation;
- 	}
-@@ -732,6 +975,7 @@
- 			localLocation.setBackground( new Color(255,255,238));
- 			localLocation.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
-+//System.out.println("getLocalLocation");
- 		}
- 		return localLocation;
- 	}
-@@ -748,6 +992,7 @@
- 			localStatus.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
- 			localStatus.setEditable(false);
-+//System.out.println("getLocalStatus");
- 		}
- 		return localStatus;
- 	}
-@@ -764,6 +1009,7 @@
- 			remoteStatus.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
- 			remoteStatus.setEditable(false);
-+//System.out.println("getRemoteStatus");
- 		}
- 		return remoteStatus;
- 	}
-@@ -777,9 +1023,10 @@
- 			historyComboBox = new javax.swing.JComboBox();
- 			historyComboBox.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));
--			historyComboBox.insertItemAt(new String("Pulldown to view history ..."),0);
-+			historyComboBox.insertItemAt(new String("Pulldown to view history;   Press Escape to Close/Quit;   Press Ctrl-R to Reset Panel."),0);
- 			historyComboBox.setSelectedIndex(0);
- 			historyComboBox.addActionListener(this);
-+//System.out.println("getHistoryComboBox");
- 		}
- 		return historyComboBox;
- 	}
-@@ -791,6 +1038,7 @@
- 	private javax.swing.JProgressBar getJProgressBar() {
- 		if (jProgressBar == null) {
- 			jProgressBar = new javax.swing.JProgressBar();
-+//System.out.println("getJProgressBar");
- 		}
- 		return jProgressBar;
- 	}
-@@ -806,6 +1054,7 @@
- 			connectionStatus.setBackground(java.awt.Color.lightGray);
- 			connectionStatus.setFont(
- 				new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
-+//System.out.println("getConnectionStatus");
- 		}
- 			connectionStatus.setEditable(false);
- 		return connectionStatus;
-@@ -815,7 +1064,12 @@
- 	 * Implements Action listener.
- 	 */
- 	public void actionPerformed(ActionEvent evt) {
--		System.out.println(evt.getSource());
-+//		System.out.println(evt.getSource());
-+
-+		if (ignore_events) {
-+			System.out.println("ignore_events: " + evt.getSource());
-+			return;
-+		}
- 
- 		if (evt.getSource() == closeButton)
- 		{ // Close Button
-@@ -829,15 +1083,27 @@
- 		{
- 			doReceive();
- 		}
-+// begin runge/x11vnc
-+		else if (evt.getSource() == viewButton)
-+		{
-+			doView();
-+		}
-+// end   runge/x11vnc
- 		else if (evt.getSource() == localDrivesComboBox)
- 		{
- 			changeLocalDrive();
- 		}
- 		else if (evt.getSource() == remoteDrivesComboBox)
- 		{ 
-+//System.out.println("remoteDrivesComboBox");	// runge/x11vnc
- 			changeRemoteDrive();
--			remoteList.clear();
--			remoteFileTable.setListData(remoteList);
-+
-+			// are these really needed? changeRemoteDrive() does them at the end.
-+			if (false) {
-+				remoteList.clear();
-+				remoteListInfo.clear();
-+				remoteFileTable.setListData(remoteList);
-+			}
- 		}
- 		else if (evt.getSource() == localTopButton)
- 		{
-@@ -845,12 +1111,17 @@
- 		}
- 		else if (evt.getSource() == remoteTopButton)
- 		{
-+//System.out.println("remoteTopButton");	// runge/x11vnc
- 		  	changeRemoteDrive();
- 		}
- 		else if(evt.getSource() == deleteButton)
- 		{
- 			doDelete();
- 		}
-+		else if(evt.getSource() == refreshButton)
-+		{
-+			doRefresh();
-+		}
- 		else if(evt.getSource()==newFolderButton)
- 		{
- 			doNewFolder();
-@@ -864,7 +1135,7 @@
- 
- 	private void doNewFolder()
- 	{
--		String name = JOptionPane.showInputDialog(null,"Enter new directory name", "Create New Directory", JOptionPane.QUESTION_MESSAGE);
-+		String name = JOptionPane.showInputDialog(jContentPane,"Enter new directory name", "Create New Directory", JOptionPane.QUESTION_MESSAGE);
- 		if(selectedTable.equals("remote"))
- 		{
- 			name = remoteLocation.getText()+name;
-@@ -880,34 +1151,106 @@
- 			historyComboBox.setSelectedIndex(0);
- 		}
- 	}
--	private void doClose()
-+	public void doClose()
- 	{
-+		if (viewer.ftpOnly) {
-+			viewer.disconnect();
-+			return;
-+		}
- 		try {
- 			this.setVisible(false);
--			viewer.rfb.writeFramebufferUpdateRequest(
--									0,
--									0,
--									viewer.rfb.framebufferWidth,
--									viewer.rfb.framebufferHeight,
--									true);
-+			viewer.rfb.writeFramebufferUpdateRequest(0, 0, viewer.rfb.framebufferWidth,
-+			    viewer.rfb.framebufferHeight, true);
-+
-+			if (false) {
-+				this.dispose();
-+				jContentPane = null;
-+			}
- 		} catch (IOException e) {
- 			// TODO Auto-generated catch block
- 			e.printStackTrace();
- 		}
- 	}
-+	private void unSwing() {
-+		jContentPane = null;
-+		topPanel = null;
-+		topPanelLocal = null;
-+		topPanelRemote = null;
-+		topPanelCenter = null;
-+		statusPanel = null;
-+		remotePanel = null;
-+		localPanel = null;
-+		buttonPanel = null;
-+		sendButton = null;
-+		receiveButton = null;
-+		deleteButton = null;
-+		newFolderButton = null;
-+		stopButton = null;
-+		closeButton = null;
-+		dummyButton = null;
-+		localDrivesComboBox = null;
-+		remoteDrivesComboBox = null;
-+		localMachineLabel = null;
-+		remoteMachineLabel = null;
-+		localTopButton = null;
-+		remoteTopButton = null;
-+		localScrollPane = null;
-+		localFileTable = null;
-+		remoteScrollPane = null;
-+		remoteFileTable = null;
-+		remoteLocation = null;
-+		localLocation = null;
-+		localStatus = null;
-+		remoteStatus = null;
-+		historyComboBox = null;
-+		jProgressBar = null;
-+		connectionStatus = null;
-+		viewButton = null;
-+		refreshButton = null;
-+	}
-+
-+	public void doReset()
-+	{
-+		try {
-+			this.setVisible(false);
-+			this.dispose();
-+			jContentPane = null;
-+		        try {Thread.sleep(500);} catch (InterruptedException e) {}
-+			viewer.ftp_init();
-+		} catch (Exception e) {
-+			// TODO Auto-generated catch block
-+			e.printStackTrace();
-+		}
-+	}
- 
-+	public void doOpen()
-+	{
-+		try {
-+			this.setVisible(true);
-+			if (false) {
-+				this.initialize();
-+			}
-+		} catch (Exception e) {
-+			// TODO Auto-generated catch block
-+			e.printStackTrace();
-+		}
-+	}
- 	private void doDelete()
- 	{
--		System.out.println("Delete Button Pressed");
-+//		System.out.println("Delete Button Pressed");
- 		//Call this method to delete a file at server
- 		if(selectedTable.equals("remote"))
- 		{	
--			String sFileName = ((String) this.remoteFileTable.getSelectedValue());
-+			Object selected = this.remoteFileTable.getSelectedValue();
-+			if (selected == null) {
-+				return;
-+			}
-+			String sFileName = ((String) selected);
- 			
- //			 sf@2004 - Directory can't be deleted
- 			if (sFileName.substring(0, 2).equals(" [") && sFileName.substring((sFileName.length() - 1), sFileName.length()).equals("]"))
- 			{
--				JOptionPane.showMessageDialog(null, (String)"Directory Deletion is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
-+				JOptionPane.showMessageDialog(jContentPane, (String)"Directory Deletion is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
- 				return;
- 			}			
- 			
-@@ -916,7 +1259,7 @@
- 			// sf@2004 - Delete prompt
- 			if (remoteList.contains(sFileName))
- 			{
--				int r = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete the file \n< " + sFileName + " >\n on Remote Machine ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
-+				int r = JOptionPane.showConfirmDialog(jContentPane, "Are you sure you want to delete the file \n< " + sFileName + " >\n on Remote Machine ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
- 				if (r == JOptionPane.NO_OPTION)
- 					return;
- 			}
-@@ -926,18 +1269,22 @@
- 		}
- 		else
- 		{
--			String sFileName = ((String) this.localFileTable.getSelectedValue());
-+			Object selected = this.localFileTable.getSelectedValue();
-+			if (selected == null) {
-+				return;
-+			}
-+			String sFileName = ((String) selected);
- 			
- //			 sf@2004 - Directory can't be deleted
- 			if (sFileName.substring(0, 2).equals(" [") && sFileName.substring((sFileName.length() - 1), sFileName.length()).equals("]"))
- 			{
--				JOptionPane.showMessageDialog(null, (String)"Directory Deletion is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
-+				JOptionPane.showMessageDialog(jContentPane, (String)"Directory Deletion is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
- 				return;
- 			}			
- 			// sf@2004 - Delete prompt
- 			if (localList.contains(sFileName))
- 			{
--				int r = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete the file \n< " + sFileName + " >\n on Local Machine ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
-+				int r = JOptionPane.showConfirmDialog(jContentPane, "Are you sure you want to delete the file \n< " + sFileName + " >\n on Local Machine ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
- 				if (r == JOptionPane.NO_OPTION)
- 					return;
- 			}			
-@@ -952,21 +1299,25 @@
- 
- 	private void doReceive()
- 	{
--		System.out.println("Received Button Pressed");
-+//		System.out.println("Received Button Pressed");
- 
--		String sFileName = ((String) this.remoteFileTable.getSelectedValue());
-+		Object selected = this.remoteFileTable.getSelectedValue();
-+		if (selected == null) {
-+			return;
-+		}
-+		String sFileName = ((String) selected);
- 		
-		// sf@2004 - Directory can't be transferred
- 		if (sFileName.substring(0, 2).equals(" [") && sFileName.substring((sFileName.length() - 1), sFileName.length()).equals("]"))
- 		{
--			JOptionPane.showMessageDialog(null, (String)"Directory Transfer is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
-+			JOptionPane.showMessageDialog(jContentPane, (String)"Directory Transfer is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
- 			return;
- 		}
- 		
- 		// sf@2004 - Overwrite prompt
- 		if (localList.contains(sFileName))
- 		{
--			int r = JOptionPane.showConfirmDialog(null, "The file < " + sFileName + " >\n already exists on Local Machine\n Are you sure you want to overwrite it ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
-+			int r = JOptionPane.showConfirmDialog(jContentPane, "The file < " + sFileName + " >\n already exists on Local Machine\n Are you sure you want to overwrite it ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
- 			if (r == JOptionPane.NO_OPTION)
- 				return;
- 		}
-@@ -979,23 +1330,101 @@
- 		viewer.rfb.requestRemoteFile(remoteFileName,localDestinationPath);
- 	}
- 
-+// begin runge/x11vnc
-+	private void doRefresh()
-+	{
-+		System.out.println("Refreshing Local and Remote.");
-+		refreshLocalLocation();
-+		refreshRemoteLocation();
-+	}
-+
-+	private void doView()
-+	{
-+//		System.out.println("View Button Pressed");
-+
-+		if (selectedTable == null) {
-+			return;
-+		}
-+		if (selectedTable.equals("remote")) {
-+			viewRemote();
-+		} else if (selectedTable.equals("local")) {
-+			viewLocal();
-+		}
-+	}
-+
-+	private File doReceiveTmp()
-+	{
-+
-+		if (remoteFileTable == null) {
-+			return null;
-+		}
-+		Object selected = this.remoteFileTable.getSelectedValue();
-+		if (selected == null) {
-+			return null;
-+		}
-+		String sFileName = ((String) selected);
-+		
-+		if (sFileName == null) {
-+			return null;
-+		}
-+		
-+		// sf@2004 - Directory can't be transferred
-+		if (sFileName.substring(0, 2).equals(" [") && sFileName.substring((sFileName.length() - 1), sFileName.length()).equals("]"))
-+		{
-+			return null;
-+		}
-+		
-+		File tmp = null;
-+		try {
-+			tmp = File.createTempFile("ULTRAFTP", ".txt");
-+		} catch (Exception e) {
-+			return null;
-+		}
-+		
-+		//updateHistory("Downloaded " + localSelection.toString());
-+		String remoteFileName = this.remoteLocation.getText();
-+		remoteFileName+= ((String) this.remoteFileTable.getSelectedValue()).substring(1);
-+		System.out.println("remoteFileName: " + remoteFileName);
-+if (false) {
-+		char[] b = remoteFileName.toCharArray();
-+		for (int n = 0; n < b.length; n++) {
-+			System.out.print(Integer.toHexString(b[n]) + " ");
-+		}
-+		System.out.println("");
-+		for (int n = 0; n < b.length; n++) {
-+			System.out.print(b[n]);
-+		}
-+		System.out.println("");
-+}
-+		
-+		String localDestinationPath = tmp.getAbsolutePath();
-+		viewer.rfb.requestRemoteFile(remoteFileName,localDestinationPath);
-+		System.out.println("ReceiveTmp: " + localDestinationPath);
-+		return tmp;
-+	}
-+// end   runge/x11vnc
-+
- 	private void doSend()
- 	{
--		System.out.println("Send Button Pressed");
-+//		System.out.println("Send Button Pressed");
- 
--		String sFileName = ((String) this.localFileTable.getSelectedValue());
-+		Object selected = this.localFileTable.getSelectedValue();
-+		if (selected == null) {
-+			return;
-+		}
-+		String sFileName = ((String) selected);
- 		
-		// sf@2004 - Directory can't be transferred
- 		if (sFileName.substring(0, 2).equals(" [") && sFileName.substring((sFileName.length() - 1), sFileName.length()).equals("]"))
- 		{
--			JOptionPane.showMessageDialog(null, (String)"Directory Transfer is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
-+			JOptionPane.showMessageDialog(jContentPane, (String)"Directory Transfer is not yet available in this version...", "FileTransfer Info", JOptionPane.INFORMATION_MESSAGE);
- 			return;
- 		}
- 		
- 		// sf@2004 - Overwrite prompt
- 		if (remoteList.contains(sFileName))
- 		{
--			int r = JOptionPane.showConfirmDialog(null, "The file < " + sFileName + " >\n already exists on Remote Machine\n Are you sure you want to overwrite it ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
-+			int r = JOptionPane.showConfirmDialog(jContentPane, "The file < " + sFileName + " >\n already exists on Remote Machine\n Are you sure you want to overwrite it ?", "File Transfer Warning", JOptionPane.YES_NO_OPTION);
- 			if (r == JOptionPane.NO_OPTION)
- 				return;
- 		}
-@@ -1013,6 +1442,7 @@
- 	// 
- 	private void doStop()
- 	{
-+		System.out.println("** Current Transfer Aborted **");
- 		viewer.rfb.fAbort = true;
- 	}
- 	/**
-@@ -1024,6 +1454,14 @@
- 		System.out.println("History: " + message);
- 		historyComboBox.insertItemAt(new String(message), 0);
- 	}
-+
-+	public void receivedRemoteDirectoryName(String str) {
-+		if (doingShortcutDir) {
-+			if (str.length() > 1) {
-+				remoteLocation.setText(str);
-+			}
-+		}
-+	}
- 	
- 	/**
- 	 * This method updates the file table to the current selection of the remoteComboBox
-@@ -1034,11 +1472,44 @@
- 		remoteSelection = null;
- 	
- 		if (!updateDriveList) {
--			String drive =	remoteDrivesComboBox.getSelectedItem().toString().substring(0,1)+ ":\\";
--			viewer.rfb.readServerDirectory(drive);
--			remoteLocation.setText(drive);
-+//System.out.println("changeRemoteDrive-A " + drive);	// begin runge/x11vnc
-+			Object selected = remoteDrivesComboBox.getSelectedItem();
-+			if (selected != null)  {
-+				String instr =	selected.toString();
-+				if (instr != null) {
-+System.out.println("changeRemoteDrive: instr='" + instr + "'");
-+					String drive =	instr.substring(0,1)+ ":\\";
-+					if (instr.startsWith(" [")) {
-+						int idx = instr.lastIndexOf(']'); 
-+						if (idx > 2) {
-+							drive = instr.substring(2, idx);
-+						} else {
-+							drive = instr.substring(2);
-+						}
-+						if (drive.equals("Home")) {
-+							drive = "";
-+						}
-+						drive += "\\";
-+						doingShortcutDir = true;
-+					} else {
-+						doingShortcutDir = false;
-+						drive = saveRemoteHack(drive);
-+					}
-+					gotShortcutDir = false;
-+					viewer.rfb.readServerDirectory(drive);
-+					if (!gotShortcutDir) {
-+						remoteLocation.setText(drive);
-+					}
-+				} else {
-+System.out.println("changeRemoteDrive: instr null");
-+				}
-+			} else {
-+System.out.println("changeRemoteDrive: selection null");
-+			}
-+//System.out.println("changeRemoteDrive-B " + drive);	// end runge/x11vnc
- 		}
- 		remoteList.clear();
-+		remoteListInfo.clear();
- 		remoteFileTable.setListData(remoteList);
- 	}
- 	/**
-@@ -1048,6 +1519,7 @@
- 	private void changeLocalDrive()
- 	{
- 		File currentDrive = new File(localDrivesComboBox.getSelectedItem().toString());
-+System.out.println("changeLocalDrive " + currentDrive.toString());	// runge/x11vnc
- 		if(currentDrive.canRead())
- 		{
- 			localSelection = null;
-@@ -1057,9 +1529,11 @@
- 		else
- 		{
- 			localList.clear();
-+			localListInfo.clear();
- 			localStatus.setText("WARNING: Drive " + localDrivesComboBox.getSelectedItem().toString());
- 			connectionStatus.setText(" > WARNING - Local Drive unavailable (possibly restricted access or media not present)");
- 		}
-+
- 	}
- 	/**
- 	 * Determines which FileTable was double-clicked and updates the table
-@@ -1098,10 +1572,18 @@
- 		selectedTable = "remote";
- 		localFileTable.setBackground(new Color(238, 238, 238));
- 		remoteFileTable.setBackground(new Color(255, 255, 255));
--		String name = (remoteFileTable.getSelectedValue().toString()).substring(1);
-+		Object selected = remoteFileTable.getSelectedValue();
-+		if (selected == null) {
-+			return;
-+		}
-+		String selstr = selected.toString();
-+		if (selstr == null) {
-+			return;
-+		}
-+		String name = selstr.substring(1);
- 		if( !name.substring(0, 2).equals(" ["))	
- 			remoteSelection = remoteLocation.getText() + name.substring(0, name.length());
--		
-+
- 	}
- 
- 	/*
-@@ -1115,10 +1597,38 @@
- 		localFileTable.setBackground(new Color(255, 255, 255));
- 		File currentSelection = new File(currentLocalDirectory, getTrimmedSelection());
- 		
--		if(currentSelection.isFile()) 
-+// begin runge/x11vnc
-+		// localSelection = currentSelection.getAbsoluteFile();
-+		if(currentSelection.isFile()) {
- 			localSelection = currentSelection.getAbsoluteFile();
-+			localCurrentIsDir = false;
-+		} else {
-+			localCurrentIsDir = true;
-+		}
-+// end   runge/x11vnc
- 
- 	}
-+
-+// begin runge/x11vnc
-+	private void viewRemote() {
-+		File tmp = doReceiveTmp();
-+		if (tmp == null) {
-+			return;
-+		}
-+		TextViewer tv = new TextViewer("Remote: " + remoteSelection, tmp, true);
-+	}
-+	private void viewLocal() {
-+		if (localSelection == null) {
-+			return;
-+		}
-+		if (localCurrentIsDir) {
-+			return;
-+		}
-+		File loc = new File(localSelection.toString());
-+		TextViewer tv = new TextViewer("Local: " + localSelection.toString(), loc, false);
-+	}
-+// end runge/x11vnc
-+
- 	/**
- 	 * Updates the Remote File Table based on selection.  Called from mouseClicked handler
- 	 */
-@@ -1126,20 +1636,29 @@
- 		String name = null;
- 		String action = null;
- 		String drive = null;
--		name = (remoteFileTable.getSelectedValue().toString()).substring(1);
-+		Object selected = remoteFileTable.getSelectedValue();
-+		if (selected == null) {
-+			return;
-+		}
-+		String sname = selected.toString();
-+		if (sname == null) {
-+			return;
-+		}
-+		name = sname.substring(1);
- 
- 		if (name.equals("[..]"))
- 		{
- 			action = "up";
- 			remoteSelection = null;
- 			drive = remoteLocation.getText().substring(0, remoteLocation.getText().length() - 1);
--			// JOptionPane.showMessageDialog(null, (String)drive, "FileTransfer DEBUG", JOptionPane.INFORMATION_MESSAGE);
-+			// JOptionPane.showMessageDialog(jContentPane, (String)drive, "FileTransfer DEBUG", JOptionPane.INFORMATION_MESSAGE);
- 			int index = drive.lastIndexOf("\\");
- 			drive = drive.substring(0, index + 1);
- 
- 			remoteLocation.setText(drive);
- 			viewer.rfb.readServerDirectory(drive);
- 			remoteList.clear();
-+			remoteListInfo.clear();
- 			remoteFileTable.setListData(remoteList);	
- 		}
- 		else if (!name.substring(0, 2).equals(" [") && !name.substring((name.length() - 1), name.length()).equals("]"))
-@@ -1149,6 +1668,7 @@
- 			remoteSelection = remoteLocation.getText() + name.substring(0, name.length());
- 			drive = remoteLocation.getText();
- 			// ??
-+			viewRemote();	// runge/x11vnc
- 		}
- 		else
- 		{ 
-@@ -1159,10 +1679,12 @@
- 			remoteLocation.setText(drive);
- 			viewer.rfb.readServerDirectory(drive);
- 			remoteList.clear();
-+			remoteListInfo.clear();
- 			remoteFileTable.setListData(remoteList);	
- 		}	
- 		//remoteLocation.setText(drive);	
- 	}
-+
- 	/**
- 	 * Updates the Local File Table based on selection. Called from MouseClicked handler
- 	 */
-@@ -1188,6 +1710,7 @@
- 		else if (currentSelection.isFile())
- 		{
- 			localSelection = currentSelection.getAbsoluteFile();
-+			viewLocal();	// runge/x11vnc
- 		}
- 		else if (currentSelection.isDirectory())
- 		{
-@@ -1201,13 +1724,22 @@
- 	 * 
- 	 */
- 	private String getTrimmedSelection(){
--		String currentSelection = (localFileTable.getSelectedValue().toString()).substring(1);
--				if(currentSelection.substring(0,1).equals("[") &&
--				currentSelection.substring(currentSelection.length()-1,currentSelection.length()).equals("]")){
--				return currentSelection.substring(1,currentSelection.length()-1);
--				} else {
--					return currentSelection;
--				}
-+		String currentSelection = "";
-+		Object selected = localFileTable.getSelectedValue();
-+		if (selected == null) {
-+			return currentSelection;
-+		}
-+		String selstr = selected.toString();
-+		if (selstr == null) {
-+			return currentSelection;
-+		}
-+		currentSelection = selstr.substring(1);
-+		if(currentSelection.substring(0,1).equals("[") &&
-+			currentSelection.substring(currentSelection.length()-1,currentSelection.length()).equals("]")){
-+			return currentSelection.substring(1,currentSelection.length()-1);
-+		} else {
-+			return currentSelection;
-+		}
- 	}
- 
- 	/*
-@@ -1241,36 +1773,148 @@
- 	 	return null;
- 	}
- 	
-+	String timeStr(long t) {
-+		Date date = new Date(t);
-+		return date.toString();
-+	}
-+	String dotPast(double f, int n) {
-+		String fs = "" + f;
-+		int i = fs.lastIndexOf(".") + n;
-+		if (i >= 0) {
-+			int len = fs.length();
-+			if (i >= len) {
-+				i = len-1;
-+			}
-+			fs = fs.substring(0, i);
-+		}
-+		return fs;
-+	}
-+	String sizeStr(int s) {
-+		if (s < 0) {
-+			return s + "? B";
-+		} else if (s < 1024) {
-+			return s + " B";
-+		} else if (s < 1024 * 1024) {
-+			double k = s / 1024.0;
-+			String ks = dotPast(k, 3);
-+			
-+			return s + " (" + ks + " KB)";
-+		} else {
-+			double m = s / (1024.0*1024.0);
-+			String ms = dotPast(m, 3);
-+			return s + " (" + ms + " MB)";
-+		}
-+	}
-+
-+	int max_char(String text) {
-+		int maxc = 0;
-+		char chars[] = text.toCharArray();
-+		for (int n = 0; n < chars.length; n++) {
-+			if ((int) chars[n] > maxc) {
-+				maxc = (int) chars[n];
-+			}
-+		}
-+		return maxc;
-+	}
- 
- 	/*
- 	 * Navigates the local file structure up or down one directory
- 	 */
- 	public void changeLocalDirectory(File dir)
- 	{
--			currentLocalDirectory = dir;	// Updates Global
-+			dir = saveLocalHack(dir);	// runge/x11vnc
-+
-+			if (dir == null) {
-+				connectionStatus.setText("Error changing local directory.");
-+				historyComboBox.insertItemAt(new String("> Error changing local directory."), 0);
-+				historyComboBox.setSelectedIndex(0);
-+				return;
-+			}
-+
- 			File allFiles[] = dir.listFiles();	// Reads files
- 			String[] contents = dir.list();
- 
-+			if (contents == null || allFiles == null) {
-+				connectionStatus.setText("Error changing local directory.");
-+				historyComboBox.insertItemAt(new String("> Error changing local directory."), 0);
-+				historyComboBox.setSelectedIndex(0);
-+				return;
-+			}
-+
-+			currentLocalDirectory = dir;	// Updates Global
-+// begin runge/x11vnc
-+System.out.println("changeLocalDirectory: " + dir.toString());
-+			if (contents != null) {
-+				java.util.Arrays.sort(contents, String.CASE_INSENSITIVE_ORDER);
-+				for (int i = 0; i < contents.length; i++) {
-+					allFiles[i] = new File(dir, contents[i]);
-+				}
-+			} else {
-+				return;
-+			}
-+// end runge/x11vnc
-+
- 			localList.clear();
-+			localListInfo.clear();
- 			localList.addElement(" [..]");
-+			localListInfo.addElement(" [..]");
-+
-+			ArrayList DirInfo = new ArrayList();
-+			ArrayList FilInfo = new ArrayList();
-+
-+			Charset charset = Charset.forName("ISO-8859-1");
-+			CharsetDecoder decoder = charset.newDecoder();
-+			CharsetEncoder encoder = charset.newEncoder();
- 			
- 			// Populate the Lists
- 			for (int i = 0; i < contents.length; i++)
- 			{
--				if (allFiles[i].isDirectory())
-+				String f1 = contents[i];
-+
-+if (false) {
-+	
-+System.out.println("max_char: " + max_char(f1) + " "  + f1);
-+				if (max_char(f1) > 255) {
-+					try {
-+System.out.println("bbuf1");
-+						ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(f1.toCharArray()));
-+System.out.println("bbuf2");
-+						CharBuffer cbuf = decoder.decode(bbuf);
-+System.out.println("bbuf3");
-+						f1 = cbuf.toString(); 
-+System.out.println("did bbuf: " + f1);
-+					} catch (Exception e) {
-+						;
-+					}
-+				}
-+}
-+				
-+				String f2 = f1;
-+				if (f2.length() < 24) {
-+					for (int ik = f2.length(); ik < 24; ik++) {
-+						f2 = f2 + " ";
-+					}
-+				}
-+				String s = f2 + "    \tLastmod: " + timeStr(allFiles[i].lastModified()) + "    \t\tSize: " + sizeStr((int) allFiles[i].length()); 
-+				if (allFiles[i].isDirectory()) {
- 					// localList.addElement("[" + contents[i] + "]");
--					DirsList.add(" [" + contents[i] + "]"); // sf@2004
--				else
--				{
-+					DirsList.add(" [" + f1 + "]"); // sf@2004
-+					DirInfo.add(s);
-+				} else {
- 					// localList.addElement(contents[i]);
--					FilesList.add(" " + contents[i]); // sf@2004
-+					FilesList.add(" " + f1); // sf@2004
-+					FilInfo.add(s);
- 				}
- 			}
- 			// sf@2004
--			for (int i = 0; i < DirsList.size(); i++) 
-+			for (int i = 0; i < DirsList.size(); i++) {
- 				localList.addElement(DirsList.get(i));
--			for (int i = 0; i < FilesList.size(); i++) 
-+				localListInfo.addElement(DirInfo.get(i));
-+			}
-+			for (int i = 0; i < FilesList.size(); i++) {
- 				localList.addElement(FilesList.get(i));
-+				localListInfo.addElement(FilInfo.get(i));
-+			}
- 			
- 			FilesList.clear();
- 			DirsList.clear();
-@@ -1296,3 +1940,147 @@
- 	}
- 
- } //  @jve:visual-info  decl-index=0 visual-constraint="10,10"
-+
-+// begin runge/x11vnc
-+class TextViewer extends JFrame implements ActionListener {
-+
-+	JTextArea textArea = new JTextArea(35, 80);
-+	File file = null;
-+	JButton refreshButton;
-+	JButton dismissButton;
-+	Timer tim = null;
-+	int rcnt = 0;
-+	int tms = 250;
-+	boolean delete_it = false;
-+	TextViewer me;
-+
-+	public TextViewer(String s, File f, boolean d) {
-+
-+		delete_it = d;
-+		file = f;
-+		me = this;
-+
-+		JScrollPane scrollPane = new JScrollPane(textArea,
-+		    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
-+		    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
-+
-+		textArea.setEditable(false);
-+		textArea.setFont(new Font("Monospaced", Font.PLAIN, 12));
-+
-+		KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, InputEvent.SHIFT_MASK);
-+		AbstractAction escapeAction = new AbstractAction() {
-+			public void actionPerformed(ActionEvent actionEvent) {
-+				cleanse();
-+				me.dispose();
-+			}
-+		};
-+		textArea.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(stroke, "escapeAction");
-+		textArea.getInputMap().put(stroke, "escapeAction");
-+		textArea.getActionMap().put("escapeAction", escapeAction);
-+
-+		refreshButton = new JButton();
-+		refreshButton.setText("Reload");
-+		refreshButton.setName("refreshButton");
-+		refreshButton.addActionListener(this);
-+
-+		dismissButton = new JButton();
-+		dismissButton.setText("Dismiss");
-+		dismissButton.setName("dismissButton");
-+		dismissButton.addActionListener(this);
-+
-+		JPanel buttons = new JPanel();
-+		buttons.setLayout(new BorderLayout());
-+		buttons.add(refreshButton, BorderLayout.WEST);
-+		buttons.add(dismissButton, BorderLayout.EAST);
-+
-+		JPanel content = new JPanel();
-+		content.setLayout(new BorderLayout());
-+		content.add(scrollPane, BorderLayout.CENTER);
-+		content.add(buttons, BorderLayout.SOUTH);
-+
-+		ActionListener tsk = new ActionListener() {
-+			public void actionPerformed(ActionEvent evt) {
-+				// System.out.println("tsk");
-+				refresh();
-+			}
-+		};
-+		tim = new Timer(tms, tsk);
-+		tim.start();
-+
-+		this.setContentPane(content);
-+		this.setTitle("TextViewer - " + s);
-+		this.pack();
-+		this.setVisible(true);
-+	}
-+
-+	private void refresh() {
-+
-+		rcnt++;
-+		if (rcnt * tms > 3000 && tim != null) {
-+			tim.stop();
-+			tim = null;
-+		}
-+		BufferedReader input = null;
-+		StringBuffer contents = new StringBuffer();
-+		try {
-+			if (input == null) {
-+				input = new BufferedReader(new FileReader(file));
-+			}
-+			String line = null;
-+			int i = 0;
-+			while (( line = input.readLine()) != null) {
-+				if (i == 0) {
-+					// System.out.println("read");
-+				}
-+				i++;
-+				contents.append(line);
-+				contents.append(System.getProperty("line.separator"));
-+			}
-+		} catch (Exception e) {
-+			;
-+		} finally {
-+			try {
-+				if (input != null) {
-+					input.close();
-+					input = null;
-+				}
-+			} catch (Exception e) {
-+				;
-+			}
-+		}
-+
-+		textArea.setText(contents.toString());
-+		textArea.setCaretPosition(0);
-+	}
-+
-+	public void actionPerformed(ActionEvent evt) {
-+
-+		if (evt.getSource() == refreshButton) {
-+			refresh();
-+		}
-+		if (evt.getSource() == dismissButton) {
-+			cleanse();
-+			this.dispose();
-+		}
-+	}
-+
-+	private void cleanse() {
-+		if (delete_it && file != null) {
-+			try {
-+				file.delete();
-+				file = null;
-+			} catch (Exception e) {
-+				;
-+			}
-+		}
-+	}
-+
-+	protected void finalize() throws Throwable {
-+		try {
-+			cleanse();
-+		} finally {
-+			super.finalize();
-+		}
-+	}
-+}
-+// end runge/x11vnc
-diff -Naur JavaViewer.orig/Makefile JavaViewer/Makefile
---- JavaViewer.orig/Makefile	2006-05-29 09:06:32.000000000 -0400
-+++ JavaViewer/Makefile	2010-05-18 20:53:32.000000000 -0400
-@@ -4,6 +4,7 @@
- 
- CP = cp
- JC = javac
-+JC_ARGS = -target 1.4 -source 1.4
- JAR = jar
- ARCHIVE = VncViewer.jar
- PAGES = index.vnc shared.vnc noshared.vnc hextile.vnc zlib.vnc tight.vnc
-@@ -20,7 +21,7 @@
- all: $(CLASSES) $(ARCHIVE)
- 
- $(CLASSES): $(SOURCES)
--	$(JC) -O $(SOURCES)
-+	$(JC) $(JC_ARGS) -O $(SOURCES)
- 
- $(ARCHIVE): $(CLASSES)
- 	$(JAR) cf $(ARCHIVE) $(CLASSES)
-diff -Naur JavaViewer.orig/OptionsFrame.java JavaViewer/OptionsFrame.java
---- JavaViewer.orig/OptionsFrame.java	2005-11-21 18:50:16.000000000 -0500
-+++ JavaViewer/OptionsFrame.java	2007-05-13 22:18:30.000000000 -0400
-@@ -144,7 +144,10 @@
-     choices[jpegQualityIndex].select("6");
-     choices[cursorUpdatesIndex].select("Enable");
-     choices[useCopyRectIndex].select("Yes");
--    choices[eightBitColorsIndex].select("64");
-+// begin runge/x11vnc
-+//    choices[eightBitColorsIndex].select("64");
-+    choices[eightBitColorsIndex].select("Full");
-+// end runge/x11vnc
-     choices[mouseButtonIndex].select("Normal");
-     choices[viewOnlyIndex].select("No");
-     choices[shareDesktopIndex].select("Yes");
-diff -Naur JavaViewer.orig/RfbProto.java JavaViewer/RfbProto.java
---- JavaViewer.orig/RfbProto.java	2006-05-24 15:14:40.000000000 -0400
-+++ JavaViewer/RfbProto.java	2010-11-30 22:13:58.000000000 -0500
-@@ -31,6 +31,7 @@
- import java.net.Socket;
- import java.util.*;
- import java.util.zip.*;
-+import java.text.DateFormat;
- 
- 
- class RfbProto {
-@@ -86,8 +87,11 @@
- 
- 	// sf@2004 - FileTransfer part
- 	ArrayList remoteDirsList;
-+	ArrayList remoteDirsListInfo;
- 	ArrayList remoteFilesList;
-+	ArrayList remoteFilesListInfo;
- 	ArrayList a;
-+	ArrayList b;
- 	boolean fFTInit = true; // sf@2004
- 	boolean fFTAllowed = true;
- 	boolean fAbort = false;
-@@ -199,6 +203,10 @@
- 	// playback.
- 	int numUpdatesInSession;
- 
-+// begin runge/x11vnc
-+	int readServerDriveListCnt = -1;
-+	long readServerDriveListTime = 0;
-+// end   runge/x11vnc
- 	//
- 	// Constructor. Make TCP connection to RFB server.
- 	//
-@@ -207,7 +215,27 @@
- 		viewer = v;
- 		host = h;
- 		port = p;
--		sock = new Socket(host, port);
-+// begin runge/x11vnc
-+//		sock = new Socket(host, port);
-+    if (! viewer.disableSSL) {
-+       System.out.println("new SSLSocketToMe");
-+       SSLSocketToMe ssl;
-+       try {
-+               ssl = new SSLSocketToMe(host, port, v);
-+       } catch (Exception e) {
-+               throw new IOException(e.getMessage());
-+       }
-+
-+       try {
-+               sock = ssl.connectSock();
-+       } catch (Exception es) {
-+               throw new IOException(es.getMessage());
-+       }
-+    } else {
-+       sock = new Socket(host, port);
-+    }
-+// end runge/x11vnc
-+
- 		is =
- 			new DataInputStream(
- 				new BufferedInputStream(sock.getInputStream(), 16384));
-@@ -215,9 +243,12 @@
- 		osw = new OutputStreamWriter(sock.getOutputStream());
- 		inDirectory2 = false;
- 		a = new ArrayList();
-+		b = new ArrayList();
- 		// sf@2004
- 		remoteDirsList = new ArrayList();
-+		remoteDirsListInfo = new ArrayList();
- 		remoteFilesList = new ArrayList();
-+		remoteFilesListInfo = new ArrayList();
- 	
- 		sendFileSource = "";
- 	}
-@@ -420,7 +451,13 @@
- 	//
- 
- 	int readServerMessageType() throws IOException {
--		int msgType = is.readUnsignedByte();
-+		int msgType;
-+		try {
-+			msgType = is.readUnsignedByte();
-+		} catch (Exception e) {
-+			viewer.disconnect();
-+			return -1;
-+		}
- 
- 		// If the session is being recorded:
- 		if (rec != null) {
-@@ -600,6 +637,7 @@
- 		contentParamT = is.readUnsignedByte();
- 		contentParamT = contentParamT << 8;
- 		contentParam = contentParam | contentParamT;
-+//System.out.println("FTM: contentType " + contentType + " contentParam " + contentParam);
- 		if (contentType == rfbRDrivesList || contentType == rfbDirPacket)
- 		{
- 			readDriveOrDirectory(contentParam);
-@@ -610,7 +648,7 @@
- 		}
- 		else if (contentType == rfbFilePacket)
- 		{
--				receiveFileChunk();
-+			receiveFileChunk();
- 		}
- 		else if (contentType == rfbEndOfFile)
- 		{
-@@ -618,6 +656,10 @@
- 		}
- 		else if (contentType == rfbAbortFileTransfer)
- 		{
-+			System.out.println("rfbAbortFileTransfer: fFileReceptionRunning="
-+			    + fFileReceptionRunning + " fAbort="
-+			    + fAbort + " fFileReceptionError="
-+			    + fFileReceptionError);
- 			if (fFileReceptionRunning)
- 			{
- 				endOfReceiveFile(false); // Error
-@@ -626,6 +668,11 @@
- 			{
- 				// sf@2004 - Todo: Add TestPermission 
- 				// System.out.println("File Transfer Aborted!");
-+
-+				// runge: seems like we must at least read the remaining
-+				// 8 bytes of the header, right?
-+				int size = is.readInt();
-+				int length = is.readInt();
- 			}
- 			
- 		}
-@@ -645,6 +692,7 @@
- 		{
- 			System.out.println("ContentType: " + contentType);
- 		}
-+//System.out.println("FTM: done");
- 	}
- 
- 	//Refactored from readRfbFileTransferMsg()
-@@ -662,6 +710,7 @@
- 
- 	//Refactored from readRfbFileTransferMsg()
- 	public void readDriveOrDirectory(int contentParam) throws IOException {
-+//System.out.println("RDOD: " + contentParam + " " + inDirectory2);
- 		if (contentParam == rfbADrivesList)
- 		{
- 			readFTPMsgDriveList();
-@@ -688,13 +737,21 @@
- 
- 	// Internally used. Write an Rfb message to the server
- 	void writeRfbFileTransferMsg(
--								int contentType,
--								int contentParam,
--								long size, // 0 : compression not supported - 1 : compression supported
--								long length,
--								String text) throws IOException
-+		int contentType,
-+		int contentParam,
-+		long size, // 0 : compression not supported - 1 : compression supported
-+		long length,
-+		String text) throws IOException
- 	{
- 		byte b[] = new byte[12];
-+		byte byteArray[];
-+
-+		if (viewer.dsmActive) {
-+			// need to send the rfbFileTransfer msg type twice for the plugin...
-+			byte b2[] = new byte[1];
-+			b2[0] = (byte) rfbFileTransfer;
-+			os.write(b2);
-+		}
- 
- 		b[0] = (byte) rfbFileTransfer;
- 		b[1] = (byte) contentType;
-@@ -702,7 +759,7 @@
- 
- 		byte by = 0;
- 		long c = 0;
--		length++;
-+
- 		c = size & 0xFF000000;
- 		by = (byte) (c >>> 24);
- 		b[4] = by;
-@@ -716,6 +773,32 @@
- 		by = (byte) c;
- 		b[7] = by;
- 
-+		if (text != null) {
-+			byte byteArray0[] = text.getBytes();
-+			int maxc = max_char(text);
-+			if (maxc > 255) {
-+				System.out.println("writeRfbFileTransferMsg: using getBytes(\"UTF-8\")");
-+				byteArray0 = text.getBytes("UTF-8");
-+			} else if (maxc > 127) {
-+				System.out.println("writeRfbFileTransferMsg: using getBytes(\"ISO-8859-1\")");
-+				byteArray0 = text.getBytes("ISO-8859-1");
-+			}
-+			byteArray = new byte[byteArray0.length + 1];
-+			for (int i = 0; i < byteArray0.length; i++) {
-+				byteArray[i] = byteArray0[i];
-+			}
-+			byteArray[byteArray.length - 1] = 0;
-+System.out.println("writeRfbFileTransferMsg: length: " + length + " -> byteArray.length: " + byteArray.length);
-+
-+			// will equal length for ascii, ISO-8859-1, more for UTF-8
-+			length = byteArray.length;
-+
-+			//length++;	// used to not include null byte at end.
-+		} else {
-+			String moo = "moo";
-+			byteArray = moo.getBytes();
-+		}
-+
- 		c = length & 0xFF000000;
- 		by = (byte) (c >>> 24);
- 		b[8] = by;
-@@ -729,29 +812,91 @@
- 		by = (byte) c;
- 		b[11] = by;
- 		os.write(b);
-+
-+//System.out.println("size: " + size + " length: " + length + " text: " + text);
- 		
- 
- 		if (text != null)
- 		{
--			byte byteArray[] = text.getBytes();
--			byte byteArray2[] = new byte[byteArray.length + 1];
--			for (int i = 0; i < byteArray.length; i++) {
--				byteArray2[i] = byteArray[i];
-+			os.write(byteArray);
-+		}
-+	}
-+
-+	int max_char(String text) {
-+		int maxc = 0;
-+		char chars[] = text.toCharArray();
-+		for (int n = 0; n < chars.length; n++) {
-+			if ((int) chars[n] > maxc) {
-+				maxc = (int) chars[n];
- 			}
--			byteArray2[byteArray2.length - 1] = 0;
--			os.write(byteArray2);
- 		}
--		
-+		return maxc;
- 	}
- 
-+	String guess_encoding(char[] chars) {
-+		boolean saw_high_char = false;
-+
-+		for (int i = 0; i < chars.length; i++) {
-+			if (chars[i] == '\0') {
-+				break;
-+			}
-+			if (chars[i] >= 128) {
-+				saw_high_char = true;
-+				break;
-+			}
-+		}
-+		if (!saw_high_char) {
-+			return "ASCII";
-+		}
-+		char prev = 1;
-+		boolean valid_utf8 = true;
-+		int n = 0;
-+		for (int i = 0; i < chars.length; i++) {
-+			if (chars[i] == '\0') {
-+				break;
-+			}
-+			char c = chars[i];
-+			if (prev < 128 && c >= 128) {
-+				if (c >> 5 == 0x6) {
-+					n = 1;
-+				} else if (c >> 4 == 0xe) {
-+					n = 2;
-+				} else if (c >> 3 == 0x1e) {
-+					n = 3;
-+				} else if (c >> 2 == 0x3e) {
-+					n = 4;
-+				} else {
-+					valid_utf8 = false;
-+					break;
-+				}
-+			} else {
-+				if (n > 0) {
-+					if (c < 128) {
-+						valid_utf8 = false;
-+						break;
-+					}
-+					n--;
-+				}
-+			}
-+
-+			prev = c;
-+		}
-+		if (valid_utf8) {
-+			return "UTF-8";
-+		} else {
-+			return "ISO-8859-1";
-+		}
-+	}
-+
-+
- 	//Internally used. Write an rfb message to the server for sending files ONLY 
- 	int writeRfbFileTransferMsgForSendFile(
--											int contentType,
--											int contentParam,
--											long size,
--											long length,
--											String source
--											) throws IOException
-+		int contentType,
-+		int contentParam,
-+		long size,
-+		long length,
-+		String source
-+		) throws IOException
- 	{
- 		File f = new File(source);
- 		fis = new FileInputStream(f);
-@@ -768,50 +913,47 @@
- 	
- 		while (bytesRead!=-1)
- 		{
--				counter += bytesRead;
--				myDeflater.setInput(byteBuffer, 0, bytesRead);
--				myDeflater.finish();
--				compressedSize = myDeflater.deflate(CompressionBuffer);
--				myDeflater.reset();
--				// If the compressed data is larger than the original one, we're dealing with
--				// already compressed data
--				if (compressedSize > bytesRead)
--					fCompress = false;
--				this.writeRfbFileTransferMsg(
--											contentType,
--											contentParam,
--											(fCompress ? 1 : 0), 
--											(fCompress ? compressedSize-1 : bytesRead-1),
--											null
--											);
--				// Todo: Test write error !
--				os.write(
--						fCompress ? CompressionBuffer : byteBuffer,
--						0,
--						fCompress ? compressedSize : bytesRead
--						);
--				
--				// Todo: test read error !
--				bytesRead = fis.read(byteBuffer);
--				
--				// viewer.ftp.connectionStatus.setText("Sent: "+ counter + " bytes of "+ f.length() + " bytes");
--				viewer.ftp.jProgressBar.setValue((int)((counter * 100) / f.length()));
--				viewer.ftp.connectionStatus.setText(">>> Sending File: " + source + " - Size: " + f.length() + " bytes - Progress: " + ((counter * 100) / f.length()) + "%");
--				
--				if (fAbort == true)
--				{
--					fAbort = false;
--					fError = true;
--					break;
--				}
--				try
--				{
--			        Thread.sleep(5);
--			    }
--				catch(InterruptedException e)
--				{
--			        System.err.println("Interrupted");
--			    }				
-+			counter += bytesRead;
-+			myDeflater.setInput(byteBuffer, 0, bytesRead);
-+			myDeflater.finish();
-+			compressedSize = myDeflater.deflate(CompressionBuffer);
-+			myDeflater.reset();
-+			// If the compressed data is larger than the original one, we're dealing with
-+			// already compressed data
-+			if (compressedSize > bytesRead)
-+				fCompress = false;
-+			this.writeRfbFileTransferMsg(
-+				contentType,
-+				contentParam,
-+				(fCompress ? 1 : 0), 
-+// RUNGE				(fCompress ? compressedSize-1 : bytesRead-1),
-+				(fCompress ? compressedSize : bytesRead),
-+				null
-+			);
-+			// Todo: Test write error !
-+			os.write(fCompress ? CompressionBuffer : byteBuffer, 0, fCompress ? compressedSize : bytesRead);
-+			
-+			// Todo: test read error !
-+			bytesRead = fis.read(byteBuffer);
-+			
-+			// viewer.ftp.connectionStatus.setText("Sent: "+ counter + " bytes of "+ f.length() + " bytes");
-+			viewer.ftp.jProgressBar.setValue((int)((counter * 100) / f.length()));
-+			viewer.ftp.connectionStatus.setText(">>> Sending File: " + source + " - Size: " + f.length() + " bytes - Progress: " + ((counter * 100) / f.length()) + "%");
-+			
-+			if (fAbort == true)
-+			{
-+				fAbort = false;
-+				fError = true;
-+				break;
-+			}
-+			try
-+			{
-+		        Thread.sleep(5);
-+		    }
-+			catch(InterruptedException e)
-+			{
-+		        System.err.println("Interrupted");
-+		    }				
- 		}
- 		
- 		writeRfbFileTransferMsg(fError ? rfbAbortFileTransfer : rfbEndOfFile, 0, 0, 0, null);
-@@ -831,24 +973,30 @@
- 			{
- 				System.out.print((char) is.readUnsignedByte());
- 			}
-+			System.out.println("");
-+
-+			if (size == rfbRErrorCmd || size == -1) {
-+				viewer.ftp.enableButtons();
-+				viewer.ftp.connectionStatus.setText("Remote file not available for writing.");
-+				viewer.ftp.historyComboBox.insertItemAt(new String(" > Error - Remote file not available for writing."), 0);
-+				viewer.ftp.historyComboBox.setSelectedIndex(0);
-+				return;
-+			}
- 			
--			int ret = writeRfbFileTransferMsgForSendFile(
--															rfbFilePacket,
--															0,
--															0,
--															0,
--															sendFileSource);
-+			int ret = writeRfbFileTransferMsgForSendFile(rfbFilePacket, 0, 0, 0, sendFileSource);
- 	
- 			viewer.ftp.refreshRemoteLocation();
- 			if (ret != 1)
- 			{
- 				viewer.ftp.connectionStatus.setText(" > Error - File NOT sent");
--				viewer.ftp.historyComboBox.insertItemAt(new String(" > Error - File: <" + sendFileSource) + "> was not correctly sent (aborted by user or error)",0);
-+				viewer.ftp.historyComboBox.insertItemAt(new String(" > Error - File: <" + sendFileSource)
-+				    + "> was not correctly sent (aborted or error). Data may still be buffered/in transit. Wait for remote listing...",0);
- 			}
- 			else
- 			{
- 				viewer.ftp.connectionStatus.setText(" > File sent");
--				viewer.ftp.historyComboBox.insertItemAt(new String(" > File: <" + sendFileSource) + "> was sent to Remote Machine",0);
-+				viewer.ftp.historyComboBox.insertItemAt(new String(" > File: <" + sendFileSource)
-+				    + "> was sent to Remote Machine. Note: data may still be buffered/in transit. Wait for remote listing...",0);
- 			}
- 			viewer.ftp.historyComboBox.setSelectedIndex(0);
- 			viewer.ftp.enableButtons();
-@@ -907,7 +1055,7 @@
- 	//Handles acknowledgement that the file has been deleted on the server
- 	void deleteRemoteFileFeedback() throws IOException
- 	{
--		is.readInt();
-+		int ret = is.readInt();
- 		int length = is.readInt();
- 		String f = "";
- 		for (int i = 0; i < length; i++)
-@@ -916,7 +1064,11 @@
- 		}
- 		
- 		viewer.ftp.refreshRemoteLocation();	
--		viewer.ftp.historyComboBox.insertItemAt(new String(" > Deleted File On Remote Machine: " + f.substring(0, f.length()-1)),0);
-+		if (ret == -1) {
-+			viewer.ftp.historyComboBox.insertItemAt(new String(" > ERROR Could not Delete File On Remote Machine: "),0);
-+		} else {
-+			viewer.ftp.historyComboBox.insertItemAt(new String(" > Deleted File On Remote Machine: " + f.substring(0, f.length()-1)),0);
-+		}
- 		viewer.ftp.historyComboBox.setSelectedIndex(0);
- 	}
- 
-@@ -926,12 +1078,7 @@
- 		try
- 		{
- 			String temp = text;
--			writeRfbFileTransferMsg(
--									rfbCommand,
--									rfbCFileDelete,
--									0,
--									temp.length(),
--									temp);
-+			writeRfbFileTransferMsg(rfbCommand, rfbCFileDelete, 0, temp.length(), temp);
- 		}
- 		catch (IOException e)
- 		{
-@@ -943,7 +1090,7 @@
- 	// Handles acknowledgement that the directory has been created on the server
- 	void createRemoteDirectoryFeedback() throws IOException
- 	{
--		is.readInt();
-+		int ret = is.readInt();
- 		int length = is.readInt();
- 		String f="";
- 		for (int i = 0; i < length; i++)
-@@ -951,7 +1098,11 @@
- 			f += (char)is.readUnsignedByte();
- 		}
- 		viewer.ftp.refreshRemoteLocation();	
--		viewer.ftp.historyComboBox.insertItemAt(new String(" > Created Directory on Remote Machine: " + f.substring(0, f.length()-1)),0);
-+		if (ret == -1) {
-+			viewer.ftp.historyComboBox.insertItemAt(new String(" > ERROR Could not Create Directory on Remote Machine."),0);
-+		} else {
-+			viewer.ftp.historyComboBox.insertItemAt(new String(" > Created Directory on Remote Machine: " + f.substring(0, f.length()-1)),0);
-+		}
- 		viewer.ftp.historyComboBox.setSelectedIndex(0);
- 	}
- 
-@@ -961,12 +1112,7 @@
- 		try
- 		{
- 			String temp = text;
--			writeRfbFileTransferMsg(
--				rfbCommand,
--				rfbCDirCreate,
--				0,
--				temp.length(),
--				temp);
-+			writeRfbFileTransferMsg(rfbCommand, rfbCDirCreate, 0, temp.length(), temp);
- 		}
- 		catch (IOException e)
- 		{
-@@ -979,15 +1125,13 @@
- 	{
- 		try
- 		{
-+//System.out.println("requestRemoteFile text: " + text);
-+//System.out.println("requestRemoteFile leng: " + text.length());
- 			String temp = text;
- 			receivePath = localPath;
- 					
--			writeRfbFileTransferMsg(
--									rfbFileTransferRequest,
--									0,
--									1, // 0 : compression not supported - 1 : compression supported
--									temp.length(),
--									temp);
-+			// 0 : compression not supported - 1 : compression supported
-+			writeRfbFileTransferMsg(rfbFileTransferRequest, 0, 1, temp.length(), temp);
- 		}
- 		catch (IOException e)
- 		{
-@@ -1004,6 +1148,9 @@
- 		viewer.ftp.disableButtons();
- 		int size = is.readInt();
- 		int length = is.readInt();
-+
-+//System.out.println("receiveFileHeader size: " + size);
-+//System.out.println("receiveFileHeader leng: " + length);
- 		
- 		String tempName = "";
- 		for (int i = 0; i < length; i++)
-@@ -1011,6 +1158,15 @@
- 			tempName += (char) is.readUnsignedByte();
- 		}
- 
-+		if (size == rfbRErrorCmd || size == -1) {
-+			fFileReceptionRunning = false;
-+			viewer.ftp.enableButtons();
-+			viewer.ftp.connectionStatus.setText("Remote file not available for reading.");
-+			viewer.ftp.historyComboBox.insertItemAt(new String(" > Error - Remote file not available for reading."), 0);
-+			viewer.ftp.historyComboBox.setSelectedIndex(0);
-+			return;
-+		}
-+
- 		// sf@2004 - Read the high part of file size (not yet in rfbFileTransferMsg for 
- 		// backward compatibility reasons...)
- 		int sizeH = is.readInt();
-@@ -1021,7 +1177,16 @@
- 		fileSize=0;
- 		fileChunkCounter = 0;
- 		String fileName = receivePath;
--		fos = new FileOutputStream(fileName);
-+		try {
-+			fos = new FileOutputStream(fileName);
-+		} catch (Exception e) {
-+			fFileReceptionRunning = false;
-+			writeRfbFileTransferMsg(rfbAbortFileTransfer, 0, 0, 0, null);
-+			viewer.ftp.historyComboBox.insertItemAt(new String(" > ERROR opening Local File: <" + fileName ),0);
-+			viewer.ftp.historyComboBox.setSelectedIndex(0);
-+			viewer.ftp.enableButtons();
-+			return;
-+		}
- 		writeRfbFileTransferMsg(rfbFileHeader, 0, 0, 0, null);
- 	}
- 
-@@ -1085,7 +1250,13 @@
- 			fAbort = false;
- 			fFileReceptionError = true;
- 			writeRfbFileTransferMsg(rfbAbortFileTransfer, 0, 0, 0, null);
--			
-+
-+			//runge for use with x11vnc/libvncserver, no rfbAbortFileTransfer reply sent.
-+		        try {Thread.sleep(500);} catch (InterruptedException e) {}
-+			viewer.ftp.enableButtons();
-+			viewer.ftp.refreshLocalLocation();
-+			viewer.ftp.connectionStatus.setText(" > Error - File NOT received");
-+			viewer.ftp.historyComboBox.insertItemAt(new String(" > Error - File: <" + receivePath + "> not correctly received from Remote Machine (aborted by user or error)") ,0);
- 		}
- 		// sf@2004 - For old FT protocole only
- 		/*
-@@ -1104,7 +1275,7 @@
- 		int length = is.readInt();
- 		fileSize=0;
- 		fos.close();
--		
-+
- 		viewer.ftp.refreshLocalLocation();
- 		if (fReceptionOk && !fFileReceptionError)
- 		{
-@@ -1132,12 +1303,7 @@
- 		try
- 		{
- 			String temp = text;
--			writeRfbFileTransferMsg(
--									rfbDirContentRequest,
--									rfbRDirContent,
--									0,
--									temp.length(),
--									temp);
-+			writeRfbFileTransferMsg(rfbDirContentRequest, rfbRDirContent, 0, temp.length(), temp);
- 		}
- 		catch (IOException e)
- 		{
-@@ -1197,11 +1363,80 @@
- 					str += temp;
- 				}
- 			}
-+			// runge
-+			viewer.ftp.receivedRemoteDirectoryName(str);
- 			// viewer.ftp.changeRemoteDirectory(str);
- 			
- 		}
- 	}
- 
-+	int zogswap(int n) {
-+		long l = n;
-+		if (l < 0) {
-+			l += 0x100000000L;
-+		}
-+		l = l & 0xFFFFFFFF;
-+		l = (l >> 24) | ((l & 0x00ff0000) >> 8) | ((l & 0x0000ff00) << 8) | (l << 24);
-+		return (int) l;
-+	}
-+
-+	int windozeToUnix(int L, int H) {
-+		long L2 = zogswap(L);
-+		long H2 = zogswap(H);
-+		long unix = (H2 << 32) + L2;
-+		unix -= 11644473600L * 10000000L;
-+		unix /= 10000000L;
-+		//System.out.println("unix time: " + unix + " H2: " + H2 + " L2: " + L2);
-+		return (int) unix;
-+	}
-+	
-+	String timeStr(int t, int h) {
-+		if (h == 0) {
-+			// x11vnc/libvncserver unix
-+			t = zogswap(t);
-+		} else {
-+			// ultra (except if h==0 by chance)
-+			t = windozeToUnix(t, h);
-+		}
-+		long tl = (long) t;
-+		Date date = new Date(tl * 1000);
-+		if (true) {
-+			return date.toString();
-+		} else {
-+			return DateFormat.getDateTimeInstance().format(date);
-+		}
-+	}
-+
-+	String dotPast(double f, int n) {
-+		String fs = "" + f;
-+		int i = fs.lastIndexOf(".") + n;
-+		if (i >= 0) {
-+			int len = fs.length();
-+			if (i >= len) {
-+				i = len-1;
-+			}
-+			fs = fs.substring(0, i);
-+		}
-+		return fs;
-+	}
-+	String sizeStr(int s) {
-+		s = zogswap(s);
-+		if (s < 0) {
-+			return s + "? B";
-+		} else if (s < 1024) {
-+			return s + " B";
-+		} else if (s < 1024 * 1024) {
-+			double k = s / 1024.0;
-+			String ks = dotPast(k, 3);
-+			
-+			return s + " (" + ks + " KB)";
-+		} else {
-+			double m = s / (1024.0*1024.0);
-+			String ms = dotPast(m, 3);
-+			return s + " (" + ms + " MB)";
-+		}
-+	}
-+
- 	//Internally used to receive directory content from server
- 	//Here, the server sends one file/directory with it's attributes
- 	void readFTPMsgDirectoryListContent() throws IOException
-@@ -1217,17 +1452,32 @@
- 			dwReserved0,
- 			dwReserved1;
- 		long ftCreationTime, ftLastAccessTime, ftLastWriteTime;
-+		int ftCreationTimeL, ftLastAccessTimeL, ftLastWriteTimeL;
-+		int ftCreationTimeH, ftLastAccessTimeH, ftLastWriteTimeH;
- 		char cFileName, cAlternateFileName;
- 		int length = 0;
- 		is.readInt();
- 		length = is.readInt();
-+
-+		char[] chars = new char[4*length];
-+		int char_cnt = 0;
-+		for (int i = 0; i < chars.length; i++) {
-+			chars[i] = '\0';
-+		}
-+		
- 		dwFileAttributes = is.readInt();
- 		length -= 4;
--		ftCreationTime = is.readLong();
-+		//ftCreationTime = is.readLong();
-+		ftCreationTimeL = is.readInt();
-+		ftCreationTimeH = is.readInt();
- 		length -= 8;
--		ftLastAccessTime = is.readLong();
-+		//ftLastAccessTime = is.readLong();
-+		ftLastAccessTimeL = is.readInt();
-+		ftLastAccessTimeH = is.readInt();
- 		length -= 8;
--		ftLastWriteTime = is.readLong();
-+		//ftLastWriteTime = is.readLong();
-+		ftLastWriteTimeL = is.readInt();
-+		ftLastWriteTimeH = is.readInt();
- 		length -= 8;
- 		nFileSizeHigh = is.readInt();
- 		length -= 4;
-@@ -1239,10 +1489,12 @@
- 		length -= 4;
- 		cFileName = (char) is.readUnsignedByte();
- 		length--;
-+		chars[char_cnt++] = cFileName;
- 		while (cFileName != '\0')
- 		{
- 			fileName += cFileName;
- 			cFileName = (char) is.readUnsignedByte();
-+			chars[char_cnt++] = cFileName;
- 			length--;
- 		}
- 		cAlternateFileName = (char) is.readByte();
-@@ -1253,7 +1505,28 @@
- 			cAlternateFileName = (char) is.readUnsignedByte();
- 			length--;
- 		}
--		if (dwFileAttributes == 268435456
-+		String guessed = guess_encoding(chars);
-+		if (!guessed.equals("ASCII")) {
-+			System.out.println("guess: " + guessed + "\t" + fileName);
-+		}
-+		if (guessed.equals("UTF-8")) {
-+			try {
-+				byte[] bytes = new byte[char_cnt-1];
-+				for (int i=0; i < char_cnt-1; i++) {
-+					bytes[i] = (byte) chars[i];
-+				}
-+				String newstr = new String(bytes, "UTF-8");
-+				fileName = newstr;
-+			} catch (Exception e) {
-+				System.out.println("failed to convert bytes to UTF-8 based string");
-+			}
-+		}
-+		for (int i = 0; i < char_cnt; i++) {
-+			//System.out.println("char[" + i + "]\t" + (int) chars[i]);
-+		}
-+		if (fileName.length() <= 0) {
-+			;
-+		} else if (dwFileAttributes == 268435456
- 			|| dwFileAttributes == 369098752
- 			|| dwFileAttributes == 285212672 
- 			|| dwFileAttributes == 271056896
-@@ -1263,11 +1536,74 @@
- 			|| dwFileAttributes == 369623040)
- 		{
- 			fileName = " [" + fileName + "]";
--			remoteDirsList.add(fileName); // sf@2004
--		}
--		else
--		{
--			remoteFilesList.add(" " + fileName); // sf@2004
-+// begin runge/x11vnc
-+//			remoteDirsList.add(fileName); // sf@2004
-+			int i = -1;
-+			String t1 = fileName.toLowerCase();
-+			for (int j = 0; j < remoteDirsList.size(); j++) {
-+				String t = (String) remoteDirsList.get(j);
-+				String t2 = t.toLowerCase();
-+				if (t1.compareTo(t2) < 0) {
-+					i = j;
-+					break;
-+				}
-+			}
-+			//String s = "Lastmod: " + timeStr(ftLastWriteTimeL, ftLastWriteTimeH) + "    " + fileName; 
-+			String f2 = fileName;
-+			if (f2.length() < 24) {
-+				for (int ik = f2.length(); ik < 24; ik++) {
-+					f2 = f2 + " ";
-+				}
-+			}
-+			String s = f2 + "    \tLastmod: " + timeStr(ftLastWriteTimeL, ftLastWriteTimeH) + "    \t\tSize: " + sizeStr(nFileSizeLow); 
-+			//s = fileName + " Lastmod: " + zogswap(ftLastWriteTimeL); 
-+			if (i >= 0) {
-+				remoteDirsList.add(i, fileName);
-+				remoteDirsListInfo.add(i, s);
-+			} else {
-+				remoteDirsList.add(fileName);
-+				remoteDirsListInfo.add(s);
-+			}
-+// end runge/x11vnc
-+		} else {
-+// begin runge/x11vnc
-+//			remoteFilesList.add(" " + fileName); // sf@2004
-+	
-+			fileName = " " + fileName;
-+			int i = -1;
-+			String t1 = fileName.toLowerCase();
-+			for (int j = 0; j < remoteFilesList.size(); j++) {
-+				String t = (String) remoteFilesList.get(j);
-+				String t2 = t.toLowerCase();
-+				if (t1.compareTo(t2) < 0) {
-+					i = j;
-+					break;
-+				}
-+			}
-+			String f2 = fileName;
-+			if (f2.length() < 24) {
-+				for (int ik = f2.length(); ik < 24; ik++) {
-+					f2 = f2 + " ";
-+				}
-+			}
-+
-+if (false) {
-+System.out.println("fileName:         " + f2);
-+System.out.println("ftLastWriteTimeL: " + ftLastWriteTimeL);
-+System.out.println("ftLastWriteTimeH: " + ftLastWriteTimeH);
-+System.out.println("nFileSizeLow:     " + nFileSizeLow);
-+}
-+
-+			String s = f2 + "    \tLastmod: " + timeStr(ftLastWriteTimeL, ftLastWriteTimeH) + "    \t\tSize: " + sizeStr(nFileSizeLow); 
-+			//s = fileName + " Lastmod: " + ftLastWriteTimeL + "/" + zogswap(ftLastWriteTimeL) + "  Size: " + nFileSizeLow + "/" + zogswap(nFileSizeLow); 
-+			if (i >= 0) {
-+				remoteFilesList.add(i, fileName);
-+				remoteFilesListInfo.add(i, s);
-+			} else {
-+				remoteFilesList.add(fileName);
-+				remoteFilesListInfo.add(s);
-+			}
-+// end runge/x11vnc
- 		}
- 	
- 		// a.add(fileName);
-@@ -1282,14 +1618,32 @@
- 
- 		// sf@2004
- 		a.clear();
--		for (int i = 0; i < remoteDirsList.size(); i++) 
-+		b.clear();
-+		for (int i = 0; i < remoteDirsList.size(); i++) {
- 			a.add(remoteDirsList.get(i));
--		for (int i = 0; i < remoteFilesList.size(); i++) 
-+			b.add(remoteDirsListInfo.get(i));
-+		}
-+		for (int i = 0; i < remoteFilesList.size(); i++) {
- 			a.add(remoteFilesList.get(i));
-+
-+			b.add(remoteFilesListInfo.get(i));
-+		}
- 		remoteDirsList.clear();
-+		remoteDirsListInfo.clear();
- 		remoteFilesList.clear();
-+		remoteFilesListInfo.clear();
- 		
--		viewer.ftp.printDirectory(a);
-+// begin runge/x11vnc
-+		// Hack for double listing at startup... probably libvncserver bug..
-+		readServerDriveListCnt++;
-+		if (readServerDriveListCnt == 2) {
-+			if (System.currentTimeMillis() - readServerDriveListTime < 2000)  {
-+//System.out.println("readServerDriveListCnt skip " + readServerDriveListCnt);
-+				return;
-+			}
-+		}
-+// end runge/x11vnc
-+		viewer.ftp.printDirectory(a, b);
- 	}
- 
- 	//Internally used to signify the drive requested is not ready
-@@ -1299,6 +1653,8 @@
- 		System.out.println("Remote Drive unavailable");
- 		viewer.ftp.connectionStatus.setText(" > WARNING - Remote Drive unavailable (possibly restricted access or media not present)");
- 		viewer.ftp.remoteStatus.setText("WARNING: Remote Drive unavailable");
-+		viewer.ftp.historyComboBox.insertItemAt(new String(" > WARNING: Remote Drive unavailable."), 0);
-+		viewer.ftp.historyComboBox.setSelectedIndex(0);
- 	}
- 
- 	//Call this method to request the list of drives on the server.
-@@ -1306,12 +1662,11 @@
- 	{
- 		try
- 		{
--			viewer.rfb.writeRfbFileTransferMsg(
--												RfbProto.rfbDirContentRequest,
--												RfbProto.rfbRDrivesList,
--												0,
--												0,
--												null);
-+			viewer.rfb.writeRfbFileTransferMsg(RfbProto.rfbDirContentRequest, RfbProto.rfbRDrivesList, 0, 0, null);
-+// begin runge/x11vnc
-+			readServerDriveListCnt = 0;
-+			readServerDriveListTime = System.currentTimeMillis();
-+// end   runge/x11vnc
- 		}
- 		catch (IOException e)
- 		{
-@@ -1355,21 +1710,21 @@
- 		int h,
- 		boolean incremental)
- 		throws IOException {
--			if (!viewer.ftp.isVisible()) {
--		byte[] b = new byte[10];
-+		if (!viewer.ftp.isVisible()) {
-+			byte[] b = new byte[10];
- 
--		b[0] = (byte) FramebufferUpdateRequest;
--		b[1] = (byte) (incremental ? 1 : 0);
--		b[2] = (byte) ((x >> 8) & 0xff);
--		b[3] = (byte) (x & 0xff);
--		b[4] = (byte) ((y >> 8) & 0xff);
--		b[5] = (byte) (y & 0xff);
--		b[6] = (byte) ((w >> 8) & 0xff);
--		b[7] = (byte) (w & 0xff);
--		b[8] = (byte) ((h >> 8) & 0xff);
--		b[9] = (byte) (h & 0xff);
-+			b[0] = (byte) FramebufferUpdateRequest;
-+			b[1] = (byte) (incremental ? 1 : 0);
-+			b[2] = (byte) ((x >> 8) & 0xff);
-+			b[3] = (byte) (x & 0xff);
-+			b[4] = (byte) ((y >> 8) & 0xff);
-+			b[5] = (byte) (y & 0xff);
-+			b[6] = (byte) ((w >> 8) & 0xff);
-+			b[7] = (byte) (w & 0xff);
-+			b[8] = (byte) ((h >> 8) & 0xff);
-+			b[9] = (byte) (h & 0xff);
- 
--		os.write(b);
-+			os.write(b);
- 		}
- 	}
- 
-@@ -1482,7 +1837,13 @@
- 		b[6] = (byte) ((text.length() >> 8) & 0xff);
- 		b[7] = (byte) (text.length() & 0xff);
- 
--		System.arraycopy(text.getBytes(), 0, b, 8, text.length());
-+		if (false && max_char(text) > 255) {
-+			System.arraycopy(text.getBytes("UTF-8"), 0, b, 8, text.length());
-+		} else if (max_char(text) > 127) {
-+			System.arraycopy(text.getBytes("ISO-8859-1"), 0, b, 8, text.length());
-+		} else {
-+			System.arraycopy(text.getBytes(), 0, b, 8, text.length());
-+		}
- 
- 		os.write(b);
- 	//	}
-@@ -1506,6 +1867,37 @@
- 	final static int META_MASK = InputEvent.META_MASK;
- 	final static int ALT_MASK = InputEvent.ALT_MASK;
- 
-+	void writeWheelEvent(MouseWheelEvent evt) throws IOException {
-+		eventBufLen = 0;
-+
-+		int x = evt.getX();
-+		int y = evt.getY();
-+
-+		if (x < 0) x = 0;
-+		if (y < 0) y = 0;
-+
-+		int ptrmask;
-+
-+		int clicks = evt.getWheelRotation();
-+		System.out.println("writeWheelEvent: clicks: " + clicks);
-+		if (clicks > 0) {
-+			ptrmask = 16;
-+		} else if (clicks < 0) {
-+			ptrmask = 8;
-+		} else {
-+			return;
-+		}
-+
-+		eventBuf[eventBufLen++] = (byte) PointerEvent;
-+		eventBuf[eventBufLen++] = (byte) ptrmask;
-+		eventBuf[eventBufLen++] = (byte) ((x >> 8) & 0xff);
-+		eventBuf[eventBufLen++] = (byte) (x & 0xff);
-+		eventBuf[eventBufLen++] = (byte) ((y >> 8) & 0xff);
-+		eventBuf[eventBufLen++] = (byte) (y & 0xff);
-+
-+		os.write(eventBuf, 0, eventBufLen);
-+	}
-+
- 	//
- 	// Write a pointer event message.  We may need to send modifier key events
- 	// around it to set the correct modifier state.
-@@ -1610,6 +2002,21 @@
- 
- 		boolean down = (evt.getID() == KeyEvent.KEY_PRESSED);
- 
-+		if (viewer.debugKeyboard) {
-+			System.out.println("----------------------------------------");
-+			System.out.println("evt.getKeyChar:      " + evt.getKeyChar());
-+			System.out.println("getKeyText:          " + KeyEvent.getKeyText(evt.getKeyCode()));
-+			System.out.println("evt.getKeyCode:      " + evt.getKeyCode());
-+			System.out.println("evt.getID:           " + evt.getID());
-+			System.out.println("evt.getKeyLocation:  " + evt.getKeyLocation());
-+			System.out.println("evt.isActionKey:     " + evt.isActionKey());
-+			System.out.println("evt.isControlDown:   " + evt.isControlDown());
-+			System.out.println("evt.getModifiers:    " + evt.getModifiers());
-+			System.out.println("getKeyModifiersText: " + KeyEvent.getKeyModifiersText(evt.getModifiers()));
-+			System.out.println("evt.paramString:     " + evt.paramString());
-+		}
-+
-+
- 		int key;
- 		if (evt.isActionKey()) {
- 
-@@ -1685,6 +2092,9 @@
- 				default :
- 					return;
- 			}
-+			if (key == 0xffc2 && viewer.mapF5_to_atsign) {
-+				key = 0x40;
-+			}
- 
- 		} else {
- 
-@@ -1794,6 +2204,16 @@
- 	int oldModifiers = 0;
- 
- 	void writeModifierKeyEvents(int newModifiers) {
-+		if(viewer.forbid_Ctrl_Alt) {
-+			if ((newModifiers & CTRL_MASK) != 0 && (newModifiers & ALT_MASK) != 0) {
-+				int orig = newModifiers;
-+				newModifiers &= ~ALT_MASK;
-+				newModifiers &= ~CTRL_MASK;
-+				if (viewer.debugKeyboard) {
-+					System.out.println("Ctrl+Alt modifiers: " + orig + " -> " + newModifiers);
-+				}
-+			}
-+		}
- 		if ((newModifiers & CTRL_MASK) != (oldModifiers & CTRL_MASK))
- 			writeKeyEvent(0xffe3, (newModifiers & CTRL_MASK) != 0);
- 
-diff -Naur JavaViewer.orig/SSLSocketToMe.java JavaViewer/SSLSocketToMe.java
---- JavaViewer.orig/SSLSocketToMe.java	1969-12-31 19:00:00.000000000 -0500
-+++ JavaViewer/SSLSocketToMe.java	2010-07-10 19:18:06.000000000 -0400
-@@ -0,0 +1,2067 @@
-+/*
-+ * SSLSocketToMe.java: add SSL encryption to Java VNC Viewer.
-+ *
-+ * Copyright (c) 2006 Karl J. Runge <runge@karlrunge.com>
-+ * All rights reserved.
-+ *
-+ *  This 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; version 2 of the License, or
-+ *  (at your option) any later version.
-+ *
-+ *  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.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this software; if not, write to the Free Software
-+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
-+ *  USA.
-+ *
-+ */
-+
-+import java.net.*;
-+import java.io.*;
-+import javax.net.ssl.*;
-+import java.util.*;
-+
-+import java.security.*;
-+import java.security.cert.*;
-+import java.security.spec.*;
-+import java.security.cert.Certificate;
-+import java.security.cert.CertificateFactory;
-+
-+import java.awt.*;
-+import java.awt.event.*;
-+
-+public class SSLSocketToMe {
-+
-+	/* basic member data: */
-+	String host;
-+	int port;
-+	VncViewer viewer;
-+
-+	boolean debug = true;
-+	boolean debug_certs = false;
-+
-+	/* sockets */
-+	SSLSocket socket = null;
-+	SSLSocketFactory factory;
-+
-+	/* fallback for Proxy connection */
-+	boolean proxy_in_use = false;
-+	boolean proxy_failure = false;
-+	public DataInputStream is = null;
-+	public OutputStream os = null;
-+
-+	/* strings from user WRT proxy: */
-+	String proxy_auth_string = null;
-+	String proxy_dialog_host = null;
-+	int proxy_dialog_port = 0;
-+
-+	Socket proxySock;
-+	DataInputStream proxy_is;
-+	OutputStream proxy_os;
-+
-+	/* trust contexts */
-+	SSLContext trustloc_ctx;
-+	SSLContext trustall_ctx;
-+	SSLContext trustsrv_ctx;
-+	SSLContext trusturl_ctx;
-+	SSLContext trustone_ctx;
-+
-+	/* corresponding trust managers */
-+	TrustManager[] trustAllCerts;
-+	TrustManager[] trustSrvCert;
-+	TrustManager[] trustUrlCert;
-+	TrustManager[] trustOneCert;
-+
-+	/* client-side SSL auth key (oneTimeKey=...) */
-+	KeyManager[] mykey = null;
-+
-+	boolean user_wants_to_see_cert = true;
-+	String cert_fail = null;
-+
-+	/* cert(s) we retrieve from Web server, VNC server, or serverCert param: */
-+	java.security.cert.Certificate[] trustallCerts = null;
-+	java.security.cert.Certificate[] trustsrvCerts = null;
-+	java.security.cert.Certificate[] trusturlCerts = null;
-+
-+	/* utility to decode hex oneTimeKey=... and serverCert=... */
-+	byte[] hex2bytes(String s) {
-+		byte[] bytes = new byte[s.length()/2];
-+		for (int i=0; i<s.length()/2; i++) {
-+			int j = 2*i;
-+			try {
-+				int val = Integer.parseInt(s.substring(j, j+2), 16);
-+				if (val > 127) {
-+					val -= 256;
-+				}
-+				Integer I = new Integer(val);
-+				bytes[i] = Byte.decode(I.toString()).byteValue();
-+				
-+			} catch (Exception e) {
-+				;
-+			}
-+		}
-+		return bytes;
-+	}
-+
-+	SSLSocketToMe(String h, int p, VncViewer v) throws Exception {
-+		host = h;
-+		port = p;
-+		viewer = v;
-+
-+		debug_certs = v.debugCerts;
-+
-+		/* we will first try default factory for certification: */
-+
-+		factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
-+
-+		dbg("SSL startup: " + host + " " + port);
-+
-+
-+		/* create trust managers to be used if initial handshake fails: */
-+
-+		trustAllCerts = new TrustManager[] {
-+		    /*
-+		     * this one accepts everything.  Only used if user
-+		     * has disabled checking (trustAllVncCerts=yes)
-+		     * or when we grab the cert to show it to them in
-+		     * a dialog and ask them to manually verify/accept it.
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) {
-+				/* empty */
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) {
-+				/* empty */
-+				dbg("ALL: an untrusted connect to grab cert.");
-+			}
-+		    }
-+		};
-+
-+		trustUrlCert = new TrustManager[] {
-+		    /*
-+		     * this one accepts only the retrieved server
-+		     * cert by SSLSocket by this applet and stored in
-+		     * trusturlCerts.
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				throw new CertificateException("No Clients (URL)");
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				/* we want to check 'certs' against 'trusturlCerts' */
-+				if (trusturlCerts == null) {
-+					throw new CertificateException(
-+					    "No Trust url Certs array.");
-+				}
-+				if (trusturlCerts.length < 1) {
-+					throw new CertificateException(
-+					    "No Trust url Certs.");
-+				}
-+				if (certs == null) {
-+					throw new CertificateException(
-+					    "No this-certs array.");
-+				}
-+				if (certs.length < 1) {
-+					throw new CertificateException(
-+					    "No this-certs Certs.");
-+				}
-+				if (certs.length != trusturlCerts.length) {
-+					throw new CertificateException(
-+					    "certs.length != trusturlCerts.length " + certs.length + " " + trusturlCerts.length);
-+				}
-+				boolean ok = true;
-+				for (int i = 0; i < certs.length; i++)  {
-+					if (! trusturlCerts[i].equals(certs[i])) {
-+						ok = false;
-+						dbg("URL: cert mismatch at i=" + i);
-+						dbg("URL: cert mismatch cert" + certs[i]);
-+						dbg("URL: cert mismatch  url" + trusturlCerts[i]);
-+						if (cert_fail == null) {
-+							cert_fail = "cert-mismatch";
-+						}
-+					}
-+					if (debug_certs) {
-+						dbg("\n***********************************************");
-+						dbg("URL: cert info at i=" + i);
-+						dbg("URL: cert info cert" + certs[i]);
-+						dbg("===============================================");
-+						dbg("URL: cert info  url" + trusturlCerts[i]);
-+						dbg("***********************************************");
-+					}
-+				}
-+				if (!ok) {
-+					throw new CertificateException(
-+					    "Server Cert Chain != URL Cert Chain.");
-+				}
-+				dbg("URL: trusturlCerts[i] matches certs[i] i=0:" + (certs.length-1));
-+			}
-+		    }
-+		};
-+
-+		trustSrvCert = new TrustManager[] {
-+		    /*
-+		     * this one accepts cert given to us in the serverCert
-+		     * Applet Parameter we were started with.  It is
-+		     * currently a fatal error if the VNC Server's cert
-+		     * doesn't match it.
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				throw new CertificateException("No Clients (SRV)");
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				/* we want to check 'certs' against 'trustsrvCerts' */
-+				if (trustsrvCerts == null) {
-+					throw new CertificateException(
-+					    "No Trust srv Certs array.");
-+				}
-+				if (trustsrvCerts.length < 1) {
-+					throw new CertificateException(
-+					    "No Trust srv Certs.");
-+				}
-+				if (certs == null) {
-+					throw new CertificateException(
-+					    "No this-certs array.");
-+				}
-+				if (certs.length < 1) {
-+					throw new CertificateException(
-+					    "No this-certs Certs.");
-+				}
-+				if (certs.length != trustsrvCerts.length) {
-+					throw new CertificateException(
-+					    "certs.length != trustsrvCerts.length " + certs.length + " " + trustsrvCerts.length);
-+				}
-+				boolean ok = true;
-+				for (int i = 0; i < certs.length; i++)  {
-+					if (! trustsrvCerts[i].equals(certs[i])) {
-+						ok = false;
-+						dbg("SRV: cert mismatch at i=" + i);
-+						dbg("SRV: cert mismatch cert" + certs[i]);
-+						dbg("SRV: cert mismatch  srv" + trustsrvCerts[i]);
-+						if (cert_fail == null) {
-+							cert_fail = "server-cert-mismatch";
-+						}
-+					}
-+					if (debug_certs) {
-+						dbg("\n***********************************************");
-+						dbg("SRV: cert info at i=" + i);
-+						dbg("SRV: cert info cert" + certs[i]);
-+						dbg("===============================================");
-+						dbg("SRV: cert info  srv" + trustsrvCerts[i]);
-+						dbg("***********************************************");
-+					}
-+				}
-+				if (!ok) {
-+					throw new CertificateException(
-+					    "Server Cert Chain != serverCert Applet Parameter Cert Chain.");
-+				}
-+				dbg("SRV: trustsrvCerts[i] matches certs[i] i=0:" + (certs.length-1));
-+			}
-+		    }
-+		};
-+
-+		trustOneCert = new TrustManager[] {
-+		    /*
-+		     * this one accepts only the retrieved server
-+		     * cert by SSLSocket by this applet we stored in
-+		     * trustallCerts that user has accepted or applet
-+		     * parameter trustAllVncCerts=yes is set.  This is
-+		     * for when we reconnect after the user has manually
-+		     * accepted the trustall cert in the dialog (or set
-+		     * trustAllVncCerts=yes applet param.)
-+		     */
-+		    new X509TrustManager() {
-+			public java.security.cert.X509Certificate[]
-+			    getAcceptedIssuers() {
-+				return null;
-+			}
-+			public void checkClientTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				throw new CertificateException("No Clients (ONE)");
-+			}
-+			public void checkServerTrusted(
-+			    java.security.cert.X509Certificate[] certs,
-+			    String authType) throws CertificateException {
-+				/* we want to check 'certs' against 'trustallCerts' */
-+				if (trustallCerts == null) {
-+					throw new CertificateException(
-+					    "No Trust All Server Certs array.");
-+				}
-+				if (trustallCerts.length < 1) {
-+					throw new CertificateException(
-+					    "No Trust All Server Certs.");
-+				}
-+				if (certs == null) {
-+					throw new CertificateException(
-+					    "No this-certs array.");
-+				}
-+				if (certs.length < 1) {
-+					throw new CertificateException(
-+					    "No this-certs Certs.");
-+				}
-+				if (certs.length != trustallCerts.length) {
-+					throw new CertificateException(
-+					    "certs.length != trustallCerts.length " + certs.length + " " + trustallCerts.length);
-+				}
-+				boolean ok = true;
-+				for (int i = 0; i < certs.length; i++)  {
-+					if (! trustallCerts[i].equals(certs[i])) {
-+						ok = false;
-+						dbg("ONE: cert mismatch at i=" + i);
-+						dbg("ONE: cert mismatch cert" + certs[i]);
-+						dbg("ONE: cert mismatch  all" + trustallCerts[i]);
-+					}
-+					if (debug_certs) {
-+						dbg("\n***********************************************");
-+						dbg("ONE: cert info at i=" + i);
-+						dbg("ONE: cert info cert" + certs[i]);
-+						dbg("===============================================");
-+						dbg("ONE: cert info  all" + trustallCerts[i]);
-+						dbg("***********************************************");
-+					}
-+				}
-+				if (!ok) {
-+					throw new CertificateException(
-+					    "Server Cert Chain != TRUSTALL Cert Chain.");
-+				}
-+				dbg("ONE: trustallCerts[i] matches certs[i] i=0:" + (certs.length-1));
-+			}
-+		    }
-+		};
-+
-+		/* 
-+		 * The above TrustManagers are used:
-+		 *
-+		 * 1) to retrieve the server cert in case of failure to
-+		 *    display it to the user in a dialog.
-+		 * 2) to subsequently connect to the server if user agrees.
-+		 */
-+
-+		/*
-+		 * build oneTimeKey cert+key if supplied in applet parameter:
-+		 */
-+		if (viewer.oneTimeKey != null && viewer.oneTimeKey.equals("PROMPT")) {
-+			ClientCertDialog d = new ClientCertDialog();
-+			viewer.oneTimeKey = d.queryUser();
-+		}
-+		if (viewer.oneTimeKey != null && viewer.oneTimeKey.indexOf(",") > 0) {
-+			int idx = viewer.oneTimeKey.indexOf(",");
-+
-+			String onetimekey = viewer.oneTimeKey.substring(0, idx);
-+			byte[] key = hex2bytes(onetimekey);
-+			String onetimecert = viewer.oneTimeKey.substring(idx+1);
-+			byte[] cert = hex2bytes(onetimecert);
-+
-+			KeyFactory kf = KeyFactory.getInstance("RSA");
-+			PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );
-+			PrivateKey ff = kf.generatePrivate (keysp);
-+			if (debug_certs) {
-+				dbg("one time key " + ff);
-+			}
-+
-+			CertificateFactory cf = CertificateFactory.getInstance("X.509");
-+			Collection c = cf.generateCertificates(new ByteArrayInputStream(cert));
-+			Certificate[] certs = new Certificate[c.toArray().length];
-+			if (c.size() == 1) {
-+				Certificate tmpcert = cf.generateCertificate(new ByteArrayInputStream(cert));
-+				if (debug_certs) {
-+					dbg("one time cert" + tmpcert);
-+				}
-+				certs[0] = tmpcert;
-+			} else {
-+				certs = (Certificate[]) c.toArray();
-+			}
-+
-+			KeyStore ks = KeyStore.getInstance("JKS");
-+			ks.load(null, null);
-+			ks.setKeyEntry("onetimekey", ff, "".toCharArray(), certs);
-+			String da = KeyManagerFactory.getDefaultAlgorithm();
-+			KeyManagerFactory kmf = KeyManagerFactory.getInstance(da);
-+			kmf.init(ks, "".toCharArray());
-+
-+			mykey = kmf.getKeyManagers();
-+		}
-+
-+		/*
-+		 * build serverCert cert if supplied in applet parameter:
-+		 */
-+		if (viewer.serverCert != null) {
-+			CertificateFactory cf = CertificateFactory.getInstance("X.509");
-+			byte[] cert = hex2bytes(viewer.serverCert);
-+			Collection c = cf.generateCertificates(new ByteArrayInputStream(cert));
-+			trustsrvCerts = new Certificate[c.toArray().length];
-+			if (c.size() == 1) {
-+				Certificate tmpcert = cf.generateCertificate(new ByteArrayInputStream(cert));
-+				trustsrvCerts[0] = tmpcert;
-+			} else {
-+				trustsrvCerts = (Certificate[]) c.toArray();
-+			}
-+		}
-+
-+		/* the trust loc certs context: */
-+		try {
-+			trustloc_ctx = SSLContext.getInstance("SSL");
-+
-+			/*
-+			 * below is a failed attempt to get jvm's default
-+			 * trust manager using null (below) makes it so
-+			 * for HttpsURLConnection the server cannot be
-+			 * verified (no prompting.)
-+			 */
-+			if (false) {
-+				boolean didit = false;
-+				TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  
-+				tmf.init((KeyStore) null);
-+				TrustManager [] tml = tmf.getTrustManagers();
-+				for (int i = 0; i < tml.length; i++) {
-+					TrustManager tm = tml[i];
-+					if (tm instanceof X509TrustManager) {
-+						TrustManager tm1[] = new TrustManager[1];
-+						tm1[0] = tm;
-+						trustloc_ctx.init(mykey, tm1, null);
-+						didit = true;
-+						break;
-+					}
-+				}
-+				if (!didit) {
-+					trustloc_ctx.init(mykey, null, null);
-+				}
-+			} else {
-+				/* we have to set trust manager to null */
-+				trustloc_ctx.init(mykey, null, null);
-+			}
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustloc_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust all certs context: */
-+		try {
-+			trustall_ctx = SSLContext.getInstance("SSL");
-+			trustall_ctx.init(mykey, trustAllCerts, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustall_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust url certs context: */
-+		try {
-+			trusturl_ctx = SSLContext.getInstance("SSL");
-+			trusturl_ctx.init(mykey, trustUrlCert, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trusturl_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust srv certs context: */
-+		try {
-+			trustsrv_ctx = SSLContext.getInstance("SSL");
-+			trustsrv_ctx.init(mykey, trustSrvCert, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustsrv_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+
-+		/* the trust the one cert from server context: */
-+		try {
-+			trustone_ctx = SSLContext.getInstance("SSL");
-+			trustone_ctx.init(mykey, trustOneCert, new
-+			    java.security.SecureRandom());
-+
-+		} catch (Exception e) {
-+			String msg = "SSL trustone_ctx FAILED.";
-+			dbg(msg);
-+			throw new Exception(msg);
-+		}
-+	}
-+
-+	/*
-+	 * we call this early on to 1) check for a proxy, 2) grab
-+	 * Browser/JVM accepted HTTPS cert.
-+	 */
-+	public void check_for_proxy_and_grab_vnc_server_cert() {
-+		
-+		trusturlCerts = null;
-+		proxy_in_use = false;
-+
-+		if (viewer.ignoreProxy) {
-+			/* applet param says skip it. */
-+			/* the downside is we do not set trusturlCerts for comparison later... */
-+			/* nor do we autodetect x11vnc for GET=1. */
-+			return;
-+		}
-+
-+		dbg("------------------------------------------------");
-+		dbg("Into check_for_proxy_and_grab_vnc_server_cert():");
-+
-+		dbg("TRYING HTTPS:");
-+		String ustr = "https://" + host + ":";
-+		if (viewer.httpsPort != null) {
-+			ustr += viewer.httpsPort;
-+		} else {
-+			ustr += port;
-+		}
-+		ustr += viewer.urlPrefix + "/check.https.proxy.connection";
-+		dbg("ustr is: " + ustr);
-+
-+		try {
-+			/* prepare for an HTTPS URL connection to host:port */
-+			URL url = new URL(ustr);
-+			HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
-+
-+			if (mykey != null) {
-+				/* with oneTimeKey (mykey) we can't use the default SSL context */
-+				if (trustsrvCerts != null) {
-+					dbg("passing trustsrv_ctx to HttpsURLConnection to provide client cert.");
-+					https.setSSLSocketFactory(trustsrv_ctx.getSocketFactory());	
-+				} else if (trustloc_ctx != null) {
-+					dbg("passing trustloc_ctx to HttpsURLConnection to provide client cert.");
-+					https.setSSLSocketFactory(trustloc_ctx.getSocketFactory());	
-+				}
-+			}
-+
-+			https.setUseCaches(false);
-+			https.setRequestMethod("GET");
-+			https.setRequestProperty("Pragma", "No-Cache");
-+			https.setRequestProperty("Proxy-Connection", "Keep-Alive");
-+			https.setDoInput(true);
-+
-+			dbg("trying https.connect()");
-+			https.connect();
-+
-+			dbg("trying https.getServerCertificates()");
-+			trusturlCerts = https.getServerCertificates();
-+
-+			if (trusturlCerts == null) {
-+				dbg("set trusturlCerts to null!");
-+			} else {
-+				dbg("set trusturlCerts to non-null");
-+			}
-+
-+			if (https.usingProxy()) {
-+				proxy_in_use = true;
-+				dbg("An HTTPS proxy is in use. There may be connection problems.");
-+			}
-+
-+			dbg("trying https.getContent()");
-+			Object output = https.getContent();
-+			dbg("trying https.disconnect()");
-+			https.disconnect();
-+			if (! viewer.GET) {
-+				String header = https.getHeaderField("VNC-Server");
-+				if (header != null && header.startsWith("x11vnc")) {
-+					dbg("detected x11vnc server (1), setting GET=1");
-+					viewer.GET = true;
-+				}
-+			}
-+
-+		} catch(Exception e) {
-+			dbg("HttpsURLConnection: " + e.getMessage());
-+		}
-+
-+		if (proxy_in_use) {
-+			dbg("exit check_for_proxy_and_grab_vnc_server_cert():");
-+			dbg("------------------------------------------------");
-+			return;
-+		} else if (trusturlCerts != null && !viewer.forceProxy) {
-+			/* Allow user to require HTTP check?  use forceProxy for now. */
-+			dbg("SKIPPING HTTP PROXY CHECK: got trusturlCerts, assuming proxy info is correct.");
-+			dbg("exit check_for_proxy_and_grab_vnc_server_cert():");
-+			dbg("------------------------------------------------");
-+			return;
-+		}
-+
-+		/*
-+		 * XXX need to remember scenario where this extra check
-+		 * gives useful info.  User's Browser proxy settings?
-+		 */
-+		dbg("TRYING HTTP:");
-+		ustr = "http://" + host + ":" + port;
-+		ustr += viewer.urlPrefix + "/index.vnc";
-+		dbg("ustr is: " + ustr);
-+
-+		try {
-+			/* prepare for an HTTP URL connection to the same host:port (but not httpsPort) */
-+			URL url = new URL(ustr);
-+			HttpURLConnection http = (HttpURLConnection)
-+			    url.openConnection();
-+
-+			http.setUseCaches(false);
-+			http.setRequestMethod("GET");
-+			http.setRequestProperty("Pragma", "No-Cache");
-+			http.setRequestProperty("Proxy-Connection", "Keep-Alive");
-+			http.setDoInput(true);
-+
-+			dbg("trying http.connect()");
-+			http.connect();
-+
-+			if (http.usingProxy()) {
-+				proxy_in_use = true;
-+				dbg("An HTTP proxy is in use. There may be connection problems.");
-+			}
-+			dbg("trying http.getContent()");
-+			Object output = http.getContent();
-+			dbg("trying http.disconnect()");
-+			http.disconnect();
-+			if (! viewer.GET) {
-+				String header = http.getHeaderField("VNC-Server");
-+				if (header != null && header.startsWith("x11vnc")) {
-+					dbg("detected x11vnc server (2), setting GET=1");
-+					viewer.GET = true;
-+				}
-+			}
-+		} catch(Exception e) {
-+			dbg("HttpURLConnection:  " + e.getMessage());
-+		}
-+		dbg("exit check_for_proxy_and_grab_vnc_server_cert():");
-+		dbg("------------------------------------------------");
-+	}
-+
-+	public Socket connectSock() throws IOException {
-+		/*
-+		 * first try a https connection to detect a proxy, and
-+		 * grab the VNC server cert at the same time:
-+		 */
-+		check_for_proxy_and_grab_vnc_server_cert();
-+
-+		boolean srv_cert = false;
-+		
-+		if (trustsrvCerts != null) {
-+			/* applet parameter suppled serverCert */
-+			dbg("viewer.trustSrvCert-0 using trustsrv_ctx");
-+			factory = trustsrv_ctx.getSocketFactory();
-+			srv_cert = true;
-+		} else if (viewer.trustAllVncCerts) {
-+			/* trust all certs (no checking) */
-+			dbg("viewer.trustAllVncCerts-0 using trustall_ctx");
-+			factory = trustall_ctx.getSocketFactory();
-+		} else if (trusturlCerts != null) {
-+			/* trust certs the Browser/JVM accepted in check_for_proxy... */
-+			dbg("using trusturl_ctx");
-+			factory = trusturl_ctx.getSocketFactory();
-+		} else {
-+			/* trust the local defaults */
-+			dbg("using trustloc_ctx");
-+			factory = trustloc_ctx.getSocketFactory();
-+		}
-+
-+		socket = null;
-+
-+		try {
-+			if (proxy_in_use && viewer.forceProxy) {
-+				throw new Exception("forcing proxy (forceProxy)");
-+			} else if (viewer.CONNECT != null) {
-+				throw new Exception("forcing CONNECT");
-+			}
-+
-+			int timeout = 6;
-+			if (timeout > 0) {
-+				socket = (SSLSocket) factory.createSocket();
-+				InetSocketAddress inetaddr = new InetSocketAddress(host, port);
-+				dbg("Using timeout of " + timeout + " secs to: " + host + ":" + port);
-+				socket.connect(inetaddr, timeout * 1000);
-+			} else {
-+				socket = (SSLSocket) factory.createSocket(host, port);
-+			}
-+
-+		} catch (Exception esock) {
-+			dbg("socket error: " + esock.getMessage());
-+			if (proxy_in_use || viewer.CONNECT != null) {
-+				proxy_failure = true;
-+				if (proxy_in_use) {
-+					dbg("HTTPS proxy in use. Trying to go with it.");
-+				} else {
-+					dbg("viewer.CONNECT reverse proxy in use. Trying to go with it.");
-+				}
-+				try {
-+					socket = proxy_socket(factory);
-+				} catch (Exception e) {
-+					dbg("proxy_socket error: " + e.getMessage());
-+				}
-+			} else {
-+				/* n.b. socket is left in error state to cause ex. below. */
-+			}
-+		}
-+
-+		try {
-+			socket.startHandshake();
-+
-+			dbg("The Server Connection Verified OK on 1st try.");
-+
-+			java.security.cert.Certificate[] currentTrustedCerts;
-+			BrowserCertsDialog bcd;
-+
-+			SSLSession sess = socket.getSession();
-+			currentTrustedCerts = sess.getPeerCertificates();
-+
-+			if (viewer.trustAllVncCerts) {
-+				dbg("viewer.trustAllVncCerts-1  keeping socket.");
-+			} else if (currentTrustedCerts == null || currentTrustedCerts.length < 1) {
-+				try {
-+					socket.close();
-+				} catch (Exception e) {
-+					dbg("socket is grumpy.");
-+				}
-+				socket = null;
-+				throw new SSLHandshakeException("no current certs");
-+			}
-+
-+			String serv = "";
-+			try {
-+				CertInfo ci = new CertInfo(currentTrustedCerts[0]);
-+				serv = ci.get_certinfo("CN");
-+			} catch (Exception e) {
-+				;
-+			}
-+
-+			if (viewer.trustAllVncCerts) {
-+				dbg("viewer.trustAllVncCerts-2  skipping browser certs dialog");
-+				user_wants_to_see_cert = false;
-+			} else if (viewer.serverCert != null && trustsrvCerts != null) {
-+				dbg("viewer.serverCert-1  skipping browser certs dialog");
-+				user_wants_to_see_cert = false;
-+			} else if (viewer.trustUrlVncCert) {
-+				dbg("viewer.trustUrlVncCert-1  skipping browser certs dialog");
-+				user_wants_to_see_cert = false;
-+			} else {
-+				/* have a dialog with the user: */
-+				bcd = new BrowserCertsDialog(serv, host + ":" + port);
-+				dbg("browser certs dialog begin.");
-+				bcd.queryUser();
-+				dbg("browser certs dialog finished.");
-+
-+				if (bcd.showCertDialog) {
-+					String msg = "user wants to see cert";
-+					dbg(msg);
-+					user_wants_to_see_cert = true;
-+					if (cert_fail == null) {
-+						cert_fail = "user-view";
-+					}
-+					throw new SSLHandshakeException(msg);
-+				} else {
-+					user_wants_to_see_cert = false;
-+					dbg("browser certs dialog: user said yes, accept it");
-+				}
-+			}
-+
-+		} catch (SSLHandshakeException eh)  {
-+			dbg("SSLHandshakeException: could not automatically verify Server.");
-+			dbg("msg: " + eh.getMessage());
-+
-+
-+			/* send a cleanup string just in case: */
-+			String getoutstr = "GET /index.vnc HTTP/1.0\r\nConnection: close\r\n\r\n";
-+
-+			try {
-+				OutputStream os = socket.getOutputStream();
-+				os.write(getoutstr.getBytes());
-+				socket.close();
-+			} catch (Exception e) {
-+				dbg("socket is grumpy!");
-+			}
-+
-+			/* reload */
-+
-+			socket = null;
-+
-+			String reason = null;
-+
-+			if (srv_cert) {
-+				/* for serverCert usage we make this a fatal error. */
-+				throw new IOException("Fatal: VNC Server's Cert does not match Applet Parameter 'serverCert=...'");
-+				/* see below in TrustDialog were we describe this case to user anyway */
-+			}
-+
-+			/*
-+			 * Reconnect, trusting any cert, so we can grab
-+			 * the cert to show it to the user in a dialog
-+			 * for him to manually accept.  This connection
-+			 * is not used for anything else.
-+			 */
-+			factory = trustall_ctx.getSocketFactory();
-+			if (proxy_failure) {
-+				socket = proxy_socket(factory);
-+			} else {
-+				socket = (SSLSocket) factory.createSocket(host, port);
-+			}
-+
-+			if (debug_certs) {
-+				dbg("trusturlCerts: " + trusturlCerts);
-+				dbg("trustsrvCerts: " + trustsrvCerts);
-+			}
-+			if (trusturlCerts == null && cert_fail == null) {
-+				cert_fail = "missing-certs";
-+			}
-+
-+			try {
-+				socket.startHandshake();
-+
-+				dbg("The TrustAll Server Cert-grab Connection (trivially) Verified OK.");
-+
-+				/* grab the cert: */
-+				try {
-+					SSLSession sess = socket.getSession();
-+					trustallCerts = sess.getPeerCertificates();
-+				} catch (Exception e) {
-+					throw new Exception("Could not get " + 
-+					    "Peer Certificate");	
-+				}
-+				if (debug_certs) {
-+					dbg("trustallCerts: " + trustallCerts);
-+				}
-+
-+				if (viewer.trustAllVncCerts) {
-+					dbg("viewer.trustAllVncCerts-3.  skipping dialog, trusting everything.");
-+				} else if (! browser_cert_match()) {
-+					/*
-+					 * close socket now, we will reopen after
-+					 * dialog if user agrees to use the cert.
-+					 */
-+					try {
-+						OutputStream os = socket.getOutputStream();
-+						os.write(getoutstr.getBytes());
-+						socket.close();
-+					} catch (Exception e) {
-+						dbg("socket is grumpy!!");
-+					}
-+					socket = null;
-+
-+					/* dialog with user to accept cert or not: */
-+
-+					TrustDialog td= new TrustDialog(host, port,
-+					    trustallCerts);
-+
-+					if (cert_fail == null) {
-+						;
-+					} else if (cert_fail.equals("user-view")) {
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        You Asked to View the Certificate.";
-+					} else if (cert_fail.equals("server-cert-mismatch")) {
-+						/* this is now fatal error, see above. */
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        The VNC Server's Certificate does not match the Certificate\n"
-+						       + "        specified in the supplied 'serverCert' Applet Parameter.";
-+					} else if (cert_fail.equals("cert-mismatch")) {
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        The VNC Server's Certificate does not match the Website's\n"
-+						       + "        HTTPS Certificate (that you previously accepted; either\n"
-+						       + "        manually or automatically via Certificate Authority.)";
-+					} else if (cert_fail.equals("missing-certs")) {
-+						reason = "Reason for this Dialog:\n\n"
-+						       + "        Not all Certificates could be obtained to check.";
-+					}
-+
-+					if (! td.queryUser(reason)) {
-+						String msg = "User decided against it.";
-+						dbg(msg);
-+						throw new IOException(msg);
-+					}
-+				}
-+
-+			} catch (Exception ehand2)  {
-+				dbg("** Could not TrustAll Verify Server!");
-+
-+				throw new IOException(ehand2.getMessage());
-+			}
-+
-+			/* reload again: */
-+
-+			if (socket != null) {
-+				try {
-+					socket.close();
-+				} catch (Exception e) {
-+					dbg("socket is grumpy!!!");
-+				}
-+				socket = null;
-+			}
-+
-+			/*
-+			 * Now connect a 3rd time, using the cert
-+			 * retrieved during connection 2 (sadly, that
-+			 * the user likely blindly agreed to...)
-+			 */
-+
-+			factory = trustone_ctx.getSocketFactory();
-+			if (proxy_failure) {
-+				socket = proxy_socket(factory);
-+			} else {
-+				socket = (SSLSocket) factory.createSocket(host, port);
-+			}
-+
-+			try {
-+				socket.startHandshake();
-+				dbg("TrustAll/TrustOne Server Connection Verified #3.");
-+
-+			} catch (Exception ehand3)  {
-+				dbg("** Could not TrustAll/TrustOne Verify Server #3.");
-+
-+				throw new IOException(ehand3.getMessage());
-+			}
-+		}
-+
-+		/* we have socket (possibly null) at this point, so proceed: */
-+
-+		/* handle x11vnc GET=1, if applicable: */
-+		if (socket != null && viewer.GET) {
-+			String str = "GET ";
-+			str += viewer.urlPrefix;
-+			str += "/request.https.vnc.connection";
-+			str += " HTTP/1.0\r\n";
-+			str += "Pragma: No-Cache\r\n";
-+			str += "\r\n";
-+
-+			System.out.println("sending: " + str);
-+    			OutputStream os = socket.getOutputStream();
-+			String type = "os";
-+
-+			if (type == "os") {
-+				os.write(str.getBytes());
-+				os.flush();
-+				System.out.println("used OutputStream");
-+			} else if (type == "bs") {
-+				BufferedOutputStream bs = new BufferedOutputStream(os);
-+				bs.write(str.getBytes());
-+				bs.flush();
-+				System.out.println("used BufferedOutputStream");
-+			} else if (type == "ds") {
-+				DataOutputStream ds = new DataOutputStream(os);
-+				ds.write(str.getBytes());
-+				ds.flush();
-+				System.out.println("used DataOutputStream");
-+			}
-+			if (false) {
-+				String rep = "";
-+				DataInputStream is = new DataInputStream(
-+				    new BufferedInputStream(socket.getInputStream(), 16384));
-+				while (true) {
-+					rep += readline(is);
-+					if (rep.indexOf("\r\n\r\n") >= 0) {
-+						break;
-+					}
-+				}
-+				System.out.println("rep: " + rep);
-+			}
-+		}
-+
-+		dbg("SSL returning socket to caller.");
-+		dbg("");
-+
-+		/* could be null, let caller handle that. */
-+		return (Socket) socket;
-+	}
-+
-+	boolean browser_cert_match() {
-+		String msg = "Browser URL accept previously accepted cert";
-+
-+		if (user_wants_to_see_cert) {
-+			return false;
-+		}
-+
-+		if (viewer.serverCert != null || trustsrvCerts != null) {
-+			if (cert_fail == null) {
-+				cert_fail = "server-cert-mismatch";
-+			}
-+		}
-+		if (trustallCerts != null && trusturlCerts != null) {
-+		    if (trustallCerts.length == trusturlCerts.length) {
-+			boolean ok = true;
-+			/* check toath trustallCerts (socket) equals trusturlCerts (browser) */
-+			for (int i = 0; i < trusturlCerts.length; i++)  {
-+				if (! trustallCerts[i].equals(trusturlCerts[i])) {
-+					dbg("BCM: cert mismatch at i=" + i);
-+					dbg("BCM: cert mismatch  url" + trusturlCerts[i]);
-+					dbg("BCM: cert mismatch  all" + trustallCerts[i]);
-+					ok = false;
-+				}
-+			}
-+			if (ok) {
-+				System.out.println(msg);
-+				if (cert_fail == null) {
-+					cert_fail = "did-not-fail";
-+				}
-+				return true;
-+			} else {
-+				if (cert_fail == null) {
-+					cert_fail = "cert-mismatch";
-+				}
-+				return false;
-+			}
-+		    }
-+		}
-+		if (cert_fail == null) {
-+			cert_fail = "missing-certs";
-+		}
-+		return false;
-+	}
-+
-+	private void dbg(String s) {
-+		if (debug) {
-+			System.out.println(s);
-+		}
-+	}
-+
-+	private int gint(String s) {
-+		int n = -1;
-+		try {
-+			Integer I = new Integer(s);
-+			n = I.intValue();
-+		} catch (Exception ex) {
-+			return -1;
-+		}
-+		return n;
-+	}
-+
-+	/* this will do the proxy CONNECT negotiation and hook us up.  */
-+
-+	private void proxy_helper(String proxyHost, int proxyPort) {
-+
-+		boolean proxy_auth = false;
-+		String proxy_auth_basic_realm = "";
-+		String hp = host + ":" + port;
-+		dbg("proxy_helper: " + proxyHost + ":" + proxyPort + " hp: " + hp);
-+
-+		/* we loop here a few times trying for the password case */
-+		for (int k=0; k < 2; k++) {
-+			dbg("proxy_in_use psocket: " + k);
-+
-+			if (proxySock != null) {
-+				try {
-+					proxySock.close();
-+				} catch (Exception e) {
-+					dbg("proxy socket is grumpy.");
-+				}
-+			}
-+
-+			proxySock = psocket(proxyHost, proxyPort);
-+			if (proxySock == null) {
-+				dbg("1-a sadly, returning a null socket");
-+				return;
-+			}
-+
-+			String req1 = "CONNECT " + hp + " HTTP/1.1\r\n"
-+			    + "Host: " + hp + "\r\n";
-+
-+			dbg("requesting via proxy: " + req1);
-+
-+			if (proxy_auth) {
-+				if (proxy_auth_string == null) {
-+					ProxyPasswdDialog pp = new ProxyPasswdDialog(proxyHost, proxyPort, proxy_auth_basic_realm);
-+					pp.queryUser();
-+					proxy_auth_string = pp.getAuth();
-+				}
-+				//dbg("auth1: " + proxy_auth_string);
-+
-+				String auth2 = Base64Coder.encodeString(proxy_auth_string);
-+				//dbg("auth2: " + auth2);
-+
-+				req1 += "Proxy-Authorization: Basic " + auth2 + "\r\n";
-+				//dbg("req1: " + req1);
-+
-+				dbg("added Proxy-Authorization: Basic ... to request");
-+			}
-+			req1 += "\r\n";
-+
-+			try {
-+				proxy_os.write(req1.getBytes());
-+				String reply = readline(proxy_is);
-+
-+				dbg("proxy replied: " + reply.trim());
-+
-+				if (reply.indexOf("HTTP/1.") == 0 && reply.indexOf(" 407 ") > 0) {
-+					proxy_auth = true;
-+					proxySock.close();
-+				} else if (reply.indexOf("HTTP/1.") < 0 && reply.indexOf(" 200") < 0) {
-+					proxySock.close();
-+					proxySock = psocket(proxyHost, proxyPort);
-+					if (proxySock == null) {
-+						dbg("2-a sadly, returning a null socket");
-+						return;
-+					}
-+				}
-+			} catch(Exception e) {
-+				dbg("some proxy socket problem: " + e.getMessage());
-+			}
-+
-+			/* read the rest of the HTTP headers */
-+			while (true) {
-+				String line = readline(proxy_is);
-+				dbg("proxy line: " + line.trim());
-+				if (proxy_auth) {
-+					String uc = line.toLowerCase();
-+					if (uc.indexOf("proxy-authenticate:") == 0) {
-+						if (uc.indexOf(" basic ") >= 0) {
-+							int idx = uc.indexOf(" realm");
-+							if (idx >= 0) {
-+								proxy_auth_basic_realm = uc.substring(idx+1);
-+							}
-+						}
-+					}
-+				}
-+				if (line.equals("\r\n") || line.equals("\n")) {
-+					break;
-+				}
-+			}
-+			if (!proxy_auth || proxy_auth_basic_realm.equals("")) {
-+				/* we only try once for the non-password case: */
-+				break;
-+			}
-+		}
-+	}
-+
-+	public SSLSocket proxy_socket(SSLSocketFactory factory) {
-+		Properties props = null;
-+		String proxyHost = null;
-+		int proxyPort = 0;
-+		String proxyHost_nossl = null;
-+		int proxyPort_nossl = 0;
-+		String str;
-+
-+		/* see if we can guess the proxy info from Properties: */
-+		try {
-+			props = System.getProperties();
-+		} catch (Exception e) {
-+			/* sandboxed applet might not be able to read it. */
-+			dbg("props failed: " + e.getMessage());
-+		}
-+		if (viewer.proxyHost != null) {
-+			dbg("Using supplied proxy " + viewer.proxyHost + " " + viewer.proxyPort + " applet parameters.");
-+			proxyHost = viewer.proxyHost;
-+			if (viewer.proxyPort != null) {
-+				proxyPort = gint(viewer.proxyPort);
-+			} else {
-+				proxyPort = 8080;
-+			}
-+			
-+		} else if (props != null) {
-+			dbg("\n---------------\nAll props:");
-+			props.list(System.out);
-+			dbg("\n---------------\n\n");
-+
-+			/* scrape throught properties looking for proxy info: */
-+
-+			for (Enumeration e = props.propertyNames(); e.hasMoreElements(); ) {
-+				String s = (String) e.nextElement();
-+				String v = System.getProperty(s);
-+				String s2 = s.toLowerCase();
-+				String v2 = v.toLowerCase();
-+
-+				if (s2.indexOf("proxy.https.host") >= 0) {
-+					proxyHost = v2;
-+					continue;
-+				}
-+				if (s2.indexOf("proxy.https.port") >= 0) {
-+					proxyPort = gint(v2);
-+					continue;
-+				}
-+				if (s2.indexOf("proxy.http.host") >= 0) {
-+					proxyHost_nossl = v2;
-+					continue;
-+				}
-+				if (s2.indexOf("proxy.http.port") >= 0) {
-+					proxyPort_nossl = gint(v2);
-+					continue;
-+				}
-+			}
-+
-+			for (Enumeration e = props.propertyNames(); e.hasMoreElements(); ) {
-+				String s = (String) e.nextElement();
-+				String v = System.getProperty(s);
-+				String s2 = s.toLowerCase();
-+				String v2 = v.toLowerCase();
-+
-+				if (proxyHost != null && proxyPort > 0) {
-+					break;
-+				}
-+
-+				// look for something like: javaplugin.proxy.config.list = http=10.0.2.1:8082
-+				if (s2.indexOf("proxy") < 0 && v2.indexOf("proxy") < 0) {
-+					continue;
-+				}
-+				if (v2.indexOf("http") < 0) {
-+					continue;
-+				}
-+
-+				String[] pieces = v.split("[,;]");
-+				for (int i = 0; i < pieces.length; i++) {
-+					String p = pieces[i];
-+					int j = p.indexOf("https");
-+					if (j < 0) {
-+						j = p.indexOf("http");
-+						if (j < 0) {
-+							continue;
-+						}
-+					}
-+					j = p.indexOf("=", j);
-+					if (j < 0) {
-+						continue;
-+					}
-+					p = p.substring(j+1);
-+					String [] hp = p.split(":");
-+					if (hp.length != 2) {
-+						continue;
-+					}
-+					if (hp[0].length() > 1 && hp[1].length() > 1) {
-+
-+						proxyPort = gint(hp[1]);
-+						if (proxyPort < 0) {
-+							continue;
-+						}
-+						proxyHost = new String(hp[0]);
-+						break;
-+					}
-+				}
-+			}
-+		}
-+		if (proxyHost != null) {
-+			if (proxyHost_nossl != null && proxyPort_nossl > 0) {
-+				dbg("Using http proxy info instead of https.");
-+				proxyHost = proxyHost_nossl;
-+				proxyPort = proxyPort_nossl;
-+			}
-+		}
-+
-+		if (proxy_in_use) {
-+			if (proxy_dialog_host != null && proxy_dialog_port > 0) {
-+				proxyHost = proxy_dialog_host;
-+				proxyPort = proxy_dialog_port;
-+			}
-+			if (proxyHost != null) {
-+				dbg("Lucky us! we figured out the Proxy parameters: " + proxyHost + " " + proxyPort);
-+			} else {
-+				/* ask user to help us: */
-+				ProxyDialog pd = new ProxyDialog(proxyHost, proxyPort);
-+				pd.queryUser();
-+				proxyHost = pd.getHost(); 
-+				proxyPort = pd.getPort();
-+				proxy_dialog_host = new String(proxyHost);
-+				proxy_dialog_port = proxyPort;
-+				dbg("User said host: " + pd.getHost() + " port: " + pd.getPort());
-+			}
-+
-+			proxy_helper(proxyHost, proxyPort);
-+			if (proxySock == null) {
-+				return null;
-+			}
-+		} else if (viewer.CONNECT != null) {
-+			dbg("viewer.CONNECT psocket:");
-+			proxySock = psocket(host, port);
-+			if (proxySock == null) {
-+				dbg("1-b sadly, returning a null socket");
-+				return null;
-+			}
-+		}
-+		
-+		if (viewer.CONNECT != null) {
-+			String hp = viewer.CONNECT;
-+			String req2 = "CONNECT " + hp + " HTTP/1.1\r\n"
-+			    + "Host: " + hp + "\r\n\r\n";
-+
-+			dbg("requesting2: " + req2);
-+
-+			try {
-+				proxy_os.write(req2.getBytes());
-+				String reply = readline(proxy_is);
-+
-+				dbg("proxy replied2: " + reply.trim());
-+
-+				if (reply.indexOf("HTTP/1.") < 0 && reply.indexOf(" 200") < 0) {
-+					proxySock.close();
-+					proxySock = psocket(proxyHost, proxyPort);
-+					if (proxySock == null) {
-+						dbg("2-b sadly, returning a null socket");
-+						return null;
-+					}
-+				}
-+			} catch(Exception e) {
-+				dbg("proxy socket problem-2: " + e.getMessage());
-+			}
-+
-+			while (true) {
-+				String line = readline(proxy_is);
-+				dbg("proxy line2: " + line.trim());
-+				if (line.equals("\r\n") || line.equals("\n")) {
-+					break;
-+				}
-+			}
-+		}
-+
-+		Socket sslsock = null;
-+		try {
-+			sslsock = factory.createSocket(proxySock, host, port, true);
-+		} catch(Exception e) {
-+			dbg("sslsock prob: " + e.getMessage());
-+			dbg("3 sadly, returning a null socket");
-+		}
-+
-+		return (SSLSocket) sslsock;
-+	}
-+
-+	Socket psocket(String h, int p) {
-+		Socket psock = null;
-+		try {
-+			psock = new Socket(h, p);
-+			proxy_is = new DataInputStream(new BufferedInputStream(
-+			    psock.getInputStream(), 16384));
-+			proxy_os = psock.getOutputStream();
-+		} catch(Exception e) {
-+			dbg("psocket prob: " + e.getMessage());
-+			return null;
-+		}
-+
-+		return psock;
-+	}
-+
-+	String readline(DataInputStream i) {
-+		byte[] ba = new byte[1];
-+		String s = new String("");
-+		ba[0] = 0;
-+		try {
-+			while (ba[0] != 0xa) {
-+				ba[0] = (byte) i.readUnsignedByte();
-+				s += new String(ba);
-+			}
-+		} catch (Exception e) {
-+			;
-+		}
-+		return s;
-+	}
-+}
-+
-+class TrustDialog implements ActionListener {
-+	String msg, host, text;
-+	int port;
-+	java.security.cert.Certificate[] trustallCerts = null;
-+	boolean viewing_cert = false;
-+	boolean trust_this_session = false;
-+
-+	/*
-+	 * this is the gui to show the user the cert and info and ask
-+	 * them if they want to continue using this cert.
-+	 */
-+
-+	Button ok, cancel, viewcert;
-+	TextArea textarea;
-+	Checkbox accept, deny;
-+	Dialog dialog;
-+
-+	String s1 = "Accept this certificate temporarily for this session";
-+	String s2 = "Do not accept this certificate and do not connect to"
-+	    + " this VNC server";
-+	String ln = "\n---------------------------------------------------\n\n";
-+		
-+	TrustDialog (String h, int p, java.security.cert.Certificate[] s) {
-+		host = h;
-+		port = p;
-+		trustallCerts = s;
-+
-+		msg = "VNC Server " + host + ":" + port + " Not Verified";
-+	}
-+
-+	public boolean queryUser(String reason) {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame(msg);
-+
-+		dialog = new Dialog(frame, true);
-+
-+		String infostr = "";
-+		if (trustallCerts.length == 1) {
-+			CertInfo ci = new CertInfo(trustallCerts[0]);
-+			infostr = ci.get_certinfo("all");
-+		}
-+		if (reason != null) {
-+			reason += "\n\n";
-+		}
-+
-+		text = "\n" 
-++ "Unable to verify the identity of\n"
-++ "\n"
-++ "        " + host + ":" + port + "\n" 
-++ "\n"
-++ infostr
-++ "\n"
-++ "as a trusted VNC server.\n"
-++ "\n"
-++ reason
-++ "In General not being able to verify the VNC Server and/or your seeing this Dialog\n"
-++ "is due to one of the following:\n"
-++ "\n"
-++ " - Your requesting to View the Certificate before accepting.\n"
-++ "\n"
-++ " - The VNC server is using a Self-Signed Certificate or a Certificate\n"
-++ "   Authority not recognized by your Web Browser or Java Plugin runtime.\n"
-++ "\n"
-++ " - The use of an Apache SSL portal scheme employing CONNECT proxying AND\n"
-++ "   the Apache Web server has a certificate *different* from the VNC server's.\n"
-++ "\n"
-++ " - No previously accepted Certificate (via Web Broswer/Java Plugin) could be\n"
-++ "   obtained by this applet to compare the VNC Server Certificate against.\n"
-++ "\n"
-++ " - The VNC Server's Certificate does not match the one specified in the\n"
-++ "   supplied 'serverCert' Java Applet Parameter.\n"
-++ "\n"
-++ " - A Man-In-The-Middle attack impersonating as the VNC server that you wish\n"
-++ "   to connect to.  (Wouldn't that be exciting!!)\n"
-++ "\n"
-++ "By safely copying the VNC server's Certificate (or using a common Certificate\n"
-++ "Authority certificate) you can configure your Web Browser and Java Plugin to\n"
-++ "automatically authenticate this VNC Server.\n"
-++ "\n"
-++ "If you do so, then you will only have to click \"Yes\" when this VNC Viewer\n"
-++ "applet asks you whether to trust your Browser/Java Plugin's acceptance of the\n"
-++ "certificate (except for the Apache portal case above where they don't match.)\n"
-++ "\n"
-++ "You can also set the applet parameter 'trustUrlVncCert=yes' to automatically\n"
-++ "accept certificates already accepted/trusted by your Web Browser/Java Plugin,\n"
-++ "and thereby see no dialog from this VNC Viewer applet.\n"
-+;
-+
-+		/* the accept / do-not-accept radio buttons: */
-+		CheckboxGroup checkbox = new CheckboxGroup();
-+		accept = new Checkbox(s1, true, checkbox);
-+		deny   = new Checkbox(s2, false, checkbox);
-+
-+		/* put the checkboxes in a panel: */
-+		Panel check = new Panel();
-+		check.setLayout(new GridLayout(2, 1));
-+
-+		check.add(accept);
-+		check.add(deny);
-+
-+		/* make the 3 buttons: */
-+		ok = new Button("OK");
-+		cancel = new Button("Cancel");
-+		viewcert = new Button("View Certificate");
-+
-+		ok.addActionListener(this);
-+		cancel.addActionListener(this);
-+		viewcert.addActionListener(this);
-+
-+		/* put the buttons in their own panel: */
-+		Panel buttonrow = new Panel();
-+		buttonrow.setLayout(new FlowLayout(FlowLayout.LEFT));
-+		buttonrow.add(viewcert);
-+		buttonrow.add(ok);
-+		buttonrow.add(cancel);
-+
-+		/* label at the top: */
-+		Label label = new Label(msg, Label.CENTER);
-+		label.setFont(new Font("Helvetica", Font.BOLD, 16));
-+
-+		/* textarea in the middle */
-+		textarea = new TextArea(text, 38, 64,
-+		    TextArea.SCROLLBARS_VERTICAL_ONLY);
-+		textarea.setEditable(false);
-+
-+		/* put the two panels in their own panel at bottom: */
-+		Panel bot = new Panel();
-+		bot.setLayout(new GridLayout(2, 1));
-+		bot.add(check);
-+		bot.add(buttonrow);
-+
-+		/* now arrange things inside the dialog: */
-+		dialog.setLayout(new BorderLayout());
-+
-+		dialog.add("North", label);
-+		dialog.add("South", bot);
-+		dialog.add("Center", textarea);
-+
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+
-+		return trust_this_session;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+
-+		if (evt.getSource() == viewcert) {
-+			/* View Certificate button clicked */
-+			if (viewing_cert) {
-+				/* show the original info text: */
-+				textarea.setText(text);
-+				viewcert.setLabel("View Certificate");
-+				viewing_cert = false;
-+			} else {
-+				int i;
-+				/* show all (likely just one) certs: */
-+				textarea.setText("");
-+				for (i=0; i < trustallCerts.length; i++) {
-+					int j = i + 1;
-+					textarea.append("Certificate[" +
-+					    j + "]\n\n");
-+					textarea.append(
-+					    trustallCerts[i].toString());
-+					textarea.append(ln);
-+				}
-+				viewcert.setLabel("View Info");
-+				viewing_cert = true;
-+
-+				textarea.setCaretPosition(0);
-+			}
-+
-+		} else if (evt.getSource() == ok) {
-+			/* OK button clicked */
-+			if (accept.getState()) {
-+				trust_this_session = true;
-+			} else {
-+				trust_this_session = false;
-+			}
-+			//dialog.dispose();
-+			dialog.hide();
-+
-+		} else if (evt.getSource() == cancel) {
-+			/* Cancel button clicked */
-+			trust_this_session = false;
-+
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+
-+	String get_certinfo() {
-+		String all = "";
-+		String fields[] = {"CN", "OU", "O", "L", "C"};
-+		int i;
-+		if (trustallCerts.length < 1) {
-+			all = "";
-+			return all;
-+		}
-+		String cert = trustallCerts[0].toString();
-+
-+		/*
-+		 * For now we simply scrape the cert string, there must
-+		 * be an API for this... perhaps optionValue?
-+		 */
-+
-+		for (i=0; i < fields.length; i++) {
-+			int f, t, t1, t2;
-+			String sub, mat = fields[i] + "=";
-+			
-+			f = cert.indexOf(mat, 0);
-+			if (f > 0) {
-+				t1 = cert.indexOf(", ", f);
-+				t2 = cert.indexOf("\n", f);
-+				if (t1 < 0 && t2 < 0) {
-+					continue;
-+				} else if (t1 < 0) {
-+					t = t2;
-+				} else if (t2 < 0) {
-+					t = t1;
-+				} else if (t1 < t2) {
-+					t = t1;
-+				} else {
-+					t = t2;
-+				}
-+				if (t > f) {
-+					sub = cert.substring(f, t);
-+					all = all + "        " + sub + "\n";
-+				}
-+			}
-+		}
-+		return all;
-+	}
-+}
-+
-+class ProxyDialog implements ActionListener {
-+	String guessedHost = null;
-+	String guessedPort = null;
-+	/*
-+	 * this is the gui to show the user the cert and info and ask
-+	 * them if they want to continue using this cert.
-+	 */
-+
-+	Button ok;
-+	Dialog dialog;
-+	TextField entry;
-+	String reply = "";
-+
-+	ProxyDialog (String h, int p) {
-+		guessedHost = h;
-+		try {
-+			guessedPort = Integer.toString(p);
-+		} catch (Exception e) {
-+			guessedPort = "8080";
-+		}
-+	}
-+
-+	public void queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Need Proxy host:port");
-+
-+		dialog = new Dialog(frame, true);
-+
-+
-+		Label label = new Label("Please Enter your https Proxy info as host:port", Label.CENTER);
-+		//label.setFont(new Font("Helvetica", Font.BOLD, 16));
-+		entry = new TextField(30);
-+		ok = new Button("OK");
-+		ok.addActionListener(this);
-+
-+		String guess = "";
-+		if (guessedHost != null) {
-+			guess = guessedHost + ":" + guessedPort;
-+		}
-+		entry.setText(guess);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", label);
-+		dialog.add("Center", entry);
-+		dialog.add("South", ok);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+		return;
-+	}
-+
-+	public String getHost() {
-+		int i = reply.indexOf(":");
-+		if (i < 0) {
-+			return "unknown";
-+		}
-+		String h = reply.substring(0, i);
-+		return h;
-+	}
-+
-+	public int getPort() {
-+		int i = reply.indexOf(":");
-+		int p = 8080;
-+		if (i < 0) {
-+			return p;
-+		}
-+		i++;
-+		String ps = reply.substring(i);
-+		try {
-+			Integer I = new Integer(ps);
-+			p = I.intValue();
-+		} catch (Exception e) {
-+			;
-+		}
-+		return p;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == ok) {
-+			reply = entry.getText();
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+}
-+
-+class ProxyPasswdDialog implements ActionListener {
-+	String guessedHost = null;
-+	String guessedPort = null;
-+	String guessedUser = null;
-+	String guessedPasswd = null;
-+	String realm = null;
-+	/*
-+	 * this is the gui to show the user the cert and info and ask
-+	 * them if they want to continue using this cert.
-+	 */
-+
-+	Button ok;
-+	Dialog dialog;
-+	TextField entry1;
-+	TextField entry2;
-+	String reply1 = "";
-+	String reply2 = "";
-+
-+	ProxyPasswdDialog (String h, int p, String realm) {
-+		guessedHost = h;
-+		try {
-+			guessedPort = Integer.toString(p);
-+		} catch (Exception e) {
-+			guessedPort = "8080";
-+		}
-+		this.realm = realm;
-+	}
-+
-+	public void queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Proxy Requires Username and Password");
-+
-+		dialog = new Dialog(frame, true);
-+
-+		//Label label = new Label("Please Enter your Web Proxy Username in the top Entry and Password in the bottom Entry", Label.CENTER);
-+		TextArea label = new TextArea("Please Enter your Web Proxy\nUsername in the Top Entry and\nPassword in the Bottom Entry,\nand then press OK.", 4, 20, TextArea.SCROLLBARS_NONE);
-+		entry1 = new TextField(30);
-+		entry2 = new TextField(30);
-+		entry2.setEchoChar('*');
-+		ok = new Button("OK");
-+		ok.addActionListener(this);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", label);
-+		dialog.add("Center", entry1);
-+		dialog.add("South",  entry2);
-+		dialog.add("East", ok);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+		return;
-+	}
-+
-+	public String getAuth() {
-+		return reply1 + ":" + reply2;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == ok) {
-+			reply1 = entry1.getText();
-+			reply2 = entry2.getText();
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+}
-+
-+class ClientCertDialog implements ActionListener {
-+
-+	Button ok;
-+	Dialog dialog;
-+	TextField entry;
-+	String reply = "";
-+
-+	ClientCertDialog() {
-+		;
-+	}
-+
-+	public String queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Enter SSL Client Cert+Key String");
-+
-+		dialog = new Dialog(frame, true);
-+
-+
-+		Label label = new Label("Please Enter the SSL Client Cert+Key String 308204c0...,...522d2d0a", Label.CENTER);
-+		entry = new TextField(30);
-+		ok = new Button("OK");
-+		ok.addActionListener(this);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", label);
-+		dialog.add("Center", entry);
-+		dialog.add("South", ok);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til OK or Cancel pressed. */
-+		return reply;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == ok) {
-+			reply = entry.getText();
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+	}
-+}
-+
-+class BrowserCertsDialog implements ActionListener {
-+	Button yes, no;
-+	Dialog dialog;
-+	String vncServer;
-+	String hostport;
-+	public boolean showCertDialog = true;
-+
-+	BrowserCertsDialog(String serv, String hp) {
-+		vncServer = serv;
-+		hostport = hp;
-+	}
-+
-+	public void queryUser() {
-+
-+		/* create and display the dialog for unverified cert. */
-+
-+		Frame frame = new Frame("Use Browser/JVM Certs?");
-+
-+		dialog = new Dialog(frame, true);
-+
-+		String m = "";
-+m += "\n";
-+m += "This VNC Viewer applet does not have its own keystore to track\n";
-+m += "SSL certificates, and so cannot authenticate the certificate\n";
-+m += "of the VNC Server:\n";
-+m += "\n";
-+m += "        " + hostport + "\n\n        " + vncServer + "\n";
-+m += "\n";
-+m += "on its own.\n";
-+m += "\n";
-+m += "However, it has noticed that your Web Browser and/or Java VM Plugin\n";
-+m += "has previously accepted the same certificate.  You may have set\n";
-+m += "this up permanently or just for this session, or the server\n";
-+m += "certificate was signed by a CA cert that your Web Browser or\n";
-+m += "Java VM Plugin has.\n";
-+m += "\n";
-+m += "If the VNC Server connection times out while you are reading this\n";
-+m += "dialog, then restart the connection and try again.\n";
-+m += "\n";
-+m += "Should this VNC Viewer applet now connect to the above VNC server?\n";
-+m += "\n";
-+
-+		TextArea textarea = new TextArea(m, 22, 64,
-+		    TextArea.SCROLLBARS_VERTICAL_ONLY);
-+		textarea.setEditable(false);
-+		yes = new Button("Yes");
-+		yes.addActionListener(this);
-+		no = new Button("No, Let Me See the Certificate.");
-+		no.addActionListener(this);
-+
-+		dialog.setLayout(new BorderLayout());
-+		dialog.add("North", textarea);
-+		dialog.add("Center", yes);
-+		dialog.add("South", no);
-+		dialog.pack();
-+		dialog.resize(dialog.preferredSize());
-+
-+		dialog.show();	/* block here til Yes or No pressed. */
-+		System.out.println("done show()");
-+		return;
-+	}
-+
-+	public synchronized void actionPerformed(ActionEvent evt) {
-+		System.out.println(evt.getActionCommand());
-+		if (evt.getSource() == yes) {
-+			showCertDialog = false;
-+			//dialog.dispose();
-+			dialog.hide();
-+		} else if (evt.getSource() == no) {
-+			showCertDialog = true;
-+			//dialog.dispose();
-+			dialog.hide();
-+		}
-+		System.out.println("done actionPerformed()");
-+	}
-+}
-+
-+class CertInfo {
-+	String fields[] = {"CN", "OU", "O", "L", "C"};
-+	java.security.cert.Certificate cert;
-+	String certString = "";
-+
-+	CertInfo(java.security.cert.Certificate c) {
-+		cert = c;
-+		certString = cert.toString();
-+	}
-+	
-+	String get_certinfo(String which) {
-+		int i;
-+		String cs = new String(certString);
-+		String all = "";
-+
-+		/*
-+		 * For now we simply scrape the cert string, there must
-+		 * be an API for this... perhaps optionValue?
-+		 */
-+		for (i=0; i < fields.length; i++) {
-+			int f, t, t1, t2;
-+			String sub, mat = fields[i] + "=";
-+			
-+			f = cs.indexOf(mat, 0);
-+			if (f > 0) {
-+				t1 = cs.indexOf(", ", f);
-+				t2 = cs.indexOf("\n", f);
-+				if (t1 < 0 && t2 < 0) {
-+					continue;
-+				} else if (t1 < 0) {
-+					t = t2;
-+				} else if (t2 < 0) {
-+					t = t1;
-+				} else if (t1 < t2) {
-+					t = t1;
-+				} else {
-+					t = t2;
-+				}
-+				if (t > f) {
-+					sub = cs.substring(f, t);
-+					all = all + "        " + sub + "\n";
-+					if (which.equals(fields[i])) {
-+						return sub;
-+					}
-+				}
-+			}
-+		}
-+		if (which.equals("all")) {
-+			return all;
-+		} else {
-+			return "";
-+		}
-+	}
-+}
-+
-+class Base64Coder {
-+
-+	// Mapping table from 6-bit nibbles to Base64 characters.
-+	private static char[]    map1 = new char[64];
-+	   static {
-+	      int i=0;
-+	      for (char c='A'; c<='Z'; c++) map1[i++] = c;
-+	      for (char c='a'; c<='z'; c++) map1[i++] = c;
-+	      for (char c='0'; c<='9'; c++) map1[i++] = c;
-+	      map1[i++] = '+'; map1[i++] = '/'; }
-+
-+	// Mapping table from Base64 characters to 6-bit nibbles.
-+	private static byte[]    map2 = new byte[128];
-+	   static {
-+	      for (int i=0; i<map2.length; i++) map2[i] = -1;
-+	      for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }
-+
-+	/**
-+	* Encodes a string into Base64 format.
-+	* No blanks or line breaks are inserted.
-+	* @param s  a String to be encoded.
-+	* @return   A String with the Base64 encoded data.
-+	*/
-+	public static String encodeString (String s) {
-+	   return new String(encode(s.getBytes())); }
-+
-+	/**
-+	* Encodes a byte array into Base64 format.
-+	* No blanks or line breaks are inserted.
-+	* @param in  an array containing the data bytes to be encoded.
-+	* @return    A character array with the Base64 encoded data.
-+	*/
-+	public static char[] encode (byte[] in) {
-+	   return encode(in,in.length); }
-+
-+	/**
-+	* Encodes a byte array into Base64 format.
-+	* No blanks or line breaks are inserted.
-+	* @param in   an array containing the data bytes to be encoded.
-+	* @param iLen number of bytes to process in <code>in</code>.
-+	* @return     A character array with the Base64 encoded data.
-+	*/
-+	public static char[] encode (byte[] in, int iLen) {
-+	   int oDataLen = (iLen*4+2)/3;       // output length without padding
-+	   int oLen = ((iLen+2)/3)*4;         // output length including padding
-+	   char[] out = new char[oLen];
-+	   int ip = 0;
-+	   int op = 0;
-+	   while (ip < iLen) {
-+	      int i0 = in[ip++] & 0xff;
-+	      int i1 = ip < iLen ? in[ip++] & 0xff : 0;
-+	      int i2 = ip < iLen ? in[ip++] & 0xff : 0;
-+	      int o0 = i0 >>> 2;
-+	      int o1 = ((i0 &   3) << 4) | (i1 >>> 4);
-+	      int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
-+	      int o3 = i2 & 0x3F;
-+	      out[op++] = map1[o0];
-+	      out[op++] = map1[o1];
-+	      out[op] = op < oDataLen ? map1[o2] : '='; op++;
-+	      out[op] = op < oDataLen ? map1[o3] : '='; op++; }
-+	   return out; }
-+
-+	/**
-+	* Decodes a string from Base64 format.
-+	* @param s  a Base64 String to be decoded.
-+	* @return   A String containing the decoded data.
-+	* @throws   IllegalArgumentException if the input is not valid Base64 encoded data.
-+	*/
-+	public static String decodeString (String s) {
-+	   return new String(decode(s)); }
-+
-+	/**
-+	* Decodes a byte array from Base64 format.
-+	* @param s  a Base64 String to be decoded.
-+	* @return   An array containing the decoded data bytes.
-+	* @throws   IllegalArgumentException if the input is not valid Base64 encoded data.
-+	*/
-+	public static byte[] decode (String s) {
-+	   return decode(s.toCharArray()); }
-+
-+	/**
-+	* Decodes a byte array from Base64 format.
-+	* No blanks or line breaks are allowed within the Base64 encoded data.
-+	* @param in  a character array containing the Base64 encoded data.
-+	* @return    An array containing the decoded data bytes.
-+	* @throws    IllegalArgumentException if the input is not valid Base64 encoded data.
-+	*/
-+	public static byte[] decode (char[] in) {
-+	   int iLen = in.length;
-+	   if (iLen%4 != 0) throw new IllegalArgumentException ("Length of Base64 encoded input string is not a multiple of 4.");
-+	   while (iLen > 0 && in[iLen-1] == '=') iLen--;
-+	   int oLen = (iLen*3) / 4;
-+	   byte[] out = new byte[oLen];
-+	   int ip = 0;
-+	   int op = 0;
-+	   while (ip < iLen) {
-+	      int i0 = in[ip++];
-+	      int i1 = in[ip++];
-+	      int i2 = ip < iLen ? in[ip++] : 'A';
-+	      int i3 = ip < iLen ? in[ip++] : 'A';
-+	      if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
-+		 throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
-+	      int b0 = map2[i0];
-+	      int b1 = map2[i1];
-+	      int b2 = map2[i2];
-+	      int b3 = map2[i3];
-+	      if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
-+		 throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
-+	      int o0 = ( b0       <<2) | (b1>>>4);
-+	      int o1 = ((b1 & 0xf)<<4) | (b2>>>2);
-+	      int o2 = ((b2 &   3)<<6) |  b3;
-+	      out[op++] = (byte)o0;
-+	      if (op<oLen) out[op++] = (byte)o1;
-+	      if (op<oLen) out[op++] = (byte)o2; }
-+	   return out; }
-+
-+	// Dummy constructor.
-+	private Base64Coder() {}
-+
-+}
-diff -Naur JavaViewer.orig/VncCanvas.java JavaViewer/VncCanvas.java
---- JavaViewer.orig/VncCanvas.java	2005-11-21 18:50:18.000000000 -0500
-+++ JavaViewer/VncCanvas.java	2010-11-30 22:57:50.000000000 -0500
-@@ -27,6 +27,13 @@
- import java.lang.*;
- import java.util.zip.*;
- 
-+// begin runge/x11vnc
-+import java.util.Collections;
-+// end runge/x11vnc
-+
-+// begin runge/x11vnc
-+// all the MouseWheel stuff below.
-+// end runge/x11vnc
- 
- //
- // VncCanvas is a subclass of Canvas which draws a VNC desktop on it.
-@@ -34,7 +41,7 @@
- 
- class VncCanvas
- 	extends Canvas
--	implements KeyListener, MouseListener, MouseMotionListener {
-+	implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener {
- 
- 	VncViewer viewer;
- 	RfbProto rfb;
-@@ -85,6 +92,22 @@
- 		
- 		cm24 = new DirectColorModel(24, 0xFF0000, 0x00FF00, 0x0000FF);
- 
-+// begin runge/x11vnc
-+// kludge to not show any Java cursor in the canvas since we are
-+// showing the soft cursor (should be a user setting...)
-+Cursor dot = Toolkit.getDefaultToolkit().createCustomCursor(
-+    Toolkit.getDefaultToolkit().createImage(new byte[4]), new Point(0,0),
-+    "dot");
-+this.setCursor(dot);
-+
-+// while we are at it... get rid of the keyboard traversals that
-+// make it so we can't type a Tab character:
-+this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
-+    Collections.EMPTY_SET);
-+this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
-+    Collections.EMPTY_SET);
-+// end runge/x11vnc
-+
- 		colors = new Color[256];
- 		// sf@2005 - Now Default
- 		for (int i = 0; i < 256; i++)
-@@ -186,6 +209,7 @@
- 			inputEnabled = true;
- 			addMouseListener(this);
- 			addMouseMotionListener(this);
-+			addMouseWheelListener(this);
- 			if (viewer.showControls) {
- 				viewer.buttonPanel.enableRemoteAccessControls(true);
- 			}
-@@ -193,6 +217,7 @@
- 			inputEnabled = false;
- 			removeMouseListener(this);
- 			removeMouseMotionListener(this);
-+			removeMouseWheelListener(this);
- 			if (viewer.showControls) {
- 				viewer.buttonPanel.enableRemoteAccessControls(false);
- 			}
-@@ -202,6 +227,9 @@
- 	
- 	public void setPixelFormat() throws IOException {
- 		// sf@2005 - Adding more color modes
-+		if (viewer.graftFtp) {
-+			return;
-+		}
- 		if (viewer.options.eightBitColors > 0)
- 		{
- 			viewer.options.oldEightBitColors = viewer.options.eightBitColors;
-@@ -237,6 +265,9 @@
- 		}
- 		else 
- 		{
-+// begin runge/x11vnc
-+			viewer.options.oldEightBitColors = viewer.options.eightBitColors;
-+// end runge/x11vnc
- 			rfb.writeSetPixelFormat(
- 				32,
- 				24,
-@@ -376,12 +407,14 @@
- 		// Start/stop session recording if necessary.
- 		viewer.checkRecordingStatus();
- 
--		rfb.writeFramebufferUpdateRequest(
--			0,
--			0,
--			rfb.framebufferWidth,
--			rfb.framebufferHeight,
--			false);
-+		if (!viewer.graftFtp) {
-+			rfb.writeFramebufferUpdateRequest(
-+				0,
-+				0,
-+				rfb.framebufferWidth,
-+				rfb.framebufferHeight,
-+				false);
-+		}
- 
- 		//
- 		// main dispatch loop
-@@ -390,6 +423,9 @@
- 		while (true) {
- 			// Read message type from the server.
- 			int msgType = rfb.readServerMessageType();
-+			if (viewer.ftpOnly && msgType != RfbProto.rfbFileTransfer) {
-+				System.out.println("msgType:" + msgType);
-+			}
- 
- 			// Process the message depending on its type.
- 			switch (msgType) {
-@@ -1332,6 +1368,9 @@
- 	public void mouseDragged(MouseEvent evt) {
- 		processLocalMouseEvent(evt, true);
- 	}
-+	public void mouseWheelMoved(MouseWheelEvent evt) {
-+		processLocalMouseWheelEvent(evt);
-+	}
- 
- 	public void processLocalKeyEvent(KeyEvent evt) {
- 		if (viewer.rfb != null && rfb.inNormalProtocol) {
-@@ -1367,6 +1406,19 @@
- 		evt.consume();
- 	}
- 
-+	public void processLocalMouseWheelEvent(MouseWheelEvent evt) {
-+		if (viewer.rfb != null && rfb.inNormalProtocol) {
-+			synchronized(rfb) {
-+			try {
-+				rfb.writeWheelEvent(evt);
-+			} catch (Exception e) {
-+				e.printStackTrace();
-+			}
-+				rfb.notify();
-+			}
-+		}
-+	}
-+
- 	public void processLocalMouseEvent(MouseEvent evt, boolean moved) {
- 		if (viewer.rfb != null && rfb.inNormalProtocol) {
- 			if (moved) {
-@@ -1532,9 +1584,14 @@
- 							else
- 							{
- 								result =
--									0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF)
--										<< 16 | (pixBuf[i * 4 + 2] & 0xFF)
--										<< 8 | (pixBuf[i * 4 + 3] & 0xFF);
-+// begin runge/x11vnc
-+//									0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF)
-+//										<< 16 | (pixBuf[i * 4 + 2] & 0xFF)
-+//										<< 8 | (pixBuf[i * 4 + 3] & 0xFF);
-+									0xFF000000 | (pixBuf[i * 4 + 2] & 0xFF)
-+										<< 16 | (pixBuf[i * 4 + 1] & 0xFF)
-+										<< 8 | (pixBuf[i * 4 + 0] & 0xFF);
-+// end runge/x11vnc
- 							}
- 						} else {
- 							result = 0; // Transparent pixel
-@@ -1565,9 +1622,14 @@
- 						else
- 						{
- 							result =
--								0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF)
--									<< 16 | (pixBuf[i * 4 + 2] & 0xFF)
--									<< 8 | (pixBuf[i * 4 + 3] & 0xFF);
-+// begin runge/x11vnc
-+//								0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF)
-+//									<< 16 | (pixBuf[i * 4 + 2] & 0xFF)
-+//									<< 8 | (pixBuf[i * 4 + 3] & 0xFF);
-+								0xFF000000 | (pixBuf[i * 4 + 2] & 0xFF)
-+									<< 16 | (pixBuf[i * 4 + 1] & 0xFF)
-+									<< 8 | (pixBuf[i * 4 + 0] & 0xFF);
-+// end runge/x11vnc
- 						}
- 					} else {
- 						result = 0; // Transparent pixel
-diff -Naur JavaViewer.orig/VncViewer.java JavaViewer/VncViewer.java
---- JavaViewer.orig/VncViewer.java	2006-05-24 15:14:40.000000000 -0400
-+++ JavaViewer/VncViewer.java	2010-03-27 18:00:28.000000000 -0400
-@@ -41,6 +41,7 @@
- import java.io.*;
- import java.net.*;
- import javax.swing.*;
-+import java.util.Date;
- 
- public class VncViewer extends java.applet.Applet
-   implements java.lang.Runnable, WindowListener {
-@@ -80,11 +81,11 @@
-   GridBagLayout gridbag;
-   ButtonPanel buttonPanel;
-   AuthPanel authenticator;
--  VncCanvas vc;
-+  VncCanvas vc = null;
-   OptionsFrame options;
-   ClipboardFrame clipboard;
-   RecordingFrame rec;
--  FTPFrame ftp; // KMC: FTP Frame declaration
-+  FTPFrame ftp = null; // KMC: FTP Frame declaration
- 
-   // Control session recording.
-   Object recordingSync;
-@@ -96,7 +97,7 @@
- 
-   // Variables read from parameter values.
-   String host;
--  int port;
-+  int port, vncserverport;
-   String passwordParam;
-   String encPasswordParam;
-   boolean showControls;
-@@ -115,28 +116,75 @@
-   int i;
-   // mslogon support 2 end
- 
-+// begin runge/x11vnc
-+boolean disableSSL;
-+boolean GET;
-+String CONNECT;
-+String urlPrefix;
-+String httpsPort;
-+String oneTimeKey;
-+String serverCert;
-+String ftpDropDown;
-+String proxyHost;
-+String proxyPort;
-+boolean forceProxy;
-+boolean ignoreProxy;
-+boolean trustAllVncCerts;
-+boolean trustUrlVncCert;
-+boolean debugCerts;
-+boolean debugKeyboard;
-+boolean mapF5_to_atsign;
-+boolean forbid_Ctrl_Alt;
-+
-+boolean ignoreMSLogonCheck;
-+boolean delayAuthPanel;
-+boolean ftpOnly;
-+boolean graftFtp;
-+boolean dsmActive;
-+
-+boolean gotAuth;
-+int authGot;
-+// end runge/x11vnc
-+
-+
-   //
-   // init()
-   //
- 
-+public void ftp_init() {
-+	boolean show = false;
-+	if (ftp != null) {
-+		show = true;
-+	}
-+	ftp = null;
-+
-+	ftp = new FTPFrame(this); // KMC: FTPFrame creation
-+
-+	if (show) {
-+		ftp.doOpen();
-+		rfb.readServerDriveList();
-+	}
-+}
-+
-   public void init() {
- 
-     readParameters();
- 
-     if (inSeparateFrame) {
--      vncFrame = new Frame("Ultr@VNC");
--      if (!inAnApplet) {
--	vncFrame.add("Center", this);
--      }
--      vncContainer = vncFrame;
-+	vncFrame = new Frame("Ultr@VNC");
-+	if (!inAnApplet) {
-+		vncFrame.add("Center", this);
-+	}
-+	vncContainer = vncFrame;
-     } else {
--      vncContainer = this;
-+	vncContainer = this;
-     }
- 
-     recordingSync = new Object();
- 
-     options = new OptionsFrame(this);
-     clipboard = new ClipboardFrame(this);
-+
-     // authenticator = new AuthPanel(false);   // mslogon support : go to connectAndAuthenticate()
-     if (RecordingFrame.checkSecurity())
-       rec = new RecordingFrame(this);
-@@ -147,10 +195,11 @@
-     cursorUpdatesDef = null;
-     eightBitColorsDef = null;
- 
--    if (inSeparateFrame)
-+    if (inSeparateFrame && vncFrame != null)
-       vncFrame.addWindowListener(this);
- 
--    ftp = new FTPFrame(this); // KMC: FTPFrame creation
-+    ftp_init();
-+
-     rfbThread = new Thread(this);
-     rfbThread.start();
-   }
-@@ -186,6 +235,30 @@
-       gbc.weightx = 1.0;
-       gbc.weighty = 1.0;
- 
-+	if (ftpOnly) {
-+		if (showControls) {
-+			buttonPanel.enableButtons();
-+		}
-+		ActionListener taskPerformer = new ActionListener() {
-+			public void actionPerformed(ActionEvent evt) {
-+				vncFrame.setVisible(false);
-+				ftp.setSavedLocations();
-+				if (ftp.isVisible()) {
-+					ftp.doClose();
-+				} else {
-+					ftp.doOpen();
-+				}
-+				rfb.readServerDriveList();
-+			}
-+		};
-+		Timer t = new Timer(300, taskPerformer);
-+		t.setRepeats(false);
-+		t.start();
-+		
-+		vc.processNormalProtocol();
-+		return;
-+	}
-+
- 	// Add ScrollPanel to applet mode
- 
- 	// Create a panel which itself is resizeable and can hold
-@@ -286,6 +359,24 @@
- 
-   void connectAndAuthenticate() throws Exception {
- 
-+	if (graftFtp) {
-+		rfb = new RfbProto(host, port, this);
-+		rfb.desktopName = "ftponly";
-+		rfb.framebufferWidth  = 12;
-+		rfb.framebufferHeight = 12;
-+		rfb.bitsPerPixel = 32;
-+		rfb.depth = 24;
-+		rfb.trueColour = true;
-+		rfb.redMax   = 255;
-+		rfb.greenMax = 255;
-+		rfb.blueMax  = 255;
-+		rfb.redShift   = 16;
-+		rfb.greenShift = 8;
-+		rfb.blueShift  = 0;
-+		rfb.inNormalProtocol = true;
-+		return;
-+	}
-+
-     // If "ENCPASSWORD" parameter is set, decrypt the password into
-     // the passwordParam string.
- 
-@@ -336,7 +427,22 @@
-     //
- 
-     
--    prologueDetectAuthProtocol() ;
-+// begin runge/x11vnc
-+	gotAuth = false;
-+	if (delayAuthPanel) {
-+      		if (tryAuthenticate(null, null)) {
-+			if (inSeparateFrame) {
-+				vncFrame.pack();
-+				vncFrame.show();
-+			}
-+      			return;
-+      		}
-+	}
-+//  prologueDetectAuthProtocol() ;
-+    if (ignoreMSLogonCheck == false) {
-+        prologueDetectAuthProtocol() ;
-+    }
-+// end runge/x11vnc
- 
-     authenticator = new AuthPanel(mslogon);
-     
-@@ -371,6 +477,7 @@
-      //mslogon support end
-     }
- 
-+    int tries = 0;
-     while (true) {
-       // Wait for user entering a password, or a username and a password
-       synchronized(authenticator) {
-@@ -390,6 +497,13 @@
- 	break;
-       //mslogon support end
- 
-+// begin runge/x11vnc
-+      gotAuth = false;
-+      if (++tries > 2) {
-+         throw new Exception("Incorrect password entered " + tries + " times.");
-+      }
-+// end runge/x11vnc
-+
-       // Retry on authentication failure.
-       authenticator.retry();
-     }
-@@ -405,9 +519,11 @@
- 
-   void prologueDetectAuthProtocol() throws Exception {
- 
--    rfb = new RfbProto(host, port, this);
-+	if (!gotAuth) {
-+		rfb = new RfbProto(host, port, this);
- 
--    rfb.readVersionMsg();
-+		rfb.readVersionMsg();
-+	}
- 
-     System.out.println("RFB server supports protocol version " +
- 		       rfb.serverMajor + "." + rfb.serverMinor);
-@@ -431,16 +547,36 @@
- 
-   boolean tryAuthenticate(String us, String pw) throws Exception {
-     
--    rfb = new RfbProto(host, port, this);
-+	int authScheme;
- 
--    rfb.readVersionMsg();
-+	if (!gotAuth) {
-+		rfb = new RfbProto(host, port, this);
- 
--    System.out.println("RFB server supports protocol version " +
--		       rfb.serverMajor + "." + rfb.serverMinor);
-+		rfb.readVersionMsg();
- 
--    rfb.writeVersionMsg();
-+		System.out.println("RFB server supports protocol version: " +
-+			       rfb.serverMajor + "." + rfb.serverMinor);
- 
--    int authScheme = rfb.readAuthScheme();
-+		rfb.writeVersionMsg();
-+
-+		authScheme = rfb.readAuthScheme();
-+
-+		gotAuth = true;
-+		authGot = authScheme;
-+	} else {
-+		authScheme = authGot;
-+	}
-+// begin runge/x11vnc
-+	if (delayAuthPanel && pw == null) {
-+		if (authScheme == RfbProto.NoAuth) {
-+			System.out.println("No authentication needed");
-+			return true;
-+		} else {
-+			return false;
-+		}
-+	}
-+System.out.println("as: " + authScheme);
-+// end runge/x11vnc
- 
-     switch (authScheme) {
- 
-@@ -629,6 +765,10 @@
- 
-   void doProtocolInitialisation() throws IOException {
- 
-+	if (graftFtp) {
-+		return;
-+	}
-+
-     rfb.writeClientInit();
- 
-     rfb.readServerInit();
-@@ -774,9 +914,28 @@
- 	fatalError("HOST parameter not specified");
-       }
-     }
-+    Date d = new Date();
-+    System.out.println("-\nSSL VNC Java Applet starting.  " + d);
- 
--    String str = readParameter("PORT", true);
--    port = Integer.parseInt(str);
-+    port = 0;
-+    String str = readParameter("PORT", false);
-+    if (str != null) {
-+	port = Integer.parseInt(str);
-+    }
-+    // When there is a proxy VNCSERVERPORT may be inaccessible (inside firewall).
-+    vncserverport = 0;
-+    str = readParameter("VNCSERVERPORT", false);
-+    if (str != null) {
-+	vncserverport = Integer.parseInt(str);
-+    }
-+    if (port == 0 && vncserverport == 0) {
-+	fatalError("Neither PORT nor VNCSERVERPORT parameters specified");
-+    }
-+    if (port == 0) {
-+	// Nevertheless, fall back to vncserverport if we have to.
-+	System.out.println("using vncserverport: '" + vncserverport + "' for PORT.");
-+	port = vncserverport;
-+    }
- 
-     if (inAnApplet) {
-       str = readParameter("Open New Window", false);
-@@ -804,6 +963,158 @@
-     deferScreenUpdates = readIntParameter("Defer screen updates", 20);
-     deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
-     deferUpdateRequests = readIntParameter("Defer update requests", 50);
-+
-+// begin runge/x11vnc
-+    // SSL
-+    disableSSL = false;
-+    str = readParameter("DisableSSL", false);
-+    if (str != null && str.equalsIgnoreCase("Yes"))
-+      disableSSL = true;
-+
-+    httpsPort = readParameter("httpsPort", false);
-+
-+    // Extra GET, CONNECT string:
-+    CONNECT = readParameter("CONNECT", false);
-+    if (CONNECT != null) {
-+	CONNECT = CONNECT.replaceAll(" ", ":");
-+    }
-+
-+    GET = false;
-+    str = readParameter("GET", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+      GET = true;
-+    }
-+    if (str != null && str.equalsIgnoreCase("1")) {
-+      GET = true;
-+    }
-+
-+    urlPrefix = readParameter("urlPrefix", false);
-+    if (urlPrefix != null) {
-+	urlPrefix = urlPrefix.replaceAll("%2F", "/");
-+	urlPrefix = urlPrefix.replaceAll("%2f", "/");
-+	urlPrefix = urlPrefix.replaceAll("_2F_", "/");
-+	if (urlPrefix.indexOf("/") != 0) {
-+		urlPrefix = "/" + urlPrefix;
-+	}
-+    } else {
-+    	urlPrefix = "";
-+    }
-+    System.out.println("urlPrefix: '" + urlPrefix + "'");
-+
-+    ftpDropDown = readParameter("ftpDropDown", false);
-+    if (ftpDropDown != null) {
-+	ftpDropDown = ftpDropDown.replaceAll("%2F", "/");
-+	ftpDropDown = ftpDropDown.replaceAll("%2f", "/");
-+	ftpDropDown = ftpDropDown.replaceAll("_2F_", "/");
-+	ftpDropDown = ftpDropDown.replaceAll("%20", " ");
-+	System.out.println("ftpDropDown: '" + ftpDropDown + "'");
-+    }
-+
-+
-+    oneTimeKey = readParameter("oneTimeKey", false);
-+    if (oneTimeKey != null) {
-+    	System.out.println("oneTimeKey is set.");
-+    }
-+
-+    serverCert = readParameter("serverCert", false);
-+    if (serverCert != null) {
-+    	System.out.println("serverCert is set.");
-+    }
-+
-+    forceProxy = false;
-+    proxyHost = null;
-+    proxyPort = null;
-+    str = readParameter("forceProxy", false);
-+    if (str != null) {
-+	    if (str.equalsIgnoreCase("Yes")) {
-+		forceProxy = true;
-+	    } else if (str.equalsIgnoreCase("No")) {
-+		forceProxy = false;
-+	    } else {
-+		forceProxy = true;
-+		String[] pieces = str.split(" ");
-+		proxyHost = new String(pieces[0]);
-+		if (pieces.length >= 2) {
-+			proxyPort = new String(pieces[1]);
-+		} else {
-+			proxyPort = new String("8080");
-+		}
-+	    }
-+    }
-+    str = readParameter("proxyHost", false);
-+    if (str != null) {
-+	proxyHost = new String(str);
-+    }
-+    str = readParameter("proxyPort", false);
-+    if (str != null) {
-+	proxyPort = new String(str);
-+    }
-+    if (proxyHost != null && proxyPort == null) {
-+    	proxyPort = new String("8080");
-+    }
-+
-+    ignoreProxy = false;
-+    str = readParameter("ignoreProxy", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	ignoreProxy = true;
-+    }
-+
-+    trustAllVncCerts = false;
-+    str = readParameter("trustAllVncCerts", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	trustAllVncCerts = true;
-+    }
-+    trustUrlVncCert = false;
-+    str = readParameter("trustUrlVncCert", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	trustUrlVncCert = true;
-+    }
-+    debugCerts = false;
-+    str = readParameter("debugCerts", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	debugCerts = true;
-+    }
-+    debugKeyboard = false;
-+    str = readParameter("debugKeyboard", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	debugKeyboard = true;
-+    }
-+    mapF5_to_atsign = false;
-+    str = readParameter("mapF5_to_atsign", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	mapF5_to_atsign = true;
-+    }
-+    forbid_Ctrl_Alt = false;
-+    str = readParameter("forbid_Ctrl_Alt", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	forbid_Ctrl_Alt = true;
-+    }
-+    ignoreMSLogonCheck = false;
-+    str = readParameter("ignoreMSLogonCheck", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	ignoreMSLogonCheck = true;
-+    }
-+    ftpOnly = false;
-+    str = readParameter("ftpOnly", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	ftpOnly = true;
-+    }
-+    graftFtp = false;
-+    str = readParameter("graftFtp", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	graftFtp = true;
-+    }
-+    dsmActive = false;
-+    str = readParameter("dsmActive", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	dsmActive = true;
-+    }
-+    delayAuthPanel = false;
-+    str = readParameter("delayAuthPanel", false);
-+    if (str != null && str.equalsIgnoreCase("Yes")) {
-+	delayAuthPanel = true;
-+    }
-+// end runge/x11vnc
-   }
- 
-   public String readParameter(String name, boolean required) {

+ 54 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/CONTRIBUTING.md

@@ -0,0 +1,54 @@
+How to contribute to noVNC
+==========================
+
+We accept code via pull requests on GitHub.  There are several guidelines that
+we expect contributors submitting code requests to follow.  If you have issues
+following any of these guidelines, feel free to drop us a line by leaving a
+comment in the code request or sending us an email.
+
+Contributing Guidelines
+-----------------------
+
+* While we don't have an official coding style guide, please try to follow
+  the general coding style of the existing code.
+** Use four spaces instead of tabs 
+** prefix private variables and functions with an `_`
+
+* Please try to include unit tests for your code.  For instance, if you
+  introduce a new encoding, add a test to `tests/test.rfb.js` under the
+  "Encoding Handlers" section (basically, input a small pattern in your
+  encoding and make sure the pattern gets displayed correctly).  If you
+  fix a bug, try to add a unit test that would have caught that bug
+  (if possible -- some bugs, especially visual ones, are hard to test for).
+
+* Squash your commits down in to a clean commit history.  For instance, there
+  should not be "cleanup" commits where you fix issues in previous commits in
+  the same pull request.  Before you go to commit, use `git rebase -i` to
+  squash these changes into the relevant commits.  For instance, a good commit
+  history might look like "Added support for FOO encoding, Added support for
+  BAR message, Placed Button in UI to Trigger BAR" (where each comma denotes
+  a separate commit).
+
+* Add both a title and description to your commit, if possible.  Place more
+  detail on what you did in the description.
+
+Running the unit tests
+----------------------
+
+There are two ways to run the unit tests.  For both ways, you should first run
+`npm install` (not as root).
+
+The first way to run the tests is to run `npm test`.  This will run all the
+tests in the headless PhantomJS browser (which uses WebKit).
+
+The second way to run the tests is using the `tests/run_from_console.js` file.
+This way is a bit more flexible, and can provide more information about what
+went wrong.  To run all the tests, simply run `tests/run_from_console.js`.
+To run a specific test file, you can use the `-t path/to/test/file.js` option.
+If you wish to simply generate the HTML for the test, use the `-g` option, and
+the path to the temporary HTML file will be written to standard out.  To open
+this file in your default browser automatically, pass the `-o` option as well.
+More information can be found by passing the `--help` or `-h` option.
+
+
+Thanks, and happy coding!

+ 84 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/LICENSE.txt

@@ -0,0 +1,84 @@
+noVNC is Copyright (C) 2011 Joel Martin <github@martintribe.org>
+
+The noVNC core library files are licensed under the MPL 2.0 (Mozilla
+Public License 2.0). The noVNC core library is composed of the
+Javascript code necessary for full noVNC operation. This includes (but
+is not limited to):
+
+    include/base64.js
+    include/des.js
+    include/display.js
+    include/input.js
+    include/keysym.js
+    include/logo.js
+    include/playback.js
+    include/rfb.js
+    include/ui.js
+    include/util.js
+    include/websock.js
+    include/webutil.js
+
+The HTML, CSS, font and images files that included with the noVNC
+source distibution (or repository) are not considered part of the
+noVNC core library and are licensed under more permissive licenses.
+The intent is to allow easy integration of noVNC into existing web
+sites and web applications.
+
+The HTML, CSS, font and image files are licensed as follows:
+
+    *.html                     : 2-Clause BSD license
+
+    include/*.css              : 2-Clause BSD license
+
+    include/Orbitron*          : SIL Open Font License 1.1
+                                 (Copyright 2009 Matt McInerney)
+
+    images/                    : Creative Commons Attribution-ShareAlike
+                                 http://creativecommons.org/licenses/by-sa/3.0/
+
+Some portions of noVNC are copyright to their individual authors.
+Please refer to the individual source files and/or to the noVNC commit
+history: https://github.com/kanaka/noVNC/commits/master
+
+The are several files and projects that have been incorporated into
+the noVNC core library. Here is a list of those files and the original
+licenses (all MPL 2.0 compatible):
+
+    include/base64.js          : MPL 2.0
+   
+    include/des.js             : Various BSD style licenses
+
+    include/chrome-app/tcp-stream.js
+                               : Apache 2.0 license
+
+    utils/websockify
+    utils/websocket.py         : LGPL 3
+    
+    utils/inflator.partial.js
+    include/inflator.js        : MIT (for pako)
+
+Any other files not mentioned above are typically marked with
+a copyright/license header at the top of the file. The default noVNC
+license is MPL-2.0.
+
+The following license texts are included:
+
+    docs/LICENSE.MPL-2.0
+    docs/LICENSE.LGPL-3 and
+    docs/LICENSE.GPL-3
+    docs/LICENSE.OFL-1.1
+    docs/LICENSE.BSD-3-Clause (New BSD)
+    docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD)
+    docs/LICENSE.zlib
+    docs/LICENSE.Apache-2.0
+    docs/LICENSE.pako
+
+Or alternatively the license texts may be found here:
+
+    http://www.mozilla.org/MPL/2.0/
+    http://www.gnu.org/licenses/lgpl.html and
+    http://www.gnu.org/licenses/gpl.html
+    http://scripts.sil.org/OFL
+    http://en.wikipedia.org/wiki/BSD_licenses
+    http://www.gzip.org/zlib/zlib_license.html
+    http://www.apache.org/licenses/LICENSE-2.0.html

+ 132 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/README.md

@@ -0,0 +1,132 @@
+## noVNC: HTML5 VNC Client
+
+[![Build Status](https://travis-ci.org/kanaka/noVNC.svg?branch=master)](https://travis-ci.org/kanaka/noVNC)
+
+### Description
+
+noVNC is a HTML5 VNC client that runs well in any modern browser
+including mobile browsers (iPhone/iPad and Android).
+
+Many companies/projects have integrated noVNC including [Ganeti Web
+Manager](http://code.osuosl.org/projects/ganeti-webmgr),
+[OpenStack](http://www.openstack.org),
+[OpenNebula](http://opennebula.org/), and
+[LibVNCServer](http://libvncserver.sourceforge.net). See [the Projects
+and Companies wiki
+page](https://github.com/kanaka/noVNC/wiki/ProjectsCompanies-using-noVNC)
+for a more complete list with additional info and links.
+
+### News/help/contact
+
+Notable commits, announcements and news are posted to
+<a href="http://www.twitter.com/noVNC">@noVNC</a>
+
+If you are a noVNC developer/integrator/user (or want to be) please
+join the <a
+href="https://groups.google.com/forum/?fromgroups#!forum/novnc">noVNC
+discussion group</a>
+
+Bugs and feature requests can be submitted via [github
+issues](https://github.com/kanaka/noVNC/issues). If you are looking
+for a place to start contributing to noVNC, a good place to start
+would be the issues that are marked as
+["patchwelcome"](https://github.com/kanaka/noVNC/issues?labels=patchwelcome).
+
+If you want to show appreciation for noVNC you could donate to a great
+non-profits such as: [Compassion
+International](http://www.compassion.com/), [SIL](http://www.sil.org),
+[Habitat for Humanity](http://www.habitat.org), [Electronic Frontier
+Foundation](https://www.eff.org/), [Against Malaria
+Foundation](http://www.againstmalaria.com/), [Nothing But
+Nets](http://www.nothingbutnets.net/), etc. Please tweet <a
+href="http://www.twitter.com/noVNC">@noVNC</a> if you do.
+
+
+### Features
+
+* Supports all modern browsers including mobile (iOS, Android)
+* Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG
+* WebSocket SSL/TLS encryption (i.e. "wss://") support
+* 24-bit true color and 8 bit colour mapped
+* Supports desktop resize notification/pseudo-encoding
+* Local or remote cursor
+* Clipboard copy/paste
+* Clipping or scolling modes for large remote screens
+* Easy site integration and theming (3 example themes included)
+* Licensed under the [MPL 2.0](http://www.mozilla.org/MPL/2.0/)
+
+### Screenshots
+
+Running in Chrome before and after connecting:
+
+<img src="http://kanaka.github.com/noVNC/img/noVNC-5.png" width=400>&nbsp;<img src="http://kanaka.github.com/noVNC/img/noVNC-7.jpg" width=400>
+
+See more screenshots <a href="http://kanaka.github.com/noVNC/screenshots.html">here</a>.
+
+
+### Browser Requirements
+
+* HTML5 Canvas (with createImageData): Chrome, Firefox 3.6+, iOS
+  Safari, Opera 11+, Internet Explorer 9+, etc.
+
+* HTML5 WebSockets and Typed Arrays
+
+* Fast Javascript Engine: this is not strictly a requirement, but
+  without a fast Javascript engine, noVNC might be painfully slow.
+
+* See the more detailed [browser compatibility wiki page](https://github.com/kanaka/noVNC/wiki/Browser-support).
+
+
+### Server Requirements
+
+Unless you are using a VNC server with support for WebSockets
+connections (such as
+[x11vnc/libvncserver](http://libvncserver.sourceforge.net/),
+[QEMU](http://www.qemu.org/), or
+[PocketVNC](http://www.pocketvnc.com/blog/?page_id=866)), you need to
+use a WebSockets to TCP socket proxy. There is a python proxy included
+('websockify').
+
+
+### Quick Start
+
+* Use the launch script to start a mini-webserver and the WebSockets
+  proxy (websockify). The `--vnc` option is used to specify the location of
+  a running VNC server:
+
+    `./utils/launch.sh --vnc localhost:5901`
+
+* Point your browser to the cut-and-paste URL that is output by the
+  launch script. Enter a password if the VNC server has one
+  configured. Hit the Connect button and enjoy!
+
+
+### Other Pages
+
+* [Encrypted Connections](https://github.com/kanaka/websockify/wiki/Encrypted-Connections). How to setup websockify so that you can use encrypted connections from noVNC.
+
+* [Advanced Usage](https://github.com/kanaka/noVNC/wiki/Advanced-usage). Starting a VNC server, advanced websockify usage, etc.
+
+* [Integrating noVNC](https://github.com/kanaka/noVNC/wiki/Integration) into existing projects.
+
+* [Troubleshooting noVNC](https://github.com/kanaka/noVNC/wiki/Troubleshooting) problems.
+
+
+### Authors/Contributors
+
+* Core team:
+    * [Joel Martin](https://github.com/kanaka)
+    * [Samuel Mannehed](https://github.com/samhed) (Cendio)
+    * [Peter Åstrand](https://github.com/astrand) (Cendio)
+    * [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack)
+
+* Notable contributions:
+    * UI and Icons : Chris Gordon
+    * Original Logo : Michael Sersen
+    * tight encoding : Michael Tinglof (Mercuri.ca)
+
+* Included libraries:
+    * as3crypto : Henri Torgemane (code.google.com/p/as3crypto)
+    * base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net)
+    * DES : Dave Zimmerman (Widget Workshop), Jef Poskanzer (ACME Labs)
+    * Pako : Vitaly Puzrin (https://github.com/nodeca/pako)

+ 0 - 56
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/error-handler.js

@@ -1,56 +0,0 @@
-// NB: this should *not* be included as a module until we have
-// native support in the browsers, so that our error handler
-// can catch script-loading errors.
-
-
-(function(){
-    "use strict";
-
-    // Fallback for all uncought errors
-    function handleError (event, err) {
-        try {
-            var msg = document.getElementById('noVNC_fallback_errormsg');
-
-            // Only show the initial error
-            if (msg.hasChildNodes()) {
-                return false;
-            }
-
-            var div = document.createElement("div");
-            div.classList.add('noVNC_message');
-            div.appendChild(document.createTextNode(event.message));
-            msg.appendChild(div);
-
-            if (event.filename) {
-                div = document.createElement("div");
-                div.className = 'noVNC_location';
-                var text = event.filename;
-                if (event.lineno !== undefined) {
-                    text += ":" + event.lineno;
-                    if (event.colno !== undefined) {
-                        text += ":" + event.colno;
-                    }
-                }
-                div.appendChild(document.createTextNode(text));
-                msg.appendChild(div);
-            }
-
-            if (err && (err.stack !== undefined)) {
-                div = document.createElement("div");
-                div.className = 'noVNC_stack';
-                div.appendChild(document.createTextNode(err.stack));
-                msg.appendChild(div);
-            }
-
-            document.getElementById('noVNC_fallback_error')
-                .classList.add("noVNC_open");
-        } catch (exc) {
-            document.write("noVNC encountered an error.");
-        }
-        // Don't return true since this would prevent the error
-        // from being printed to the browser console.
-        return false;
-    }
-    window.addEventListener('error', function (evt) { handleError(evt, evt.error); });
-    window.addEventListener('unhandledrejection', function (evt) { handleError(evt.reason, evt.reason); });
-})();

+ 0 - 92
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/alt.svg

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="alt.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="18.205425"
-     inkscape:cy="17.531398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <g
-       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       id="text5290">
-      <path
-         d="m 9.9560547,1042.3329 -2.9394531,0 -0.4638672,1.3281 -1.8896485,0 2.7001953,-7.29 2.241211,0 2.7001958,7.29 -1.889649,0 -0.4589843,-1.3281 z m -2.4707031,-1.3526 1.9970703,0 -0.9960938,-2.9003 -1.0009765,2.9003 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5340" />
-      <path
-         d="m 13.188477,1036.0634 1.748046,0 0,7.5976 -1.748046,0 0,-7.5976 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5342" />
-      <path
-         d="m 18.535156,1036.6395 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151367,0.5176 0.151368,0.1318 0.600586,0.1318 l 0.898438,0 0,1.25 -1.499024,0 q -1.035156,0 -1.469726,-0.4297 -0.429688,-0.4345 -0.429688,-1.4697 l 0,-2.3193 -0.86914,0 0,-1.25 0.86914,0 0,-1.5528 1.748047,0 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5344" />
-    </g>
-  </g>
-</svg>

+ 0 - 106
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/clipboard.svg

@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="clipboard.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="15.366606"
-     inkscape:cy="16.42981"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 9,6 6,6 C 5.4459889,6 5,6.4459889 5,7 l 0,13 c 0,0.554011 0.4459889,1 1,1 l 13,0 c 0.554011,0 1,-0.445989 1,-1 L 20,7 C 20,6.4459889 19.554011,6 19,6 l -3,0"
-       transform="translate(0,1027.3622)"
-       id="rect6083"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cssssssssc" />
-    <rect
-       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect6085"
-       width="7"
-       height="4"
-       x="9"
-       y="1031.3622"
-       ry="1.00002" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
-       d="m 8.5071212,1038.8622 7.9999998,0"
-       id="path6087"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
-       d="m 8.5071212,1041.8622 3.9999998,0"
-       id="path6089"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
-       d="m 8.5071212,1044.8622 5.9999998,0"
-       id="path6091"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>

+ 0 - 96
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/connect.svg

@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="connect.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="37.14834"
-     inkscape:cy="1.9525926"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <g
-       id="g5103"
-       transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,-729.15757,315.8823)">
-      <path
-         sodipodi:nodetypes="cssssc"
-         inkscape:connector-curvature="0"
-         id="rect5096"
-         d="m 11,1040.3622 -5,0 c -1.108,0 -2,-0.892 -2,-2 l 0,-4 c 0,-1.108 0.892,-2 2,-2 l 5,0"
-         style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 14,1032.3622 5,0 c 1.108,0 2,0.892 2,2 l 0,4 c 0,1.108 -0.892,2 -2,2 l -5,0"
-         id="path5099"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cssssc" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path5101"
-         d="m 9,1036.3622 7,0"
-         style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    </g>
-  </g>
-</svg>

+ 0 - 96
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrl.svg

@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="ctrl.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="18.205425"
-     inkscape:cy="17.531398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <g
-       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       id="text5290">
-      <path
-         d="m 9.1210938,1043.1898 q -0.5175782,0.2686 -1.0791016,0.4053 -0.5615235,0.1367 -1.171875,0.1367 -1.8212891,0 -2.8857422,-1.0156 -1.0644531,-1.0205 -1.0644531,-2.7637 0,-1.748 1.0644531,-2.7637 1.0644531,-1.0205 2.8857422,-1.0205 0.6103515,0 1.171875,0.1368 0.5615234,0.1367 1.0791016,0.4052 l 0,1.5088 q -0.522461,-0.3564 -1.0302735,-0.5224 -0.5078125,-0.1661 -1.0693359,-0.1661 -1.0058594,0 -1.5820313,0.6446 -0.5761719,0.6445 -0.5761719,1.7773 0,1.1279 0.5761719,1.7725 0.5761719,0.6445 1.5820313,0.6445 0.5615234,0 1.0693359,-0.166 0.5078125,-0.166 1.0302735,-0.5225 l 0,1.5088 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5370" />
-      <path
-         d="m 12.514648,1036.5687 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151368,0.5176 0.151367,0.1318 0.600586,0.1318 l 0.898437,0 0,1.25 -1.499023,0 q -1.035157,0 -1.469727,-0.4297 -0.429687,-0.4345 -0.429687,-1.4697 l 0,-2.3193 -0.8691411,0 0,-1.25 0.8691411,0 0,-1.5528 1.748046,0 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5372" />
-      <path
-         d="m 19.453125,1039.6107 q -0.229492,-0.1074 -0.458984,-0.1562 -0.22461,-0.054 -0.454102,-0.054 -0.673828,0 -1.040039,0.4345 -0.361328,0.4297 -0.361328,1.2354 l 0,2.5195 -1.748047,0 0,-5.4687 1.748047,0 0,0.8984 q 0.336914,-0.5371 0.771484,-0.7813 0.439453,-0.249 1.049805,-0.249 0.08789,0 0.19043,0.01 0.102539,0 0.297851,0.029 l 0.0049,1.582 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5374" />
-      <path
-         d="m 20.332031,1035.9926 1.748047,0 0,7.5976 -1.748047,0 0,-7.5976 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5376" />
-    </g>
-  </g>
-</svg>

+ 0 - 100
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrlaltdel.svg

@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="ctrlaltdel.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8"
-     inkscape:cx="11.135667"
-     inkscape:cy="16.407428"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <rect
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5253"
-       width="5"
-       height="5.0000172"
-       x="16"
-       y="1031.3622"
-       ry="1.0000174" />
-    <rect
-       y="1043.3622"
-       x="4"
-       height="5.0000172"
-       width="5"
-       id="rect5255"
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       ry="1.0000174" />
-    <rect
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5257"
-       width="5"
-       height="5.0000172"
-       x="13"
-       y="1043.3622"
-       ry="1.0000174" />
-  </g>
-</svg>

+ 0 - 94
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/disconnect.svg

@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="disconnect.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="25.05707"
-     inkscape:cy="11.594858"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <g
-       id="g5171"
-       transform="translate(-24.062499,-6.15775e-4)">
-      <path
-         id="path5110"
-         transform="translate(0,1027.3622)"
-         d="m 39.744141,3.4960938 c -0.769923,0 -1.539607,0.2915468 -2.121094,0.8730468 l -2.566406,2.5664063 1.414062,1.4140625 2.566406,-2.5664063 c 0.403974,-0.404 1.010089,-0.404 1.414063,0 l 2.828125,2.828125 c 0.40398,0.4039 0.403907,1.0101621 0,1.4140629 l -2.566406,2.566406 1.414062,1.414062 2.566406,-2.566406 c 1.163041,-1.1629 1.162968,-3.0791874 0,-4.2421874 L 41.865234,4.3691406 C 41.283747,3.7876406 40.514063,3.4960937 39.744141,3.4960938 Z M 39.017578,9.015625 a 1.0001,1.0001 0 0 0 -0.6875,0.3027344 l -0.445312,0.4453125 1.414062,1.4140621 0.445313,-0.445312 A 1.0001,1.0001 0 0 0 39.017578,9.015625 Z m -6.363281,0.7070312 a 1.0001,1.0001 0 0 0 -0.6875,0.3027348 L 28.431641,13.5625 c -1.163042,1.163 -1.16297,3.079187 0,4.242188 l 2.828125,2.828124 c 1.162974,1.163101 3.079213,1.163101 4.242187,0 l 3.535156,-3.535156 a 1.0001,1.0001 0 1 0 -1.414062,-1.414062 l -3.535156,3.535156 c -0.403974,0.404 -1.010089,0.404 -1.414063,0 l -2.828125,-2.828125 c -0.403981,-0.404 -0.403908,-1.010162 0,-1.414063 l 3.535156,-3.537109 A 1.0001,1.0001 0 0 0 32.654297,9.7226562 Z m 3.109375,2.1621098 -2.382813,2.384765 a 1.0001,1.0001 0 1 0 1.414063,1.414063 l 2.382812,-2.384766 -1.414062,-1.414062 z"
-         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-         inkscape:connector-curvature="0" />
-      <rect
-         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
-         y="752.29541"
-         x="-712.31262"
-         height="18.000017"
-         width="3"
-         id="rect5116"
-         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-  </g>
-</svg>

File diff suppressed because it is too large
+ 0 - 71
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/drag.svg


+ 0 - 81
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/error.svg

@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="error.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="14.00357"
-     inkscape:cy="12.443398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 7 3 C 4.7839905 3 3 4.7839905 3 7 L 3 18 C 3 20.21601 4.7839905 22 7 22 L 18 22 C 20.21601 22 22 20.21601 22 18 L 22 7 C 22 4.7839905 20.21601 3 18 3 L 7 3 z M 7.6992188 6 A 1.6916875 1.6924297 0 0 1 8.9121094 6.5117188 L 12.5 10.101562 L 16.087891 6.5117188 A 1.6916875 1.6924297 0 0 1 17.251953 6 A 1.6916875 1.6924297 0 0 1 18.480469 8.90625 L 14.892578 12.496094 L 18.480469 16.085938 A 1.6916875 1.6924297 0 1 1 16.087891 18.478516 L 12.5 14.888672 L 8.9121094 18.478516 A 1.6916875 1.6924297 0 1 1 6.5214844 16.085938 L 10.109375 12.496094 L 6.5214844 8.90625 A 1.6916875 1.6924297 0 0 1 7.6992188 6 z "
-       transform="translate(0,1027.3622)"
-       id="rect4135" />
-  </g>
-</svg>

+ 0 - 92
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/esc.svg

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="esc.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="18.205425"
-     inkscape:cy="17.531398"
-     inkscape:document-units="px"
-     inkscape:current-layer="text5290"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <g
-       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       id="text5290">
-      <path
-         d="m 3.9331055,1036.1464 5.0732422,0 0,1.4209 -3.1933594,0 0,1.3574 3.0029297,0 0,1.4209 -3.0029297,0 0,1.6699 3.3007812,0 0,1.4209 -5.180664,0 0,-7.29 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5314" />
-      <path
-         d="m 14.963379,1038.1385 0,1.3282 q -0.561524,-0.2344 -1.083984,-0.3516 -0.522461,-0.1172 -0.986329,-0.1172 -0.498046,0 -0.742187,0.127 -0.239258,0.122 -0.239258,0.3808 0,0.21 0.180664,0.3223 0.185547,0.1123 0.65918,0.166 l 0.307617,0.044 q 1.342773,0.1709 1.806641,0.5615 0.463867,0.3906 0.463867,1.2256 0,0.874 -0.644531,1.3134 -0.644532,0.4395 -1.923829,0.4395 -0.541992,0 -1.123046,-0.088 -0.576172,-0.083 -1.186524,-0.2539 l 0,-1.3281 q 0.522461,0.2539 1.069336,0.3808 0.551758,0.127 1.118164,0.127 0.512695,0 0.771485,-0.1416 0.258789,-0.1416 0.258789,-0.4199 0,-0.2344 -0.180664,-0.3467 -0.175782,-0.1172 -0.708008,-0.1807 l -0.307617,-0.039 q -1.166993,-0.1465 -1.635743,-0.542 -0.46875,-0.3955 -0.46875,-1.2012 0,-0.8691 0.595703,-1.2891 0.595704,-0.4199 1.826172,-0.4199 0.483399,0 1.015625,0.073 0.532227,0.073 1.157227,0.2294 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5316" />
-      <path
-         d="m 21.066895,1038.1385 0,1.4258 q -0.356446,-0.2441 -0.717774,-0.3613 -0.356445,-0.1172 -0.742187,-0.1172 -0.732422,0 -1.142579,0.4297 -0.405273,0.4248 -0.405273,1.1914 0,0.7666 0.405273,1.1963 0.410157,0.4248 1.142579,0.4248 0.410156,0 0.776367,-0.1221 0.371094,-0.122 0.683594,-0.3613 l 0,1.4307 q -0.410157,0.1513 -0.834961,0.2246 -0.419922,0.078 -0.844727,0.078 -1.479492,0 -2.314453,-0.7568 -0.834961,-0.7618 -0.834961,-2.1143 0,-1.3525 0.834961,-2.1094 0.834961,-0.7617 2.314453,-0.7617 0.429688,0 0.844727,0.078 0.419921,0.073 0.834961,0.2246 z"
-         style="font-size:10px;fill:#ffffff;fill-opacity:1"
-         id="path5318" />
-    </g>
-  </g>
-</svg>

+ 0 - 69
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/expander.svg

@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="9"
-   height="10"
-   viewBox="0 0 9 10"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="expander.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.254834"
-     inkscape:cx="9.8737281"
-     inkscape:cy="6.4583132"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     units="px"
-     inkscape:snap-object-midpoints="false"
-     inkscape:object-nodes="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1042.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="M 2.0800781,1042.3633 A 2.0002,2.0002 0 0 0 0,1044.3613 l 0,6 a 2.0002,2.0002 0 0 0 3.0292969,1.7168 l 5,-3 a 2.0002,2.0002 0 0 0 0,-3.4316 l -5,-3 a 2.0002,2.0002 0 0 0 -0.9492188,-0.2832 z"
-       id="path4138"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>

+ 0 - 93
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/fullscreen.svg

@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="fullscreen.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="16.400723"
-     inkscape:cy="15.083758"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <rect
-       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5006"
-       width="17"
-       height="17.000017"
-       x="4"
-       y="1031.3622"
-       ry="3.0000174" />
-    <path
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
-       d="m 7.5,1044.8622 4,0 -1.5,-1.5 1.5,-1.5 -1,-1 -1.5,1.5 -1.5,-1.5 0,4 z"
-       id="path5017"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path5025"
-       d="m 17.5,1034.8622 -4,0 1.5,1.5 -1.5,1.5 1,1 1.5,-1.5 1.5,1.5 0,-4 z"
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
-  </g>
-</svg>

+ 0 - 82
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle.svg

@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="5"
-   height="6"
-   viewBox="0 0 5 6"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="handle.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="32"
-     inkscape:cx="1.3551778"
-     inkscape:cy="8.7800329"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1046.3622)">
-    <path
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 4.0000803,1049.3622 -3,-2 0,4 z"
-       id="path4247"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc" />
-  </g>
-</svg>

+ 0 - 172
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle_bg.svg

@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="15"
-   height="50"
-   viewBox="0 0 15 50"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="handle_bg.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="-10.001409"
-     inkscape:cy="24.512566"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1002.3622)">
-    <rect
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4249"
-       width="1"
-       height="1.0000174"
-       x="9.5"
-       y="1008.8622"
-       ry="1.7382812e-05" />
-    <rect
-       ry="1.7382812e-05"
-       y="1013.8622"
-       x="9.5"
-       height="1.0000174"
-       width="1"
-       id="rect4255"
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       ry="1.7382812e-05"
-       y="1008.8622"
-       x="4.5"
-       height="1.0000174"
-       width="1"
-       id="rect4261"
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4263"
-       width="1"
-       height="1.0000174"
-       x="4.5"
-       y="1013.8622"
-       ry="1.7382812e-05" />
-    <rect
-       ry="1.7382812e-05"
-       y="1039.8622"
-       x="9.5"
-       height="1.0000174"
-       width="1"
-       id="rect4265"
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4267"
-       width="1"
-       height="1.0000174"
-       x="9.5"
-       y="1044.8622"
-       ry="1.7382812e-05" />
-    <rect
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4269"
-       width="1"
-       height="1.0000174"
-       x="4.5"
-       y="1039.8622"
-       ry="1.7382812e-05" />
-    <rect
-       ry="1.7382812e-05"
-       y="1044.8622"
-       x="4.5"
-       height="1.0000174"
-       width="1"
-       id="rect4271"
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4273"
-       width="1"
-       height="1.0000174"
-       x="9.5"
-       y="1018.8622"
-       ry="1.7382812e-05" />
-    <rect
-       ry="1.7382812e-05"
-       y="1018.8622"
-       x="4.5"
-       height="1.0000174"
-       width="1"
-       id="rect4275"
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4277"
-       width="1"
-       height="1.0000174"
-       x="9.5"
-       y="1034.8622"
-       ry="1.7382812e-05" />
-    <rect
-       ry="1.7382812e-05"
-       y="1034.8622"
-       x="4.5"
-       height="1.0000174"
-       width="1"
-       id="rect4279"
-       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-  </g>
-</svg>

+ 0 - 42
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/Makefile

@@ -1,42 +0,0 @@
-ICONS := \
-	novnc-16x16.png \
-	novnc-24x24.png \
-	novnc-32x32.png \
-	novnc-48x48.png \
-	novnc-64x64.png
-
-ANDROID_LAUNCHER := \
-	novnc-48x48.png \
-	novnc-72x72.png \
-	novnc-96x96.png \
-	novnc-144x144.png \
-	novnc-192x192.png
-
-IPHONE_LAUNCHER := \
-	novnc-60x60.png \
-	novnc-120x120.png
-
-IPAD_LAUNCHER := \
-	novnc-76x76.png \
-	novnc-152x152.png
-
-ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER)
-
-all: $(ALL_ICONS)
-
-novnc-16x16.png: novnc-icon-sm.svg
-	convert -density 90 \
-		-background transparent "$<" "$@"
-novnc-24x24.png: novnc-icon-sm.svg
-	convert -density 135 \
-		-background transparent "$<" "$@"
-novnc-32x32.png: novnc-icon-sm.svg
-	convert -density 180 \
-		-background transparent "$<" "$@"
-
-novnc-%.png: novnc-icon.svg
-	convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \
-		-background transparent "$<" "$@"
-
-clean:
-	rm -f *.png

BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-120x120.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-144x144.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-152x152.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-16x16.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-192x192.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-24x24.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-32x32.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-48x48.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-60x60.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-64x64.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-72x72.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-76x76.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-96x96.png


+ 0 - 163
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon-sm.svg

@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   viewBox="0 0 16 16"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="novnc-icon-sm.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.254834"
-     inkscape:cx="9.722703"
-     inkscape:cy="5.5311896"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:object-nodes="true"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:snap-midpoints="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4169" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1036.3621)">
-    <rect
-       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4167"
-       width="16"
-       height="15.999992"
-       x="0"
-       y="1036.3622"
-       ry="2.6666584" />
-    <path
-       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 2.6666667,1036.3621 C 1.1893373,1036.3621 0,1037.5515 0,1039.0288 l 0,10.6666 c 0,1.4774 1.1893373,2.6667 2.6666667,2.6667 l 4,0 C 11.837333,1052.3621 16,1046.7128 16,1039.6955 l 0,-0.6667 c 0,-1.4773 -1.189337,-2.6667 -2.666667,-2.6667 l -10.6666663,0 z"
-       id="rect4173"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g4381">
-      <g
-         transform="translate(0.25,0.25)"
-         style="fill:#000000;fill-opacity:1"
-         id="g4365">
-        <g
-           style="fill:#000000;fill-opacity:1"
-           id="g4367">
-          <path
-             inkscape:connector-curvature="0"
-             id="path4369"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 C 2.011349,1040.3621 2,1040.3741 2,1040.3981 l 0,2.964 -1,0 0,-4 z"
-             sodipodi:nodetypes="scsccsssscccs" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path4371"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
-             sodipodi:nodetypes="sscsscsscsscssssssssss" />
-        </g>
-        <g
-           style="fill:#000000;fill-opacity:1"
-           id="g4373">
-          <path
-             inkscape:connector-curvature="0"
-             id="path4375"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
-             sodipodi:nodetypes="cccccccc" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path4377"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
-             sodipodi:nodetypes="ccccccccccc" />
-          <path
-             inkscape:connector-curvature="0"
-             id="path4379"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
-             sodipodi:nodetypes="cssssccscsscscc" />
-        </g>
-      </g>
-      <g
-         id="g4356">
-        <g
-           id="g4347">
-          <path
-             sodipodi:nodetypes="scsccsssscccs"
-             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 c -0.022689,0 -0.034038,0.012 -0.034038,0.036 l 0,2.964 -1,0 0,-4 z"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             id="path4143"
-             inkscape:connector-curvature="0" />
-          <path
-             sodipodi:nodetypes="sscsscsscsscssssssssss"
-             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             id="path4145"
-             inkscape:connector-curvature="0" />
-        </g>
-        <g
-           id="g4351">
-          <path
-             sodipodi:nodetypes="cccccccc"
-             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             id="path4147"
-             inkscape:connector-curvature="0" />
-          <path
-             sodipodi:nodetypes="ccccccccccc"
-             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             id="path4149"
-             inkscape:connector-curvature="0" />
-          <path
-             sodipodi:nodetypes="cssssccscsscscc"
-             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
-             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             id="path4151"
-             inkscape:connector-curvature="0" />
-        </g>
-      </g>
-    </g>
-  </g>
-</svg>

+ 0 - 163
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon.svg

@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="48"
-   height="48"
-   viewBox="0 0 48 48.000001"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="novnc-icon.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.313708"
-     inkscape:cx="27.187245"
-     inkscape:cy="17.700974"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:object-nodes="true"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:snap-midpoints="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4169" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1004.3621)">
-    <rect
-       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4167"
-       width="48"
-       height="48"
-       x="0"
-       y="1004.3621"
-       ry="7.9999785" />
-    <path
-       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 8,1004.3621 c -4.4319881,0 -8,3.568 -8,8 l 0,32 c 0,4.432 3.5680119,8 8,8 l 12,0 c 15.512,0 28,-16.948 28,-38 l 0,-2 c 0,-4.432 -3.568012,-8 -8,-8 l -32,0 z"
-       id="rect4173"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g4300"
-       style="fill:#000000;fill-opacity:1;stroke:none"
-       transform="translate(0.5,0.5)">
-      <g
-         id="g4302"
-         style="fill:#000000;fill-opacity:1;stroke:none">
-        <path
-           sodipodi:nodetypes="scsccsssscccs"
-           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           id="path4304"
-           inkscape:connector-curvature="0" />
-        <path
-           sodipodi:nodetypes="sscsscsscsscssssssssss"
-           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           id="path4306"
-           inkscape:connector-curvature="0" />
-      </g>
-      <g
-         id="g4308"
-         style="fill:#000000;fill-opacity:1;stroke:none">
-        <path
-           sodipodi:nodetypes="cccccccc"
-           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           id="path4310"
-           inkscape:connector-curvature="0" />
-        <path
-           sodipodi:nodetypes="ccccccccccc"
-           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           id="path4312"
-           inkscape:connector-curvature="0" />
-        <path
-           sodipodi:nodetypes="cssssccscsscscc"
-           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           id="path4314"
-           inkscape:connector-curvature="0" />
-      </g>
-    </g>
-    <g
-       id="g4291"
-       style="stroke:none">
-      <g
-         id="g4282"
-         style="stroke:none">
-        <path
-           inkscape:connector-curvature="0"
-           id="path4143"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
-           sodipodi:nodetypes="scsccsssscccs" />
-        <path
-           inkscape:connector-curvature="0"
-           id="path4145"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
-           sodipodi:nodetypes="sscsscsscsscssssssssss" />
-      </g>
-      <g
-         id="g4286"
-         style="stroke:none">
-        <path
-           inkscape:connector-curvature="0"
-           id="path4147"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
-           sodipodi:nodetypes="cccccccc" />
-        <path
-           inkscape:connector-curvature="0"
-           id="path4149"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
-           sodipodi:nodetypes="ccccccccccc" />
-        <path
-           inkscape:connector-curvature="0"
-           id="path4151"
-           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
-           sodipodi:nodetypes="cssssccscsscscc" />
-      </g>
-    </g>
-  </g>
-</svg>

+ 0 - 81
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/info.svg

@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="info.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="15.720838"
-     inkscape:cy="8.9111233"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 12.5 3 A 9.5 9.4999914 0 0 0 3 12.5 A 9.5 9.4999914 0 0 0 12.5 22 A 9.5 9.4999914 0 0 0 22 12.5 A 9.5 9.4999914 0 0 0 12.5 3 z M 12.5 5 A 1.5 1.5000087 0 0 1 14 6.5 A 1.5 1.5000087 0 0 1 12.5 8 A 1.5 1.5000087 0 0 1 11 6.5 A 1.5 1.5000087 0 0 1 12.5 5 z M 10.521484 8.9785156 L 12.521484 8.9785156 A 1.50015 1.50015 0 0 1 14.021484 10.478516 L 14.021484 15.972656 A 1.50015 1.50015 0 0 1 14.498047 18.894531 C 14.498047 18.894531 13.74301 19.228309 12.789062 18.912109 C 12.312092 18.754109 11.776235 18.366625 11.458984 17.828125 C 11.141734 17.289525 11.021484 16.668469 11.021484 15.980469 L 11.021484 11.980469 L 10.521484 11.980469 A 1.50015 1.50015 0 1 1 10.521484 8.9804688 L 10.521484 8.9785156 z "
-       transform="translate(0,1027.3622)"
-       id="path4136" />
-  </g>
-</svg>

File diff suppressed because it is too large
+ 0 - 75
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/keyboard.svg


+ 0 - 92
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_left.svg

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="mouse_left.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.313708"
-     inkscape:cx="15.551515"
-     inkscape:cy="12.205592"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
-       id="path6219" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
-       id="path6217" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
-       id="path6215" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
-       id="rect6178" />
-  </g>
-</svg>

+ 0 - 92
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_middle.svg

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="mouse_middle.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.313708"
-     inkscape:cx="15.551515"
-     inkscape:cy="12.205592"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
-       id="path6219" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
-       id="path6217" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
-       id="path6215" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
-       id="rect6178" />
-  </g>
-</svg>

+ 0 - 92
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_none.svg

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="mouse_none.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="23.160825"
-     inkscape:cy="13.208262"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
-       id="path6219" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
-       id="path6217" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
-       id="path6215" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
-       id="rect6178" />
-  </g>
-</svg>

+ 0 - 92
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_right.svg

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="mouse_right.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.313708"
-     inkscape:cx="15.551515"
-     inkscape:cy="12.205592"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
-       id="path6219" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
-       id="path6217" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
-       id="path6215" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
-       id="rect6178" />
-  </g>
-</svg>

+ 0 - 87
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/power.svg

@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="power.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="9.3159849"
-     inkscape:cy="13.436208"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="M 9 6.8183594 C 6.3418164 8.1213032 4.5 10.849161 4.5 14 C 4.5 18.4065 8.0935666 22 12.5 22 C 16.906433 22 20.5 18.4065 20.5 14 C 20.5 10.849161 18.658184 8.1213032 16 6.8183594 L 16 9.125 C 17.514327 10.211757 18.5 11.984508 18.5 14 C 18.5 17.3256 15.825553 20 12.5 20 C 9.1744469 20 6.5 17.3256 6.5 14 C 6.5 11.984508 7.4856727 10.211757 9 9.125 L 9 6.8183594 z "
-       transform="translate(0,1027.3622)"
-       id="path6140" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 12.5,1031.8836 0,6.4786"
-       id="path6142"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-  </g>
-</svg>

+ 0 - 76
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/settings.svg

@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="settings.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.627417"
-     inkscape:cx="14.69683"
-     inkscape:cy="8.8039511"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 11 3 L 11 5.1601562 A 7.5 7.5 0 0 0 8.3671875 6.2460938 L 6.84375 4.7226562 L 4.7226562 6.84375 L 6.2480469 8.3691406 A 7.5 7.5 0 0 0 5.1523438 11 L 3 11 L 3 14 L 5.1601562 14 A 7.5 7.5 0 0 0 6.2460938 16.632812 L 4.7226562 18.15625 L 6.84375 20.277344 L 8.3691406 18.751953 A 7.5 7.5 0 0 0 11 19.847656 L 11 22 L 14 22 L 14 19.839844 A 7.5 7.5 0 0 0 16.632812 18.753906 L 18.15625 20.277344 L 20.277344 18.15625 L 18.751953 16.630859 A 7.5 7.5 0 0 0 19.847656 14 L 22 14 L 22 11 L 19.839844 11 A 7.5 7.5 0 0 0 18.753906 8.3671875 L 20.277344 6.84375 L 18.15625 4.7226562 L 16.630859 6.2480469 A 7.5 7.5 0 0 0 14 5.1523438 L 14 3 L 11 3 z M 12.5 10 A 2.5 2.5 0 0 1 15 12.5 A 2.5 2.5 0 0 1 12.5 15 A 2.5 2.5 0 0 1 10 12.5 A 2.5 2.5 0 0 1 12.5 10 z "
-       transform="translate(0,1027.3622)"
-       id="rect4967" />
-  </g>
-</svg>

+ 0 - 86
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/tab.svg

@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="tab.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="11.67335"
-     inkscape:cy="17.881696"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 3,1031.3622 0,8 2,0 0,-4 0,-4 -2,0 z m 2,4 4,4 0,-3 13,0 0,-2 -13,0 0,-3 -4,4 z"
-       id="rect5194"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path5211"
-       d="m 22,1048.3622 0,-8 -2,0 0,4 0,4 2,0 z m -2,-4 -4,-4 0,3 -13,0 0,2 13,0 0,3 4,-4 z"
-       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>

+ 0 - 90
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/toggleextrakeys.svg

@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="extrakeys.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="15.234555"
-     inkscape:cy="9.9710826"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 8,1031.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,8.9996 c 0,2.1987 1.8012876,4 4,4 l 9,0 c 2.198712,0 4,-1.8013 4,-4 l 0,-8.9996 c 0,-2.1987 -1.801288,-4 -4,-4 z m 0,2 9,0 c 1.125307,0 2,0.8747 2,2 l 0,7.0005 c 0,1.1253 -0.874693,2 -2,2 l -9,0 c -1.1253069,0 -2,-0.8747 -2,-2 l 0,-7.0005 c 0,-1.1253 0.8746931,-2 2,-2 z"
-       id="rect5006"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ssssssssssssssssss" />
-    <g
-       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       id="text4167"
-       transform="matrix(0.96021948,0,0,0.96021948,0.18921715,41.80659)">
-      <path
-         d="m 14.292969,1040.6791 -2.939453,0 -0.463868,1.3281 -1.889648,0 2.700195,-7.29 2.241211,0 2.700196,7.29 -1.889649,0 -0.458984,-1.3281 z m -2.470703,-1.3526 1.99707,0 -0.996094,-2.9004 -1.000976,2.9004 z"
-         id="path4172"
-         inkscape:connector-curvature="0" />
-    </g>
-  </g>
-</svg>

+ 0 - 81
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/warning.svg

@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="25"
-   height="25"
-   viewBox="0 0 25 25"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="warning.svg"
-   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#959595"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="16.457343"
-     inkscape:cy="12.179552"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="true"
-     inkscape:bbox-nodes="true"
-     inkscape:snap-bbox-edge-midpoints="true"
-     inkscape:object-paths="true"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1136"
-     inkscape:window-x="1920"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4136" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1027.3622)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="M 12.513672 3.0019531 C 11.751609 2.9919531 11.052563 3.4242687 10.710938 4.1054688 L 3.2109375 19.105469 C 2.5461937 20.435369 3.5132277 21.9999 5 22 L 20 22 C 21.486772 21.9999 22.453806 20.435369 21.789062 19.105469 L 14.289062 4.1054688 C 13.951849 3.4330688 13.265888 3.0066531 12.513672 3.0019531 z M 12.478516 6.9804688 A 1.50015 1.50015 0 0 1 14 8.5 L 14 14.5 A 1.50015 1.50015 0 1 1 11 14.5 L 11 8.5 A 1.50015 1.50015 0 0 1 12.478516 6.9804688 z M 12.5 17 A 1.5 1.5 0 0 1 14 18.5 A 1.5 1.5 0 0 1 12.5 20 A 1.5 1.5 0 0 1 11 18.5 A 1.5 1.5 0 0 1 12.5 17 z "
-       transform="translate(0,1027.3622)"
-       id="path4208" />
-  </g>
-</svg>

+ 0 - 69
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/de.json

@@ -1,69 +0,0 @@
-{
-    "Connecting...": "Verbinden...",
-    "Disconnecting...": "Verbindung trennen...",
-    "Reconnecting...": "Verbindung wiederherstellen...",
-    "Internal error": "Interner Fehler",
-    "Must set host": "Richten Sie den Server ein",
-    "Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
-    "Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
-    "Something went wrong, connection is closed": "Etwas lief schief, Verbindung wurde getrennt",
-    "Disconnected": "Verbindung zum Server getrennt",
-    "New connection has been rejected with reason: ": "Verbindung wurde aus folgendem Grund abgelehnt: ",
-    "New connection has been rejected": "Verbindung wurde abgelehnt",
-    "Password is required": "Passwort ist erforderlich",
-    "noVNC encountered an error:": "Ein Fehler ist aufgetreten:",
-    "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen",
-    "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen",
-    "viewport drag": "Ansichtsfenster ziehen",
-    "Active Mouse Button": "Aktive Maustaste",
-    "No mousebutton": "Keine Maustaste",
-    "Left mousebutton": "Linke Maustaste",
-    "Middle mousebutton": "Mittlere Maustaste",
-    "Right mousebutton": "Rechte Maustaste",
-    "Keyboard": "Tastatur",
-    "Show Keyboard": "Tastatur anzeigen",
-    "Extra keys": "Zusatztasten",
-    "Show Extra Keys": "Zusatztasten anzeigen",
-    "Ctrl": "Strg",
-    "Toggle Ctrl": "Strg umschalten",
-    "Alt": "Alt",
-    "Toggle Alt": "Alt umschalten",
-    "Send Tab": "Tab senden",
-    "Tab": "Tab",
-    "Esc": "Esc",
-    "Send Escape": "Escape senden",
-    "Ctrl+Alt+Del": "Strg+Alt+Entf",
-    "Send Ctrl-Alt-Del": "Strg+Alt+Entf senden",
-    "Shutdown/Reboot": "Herunterfahren/Neustarten",
-    "Shutdown/Reboot...": "Herunterfahren/Neustarten...",
-    "Power": "Energie",
-    "Shutdown": "Herunterfahren",
-    "Reboot": "Neustarten",
-    "Reset": "Zurücksetzen",
-    "Clipboard": "Zwischenablage",
-    "Clear": "Löschen",
-    "Fullscreen": "Vollbild",
-    "Settings": "Einstellungen",
-    "Shared Mode": "Geteilter Modus",
-    "View Only": "Nur betrachten",
-    "Clip to Window": "Auf Fenster begrenzen",
-    "Scaling Mode:": "Skalierungsmodus:",
-    "None": "Keiner",
-    "Local Scaling": "Lokales skalieren",
-    "Remote Resizing": "Serverseitiges skalieren",
-    "Advanced": "Erweitert",
-    "Repeater ID:": "Repeater ID:",
-    "WebSocket": "WebSocket",
-    "Encrypt": "Verschlüsselt",
-    "Host:": "Server:",
-    "Port:": "Port:",
-    "Path:": "Pfad:",
-    "Automatic Reconnect": "Automatisch wiederverbinden",
-    "Reconnect Delay (ms):": "Wiederverbindungsverzögerung (ms):",
-    "Logging:": "Protokollierung:",
-    "Disconnect": "Verbindung trennen",
-    "Connect": "Verbinden",
-    "Password:": "Passwort:",
-    "Cancel": "Abbrechen",
-    "Canvas not supported.": "Canvas nicht unterstützt."
-}

+ 0 - 69
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/el.json

@@ -1,69 +0,0 @@
-{
-    "Connecting...": "Συνδέεται...",
-    "Disconnecting...": "Aποσυνδέεται...",
-    "Reconnecting...": "Επανασυνδέεται...",
-    "Internal error": "Εσωτερικό σφάλμα",
-    "Must set host": "Πρέπει να οριστεί ο διακομιστής",
-    "Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
-    "Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
-    "Something went wrong, connection is closed": "Κάτι πήγε στραβά, η σύνδεση διακόπηκε",
-    "Disconnected": "Αποσυνδέθηκε",
-    "New connection has been rejected with reason: ": "Η νέα σύνδεση απορρίφθηκε διότι: ",
-    "New connection has been rejected": "Η νέα σύνδεση απορρίφθηκε ",
-    "Password is required": "Απαιτείται ο κωδικός πρόσβασης",
-    "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:",
-    "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου",
-    "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου",
-    "viewport drag": "σύρσιμο θεατού πεδίου",
-    "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού",
-    "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού",
-    "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού",
-    "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού",
-    "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού",
-    "Keyboard": "Πληκτρολόγιο",
-    "Show Keyboard": "Εμφάνιση Πληκτρολογίου",
-    "Extra keys": "Επιπλέον πλήκτρα",
-    "Show Extra Keys": "Εμφάνιση Επιπλέον Πλήκτρων",
-    "Ctrl": "Ctrl",
-    "Toggle Ctrl": "Εναλλαγή Ctrl",
-    "Alt": "Alt",
-    "Toggle Alt": "Εναλλαγή Alt",
-    "Send Tab": "Αποστολή Tab",
-    "Tab": "Tab",
-    "Esc": "Esc",
-    "Send Escape": "Αποστολή Escape",
-    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
-    "Send Ctrl-Alt-Del": "Αποστολή Ctrl-Alt-Del",
-    "Shutdown/Reboot": "Κλείσιμο/Επανεκκίνηση",
-    "Shutdown/Reboot...": "Κλείσιμο/Επανεκκίνηση...",
-    "Power": "Απενεργοποίηση",
-    "Shutdown": "Κλείσιμο",
-    "Reboot": "Επανεκκίνηση",
-    "Reset": "Επαναφορά",
-    "Clipboard": "Πρόχειρο",
-    "Clear": "Καθάρισμα",
-    "Fullscreen": "Πλήρης Οθόνη",
-    "Settings": "Ρυθμίσεις",
-    "Shared Mode": "Κοινόχρηστη Λειτουργία",
-    "View Only": "Μόνο Θέαση",
-    "Clip to Window": "Αποκοπή στο όριο του Παράθυρου",
-    "Scaling Mode:": "Λειτουργία Κλιμάκωσης:",
-    "None": "Καμία",
-    "Local Scaling": "Τοπική Κλιμάκωση",
-    "Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους",
-    "Advanced": "Για προχωρημένους",
-    "Repeater ID:": "Repeater ID:",
-    "WebSocket": "WebSocket",
-    "Encrypt": "Κρυπτογράφηση",
-    "Host:": "Όνομα διακομιστή:",
-    "Port:": "Πόρτα διακομιστή:",
-    "Path:": "Διαδρομή:",
-    "Automatic Reconnect": "Αυτόματη επανασύνδεση",
-    "Reconnect Delay (ms):": "Καθυστέρηση επανασύνδεσης (ms):",
-    "Logging:": "Καταγραφή:",
-    "Disconnect": "Αποσύνδεση",
-    "Connect": "Σύνδεση",
-    "Password:": "Κωδικός Πρόσβασης:",
-    "Cancel": "Ακύρωση",
-    "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas"
-}

+ 0 - 68
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/es.json

@@ -1,68 +0,0 @@
-{
-    "Connecting...": "Conectando...",
-    "Connected (encrypted) to ": "Conectado (con encriptación) a",
-    "Connected (unencrypted) to ": "Conectado (sin encriptación) a",
-    "Disconnecting...": "Desconectando...",
-    "Disconnected": "Desconectado",
-    "Must set host": "Debes configurar el host",
-    "Reconnecting...": "Reconectando...",
-    "Password is required": "Contraseña es obligatoria",
-    "Disconnect timeout": "Tiempo de desconexión agotado",
-    "noVNC encountered an error:": "noVNC ha encontrado un error:",
-    "Hide/Show the control bar": "Ocultar/Mostrar la barra de control",
-    "Move/Drag Viewport": "Mover/Arrastrar la ventana",
-    "viewport drag": "Arrastrar la ventana",
-    "Active Mouse Button": "Botón activo del ratón",
-    "No mousebutton": "Ningún botón del ratón",
-    "Left mousebutton": "Botón izquierdo del ratón",
-    "Middle mousebutton": "Botón central del ratón",
-    "Right mousebutton": "Botón derecho del ratón",
-    "Keyboard": "Teclado",
-    "Show Keyboard": "Mostrar teclado",
-    "Extra keys": "Teclas adicionales",
-    "Show Extra Keys": "Mostrar Teclas Adicionales",
-    "Ctrl": "Ctrl",
-    "Toggle Ctrl": "Pulsar/Soltar Ctrl",
-    "Alt": "Alt",
-    "Toggle Alt": "Pulsar/Soltar Alt",
-    "Send Tab": "Enviar Tabulación",
-    "Tab": "Tabulación",
-    "Esc": "Esc",
-    "Send Escape": "Enviar Escape",
-    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
-    "Send Ctrl-Alt-Del": "Enviar Ctrl+Alt+Del",
-    "Shutdown/Reboot": "Apagar/Reiniciar",
-    "Shutdown/Reboot...": "Apagar/Reiniciar...",
-    "Power": "Encender",
-    "Shutdown": "Apagar",
-    "Reboot": "Reiniciar",
-    "Reset": "Restablecer",
-    "Clipboard": "Portapapeles",
-    "Clear": "Vaciar",
-    "Fullscreen": "Pantalla Completa",
-    "Settings": "Configuraciones",
-    "Shared Mode": "Modo Compartido",
-    "View Only": "Solo visualización",
-    "Clip to Window": "Recortar al tamaño de la ventana",
-    "Scaling Mode:": "Modo de escalado:",
-    "None": "Ninguno",
-    "Local Scaling": "Escalado Local",
-    "Local Downscaling": "Reducción de escala local",
-    "Remote Resizing": "Cambio de tamaño remoto",
-    "Advanced": "Avanzado",
-    "Local Cursor": "Cursor Local",
-    "Repeater ID:": "ID del Repetidor",
-    "WebSocket": "WebSocket",
-    "Encrypt": "",
-    "Host:": "Host",
-    "Port:": "Puesto",
-    "Path:": "Ruta",
-    "Automatic Reconnect": "Reconexión automática",
-    "Reconnect Delay (ms):": "Retraso en la reconexión (ms)",
-    "Logging:": "Logging",
-    "Disconnect": "Desconectar",
-    "Connect": "Conectar",
-    "Password:": "Contraseña",
-    "Cancel": "Cancelar",
-    "Canvas not supported.": "Canvas no está soportado"
-}

+ 0 - 68
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/nl.json

@@ -1,68 +0,0 @@
-{
-    "Connecting...": "Verbinden...",
-    "Connected (encrypted) to ": "Verbonden (versleuteld) met ",
-    "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
-    "Disconnecting...": "Verbinding verbreken...",
-    "Disconnected": "Verbinding verbroken",
-    "Must set host": "Host moeten worden ingesteld",
-    "Reconnecting...": "Opnieuw verbinding maken...",
-    "Password is required": "Wachtwoord is vereist",
-    "Disconnect timeout": "Timeout tijdens verbreken van verbinding",
-    "noVNC encountered an error:": "noVNC heeft een fout bemerkt:",
-    "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk",
-    "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster",
-    "viewport drag": "kijkvenster slepen",
-    "Active Mouse Button": "Actieve Muisknop",
-    "No mousebutton": "Geen muisknop",
-    "Left mousebutton": "Linker muisknop",
-    "Middle mousebutton": "Middelste muisknop",
-    "Right mousebutton": "Rechter muisknop",
-    "Keyboard": "Toetsenbord",
-    "Show Keyboard": "Toon Toetsenbord",
-    "Extra keys": "Extra toetsen",
-    "Show Extra Keys": "Toon Extra Toetsen",
-    "Ctrl": "Ctrl",
-    "Toggle Ctrl": "Ctrl aan/uitzetten",
-    "Alt": "Alt",
-    "Toggle Alt": "Alt aan/uitzetten",
-    "Send Tab": "Tab Sturen",
-    "Tab": "Tab",
-    "Esc": "Esc",
-    "Send Escape": "Escape Sturen",
-    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
-    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Sturen",
-    "Shutdown/Reboot": "Uitschakelen/Herstarten",
-    "Shutdown/Reboot...": "Uitschakelen/Herstarten...",
-    "Power": "Systeem",
-    "Shutdown": "Uitschakelen",
-    "Reboot": "Herstarten",
-    "Reset": "Resetten",
-    "Clipboard": "Klembord",
-    "Clear": "Wissen",
-    "Fullscreen": "Volledig Scherm",
-    "Settings": "Instellingen",
-    "Shared Mode": "Gedeelde Modus",
-    "View Only": "Alleen Kijken",
-    "Clip to Window": "Randen buiten venster afsnijden",
-    "Scaling Mode:": "Schaalmodus:",
-    "None": "Geen",
-    "Local Scaling": "Lokaal Schalen",
-    "Local Downscaling": "Lokaal Neerschalen",
-    "Remote Resizing": "Op Afstand Formaat Wijzigen",
-    "Advanced": "Geavanceerd",
-    "Local Cursor": "Lokale Cursor",
-    "Repeater ID:": "Repeater ID:",
-    "WebSocket": "WebSocket",
-    "Encrypt": "Versleutelen",
-    "Host:": "Host:",
-    "Port:": "Poort:",
-    "Path:": "Pad:",
-    "Automatic Reconnect": "Automatisch Opnieuw Verbinden",
-    "Reconnect Delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):",
-    "Logging:": "Logmeldingen:",
-    "Disconnect": "Verbinding verbreken",
-    "Connect": "Verbinden",
-    "Password:": "Wachtwoord:",
-    "Cancel": "Annuleren",
-    "Canvas not supported.": "Canvas wordt niet ondersteund."
-}

+ 0 - 69
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/pl.json

@@ -1,69 +0,0 @@
-{
-    "Connecting...": "Łączenie...",
-    "Disconnecting...": "Rozłączanie...",
-    "Reconnecting...": "Łączenie...",
-    "Internal error": "Błąd wewnętrzny",
-    "Must set host": "Host i port są wymagane",
-    "Connected (encrypted) to ": "Połączenie (szyfrowane) z ",
-    "Connected (unencrypted) to ": "Połączenie (nieszyfrowane) z ",
-    "Something went wrong, connection is closed": "Coś poszło źle, połączenie zostało zamknięte",
-    "Disconnected": "Rozłączony",
-    "New connection has been rejected with reason: ": "Nowe połączenie zostało odrzucone z powodu: ",
-    "New connection has been rejected": "Nowe połączenie zostało odrzucone",
-    "Password is required": "Hasło jest wymagane",
-    "noVNC encountered an error:": "noVNC napotkało błąd:",
-    "Hide/Show the control bar": "Pokaż/Ukryj pasek ustawień",
-    "Move/Drag Viewport": "Ruszaj/Przeciągaj Viewport",
-    "viewport drag": "przeciągnij viewport",
-    "Active Mouse Button": "Aktywny Przycisk Myszy",
-    "No mousebutton": "Brak przycisku myszy",
-    "Left mousebutton": "Lewy przycisk myszy",
-    "Middle mousebutton": "Środkowy przycisk myszy",
-    "Right mousebutton": "Prawy przycisk myszy",
-    "Keyboard": "Klawiatura",
-    "Show Keyboard": "Pokaż klawiaturę",
-    "Extra keys": "Przyciski dodatkowe",
-    "Show Extra Keys": "Pokaż przyciski dodatkowe",
-    "Ctrl": "Ctrl",
-    "Toggle Ctrl": "Przełącz Ctrl",
-    "Alt": "Alt",
-    "Toggle Alt": "Przełącz Alt",
-    "Send Tab": "Wyślij Tab",
-    "Tab": "Tab",
-    "Esc": "Esc",
-    "Send Escape": "Wyślij Escape",
-    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
-    "Send Ctrl-Alt-Del": "Wyślij Ctrl-Alt-Del",
-    "Shutdown/Reboot": "Wyłącz/Uruchom ponownie",
-    "Shutdown/Reboot...": "Wyłącz/Uruchom ponownie...",
-    "Power": "Włączony",
-    "Shutdown": "Wyłącz",
-    "Reboot": "Uruchom ponownie",
-    "Reset": "Resetuj",
-    "Clipboard": "Schowek",
-    "Clear": "Wyczyść",
-    "Fullscreen": "Pełny ekran",
-    "Settings": "Ustawienia",
-    "Shared Mode": "Tryb Współdzielenia",
-    "View Only": "Tylko Podgląd",
-    "Clip to Window": "Przytnij do Okna",
-    "Scaling Mode:": "Tryb Skalowania:",
-    "None": "Brak",
-    "Local Scaling": "Skalowanie lokalne",
-    "Remote Resizing": "Skalowanie zdalne",
-    "Advanced": "Zaawansowane",
-    "Repeater ID:": "ID Repeatera:",
-    "WebSocket": "WebSocket",
-    "Encrypt": "Szyfrowanie",
-    "Host:": "Host:",
-    "Port:": "Port:",
-    "Path:": "Ścieżka:",
-    "Automatic Reconnect": "Automatycznie wznawiaj połączenie",
-    "Reconnect Delay (ms):": "Opóźnienie wznawiania (ms):",
-    "Logging:": "Poziom logowania:",
-    "Disconnect": "Rozłącz",
-    "Connect": "Połącz",
-    "Password:": "Hasło:",
-    "Cancel": "Anuluj",
-    "Canvas not supported.": "Element Canvas nie jest wspierany."
-}

+ 0 - 68
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/sv.json

@@ -1,68 +0,0 @@
-{
-    "Connecting...": "Ansluter...",
-    "Connected (encrypted) to ": "Ansluten (krypterat) till ",
-    "Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
-    "Disconnecting...": "Kopplar ner...",
-    "Disconnected": "Frånkopplad",
-    "Must set host": "Du måste specifiera en värd",
-    "Reconnecting...": "Återansluter...",
-    "Password is required": "Lösenord krävs",
-    "Disconnect timeout": "Det tog för lång tid att koppla ner",
-    "noVNC encountered an error:": "noVNC stötte på ett problem:",
-    "Hide/Show the control bar": "Göm/Visa kontrollbaren",
-    "Move/Drag Viewport": "Flytta/Dra Vyn",
-    "viewport drag": "dra vy",
-    "Active Mouse Button": "Aktiv musknapp",
-    "No mousebutton": "Ingen musknapp",
-    "Left mousebutton": "Vänster musknapp",
-    "Middle mousebutton": "Mitten-musknapp",
-    "Right mousebutton": "Höger musknapp",
-    "Keyboard": "Tangentbord",
-    "Show Keyboard": "Visa Tangentbord",
-    "Extra keys": "Extraknappar",
-    "Show Extra Keys": "Visa Extraknappar",
-    "Ctrl": "Ctrl",
-    "Toggle Ctrl": "Växla Ctrl",
-    "Alt": "Alt",
-    "Toggle Alt": "Växla Alt",
-    "Send Tab": "Skicka Tab",
-    "Tab": "Tab",
-    "Esc": "Esc",
-    "Send Escape": "Skicka Escape",
-    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
-    "Send Ctrl-Alt-Del": "Skicka Ctrl-Alt-Del",
-    "Shutdown/Reboot": "Stäng av/Boota om",
-    "Shutdown/Reboot...": "Stäng av/Boota om...",
-    "Power": "Ström",
-    "Shutdown": "Stäng av",
-    "Reboot": "Boota om",
-    "Reset": "Återställ",
-    "Clipboard": "Urklipp",
-    "Clear": "Rensa",
-    "Fullscreen": "Fullskärm",
-    "Settings": "Inställningar",
-    "Shared Mode": "Delat Läge",
-    "View Only": "Endast Visning",
-    "Clip to Window": "Begränsa till Fönster",
-    "Scaling Mode:": "Skalningsläge:",
-    "None": "Ingen",
-    "Local Scaling": "Lokal Skalning",
-    "Local Downscaling": "Lokal Nedskalning",
-    "Remote Resizing": "Ändra Storlek",
-    "Advanced": "Avancerat",
-    "Local Cursor": "Lokal Muspekare",
-    "Repeater ID:": "Repeater-ID:",
-    "WebSocket": "WebSocket",
-    "Encrypt": "Kryptera",
-    "Host:": "Värd:",
-    "Port:": "Port:",
-    "Path:": "Sökväg:",
-    "Automatic Reconnect": "Automatisk Återanslutning",
-    "Reconnect Delay (ms):": "Fördröjning (ms):",
-    "Logging:": "Loggning:",
-    "Disconnect": "Koppla från",
-    "Connect": "Anslut",
-    "Password:": "Lösenord:",
-    "Cancel": "Avbryt",
-    "Canvas not supported.": "Canvas stöds ej"
-}

+ 0 - 69
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/tr.json

@@ -1,69 +0,0 @@
-{
-    "Connecting...": "Bağlanıyor...",
-    "Disconnecting...": "Bağlantı kesiliyor...",
-    "Reconnecting...": "Yeniden bağlantı kuruluyor...",
-    "Internal error": "İç hata",
-    "Must set host": "Sunucuyu kur",
-    "Connected (encrypted) to ": "Bağlı (şifrelenmiş)",
-    "Connected (unencrypted) to ": "Bağlandı (şifrelenmemiş)",
-    "Something went wrong, connection is closed": "Bir şeyler ters gitti, bağlantı kesildi",
-    "Disconnected": "Bağlantı kesildi",
-    "New connection has been rejected with reason: ": "Bağlantı aşağıdaki nedenlerden dolayı reddedildi: ",
-    "New connection has been rejected": "Bağlantı reddedildi",
-    "Password is required": "Şifre gerekli",
-    "noVNC encountered an error:": "Bir hata oluştu:",
-    "Hide/Show the control bar": "Denetim masasını Gizle/Göster",
-    "Move/Drag Viewport": "Görünümü Taşı/Sürükle",
-    "viewport drag": "Görüntü penceresini sürükle",
-    "Active Mouse Button": "Aktif Fare Düğmesi",
-    "No mousebutton": "Fare düğmesi yok",
-    "Left mousebutton": "Farenin sol düğmesi",
-    "Middle mousebutton": "Farenin orta düğmesi",
-    "Right mousebutton": "Farenin sağ düğmesi",
-    "Keyboard": "Klavye",
-    "Show Keyboard": "Klavye Düzenini Göster",
-    "Extra keys": "Ekstra tuşlar",
-    "Show Extra Keys": "Ekstra tuşları göster",
-    "Ctrl": "Ctrl",
-    "Toggle Ctrl": "Ctrl Değiştir ",
-    "Alt": "Alt",
-    "Toggle Alt": "Alt Değiştir",
-    "Send Tab": "Sekme Gönder",
-    "Tab": "Sekme",
-    "Esc": "Esc",
-    "Send Escape": "Boşluk Gönder",
-    "Ctrl+Alt+Del": "Ctrl + Alt + Del",
-    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Gönder",
-    "Shutdown/Reboot": "Kapat/Yeniden Başlat",
-    "Shutdown/Reboot...": "Kapat/Yeniden Başlat...",
-    "Power": "Güç",
-    "Shutdown": "Kapat",
-    "Reboot": "Yeniden Başlat",
-    "Reset": "Sıfırla",
-    "Clipboard": "Pano",
-    "Clear": "Temizle",
-    "Fullscreen": "Tam Ekran",
-    "Settings": "Ayarlar",
-    "Shared Mode": "Paylaşım Modu",
-    "View Only": "Sadece Görüntüle",
-    "Clip to Window": "Pencereye Tıkla",
-    "Scaling Mode:": "Ölçekleme Modu:",
-    "None": "Bilinmeyen",
-    "Local Scaling": "Yerel Ölçeklendirme",
-    "Remote Resizing": "Uzaktan Yeniden Boyutlandırma",
-    "Advanced": "Gelişmiş",
-    "Repeater ID:": "Tekralayıcı ID:",
-    "WebSocket": "WebSocket",
-    "Encrypt": "Şifrele",
-    "Host:": "Ana makine:",
-    "Port:": "Port:",
-    "Path:": "Yol:",
-    "Automatic Reconnect": "Otomatik Yeniden Bağlan",
-    "Reconnect Delay (ms):": "Yeniden Bağlanma Süreci (ms):",
-    "Logging:": "Giriş yapılıyor:",
-    "Disconnect": "Bağlantıyı Kes",
-    "Connect": "Bağlan",
-    "Password:": "Parola:",
-    "Cancel": "Vazgeç",
-    "Canvas not supported.": "Tuval desteklenmiyor."
-}

+ 0 - 69
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/zh.json

@@ -1,69 +0,0 @@
-{
-    "Connecting...": "連線中...",
-    "Disconnecting...": "正在中斷連線...",
-    "Reconnecting...": "重新連線中...",
-    "Internal error": "內部錯誤",
-    "Must set host": "請提供主機資訊",
-    "Connected (encrypted) to ": "已加密連線到",
-    "Connected (unencrypted) to ": "未加密連線到",
-    "Something went wrong, connection is closed": "發生錯誤,連線已關閉",
-    "Failed to connect to server": "無法連線到伺服器",
-    "Disconnected": "連線已中斷",
-    "New connection has been rejected with reason: ": "連線被拒絕,原因:",
-    "New connection has been rejected": "連線被拒絕",
-    "Password is required": "請提供密碼",
-    "noVNC encountered an error:": "noVNC 遇到一個錯誤:",
-    "Hide/Show the control bar": "顯示/隱藏控制列",
-    "Move/Drag Viewport": "拖放顯示範圍",
-    "viewport drag": "顯示範圍拖放",
-    "Active Mouse Button": "啟用滑鼠按鍵",
-    "No mousebutton": "無滑鼠按鍵",
-    "Left mousebutton": "滑鼠左鍵",
-    "Middle mousebutton": "滑鼠中鍵",
-    "Right mousebutton": "滑鼠右鍵",
-    "Keyboard": "鍵盤",
-    "Show Keyboard": "顯示鍵盤",
-    "Extra keys": "額外按鍵",
-    "Show Extra Keys": "顯示額外按鍵",
-    "Ctrl": "Ctrl",
-    "Toggle Ctrl": "切換 Ctrl",
-    "Alt": "Alt",
-    "Toggle Alt": "切換 Alt",
-    "Send Tab": "送出 Tab 鍵",
-    "Tab": "Tab",
-    "Esc": "Esc",
-    "Send Escape": "送出 Escape 鍵",
-    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
-    "Send Ctrl-Alt-Del": "送出 Ctrl-Alt-Del 快捷鍵",
-    "Shutdown/Reboot": "關機/重新啟動",
-    "Shutdown/Reboot...": "關機/重新啟動...",
-    "Power": "電源",
-    "Shutdown": "關機",
-    "Reboot": "重新啟動",
-    "Reset": "重設",
-    "Clipboard": "剪貼簿",
-    "Clear": "清除",
-    "Fullscreen": "全螢幕",
-    "Settings": "設定",
-    "Shared Mode": "分享模式",
-    "View Only": "僅檢視",
-    "Clip to Window": "限制/裁切視窗大小",
-    "Scaling Mode:": "縮放模式:",
-    "None": "無",
-    "Local Scaling": "本機縮放",
-    "Remote Resizing": "遠端調整大小",
-    "Advanced": "進階",
-    "Repeater ID:": "中繼站 ID",
-    "WebSocket": "WebSocket",
-    "Encrypt": "加密",
-    "Host:": "主機:",
-    "Port:": "連接埠:",
-    "Path:": "路徑:",
-    "Automatic Reconnect": "自動重新連線",
-    "Reconnect Delay (ms):": "重新連線間隔 (ms):",
-    "Logging:": "日誌級別:",
-    "Disconnect": "中斷連線",
-    "Connect": "連線",
-    "Password:": "密碼:",
-    "Cancel": "取消"
-}

+ 0 - 170
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/localization.js

@@ -1,170 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-/*
- * Localization Utilities
- */
-
-export function Localizer() {
-    // Currently configured language
-    this.language = 'en';
-
-    // Current dictionary of translations
-    this.dictionary = undefined;
-}
-
-Localizer.prototype = {
-    // Configure suitable language based on user preferences
-    setup: function (supportedLanguages) {
-        var userLanguages;
-
-        this.language = 'en'; // Default: US English
-
-        /*
-         * Navigator.languages only available in Chrome (32+) and FireFox (32+)
-         * Fall back to navigator.language for other browsers
-         */
-        if (typeof window.navigator.languages == 'object') {
-            userLanguages = window.navigator.languages;
-        } else {
-            userLanguages = [navigator.language || navigator.userLanguage];
-        }
-
-        for (var i = 0;i < userLanguages.length;i++) {
-            var userLang = userLanguages[i];
-            userLang = userLang.toLowerCase();
-            userLang = userLang.replace("_", "-");
-            userLang = userLang.split("-");
-
-            // Built-in default?
-            if ((userLang[0] === 'en') &&
-                ((userLang[1] === undefined) || (userLang[1] === 'us'))) {
-                return;
-            }
-
-            // First pass: perfect match
-            for (var j = 0;j < supportedLanguages.length;j++) {
-                var supLang = supportedLanguages[j];
-                supLang = supLang.toLowerCase();
-                supLang = supLang.replace("_", "-");
-                supLang = supLang.split("-");
-
-                if (userLang[0] !== supLang[0])
-                    continue;
-                if (userLang[1] !== supLang[1])
-                    continue;
-
-                this.language = supportedLanguages[j];
-                return;
-            }
-
-            // Second pass: fallback
-            for (var j = 0;j < supportedLanguages.length;j++) {
-                supLang = supportedLanguages[j];
-                supLang = supLang.toLowerCase();
-                supLang = supLang.replace("_", "-");
-                supLang = supLang.split("-");
-
-                if (userLang[0] !== supLang[0])
-                    continue;
-                if (supLang[1] !== undefined)
-                    continue;
-
-                this.language = supportedLanguages[j];
-                return;
-            }
-        }
-    },
-
-    // Retrieve localised text
-    get: function (id) {
-        if (typeof this.dictionary !== 'undefined' && this.dictionary[id]) {
-            return this.dictionary[id];
-        } else {
-            return id;
-        }
-    },
-
-    // Traverses the DOM and translates relevant fields
-    // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate
-    translateDOM: function () {
-        var self = this;
-        function process(elem, enabled) {
-            function isAnyOf(searchElement, items) {
-                return items.indexOf(searchElement) !== -1;
-            }
-
-            function translateAttribute(elem, attr) {
-                var str = elem.getAttribute(attr);
-                str = self.get(str);
-                elem.setAttribute(attr, str);
-            }
-
-            function translateTextNode(node) {
-                var str = node.data.trim();
-                str = self.get(str);
-                node.data = str;
-            }
-
-            if (elem.hasAttribute("translate")) {
-                if (isAnyOf(elem.getAttribute("translate"), ["", "yes"])) {
-                    enabled = true;
-                } else if (isAnyOf(elem.getAttribute("translate"), ["no"])) {
-                    enabled = false;
-                }
-            }
-
-            if (enabled) {
-                if (elem.hasAttribute("abbr") &&
-                    elem.tagName === "TH") {
-                    translateAttribute(elem, "abbr");
-                }
-                if (elem.hasAttribute("alt") &&
-                    isAnyOf(elem.tagName, ["AREA", "IMG", "INPUT"])) {
-                    translateAttribute(elem, "alt");
-                }
-                if (elem.hasAttribute("download") &&
-                    isAnyOf(elem.tagName, ["A", "AREA"])) {
-                    translateAttribute(elem, "download");
-                }
-                if (elem.hasAttribute("label") &&
-                    isAnyOf(elem.tagName, ["MENUITEM", "MENU", "OPTGROUP",
-                                   "OPTION", "TRACK"])) {
-                    translateAttribute(elem, "label");
-                }
-                // FIXME: Should update "lang"
-                if (elem.hasAttribute("placeholder") &&
-                    isAnyOf(elem.tagName, ["INPUT", "TEXTAREA"])) {
-                    translateAttribute(elem, "placeholder");
-                }
-                if (elem.hasAttribute("title")) {
-                    translateAttribute(elem, "title");
-                }
-                if (elem.hasAttribute("value") &&
-                    elem.tagName === "INPUT" &&
-                    isAnyOf(elem.getAttribute("type"), ["reset", "button", "submit"])) {
-                    translateAttribute(elem, "value");
-                }
-            }
-
-            for (var i = 0;i < elem.childNodes.length;i++) {
-                var node = elem.childNodes[i];
-                if (node.nodeType === node.ELEMENT_NODE) {
-                    process(node, enabled);
-                } else if (node.nodeType === node.TEXT_NODE && enabled) {
-                    translateTextNode(node);
-                }
-            }
-        }
-
-        process(document.body, true);
-    },
-};
-
-export var l10n = new Localizer();
-export default l10n.get.bind(l10n);

+ 0 - 4
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/CREDITS

@@ -1,4 +0,0 @@
-bell
-        Copyright: Dr. Richard Boulanger et al
-        URL: http://www.archive.org/details/Berklee44v12
-        License: CC-BY Attribution 3.0 Unported

BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.mp3


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.oga


+ 0 - 902
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/base.css

@@ -1,902 +0,0 @@
-/*
- * noVNC base CSS
- * Copyright (C) 2012 Joel Martin
- * Copyright (C) 2016 Samuel Mannehed for Cendio AB
- * Copyright (C) 2016 Pierre Ossman for Cendio AB
- * noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
- * This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
- */
-
-/*
- * Z index layers:
- *
- * 0: Main screen
- * 10: Control bar
- * 50: Transition blocker
- * 60: Connection popups
- * 100: Status bar
- * ...
- * 1000: Javascript crash
- * ...
- * 10000: Max (used for polyfills)
- */
-
-body {
-  margin:0;
-  padding:0;
-  font-family: Helvetica;
-  /*Background image with light grey curve.*/
-  background-color:#494949;
-  background-repeat:no-repeat;
-  background-position:right bottom;
-  height:100%;
-  touch-action: none;
-}
-
-html {
-  height:100%;
-}
-
-.noVNC_only_touch.noVNC_hidden {
-  display: none;
-}
-
-.noVNC_disabled {
-  color: rgb(128, 128, 128);
-}
-
-/* ----------------------------------------
- * Spinner
- * ----------------------------------------
- */
-
-.noVNC_spinner {
-  position: relative;
-}
-.noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after {
-  width: 10px;
-  height: 10px;
-  border-radius: 2px;
-  box-shadow: -60px 10px 0 rgba(255, 255, 255, 0);
-  animation: noVNC_spinner 1.0s linear infinite;
-}
-.noVNC_spinner::before {
-  content: "";
-  position: absolute;
-  left: 0px;
-  top: 0px;
-  animation-delay: -0.1s;
-}
-.noVNC_spinner::after {
-  content: "";
-  position: absolute;
-  top: 0px;
-  left: 0px;
-  animation-delay: 0.1s;
-}
-@keyframes noVNC_spinner {
-  0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; }
-  25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; }
-  50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; }
-}
-
-/* ----------------------------------------
- * Input Elements
- * ----------------------------------------
- */
-
-input[type=input], input[type=password], input[type=number],
-input:not([type]), textarea {
-  /* Disable default rendering */
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  background: none;
-
-  margin: 2px;
-  padding: 2px;
-  border: 1px solid rgb(192, 192, 192);
-  border-radius: 5px;
-  color: black;
-  background: linear-gradient(to top, rgb(255, 255, 255) 80%, rgb(240, 240, 240));
-}
-
-input[type=button], input[type=submit], select {
-  /* Disable default rendering */
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  background: none;
-
-  margin: 2px;
-  padding: 2px;
-  border: 1px solid rgb(192, 192, 192);
-  border-bottom-width: 2px;
-  border-radius: 5px;
-  color: black;
-  background: linear-gradient(to top, rgb(255, 255, 255), rgb(240, 240, 240));
-
-  /* This avoids it jumping around when :active */
-  vertical-align: middle;
-}
-
-input[type=button], input[type=submit] {
-  padding-left: 20px;
-  padding-right: 20px;
-}
-
-option {
-  color: black;
-  background: white;
-}
-
-input[type=input]:focus, input[type=password]:focus,
-input:not([type]):focus, input[type=button]:focus,
-input[type=submit]:focus,
-textarea:focus, select:focus {
-  box-shadow: 0px 0px 3px rgba(74, 144, 217, 0.5);
-  border-color: rgb(74, 144, 217);
-  outline: none;
-}
-
-input[type=button]::-moz-focus-inner,
-input[type=submit]::-moz-focus-inner {
-  border: none;
-}
-
-input[type=input]:disabled, input[type=password]:disabled,
-input:not([type]):disabled, input[type=button]:disabled,
-input[type=submit]:disabled, input[type=number]:disabled,
-textarea:disabled, select:disabled {
-  color: rgb(128, 128, 128);
-  background: rgb(240, 240, 240);
-}
-
-input[type=button]:active, input[type=submit]:active,
-select:active {
-  border-bottom-width: 1px;
-  margin-top: 3px;
-}
-
-:root:not(.noVNC_touch) input[type=button]:hover:not(:disabled),
-:root:not(.noVNC_touch) input[type=submit]:hover:not(:disabled),
-:root:not(.noVNC_touch) select:hover:not(:disabled) {
-  background: linear-gradient(to top, rgb(255, 255, 255), rgb(250, 250, 250));
-}
-
-/* ----------------------------------------
- * WebKit centering hacks
- * ----------------------------------------
- */
-
-.noVNC_center {
-  /*
-   * This is a workaround because webkit misrenders transforms and
-   * uses non-integer coordinates, resulting in blurry content.
-   * Ideally we'd use "top: 50%; transform: translateY(-50%);" on
-   * the objects instead.
-   */
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  pointer-events: none;
-}
-.noVNC_center > * {
-  pointer-events: auto;
-}
-.noVNC_vcenter {
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  position: fixed;
-  top: 0;
-  left: 0;
-  height: 100%;
-  pointer-events: none;
-}
-.noVNC_vcenter > * {
-  pointer-events: auto;
-}
-
-/* ----------------------------------------
- * Layering
- * ----------------------------------------
- */
-
-.noVNC_connect_layer {
-  z-index: 60;
-}
-
-/* ----------------------------------------
- * Fallback error
- * ----------------------------------------
- */
-
-#noVNC_fallback_error {
-  z-index: 1000;
-  visibility: hidden;
-}
-#noVNC_fallback_error.noVNC_open {
-  visibility: visible;
-}
-
-#noVNC_fallback_error > div {
-  max-width: 90%;
-  padding: 15px;
-
-  transition: 0.5s ease-in-out;
-
-  transform: translateY(-50px);
-  opacity: 0;
-
-  text-align: center;
-  font-weight: bold;
-  color: #fff;
-
-  border-radius: 10px;
-  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
-  background: rgba(200,55,55,0.8);
-}
-#noVNC_fallback_error.noVNC_open > div {
-  transform: translateY(0);
-  opacity: 1;
-}
-
-#noVNC_fallback_errormsg {
-  font-weight: normal;
-}
-
-#noVNC_fallback_errormsg .noVNC_message {
-  display: inline-block;
-  text-align: left;
-  font-family: monospace;
-  white-space: pre-wrap;
-}
-
-#noVNC_fallback_error .noVNC_location {
-  font-style: italic;
-  font-size: 0.8em;
-  color: rgba(255, 255, 255, 0.8);
-}
-
-#noVNC_fallback_error .noVNC_stack {
-  max-height: 50vh;
-  padding: 10px;
-  margin: 10px;
-  font-size: 0.8em;
-  text-align: left;
-  font-family: monospace;
-  white-space: pre;
-  border: 1px solid rgba(0, 0, 0, 0.5);
-  background: rgba(0, 0, 0, 0.2);
-  overflow: auto;
-}
-
-/* ----------------------------------------
- * Control Bar
- * ----------------------------------------
- */
-
-#noVNC_control_bar_anchor {
-  /* The anchor is needed to get z-stacking to work */
-  position: fixed;
-  z-index: 10;
-
-  transition: 0.5s ease-in-out;
-
-  /* Edge misrenders animations wihthout this */
-  transform: translateX(0);
-}
-:root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle {
-  opacity: 0.8;
-}
-#noVNC_control_bar_anchor.noVNC_right {
-  left: auto;
-  right: 0;
-}
-
-#noVNC_control_bar {
-  position: relative;
-  left: -100%;
-
-  transition: 0.5s ease-in-out;
-
-  background-color: rgb(110, 132, 163);
-  border-radius: 0 10px 10px 0;
-
-}
-#noVNC_control_bar.noVNC_open {
-  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
-  left: 0;
-}
-#noVNC_control_bar::before {
-  /* This extra element is to get a proper shadow */
-  content: "";
-  position: absolute;
-  z-index: -1;
-  height: 100%;
-  width: 30px;
-  left: -30px;
-  transition: box-shadow 0.5s ease-in-out;
-}
-#noVNC_control_bar.noVNC_open::before {
-  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
-}
-.noVNC_right #noVNC_control_bar {
-  left: 100%;
-  border-radius: 10px 0 0 10px;
-}
-.noVNC_right #noVNC_control_bar.noVNC_open {
-  left: 0;
-}
-.noVNC_right #noVNC_control_bar::before {
-  visibility: hidden;
-}
-
-#noVNC_control_bar_handle {
-  position: absolute;
-  left: -15px;
-  top: 0;
-  transform: translateY(35px);
-  width: calc(100% + 30px);
-  height: 50px;
-  z-index: -1;
-  cursor: pointer;
-  border-radius: 5px;
-  background-color: rgb(83, 99, 122);
-  background-image: url("../images/handle_bg.svg");
-  background-repeat: no-repeat;
-  background-position: right;
-  box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5);
-}
-#noVNC_control_bar_handle:after {
-  content: "";
-  transition: transform 0.5s ease-in-out;
-  background: url("../images/handle.svg");
-  position: absolute;
-  top: 22px; /* (50px-6px)/2 */
-  right: 5px;
-  width: 5px;
-  height: 6px;
-}
-#noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
-  transform: translateX(1px) rotate(180deg);
-}
-:root:not(.noVNC_connected) #noVNC_control_bar_handle {
-  display: none;
-}
-.noVNC_right #noVNC_control_bar_handle {
-  background-position: left;
-}
-.noVNC_right #noVNC_control_bar_handle:after {
-  left: 5px;
-  right: 0;
-  transform: translateX(1px) rotate(180deg);
-}
-.noVNC_right #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
-  transform: none;
-}
-#noVNC_control_bar_handle div {
-  position: absolute;
-  right: -35px;
-  top: 0;
-  width: 50px;
-  height: 50px;
-}
-:root:not(.noVNC_touch) #noVNC_control_bar_handle div {
-  display: none;
-}
-.noVNC_right #noVNC_control_bar_handle div {
-  left: -35px;
-  right: auto;
-}
-
-#noVNC_control_bar .noVNC_scroll {
-  max-height: 100vh; /* Chrome is buggy with 100% */
-  overflow-x: hidden;
-  overflow-y: auto;
-  padding: 0 10px 0 5px;
-}
-.noVNC_right #noVNC_control_bar .noVNC_scroll {
-  padding: 0 5px 0 10px;
-}
-
-/* Control bar hint */
-#noVNC_control_bar_hint {
-  position: fixed;
-  left: calc(100vw - 50px);
-  right: auto;
-  top: 50%;
-  transform: translateY(-50%) scale(0);
-  width: 100px;
-  height: 50%;
-  max-height: 600px;
-
-  visibility: hidden;
-  opacity: 0;
-  transition: 0.2s ease-in-out;
-  background: transparent;
-  box-shadow: 0 0 10px black, inset 0 0 10px 10px rgba(110, 132, 163, 0.8);
-  border-radius: 10px;
-  transition-delay: 0s;
-}
-#noVNC_control_bar_anchor.noVNC_right #noVNC_control_bar_hint{
-  left: auto;
-  right: calc(100vw - 50px);
-}
-#noVNC_control_bar_hint.noVNC_active {
-  visibility: visible;
-  opacity: 1;
-  transition-delay: 0.2s;
-  transform: translateY(-50%) scale(1);
-}
-
-/* General button style */
-.noVNC_button {
-  display: block;
-  padding: 4px 4px;
-  margin: 10px 0;
-  vertical-align: middle;
-  border:1px solid rgba(255, 255, 255, 0.2);
-  border-radius: 6px;
-}
-.noVNC_button.noVNC_selected {
-  border-color: rgba(0, 0, 0, 0.8);
-  background: rgba(0, 0, 0, 0.5);
-}
-.noVNC_button:disabled {
-  opacity: 0.4;
-}
-.noVNC_button:focus {
-  outline: none;
-}
-.noVNC_button:active {
-  padding-top: 5px;
-  padding-bottom: 3px;
-}
-/* Android browsers don't properly update hover state if touch events
- * are intercepted, but focus should be safe to display */
-:root:not(.noVNC_touch) .noVNC_button.noVNC_selected:hover,
-.noVNC_button.noVNC_selected:focus {
-  border-color: rgba(0, 0, 0, 0.4);
-  background: rgba(0, 0, 0, 0.2);
-}
-:root:not(.noVNC_touch) .noVNC_button:hover,
-.noVNC_button:focus {
-  background: rgba(255, 255, 255, 0.2);
-}
-.noVNC_button.noVNC_hidden {
-  display: none;
-}
-
-/* Panels */
-.noVNC_panel {
-  transform: translateX(25px);
-
-  transition: 0.5s ease-in-out;
-
-  max-height: 100vh; /* Chrome is buggy with 100% */
-  overflow-x: hidden;
-  overflow-y: auto;
-
-  visibility: hidden;
-  opacity: 0;
-
-  padding: 15px;
-
-  background: #fff;
-  border-radius: 10px;
-  color: #000;
-  border: 2px solid #E0E0E0;
-  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
-}
-.noVNC_panel.noVNC_open {
-  visibility: visible;
-  opacity: 1;
-  transform: translateX(75px);
-}
-.noVNC_right .noVNC_vcenter {
-  left: auto;
-  right: 0;
-}
-.noVNC_right .noVNC_panel {
-  transform: translateX(-25px);
-}
-.noVNC_right .noVNC_panel.noVNC_open {
-  transform: translateX(-75px);
-}
-
-.noVNC_panel hr {
-  border: none;
-  border-top: 1px solid rgb(192, 192, 192);
-}
-
-.noVNC_panel label {
-  display: block;
-  white-space: nowrap;
-}
-
-.noVNC_panel .noVNC_heading {
-  background-color: rgb(110, 132, 163);
-  border-radius: 5px;
-  padding: 5px;
-  /* Compensate for padding in image */
-  padding-right: 8px;
-  color: white;
-  font-size: 20px;
-  margin-bottom: 10px;
-  white-space: nowrap;
-}
-.noVNC_panel .noVNC_heading img {
-  vertical-align: bottom;
-}
-
-.noVNC_submit {
-  float: right;
-}
-
-/* Expanders */
-.noVNC_expander {
-  cursor: pointer;
-}
-.noVNC_expander::before {
-  content: url("../images/expander.svg");
-  display: inline-block;
-  margin-right: 5px;
-  transition: 0.2s ease-in-out;
-}
-.noVNC_expander.noVNC_open::before {
-  transform: rotateZ(90deg);
-}
-.noVNC_expander ~ * {
-  margin: 5px;
-  margin-left: 10px;
-  padding: 5px;
-  background: rgba(0, 0, 0, 0.05);
-  border-radius: 5px;
-}
-.noVNC_expander:not(.noVNC_open) ~ * {
-  display: none;
-}
-
-/* Control bar content */
-
-#noVNC_control_bar .noVNC_logo {
-  font-size: 13px;
-}
-
-:root:not(.noVNC_connected) #noVNC_view_drag_button {
-  display: none;
-}
-
-/* noVNC Touch Device only buttons */
-:root:not(.noVNC_connected) #noVNC_mobile_buttons {
-  display: none;
-}
-:root:not(.noVNC_touch) #noVNC_mobile_buttons {
-  display: none;
-}
-
-/* Extra manual keys */
-:root:not(.noVNC_connected) #noVNC_extra_keys {
-  display: none;
-}
-
-#noVNC_modifiers {
-  background-color: rgb(92, 92, 92);
-  border: none;
-  padding: 0 10px;
-}
-
-/* Shutdown/Reboot */
-:root:not(.noVNC_connected) #noVNC_power_button {
-  display: none;
-}
-#noVNC_power {
-}
-#noVNC_power_buttons {
-  display: none;
-}
-
-#noVNC_power input[type=button] {
-  width: 100%;
-}
-
-/* Clipboard */
-:root:not(.noVNC_connected) #noVNC_clipboard_button {
-  display: none;
-}
-#noVNC_clipboard {
-  /* Full screen, minus padding and left and right margins */
-  max-width: calc(100vw - 2*15px - 75px - 25px);
-}
-#noVNC_clipboard_text {
-  width: 500px;
-  max-width: 100%;
-}
-
-/* Settings */
-#noVNC_settings {
-}
-#noVNC_settings ul {
-  list-style: none;
-  margin: 0px;
-  padding: 0px;
-}
-#noVNC_setting_port {
-  width: 80px;
-}
-#noVNC_setting_path {
-  width: 100px;
-}
-
-/* Connection Controls */
-:root:not(.noVNC_connected) #noVNC_disconnect_button {
-  display: none;
-}
-
-/* ----------------------------------------
- * Status Dialog
- * ----------------------------------------
- */
-
-#noVNC_status {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  z-index: 100;
-  transform: translateY(-100%);
-
-  cursor: pointer;
-
-  transition: 0.5s ease-in-out;
-
-  visibility: hidden;
-  opacity: 0;
-
-  padding: 5px;
-
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-content: center;
-
-  line-height: 25px;
-  word-wrap: break-word;
-  color: #fff;
-
-  border-bottom: 1px solid rgba(0, 0, 0, 0.9);
-}
-#noVNC_status.noVNC_open {
-  transform: translateY(0);
-  visibility: visible;
-  opacity: 1;
-}
-
-#noVNC_status::before {
-  content: "";
-  display: inline-block;
-  width: 25px;
-  height: 25px;
-  margin-right: 5px;
-}
-
-#noVNC_status.noVNC_status_normal {
-  background: rgba(128,128,128,0.9);
-}
-#noVNC_status.noVNC_status_normal::before {
-  content: url("../images/info.svg") " ";
-}
-#noVNC_status.noVNC_status_error {
-  background: rgba(200,55,55,0.9);
-}
-#noVNC_status.noVNC_status_error::before {
-  content: url("../images/error.svg") " ";
-}
-#noVNC_status.noVNC_status_warn {
-  background: rgba(180,180,30,0.9);
-}
-#noVNC_status.noVNC_status_warn::before {
-  content: url("../images/warning.svg") " ";
-}
-
-/* ----------------------------------------
- * Connect Dialog
- * ----------------------------------------
- */
-
-#noVNC_connect_dlg {
-  transition: 0.5s ease-in-out;
-
-  transform: scale(0, 0);
-  visibility: hidden;
-  opacity: 0;
-}
-#noVNC_connect_dlg.noVNC_open {
-  transform: scale(1, 1);
-  visibility: visible;
-  opacity: 1;
-}
-#noVNC_connect_dlg .noVNC_logo {
-  transition: 0.5s ease-in-out;
-  padding: 10px;
-  margin-bottom: 10px;
-
-  font-size: 80px;
-  text-align: center;
-
-  border-radius: 5px;
-}
-@media (max-width: 440px) {
-  #noVNC_connect_dlg {
-    max-width: calc(100vw - 100px);
-  }
-  #noVNC_connect_dlg .noVNC_logo {
-    font-size: calc(25vw - 30px);
-  }
-}
-#noVNC_connect_button {
-  cursor: pointer;
-
-  padding: 10px;
-
-  color: white;
-  background-color: rgb(110, 132, 163);
-  border-radius: 12px;
-
-  text-align: center;
-  font-size: 20px;
-
-  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
-}
-#noVNC_connect_button div {
-  margin: 2px;
-  padding: 5px 30px;
-  border: 1px solid rgb(83, 99, 122);
-  border-bottom-width: 2px;
-  border-radius: 5px;
-  background: linear-gradient(to top, rgb(110, 132, 163), rgb(99, 119, 147));
-
-  /* This avoids it jumping around when :active */
-  vertical-align: middle;
-}
-#noVNC_connect_button div:active {
-  border-bottom-width: 1px;
-  margin-top: 3px;
-}
-:root:not(.noVNC_touch) #noVNC_connect_button div:hover {
-  background: linear-gradient(to top, rgb(110, 132, 163), rgb(105, 125, 155));
-}
-
-#noVNC_connect_button img {
-  vertical-align: bottom;
-  height: 1.3em;
-}
-
-/* ----------------------------------------
- * Password Dialog
- * ----------------------------------------
- */
-
-#noVNC_password_dlg {
-  position: relative;
-
-  transform: translateY(-50px);
-}
-#noVNC_password_dlg.noVNC_open {
-  transform: translateY(0);
-}
-#noVNC_password_dlg ul {
-  list-style: none;
-  margin: 0px;
-  padding: 0px;
-}
-
-/* ----------------------------------------
- * Main Area
- * ----------------------------------------
- */
-
-/* Transition screen */
-#noVNC_transition {
-  display: none;
-
-  position: fixed;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-
-  color: white;
-  background: rgba(0, 0, 0, 0.5);
-  z-index: 50;
-
-  /*display: flex;*/
-  align-items: center;
-  justify-content: center;
-  flex-direction: column;
-}
-:root.noVNC_loading #noVNC_transition,
-:root.noVNC_connecting #noVNC_transition,
-:root.noVNC_disconnecting #noVNC_transition,
-:root.noVNC_reconnecting #noVNC_transition {
-  display: flex;
-}
-:root:not(.noVNC_reconnecting) #noVNC_cancel_reconnect_button {
-  display: none;
-}
-#noVNC_transition_text {
-  font-size: 1.5em;
-}
-
-/* Main container */
-#noVNC_container {
-  width: 100%;
-  height: 100%;
-  background-color: #313131;
-  border-bottom-right-radius: 800px 600px;
-  /*border-top-left-radius: 800px 600px;*/
-}
-
-#noVNC_keyboardinput {
-  width: 1px;
-  height: 1px;
-  background-color: #fff;
-  color: #fff;
-  border: 0;
-  position: absolute;
-  left: -40px;
-  z-index: -1;
-  ime-mode: disabled;
-}
-
-/*Default noVNC logo.*/
-/* From: http://fonts.googleapis.com/css?family=Orbitron:700 */
-@font-face {
-  font-family: 'Orbitron';
-  font-style: normal;
-  font-weight: 700;
-  src: local('?'), url('Orbitron700.woff') format('woff'),
-                   url('Orbitron700.ttf') format('truetype');
-}
-
-.noVNC_logo {
-  color:yellow;
-  font-family: 'Orbitron', 'OrbitronTTF', sans-serif;
-  line-height:90%;
-  text-shadow: 0.1em 0.1em 0 black;
-}
-.noVNC_logo span{
-  color:green;
-}
-
-#noVNC_bell {
-  display: none;
-}
-
-/* ----------------------------------------
- * Media sizing
- * ----------------------------------------
- */
-
-@media screen and (max-width: 640px){
-  #noVNC_logo {
-    font-size: 150px;
-  }
-}
-
-@media screen and (min-width: 321px) and (max-width: 480px) {
-  #noVNC_logo {
-    font-size: 110px;
-  }
-}
-
-@media screen and (max-width: 320px) {
-  #noVNC_logo {
-    font-size: 90px;
-  }
-}

+ 0 - 63
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/lite.css

@@ -1,63 +0,0 @@
-/*
- * noVNC auto CSS
- * Copyright (C) 2012 Joel Martin
- * Copyright (C) 2017 Samuel Mannehed for Cendio AB
- * noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
- * This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
- */
-
-body {
-  margin:0;
-  background-color:#313131;
-  border-bottom-right-radius: 800px 600px;
-  height:100%;
-  display: flex;
-  flex-direction: column;
-}
-
-html {
-  background-color:#494949;
-  height:100%;
-}
-
-#noVNC_status_bar {
-  width: 100%;
-  display:flex;
-  justify-content: space-between;
-}
-
-#noVNC_status {
-  color: #fff;
-  font: bold 12px Helvetica;
-  margin: auto;
-}
-
-.noVNC_status_normal {
-  background: linear-gradient(#b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
-}
-
-.noVNC_status_error {
-  background: linear-gradient(#c83737 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
-}
-
-.noVNC_status_warn {
-  background: linear-gradient(#b4b41e 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
-}
-
-.noNVC_shown {
-  display: inline;
-}
-.noVNC_hidden {
-  display: none;
-}
-
-#noVNC_left_dummy_elem {
-  flex: 1;
-}
-
-#noVNC_buttons {
-  padding: 1px;
-  flex: 1;
-  display: flex;
-  justify-content: flex-end;
-}

+ 0 - 1669
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/ui.js

@@ -1,1669 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Copyright (C) 2016 Samuel Mannehed for Cendio AB
- * Copyright (C) 2016 Pierre Ossman for Cendio AB
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-import * as Log from '../core/util/logging.js';
-import _, { l10n } from './localization.js';
-import { isTouchDevice } from '../core/util/browser.js';
-import { setCapture, getPointerEvent } from '../core/util/events.js';
-import KeyTable from "../core/input/keysym.js";
-import keysyms from "../core/input/keysymdef.js";
-import Keyboard from "../core/input/keyboard.js";
-import RFB from "../core/rfb.js";
-import Display from "../core/display.js";
-import * as WebUtil from "./webutil.js";
-
-var UI = {
-
-    connected: false,
-    desktopName: "",
-
-    statusTimeout: null,
-    hideKeyboardTimeout: null,
-    idleControlbarTimeout: null,
-    closeControlbarTimeout: null,
-
-    controlbarGrabbed: false,
-    controlbarDrag: false,
-    controlbarMouseDownClientY: 0,
-    controlbarMouseDownOffsetY: 0,
-
-    isSafari: false,
-    lastKeyboardinput: null,
-    defaultKeyboardinputLen: 100,
-
-    inhibit_reconnect: true,
-    reconnect_callback: null,
-    reconnect_password: null,
-
-    prime: function(callback) {
-        if (document.readyState === "interactive" || document.readyState === "complete") {
-            UI.load(callback);
-        } else {
-            document.addEventListener('DOMContentLoaded', UI.load.bind(UI, callback));
-        }
-    },
-
-    // Setup rfb object, load settings from browser storage, then call
-    // UI.init to setup the UI/menus
-    load: function(callback) {
-        WebUtil.initSettings(UI.start, callback);
-    },
-
-    // Render default UI and initialize settings menu
-    start: function(callback) {
-
-        // Setup global variables first
-        UI.isSafari = (navigator.userAgent.indexOf('Safari') !== -1 &&
-                       navigator.userAgent.indexOf('Chrome') === -1);
-
-        UI.initSettings();
-
-        // Translate the DOM
-        l10n.translateDOM();
-
-        // Adapt the interface for touch screen devices
-        if (isTouchDevice) {
-            document.documentElement.classList.add("noVNC_touch");
-            // Remove the address bar
-            setTimeout(function() { window.scrollTo(0, 1); }, 100);
-        }
-
-        // Restore control bar position
-        if (WebUtil.readSetting('controlbar_pos') === 'right') {
-            UI.toggleControlbarSide();
-        }
-
-        UI.initFullscreen();
-
-        // Setup event handlers
-        UI.addControlbarHandlers();
-        UI.addTouchSpecificHandlers();
-        UI.addExtraKeysHandlers();
-        UI.addMachineHandlers();
-        UI.addConnectionControlHandlers();
-        UI.addClipboardHandlers();
-        UI.addSettingsHandlers();
-        document.getElementById("noVNC_status")
-            .addEventListener('click', UI.hideStatus);
-
-        // Bootstrap fallback input handler
-        UI.keyboardinputReset();
-
-        UI.openControlbar();
-
-        UI.updateVisualState('init');
-
-        document.documentElement.classList.remove("noVNC_loading");
-
-        var autoconnect = WebUtil.getConfigVar('autoconnect', false);
-        if (autoconnect === 'true' || autoconnect == '1') {
-            autoconnect = true;
-            UI.connect();
-        } else {
-            autoconnect = false;
-            // Show the connect panel on first load unless autoconnecting
-            UI.openConnectPanel();
-        }
-
-        if (typeof callback === "function") {
-            callback(UI.rfb);
-        }
-    },
-
-    initFullscreen: function() {
-        // Only show the button if fullscreen is properly supported
-        // * Safari doesn't support alphanumerical input while in fullscreen
-        if (!UI.isSafari &&
-            (document.documentElement.requestFullscreen ||
-             document.documentElement.mozRequestFullScreen ||
-             document.documentElement.webkitRequestFullscreen ||
-             document.body.msRequestFullscreen)) {
-            document.getElementById('noVNC_fullscreen_button')
-                .classList.remove("noVNC_hidden");
-            UI.addFullscreenHandlers();
-        }
-    },
-
-    initSettings: function() {
-        var i;
-
-        // Logging selection dropdown
-        var llevels = ['error', 'warn', 'info', 'debug'];
-        for (i = 0; i < llevels.length; i += 1) {
-            UI.addOption(document.getElementById('noVNC_setting_logging'),llevels[i], llevels[i]);
-        }
-
-        // Settings with immediate effects
-        UI.initSetting('logging', 'warn');
-        UI.updateLogging();
-
-        // if port == 80 (or 443) then it won't be present and should be
-        // set manually
-        var port = window.location.port;
-        if (!port) {
-            if (window.location.protocol.substring(0,5) == 'https') {
-                port = 443;
-            }
-            else if (window.location.protocol.substring(0,4) == 'http') {
-                port = 80;
-            }
-        }
-
-        /* Populate the controls if defaults are provided in the URL */
-        UI.initSetting('host', window.location.hostname);
-        UI.initSetting('port', port);
-        UI.initSetting('encrypt', (window.location.protocol === "https:"));
-        UI.initSetting('view_clip', false);
-        UI.initSetting('resize', 'off');
-        UI.initSetting('shared', true);
-        UI.initSetting('view_only', false);
-        UI.initSetting('path', 'websockify');
-        UI.initSetting('repeaterID', '');
-        UI.initSetting('reconnect', false);
-        UI.initSetting('reconnect_delay', 5000);
-
-        UI.setupSettingLabels();
-    },
-    // Adds a link to the label elements on the corresponding input elements
-    setupSettingLabels: function() {
-        var labels = document.getElementsByTagName('LABEL');
-        for (var i = 0; i < labels.length; i++) {
-            var htmlFor = labels[i].htmlFor;
-            if (htmlFor != '') {
-                var elem = document.getElementById(htmlFor);
-                if (elem) elem.label = labels[i];
-            } else {
-                // If 'for' isn't set, use the first input element child
-                var children = labels[i].children;
-                for (var j = 0; j < children.length; j++) {
-                    if (children[j].form !== undefined) {
-                        children[j].label = labels[i];
-                        break;
-                    }
-                }
-            }
-        }
-    },
-
-/* ------^-------
-*     /INIT
-* ==============
-* EVENT HANDLERS
-* ------v------*/
-
-    addControlbarHandlers: function() {
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('mousemove', UI.activateControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('mouseup', UI.activateControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('mousedown', UI.activateControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('keydown', UI.activateControlbar);
-
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('mousedown', UI.keepControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('keydown', UI.keepControlbar);
-
-        document.getElementById("noVNC_view_drag_button")
-            .addEventListener('click', UI.toggleViewDrag);
-
-        document.getElementById("noVNC_control_bar_handle")
-            .addEventListener('mousedown', UI.controlbarHandleMouseDown);
-        document.getElementById("noVNC_control_bar_handle")
-            .addEventListener('mouseup', UI.controlbarHandleMouseUp);
-        document.getElementById("noVNC_control_bar_handle")
-            .addEventListener('mousemove', UI.dragControlbarHandle);
-        // resize events aren't available for elements
-        window.addEventListener('resize', UI.updateControlbarHandle);
-
-        var exps = document.getElementsByClassName("noVNC_expander");
-        for (var i = 0;i < exps.length;i++) {
-            exps[i].addEventListener('click', UI.toggleExpander);
-        }
-    },
-
-    addTouchSpecificHandlers: function() {
-        document.getElementById("noVNC_mouse_button0")
-            .addEventListener('click', function () { UI.setMouseButton(1); });
-        document.getElementById("noVNC_mouse_button1")
-            .addEventListener('click', function () { UI.setMouseButton(2); });
-        document.getElementById("noVNC_mouse_button2")
-            .addEventListener('click', function () { UI.setMouseButton(4); });
-        document.getElementById("noVNC_mouse_button4")
-            .addEventListener('click', function () { UI.setMouseButton(0); });
-        document.getElementById("noVNC_keyboard_button")
-            .addEventListener('click', UI.toggleVirtualKeyboard);
-
-        UI.touchKeyboard = new Keyboard(document.getElementById('noVNC_keyboardinput'));
-        UI.touchKeyboard.onkeyevent = UI.keyEvent;
-        UI.touchKeyboard.grab();
-        document.getElementById("noVNC_keyboardinput")
-            .addEventListener('input', UI.keyInput);
-        document.getElementById("noVNC_keyboardinput")
-            .addEventListener('focus', UI.onfocusVirtualKeyboard);
-        document.getElementById("noVNC_keyboardinput")
-            .addEventListener('blur', UI.onblurVirtualKeyboard);
-        document.getElementById("noVNC_keyboardinput")
-            .addEventListener('submit', function () { return false; });
-
-        document.documentElement
-            .addEventListener('mousedown', UI.keepVirtualKeyboard, true);
-
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('touchstart', UI.activateControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('touchmove', UI.activateControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('touchend', UI.activateControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('input', UI.activateControlbar);
-
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('touchstart', UI.keepControlbar);
-        document.getElementById("noVNC_control_bar")
-            .addEventListener('input', UI.keepControlbar);
-
-        document.getElementById("noVNC_control_bar_handle")
-            .addEventListener('touchstart', UI.controlbarHandleMouseDown);
-        document.getElementById("noVNC_control_bar_handle")
-            .addEventListener('touchend', UI.controlbarHandleMouseUp);
-        document.getElementById("noVNC_control_bar_handle")
-            .addEventListener('touchmove', UI.dragControlbarHandle);
-    },
-
-    addExtraKeysHandlers: function() {
-        document.getElementById("noVNC_toggle_extra_keys_button")
-            .addEventListener('click', UI.toggleExtraKeys);
-        document.getElementById("noVNC_toggle_ctrl_button")
-            .addEventListener('click', UI.toggleCtrl);
-        document.getElementById("noVNC_toggle_alt_button")
-            .addEventListener('click', UI.toggleAlt);
-        document.getElementById("noVNC_send_tab_button")
-            .addEventListener('click', UI.sendTab);
-        document.getElementById("noVNC_send_esc_button")
-            .addEventListener('click', UI.sendEsc);
-        document.getElementById("noVNC_send_ctrl_alt_del_button")
-            .addEventListener('click', UI.sendCtrlAltDel);
-    },
-
-    addMachineHandlers: function() {
-        document.getElementById("noVNC_shutdown_button")
-            .addEventListener('click', function() { UI.rfb.machineShutdown(); });
-        document.getElementById("noVNC_reboot_button")
-            .addEventListener('click', function() { UI.rfb.machineReboot(); });
-        document.getElementById("noVNC_reset_button")
-            .addEventListener('click', function() { UI.rfb.machineReset(); });
-        document.getElementById("noVNC_power_button")
-            .addEventListener('click', UI.togglePowerPanel);
-    },
-
-    addConnectionControlHandlers: function() {
-        document.getElementById("noVNC_disconnect_button")
-            .addEventListener('click', UI.disconnect);
-        document.getElementById("noVNC_connect_button")
-            .addEventListener('click', UI.connect);
-        document.getElementById("noVNC_cancel_reconnect_button")
-            .addEventListener('click', UI.cancelReconnect);
-
-        document.getElementById("noVNC_password_button")
-            .addEventListener('click', UI.setPassword);
-    },
-
-    addClipboardHandlers: function() {
-        document.getElementById("noVNC_clipboard_button")
-            .addEventListener('click', UI.toggleClipboardPanel);
-        document.getElementById("noVNC_clipboard_text")
-            .addEventListener('change', UI.clipboardSend);
-        document.getElementById("noVNC_clipboard_clear_button")
-            .addEventListener('click', UI.clipboardClear);
-    },
-
-    // Add a call to save settings when the element changes,
-    // unless the optional parameter changeFunc is used instead.
-    addSettingChangeHandler: function(name, changeFunc) {
-        var settingElem = document.getElementById("noVNC_setting_" + name);
-        if (changeFunc === undefined) {
-            changeFunc = function () { UI.saveSetting(name); };
-        }
-        settingElem.addEventListener('change', changeFunc);
-    },
-
-    addSettingsHandlers: function() {
-        document.getElementById("noVNC_settings_button")
-            .addEventListener('click', UI.toggleSettingsPanel);
-
-        UI.addSettingChangeHandler('encrypt');
-        UI.addSettingChangeHandler('resize');
-        UI.addSettingChangeHandler('resize', UI.enableDisableViewClip);
-        UI.addSettingChangeHandler('resize', UI.applyResizeMode);
-        UI.addSettingChangeHandler('view_clip');
-        UI.addSettingChangeHandler('view_clip', UI.updateViewClip);
-        UI.addSettingChangeHandler('shared');
-        UI.addSettingChangeHandler('view_only');
-        UI.addSettingChangeHandler('view_only', UI.updateViewOnly);
-        UI.addSettingChangeHandler('host');
-        UI.addSettingChangeHandler('port');
-        UI.addSettingChangeHandler('path');
-        UI.addSettingChangeHandler('repeaterID');
-        UI.addSettingChangeHandler('logging');
-        UI.addSettingChangeHandler('logging', UI.updateLogging);
-        UI.addSettingChangeHandler('reconnect');
-        UI.addSettingChangeHandler('reconnect_delay');
-    },
-
-    addFullscreenHandlers: function() {
-        document.getElementById("noVNC_fullscreen_button")
-            .addEventListener('click', UI.toggleFullscreen);
-
-        window.addEventListener('fullscreenchange', UI.updateFullscreenButton);
-        window.addEventListener('mozfullscreenchange', UI.updateFullscreenButton);
-        window.addEventListener('webkitfullscreenchange', UI.updateFullscreenButton);
-        window.addEventListener('msfullscreenchange', UI.updateFullscreenButton);
-    },
-
-/* ------^-------
- * /EVENT HANDLERS
- * ==============
- *     VISUAL
- * ------v------*/
-
-    // Disable/enable controls depending on connection state
-    updateVisualState: function(state) {
-
-        document.documentElement.classList.remove("noVNC_connecting");
-        document.documentElement.classList.remove("noVNC_connected");
-        document.documentElement.classList.remove("noVNC_disconnecting");
-        document.documentElement.classList.remove("noVNC_reconnecting");
-
-        let transition_elem = document.getElementById("noVNC_transition_text");
-        switch (state) {
-            case 'init':
-                break;
-            case 'connecting':
-                transition_elem.textContent = _("Connecting...");
-                document.documentElement.classList.add("noVNC_connecting");
-                break;
-            case 'connected':
-                document.documentElement.classList.add("noVNC_connected");
-                break;
-            case 'disconnecting':
-                transition_elem.textContent = _("Disconnecting...");
-                document.documentElement.classList.add("noVNC_disconnecting");
-                break;
-            case 'disconnected':
-                break;
-            case 'reconnecting':
-                transition_elem.textContent = _("Reconnecting...");
-                document.documentElement.classList.add("noVNC_reconnecting");
-                break;
-            default:
-                Log.Error("Invalid visual state: " + state);
-                UI.showStatus(_("Internal error"), 'error');
-                return;
-        }
-
-        UI.enableDisableViewClip();
-
-        if (UI.connected) {
-            UI.disableSetting('encrypt');
-            UI.disableSetting('shared');
-            UI.disableSetting('host');
-            UI.disableSetting('port');
-            UI.disableSetting('path');
-            UI.disableSetting('repeaterID');
-            UI.setMouseButton(1);
-
-            // Hide the controlbar after 2 seconds
-            UI.closeControlbarTimeout = setTimeout(UI.closeControlbar, 2000);
-        } else {
-            UI.enableSetting('encrypt');
-            UI.enableSetting('shared');
-            UI.enableSetting('host');
-            UI.enableSetting('port');
-            UI.enableSetting('path');
-            UI.enableSetting('repeaterID');
-            UI.updatePowerButton();
-            UI.keepControlbar();
-        }
-
-        // State change disables viewport dragging.
-        // It is enabled (toggled) by direct click on the button
-        UI.setViewDrag(false);
-
-        // State change also closes the password dialog
-        document.getElementById('noVNC_password_dlg')
-            .classList.remove('noVNC_open');
-    },
-
-    showStatus: function(text, status_type, time) {
-        var statusElem = document.getElementById('noVNC_status');
-
-        clearTimeout(UI.statusTimeout);
-
-        if (typeof status_type === 'undefined') {
-            status_type = 'normal';
-        }
-
-        // Don't overwrite more severe visible statuses and never
-        // errors. Only shows the first error.
-        let visible_status_type = 'none';
-        if (statusElem.classList.contains("noVNC_open")) {
-            if (statusElem.classList.contains("noVNC_status_error")) {
-                visible_status_type = 'error';
-            } else if (statusElem.classList.contains("noVNC_status_warn")) {
-                visible_status_type = 'warn';
-            } else {
-                visible_status_type = 'normal';
-            }
-        }
-        if (visible_status_type === 'error' ||
-            (visible_status_type === 'warn' && status_type === 'normal')) {
-            return;
-        }
-
-        switch (status_type) {
-            case 'error':
-                statusElem.classList.remove("noVNC_status_warn");
-                statusElem.classList.remove("noVNC_status_normal");
-                statusElem.classList.add("noVNC_status_error");
-                break;
-            case 'warning':
-            case 'warn':
-                statusElem.classList.remove("noVNC_status_error");
-                statusElem.classList.remove("noVNC_status_normal");
-                statusElem.classList.add("noVNC_status_warn");
-                break;
-            case 'normal':
-            case 'info':
-            default:
-                statusElem.classList.remove("noVNC_status_error");
-                statusElem.classList.remove("noVNC_status_warn");
-                statusElem.classList.add("noVNC_status_normal");
-                break;
-        }
-
-        statusElem.textContent = text;
-        statusElem.classList.add("noVNC_open");
-
-        // If no time was specified, show the status for 1.5 seconds
-        if (typeof time === 'undefined') {
-            time = 1500;
-        }
-
-        // Error messages do not timeout
-        if (status_type !== 'error') {
-            UI.statusTimeout = window.setTimeout(UI.hideStatus, time);
-        }
-    },
-
-    hideStatus: function() {
-        clearTimeout(UI.statusTimeout);
-        document.getElementById('noVNC_status').classList.remove("noVNC_open");
-    },
-
-    activateControlbar: function(event) {
-        clearTimeout(UI.idleControlbarTimeout);
-        // We manipulate the anchor instead of the actual control
-        // bar in order to avoid creating new a stacking group
-        document.getElementById('noVNC_control_bar_anchor')
-            .classList.remove("noVNC_idle");
-        UI.idleControlbarTimeout = window.setTimeout(UI.idleControlbar, 2000);
-    },
-
-    idleControlbar: function() {
-        document.getElementById('noVNC_control_bar_anchor')
-            .classList.add("noVNC_idle");
-    },
-
-    keepControlbar: function() {
-        clearTimeout(UI.closeControlbarTimeout);
-    },
-
-    openControlbar: function() {
-        document.getElementById('noVNC_control_bar')
-            .classList.add("noVNC_open");
-    },
-
-    closeControlbar: function() {
-        UI.closeAllPanels();
-        document.getElementById('noVNC_control_bar')
-            .classList.remove("noVNC_open");
-    },
-
-    toggleControlbar: function() {
-        if (document.getElementById('noVNC_control_bar')
-            .classList.contains("noVNC_open")) {
-            UI.closeControlbar();
-        } else {
-            UI.openControlbar();
-        }
-    },
-
-    toggleControlbarSide: function () {
-        // Temporarily disable animation to avoid weird movement
-        var bar = document.getElementById('noVNC_control_bar');
-        bar.style.transitionDuration = '0s';
-        bar.addEventListener('transitionend', function () { this.style.transitionDuration = ""; });
-
-        var anchor = document.getElementById('noVNC_control_bar_anchor');
-        if (anchor.classList.contains("noVNC_right")) {
-            WebUtil.writeSetting('controlbar_pos', 'left');
-            anchor.classList.remove("noVNC_right");
-        } else {
-            WebUtil.writeSetting('controlbar_pos', 'right');
-            anchor.classList.add("noVNC_right");
-        }
-
-        // Consider this a movement of the handle
-        UI.controlbarDrag = true;
-    },
-
-    showControlbarHint: function (show) {
-        var hint = document.getElementById('noVNC_control_bar_hint');
-        if (show) {
-            hint.classList.add("noVNC_active");
-        } else {
-            hint.classList.remove("noVNC_active");
-        }
-    },
-
-    dragControlbarHandle: function (e) {
-        if (!UI.controlbarGrabbed) return;
-
-        var ptr = getPointerEvent(e);
-
-        var anchor = document.getElementById('noVNC_control_bar_anchor');
-        if (ptr.clientX < (window.innerWidth * 0.1)) {
-            if (anchor.classList.contains("noVNC_right")) {
-                UI.toggleControlbarSide();
-            }
-        } else if (ptr.clientX > (window.innerWidth * 0.9)) {
-            if (!anchor.classList.contains("noVNC_right")) {
-                UI.toggleControlbarSide();
-            }
-        }
-
-        if (!UI.controlbarDrag) {
-            // The goal is to trigger on a certain physical width, the
-            // devicePixelRatio brings us a bit closer but is not optimal.
-            var dragThreshold = 10 * (window.devicePixelRatio || 1);
-            var dragDistance = Math.abs(ptr.clientY - UI.controlbarMouseDownClientY);
-
-            if (dragDistance < dragThreshold) return;
-
-            UI.controlbarDrag = true;
-        }
-
-        var eventY = ptr.clientY - UI.controlbarMouseDownOffsetY;
-
-        UI.moveControlbarHandle(eventY);
-
-        e.preventDefault();
-        e.stopPropagation();
-        UI.keepControlbar();
-        UI.activateControlbar();
-    },
-
-    // Move the handle but don't allow any position outside the bounds
-    moveControlbarHandle: function (viewportRelativeY) {
-        var handle = document.getElementById("noVNC_control_bar_handle");
-        var handleHeight = handle.getBoundingClientRect().height;
-        var controlbarBounds = document.getElementById("noVNC_control_bar")
-            .getBoundingClientRect();
-        var margin = 10;
-
-        // These heights need to be non-zero for the below logic to work
-        if (handleHeight === 0 || controlbarBounds.height === 0) {
-            return;
-        }
-
-        var newY = viewportRelativeY;
-
-        // Check if the coordinates are outside the control bar
-        if (newY < controlbarBounds.top + margin) {
-            // Force coordinates to be below the top of the control bar
-            newY = controlbarBounds.top + margin;
-
-        } else if (newY > controlbarBounds.top +
-                   controlbarBounds.height - handleHeight - margin) {
-            // Force coordinates to be above the bottom of the control bar
-            newY = controlbarBounds.top +
-                controlbarBounds.height - handleHeight - margin;
-        }
-
-        // Corner case: control bar too small for stable position
-        if (controlbarBounds.height < (handleHeight + margin * 2)) {
-            newY = controlbarBounds.top +
-                (controlbarBounds.height - handleHeight) / 2;
-        }
-
-        // The transform needs coordinates that are relative to the parent
-        var parentRelativeY = newY - controlbarBounds.top;
-        handle.style.transform = "translateY(" + parentRelativeY + "px)";
-    },
-
-    updateControlbarHandle: function () {
-        // Since the control bar is fixed on the viewport and not the page,
-        // the move function expects coordinates relative the the viewport.
-        var handle = document.getElementById("noVNC_control_bar_handle");
-        var handleBounds = handle.getBoundingClientRect();
-        UI.moveControlbarHandle(handleBounds.top);
-    },
-
-    controlbarHandleMouseUp: function(e) {
-        if ((e.type == "mouseup") && (e.button != 0)) return;
-
-        // mouseup and mousedown on the same place toggles the controlbar
-        if (UI.controlbarGrabbed && !UI.controlbarDrag) {
-            UI.toggleControlbar();
-            e.preventDefault();
-            e.stopPropagation();
-            UI.keepControlbar();
-            UI.activateControlbar();
-        }
-        UI.controlbarGrabbed = false;
-        UI.showControlbarHint(false);
-    },
-
-    controlbarHandleMouseDown: function(e) {
-        if ((e.type == "mousedown") && (e.button != 0)) return;
-
-        var ptr = getPointerEvent(e);
-
-        var handle = document.getElementById("noVNC_control_bar_handle");
-        var bounds = handle.getBoundingClientRect();
-
-        // Touch events have implicit capture
-        if (e.type === "mousedown") {
-            setCapture(handle);
-        }
-
-        UI.controlbarGrabbed = true;
-        UI.controlbarDrag = false;
-
-        UI.showControlbarHint(true);
-
-        UI.controlbarMouseDownClientY = ptr.clientY;
-        UI.controlbarMouseDownOffsetY = ptr.clientY - bounds.top;
-        e.preventDefault();
-        e.stopPropagation();
-        UI.keepControlbar();
-        UI.activateControlbar();
-    },
-
-    toggleExpander: function(e) {
-        if (this.classList.contains("noVNC_open")) {
-            this.classList.remove("noVNC_open");
-        } else {
-            this.classList.add("noVNC_open");
-        }
-    },
-
-/* ------^-------
- *    /VISUAL
- * ==============
- *    SETTINGS
- * ------v------*/
-
-    // Initial page load read/initialization of settings
-    initSetting: function(name, defVal) {
-        // Check Query string followed by cookie
-        var val = WebUtil.getConfigVar(name);
-        if (val === null) {
-            val = WebUtil.readSetting(name, defVal);
-        }
-        UI.updateSetting(name, val);
-        return val;
-    },
-
-    // Update cookie and form control setting. If value is not set, then
-    // updates from control to current cookie setting.
-    updateSetting: function(name, value) {
-
-        // Save the cookie for this session
-        if (typeof value !== 'undefined') {
-            WebUtil.writeSetting(name, value);
-        }
-
-        // Update the settings control
-        value = UI.getSetting(name);
-
-        var ctrl = document.getElementById('noVNC_setting_' + name);
-        if (ctrl.type === 'checkbox') {
-            ctrl.checked = value;
-
-        } else if (typeof ctrl.options !== 'undefined') {
-            for (var i = 0; i < ctrl.options.length; i += 1) {
-                if (ctrl.options[i].value === value) {
-                    ctrl.selectedIndex = i;
-                    break;
-                }
-            }
-        } else {
-            /*Weird IE9 error leads to 'null' appearring
-            in textboxes instead of ''.*/
-            if (value === null) {
-                value = "";
-            }
-            ctrl.value = value;
-        }
-    },
-
-    // Save control setting to cookie
-    saveSetting: function(name) {
-        var val, ctrl = document.getElementById('noVNC_setting_' + name);
-        if (ctrl.type === 'checkbox') {
-            val = ctrl.checked;
-        } else if (typeof ctrl.options !== 'undefined') {
-            val = ctrl.options[ctrl.selectedIndex].value;
-        } else {
-            val = ctrl.value;
-        }
-        WebUtil.writeSetting(name, val);
-        //Log.Debug("Setting saved '" + name + "=" + val + "'");
-        return val;
-    },
-
-    // Read form control compatible setting from cookie
-    getSetting: function(name) {
-        var ctrl = document.getElementById('noVNC_setting_' + name);
-        var val = WebUtil.readSetting(name);
-        if (typeof val !== 'undefined' && val !== null && ctrl.type === 'checkbox') {
-            if (val.toString().toLowerCase() in {'0':1, 'no':1, 'false':1}) {
-                val = false;
-            } else {
-                val = true;
-            }
-        }
-        return val;
-    },
-
-    // These helpers compensate for the lack of parent-selectors and
-    // previous-sibling-selectors in CSS which are needed when we want to
-    // disable the labels that belong to disabled input elements.
-    disableSetting: function(name) {
-        var ctrl = document.getElementById('noVNC_setting_' + name);
-        ctrl.disabled = true;
-        ctrl.label.classList.add('noVNC_disabled');
-    },
-
-    enableSetting: function(name) {
-        var ctrl = document.getElementById('noVNC_setting_' + name);
-        ctrl.disabled = false;
-        ctrl.label.classList.remove('noVNC_disabled');
-    },
-
-/* ------^-------
- *   /SETTINGS
- * ==============
- *    PANELS
- * ------v------*/
-
-    closeAllPanels: function() {
-        UI.closeSettingsPanel();
-        UI.closePowerPanel();
-        UI.closeClipboardPanel();
-        UI.closeExtraKeys();
-    },
-
-/* ------^-------
- *   /PANELS
- * ==============
- * SETTINGS (panel)
- * ------v------*/
-
-    openSettingsPanel: function() {
-        UI.closeAllPanels();
-        UI.openControlbar();
-
-        // Refresh UI elements from saved cookies
-        UI.updateSetting('encrypt');
-        UI.updateSetting('view_clip');
-        UI.updateSetting('resize');
-        UI.updateSetting('shared');
-        UI.updateSetting('view_only');
-        UI.updateSetting('path');
-        UI.updateSetting('repeaterID');
-        UI.updateSetting('logging');
-        UI.updateSetting('reconnect');
-        UI.updateSetting('reconnect_delay');
-
-        document.getElementById('noVNC_settings')
-            .classList.add("noVNC_open");
-        document.getElementById('noVNC_settings_button')
-            .classList.add("noVNC_selected");
-    },
-
-    closeSettingsPanel: function() {
-        document.getElementById('noVNC_settings')
-            .classList.remove("noVNC_open");
-        document.getElementById('noVNC_settings_button')
-            .classList.remove("noVNC_selected");
-    },
-
-    toggleSettingsPanel: function() {
-        if (document.getElementById('noVNC_settings')
-            .classList.contains("noVNC_open")) {
-            UI.closeSettingsPanel();
-        } else {
-            UI.openSettingsPanel();
-        }
-    },
-
-/* ------^-------
- *   /SETTINGS
- * ==============
- *     POWER
- * ------v------*/
-
-    openPowerPanel: function() {
-        UI.closeAllPanels();
-        UI.openControlbar();
-
-        document.getElementById('noVNC_power')
-            .classList.add("noVNC_open");
-        document.getElementById('noVNC_power_button')
-            .classList.add("noVNC_selected");
-    },
-
-    closePowerPanel: function() {
-        document.getElementById('noVNC_power')
-            .classList.remove("noVNC_open");
-        document.getElementById('noVNC_power_button')
-            .classList.remove("noVNC_selected");
-    },
-
-    togglePowerPanel: function() {
-        if (document.getElementById('noVNC_power')
-            .classList.contains("noVNC_open")) {
-            UI.closePowerPanel();
-        } else {
-            UI.openPowerPanel();
-        }
-    },
-
-    // Disable/enable power button
-    updatePowerButton: function() {
-        if (UI.connected &&
-            UI.rfb.capabilities.power &&
-            !UI.rfb.viewOnly) {
-            document.getElementById('noVNC_power_button')
-                .classList.remove("noVNC_hidden");
-        } else {
-            document.getElementById('noVNC_power_button')
-                .classList.add("noVNC_hidden");
-            // Close power panel if open
-            UI.closePowerPanel();
-        }
-    },
-
-/* ------^-------
- *    /POWER
- * ==============
- *   CLIPBOARD
- * ------v------*/
-
-    openClipboardPanel: function() {
-        UI.closeAllPanels();
-        UI.openControlbar();
-
-        document.getElementById('noVNC_clipboard')
-            .classList.add("noVNC_open");
-        document.getElementById('noVNC_clipboard_button')
-            .classList.add("noVNC_selected");
-    },
-
-    closeClipboardPanel: function() {
-        document.getElementById('noVNC_clipboard')
-            .classList.remove("noVNC_open");
-        document.getElementById('noVNC_clipboard_button')
-            .classList.remove("noVNC_selected");
-    },
-
-    toggleClipboardPanel: function() {
-        if (document.getElementById('noVNC_clipboard')
-            .classList.contains("noVNC_open")) {
-            UI.closeClipboardPanel();
-        } else {
-            UI.openClipboardPanel();
-        }
-    },
-
-    clipboardReceive: function(e) {
-        Log.Debug(">> UI.clipboardReceive: " + e.detail.text.substr(0,40) + "...");
-        document.getElementById('noVNC_clipboard_text').value = e.detail.text;
-        Log.Debug("<< UI.clipboardReceive");
-    },
-
-    clipboardClear: function() {
-        document.getElementById('noVNC_clipboard_text').value = "";
-        UI.rfb.clipboardPasteFrom("");
-    },
-
-    clipboardSend: function() {
-        var text = document.getElementById('noVNC_clipboard_text').value;
-        Log.Debug(">> UI.clipboardSend: " + text.substr(0,40) + "...");
-        UI.rfb.clipboardPasteFrom(text);
-        Log.Debug("<< UI.clipboardSend");
-    },
-
-/* ------^-------
- *  /CLIPBOARD
- * ==============
- *  CONNECTION
- * ------v------*/
-
-    openConnectPanel: function() {
-        document.getElementById('noVNC_connect_dlg')
-            .classList.add("noVNC_open");
-    },
-
-    closeConnectPanel: function() {
-        document.getElementById('noVNC_connect_dlg')
-            .classList.remove("noVNC_open");
-    },
-
-    connect: function(event, password) {
-
-        // Ignore when rfb already exists
-        if (typeof UI.rfb !== 'undefined') {
-            return;
-        }
-
-        var host = UI.getSetting('host');
-        var port = UI.getSetting('port');
-        var path = UI.getSetting('path');
-
-        if (typeof password === 'undefined') {
-            password = WebUtil.getConfigVar('password');
-            UI.reconnect_password = password;
-        }
-
-        if (password === null) {
-            password = undefined;
-        }
-
-        UI.hideStatus();
-
-        if (!host) {
-            Log.Error("Can't connect when host is: " + host);
-            UI.showStatus(_("Must set host"), 'error');
-            return;
-        }
-
-        UI.closeAllPanels();
-        UI.closeConnectPanel();
-
-        UI.updateVisualState('connecting');
-
-        var url;
-
-        url = UI.getSetting('encrypt') ? 'wss' : 'ws';
-
-        url += '://' + host;
-        if(port) {
-            url += ':' + port;
-        }
-        url += '/' + path;
-
-        UI.rfb = new RFB(document.getElementById('noVNC_container'), url,
-                         { shared: UI.getSetting('shared'),
-                           repeaterID: UI.getSetting('repeaterID'),
-                           credentials: { password: password } });
-        UI.rfb.addEventListener("connect", UI.connectFinished);
-        UI.rfb.addEventListener("disconnect", UI.disconnectFinished);
-        UI.rfb.addEventListener("credentialsrequired", UI.credentials);
-        UI.rfb.addEventListener("securityfailure", UI.securityFailed);
-        UI.rfb.addEventListener("capabilities", function () { UI.updatePowerButton(); });
-        UI.rfb.addEventListener("clipboard", UI.clipboardReceive);
-        UI.rfb.addEventListener("bell", UI.bell);
-        UI.rfb.addEventListener("desktopname", UI.updateDesktopName);
-        UI.rfb.clipViewport = UI.getSetting('view_clip');
-        UI.rfb.scaleViewport = UI.getSetting('resize') === 'scale';
-        UI.rfb.resizeSession = UI.getSetting('resize') === 'remote';
-
-        UI.updateViewOnly(); // requires UI.rfb
-    },
-
-    disconnect: function() {
-        UI.closeAllPanels();
-        UI.rfb.disconnect();
-
-        UI.connected = false;
-
-        // Disable automatic reconnecting
-        UI.inhibit_reconnect = true;
-
-        UI.updateVisualState('disconnecting');
-
-        // Don't display the connection settings until we're actually disconnected
-    },
-
-    reconnect: function() {
-        UI.reconnect_callback = null;
-
-        // if reconnect has been disabled in the meantime, do nothing.
-        if (UI.inhibit_reconnect) {
-            return;
-        }
-
-        UI.connect(null, UI.reconnect_password);
-    },
-
-    cancelReconnect: function() {
-        if (UI.reconnect_callback !== null) {
-            clearTimeout(UI.reconnect_callback);
-            UI.reconnect_callback = null;
-        }
-
-        UI.updateVisualState('disconnected');
-
-        UI.openControlbar();
-        UI.openConnectPanel();
-    },
-
-    connectFinished: function (e) {
-        UI.connected = true;
-        UI.inhibit_reconnect = false;
-
-        let msg;
-        if (UI.getSetting('encrypt')) {
-            msg = _("Connected (encrypted) to ") + UI.desktopName;
-        } else {
-            msg = _("Connected (unencrypted) to ") + UI.desktopName;
-        }
-        UI.showStatus(msg);
-        UI.updateVisualState('connected');
-
-        // Do this last because it can only be used on rendered elements
-        UI.rfb.focus();
-    },
-
-    disconnectFinished: function (e) {
-        let wasConnected = UI.connected;
-
-        // This variable is ideally set when disconnection starts, but
-        // when the disconnection isn't clean or if it is initiated by
-        // the server, we need to do it here as well since
-        // UI.disconnect() won't be used in those cases.
-        UI.connected = false;
-
-        UI.rfb = undefined;
-
-        if (!e.detail.clean) {
-            UI.updateVisualState('disconnected');
-            if (wasConnected) {
-                UI.showStatus(_("Something went wrong, connection is closed"),
-                              'error');
-            } else {
-                UI.showStatus(_("Failed to connect to server"), 'error');
-            }
-        } else if (UI.getSetting('reconnect', false) === true && !UI.inhibit_reconnect) {
-            UI.updateVisualState('reconnecting');
-
-            var delay = parseInt(UI.getSetting('reconnect_delay'));
-            UI.reconnect_callback = setTimeout(UI.reconnect, delay);
-            return;
-        } else {
-            UI.updateVisualState('disconnected');
-            UI.showStatus(_("Disconnected"), 'normal');
-        }
-
-        UI.openControlbar();
-        UI.openConnectPanel();
-    },
-
-    securityFailed: function (e) {
-        let msg = "";
-        // On security failures we might get a string with a reason
-        // directly from the server. Note that we can't control if
-        // this string is translated or not.
-        if ('reason' in e.detail) {
-            msg = _("New connection has been rejected with reason: ") +
-                e.detail.reason;
-        } else {
-            msg = _("New connection has been rejected");
-        }
-        UI.showStatus(msg, 'error');
-    },
-
-/* ------^-------
- *  /CONNECTION
- * ==============
- *   PASSWORD
- * ------v------*/
-
-    credentials: function(e) {
-        // FIXME: handle more types
-        document.getElementById('noVNC_password_dlg')
-            .classList.add('noVNC_open');
-
-        setTimeout(function () {
-                document.getElementById('noVNC_password_input').focus();
-            }, 100);
-
-        Log.Warn("Server asked for a password");
-        UI.showStatus(_("Password is required"), "warning");
-    },
-
-    setPassword: function(e) {
-        // Prevent actually submitting the form
-        e.preventDefault();
-
-        var inputElem = document.getElementById('noVNC_password_input');
-        var password = inputElem.value;
-        // Clear the input after reading the password
-        inputElem.value = "";
-        UI.rfb.sendCredentials({ password: password });
-        UI.reconnect_password = password;
-        document.getElementById('noVNC_password_dlg')
-            .classList.remove('noVNC_open');
-    },
-
-/* ------^-------
- *  /PASSWORD
- * ==============
- *   FULLSCREEN
- * ------v------*/
-
-    toggleFullscreen: function() {
-        if (document.fullscreenElement || // alternative standard method
-            document.mozFullScreenElement || // currently working methods
-            document.webkitFullscreenElement ||
-            document.msFullscreenElement) {
-            if (document.exitFullscreen) {
-                document.exitFullscreen();
-            } else if (document.mozCancelFullScreen) {
-                document.mozCancelFullScreen();
-            } else if (document.webkitExitFullscreen) {
-                document.webkitExitFullscreen();
-            } else if (document.msExitFullscreen) {
-                document.msExitFullscreen();
-            }
-        } else {
-            if (document.documentElement.requestFullscreen) {
-                document.documentElement.requestFullscreen();
-            } else if (document.documentElement.mozRequestFullScreen) {
-                document.documentElement.mozRequestFullScreen();
-            } else if (document.documentElement.webkitRequestFullscreen) {
-                document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
-            } else if (document.body.msRequestFullscreen) {
-                document.body.msRequestFullscreen();
-            }
-        }
-        UI.enableDisableViewClip();
-        UI.updateFullscreenButton();
-    },
-
-    updateFullscreenButton: function() {
-        if (document.fullscreenElement || // alternative standard method
-            document.mozFullScreenElement || // currently working methods
-            document.webkitFullscreenElement ||
-            document.msFullscreenElement ) {
-            document.getElementById('noVNC_fullscreen_button')
-                .classList.add("noVNC_selected");
-        } else {
-            document.getElementById('noVNC_fullscreen_button')
-                .classList.remove("noVNC_selected");
-        }
-    },
-
-/* ------^-------
- *  /FULLSCREEN
- * ==============
- *     RESIZE
- * ------v------*/
-
-    // Apply remote resizing or local scaling
-    applyResizeMode: function() {
-        if (!UI.rfb) return;
-
-        UI.rfb.scaleViewport = UI.getSetting('resize') === 'scale';
-        UI.rfb.resizeSession = UI.getSetting('resize') === 'remote';
-    },
-
-/* ------^-------
- *    /RESIZE
- * ==============
- * VIEW CLIPPING
- * ------v------*/
-
-    // Update parameters that depend on the viewport clip setting
-    updateViewClip: function() {
-        if (!UI.rfb) return;
-
-        var cur_clip = UI.rfb.clipViewport;
-        var new_clip = UI.getSetting('view_clip');
-
-        if (isTouchDevice) {
-            // Touch devices usually have shit scrollbars
-            new_clip = true;
-        }
-
-        if (cur_clip !== new_clip) {
-            UI.rfb.clipViewport = new_clip;
-        }
-
-        // Changing the viewport may change the state of
-        // the dragging button
-        UI.updateViewDrag();
-    },
-
-    // Handle special cases where viewport clipping is forced on/off or locked
-    enableDisableViewClip: function() {
-        var resizeSetting = UI.getSetting('resize');
-        // Disable clipping if we are scaling, connected or on touch
-        if (resizeSetting === 'scale' ||
-            isTouchDevice) {
-            UI.disableSetting('view_clip');
-        } else {
-            UI.enableSetting('view_clip');
-        }
-    },
-
-/* ------^-------
- * /VIEW CLIPPING
- * ==============
- *    VIEWDRAG
- * ------v------*/
-
-    toggleViewDrag: function() {
-        if (!UI.rfb) return;
-
-        var drag = UI.rfb.dragViewport;
-        UI.setViewDrag(!drag);
-     },
-
-    // Set the view drag mode which moves the viewport on mouse drags
-    setViewDrag: function(drag) {
-        if (!UI.rfb) return;
-
-        UI.rfb.dragViewport = drag;
-
-        UI.updateViewDrag();
-    },
-
-    updateViewDrag: function() {
-        if (!UI.connected) return;
-
-        var viewDragButton = document.getElementById('noVNC_view_drag_button');
-
-        if (!UI.rfb.clipViewport && UI.rfb.dragViewport) {
-            // We are no longer clipping the viewport. Make sure
-            // viewport drag isn't active when it can't be used.
-            UI.rfb.dragViewport = false;
-        }
-
-        if (UI.rfb.dragViewport) {
-            viewDragButton.classList.add("noVNC_selected");
-        } else {
-            viewDragButton.classList.remove("noVNC_selected");
-        }
-
-        // Different behaviour for touch vs non-touch
-        // The button is disabled instead of hidden on touch devices
-        if (isTouchDevice) {
-            viewDragButton.classList.remove("noVNC_hidden");
-
-            if (UI.rfb.clipViewport) {
-                viewDragButton.disabled = false;
-            } else {
-                viewDragButton.disabled = true;
-            }
-        } else {
-            viewDragButton.disabled = false;
-
-            if (UI.rfb.clipViewport) {
-                viewDragButton.classList.remove("noVNC_hidden");
-            } else {
-                viewDragButton.classList.add("noVNC_hidden");
-            }
-        }
-    },
-
-/* ------^-------
- *   /VIEWDRAG
- * ==============
- *    KEYBOARD
- * ------v------*/
-
-    showVirtualKeyboard: function() {
-        if (!isTouchDevice) return;
-
-        var input = document.getElementById('noVNC_keyboardinput');
-
-        if (document.activeElement == input) return;
-
-        input.focus();
-
-        try {
-            var l = input.value.length;
-            // Move the caret to the end
-            input.setSelectionRange(l, l);
-        } catch (err) {} // setSelectionRange is undefined in Google Chrome
-    },
-
-    hideVirtualKeyboard: function() {
-        if (!isTouchDevice) return;
-
-        var input = document.getElementById('noVNC_keyboardinput');
-
-        if (document.activeElement != input) return;
-
-        input.blur();
-    },
-
-    toggleVirtualKeyboard: function () {
-        if (document.getElementById('noVNC_keyboard_button')
-            .classList.contains("noVNC_selected")) {
-            UI.hideVirtualKeyboard();
-        } else {
-            UI.showVirtualKeyboard();
-        }
-    },
-
-    onfocusVirtualKeyboard: function(event) {
-        document.getElementById('noVNC_keyboard_button')
-            .classList.add("noVNC_selected");
-        if (UI.rfb) {
-            UI.rfb.focusOnClick = false;
-        }
-    },
-
-    onblurVirtualKeyboard: function(event) {
-        document.getElementById('noVNC_keyboard_button')
-            .classList.remove("noVNC_selected");
-        if (UI.rfb) {
-            UI.rfb.focusOnClick = true;
-        }
-    },
-
-    keepVirtualKeyboard: function(event) {
-        var input = document.getElementById('noVNC_keyboardinput');
-
-        // Only prevent focus change if the virtual keyboard is active
-        if (document.activeElement != input) {
-            return;
-        }
-
-        // Only allow focus to move to other elements that need
-        // focus to function properly
-        if (event.target.form !== undefined) {
-            switch (event.target.type) {
-                case 'text':
-                case 'email':
-                case 'search':
-                case 'password':
-                case 'tel':
-                case 'url':
-                case 'textarea':
-                case 'select-one':
-                case 'select-multiple':
-                    return;
-            }
-        }
-
-        event.preventDefault();
-    },
-
-    keyboardinputReset: function() {
-        var kbi = document.getElementById('noVNC_keyboardinput');
-        kbi.value = new Array(UI.defaultKeyboardinputLen).join("_");
-        UI.lastKeyboardinput = kbi.value;
-    },
-
-    keyEvent: function (keysym, code, down) {
-        if (!UI.rfb) return;
-
-        UI.rfb.sendKey(keysym, code, down);
-    },
-
-    // When normal keyboard events are left uncought, use the input events from
-    // the keyboardinput element instead and generate the corresponding key events.
-    // This code is required since some browsers on Android are inconsistent in
-    // sending keyCodes in the normal keyboard events when using on screen keyboards.
-    keyInput: function(event) {
-
-        if (!UI.rfb) return;
-
-        var newValue = event.target.value;
-
-        if (!UI.lastKeyboardinput) {
-            UI.keyboardinputReset();
-        }
-        var oldValue = UI.lastKeyboardinput;
-
-        var newLen;
-        try {
-            // Try to check caret position since whitespace at the end
-            // will not be considered by value.length in some browsers
-            newLen = Math.max(event.target.selectionStart, newValue.length);
-        } catch (err) {
-            // selectionStart is undefined in Google Chrome
-            newLen = newValue.length;
-        }
-        var oldLen = oldValue.length;
-
-        var backspaces;
-        var inputs = newLen - oldLen;
-        if (inputs < 0) {
-            backspaces = -inputs;
-        } else {
-            backspaces = 0;
-        }
-
-        // Compare the old string with the new to account for
-        // text-corrections or other input that modify existing text
-        var i;
-        for (i = 0; i < Math.min(oldLen, newLen); i++) {
-            if (newValue.charAt(i) != oldValue.charAt(i)) {
-                inputs = newLen - i;
-                backspaces = oldLen - i;
-                break;
-            }
-        }
-
-        // Send the key events
-        for (i = 0; i < backspaces; i++) {
-            UI.rfb.sendKey(KeyTable.XK_BackSpace, "Backspace");
-        }
-        for (i = newLen - inputs; i < newLen; i++) {
-            UI.rfb.sendKey(keysyms.lookup(newValue.charCodeAt(i)));
-        }
-
-        // Control the text content length in the keyboardinput element
-        if (newLen > 2 * UI.defaultKeyboardinputLen) {
-            UI.keyboardinputReset();
-        } else if (newLen < 1) {
-            // There always have to be some text in the keyboardinput
-            // element with which backspace can interact.
-            UI.keyboardinputReset();
-            // This sometimes causes the keyboard to disappear for a second
-            // but it is required for the android keyboard to recognize that
-            // text has been added to the field
-            event.target.blur();
-            // This has to be ran outside of the input handler in order to work
-            setTimeout(event.target.focus.bind(event.target), 0);
-        } else {
-            UI.lastKeyboardinput = newValue;
-        }
-    },
-
-/* ------^-------
- *   /KEYBOARD
- * ==============
- *   EXTRA KEYS
- * ------v------*/
-
-    openExtraKeys: function() {
-        UI.closeAllPanels();
-        UI.openControlbar();
-
-        document.getElementById('noVNC_modifiers')
-            .classList.add("noVNC_open");
-        document.getElementById('noVNC_toggle_extra_keys_button')
-            .classList.add("noVNC_selected");
-    },
-
-    closeExtraKeys: function() {
-        document.getElementById('noVNC_modifiers')
-            .classList.remove("noVNC_open");
-        document.getElementById('noVNC_toggle_extra_keys_button')
-            .classList.remove("noVNC_selected");
-    },
-
-    toggleExtraKeys: function() {
-        if(document.getElementById('noVNC_modifiers')
-            .classList.contains("noVNC_open")) {
-            UI.closeExtraKeys();
-        } else  {
-            UI.openExtraKeys();
-        }
-    },
-
-    sendEsc: function() {
-        UI.rfb.sendKey(KeyTable.XK_Escape, "Escape");
-    },
-
-    sendTab: function() {
-        UI.rfb.sendKey(KeyTable.XK_Tab);
-    },
-
-    toggleCtrl: function() {
-        var btn = document.getElementById('noVNC_toggle_ctrl_button');
-        if (btn.classList.contains("noVNC_selected")) {
-            UI.rfb.sendKey(KeyTable.XK_Control_L, "ControlLeft", false);
-            btn.classList.remove("noVNC_selected");
-        } else {
-            UI.rfb.sendKey(KeyTable.XK_Control_L, "ControlLeft", true);
-            btn.classList.add("noVNC_selected");
-        }
-    },
-
-    toggleAlt: function() {
-        var btn = document.getElementById('noVNC_toggle_alt_button');
-        if (btn.classList.contains("noVNC_selected")) {
-            UI.rfb.sendKey(KeyTable.XK_Alt_L, "AltLeft", false);
-            btn.classList.remove("noVNC_selected");
-        } else {
-            UI.rfb.sendKey(KeyTable.XK_Alt_L, "AltLeft", true);
-            btn.classList.add("noVNC_selected");
-        }
-    },
-
-    sendCtrlAltDel: function() {
-        UI.rfb.sendCtrlAltDel();
-    },
-
-/* ------^-------
- *   /EXTRA KEYS
- * ==============
- *     MISC
- * ------v------*/
-
-    setMouseButton: function(num) {
-        var view_only = UI.rfb.viewOnly;
-        if (UI.rfb && !view_only) {
-            UI.rfb.touchButton = num;
-        }
-
-        var blist = [0, 1,2,4];
-        for (var b = 0; b < blist.length; b++) {
-            var button = document.getElementById('noVNC_mouse_button' +
-                                                 blist[b]);
-            if (blist[b] === num && !view_only) {
-                button.classList.remove("noVNC_hidden");
-            } else {
-                button.classList.add("noVNC_hidden");
-            }
-        }
-    },
-
-    updateViewOnly: function() {
-        if (!UI.rfb) return;
-        UI.rfb.viewOnly = UI.getSetting('view_only');
-
-        // Hide input related buttons in view only mode
-        if (UI.rfb.viewOnly) {
-            document.getElementById('noVNC_keyboard_button')
-                .classList.add('noVNC_hidden');
-            document.getElementById('noVNC_toggle_extra_keys_button')
-                .classList.add('noVNC_hidden');
-        } else {
-            document.getElementById('noVNC_keyboard_button')
-                .classList.remove('noVNC_hidden');
-            document.getElementById('noVNC_toggle_extra_keys_button')
-                .classList.remove('noVNC_hidden');
-        }
-        UI.setMouseButton(1); //has it's own logic for hiding/showing
-    },
-
-    updateLogging: function() {
-        WebUtil.init_logging(UI.getSetting('logging'));
-    },
-
-    updateDesktopName: function(e) {
-        UI.desktopName = e.detail.name;
-        // Display the desktop name in the document title
-        document.title = e.detail.name + " - noVNC";
-    },
-
-    bell: function(e) {
-        if (WebUtil.getConfigVar('bell', 'on') === 'on') {
-            var promise = document.getElementById('noVNC_bell').play();
-            // The standards disagree on the return value here
-            if (promise) {
-                promise.catch(function(e) {
-                    if (e.name === "NotAllowedError") {
-                        // Ignore when the browser doesn't let us play audio.
-                        // It is common that the browsers require audio to be
-                        // initiated from a user action.
-                    } else {
-                        Log.Error("Unable to play bell: " + e);
-                    }
-                });
-            }
-        }
-    },
-
-    //Helper to add options to dropdown.
-    addOption: function(selectbox, text, value) {
-        var optn = document.createElement("OPTION");
-        optn.text = text;
-        optn.value = value;
-        selectbox.options.add(optn);
-    },
-
-/* ------^-------
- *    /MISC
- * ==============
- */
-};
-
-// Set up translations
-var LINGUAS = ["de", "el", "es", "nl", "pl", "sv", "tr", "zh"];
-l10n.setup(LINGUAS);
-if (l10n.language !== "en" && l10n.dictionary === undefined) {
-    WebUtil.fetchJSON('app/locale/' + l10n.language + '.json', function (translations) {
-        l10n.dictionary = translations;
-
-        // wait for translations to load before loading the UI
-        UI.prime();
-    }, function (err) {
-        Log.Error("Failed to load translations: " + err);
-        UI.prime();
-    });
-} else {
-    UI.prime();
-}
-
-export default UI;

+ 0 - 698
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/display.js

@@ -1,698 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Copyright (C) 2015 Samuel Mannehed for Cendio AB
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-import * as Log from './util/logging.js';
-import Base64 from "./base64.js";
-
-export default function Display(target) {
-    this._drawCtx = null;
-    this._c_forceCanvas = false;
-
-    this._renderQ = [];  // queue drawing actions for in-oder rendering
-    this._flushing = false;
-
-    // the full frame buffer (logical canvas) size
-    this._fb_width = 0;
-    this._fb_height = 0;
-
-    this._prevDrawStyle = "";
-    this._tile = null;
-    this._tile16x16 = null;
-    this._tile_x = 0;
-    this._tile_y = 0;
-
-    Log.Debug(">> Display.constructor");
-
-    // The visible canvas
-    this._target = target;
-
-    if (!this._target) {
-        throw new Error("Target must be set");
-    }
-
-    if (typeof this._target === 'string') {
-        throw new Error('target must be a DOM element');
-    }
-
-    if (!this._target.getContext) {
-        throw new Error("no getContext method");
-    }
-
-    this._targetCtx = this._target.getContext('2d');
-
-    // the visible canvas viewport (i.e. what actually gets seen)
-    this._viewportLoc = { 'x': 0, 'y': 0, 'w': this._target.width, 'h': this._target.height };
-
-    // The hidden canvas, where we do the actual rendering
-    this._backbuffer = document.createElement('canvas');
-    this._drawCtx = this._backbuffer.getContext('2d');
-
-    this._damageBounds = { left:0, top:0,
-                           right: this._backbuffer.width,
-                           bottom: this._backbuffer.height };
-
-    Log.Debug("User Agent: " + navigator.userAgent);
-
-    this.clear();
-
-    // Check canvas features
-    if (!('createImageData' in this._drawCtx)) {
-        throw new Error("Canvas does not support createImageData");
-    }
-
-    this._tile16x16 = this._drawCtx.createImageData(16, 16);
-    Log.Debug("<< Display.constructor");
-};
-
-var SUPPORTS_IMAGEDATA_CONSTRUCTOR = false;
-try {
-    new ImageData(new Uint8ClampedArray(4), 1, 1);
-    SUPPORTS_IMAGEDATA_CONSTRUCTOR = true;
-} catch (ex) {
-    // ignore failure
-}
-
-Display.prototype = {
-    // ===== PROPERTIES =====
-
-    _scale: 1.0,
-    get scale() { return this._scale; },
-    set scale(scale) {
-        this._rescale(scale);
-    },
-
-    _clipViewport: false,
-    get clipViewport() { return this._clipViewport; },
-    set clipViewport(viewport) {
-        this._clipViewport = viewport;
-        // May need to readjust the viewport dimensions
-        var vp = this._viewportLoc;
-        this.viewportChangeSize(vp.w, vp.h);
-        this.viewportChangePos(0, 0);
-    },
-
-    get width() {
-        return this._fb_width;
-    },
-    get height() {
-        return this._fb_height;
-    },
-
-    logo: null,
-
-    // ===== EVENT HANDLERS =====
-
-    onflush: function () {},        // A flush request has finished
-
-    // ===== PUBLIC METHODS =====
-
-    viewportChangePos: function (deltaX, deltaY) {
-        var vp = this._viewportLoc;
-        deltaX = Math.floor(deltaX);
-        deltaY = Math.floor(deltaY);
-
-        if (!this._clipViewport) {
-            deltaX = -vp.w;  // clamped later of out of bounds
-            deltaY = -vp.h;
-        }
-
-        var vx2 = vp.x + vp.w - 1;
-        var vy2 = vp.y + vp.h - 1;
-
-        // Position change
-
-        if (deltaX < 0 && vp.x + deltaX < 0) {
-            deltaX = -vp.x;
-        }
-        if (vx2 + deltaX >= this._fb_width) {
-            deltaX -= vx2 + deltaX - this._fb_width + 1;
-        }
-
-        if (vp.y + deltaY < 0) {
-            deltaY = -vp.y;
-        }
-        if (vy2 + deltaY >= this._fb_height) {
-            deltaY -= (vy2 + deltaY - this._fb_height + 1);
-        }
-
-        if (deltaX === 0 && deltaY === 0) {
-            return;
-        }
-        Log.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY);
-
-        vp.x += deltaX;
-        vp.y += deltaY;
-
-        this._damage(vp.x, vp.y, vp.w, vp.h);
-
-        this.flip();
-    },
-
-    viewportChangeSize: function(width, height) {
-
-        if (!this._clipViewport ||
-            typeof(width) === "undefined" ||
-            typeof(height) === "undefined") {
-
-            Log.Debug("Setting viewport to full display region");
-            width = this._fb_width;
-            height = this._fb_height;
-        }
-
-        if (width > this._fb_width) {
-            width = this._fb_width;
-        }
-        if (height > this._fb_height) {
-            height = this._fb_height;
-        }
-
-        var vp = this._viewportLoc;
-        if (vp.w !== width || vp.h !== height) {
-            vp.w = width;
-            vp.h = height;
-
-            var canvas = this._target;
-            canvas.width = width;
-            canvas.height = height;
-
-            // The position might need to be updated if we've grown
-            this.viewportChangePos(0, 0);
-
-            this._damage(vp.x, vp.y, vp.w, vp.h);
-            this.flip();
-
-            // Update the visible size of the target canvas
-            this._rescale(this._scale);
-        }
-    },
-
-    absX: function (x) {
-        return x / this._scale + this._viewportLoc.x;
-    },
-
-    absY: function (y) {
-        return y / this._scale + this._viewportLoc.y;
-    },
-
-    resize: function (width, height) {
-        this._prevDrawStyle = "";
-
-        this._fb_width = width;
-        this._fb_height = height;
-
-        var canvas = this._backbuffer;
-        if (canvas.width !== width || canvas.height !== height) {
-
-            // We have to save the canvas data since changing the size will clear it
-            var saveImg = null;
-            if (canvas.width > 0 && canvas.height > 0) {
-                saveImg = this._drawCtx.getImageData(0, 0, canvas.width, canvas.height);
-            }
-
-            if (canvas.width !== width) {
-                canvas.width = width;
-            }
-            if (canvas.height !== height) {
-                canvas.height = height;
-            }
-
-            if (saveImg) {
-                this._drawCtx.putImageData(saveImg, 0, 0);
-            }
-        }
-
-        // Readjust the viewport as it may be incorrectly sized
-        // and positioned
-        var vp = this._viewportLoc;
-        this.viewportChangeSize(vp.w, vp.h);
-        this.viewportChangePos(0, 0);
-    },
-
-    // Track what parts of the visible canvas that need updating
-    _damage: function(x, y, w, h) {
-        if (x < this._damageBounds.left) {
-            this._damageBounds.left = x;
-        }
-        if (y < this._damageBounds.top) {
-            this._damageBounds.top = y;
-        }
-        if ((x + w) > this._damageBounds.right) {
-            this._damageBounds.right = x + w;
-        }
-        if ((y + h) > this._damageBounds.bottom) {
-            this._damageBounds.bottom = y + h;
-        }
-    },
-
-    // Update the visible canvas with the contents of the
-    // rendering canvas
-    flip: function(from_queue) {
-        if (this._renderQ.length !== 0 && !from_queue) {
-            this._renderQ_push({
-                'type': 'flip'
-            });
-        } else {
-            var x, y, vx, vy, w, h;
-
-            x = this._damageBounds.left;
-            y = this._damageBounds.top;
-            w = this._damageBounds.right - x;
-            h = this._damageBounds.bottom - y;
-
-            vx = x - this._viewportLoc.x;
-            vy = y - this._viewportLoc.y;
-
-            if (vx < 0) {
-                w += vx;
-                x -= vx;
-                vx = 0;
-            }
-            if (vy < 0) {
-                h += vy;
-                y -= vy;
-                vy = 0;
-            }
-
-            if ((vx + w) > this._viewportLoc.w) {
-                w = this._viewportLoc.w - vx;
-            }
-            if ((vy + h) > this._viewportLoc.h) {
-                h = this._viewportLoc.h - vy;
-            }
-
-            if ((w > 0) && (h > 0)) {
-                // FIXME: We may need to disable image smoothing here
-                //        as well (see copyImage()), but we haven't
-                //        noticed any problem yet.
-                this._targetCtx.drawImage(this._backbuffer,
-                                          x, y, w, h,
-                                          vx, vy, w, h);
-            }
-
-            this._damageBounds.left = this._damageBounds.top = 65535;
-            this._damageBounds.right = this._damageBounds.bottom = 0;
-        }
-    },
-
-    clear: function () {
-        if (this._logo) {
-            this.resize(this._logo.width, this._logo.height);
-            this.imageRect(0, 0, this._logo.type, this._logo.data);
-        } else {
-            this.resize(240, 20);
-            this._drawCtx.clearRect(0, 0, this._fb_width, this._fb_height);
-        }
-        this.flip();
-    },
-
-    pending: function() {
-        return this._renderQ.length > 0;
-    },
-
-    flush: function() {
-        if (this._renderQ.length === 0) {
-            this.onflush();
-        } else {
-            this._flushing = true;
-        }
-    },
-
-    fillRect: function (x, y, width, height, color, from_queue) {
-        if (this._renderQ.length !== 0 && !from_queue) {
-            this._renderQ_push({
-                'type': 'fill',
-                'x': x,
-                'y': y,
-                'width': width,
-                'height': height,
-                'color': color
-            });
-        } else {
-            this._setFillColor(color);
-            this._drawCtx.fillRect(x, y, width, height);
-            this._damage(x, y, width, height);
-        }
-    },
-
-    copyImage: function (old_x, old_y, new_x, new_y, w, h, from_queue) {
-        if (this._renderQ.length !== 0 && !from_queue) {
-            this._renderQ_push({
-                'type': 'copy',
-                'old_x': old_x,
-                'old_y': old_y,
-                'x': new_x,
-                'y': new_y,
-                'width': w,
-                'height': h,
-            });
-        } else {
-            // Due to this bug among others [1] we need to disable the image-smoothing to
-            // avoid getting a blur effect when copying data.
-            //
-            // 1. https://bugzilla.mozilla.org/show_bug.cgi?id=1194719
-            //
-            // We need to set these every time since all properties are reset
-            // when the the size is changed
-            this._drawCtx.mozImageSmoothingEnabled = false;
-            this._drawCtx.webkitImageSmoothingEnabled = false;
-            this._drawCtx.msImageSmoothingEnabled = false;
-            this._drawCtx.imageSmoothingEnabled = false;
-
-            this._drawCtx.drawImage(this._backbuffer,
-                                    old_x, old_y, w, h,
-                                    new_x, new_y, w, h);
-            this._damage(new_x, new_y, w, h);
-        }
-    },
-
-    imageRect: function(x, y, mime, arr) {
-        var img = new Image();
-        img.src = "data: " + mime + ";base64," + Base64.encode(arr);
-        this._renderQ_push({
-            'type': 'img',
-            'img': img,
-            'x': x,
-            'y': y
-        });
-    },
-
-    // start updating a tile
-    startTile: function (x, y, width, height, color) {
-        this._tile_x = x;
-        this._tile_y = y;
-        if (width === 16 && height === 16) {
-            this._tile = this._tile16x16;
-        } else {
-            this._tile = this._drawCtx.createImageData(width, height);
-        }
-
-        var red = color[2];
-        var green = color[1];
-        var blue = color[0];
-
-        var data = this._tile.data;
-        for (var i = 0; i < width * height * 4; i += 4) {
-            data[i] = red;
-            data[i + 1] = green;
-            data[i + 2] = blue;
-            data[i + 3] = 255;
-        }
-    },
-
-    // update sub-rectangle of the current tile
-    subTile: function (x, y, w, h, color) {
-        var red = color[2];
-        var green = color[1];
-        var blue = color[0];
-        var xend = x + w;
-        var yend = y + h;
-
-        var data = this._tile.data;
-        var width = this._tile.width;
-        for (var j = y; j < yend; j++) {
-            for (var i = x; i < xend; i++) {
-                var p = (i + (j * width)) * 4;
-                data[p] = red;
-                data[p + 1] = green;
-                data[p + 2] = blue;
-                data[p + 3] = 255;
-            }
-        }
-    },
-
-    // draw the current tile to the screen
-    finishTile: function () {
-        this._drawCtx.putImageData(this._tile, this._tile_x, this._tile_y);
-        this._damage(this._tile_x, this._tile_y,
-                     this._tile.width, this._tile.height);
-    },
-
-    blitImage: function (x, y, width, height, arr, offset, from_queue) {
-        if (this._renderQ.length !== 0 && !from_queue) {
-            // NB(directxman12): it's technically more performant here to use preallocated arrays,
-            // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
-            // this probably isn't getting called *nearly* as much
-            var new_arr = new Uint8Array(width * height * 4);
-            new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length));
-            this._renderQ_push({
-                'type': 'blit',
-                'data': new_arr,
-                'x': x,
-                'y': y,
-                'width': width,
-                'height': height,
-            });
-        } else {
-            this._bgrxImageData(x, y, width, height, arr, offset);
-        }
-    },
-
-    blitRgbImage: function (x, y , width, height, arr, offset, from_queue) {
-        if (this._renderQ.length !== 0 && !from_queue) {
-            // NB(directxman12): it's technically more performant here to use preallocated arrays,
-            // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
-            // this probably isn't getting called *nearly* as much
-            var new_arr = new Uint8Array(width * height * 3);
-            new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length));
-            this._renderQ_push({
-                'type': 'blitRgb',
-                'data': new_arr,
-                'x': x,
-                'y': y,
-                'width': width,
-                'height': height,
-            });
-        } else {
-            this._rgbImageData(x, y, width, height, arr, offset);
-        }
-    },
-
-    blitRgbxImage: function (x, y, width, height, arr, offset, from_queue) {
-        if (this._renderQ.length !== 0 && !from_queue) {
-            // NB(directxman12): it's technically more performant here to use preallocated arrays,
-            // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
-            // this probably isn't getting called *nearly* as much
-            var new_arr = new Uint8Array(width * height * 4);
-            new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length));
-            this._renderQ_push({
-                'type': 'blitRgbx',
-                'data': new_arr,
-                'x': x,
-                'y': y,
-                'width': width,
-                'height': height,
-            });
-        } else {
-            this._rgbxImageData(x, y, width, height, arr, offset);
-        }
-    },
-
-    drawImage: function (img, x, y) {
-        this._drawCtx.drawImage(img, x, y);
-        this._damage(x, y, img.width, img.height);
-    },
-
-    changeCursor: function (pixels, mask, hotx, hoty, w, h) {
-        Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h);
-    },
-
-    defaultCursor: function () {
-        this._target.style.cursor = "default";
-    },
-
-    disableLocalCursor: function () {
-        this._target.style.cursor = "none";
-    },
-
-    autoscale: function (containerWidth, containerHeight) {
-        var vp = this._viewportLoc;
-        var targetAspectRatio = containerWidth / containerHeight;
-        var fbAspectRatio = vp.w / vp.h;
-
-        var scaleRatio;
-        if (fbAspectRatio >= targetAspectRatio) {
-            scaleRatio = containerWidth / vp.w;
-        } else {
-            scaleRatio = containerHeight / vp.h;
-        }
-
-        this._rescale(scaleRatio);
-    },
-
-    // ===== PRIVATE METHODS =====
-
-    _rescale: function (factor) {
-        this._scale = factor;
-        var vp = this._viewportLoc;
-
-        // NB(directxman12): If you set the width directly, or set the
-        //                   style width to a number, the canvas is cleared.
-        //                   However, if you set the style width to a string
-        //                   ('NNNpx'), the canvas is scaled without clearing.
-        var width = Math.round(factor * vp.w) + 'px';
-        var height = Math.round(factor * vp.h) + 'px';
-
-        if ((this._target.style.width !== width) ||
-            (this._target.style.height !== height)) {
-            this._target.style.width = width;
-            this._target.style.height = height;
-        }
-    },
-
-    _setFillColor: function (color) {
-        var newStyle = 'rgb(' + color[2] + ',' + color[1] + ',' + color[0] + ')';
-        if (newStyle !== this._prevDrawStyle) {
-            this._drawCtx.fillStyle = newStyle;
-            this._prevDrawStyle = newStyle;
-        }
-    },
-
-    _rgbImageData: function (x, y, width, height, arr, offset) {
-        var img = this._drawCtx.createImageData(width, height);
-        var data = img.data;
-        for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 3) {
-            data[i]     = arr[j];
-            data[i + 1] = arr[j + 1];
-            data[i + 2] = arr[j + 2];
-            data[i + 3] = 255;  // Alpha
-        }
-        this._drawCtx.putImageData(img, x, y);
-        this._damage(x, y, img.width, img.height);
-    },
-
-    _bgrxImageData: function (x, y, width, height, arr, offset) {
-        var img = this._drawCtx.createImageData(width, height);
-        var data = img.data;
-        for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 4) {
-            data[i]     = arr[j + 2];
-            data[i + 1] = arr[j + 1];
-            data[i + 2] = arr[j];
-            data[i + 3] = 255;  // Alpha
-        }
-        this._drawCtx.putImageData(img, x, y);
-        this._damage(x, y, img.width, img.height);
-    },
-
-    _rgbxImageData: function (x, y, width, height, arr, offset) {
-        // NB(directxman12): arr must be an Type Array view
-        var img;
-        if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) {
-            img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height);
-        } else {
-            img = this._drawCtx.createImageData(width, height);
-            img.data.set(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4));
-        }
-        this._drawCtx.putImageData(img, x, y);
-        this._damage(x, y, img.width, img.height);
-    },
-
-    _renderQ_push: function (action) {
-        this._renderQ.push(action);
-        if (this._renderQ.length === 1) {
-            // If this can be rendered immediately it will be, otherwise
-            // the scanner will wait for the relevant event
-            this._scan_renderQ();
-        }
-    },
-
-    _resume_renderQ: function() {
-        // "this" is the object that is ready, not the
-        // display object
-        this.removeEventListener('load', this._noVNC_display._resume_renderQ);
-        this._noVNC_display._scan_renderQ();
-    },
-
-    _scan_renderQ: function () {
-        var ready = true;
-        while (ready && this._renderQ.length > 0) {
-            var a = this._renderQ[0];
-            switch (a.type) {
-                case 'flip':
-                    this.flip(true);
-                    break;
-                case 'copy':
-                    this.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height, true);
-                    break;
-                case 'fill':
-                    this.fillRect(a.x, a.y, a.width, a.height, a.color, true);
-                    break;
-                case 'blit':
-                    this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true);
-                    break;
-                case 'blitRgb':
-                    this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0, true);
-                    break;
-                case 'blitRgbx':
-                    this.blitRgbxImage(a.x, a.y, a.width, a.height, a.data, 0, true);
-                    break;
-                case 'img':
-                    if (a.img.complete) {
-                        this.drawImage(a.img, a.x, a.y);
-                    } else {
-                        a.img._noVNC_display = this;
-                        a.img.addEventListener('load', this._resume_renderQ);
-                        // We need to wait for this image to 'load'
-                        // to keep things in-order
-                        ready = false;
-                    }
-                    break;
-            }
-
-            if (ready) {
-                this._renderQ.shift();
-            }
-        }
-
-        if (this._renderQ.length === 0 && this._flushing) {
-            this._flushing = false;
-            this.onflush();
-        }
-    },
-};
-
-// Class Methods
-Display.changeCursor = function (target, pixels, mask, hotx, hoty, w, h) {
-    if ((w === 0) || (h === 0)) {
-        target.style.cursor = 'none';
-        return;
-    }
-
-    var cur = []
-    var y, x;
-    for (y = 0; y < h; y++) {
-        for (x = 0; x < w; x++) {
-            var idx = y * Math.ceil(w / 8) + Math.floor(x / 8);
-            var alpha = (mask[idx] << (x % 8)) & 0x80 ? 255 : 0;
-            idx = ((w * y) + x) * 4;
-            cur.push(pixels[idx + 2]); // red
-            cur.push(pixels[idx + 1]); // green
-            cur.push(pixels[idx]);     // blue
-            cur.push(alpha);           // alpha
-        }
-    }
-
-    var canvas = document.createElement('canvas');
-    var ctx = canvas.getContext('2d');
-
-    canvas.width = w;
-    canvas.height = h;
-
-    var img;
-    if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) {
-        img = new ImageData(new Uint8ClampedArray(cur), w, h);
-    } else {
-        img = ctx.createImageData(w, h);
-        img.data.set(new Uint8ClampedArray(cur));
-    }
-    ctx.clearRect(0, 0, w, h);
-    ctx.putImageData(img, 0, 0);
-
-    var url = canvas.toDataURL();
-    target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default';
-};

+ 0 - 40
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/encodings.js

@@ -1,40 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2017 Pierre Ossman for Cendio AB
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-export var encodings = {
-    encodingRaw: 0,
-    encodingCopyRect: 1,
-    encodingRRE: 2,
-    encodingHextile: 5,
-    encodingTight: 7,
-
-    pseudoEncodingQualityLevel9: -23,
-    pseudoEncodingQualityLevel0: -32,
-    pseudoEncodingDesktopSize: -223,
-    pseudoEncodingLastRect: -224,
-    pseudoEncodingCursor: -239,
-    pseudoEncodingQEMUExtendedKeyEvent: -258,
-    pseudoEncodingTightPNG: -260,
-    pseudoEncodingExtendedDesktopSize: -308,
-    pseudoEncodingXvp: -309,
-    pseudoEncodingFence: -312,
-    pseudoEncodingContinuousUpdates: -313,
-    pseudoEncodingCompressLevel9: -247,
-    pseudoEncodingCompressLevel0: -256,
-};
-
-export function encodingName(num) {
-    switch (num) {
-        case encodings.encodingRaw:      return "Raw";
-        case encodings.encodingCopyRect: return "CopyRect";
-        case encodings.encodingRRE:      return "RRE";
-        case encodings.encodingHextile:  return "Hextile";
-        case encodings.encodingTight:    return "Tight";
-        default:                         return "[unknown encoding " + num + "]";
-    }
-}

+ 0 - 310
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/domkeytable.js

@@ -1,310 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2017 Pierre Ossman for Cendio AB
- * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
- */
-
-import KeyTable from "./keysym.js";
-
-/*
- * Mapping between HTML key values and VNC/X11 keysyms for "special"
- * keys that cannot be handled via their Unicode codepoint.
- *
- * See https://www.w3.org/TR/uievents-key/ for possible values.
- */
-
-var DOMKeyTable = {};
-
-function addStandard(key, standard)
-{
-    if (standard === undefined) throw "Undefined keysym for key \"" + key + "\"";
-    if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\"";
-    DOMKeyTable[key] = [standard, standard, standard, standard];
-}
-
-function addLeftRight(key, left, right)
-{
-    if (left === undefined) throw "Undefined keysym for key \"" + key + "\"";
-    if (right === undefined) throw "Undefined keysym for key \"" + key + "\"";
-    if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\"";
-    DOMKeyTable[key] = [left, left, right, left];
-}
-
-function addNumpad(key, standard, numpad)
-{
-    if (standard === undefined) throw "Undefined keysym for key \"" + key + "\"";
-    if (numpad === undefined) throw "Undefined keysym for key \"" + key + "\"";
-    if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\"";
-    DOMKeyTable[key] = [standard, standard, standard, numpad];
-}
-
-// 2.2. Modifier Keys
-
-addLeftRight("Alt", KeyTable.XK_Alt_L, KeyTable.XK_Alt_R);
-addStandard("AltGraph", KeyTable.XK_ISO_Level3_Shift);
-addStandard("CapsLock", KeyTable.XK_Caps_Lock);
-addLeftRight("Control", KeyTable.XK_Control_L, KeyTable.XK_Control_R);
-// - Fn
-// - FnLock
-addLeftRight("Hyper", KeyTable.XK_Super_L, KeyTable.XK_Super_R);
-addLeftRight("Meta", KeyTable.XK_Super_L, KeyTable.XK_Super_R);
-addStandard("NumLock", KeyTable.XK_Num_Lock);
-addStandard("ScrollLock", KeyTable.XK_Scroll_Lock);
-addLeftRight("Shift", KeyTable.XK_Shift_L, KeyTable.XK_Shift_R);
-addLeftRight("Super", KeyTable.XK_Super_L, KeyTable.XK_Super_R);
-// - Symbol
-// - SymbolLock
-
-// 2.3. Whitespace Keys
-
-addNumpad("Enter", KeyTable.XK_Return, KeyTable.XK_KP_Enter);
-addStandard("Tab", KeyTable.XK_Tab);
-addNumpad(" ", KeyTable.XK_space, KeyTable.XK_KP_Space);
-
-// 2.4. Navigation Keys
-
-addNumpad("ArrowDown", KeyTable.XK_Down, KeyTable.XK_KP_Down);
-addNumpad("ArrowUp", KeyTable.XK_Up, KeyTable.XK_KP_Up);
-addNumpad("ArrowLeft", KeyTable.XK_Left, KeyTable.XK_KP_Left);
-addNumpad("ArrowRight", KeyTable.XK_Right, KeyTable.XK_KP_Right);
-addNumpad("End", KeyTable.XK_End, KeyTable.XK_KP_End);
-addNumpad("Home", KeyTable.XK_Home, KeyTable.XK_KP_Home);
-addNumpad("PageDown", KeyTable.XK_Next, KeyTable.XK_KP_Next);
-addNumpad("PageUp", KeyTable.XK_Prior, KeyTable.XK_KP_Prior);
-
-// 2.5. Editing Keys
-
-addStandard("Backspace", KeyTable.XK_BackSpace);
-addStandard("Clear", KeyTable.XK_Clear);
-addStandard("Copy", KeyTable.XF86XK_Copy);
-// - CrSel
-addStandard("Cut", KeyTable.XF86XK_Cut);
-addNumpad("Delete", KeyTable.XK_Delete, KeyTable.XK_KP_Delete);
-// - EraseEof
-// - ExSel
-addNumpad("Insert", KeyTable.XK_Insert, KeyTable.XK_KP_Insert);
-addStandard("Paste", KeyTable.XF86XK_Paste);
-addStandard("Redo", KeyTable.XK_Redo);
-addStandard("Undo", KeyTable.XK_Undo);
-
-// 2.6. UI Keys
-
-// - Accept
-// - Again (could just be XK_Redo)
-// - Attn
-addStandard("Cancel", KeyTable.XK_Cancel);
-addStandard("ContextMenu", KeyTable.XK_Menu);
-addStandard("Escape", KeyTable.XK_Escape);
-addStandard("Execute", KeyTable.XK_Execute);
-addStandard("Find", KeyTable.XK_Find);
-addStandard("Help", KeyTable.XK_Help);
-addStandard("Pause", KeyTable.XK_Pause);
-// - Play
-// - Props
-addStandard("Select", KeyTable.XK_Select);
-addStandard("ZoomIn", KeyTable.XF86XK_ZoomIn);
-addStandard("ZoomOut", KeyTable.XF86XK_ZoomOut);
-
-// 2.7. Device Keys
-
-addStandard("BrightnessDown", KeyTable.XF86XK_MonBrightnessDown);
-addStandard("BrightnessUp", KeyTable.XF86XK_MonBrightnessUp);
-addStandard("Eject", KeyTable.XF86XK_Eject);
-addStandard("LogOff", KeyTable.XF86XK_LogOff);
-addStandard("Power", KeyTable.XF86XK_PowerOff);
-addStandard("PowerOff", KeyTable.XF86XK_PowerDown);
-addStandard("PrintScreen", KeyTable.XK_Print);
-addStandard("Hibernate", KeyTable.XF86XK_Hibernate);
-addStandard("Standby", KeyTable.XF86XK_Standby);
-addStandard("WakeUp", KeyTable.XF86XK_WakeUp);
-
-// 2.8. IME and Composition Keys
-
-addStandard("AllCandidates", KeyTable.XK_MultipleCandidate);
-addStandard("Alphanumeric", KeyTable.XK_Eisu_Shift); // could also be _Eisu_Toggle
-addStandard("CodeInput", KeyTable.XK_Codeinput);
-addStandard("Compose", KeyTable.XK_Multi_key);
-addStandard("Convert", KeyTable.XK_Henkan);
-// - Dead
-// - FinalMode
-addStandard("GroupFirst", KeyTable.XK_ISO_First_Group);
-addStandard("GroupLast", KeyTable.XK_ISO_Last_Group);
-addStandard("GroupNext", KeyTable.XK_ISO_Next_Group);
-addStandard("GroupPrevious", KeyTable.XK_ISO_Prev_Group);
-// - ModeChange (XK_Mode_switch is often used for AltGr)
-// - NextCandidate
-addStandard("NonConvert", KeyTable.XK_Muhenkan);
-addStandard("PreviousCandidate", KeyTable.XK_PreviousCandidate);
-// - Process
-addStandard("SingleCandidate", KeyTable.XK_SingleCandidate);
-addStandard("HangulMode", KeyTable.XK_Hangul);
-addStandard("HanjaMode", KeyTable.XK_Hangul_Hanja);
-addStandard("JunjuaMode", KeyTable.XK_Hangul_Jeonja);
-addStandard("Eisu", KeyTable.XK_Eisu_toggle);
-addStandard("Hankaku", KeyTable.XK_Hankaku);
-addStandard("Hiragana", KeyTable.XK_Hiragana);
-addStandard("HiraganaKatakana", KeyTable.XK_Hiragana_Katakana);
-addStandard("KanaMode", KeyTable.XK_Kana_Shift); // could also be _Kana_Lock
-addStandard("KanjiMode", KeyTable.XK_Kanji);
-addStandard("Katakana", KeyTable.XK_Katakana);
-addStandard("Romaji", KeyTable.XK_Romaji);
-addStandard("Zenkaku", KeyTable.XK_Zenkaku);
-addStandard("ZenkakuHanaku", KeyTable.XK_Zenkaku_Hankaku);
-
-// 2.9. General-Purpose Function Keys
-
-addStandard("F1", KeyTable.XK_F1);
-addStandard("F2", KeyTable.XK_F2);
-addStandard("F3", KeyTable.XK_F3);
-addStandard("F4", KeyTable.XK_F4);
-addStandard("F5", KeyTable.XK_F5);
-addStandard("F6", KeyTable.XK_F6);
-addStandard("F7", KeyTable.XK_F7);
-addStandard("F8", KeyTable.XK_F8);
-addStandard("F9", KeyTable.XK_F9);
-addStandard("F10", KeyTable.XK_F10);
-addStandard("F11", KeyTable.XK_F11);
-addStandard("F12", KeyTable.XK_F12);
-addStandard("F13", KeyTable.XK_F13);
-addStandard("F14", KeyTable.XK_F14);
-addStandard("F15", KeyTable.XK_F15);
-addStandard("F16", KeyTable.XK_F16);
-addStandard("F17", KeyTable.XK_F17);
-addStandard("F18", KeyTable.XK_F18);
-addStandard("F19", KeyTable.XK_F19);
-addStandard("F20", KeyTable.XK_F20);
-addStandard("F21", KeyTable.XK_F21);
-addStandard("F22", KeyTable.XK_F22);
-addStandard("F23", KeyTable.XK_F23);
-addStandard("F24", KeyTable.XK_F24);
-addStandard("F25", KeyTable.XK_F25);
-addStandard("F26", KeyTable.XK_F26);
-addStandard("F27", KeyTable.XK_F27);
-addStandard("F28", KeyTable.XK_F28);
-addStandard("F29", KeyTable.XK_F29);
-addStandard("F30", KeyTable.XK_F30);
-addStandard("F31", KeyTable.XK_F31);
-addStandard("F32", KeyTable.XK_F32);
-addStandard("F33", KeyTable.XK_F33);
-addStandard("F34", KeyTable.XK_F34);
-addStandard("F35", KeyTable.XK_F35);
-// - Soft1...
-
-// 2.10. Multimedia Keys
-
-// - ChannelDown
-// - ChannelUp
-addStandard("Close", KeyTable.XF86XK_Close);
-addStandard("MailForward", KeyTable.XF86XK_MailForward);
-addStandard("MailReply", KeyTable.XF86XK_Reply);
-addStandard("MainSend", KeyTable.XF86XK_Send);
-addStandard("MediaFastForward", KeyTable.XF86XK_AudioForward);
-addStandard("MediaPause", KeyTable.XF86XK_AudioPause);
-addStandard("MediaPlay", KeyTable.XF86XK_AudioPlay);
-addStandard("MediaRecord", KeyTable.XF86XK_AudioRecord);
-addStandard("MediaRewind", KeyTable.XF86XK_AudioRewind);
-addStandard("MediaStop", KeyTable.XF86XK_AudioStop);
-addStandard("MediaTrackNext", KeyTable.XF86XK_AudioNext);
-addStandard("MediaTrackPrevious", KeyTable.XF86XK_AudioPrev);
-addStandard("New", KeyTable.XF86XK_New);
-addStandard("Open", KeyTable.XF86XK_Open);
-addStandard("Print", KeyTable.XK_Print);
-addStandard("Save", KeyTable.XF86XK_Save);
-addStandard("SpellCheck", KeyTable.XF86XK_Spell);
-
-// 2.11. Multimedia Numpad Keys
-
-// - Key11
-// - Key12
-
-// 2.12. Audio Keys
-
-// - AudioBalanceLeft
-// - AudioBalanceRight
-// - AudioBassDown
-// - AudioBassBoostDown
-// - AudioBassBoostToggle
-// - AudioBassBoostUp
-// - AudioBassUp
-// - AudioFaderFront
-// - AudioFaderRear
-// - AudioSurroundModeNext
-// - AudioTrebleDown
-// - AudioTrebleUp
-addStandard("AudioVolumeDown", KeyTable.XF86XK_AudioLowerVolume);
-addStandard("AudioVolumeUp", KeyTable.XF86XK_AudioRaiseVolume);
-addStandard("AudioVolumeMute", KeyTable.XF86XK_AudioMute);
-// - MicrophoneToggle
-// - MicrophoneVolumeDown
-// - MicrophoneVolumeUp
-addStandard("MicrophoneVolumeMute", KeyTable.XF86XK_AudioMicMute);
-
-// 2.13. Speech Keys
-
-// - SpeechCorrectionList
-// - SpeechInputToggle
-
-// 2.14. Application Keys
-
-addStandard("LaunchCalculator", KeyTable.XF86XK_Calculator);
-addStandard("LaunchCalendar", KeyTable.XF86XK_Calendar);
-addStandard("LaunchMail", KeyTable.XF86XK_Mail);
-addStandard("LaunchMediaPlayer", KeyTable.XF86XK_AudioMedia);
-addStandard("LaunchMusicPlayer", KeyTable.XF86XK_Music);
-addStandard("LaunchMyComputer", KeyTable.XF86XK_MyComputer);
-addStandard("LaunchPhone", KeyTable.XF86XK_Phone);
-addStandard("LaunchScreenSaver", KeyTable.XF86XK_ScreenSaver);
-addStandard("LaunchSpreadsheet", KeyTable.XF86XK_Excel);
-addStandard("LaunchWebBrowser", KeyTable.XF86XK_WWW);
-addStandard("LaunchWebCam", KeyTable.XF86XK_WebCam);
-addStandard("LaunchWordProcessor", KeyTable.XF86XK_Word);
-
-// 2.15. Browser Keys
-
-addStandard("BrowserBack", KeyTable.XF86XK_Back);
-addStandard("BrowserFavorites", KeyTable.XF86XK_Favorites);
-addStandard("BrowserForward", KeyTable.XF86XK_Forward);
-addStandard("BrowserHome", KeyTable.XF86XK_HomePage);
-addStandard("BrowserRefresh", KeyTable.XF86XK_Refresh);
-addStandard("BrowserSearch", KeyTable.XF86XK_Search);
-addStandard("BrowserStop", KeyTable.XF86XK_Stop);
-
-// 2.16. Mobile Phone Keys
-
-// - A whole bunch...
-
-// 2.17. TV Keys
-
-// - A whole bunch...
-
-// 2.18. Media Controller Keys
-
-// - A whole bunch...
-addStandard("Dimmer", KeyTable.XF86XK_BrightnessAdjust);
-addStandard("MediaAudioTrack", KeyTable.XF86XK_AudioCycleTrack);
-addStandard("RandomToggle", KeyTable.XF86XK_AudioRandomPlay);
-addStandard("SplitScreenToggle", KeyTable.XF86XK_SplitScreen);
-addStandard("Subtitle", KeyTable.XF86XK_Subtitle);
-addStandard("VideoModeNext", KeyTable.XF86XK_Next_VMode);
-
-// Extra: Numpad
-
-addNumpad("=", KeyTable.XK_equal, KeyTable.XK_KP_Equal);
-addNumpad("+", KeyTable.XK_plus, KeyTable.XK_KP_Add);
-addNumpad("-", KeyTable.XK_minus, KeyTable.XK_KP_Subtract);
-addNumpad("*", KeyTable.XK_asterisk, KeyTable.XK_KP_Multiply);
-addNumpad("/", KeyTable.XK_slash, KeyTable.XK_KP_Divide);
-addNumpad(".", KeyTable.XK_period, KeyTable.XK_KP_Decimal);
-addNumpad(",", KeyTable.XK_comma, KeyTable.XK_KP_Separator);
-addNumpad("0", KeyTable.XK_0, KeyTable.XK_KP_0);
-addNumpad("1", KeyTable.XK_1, KeyTable.XK_KP_1);
-addNumpad("2", KeyTable.XK_2, KeyTable.XK_KP_2);
-addNumpad("3", KeyTable.XK_3, KeyTable.XK_KP_3);
-addNumpad("4", KeyTable.XK_4, KeyTable.XK_KP_4);
-addNumpad("5", KeyTable.XK_5, KeyTable.XK_KP_5);
-addNumpad("6", KeyTable.XK_6, KeyTable.XK_KP_6);
-addNumpad("7", KeyTable.XK_7, KeyTable.XK_KP_7);
-addNumpad("8", KeyTable.XK_8, KeyTable.XK_KP_8);
-addNumpad("9", KeyTable.XK_9, KeyTable.XK_KP_9);
-
-export default DOMKeyTable;

+ 0 - 127
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/fixedkeys.js

@@ -1,127 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2017 Pierre Ossman for Cendio AB
- * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
- */
-
-/*
- * Fallback mapping between HTML key codes (physical keys) and
- * HTML key values. This only works for keys that don't vary
- * between layouts. We also omit those who manage fine by mapping the
- * Unicode representation.
- *
- * See https://www.w3.org/TR/uievents-code/ for possible codes.
- * See https://www.w3.org/TR/uievents-key/ for possible values.
- */
-
-export default {
-
-// 3.1.1.1. Writing System Keys
-
-    'Backspace':        'Backspace',
-
-// 3.1.1.2. Functional Keys
-
-    'AltLeft':          'Alt',
-    'AltRight':         'Alt', // This could also be 'AltGraph'
-    'CapsLock':         'CapsLock',
-    'ContextMenu':      'ContextMenu',
-    'ControlLeft':      'Control',
-    'ControlRight':     'Control',
-    'Enter':            'Enter',
-    'MetaLeft':         'Meta',
-    'MetaRight':        'Meta',
-    'ShiftLeft':        'Shift',
-    'ShiftRight':       'Shift',
-    'Tab':              'Tab',
-    // FIXME: Japanese/Korean keys
-
-// 3.1.2. Control Pad Section
-
-    'Delete':           'Delete',
-    'End':              'End',
-    'Help':             'Help',
-    'Home':             'Home',
-    'Insert':           'Insert',
-    'PageDown':         'PageDown',
-    'PageUp':           'PageUp',
-
-// 3.1.3. Arrow Pad Section
-
-    'ArrowDown':        'ArrowDown',
-    'ArrowLeft':        'ArrowLeft',
-    'ArrowRight':       'ArrowRight',
-    'ArrowUp':          'ArrowUp',
-
-// 3.1.4. Numpad Section
-
-    'NumLock':          'NumLock',
-    'NumpadBackspace':  'Backspace',
-    'NumpadClear':      'Clear',
-
-// 3.1.5. Function Section
-
-    'Escape':           'Escape',
-    'F1':               'F1',
-    'F2':               'F2',
-    'F3':               'F3',
-    'F4':               'F4',
-    'F5':               'F5',
-    'F6':               'F6',
-    'F7':               'F7',
-    'F8':               'F8',
-    'F9':               'F9',
-    'F10':              'F10',
-    'F11':              'F11',
-    'F12':              'F12',
-    'F13':              'F13',
-    'F14':              'F14',
-    'F15':              'F15',
-    'F16':              'F16',
-    'F17':              'F17',
-    'F18':              'F18',
-    'F19':              'F19',
-    'F20':              'F20',
-    'F21':              'F21',
-    'F22':              'F22',
-    'F23':              'F23',
-    'F24':              'F24',
-    'F25':              'F25',
-    'F26':              'F26',
-    'F27':              'F27',
-    'F28':              'F28',
-    'F29':              'F29',
-    'F30':              'F30',
-    'F31':              'F31',
-    'F32':              'F32',
-    'F33':              'F33',
-    'F34':              'F34',
-    'F35':              'F35',
-    'PrintScreen':      'PrintScreen',
-    'ScrollLock':       'ScrollLock',
-    'Pause':            'Pause',
-
-// 3.1.6. Media Keys
-
-    'BrowserBack':      'BrowserBack',
-    'BrowserFavorites': 'BrowserFavorites',
-    'BrowserForward':   'BrowserForward',
-    'BrowserHome':      'BrowserHome',
-    'BrowserRefresh':   'BrowserRefresh',
-    'BrowserSearch':    'BrowserSearch',
-    'BrowserStop':      'BrowserStop',
-    'Eject':            'Eject',
-    'LaunchApp1':       'LaunchMyComputer',
-    'LaunchApp2':       'LaunchCalendar',
-    'LaunchMail':       'LaunchMail',
-    'MediaPlayPause':   'MediaPlay',
-    'MediaStop':        'MediaStop',
-    'MediaTrackNext':   'MediaTrackNext',
-    'MediaTrackPrevious': 'MediaTrackPrevious',
-    'Power':            'Power',
-    'Sleep':            'Sleep',
-    'AudioVolumeDown':  'AudioVolumeDown',
-    'AudioVolumeMute':  'AudioVolumeMute',
-    'AudioVolumeUp':    'AudioVolumeUp',
-    'WakeUp':           'WakeUp',
-};

+ 0 - 314
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/keyboard.js

@@ -1,314 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Copyright (C) 2013 Samuel Mannehed for Cendio AB
- * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
- */
-
-import * as Log from '../util/logging.js';
-import { stopEvent } from '../util/events.js';
-import * as KeyboardUtil from "./util.js";
-import KeyTable from "./keysym.js";
-import * as browser from "../util/browser.js";
-
-//
-// Keyboard event handler
-//
-
-export default function Keyboard(target) {
-    this._target = target || null;
-
-    this._keyDownList = {};         // List of depressed keys
-                                    // (even if they are happy)
-    this._pendingKey = null;        // Key waiting for keypress
-
-    // keep these here so we can refer to them later
-    this._eventHandlers = {
-        'keyup': this._handleKeyUp.bind(this),
-        'keydown': this._handleKeyDown.bind(this),
-        'keypress': this._handleKeyPress.bind(this),
-        'blur': this._allKeysUp.bind(this)
-    };
-};
-
-Keyboard.prototype = {
-    // ===== EVENT HANDLERS =====
-
-    onkeyevent: function () {},     // Handler for key press/release
-
-    // ===== PRIVATE METHODS =====
-
-    _sendKeyEvent: function (keysym, code, down) {
-        Log.Debug("onkeyevent " + (down ? "down" : "up") +
-                  ", keysym: " + keysym, ", code: " + code);
-
-        // Windows sends CtrlLeft+AltRight when you press
-        // AltGraph, which tends to confuse the hell out of
-        // remote systems. Fake a release of these keys until
-        // there is a way to detect AltGraph properly.
-        var fakeAltGraph = false;
-        if (down && browser.isWindows()) {
-            if ((code !== 'ControlLeft') &&
-                (code !== 'AltRight') &&
-                ('ControlLeft' in this._keyDownList) &&
-                ('AltRight' in this._keyDownList)) {
-                fakeAltGraph = true;
-                this.onkeyevent(this._keyDownList['AltRight'],
-                                 'AltRight', false);
-                this.onkeyevent(this._keyDownList['ControlLeft'],
-                                 'ControlLeft', false);
-            }
-        }
-
-        this.onkeyevent(keysym, code, down);
-
-        if (fakeAltGraph) {
-            this.onkeyevent(this._keyDownList['ControlLeft'],
-                             'ControlLeft', true);
-            this.onkeyevent(this._keyDownList['AltRight'],
-                             'AltRight', true);
-        }
-    },
-
-    _getKeyCode: function (e) {
-        var code = KeyboardUtil.getKeycode(e);
-        if (code !== 'Unidentified') {
-            return code;
-        }
-
-        // Unstable, but we don't have anything else to go on
-        // (don't use it for 'keypress' events thought since
-        // WebKit sets it to the same as charCode)
-        if (e.keyCode && (e.type !== 'keypress')) {
-            // 229 is used for composition events
-            if (e.keyCode !== 229) {
-                return 'Platform' + e.keyCode;
-            }
-        }
-
-        // A precursor to the final DOM3 standard. Unfortunately it
-        // is not layout independent, so it is as bad as using keyCode
-        if (e.keyIdentifier) {
-            // Non-character key?
-            if (e.keyIdentifier.substr(0, 2) !== 'U+') {
-                return e.keyIdentifier;
-            }
-
-            var codepoint = parseInt(e.keyIdentifier.substr(2), 16);
-            var char = String.fromCharCode(codepoint);
-            // Some implementations fail to uppercase the symbols
-            char = char.toUpperCase();
-
-            return 'Platform' + char.charCodeAt();
-        }
-
-        return 'Unidentified';
-    },
-
-    _handleKeyDown: function (e) {
-        var code = this._getKeyCode(e);
-        var keysym = KeyboardUtil.getKeysym(e);
-
-        // We cannot handle keys we cannot track, but we also need
-        // to deal with virtual keyboards which omit key info
-        // (iOS omits tracking info on keyup events, which forces us to
-        // special treat that platform here)
-        if ((code === 'Unidentified') || browser.isIOS()) {
-            if (keysym) {
-                // If it's a virtual keyboard then it should be
-                // sufficient to just send press and release right
-                // after each other
-                this._sendKeyEvent(keysym, code, true);
-                this._sendKeyEvent(keysym, code, false);
-            }
-
-            stopEvent(e);
-            return;
-        }
-
-        // Alt behaves more like AltGraph on macOS, so shuffle the
-        // keys around a bit to make things more sane for the remote
-        // server. This method is used by RealVNC and TigerVNC (and
-        // possibly others).
-        if (browser.isMac()) {
-            switch (keysym) {
-            case KeyTable.XK_Super_L:
-                keysym = KeyTable.XK_Alt_L;
-                break;
-            case KeyTable.XK_Super_R:
-                keysym = KeyTable.XK_Super_L;
-                break;
-            case KeyTable.XK_Alt_L:
-                keysym = KeyTable.XK_Mode_switch;
-                break;
-            case KeyTable.XK_Alt_R:
-                keysym = KeyTable.XK_ISO_Level3_Shift;
-                break;
-            }
-        }
-
-        // Is this key already pressed? If so, then we must use the
-        // same keysym or we'll confuse the server
-        if (code in this._keyDownList) {
-            keysym = this._keyDownList[code];
-        }
-
-        // macOS doesn't send proper key events for modifiers, only
-        // state change events. That gets extra confusing for CapsLock
-        // which toggles on each press, but not on release. So pretend
-        // it was a quick press and release of the button.
-        if (browser.isMac() && (code === 'CapsLock')) {
-            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true);
-            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false);
-            stopEvent(e);
-            return;
-        }
-
-        // If this is a legacy browser then we'll need to wait for
-        // a keypress event as well
-        // (IE and Edge has a broken KeyboardEvent.key, so we can't
-        // just check for the presence of that field)
-        if (!keysym && (!e.key || browser.isIE() || browser.isEdge())) {
-            this._pendingKey = code;
-            // However we might not get a keypress event if the key
-            // is non-printable, which needs some special fallback
-            // handling
-            setTimeout(this._handleKeyPressTimeout.bind(this), 10, e);
-            return;
-        }
-
-        this._pendingKey = null;
-        stopEvent(e);
-
-        this._keyDownList[code] = keysym;
-
-        this._sendKeyEvent(keysym, code, true);
-    },
-
-    // Legacy event for browsers without code/key
-    _handleKeyPress: function (e) {
-        stopEvent(e);
-
-        // Are we expecting a keypress?
-        if (this._pendingKey === null) {
-            return;
-        }
-
-        var code = this._getKeyCode(e);
-        var keysym = KeyboardUtil.getKeysym(e);
-
-        // The key we were waiting for?
-        if ((code !== 'Unidentified') && (code != this._pendingKey)) {
-            return;
-        }
-
-        code = this._pendingKey;
-        this._pendingKey = null;
-
-        if (!keysym) {
-            Log.Info('keypress with no keysym:', e);
-            return;
-        }
-
-        this._keyDownList[code] = keysym;
-
-        this._sendKeyEvent(keysym, code, true);
-    },
-    _handleKeyPressTimeout: function (e) {
-        // Did someone manage to sort out the key already?
-        if (this._pendingKey === null) {
-            return;
-        }
-
-        var code, keysym;
-
-        code = this._pendingKey;
-        this._pendingKey = null;
-
-        // We have no way of knowing the proper keysym with the
-        // information given, but the following are true for most
-        // layouts
-        if ((e.keyCode >= 0x30) && (e.keyCode <= 0x39)) {
-            // Digit
-            keysym = e.keyCode;
-        } else if ((e.keyCode >= 0x41) && (e.keyCode <= 0x5a)) {
-            // Character (A-Z)
-            var char = String.fromCharCode(e.keyCode);
-            // A feeble attempt at the correct case
-            if (e.shiftKey)
-                char = char.toUpperCase();
-            else
-                char = char.toLowerCase();
-            keysym = char.charCodeAt();
-        } else {
-            // Unknown, give up
-            keysym = 0;
-        }
-
-        this._keyDownList[code] = keysym;
-
-        this._sendKeyEvent(keysym, code, true);
-    },
-
-    _handleKeyUp: function (e) {
-        stopEvent(e);
-
-        var code = this._getKeyCode(e);
-
-        // See comment in _handleKeyDown()
-        if (browser.isMac() && (code === 'CapsLock')) {
-            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true);
-            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false);
-            return;
-        }
-
-        // Do we really think this key is down?
-        if (!(code in this._keyDownList)) {
-            return;
-        }
-
-        this._sendKeyEvent(this._keyDownList[code], code, false);
-
-        delete this._keyDownList[code];
-    },
-
-    _allKeysUp: function () {
-        Log.Debug(">> Keyboard.allKeysUp");
-        for (var code in this._keyDownList) {
-            this._sendKeyEvent(this._keyDownList[code], code, false);
-        };
-        this._keyDownList = {};
-        Log.Debug("<< Keyboard.allKeysUp");
-    },
-
-    // ===== PUBLIC METHODS =====
-
-    grab: function () {
-        //Log.Debug(">> Keyboard.grab");
-        var c = this._target;
-
-        c.addEventListener('keydown', this._eventHandlers.keydown);
-        c.addEventListener('keyup', this._eventHandlers.keyup);
-        c.addEventListener('keypress', this._eventHandlers.keypress);
-
-        // Release (key up) if window loses focus
-        window.addEventListener('blur', this._eventHandlers.blur);
-
-        //Log.Debug("<< Keyboard.grab");
-    },
-
-    ungrab: function () {
-        //Log.Debug(">> Keyboard.ungrab");
-        var c = this._target;
-
-        c.removeEventListener('keydown', this._eventHandlers.keydown);
-        c.removeEventListener('keyup', this._eventHandlers.keyup);
-        c.removeEventListener('keypress', this._eventHandlers.keypress);
-        window.removeEventListener('blur', this._eventHandlers.blur);
-
-        // Release (key up) all keys that are in a down state
-        this._allKeysUp();
-
-        //Log.Debug(">> Keyboard.ungrab");
-    },
-};

+ 0 - 614
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/keysym.js

@@ -1,614 +0,0 @@
-export default {
-    XK_VoidSymbol:                  0xffffff, /* Void symbol */
-
-    XK_BackSpace:                   0xff08, /* Back space, back char */
-    XK_Tab:                         0xff09,
-    XK_Linefeed:                    0xff0a, /* Linefeed, LF */
-    XK_Clear:                       0xff0b,
-    XK_Return:                      0xff0d, /* Return, enter */
-    XK_Pause:                       0xff13, /* Pause, hold */
-    XK_Scroll_Lock:                 0xff14,
-    XK_Sys_Req:                     0xff15,
-    XK_Escape:                      0xff1b,
-    XK_Delete:                      0xffff, /* Delete, rubout */
-
-    /* International & multi-key character composition */
-
-    XK_Multi_key:                   0xff20, /* Multi-key character compose */
-    XK_Codeinput:                   0xff37,
-    XK_SingleCandidate:             0xff3c,
-    XK_MultipleCandidate:           0xff3d,
-    XK_PreviousCandidate:           0xff3e,
-
-    /* Japanese keyboard support */
-
-    XK_Kanji:                       0xff21, /* Kanji, Kanji convert */
-    XK_Muhenkan:                    0xff22, /* Cancel Conversion */
-    XK_Henkan_Mode:                 0xff23, /* Start/Stop Conversion */
-    XK_Henkan:                      0xff23, /* Alias for Henkan_Mode */
-    XK_Romaji:                      0xff24, /* to Romaji */
-    XK_Hiragana:                    0xff25, /* to Hiragana */
-    XK_Katakana:                    0xff26, /* to Katakana */
-    XK_Hiragana_Katakana:           0xff27, /* Hiragana/Katakana toggle */
-    XK_Zenkaku:                     0xff28, /* to Zenkaku */
-    XK_Hankaku:                     0xff29, /* to Hankaku */
-    XK_Zenkaku_Hankaku:             0xff2a, /* Zenkaku/Hankaku toggle */
-    XK_Touroku:                     0xff2b, /* Add to Dictionary */
-    XK_Massyo:                      0xff2c, /* Delete from Dictionary */
-    XK_Kana_Lock:                   0xff2d, /* Kana Lock */
-    XK_Kana_Shift:                  0xff2e, /* Kana Shift */
-    XK_Eisu_Shift:                  0xff2f, /* Alphanumeric Shift */
-    XK_Eisu_toggle:                 0xff30, /* Alphanumeric toggle */
-    XK_Kanji_Bangou:                0xff37, /* Codeinput */
-    XK_Zen_Koho:                    0xff3d, /* Multiple/All Candidate(s) */
-    XK_Mae_Koho:                    0xff3e, /* Previous Candidate */
-
-    /* Cursor control & motion */
-
-    XK_Home:                        0xff50,
-    XK_Left:                        0xff51, /* Move left, left arrow */
-    XK_Up:                          0xff52, /* Move up, up arrow */
-    XK_Right:                       0xff53, /* Move right, right arrow */
-    XK_Down:                        0xff54, /* Move down, down arrow */
-    XK_Prior:                       0xff55, /* Prior, previous */
-    XK_Page_Up:                     0xff55,
-    XK_Next:                        0xff56, /* Next */
-    XK_Page_Down:                   0xff56,
-    XK_End:                         0xff57, /* EOL */
-    XK_Begin:                       0xff58, /* BOL */
-
-
-    /* Misc functions */
-
-    XK_Select:                      0xff60, /* Select, mark */
-    XK_Print:                       0xff61,
-    XK_Execute:                     0xff62, /* Execute, run, do */
-    XK_Insert:                      0xff63, /* Insert, insert here */
-    XK_Undo:                        0xff65,
-    XK_Redo:                        0xff66, /* Redo, again */
-    XK_Menu:                        0xff67,
-    XK_Find:                        0xff68, /* Find, search */
-    XK_Cancel:                      0xff69, /* Cancel, stop, abort, exit */
-    XK_Help:                        0xff6a, /* Help */
-    XK_Break:                       0xff6b,
-    XK_Mode_switch:                 0xff7e, /* Character set switch */
-    XK_script_switch:               0xff7e, /* Alias for mode_switch */
-    XK_Num_Lock:                    0xff7f,
-
-    /* Keypad functions, keypad numbers cleverly chosen to map to ASCII */
-
-    XK_KP_Space:                    0xff80, /* Space */
-    XK_KP_Tab:                      0xff89,
-    XK_KP_Enter:                    0xff8d, /* Enter */
-    XK_KP_F1:                       0xff91, /* PF1, KP_A, ... */
-    XK_KP_F2:                       0xff92,
-    XK_KP_F3:                       0xff93,
-    XK_KP_F4:                       0xff94,
-    XK_KP_Home:                     0xff95,
-    XK_KP_Left:                     0xff96,
-    XK_KP_Up:                       0xff97,
-    XK_KP_Right:                    0xff98,
-    XK_KP_Down:                     0xff99,
-    XK_KP_Prior:                    0xff9a,
-    XK_KP_Page_Up:                  0xff9a,
-    XK_KP_Next:                     0xff9b,
-    XK_KP_Page_Down:                0xff9b,
-    XK_KP_End:                      0xff9c,
-    XK_KP_Begin:                    0xff9d,
-    XK_KP_Insert:                   0xff9e,
-    XK_KP_Delete:                   0xff9f,
-    XK_KP_Equal:                    0xffbd, /* Equals */
-    XK_KP_Multiply:                 0xffaa,
-    XK_KP_Add:                      0xffab,
-    XK_KP_Separator:                0xffac, /* Separator, often comma */
-    XK_KP_Subtract:                 0xffad,
-    XK_KP_Decimal:                  0xffae,
-    XK_KP_Divide:                   0xffaf,
-
-    XK_KP_0:                        0xffb0,
-    XK_KP_1:                        0xffb1,
-    XK_KP_2:                        0xffb2,
-    XK_KP_3:                        0xffb3,
-    XK_KP_4:                        0xffb4,
-    XK_KP_5:                        0xffb5,
-    XK_KP_6:                        0xffb6,
-    XK_KP_7:                        0xffb7,
-    XK_KP_8:                        0xffb8,
-    XK_KP_9:                        0xffb9,
-
-    /*
-     * Auxiliary functions; note the duplicate definitions for left and right
-     * function keys;  Sun keyboards and a few other manufacturers have such
-     * function key groups on the left and/or right sides of the keyboard.
-     * We've not found a keyboard with more than 35 function keys total.
-     */
-
-    XK_F1:                          0xffbe,
-    XK_F2:                          0xffbf,
-    XK_F3:                          0xffc0,
-    XK_F4:                          0xffc1,
-    XK_F5:                          0xffc2,
-    XK_F6:                          0xffc3,
-    XK_F7:                          0xffc4,
-    XK_F8:                          0xffc5,
-    XK_F9:                          0xffc6,
-    XK_F10:                         0xffc7,
-    XK_F11:                         0xffc8,
-    XK_L1:                          0xffc8,
-    XK_F12:                         0xffc9,
-    XK_L2:                          0xffc9,
-    XK_F13:                         0xffca,
-    XK_L3:                          0xffca,
-    XK_F14:                         0xffcb,
-    XK_L4:                          0xffcb,
-    XK_F15:                         0xffcc,
-    XK_L5:                          0xffcc,
-    XK_F16:                         0xffcd,
-    XK_L6:                          0xffcd,
-    XK_F17:                         0xffce,
-    XK_L7:                          0xffce,
-    XK_F18:                         0xffcf,
-    XK_L8:                          0xffcf,
-    XK_F19:                         0xffd0,
-    XK_L9:                          0xffd0,
-    XK_F20:                         0xffd1,
-    XK_L10:                         0xffd1,
-    XK_F21:                         0xffd2,
-    XK_R1:                          0xffd2,
-    XK_F22:                         0xffd3,
-    XK_R2:                          0xffd3,
-    XK_F23:                         0xffd4,
-    XK_R3:                          0xffd4,
-    XK_F24:                         0xffd5,
-    XK_R4:                          0xffd5,
-    XK_F25:                         0xffd6,
-    XK_R5:                          0xffd6,
-    XK_F26:                         0xffd7,
-    XK_R6:                          0xffd7,
-    XK_F27:                         0xffd8,
-    XK_R7:                          0xffd8,
-    XK_F28:                         0xffd9,
-    XK_R8:                          0xffd9,
-    XK_F29:                         0xffda,
-    XK_R9:                          0xffda,
-    XK_F30:                         0xffdb,
-    XK_R10:                         0xffdb,
-    XK_F31:                         0xffdc,
-    XK_R11:                         0xffdc,
-    XK_F32:                         0xffdd,
-    XK_R12:                         0xffdd,
-    XK_F33:                         0xffde,
-    XK_R13:                         0xffde,
-    XK_F34:                         0xffdf,
-    XK_R14:                         0xffdf,
-    XK_F35:                         0xffe0,
-    XK_R15:                         0xffe0,
-
-    /* Modifiers */
-
-    XK_Shift_L:                     0xffe1, /* Left shift */
-    XK_Shift_R:                     0xffe2, /* Right shift */
-    XK_Control_L:                   0xffe3, /* Left control */
-    XK_Control_R:                   0xffe4, /* Right control */
-    XK_Caps_Lock:                   0xffe5, /* Caps lock */
-    XK_Shift_Lock:                  0xffe6, /* Shift lock */
-
-    XK_Meta_L:                      0xffe7, /* Left meta */
-    XK_Meta_R:                      0xffe8, /* Right meta */
-    XK_Alt_L:                       0xffe9, /* Left alt */
-    XK_Alt_R:                       0xffea, /* Right alt */
-    XK_Super_L:                     0xffeb, /* Left super */
-    XK_Super_R:                     0xffec, /* Right super */
-    XK_Hyper_L:                     0xffed, /* Left hyper */
-    XK_Hyper_R:                     0xffee, /* Right hyper */
-
-    /*
-     * Keyboard (XKB) Extension function and modifier keys
-     * (from Appendix C of "The X Keyboard Extension: Protocol Specification")
-     * Byte 3 = 0xfe
-     */
-
-    XK_ISO_Level3_Shift:            0xfe03, /* AltGr */
-    XK_ISO_Next_Group:              0xfe08,
-    XK_ISO_Prev_Group:              0xfe0a,
-    XK_ISO_First_Group:             0xfe0c,
-    XK_ISO_Last_Group:              0xfe0e,
-
-    /*
-     * Latin 1
-     * (ISO/IEC 8859-1: Unicode U+0020..U+00FF)
-     * Byte 3: 0
-     */
-
-    XK_space:                       0x0020, /* U+0020 SPACE */
-    XK_exclam:                      0x0021, /* U+0021 EXCLAMATION MARK */
-    XK_quotedbl:                    0x0022, /* U+0022 QUOTATION MARK */
-    XK_numbersign:                  0x0023, /* U+0023 NUMBER SIGN */
-    XK_dollar:                      0x0024, /* U+0024 DOLLAR SIGN */
-    XK_percent:                     0x0025, /* U+0025 PERCENT SIGN */
-    XK_ampersand:                   0x0026, /* U+0026 AMPERSAND */
-    XK_apostrophe:                  0x0027, /* U+0027 APOSTROPHE */
-    XK_quoteright:                  0x0027, /* deprecated */
-    XK_parenleft:                   0x0028, /* U+0028 LEFT PARENTHESIS */
-    XK_parenright:                  0x0029, /* U+0029 RIGHT PARENTHESIS */
-    XK_asterisk:                    0x002a, /* U+002A ASTERISK */
-    XK_plus:                        0x002b, /* U+002B PLUS SIGN */
-    XK_comma:                       0x002c, /* U+002C COMMA */
-    XK_minus:                       0x002d, /* U+002D HYPHEN-MINUS */
-    XK_period:                      0x002e, /* U+002E FULL STOP */
-    XK_slash:                       0x002f, /* U+002F SOLIDUS */
-    XK_0:                           0x0030, /* U+0030 DIGIT ZERO */
-    XK_1:                           0x0031, /* U+0031 DIGIT ONE */
-    XK_2:                           0x0032, /* U+0032 DIGIT TWO */
-    XK_3:                           0x0033, /* U+0033 DIGIT THREE */
-    XK_4:                           0x0034, /* U+0034 DIGIT FOUR */
-    XK_5:                           0x0035, /* U+0035 DIGIT FIVE */
-    XK_6:                           0x0036, /* U+0036 DIGIT SIX */
-    XK_7:                           0x0037, /* U+0037 DIGIT SEVEN */
-    XK_8:                           0x0038, /* U+0038 DIGIT EIGHT */
-    XK_9:                           0x0039, /* U+0039 DIGIT NINE */
-    XK_colon:                       0x003a, /* U+003A COLON */
-    XK_semicolon:                   0x003b, /* U+003B SEMICOLON */
-    XK_less:                        0x003c, /* U+003C LESS-THAN SIGN */
-    XK_equal:                       0x003d, /* U+003D EQUALS SIGN */
-    XK_greater:                     0x003e, /* U+003E GREATER-THAN SIGN */
-    XK_question:                    0x003f, /* U+003F QUESTION MARK */
-    XK_at:                          0x0040, /* U+0040 COMMERCIAL AT */
-    XK_A:                           0x0041, /* U+0041 LATIN CAPITAL LETTER A */
-    XK_B:                           0x0042, /* U+0042 LATIN CAPITAL LETTER B */
-    XK_C:                           0x0043, /* U+0043 LATIN CAPITAL LETTER C */
-    XK_D:                           0x0044, /* U+0044 LATIN CAPITAL LETTER D */
-    XK_E:                           0x0045, /* U+0045 LATIN CAPITAL LETTER E */
-    XK_F:                           0x0046, /* U+0046 LATIN CAPITAL LETTER F */
-    XK_G:                           0x0047, /* U+0047 LATIN CAPITAL LETTER G */
-    XK_H:                           0x0048, /* U+0048 LATIN CAPITAL LETTER H */
-    XK_I:                           0x0049, /* U+0049 LATIN CAPITAL LETTER I */
-    XK_J:                           0x004a, /* U+004A LATIN CAPITAL LETTER J */
-    XK_K:                           0x004b, /* U+004B LATIN CAPITAL LETTER K */
-    XK_L:                           0x004c, /* U+004C LATIN CAPITAL LETTER L */
-    XK_M:                           0x004d, /* U+004D LATIN CAPITAL LETTER M */
-    XK_N:                           0x004e, /* U+004E LATIN CAPITAL LETTER N */
-    XK_O:                           0x004f, /* U+004F LATIN CAPITAL LETTER O */
-    XK_P:                           0x0050, /* U+0050 LATIN CAPITAL LETTER P */
-    XK_Q:                           0x0051, /* U+0051 LATIN CAPITAL LETTER Q */
-    XK_R:                           0x0052, /* U+0052 LATIN CAPITAL LETTER R */
-    XK_S:                           0x0053, /* U+0053 LATIN CAPITAL LETTER S */
-    XK_T:                           0x0054, /* U+0054 LATIN CAPITAL LETTER T */
-    XK_U:                           0x0055, /* U+0055 LATIN CAPITAL LETTER U */
-    XK_V:                           0x0056, /* U+0056 LATIN CAPITAL LETTER V */
-    XK_W:                           0x0057, /* U+0057 LATIN CAPITAL LETTER W */
-    XK_X:                           0x0058, /* U+0058 LATIN CAPITAL LETTER X */
-    XK_Y:                           0x0059, /* U+0059 LATIN CAPITAL LETTER Y */
-    XK_Z:                           0x005a, /* U+005A LATIN CAPITAL LETTER Z */
-    XK_bracketleft:                 0x005b, /* U+005B LEFT SQUARE BRACKET */
-    XK_backslash:                   0x005c, /* U+005C REVERSE SOLIDUS */
-    XK_bracketright:                0x005d, /* U+005D RIGHT SQUARE BRACKET */
-    XK_asciicircum:                 0x005e, /* U+005E CIRCUMFLEX ACCENT */
-    XK_underscore:                  0x005f, /* U+005F LOW LINE */
-    XK_grave:                       0x0060, /* U+0060 GRAVE ACCENT */
-    XK_quoteleft:                   0x0060, /* deprecated */
-    XK_a:                           0x0061, /* U+0061 LATIN SMALL LETTER A */
-    XK_b:                           0x0062, /* U+0062 LATIN SMALL LETTER B */
-    XK_c:                           0x0063, /* U+0063 LATIN SMALL LETTER C */
-    XK_d:                           0x0064, /* U+0064 LATIN SMALL LETTER D */
-    XK_e:                           0x0065, /* U+0065 LATIN SMALL LETTER E */
-    XK_f:                           0x0066, /* U+0066 LATIN SMALL LETTER F */
-    XK_g:                           0x0067, /* U+0067 LATIN SMALL LETTER G */
-    XK_h:                           0x0068, /* U+0068 LATIN SMALL LETTER H */
-    XK_i:                           0x0069, /* U+0069 LATIN SMALL LETTER I */
-    XK_j:                           0x006a, /* U+006A LATIN SMALL LETTER J */
-    XK_k:                           0x006b, /* U+006B LATIN SMALL LETTER K */
-    XK_l:                           0x006c, /* U+006C LATIN SMALL LETTER L */
-    XK_m:                           0x006d, /* U+006D LATIN SMALL LETTER M */
-    XK_n:                           0x006e, /* U+006E LATIN SMALL LETTER N */
-    XK_o:                           0x006f, /* U+006F LATIN SMALL LETTER O */
-    XK_p:                           0x0070, /* U+0070 LATIN SMALL LETTER P */
-    XK_q:                           0x0071, /* U+0071 LATIN SMALL LETTER Q */
-    XK_r:                           0x0072, /* U+0072 LATIN SMALL LETTER R */
-    XK_s:                           0x0073, /* U+0073 LATIN SMALL LETTER S */
-    XK_t:                           0x0074, /* U+0074 LATIN SMALL LETTER T */
-    XK_u:                           0x0075, /* U+0075 LATIN SMALL LETTER U */
-    XK_v:                           0x0076, /* U+0076 LATIN SMALL LETTER V */
-    XK_w:                           0x0077, /* U+0077 LATIN SMALL LETTER W */
-    XK_x:                           0x0078, /* U+0078 LATIN SMALL LETTER X */
-    XK_y:                           0x0079, /* U+0079 LATIN SMALL LETTER Y */
-    XK_z:                           0x007a, /* U+007A LATIN SMALL LETTER Z */
-    XK_braceleft:                   0x007b, /* U+007B LEFT CURLY BRACKET */
-    XK_bar:                         0x007c, /* U+007C VERTICAL LINE */
-    XK_braceright:                  0x007d, /* U+007D RIGHT CURLY BRACKET */
-    XK_asciitilde:                  0x007e, /* U+007E TILDE */
-
-    XK_nobreakspace:                0x00a0, /* U+00A0 NO-BREAK SPACE */
-    XK_exclamdown:                  0x00a1, /* U+00A1 INVERTED EXCLAMATION MARK */
-    XK_cent:                        0x00a2, /* U+00A2 CENT SIGN */
-    XK_sterling:                    0x00a3, /* U+00A3 POUND SIGN */
-    XK_currency:                    0x00a4, /* U+00A4 CURRENCY SIGN */
-    XK_yen:                         0x00a5, /* U+00A5 YEN SIGN */
-    XK_brokenbar:                   0x00a6, /* U+00A6 BROKEN BAR */
-    XK_section:                     0x00a7, /* U+00A7 SECTION SIGN */
-    XK_diaeresis:                   0x00a8, /* U+00A8 DIAERESIS */
-    XK_copyright:                   0x00a9, /* U+00A9 COPYRIGHT SIGN */
-    XK_ordfeminine:                 0x00aa, /* U+00AA FEMININE ORDINAL INDICATOR */
-    XK_guillemotleft:               0x00ab, /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
-    XK_notsign:                     0x00ac, /* U+00AC NOT SIGN */
-    XK_hyphen:                      0x00ad, /* U+00AD SOFT HYPHEN */
-    XK_registered:                  0x00ae, /* U+00AE REGISTERED SIGN */
-    XK_macron:                      0x00af, /* U+00AF MACRON */
-    XK_degree:                      0x00b0, /* U+00B0 DEGREE SIGN */
-    XK_plusminus:                   0x00b1, /* U+00B1 PLUS-MINUS SIGN */
-    XK_twosuperior:                 0x00b2, /* U+00B2 SUPERSCRIPT TWO */
-    XK_threesuperior:               0x00b3, /* U+00B3 SUPERSCRIPT THREE */
-    XK_acute:                       0x00b4, /* U+00B4 ACUTE ACCENT */
-    XK_mu:                          0x00b5, /* U+00B5 MICRO SIGN */
-    XK_paragraph:                   0x00b6, /* U+00B6 PILCROW SIGN */
-    XK_periodcentered:              0x00b7, /* U+00B7 MIDDLE DOT */
-    XK_cedilla:                     0x00b8, /* U+00B8 CEDILLA */
-    XK_onesuperior:                 0x00b9, /* U+00B9 SUPERSCRIPT ONE */
-    XK_masculine:                   0x00ba, /* U+00BA MASCULINE ORDINAL INDICATOR */
-    XK_guillemotright:              0x00bb, /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
-    XK_onequarter:                  0x00bc, /* U+00BC VULGAR FRACTION ONE QUARTER */
-    XK_onehalf:                     0x00bd, /* U+00BD VULGAR FRACTION ONE HALF */
-    XK_threequarters:               0x00be, /* U+00BE VULGAR FRACTION THREE QUARTERS */
-    XK_questiondown:                0x00bf, /* U+00BF INVERTED QUESTION MARK */
-    XK_Agrave:                      0x00c0, /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */
-    XK_Aacute:                      0x00c1, /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */
-    XK_Acircumflex:                 0x00c2, /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
-    XK_Atilde:                      0x00c3, /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */
-    XK_Adiaeresis:                  0x00c4, /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */
-    XK_Aring:                       0x00c5, /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */
-    XK_AE:                          0x00c6, /* U+00C6 LATIN CAPITAL LETTER AE */
-    XK_Ccedilla:                    0x00c7, /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */
-    XK_Egrave:                      0x00c8, /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */
-    XK_Eacute:                      0x00c9, /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
-    XK_Ecircumflex:                 0x00ca, /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
-    XK_Ediaeresis:                  0x00cb, /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */
-    XK_Igrave:                      0x00cc, /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */
-    XK_Iacute:                      0x00cd, /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */
-    XK_Icircumflex:                 0x00ce, /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
-    XK_Idiaeresis:                  0x00cf, /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */
-    XK_ETH:                         0x00d0, /* U+00D0 LATIN CAPITAL LETTER ETH */
-    XK_Eth:                         0x00d0, /* deprecated */
-    XK_Ntilde:                      0x00d1, /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */
-    XK_Ograve:                      0x00d2, /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */
-    XK_Oacute:                      0x00d3, /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */
-    XK_Ocircumflex:                 0x00d4, /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
-    XK_Otilde:                      0x00d5, /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */
-    XK_Odiaeresis:                  0x00d6, /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */
-    XK_multiply:                    0x00d7, /* U+00D7 MULTIPLICATION SIGN */
-    XK_Oslash:                      0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
-    XK_Ooblique:                    0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
-    XK_Ugrave:                      0x00d9, /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */
-    XK_Uacute:                      0x00da, /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */
-    XK_Ucircumflex:                 0x00db, /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
-    XK_Udiaeresis:                  0x00dc, /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */
-    XK_Yacute:                      0x00dd, /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */
-    XK_THORN:                       0x00de, /* U+00DE LATIN CAPITAL LETTER THORN */
-    XK_Thorn:                       0x00de, /* deprecated */
-    XK_ssharp:                      0x00df, /* U+00DF LATIN SMALL LETTER SHARP S */
-    XK_agrave:                      0x00e0, /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */
-    XK_aacute:                      0x00e1, /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */
-    XK_acircumflex:                 0x00e2, /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */
-    XK_atilde:                      0x00e3, /* U+00E3 LATIN SMALL LETTER A WITH TILDE */
-    XK_adiaeresis:                  0x00e4, /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */
-    XK_aring:                       0x00e5, /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */
-    XK_ae:                          0x00e6, /* U+00E6 LATIN SMALL LETTER AE */
-    XK_ccedilla:                    0x00e7, /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */
-    XK_egrave:                      0x00e8, /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */
-    XK_eacute:                      0x00e9, /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
-    XK_ecircumflex:                 0x00ea, /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */
-    XK_ediaeresis:                  0x00eb, /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */
-    XK_igrave:                      0x00ec, /* U+00EC LATIN SMALL LETTER I WITH GRAVE */
-    XK_iacute:                      0x00ed, /* U+00ED LATIN SMALL LETTER I WITH ACUTE */
-    XK_icircumflex:                 0x00ee, /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */
-    XK_idiaeresis:                  0x00ef, /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */
-    XK_eth:                         0x00f0, /* U+00F0 LATIN SMALL LETTER ETH */
-    XK_ntilde:                      0x00f1, /* U+00F1 LATIN SMALL LETTER N WITH TILDE */
-    XK_ograve:                      0x00f2, /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */
-    XK_oacute:                      0x00f3, /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */
-    XK_ocircumflex:                 0x00f4, /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */
-    XK_otilde:                      0x00f5, /* U+00F5 LATIN SMALL LETTER O WITH TILDE */
-    XK_odiaeresis:                  0x00f6, /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */
-    XK_division:                    0x00f7, /* U+00F7 DIVISION SIGN */
-    XK_oslash:                      0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
-    XK_ooblique:                    0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
-    XK_ugrave:                      0x00f9, /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */
-    XK_uacute:                      0x00fa, /* U+00FA LATIN SMALL LETTER U WITH ACUTE */
-    XK_ucircumflex:                 0x00fb, /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */
-    XK_udiaeresis:                  0x00fc, /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */
-    XK_yacute:                      0x00fd, /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */
-    XK_thorn:                       0x00fe, /* U+00FE LATIN SMALL LETTER THORN */
-    XK_ydiaeresis:                  0x00ff, /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
-
-    /*
-     * Korean
-     * Byte 3 = 0x0e
-     */
-
-    XK_Hangul:                      0xff31, /* Hangul start/stop(toggle) */
-    XK_Hangul_Hanja:                0xff34, /* Start Hangul->Hanja Conversion */
-    XK_Hangul_Jeonja:               0xff38, /* Jeonja mode */
-
-    /*
-     * XFree86 vendor specific keysyms.
-     *
-     * The XFree86 keysym range is 0x10080001 - 0x1008FFFF.
-     */
-
-    XF86XK_ModeLock:                0x1008FF01,
-    XF86XK_MonBrightnessUp:         0x1008FF02,
-    XF86XK_MonBrightnessDown:       0x1008FF03,
-    XF86XK_KbdLightOnOff:           0x1008FF04,
-    XF86XK_KbdBrightnessUp:         0x1008FF05,
-    XF86XK_KbdBrightnessDown:       0x1008FF06,
-    XF86XK_Standby:                 0x1008FF10,
-    XF86XK_AudioLowerVolume:        0x1008FF11,
-    XF86XK_AudioMute:               0x1008FF12,
-    XF86XK_AudioRaiseVolume:        0x1008FF13,
-    XF86XK_AudioPlay:               0x1008FF14,
-    XF86XK_AudioStop:               0x1008FF15,
-    XF86XK_AudioPrev:               0x1008FF16,
-    XF86XK_AudioNext:               0x1008FF17,
-    XF86XK_HomePage:                0x1008FF18,
-    XF86XK_Mail:                    0x1008FF19,
-    XF86XK_Start:                   0x1008FF1A,
-    XF86XK_Search:                  0x1008FF1B,
-    XF86XK_AudioRecord:             0x1008FF1C,
-    XF86XK_Calculator:              0x1008FF1D,
-    XF86XK_Memo:                    0x1008FF1E,
-    XF86XK_ToDoList:                0x1008FF1F,
-    XF86XK_Calendar:                0x1008FF20,
-    XF86XK_PowerDown:               0x1008FF21,
-    XF86XK_ContrastAdjust:          0x1008FF22,
-    XF86XK_RockerUp:                0x1008FF23,
-    XF86XK_RockerDown:              0x1008FF24,
-    XF86XK_RockerEnter:             0x1008FF25,
-    XF86XK_Back:                    0x1008FF26,
-    XF86XK_Forward:                 0x1008FF27,
-    XF86XK_Stop:                    0x1008FF28,
-    XF86XK_Refresh:                 0x1008FF29,
-    XF86XK_PowerOff:                0x1008FF2A,
-    XF86XK_WakeUp:                  0x1008FF2B,
-    XF86XK_Eject:                   0x1008FF2C,
-    XF86XK_ScreenSaver:             0x1008FF2D,
-    XF86XK_WWW:                     0x1008FF2E,
-    XF86XK_Sleep:                   0x1008FF2F,
-    XF86XK_Favorites:               0x1008FF30,
-    XF86XK_AudioPause:              0x1008FF31,
-    XF86XK_AudioMedia:              0x1008FF32,
-    XF86XK_MyComputer:              0x1008FF33,
-    XF86XK_VendorHome:              0x1008FF34,
-    XF86XK_LightBulb:               0x1008FF35,
-    XF86XK_Shop:                    0x1008FF36,
-    XF86XK_History:                 0x1008FF37,
-    XF86XK_OpenURL:                 0x1008FF38,
-    XF86XK_AddFavorite:             0x1008FF39,
-    XF86XK_HotLinks:                0x1008FF3A,
-    XF86XK_BrightnessAdjust:        0x1008FF3B,
-    XF86XK_Finance:                 0x1008FF3C,
-    XF86XK_Community:               0x1008FF3D,
-    XF86XK_AudioRewind:             0x1008FF3E,
-    XF86XK_BackForward:             0x1008FF3F,
-    XF86XK_Launch0:                 0x1008FF40,
-    XF86XK_Launch1:                 0x1008FF41,
-    XF86XK_Launch2:                 0x1008FF42,
-    XF86XK_Launch3:                 0x1008FF43,
-    XF86XK_Launch4:                 0x1008FF44,
-    XF86XK_Launch5:                 0x1008FF45,
-    XF86XK_Launch6:                 0x1008FF46,
-    XF86XK_Launch7:                 0x1008FF47,
-    XF86XK_Launch8:                 0x1008FF48,
-    XF86XK_Launch9:                 0x1008FF49,
-    XF86XK_LaunchA:                 0x1008FF4A,
-    XF86XK_LaunchB:                 0x1008FF4B,
-    XF86XK_LaunchC:                 0x1008FF4C,
-    XF86XK_LaunchD:                 0x1008FF4D,
-    XF86XK_LaunchE:                 0x1008FF4E,
-    XF86XK_LaunchF:                 0x1008FF4F,
-    XF86XK_ApplicationLeft:         0x1008FF50,
-    XF86XK_ApplicationRight:        0x1008FF51,
-    XF86XK_Book:                    0x1008FF52,
-    XF86XK_CD:                      0x1008FF53,
-    XF86XK_Calculater:              0x1008FF54,
-    XF86XK_Clear:                   0x1008FF55,
-    XF86XK_Close:                   0x1008FF56,
-    XF86XK_Copy:                    0x1008FF57,
-    XF86XK_Cut:                     0x1008FF58,
-    XF86XK_Display:                 0x1008FF59,
-    XF86XK_DOS:                     0x1008FF5A,
-    XF86XK_Documents:               0x1008FF5B,
-    XF86XK_Excel:                   0x1008FF5C,
-    XF86XK_Explorer:                0x1008FF5D,
-    XF86XK_Game:                    0x1008FF5E,
-    XF86XK_Go:                      0x1008FF5F,
-    XF86XK_iTouch:                  0x1008FF60,
-    XF86XK_LogOff:                  0x1008FF61,
-    XF86XK_Market:                  0x1008FF62,
-    XF86XK_Meeting:                 0x1008FF63,
-    XF86XK_MenuKB:                  0x1008FF65,
-    XF86XK_MenuPB:                  0x1008FF66,
-    XF86XK_MySites:                 0x1008FF67,
-    XF86XK_New:                     0x1008FF68,
-    XF86XK_News:                    0x1008FF69,
-    XF86XK_OfficeHome:              0x1008FF6A,
-    XF86XK_Open:                    0x1008FF6B,
-    XF86XK_Option:                  0x1008FF6C,
-    XF86XK_Paste:                   0x1008FF6D,
-    XF86XK_Phone:                   0x1008FF6E,
-    XF86XK_Q:                       0x1008FF70,
-    XF86XK_Reply:                   0x1008FF72,
-    XF86XK_Reload:                  0x1008FF73,
-    XF86XK_RotateWindows:           0x1008FF74,
-    XF86XK_RotationPB:              0x1008FF75,
-    XF86XK_RotationKB:              0x1008FF76,
-    XF86XK_Save:                    0x1008FF77,
-    XF86XK_ScrollUp:                0x1008FF78,
-    XF86XK_ScrollDown:              0x1008FF79,
-    XF86XK_ScrollClick:             0x1008FF7A,
-    XF86XK_Send:                    0x1008FF7B,
-    XF86XK_Spell:                   0x1008FF7C,
-    XF86XK_SplitScreen:             0x1008FF7D,
-    XF86XK_Support:                 0x1008FF7E,
-    XF86XK_TaskPane:                0x1008FF7F,
-    XF86XK_Terminal:                0x1008FF80,
-    XF86XK_Tools:                   0x1008FF81,
-    XF86XK_Travel:                  0x1008FF82,
-    XF86XK_UserPB:                  0x1008FF84,
-    XF86XK_User1KB:                 0x1008FF85,
-    XF86XK_User2KB:                 0x1008FF86,
-    XF86XK_Video:                   0x1008FF87,
-    XF86XK_WheelButton:             0x1008FF88,
-    XF86XK_Word:                    0x1008FF89,
-    XF86XK_Xfer:                    0x1008FF8A,
-    XF86XK_ZoomIn:                  0x1008FF8B,
-    XF86XK_ZoomOut:                 0x1008FF8C,
-    XF86XK_Away:                    0x1008FF8D,
-    XF86XK_Messenger:               0x1008FF8E,
-    XF86XK_WebCam:                  0x1008FF8F,
-    XF86XK_MailForward:             0x1008FF90,
-    XF86XK_Pictures:                0x1008FF91,
-    XF86XK_Music:                   0x1008FF92,
-    XF86XK_Battery:                 0x1008FF93,
-    XF86XK_Bluetooth:               0x1008FF94,
-    XF86XK_WLAN:                    0x1008FF95,
-    XF86XK_UWB:                     0x1008FF96,
-    XF86XK_AudioForward:            0x1008FF97,
-    XF86XK_AudioRepeat:             0x1008FF98,
-    XF86XK_AudioRandomPlay:         0x1008FF99,
-    XF86XK_Subtitle:                0x1008FF9A,
-    XF86XK_AudioCycleTrack:         0x1008FF9B,
-    XF86XK_CycleAngle:              0x1008FF9C,
-    XF86XK_FrameBack:               0x1008FF9D,
-    XF86XK_FrameForward:            0x1008FF9E,
-    XF86XK_Time:                    0x1008FF9F,
-    XF86XK_Select:                  0x1008FFA0,
-    XF86XK_View:                    0x1008FFA1,
-    XF86XK_TopMenu:                 0x1008FFA2,
-    XF86XK_Red:                     0x1008FFA3,
-    XF86XK_Green:                   0x1008FFA4,
-    XF86XK_Yellow:                  0x1008FFA5,
-    XF86XK_Blue:                    0x1008FFA6,
-    XF86XK_Suspend:                 0x1008FFA7,
-    XF86XK_Hibernate:               0x1008FFA8,
-    XF86XK_TouchpadToggle:          0x1008FFA9,
-    XF86XK_TouchpadOn:              0x1008FFB0,
-    XF86XK_TouchpadOff:             0x1008FFB1,
-    XF86XK_AudioMicMute:            0x1008FFB2,
-    XF86XK_Switch_VT_1:             0x1008FE01,
-    XF86XK_Switch_VT_2:             0x1008FE02,
-    XF86XK_Switch_VT_3:             0x1008FE03,
-    XF86XK_Switch_VT_4:             0x1008FE04,
-    XF86XK_Switch_VT_5:             0x1008FE05,
-    XF86XK_Switch_VT_6:             0x1008FE06,
-    XF86XK_Switch_VT_7:             0x1008FE07,
-    XF86XK_Switch_VT_8:             0x1008FE08,
-    XF86XK_Switch_VT_9:             0x1008FE09,
-    XF86XK_Switch_VT_10:            0x1008FE0A,
-    XF86XK_Switch_VT_11:            0x1008FE0B,
-    XF86XK_Switch_VT_12:            0x1008FE0C,
-    XF86XK_Ungrab:                  0x1008FE20,
-    XF86XK_ClearGrab:               0x1008FE21,
-    XF86XK_Next_VMode:              0x1008FE22,
-    XF86XK_Prev_VMode:              0x1008FE23,
-    XF86XK_LogWindowTree:           0x1008FE24,
-    XF86XK_LogGrabInfo:             0x1008FE25,
-};

+ 0 - 688
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/keysymdef.js

@@ -1,688 +0,0 @@
-/*
- * Mapping from Unicode codepoints to X11/RFB keysyms
- *
- * This file was automatically generated from keysymdef.h
- * DO NOT EDIT!
- */
-
-/* Functions at the bottom */
-
-var codepoints = {
-    0x0100: 0x03c0, // XK_Amacron
-    0x0101: 0x03e0, // XK_amacron
-    0x0102: 0x01c3, // XK_Abreve
-    0x0103: 0x01e3, // XK_abreve
-    0x0104: 0x01a1, // XK_Aogonek
-    0x0105: 0x01b1, // XK_aogonek
-    0x0106: 0x01c6, // XK_Cacute
-    0x0107: 0x01e6, // XK_cacute
-    0x0108: 0x02c6, // XK_Ccircumflex
-    0x0109: 0x02e6, // XK_ccircumflex
-    0x010a: 0x02c5, // XK_Cabovedot
-    0x010b: 0x02e5, // XK_cabovedot
-    0x010c: 0x01c8, // XK_Ccaron
-    0x010d: 0x01e8, // XK_ccaron
-    0x010e: 0x01cf, // XK_Dcaron
-    0x010f: 0x01ef, // XK_dcaron
-    0x0110: 0x01d0, // XK_Dstroke
-    0x0111: 0x01f0, // XK_dstroke
-    0x0112: 0x03aa, // XK_Emacron
-    0x0113: 0x03ba, // XK_emacron
-    0x0116: 0x03cc, // XK_Eabovedot
-    0x0117: 0x03ec, // XK_eabovedot
-    0x0118: 0x01ca, // XK_Eogonek
-    0x0119: 0x01ea, // XK_eogonek
-    0x011a: 0x01cc, // XK_Ecaron
-    0x011b: 0x01ec, // XK_ecaron
-    0x011c: 0x02d8, // XK_Gcircumflex
-    0x011d: 0x02f8, // XK_gcircumflex
-    0x011e: 0x02ab, // XK_Gbreve
-    0x011f: 0x02bb, // XK_gbreve
-    0x0120: 0x02d5, // XK_Gabovedot
-    0x0121: 0x02f5, // XK_gabovedot
-    0x0122: 0x03ab, // XK_Gcedilla
-    0x0123: 0x03bb, // XK_gcedilla
-    0x0124: 0x02a6, // XK_Hcircumflex
-    0x0125: 0x02b6, // XK_hcircumflex
-    0x0126: 0x02a1, // XK_Hstroke
-    0x0127: 0x02b1, // XK_hstroke
-    0x0128: 0x03a5, // XK_Itilde
-    0x0129: 0x03b5, // XK_itilde
-    0x012a: 0x03cf, // XK_Imacron
-    0x012b: 0x03ef, // XK_imacron
-    0x012e: 0x03c7, // XK_Iogonek
-    0x012f: 0x03e7, // XK_iogonek
-    0x0130: 0x02a9, // XK_Iabovedot
-    0x0131: 0x02b9, // XK_idotless
-    0x0134: 0x02ac, // XK_Jcircumflex
-    0x0135: 0x02bc, // XK_jcircumflex
-    0x0136: 0x03d3, // XK_Kcedilla
-    0x0137: 0x03f3, // XK_kcedilla
-    0x0138: 0x03a2, // XK_kra
-    0x0139: 0x01c5, // XK_Lacute
-    0x013a: 0x01e5, // XK_lacute
-    0x013b: 0x03a6, // XK_Lcedilla
-    0x013c: 0x03b6, // XK_lcedilla
-    0x013d: 0x01a5, // XK_Lcaron
-    0x013e: 0x01b5, // XK_lcaron
-    0x0141: 0x01a3, // XK_Lstroke
-    0x0142: 0x01b3, // XK_lstroke
-    0x0143: 0x01d1, // XK_Nacute
-    0x0144: 0x01f1, // XK_nacute
-    0x0145: 0x03d1, // XK_Ncedilla
-    0x0146: 0x03f1, // XK_ncedilla
-    0x0147: 0x01d2, // XK_Ncaron
-    0x0148: 0x01f2, // XK_ncaron
-    0x014a: 0x03bd, // XK_ENG
-    0x014b: 0x03bf, // XK_eng
-    0x014c: 0x03d2, // XK_Omacron
-    0x014d: 0x03f2, // XK_omacron
-    0x0150: 0x01d5, // XK_Odoubleacute
-    0x0151: 0x01f5, // XK_odoubleacute
-    0x0152: 0x13bc, // XK_OE
-    0x0153: 0x13bd, // XK_oe
-    0x0154: 0x01c0, // XK_Racute
-    0x0155: 0x01e0, // XK_racute
-    0x0156: 0x03a3, // XK_Rcedilla
-    0x0157: 0x03b3, // XK_rcedilla
-    0x0158: 0x01d8, // XK_Rcaron
-    0x0159: 0x01f8, // XK_rcaron
-    0x015a: 0x01a6, // XK_Sacute
-    0x015b: 0x01b6, // XK_sacute
-    0x015c: 0x02de, // XK_Scircumflex
-    0x015d: 0x02fe, // XK_scircumflex
-    0x015e: 0x01aa, // XK_Scedilla
-    0x015f: 0x01ba, // XK_scedilla
-    0x0160: 0x01a9, // XK_Scaron
-    0x0161: 0x01b9, // XK_scaron
-    0x0162: 0x01de, // XK_Tcedilla
-    0x0163: 0x01fe, // XK_tcedilla
-    0x0164: 0x01ab, // XK_Tcaron
-    0x0165: 0x01bb, // XK_tcaron
-    0x0166: 0x03ac, // XK_Tslash
-    0x0167: 0x03bc, // XK_tslash
-    0x0168: 0x03dd, // XK_Utilde
-    0x0169: 0x03fd, // XK_utilde
-    0x016a: 0x03de, // XK_Umacron
-    0x016b: 0x03fe, // XK_umacron
-    0x016c: 0x02dd, // XK_Ubreve
-    0x016d: 0x02fd, // XK_ubreve
-    0x016e: 0x01d9, // XK_Uring
-    0x016f: 0x01f9, // XK_uring
-    0x0170: 0x01db, // XK_Udoubleacute
-    0x0171: 0x01fb, // XK_udoubleacute
-    0x0172: 0x03d9, // XK_Uogonek
-    0x0173: 0x03f9, // XK_uogonek
-    0x0178: 0x13be, // XK_Ydiaeresis
-    0x0179: 0x01ac, // XK_Zacute
-    0x017a: 0x01bc, // XK_zacute
-    0x017b: 0x01af, // XK_Zabovedot
-    0x017c: 0x01bf, // XK_zabovedot
-    0x017d: 0x01ae, // XK_Zcaron
-    0x017e: 0x01be, // XK_zcaron
-    0x0192: 0x08f6, // XK_function
-    0x01d2: 0x10001d1, // XK_Ocaron
-    0x02c7: 0x01b7, // XK_caron
-    0x02d8: 0x01a2, // XK_breve
-    0x02d9: 0x01ff, // XK_abovedot
-    0x02db: 0x01b2, // XK_ogonek
-    0x02dd: 0x01bd, // XK_doubleacute
-    0x0385: 0x07ae, // XK_Greek_accentdieresis
-    0x0386: 0x07a1, // XK_Greek_ALPHAaccent
-    0x0388: 0x07a2, // XK_Greek_EPSILONaccent
-    0x0389: 0x07a3, // XK_Greek_ETAaccent
-    0x038a: 0x07a4, // XK_Greek_IOTAaccent
-    0x038c: 0x07a7, // XK_Greek_OMICRONaccent
-    0x038e: 0x07a8, // XK_Greek_UPSILONaccent
-    0x038f: 0x07ab, // XK_Greek_OMEGAaccent
-    0x0390: 0x07b6, // XK_Greek_iotaaccentdieresis
-    0x0391: 0x07c1, // XK_Greek_ALPHA
-    0x0392: 0x07c2, // XK_Greek_BETA
-    0x0393: 0x07c3, // XK_Greek_GAMMA
-    0x0394: 0x07c4, // XK_Greek_DELTA
-    0x0395: 0x07c5, // XK_Greek_EPSILON
-    0x0396: 0x07c6, // XK_Greek_ZETA
-    0x0397: 0x07c7, // XK_Greek_ETA
-    0x0398: 0x07c8, // XK_Greek_THETA
-    0x0399: 0x07c9, // XK_Greek_IOTA
-    0x039a: 0x07ca, // XK_Greek_KAPPA
-    0x039b: 0x07cb, // XK_Greek_LAMDA
-    0x039c: 0x07cc, // XK_Greek_MU
-    0x039d: 0x07cd, // XK_Greek_NU
-    0x039e: 0x07ce, // XK_Greek_XI
-    0x039f: 0x07cf, // XK_Greek_OMICRON
-    0x03a0: 0x07d0, // XK_Greek_PI
-    0x03a1: 0x07d1, // XK_Greek_RHO
-    0x03a3: 0x07d2, // XK_Greek_SIGMA
-    0x03a4: 0x07d4, // XK_Greek_TAU
-    0x03a5: 0x07d5, // XK_Greek_UPSILON
-    0x03a6: 0x07d6, // XK_Greek_PHI
-    0x03a7: 0x07d7, // XK_Greek_CHI
-    0x03a8: 0x07d8, // XK_Greek_PSI
-    0x03a9: 0x07d9, // XK_Greek_OMEGA
-    0x03aa: 0x07a5, // XK_Greek_IOTAdieresis
-    0x03ab: 0x07a9, // XK_Greek_UPSILONdieresis
-    0x03ac: 0x07b1, // XK_Greek_alphaaccent
-    0x03ad: 0x07b2, // XK_Greek_epsilonaccent
-    0x03ae: 0x07b3, // XK_Greek_etaaccent
-    0x03af: 0x07b4, // XK_Greek_iotaaccent
-    0x03b0: 0x07ba, // XK_Greek_upsilonaccentdieresis
-    0x03b1: 0x07e1, // XK_Greek_alpha
-    0x03b2: 0x07e2, // XK_Greek_beta
-    0x03b3: 0x07e3, // XK_Greek_gamma
-    0x03b4: 0x07e4, // XK_Greek_delta
-    0x03b5: 0x07e5, // XK_Greek_epsilon
-    0x03b6: 0x07e6, // XK_Greek_zeta
-    0x03b7: 0x07e7, // XK_Greek_eta
-    0x03b8: 0x07e8, // XK_Greek_theta
-    0x03b9: 0x07e9, // XK_Greek_iota
-    0x03ba: 0x07ea, // XK_Greek_kappa
-    0x03bb: 0x07eb, // XK_Greek_lamda
-    0x03bc: 0x07ec, // XK_Greek_mu
-    0x03bd: 0x07ed, // XK_Greek_nu
-    0x03be: 0x07ee, // XK_Greek_xi
-    0x03bf: 0x07ef, // XK_Greek_omicron
-    0x03c0: 0x07f0, // XK_Greek_pi
-    0x03c1: 0x07f1, // XK_Greek_rho
-    0x03c2: 0x07f3, // XK_Greek_finalsmallsigma
-    0x03c3: 0x07f2, // XK_Greek_sigma
-    0x03c4: 0x07f4, // XK_Greek_tau
-    0x03c5: 0x07f5, // XK_Greek_upsilon
-    0x03c6: 0x07f6, // XK_Greek_phi
-    0x03c7: 0x07f7, // XK_Greek_chi
-    0x03c8: 0x07f8, // XK_Greek_psi
-    0x03c9: 0x07f9, // XK_Greek_omega
-    0x03ca: 0x07b5, // XK_Greek_iotadieresis
-    0x03cb: 0x07b9, // XK_Greek_upsilondieresis
-    0x03cc: 0x07b7, // XK_Greek_omicronaccent
-    0x03cd: 0x07b8, // XK_Greek_upsilonaccent
-    0x03ce: 0x07bb, // XK_Greek_omegaaccent
-    0x0401: 0x06b3, // XK_Cyrillic_IO
-    0x0402: 0x06b1, // XK_Serbian_DJE
-    0x0403: 0x06b2, // XK_Macedonia_GJE
-    0x0404: 0x06b4, // XK_Ukrainian_IE
-    0x0405: 0x06b5, // XK_Macedonia_DSE
-    0x0406: 0x06b6, // XK_Ukrainian_I
-    0x0407: 0x06b7, // XK_Ukrainian_YI
-    0x0408: 0x06b8, // XK_Cyrillic_JE
-    0x0409: 0x06b9, // XK_Cyrillic_LJE
-    0x040a: 0x06ba, // XK_Cyrillic_NJE
-    0x040b: 0x06bb, // XK_Serbian_TSHE
-    0x040c: 0x06bc, // XK_Macedonia_KJE
-    0x040e: 0x06be, // XK_Byelorussian_SHORTU
-    0x040f: 0x06bf, // XK_Cyrillic_DZHE
-    0x0410: 0x06e1, // XK_Cyrillic_A
-    0x0411: 0x06e2, // XK_Cyrillic_BE
-    0x0412: 0x06f7, // XK_Cyrillic_VE
-    0x0413: 0x06e7, // XK_Cyrillic_GHE
-    0x0414: 0x06e4, // XK_Cyrillic_DE
-    0x0415: 0x06e5, // XK_Cyrillic_IE
-    0x0416: 0x06f6, // XK_Cyrillic_ZHE
-    0x0417: 0x06fa, // XK_Cyrillic_ZE
-    0x0418: 0x06e9, // XK_Cyrillic_I
-    0x0419: 0x06ea, // XK_Cyrillic_SHORTI
-    0x041a: 0x06eb, // XK_Cyrillic_KA
-    0x041b: 0x06ec, // XK_Cyrillic_EL
-    0x041c: 0x06ed, // XK_Cyrillic_EM
-    0x041d: 0x06ee, // XK_Cyrillic_EN
-    0x041e: 0x06ef, // XK_Cyrillic_O
-    0x041f: 0x06f0, // XK_Cyrillic_PE
-    0x0420: 0x06f2, // XK_Cyrillic_ER
-    0x0421: 0x06f3, // XK_Cyrillic_ES
-    0x0422: 0x06f4, // XK_Cyrillic_TE
-    0x0423: 0x06f5, // XK_Cyrillic_U
-    0x0424: 0x06e6, // XK_Cyrillic_EF
-    0x0425: 0x06e8, // XK_Cyrillic_HA
-    0x0426: 0x06e3, // XK_Cyrillic_TSE
-    0x0427: 0x06fe, // XK_Cyrillic_CHE
-    0x0428: 0x06fb, // XK_Cyrillic_SHA
-    0x0429: 0x06fd, // XK_Cyrillic_SHCHA
-    0x042a: 0x06ff, // XK_Cyrillic_HARDSIGN
-    0x042b: 0x06f9, // XK_Cyrillic_YERU
-    0x042c: 0x06f8, // XK_Cyrillic_SOFTSIGN
-    0x042d: 0x06fc, // XK_Cyrillic_E
-    0x042e: 0x06e0, // XK_Cyrillic_YU
-    0x042f: 0x06f1, // XK_Cyrillic_YA
-    0x0430: 0x06c1, // XK_Cyrillic_a
-    0x0431: 0x06c2, // XK_Cyrillic_be
-    0x0432: 0x06d7, // XK_Cyrillic_ve
-    0x0433: 0x06c7, // XK_Cyrillic_ghe
-    0x0434: 0x06c4, // XK_Cyrillic_de
-    0x0435: 0x06c5, // XK_Cyrillic_ie
-    0x0436: 0x06d6, // XK_Cyrillic_zhe
-    0x0437: 0x06da, // XK_Cyrillic_ze
-    0x0438: 0x06c9, // XK_Cyrillic_i
-    0x0439: 0x06ca, // XK_Cyrillic_shorti
-    0x043a: 0x06cb, // XK_Cyrillic_ka
-    0x043b: 0x06cc, // XK_Cyrillic_el
-    0x043c: 0x06cd, // XK_Cyrillic_em
-    0x043d: 0x06ce, // XK_Cyrillic_en
-    0x043e: 0x06cf, // XK_Cyrillic_o
-    0x043f: 0x06d0, // XK_Cyrillic_pe
-    0x0440: 0x06d2, // XK_Cyrillic_er
-    0x0441: 0x06d3, // XK_Cyrillic_es
-    0x0442: 0x06d4, // XK_Cyrillic_te
-    0x0443: 0x06d5, // XK_Cyrillic_u
-    0x0444: 0x06c6, // XK_Cyrillic_ef
-    0x0445: 0x06c8, // XK_Cyrillic_ha
-    0x0446: 0x06c3, // XK_Cyrillic_tse
-    0x0447: 0x06de, // XK_Cyrillic_che
-    0x0448: 0x06db, // XK_Cyrillic_sha
-    0x0449: 0x06dd, // XK_Cyrillic_shcha
-    0x044a: 0x06df, // XK_Cyrillic_hardsign
-    0x044b: 0x06d9, // XK_Cyrillic_yeru
-    0x044c: 0x06d8, // XK_Cyrillic_softsign
-    0x044d: 0x06dc, // XK_Cyrillic_e
-    0x044e: 0x06c0, // XK_Cyrillic_yu
-    0x044f: 0x06d1, // XK_Cyrillic_ya
-    0x0451: 0x06a3, // XK_Cyrillic_io
-    0x0452: 0x06a1, // XK_Serbian_dje
-    0x0453: 0x06a2, // XK_Macedonia_gje
-    0x0454: 0x06a4, // XK_Ukrainian_ie
-    0x0455: 0x06a5, // XK_Macedonia_dse
-    0x0456: 0x06a6, // XK_Ukrainian_i
-    0x0457: 0x06a7, // XK_Ukrainian_yi
-    0x0458: 0x06a8, // XK_Cyrillic_je
-    0x0459: 0x06a9, // XK_Cyrillic_lje
-    0x045a: 0x06aa, // XK_Cyrillic_nje
-    0x045b: 0x06ab, // XK_Serbian_tshe
-    0x045c: 0x06ac, // XK_Macedonia_kje
-    0x045e: 0x06ae, // XK_Byelorussian_shortu
-    0x045f: 0x06af, // XK_Cyrillic_dzhe
-    0x0490: 0x06bd, // XK_Ukrainian_GHE_WITH_UPTURN
-    0x0491: 0x06ad, // XK_Ukrainian_ghe_with_upturn
-    0x05d0: 0x0ce0, // XK_hebrew_aleph
-    0x05d1: 0x0ce1, // XK_hebrew_bet
-    0x05d2: 0x0ce2, // XK_hebrew_gimel
-    0x05d3: 0x0ce3, // XK_hebrew_dalet
-    0x05d4: 0x0ce4, // XK_hebrew_he
-    0x05d5: 0x0ce5, // XK_hebrew_waw
-    0x05d6: 0x0ce6, // XK_hebrew_zain
-    0x05d7: 0x0ce7, // XK_hebrew_chet
-    0x05d8: 0x0ce8, // XK_hebrew_tet
-    0x05d9: 0x0ce9, // XK_hebrew_yod
-    0x05da: 0x0cea, // XK_hebrew_finalkaph
-    0x05db: 0x0ceb, // XK_hebrew_kaph
-    0x05dc: 0x0cec, // XK_hebrew_lamed
-    0x05dd: 0x0ced, // XK_hebrew_finalmem
-    0x05de: 0x0cee, // XK_hebrew_mem
-    0x05df: 0x0cef, // XK_hebrew_finalnun
-    0x05e0: 0x0cf0, // XK_hebrew_nun
-    0x05e1: 0x0cf1, // XK_hebrew_samech
-    0x05e2: 0x0cf2, // XK_hebrew_ayin
-    0x05e3: 0x0cf3, // XK_hebrew_finalpe
-    0x05e4: 0x0cf4, // XK_hebrew_pe
-    0x05e5: 0x0cf5, // XK_hebrew_finalzade
-    0x05e6: 0x0cf6, // XK_hebrew_zade
-    0x05e7: 0x0cf7, // XK_hebrew_qoph
-    0x05e8: 0x0cf8, // XK_hebrew_resh
-    0x05e9: 0x0cf9, // XK_hebrew_shin
-    0x05ea: 0x0cfa, // XK_hebrew_taw
-    0x060c: 0x05ac, // XK_Arabic_comma
-    0x061b: 0x05bb, // XK_Arabic_semicolon
-    0x061f: 0x05bf, // XK_Arabic_question_mark
-    0x0621: 0x05c1, // XK_Arabic_hamza
-    0x0622: 0x05c2, // XK_Arabic_maddaonalef
-    0x0623: 0x05c3, // XK_Arabic_hamzaonalef
-    0x0624: 0x05c4, // XK_Arabic_hamzaonwaw
-    0x0625: 0x05c5, // XK_Arabic_hamzaunderalef
-    0x0626: 0x05c6, // XK_Arabic_hamzaonyeh
-    0x0627: 0x05c7, // XK_Arabic_alef
-    0x0628: 0x05c8, // XK_Arabic_beh
-    0x0629: 0x05c9, // XK_Arabic_tehmarbuta
-    0x062a: 0x05ca, // XK_Arabic_teh
-    0x062b: 0x05cb, // XK_Arabic_theh
-    0x062c: 0x05cc, // XK_Arabic_jeem
-    0x062d: 0x05cd, // XK_Arabic_hah
-    0x062e: 0x05ce, // XK_Arabic_khah
-    0x062f: 0x05cf, // XK_Arabic_dal
-    0x0630: 0x05d0, // XK_Arabic_thal
-    0x0631: 0x05d1, // XK_Arabic_ra
-    0x0632: 0x05d2, // XK_Arabic_zain
-    0x0633: 0x05d3, // XK_Arabic_seen
-    0x0634: 0x05d4, // XK_Arabic_sheen
-    0x0635: 0x05d5, // XK_Arabic_sad
-    0x0636: 0x05d6, // XK_Arabic_dad
-    0x0637: 0x05d7, // XK_Arabic_tah
-    0x0638: 0x05d8, // XK_Arabic_zah
-    0x0639: 0x05d9, // XK_Arabic_ain
-    0x063a: 0x05da, // XK_Arabic_ghain
-    0x0640: 0x05e0, // XK_Arabic_tatweel
-    0x0641: 0x05e1, // XK_Arabic_feh
-    0x0642: 0x05e2, // XK_Arabic_qaf
-    0x0643: 0x05e3, // XK_Arabic_kaf
-    0x0644: 0x05e4, // XK_Arabic_lam
-    0x0645: 0x05e5, // XK_Arabic_meem
-    0x0646: 0x05e6, // XK_Arabic_noon
-    0x0647: 0x05e7, // XK_Arabic_ha
-    0x0648: 0x05e8, // XK_Arabic_waw
-    0x0649: 0x05e9, // XK_Arabic_alefmaksura
-    0x064a: 0x05ea, // XK_Arabic_yeh
-    0x064b: 0x05eb, // XK_Arabic_fathatan
-    0x064c: 0x05ec, // XK_Arabic_dammatan
-    0x064d: 0x05ed, // XK_Arabic_kasratan
-    0x064e: 0x05ee, // XK_Arabic_fatha
-    0x064f: 0x05ef, // XK_Arabic_damma
-    0x0650: 0x05f0, // XK_Arabic_kasra
-    0x0651: 0x05f1, // XK_Arabic_shadda
-    0x0652: 0x05f2, // XK_Arabic_sukun
-    0x0e01: 0x0da1, // XK_Thai_kokai
-    0x0e02: 0x0da2, // XK_Thai_khokhai
-    0x0e03: 0x0da3, // XK_Thai_khokhuat
-    0x0e04: 0x0da4, // XK_Thai_khokhwai
-    0x0e05: 0x0da5, // XK_Thai_khokhon
-    0x0e06: 0x0da6, // XK_Thai_khorakhang
-    0x0e07: 0x0da7, // XK_Thai_ngongu
-    0x0e08: 0x0da8, // XK_Thai_chochan
-    0x0e09: 0x0da9, // XK_Thai_choching
-    0x0e0a: 0x0daa, // XK_Thai_chochang
-    0x0e0b: 0x0dab, // XK_Thai_soso
-    0x0e0c: 0x0dac, // XK_Thai_chochoe
-    0x0e0d: 0x0dad, // XK_Thai_yoying
-    0x0e0e: 0x0dae, // XK_Thai_dochada
-    0x0e0f: 0x0daf, // XK_Thai_topatak
-    0x0e10: 0x0db0, // XK_Thai_thothan
-    0x0e11: 0x0db1, // XK_Thai_thonangmontho
-    0x0e12: 0x0db2, // XK_Thai_thophuthao
-    0x0e13: 0x0db3, // XK_Thai_nonen
-    0x0e14: 0x0db4, // XK_Thai_dodek
-    0x0e15: 0x0db5, // XK_Thai_totao
-    0x0e16: 0x0db6, // XK_Thai_thothung
-    0x0e17: 0x0db7, // XK_Thai_thothahan
-    0x0e18: 0x0db8, // XK_Thai_thothong
-    0x0e19: 0x0db9, // XK_Thai_nonu
-    0x0e1a: 0x0dba, // XK_Thai_bobaimai
-    0x0e1b: 0x0dbb, // XK_Thai_popla
-    0x0e1c: 0x0dbc, // XK_Thai_phophung
-    0x0e1d: 0x0dbd, // XK_Thai_fofa
-    0x0e1e: 0x0dbe, // XK_Thai_phophan
-    0x0e1f: 0x0dbf, // XK_Thai_fofan
-    0x0e20: 0x0dc0, // XK_Thai_phosamphao
-    0x0e21: 0x0dc1, // XK_Thai_moma
-    0x0e22: 0x0dc2, // XK_Thai_yoyak
-    0x0e23: 0x0dc3, // XK_Thai_rorua
-    0x0e24: 0x0dc4, // XK_Thai_ru
-    0x0e25: 0x0dc5, // XK_Thai_loling
-    0x0e26: 0x0dc6, // XK_Thai_lu
-    0x0e27: 0x0dc7, // XK_Thai_wowaen
-    0x0e28: 0x0dc8, // XK_Thai_sosala
-    0x0e29: 0x0dc9, // XK_Thai_sorusi
-    0x0e2a: 0x0dca, // XK_Thai_sosua
-    0x0e2b: 0x0dcb, // XK_Thai_hohip
-    0x0e2c: 0x0dcc, // XK_Thai_lochula
-    0x0e2d: 0x0dcd, // XK_Thai_oang
-    0x0e2e: 0x0dce, // XK_Thai_honokhuk
-    0x0e2f: 0x0dcf, // XK_Thai_paiyannoi
-    0x0e30: 0x0dd0, // XK_Thai_saraa
-    0x0e31: 0x0dd1, // XK_Thai_maihanakat
-    0x0e32: 0x0dd2, // XK_Thai_saraaa
-    0x0e33: 0x0dd3, // XK_Thai_saraam
-    0x0e34: 0x0dd4, // XK_Thai_sarai
-    0x0e35: 0x0dd5, // XK_Thai_saraii
-    0x0e36: 0x0dd6, // XK_Thai_saraue
-    0x0e37: 0x0dd7, // XK_Thai_sarauee
-    0x0e38: 0x0dd8, // XK_Thai_sarau
-    0x0e39: 0x0dd9, // XK_Thai_sarauu
-    0x0e3a: 0x0dda, // XK_Thai_phinthu
-    0x0e3f: 0x0ddf, // XK_Thai_baht
-    0x0e40: 0x0de0, // XK_Thai_sarae
-    0x0e41: 0x0de1, // XK_Thai_saraae
-    0x0e42: 0x0de2, // XK_Thai_sarao
-    0x0e43: 0x0de3, // XK_Thai_saraaimaimuan
-    0x0e44: 0x0de4, // XK_Thai_saraaimaimalai
-    0x0e45: 0x0de5, // XK_Thai_lakkhangyao
-    0x0e46: 0x0de6, // XK_Thai_maiyamok
-    0x0e47: 0x0de7, // XK_Thai_maitaikhu
-    0x0e48: 0x0de8, // XK_Thai_maiek
-    0x0e49: 0x0de9, // XK_Thai_maitho
-    0x0e4a: 0x0dea, // XK_Thai_maitri
-    0x0e4b: 0x0deb, // XK_Thai_maichattawa
-    0x0e4c: 0x0dec, // XK_Thai_thanthakhat
-    0x0e4d: 0x0ded, // XK_Thai_nikhahit
-    0x0e50: 0x0df0, // XK_Thai_leksun
-    0x0e51: 0x0df1, // XK_Thai_leknung
-    0x0e52: 0x0df2, // XK_Thai_leksong
-    0x0e53: 0x0df3, // XK_Thai_leksam
-    0x0e54: 0x0df4, // XK_Thai_leksi
-    0x0e55: 0x0df5, // XK_Thai_lekha
-    0x0e56: 0x0df6, // XK_Thai_lekhok
-    0x0e57: 0x0df7, // XK_Thai_lekchet
-    0x0e58: 0x0df8, // XK_Thai_lekpaet
-    0x0e59: 0x0df9, // XK_Thai_lekkao
-    0x2002: 0x0aa2, // XK_enspace
-    0x2003: 0x0aa1, // XK_emspace
-    0x2004: 0x0aa3, // XK_em3space
-    0x2005: 0x0aa4, // XK_em4space
-    0x2007: 0x0aa5, // XK_digitspace
-    0x2008: 0x0aa6, // XK_punctspace
-    0x2009: 0x0aa7, // XK_thinspace
-    0x200a: 0x0aa8, // XK_hairspace
-    0x2012: 0x0abb, // XK_figdash
-    0x2013: 0x0aaa, // XK_endash
-    0x2014: 0x0aa9, // XK_emdash
-    0x2015: 0x07af, // XK_Greek_horizbar
-    0x2017: 0x0cdf, // XK_hebrew_doublelowline
-    0x2018: 0x0ad0, // XK_leftsinglequotemark
-    0x2019: 0x0ad1, // XK_rightsinglequotemark
-    0x201a: 0x0afd, // XK_singlelowquotemark
-    0x201c: 0x0ad2, // XK_leftdoublequotemark
-    0x201d: 0x0ad3, // XK_rightdoublequotemark
-    0x201e: 0x0afe, // XK_doublelowquotemark
-    0x2020: 0x0af1, // XK_dagger
-    0x2021: 0x0af2, // XK_doubledagger
-    0x2022: 0x0ae6, // XK_enfilledcircbullet
-    0x2025: 0x0aaf, // XK_doubbaselinedot
-    0x2026: 0x0aae, // XK_ellipsis
-    0x2030: 0x0ad5, // XK_permille
-    0x2032: 0x0ad6, // XK_minutes
-    0x2033: 0x0ad7, // XK_seconds
-    0x2038: 0x0afc, // XK_caret
-    0x203e: 0x047e, // XK_overline
-    0x20a9: 0x0eff, // XK_Korean_Won
-    0x20ac: 0x20ac, // XK_EuroSign
-    0x2105: 0x0ab8, // XK_careof
-    0x2116: 0x06b0, // XK_numerosign
-    0x2117: 0x0afb, // XK_phonographcopyright
-    0x211e: 0x0ad4, // XK_prescription
-    0x2122: 0x0ac9, // XK_trademark
-    0x2153: 0x0ab0, // XK_onethird
-    0x2154: 0x0ab1, // XK_twothirds
-    0x2155: 0x0ab2, // XK_onefifth
-    0x2156: 0x0ab3, // XK_twofifths
-    0x2157: 0x0ab4, // XK_threefifths
-    0x2158: 0x0ab5, // XK_fourfifths
-    0x2159: 0x0ab6, // XK_onesixth
-    0x215a: 0x0ab7, // XK_fivesixths
-    0x215b: 0x0ac3, // XK_oneeighth
-    0x215c: 0x0ac4, // XK_threeeighths
-    0x215d: 0x0ac5, // XK_fiveeighths
-    0x215e: 0x0ac6, // XK_seveneighths
-    0x2190: 0x08fb, // XK_leftarrow
-    0x2191: 0x08fc, // XK_uparrow
-    0x2192: 0x08fd, // XK_rightarrow
-    0x2193: 0x08fe, // XK_downarrow
-    0x21d2: 0x08ce, // XK_implies
-    0x21d4: 0x08cd, // XK_ifonlyif
-    0x2202: 0x08ef, // XK_partialderivative
-    0x2207: 0x08c5, // XK_nabla
-    0x2218: 0x0bca, // XK_jot
-    0x221a: 0x08d6, // XK_radical
-    0x221d: 0x08c1, // XK_variation
-    0x221e: 0x08c2, // XK_infinity
-    0x2227: 0x08de, // XK_logicaland
-    0x2228: 0x08df, // XK_logicalor
-    0x2229: 0x08dc, // XK_intersection
-    0x222a: 0x08dd, // XK_union
-    0x222b: 0x08bf, // XK_integral
-    0x2234: 0x08c0, // XK_therefore
-    0x223c: 0x08c8, // XK_approximate
-    0x2243: 0x08c9, // XK_similarequal
-    0x2245: 0x1002248, // XK_approxeq
-    0x2260: 0x08bd, // XK_notequal
-    0x2261: 0x08cf, // XK_identical
-    0x2264: 0x08bc, // XK_lessthanequal
-    0x2265: 0x08be, // XK_greaterthanequal
-    0x2282: 0x08da, // XK_includedin
-    0x2283: 0x08db, // XK_includes
-    0x22a2: 0x0bfc, // XK_righttack
-    0x22a3: 0x0bdc, // XK_lefttack
-    0x22a4: 0x0bc2, // XK_downtack
-    0x22a5: 0x0bce, // XK_uptack
-    0x2308: 0x0bd3, // XK_upstile
-    0x230a: 0x0bc4, // XK_downstile
-    0x2315: 0x0afa, // XK_telephonerecorder
-    0x2320: 0x08a4, // XK_topintegral
-    0x2321: 0x08a5, // XK_botintegral
-    0x2395: 0x0bcc, // XK_quad
-    0x239b: 0x08ab, // XK_topleftparens
-    0x239d: 0x08ac, // XK_botleftparens
-    0x239e: 0x08ad, // XK_toprightparens
-    0x23a0: 0x08ae, // XK_botrightparens
-    0x23a1: 0x08a7, // XK_topleftsqbracket
-    0x23a3: 0x08a8, // XK_botleftsqbracket
-    0x23a4: 0x08a9, // XK_toprightsqbracket
-    0x23a6: 0x08aa, // XK_botrightsqbracket
-    0x23a8: 0x08af, // XK_leftmiddlecurlybrace
-    0x23ac: 0x08b0, // XK_rightmiddlecurlybrace
-    0x23b7: 0x08a1, // XK_leftradical
-    0x23ba: 0x09ef, // XK_horizlinescan1
-    0x23bb: 0x09f0, // XK_horizlinescan3
-    0x23bc: 0x09f2, // XK_horizlinescan7
-    0x23bd: 0x09f3, // XK_horizlinescan9
-    0x2409: 0x09e2, // XK_ht
-    0x240a: 0x09e5, // XK_lf
-    0x240b: 0x09e9, // XK_vt
-    0x240c: 0x09e3, // XK_ff
-    0x240d: 0x09e4, // XK_cr
-    0x2423: 0x0aac, // XK_signifblank
-    0x2424: 0x09e8, // XK_nl
-    0x2500: 0x08a3, // XK_horizconnector
-    0x2502: 0x08a6, // XK_vertconnector
-    0x250c: 0x08a2, // XK_topleftradical
-    0x2510: 0x09eb, // XK_uprightcorner
-    0x2514: 0x09ed, // XK_lowleftcorner
-    0x2518: 0x09ea, // XK_lowrightcorner
-    0x251c: 0x09f4, // XK_leftt
-    0x2524: 0x09f5, // XK_rightt
-    0x252c: 0x09f7, // XK_topt
-    0x2534: 0x09f6, // XK_bott
-    0x253c: 0x09ee, // XK_crossinglines
-    0x2592: 0x09e1, // XK_checkerboard
-    0x25aa: 0x0ae7, // XK_enfilledsqbullet
-    0x25ab: 0x0ae1, // XK_enopensquarebullet
-    0x25ac: 0x0adb, // XK_filledrectbullet
-    0x25ad: 0x0ae2, // XK_openrectbullet
-    0x25ae: 0x0adf, // XK_emfilledrect
-    0x25af: 0x0acf, // XK_emopenrectangle
-    0x25b2: 0x0ae8, // XK_filledtribulletup
-    0x25b3: 0x0ae3, // XK_opentribulletup
-    0x25b6: 0x0add, // XK_filledrighttribullet
-    0x25b7: 0x0acd, // XK_rightopentriangle
-    0x25bc: 0x0ae9, // XK_filledtribulletdown
-    0x25bd: 0x0ae4, // XK_opentribulletdown
-    0x25c0: 0x0adc, // XK_filledlefttribullet
-    0x25c1: 0x0acc, // XK_leftopentriangle
-    0x25c6: 0x09e0, // XK_soliddiamond
-    0x25cb: 0x0ace, // XK_emopencircle
-    0x25cf: 0x0ade, // XK_emfilledcircle
-    0x25e6: 0x0ae0, // XK_enopencircbullet
-    0x2606: 0x0ae5, // XK_openstar
-    0x260e: 0x0af9, // XK_telephone
-    0x2613: 0x0aca, // XK_signaturemark
-    0x261c: 0x0aea, // XK_leftpointer
-    0x261e: 0x0aeb, // XK_rightpointer
-    0x2640: 0x0af8, // XK_femalesymbol
-    0x2642: 0x0af7, // XK_malesymbol
-    0x2663: 0x0aec, // XK_club
-    0x2665: 0x0aee, // XK_heart
-    0x2666: 0x0aed, // XK_diamond
-    0x266d: 0x0af6, // XK_musicalflat
-    0x266f: 0x0af5, // XK_musicalsharp
-    0x2713: 0x0af3, // XK_checkmark
-    0x2717: 0x0af4, // XK_ballotcross
-    0x271d: 0x0ad9, // XK_latincross
-    0x2720: 0x0af0, // XK_maltesecross
-    0x27e8: 0x0abc, // XK_leftanglebracket
-    0x27e9: 0x0abe, // XK_rightanglebracket
-    0x3001: 0x04a4, // XK_kana_comma
-    0x3002: 0x04a1, // XK_kana_fullstop
-    0x300c: 0x04a2, // XK_kana_openingbracket
-    0x300d: 0x04a3, // XK_kana_closingbracket
-    0x309b: 0x04de, // XK_voicedsound
-    0x309c: 0x04df, // XK_semivoicedsound
-    0x30a1: 0x04a7, // XK_kana_a
-    0x30a2: 0x04b1, // XK_kana_A
-    0x30a3: 0x04a8, // XK_kana_i
-    0x30a4: 0x04b2, // XK_kana_I
-    0x30a5: 0x04a9, // XK_kana_u
-    0x30a6: 0x04b3, // XK_kana_U
-    0x30a7: 0x04aa, // XK_kana_e
-    0x30a8: 0x04b4, // XK_kana_E
-    0x30a9: 0x04ab, // XK_kana_o
-    0x30aa: 0x04b5, // XK_kana_O
-    0x30ab: 0x04b6, // XK_kana_KA
-    0x30ad: 0x04b7, // XK_kana_KI
-    0x30af: 0x04b8, // XK_kana_KU
-    0x30b1: 0x04b9, // XK_kana_KE
-    0x30b3: 0x04ba, // XK_kana_KO
-    0x30b5: 0x04bb, // XK_kana_SA
-    0x30b7: 0x04bc, // XK_kana_SHI
-    0x30b9: 0x04bd, // XK_kana_SU
-    0x30bb: 0x04be, // XK_kana_SE
-    0x30bd: 0x04bf, // XK_kana_SO
-    0x30bf: 0x04c0, // XK_kana_TA
-    0x30c1: 0x04c1, // XK_kana_CHI
-    0x30c3: 0x04af, // XK_kana_tsu
-    0x30c4: 0x04c2, // XK_kana_TSU
-    0x30c6: 0x04c3, // XK_kana_TE
-    0x30c8: 0x04c4, // XK_kana_TO
-    0x30ca: 0x04c5, // XK_kana_NA
-    0x30cb: 0x04c6, // XK_kana_NI
-    0x30cc: 0x04c7, // XK_kana_NU
-    0x30cd: 0x04c8, // XK_kana_NE
-    0x30ce: 0x04c9, // XK_kana_NO
-    0x30cf: 0x04ca, // XK_kana_HA
-    0x30d2: 0x04cb, // XK_kana_HI
-    0x30d5: 0x04cc, // XK_kana_FU
-    0x30d8: 0x04cd, // XK_kana_HE
-    0x30db: 0x04ce, // XK_kana_HO
-    0x30de: 0x04cf, // XK_kana_MA
-    0x30df: 0x04d0, // XK_kana_MI
-    0x30e0: 0x04d1, // XK_kana_MU
-    0x30e1: 0x04d2, // XK_kana_ME
-    0x30e2: 0x04d3, // XK_kana_MO
-    0x30e3: 0x04ac, // XK_kana_ya
-    0x30e4: 0x04d4, // XK_kana_YA
-    0x30e5: 0x04ad, // XK_kana_yu
-    0x30e6: 0x04d5, // XK_kana_YU
-    0x30e7: 0x04ae, // XK_kana_yo
-    0x30e8: 0x04d6, // XK_kana_YO
-    0x30e9: 0x04d7, // XK_kana_RA
-    0x30ea: 0x04d8, // XK_kana_RI
-    0x30eb: 0x04d9, // XK_kana_RU
-    0x30ec: 0x04da, // XK_kana_RE
-    0x30ed: 0x04db, // XK_kana_RO
-    0x30ef: 0x04dc, // XK_kana_WA
-    0x30f2: 0x04a6, // XK_kana_WO
-    0x30f3: 0x04dd, // XK_kana_N
-    0x30fb: 0x04a5, // XK_kana_conjunctive
-    0x30fc: 0x04b0, // XK_prolongedsound
-};
-
-export default {
-    lookup : function(u) {
-        // Latin-1 is one-to-one mapping
-        if ((u >= 0x20) && (u <= 0xff)) {
-            return u;
-        }
-
-        // Lookup table (fairly random)
-        var keysym = codepoints[u];
-        if (keysym !== undefined) {
-            return keysym;
-        }
-
-        // General mapping as final fallback
-        return 0x01000000 | u;
-    },
-};

+ 0 - 280
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/mouse.js

@@ -1,280 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Copyright (C) 2013 Samuel Mannehed for Cendio AB
- * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
- */
-
-import * as Log from '../util/logging.js';
-import { isTouchDevice } from '../util/browser.js';
-import { setCapture, stopEvent, getPointerEvent } from '../util/events.js';
-
-var WHEEL_STEP = 10; // Delta threshold for a mouse wheel step
-var WHEEL_STEP_TIMEOUT = 50; // ms
-var WHEEL_LINE_HEIGHT = 19;
-
-export default function Mouse(target) {
-    this._target = target || document;
-
-    this._doubleClickTimer = null;
-    this._lastTouchPos = null;
-
-    this._pos = null;
-    this._wheelStepXTimer = null;
-    this._wheelStepYTimer = null;
-    this._accumulatedWheelDeltaX = 0;
-    this._accumulatedWheelDeltaY = 0;
-
-    this._eventHandlers = {
-        'mousedown': this._handleMouseDown.bind(this),
-        'mouseup': this._handleMouseUp.bind(this),
-        'mousemove': this._handleMouseMove.bind(this),
-        'mousewheel': this._handleMouseWheel.bind(this),
-        'mousedisable': this._handleMouseDisable.bind(this)
-    };
-};
-
-Mouse.prototype = {
-    // ===== PROPERTIES =====
-
-    touchButton: 1,                 // Button mask (1, 2, 4) for touch devices (0 means ignore clicks)
-
-    // ===== EVENT HANDLERS =====
-
-    onmousebutton: function () {},  // Handler for mouse button click/release
-    onmousemove: function () {},    // Handler for mouse movement
-
-    // ===== PRIVATE METHODS =====
-
-    _resetDoubleClickTimer: function () {
-        this._doubleClickTimer = null;
-    },
-
-    _handleMouseButton: function (e, down) {
-        this._updateMousePosition(e);
-        var pos = this._pos;
-
-        var bmask;
-        if (e.touches || e.changedTouches) {
-            // Touch device
-
-            // When two touches occur within 500 ms of each other and are
-            // close enough together a double click is triggered.
-            if (down == 1) {
-                if (this._doubleClickTimer === null) {
-                    this._lastTouchPos = pos;
-                } else {
-                    clearTimeout(this._doubleClickTimer);
-
-                    // When the distance between the two touches is small enough
-                    // force the position of the latter touch to the position of
-                    // the first.
-
-                    var xs = this._lastTouchPos.x - pos.x;
-                    var ys = this._lastTouchPos.y - pos.y;
-                    var d = Math.sqrt((xs * xs) + (ys * ys));
-
-                    // The goal is to trigger on a certain physical width, the
-                    // devicePixelRatio brings us a bit closer but is not optimal.
-                    var threshold = 20 * (window.devicePixelRatio || 1);
-                    if (d < threshold) {
-                        pos = this._lastTouchPos;
-                    }
-                }
-                this._doubleClickTimer = setTimeout(this._resetDoubleClickTimer.bind(this), 500);
-            }
-            bmask = this.touchButton;
-            // If bmask is set
-        } else if (e.which) {
-            /* everything except IE */
-            bmask = 1 << e.button;
-        } else {
-            /* IE including 9 */
-            bmask = (e.button & 0x1) +      // Left
-                    (e.button & 0x2) * 2 +  // Right
-                    (e.button & 0x4) / 2;   // Middle
-        }
-
-        Log.Debug("onmousebutton " + (down ? "down" : "up") +
-                  ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask);
-        this.onmousebutton(pos.x, pos.y, down, bmask);
-
-        stopEvent(e);
-    },
-
-    _handleMouseDown: function (e) {
-        // Touch events have implicit capture
-        if (e.type === "mousedown") {
-            setCapture(this._target);
-        }
-
-        this._handleMouseButton(e, 1);
-    },
-
-    _handleMouseUp: function (e) {
-        this._handleMouseButton(e, 0);
-    },
-
-    // Mouse wheel events are sent in steps over VNC. This means that the VNC
-    // protocol can't handle a wheel event with specific distance or speed.
-    // Therefor, if we get a lot of small mouse wheel events we combine them.
-    _generateWheelStepX: function () {
-
-        if (this._accumulatedWheelDeltaX < 0) {
-            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 5);
-            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 5);
-        } else if (this._accumulatedWheelDeltaX > 0) {
-            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 6);
-            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 6);
-        }
-
-        this._accumulatedWheelDeltaX = 0;
-    },
-
-    _generateWheelStepY: function () {
-
-        if (this._accumulatedWheelDeltaY < 0) {
-            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 3);
-            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 3);
-        } else if (this._accumulatedWheelDeltaY > 0) {
-            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 4);
-            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 4);
-        }
-
-        this._accumulatedWheelDeltaY = 0;
-    },
-
-    _resetWheelStepTimers: function () {
-        window.clearTimeout(this._wheelStepXTimer);
-        window.clearTimeout(this._wheelStepYTimer);
-        this._wheelStepXTimer = null;
-        this._wheelStepYTimer = null;
-    },
-
-    _handleMouseWheel: function (e) {
-        this._resetWheelStepTimers();
-
-        this._updateMousePosition(e);
-
-        var dX = e.deltaX;
-        var dY = e.deltaY;
-
-        // Pixel units unless it's non-zero.
-        // Note that if deltamode is line or page won't matter since we aren't
-        // sending the mouse wheel delta to the server anyway.
-        // The difference between pixel and line can be important however since
-        // we have a threshold that can be smaller than the line height.
-        if (e.deltaMode !== 0) {
-            dX *= WHEEL_LINE_HEIGHT;
-            dY *= WHEEL_LINE_HEIGHT;
-        }
-
-        this._accumulatedWheelDeltaX += dX;
-        this._accumulatedWheelDeltaY += dY;
-
-        // Generate a mouse wheel step event when the accumulated delta
-        // for one of the axes is large enough.
-        // Small delta events that do not pass the threshold get sent
-        // after a timeout.
-        if (Math.abs(this._accumulatedWheelDeltaX) > WHEEL_STEP) {
-            this._generateWheelStepX();
-        } else {
-            this._wheelStepXTimer =
-                window.setTimeout(this._generateWheelStepX.bind(this),
-                                  WHEEL_STEP_TIMEOUT);
-        }
-        if (Math.abs(this._accumulatedWheelDeltaY) > WHEEL_STEP) {
-            this._generateWheelStepY();
-        } else {
-            this._wheelStepYTimer =
-                window.setTimeout(this._generateWheelStepY.bind(this),
-                                  WHEEL_STEP_TIMEOUT);
-        }
-
-        stopEvent(e);
-    },
-
-    _handleMouseMove: function (e) {
-        this._updateMousePosition(e);
-        this.onmousemove(this._pos.x, this._pos.y);
-        stopEvent(e);
-    },
-
-    _handleMouseDisable: function (e) {
-        /*
-         * Stop propagation if inside canvas area
-         * Note: This is only needed for the 'click' event as it fails
-         *       to fire properly for the target element so we have
-         *       to listen on the document element instead.
-         */
-        if (e.target == this._target) {
-            stopEvent(e);
-        }
-    },
-
-    // Update coordinates relative to target
-    _updateMousePosition: function(e) {
-        e = getPointerEvent(e);
-        var bounds = this._target.getBoundingClientRect();
-        var x, y;
-        // Clip to target bounds
-        if (e.clientX < bounds.left) {
-            x = 0;
-        } else if (e.clientX >= bounds.right) {
-            x = bounds.width - 1;
-        } else {
-            x = e.clientX - bounds.left;
-        }
-        if (e.clientY < bounds.top) {
-            y = 0;
-        } else if (e.clientY >= bounds.bottom) {
-            y = bounds.height - 1;
-        } else {
-            y = e.clientY - bounds.top;
-        }
-        this._pos = {x:x, y:y};
-    },
-
-    // ===== PUBLIC METHODS =====
-
-    grab: function () {
-        var c = this._target;
-
-        if (isTouchDevice) {
-            c.addEventListener('touchstart', this._eventHandlers.mousedown);
-            c.addEventListener('touchend', this._eventHandlers.mouseup);
-            c.addEventListener('touchmove', this._eventHandlers.mousemove);
-        }
-        c.addEventListener('mousedown', this._eventHandlers.mousedown);
-        c.addEventListener('mouseup', this._eventHandlers.mouseup);
-        c.addEventListener('mousemove', this._eventHandlers.mousemove);
-        c.addEventListener('wheel', this._eventHandlers.mousewheel);
-
-        /* Prevent middle-click pasting (see above for why we bind to document) */
-        document.addEventListener('click', this._eventHandlers.mousedisable);
-
-        /* preventDefault() on mousedown doesn't stop this event for some
-           reason so we have to explicitly block it */
-        c.addEventListener('contextmenu', this._eventHandlers.mousedisable);
-    },
-
-    ungrab: function () {
-        var c = this._target;
-
-        this._resetWheelStepTimers();
-
-        if (isTouchDevice) {
-            c.removeEventListener('touchstart', this._eventHandlers.mousedown);
-            c.removeEventListener('touchend', this._eventHandlers.mouseup);
-            c.removeEventListener('touchmove', this._eventHandlers.mousemove);
-        }
-        c.removeEventListener('mousedown', this._eventHandlers.mousedown);
-        c.removeEventListener('mouseup', this._eventHandlers.mouseup);
-        c.removeEventListener('mousemove', this._eventHandlers.mousemove);
-        c.removeEventListener('wheel', this._eventHandlers.mousewheel);
-
-        document.removeEventListener('click', this._eventHandlers.mousedisable);
-
-        c.removeEventListener('contextmenu', this._eventHandlers.mousedisable);
-    }
-};

+ 0 - 167
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/util.js

@@ -1,167 +0,0 @@
-import KeyTable from "./keysym.js";
-import keysyms from "./keysymdef.js";
-import vkeys from "./vkeys.js";
-import fixedkeys from "./fixedkeys.js";
-import DOMKeyTable from "./domkeytable.js";
-import * as browser from "../util/browser.js";
-
-// Get 'KeyboardEvent.code', handling legacy browsers
-export function getKeycode(evt){
-    // Are we getting proper key identifiers?
-    // (unfortunately Firefox and Chrome are crappy here and gives
-    // us an empty string on some platforms, rather than leaving it
-    // undefined)
-    if (evt.code) {
-        // Mozilla isn't fully in sync with the spec yet
-        switch (evt.code) {
-            case 'OSLeft': return 'MetaLeft';
-            case 'OSRight': return 'MetaRight';
-        }
-
-        return evt.code;
-    }
-
-    // The de-facto standard is to use Windows Virtual-Key codes
-    // in the 'keyCode' field for non-printable characters. However
-    // Webkit sets it to the same as charCode in 'keypress' events.
-    if ((evt.type !== 'keypress') && (evt.keyCode in vkeys)) {
-        var code = vkeys[evt.keyCode];
-
-        // macOS has messed up this code for some reason
-        if (browser.isMac() && (code === 'ContextMenu')) {
-            code = 'MetaRight';
-        }
-
-        // The keyCode doesn't distinguish between left and right
-        // for the standard modifiers
-        if (evt.location === 2) {
-            switch (code) {
-                case 'ShiftLeft': return 'ShiftRight';
-                case 'ControlLeft': return 'ControlRight';
-                case 'AltLeft': return 'AltRight';
-            }
-        }
-
-        // Nor a bunch of the numpad keys
-        if (evt.location === 3) {
-            switch (code) {
-                case 'Delete': return 'NumpadDecimal';
-                case 'Insert': return 'Numpad0';
-                case 'End': return 'Numpad1';
-                case 'ArrowDown': return 'Numpad2';
-                case 'PageDown': return 'Numpad3';
-                case 'ArrowLeft': return 'Numpad4';
-                case 'ArrowRight': return 'Numpad6';
-                case 'Home': return 'Numpad7';
-                case 'ArrowUp': return 'Numpad8';
-                case 'PageUp': return 'Numpad9';
-                case 'Enter': return 'NumpadEnter';
-            }
-        }
-
-        return code;
-    }
-
-    return 'Unidentified';
-}
-
-// Get 'KeyboardEvent.key', handling legacy browsers
-export function getKey(evt) {
-    // Are we getting a proper key value?
-    if (evt.key !== undefined) {
-        // IE and Edge use some ancient version of the spec
-        // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
-        switch (evt.key) {
-            case 'Spacebar': return ' ';
-            case 'Esc': return 'Escape';
-            case 'Scroll': return 'ScrollLock';
-            case 'Win': return 'Meta';
-            case 'Apps': return 'ContextMenu';
-            case 'Up': return 'ArrowUp';
-            case 'Left': return 'ArrowLeft';
-            case 'Right': return 'ArrowRight';
-            case 'Down': return 'ArrowDown';
-            case 'Del': return 'Delete';
-            case 'Divide': return '/';
-            case 'Multiply': return '*';
-            case 'Subtract': return '-';
-            case 'Add': return '+';
-            case 'Decimal': return evt.char;
-        }
-
-        // Mozilla isn't fully in sync with the spec yet
-        switch (evt.key) {
-            case 'OS': return 'Meta';
-        }
-
-        // iOS leaks some OS names
-        switch (evt.key) {
-            case 'UIKeyInputUpArrow': return 'ArrowUp';
-            case 'UIKeyInputDownArrow': return 'ArrowDown';
-            case 'UIKeyInputLeftArrow': return 'ArrowLeft';
-            case 'UIKeyInputRightArrow': return 'ArrowRight';
-            case 'UIKeyInputEscape': return 'Escape';
-        }
-
-        // IE and Edge have broken handling of AltGraph so we cannot
-        // trust them for printable characters
-        if ((evt.key.length !== 1) || (!browser.isIE() && !browser.isEdge())) {
-            return evt.key;
-        }
-    }
-
-    // Try to deduce it based on the physical key
-    var code = getKeycode(evt);
-    if (code in fixedkeys) {
-        return fixedkeys[code];
-    }
-
-    // If that failed, then see if we have a printable character
-    if (evt.charCode) {
-        return String.fromCharCode(evt.charCode);
-    }
-
-    // At this point we have nothing left to go on
-    return 'Unidentified';
-}
-
-// Get the most reliable keysym value we can get from a key event
-export function getKeysym(evt){
-    var key = getKey(evt);
-
-    if (key === 'Unidentified') {
-        return null;
-    }
-
-    // First look up special keys
-    if (key in DOMKeyTable) {
-        var location = evt.location;
-
-        // Safari screws up location for the right cmd key
-        if ((key === 'Meta') && (location === 0)) {
-            location = 2;
-        }
-
-        if ((location === undefined) || (location > 3)) {
-            location = 0;
-        }
-
-        return DOMKeyTable[key][location];
-    }
-
-    // Now we need to look at the Unicode symbol instead
-
-    var codepoint;
-
-    // Special key? (FIXME: Should have been caught earlier)
-    if (key.length !== 1) {
-        return null;
-    }
-
-    codepoint = key.charCodeAt();
-    if (codepoint) {
-        return keysyms.lookup(codepoint);
-    }
-
-    return null;
-}

+ 0 - 116
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/vkeys.js

@@ -1,116 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2017 Pierre Ossman for Cendio AB
- * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
- */
-
-/*
- * Mapping between Microsoft® Windows® Virtual-Key codes and
- * HTML key codes.
- */
-
-export default {
-    0x08: 'Backspace',
-    0x09: 'Tab',
-    0x0a: 'NumpadClear',
-    0x0d: 'Enter',
-    0x10: 'ShiftLeft',
-    0x11: 'ControlLeft',
-    0x12: 'AltLeft',
-    0x13: 'Pause',
-    0x14: 'CapsLock',
-    0x15: 'Lang1',
-    0x19: 'Lang2',
-    0x1b: 'Escape',
-    0x1c: 'Convert',
-    0x1d: 'NonConvert',
-    0x20: 'Space',
-    0x21: 'PageUp',
-    0x22: 'PageDown',
-    0x23: 'End',
-    0x24: 'Home',
-    0x25: 'ArrowLeft',
-    0x26: 'ArrowUp',
-    0x27: 'ArrowRight',
-    0x28: 'ArrowDown',
-    0x29: 'Select',
-    0x2c: 'PrintScreen',
-    0x2d: 'Insert',
-    0x2e: 'Delete',
-    0x2f: 'Help',
-    0x30: 'Digit0',
-    0x31: 'Digit1',
-    0x32: 'Digit2',
-    0x33: 'Digit3',
-    0x34: 'Digit4',
-    0x35: 'Digit5',
-    0x36: 'Digit6',
-    0x37: 'Digit7',
-    0x38: 'Digit8',
-    0x39: 'Digit9',
-    0x5b: 'MetaLeft',
-    0x5c: 'MetaRight',
-    0x5d: 'ContextMenu',
-    0x5f: 'Sleep',
-    0x60: 'Numpad0',
-    0x61: 'Numpad1',
-    0x62: 'Numpad2',
-    0x63: 'Numpad3',
-    0x64: 'Numpad4',
-    0x65: 'Numpad5',
-    0x66: 'Numpad6',
-    0x67: 'Numpad7',
-    0x68: 'Numpad8',
-    0x69: 'Numpad9',
-    0x6a: 'NumpadMultiply',
-    0x6b: 'NumpadAdd',
-    0x6c: 'NumpadDecimal',
-    0x6d: 'NumpadSubtract',
-    0x6e: 'NumpadDecimal', // Duplicate, because buggy on Windows
-    0x6f: 'NumpadDivide',
-    0x70: 'F1',
-    0x71: 'F2',
-    0x72: 'F3',
-    0x73: 'F4',
-    0x74: 'F5',
-    0x75: 'F6',
-    0x76: 'F7',
-    0x77: 'F8',
-    0x78: 'F9',
-    0x79: 'F10',
-    0x7a: 'F11',
-    0x7b: 'F12',
-    0x7c: 'F13',
-    0x7d: 'F14',
-    0x7e: 'F15',
-    0x7f: 'F16',
-    0x80: 'F17',
-    0x81: 'F18',
-    0x82: 'F19',
-    0x83: 'F20',
-    0x84: 'F21',
-    0x85: 'F22',
-    0x86: 'F23',
-    0x87: 'F24',
-    0x90: 'NumLock',
-    0x91: 'ScrollLock',
-    0xa6: 'BrowserBack',
-    0xa7: 'BrowserForward',
-    0xa8: 'BrowserRefresh',
-    0xa9: 'BrowserStop',
-    0xaa: 'BrowserSearch',
-    0xab: 'BrowserFavorites',
-    0xac: 'BrowserHome',
-    0xad: 'AudioVolumeMute',
-    0xae: 'AudioVolumeDown',
-    0xaf: 'AudioVolumeUp',
-    0xb0: 'MediaTrackNext',
-    0xb1: 'MediaTrackPrevious',
-    0xb2: 'MediaStop',
-    0xb3: 'MediaPlayPause',
-    0xb4: 'LaunchMail',
-    0xb5: 'MediaSelect',
-    0xb6: 'LaunchApp1',
-    0xb7: 'LaunchApp2',
-    0xe1: 'AltRight', // Only when it is AltGraph
-};

+ 0 - 171
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/input/xtscancodes.js

@@ -1,171 +0,0 @@
-/*
- * This file is auto-generated from keymaps.csv on 2017-05-31 16:20
- * Database checksum sha256(92fd165507f2a3b8c5b3fa56e425d45788dbcb98cf067a307527d91ce22cab94)
- * To re-generate, run:
- *   keymap-gen --lang=js code-map keymaps.csv html atset1
-*/
-export default {
-  "Again": 0xe005, /* html:Again (Again) -> linux:129 (KEY_AGAIN) -> atset1:57349 */
-  "AltLeft": 0x38, /* html:AltLeft (AltLeft) -> linux:56 (KEY_LEFTALT) -> atset1:56 */
-  "AltRight": 0xe038, /* html:AltRight (AltRight) -> linux:100 (KEY_RIGHTALT) -> atset1:57400 */
-  "ArrowDown": 0xe050, /* html:ArrowDown (ArrowDown) -> linux:108 (KEY_DOWN) -> atset1:57424 */
-  "ArrowLeft": 0xe04b, /* html:ArrowLeft (ArrowLeft) -> linux:105 (KEY_LEFT) -> atset1:57419 */
-  "ArrowRight": 0xe04d, /* html:ArrowRight (ArrowRight) -> linux:106 (KEY_RIGHT) -> atset1:57421 */
-  "ArrowUp": 0xe048, /* html:ArrowUp (ArrowUp) -> linux:103 (KEY_UP) -> atset1:57416 */
-  "AudioVolumeDown": 0xe02e, /* html:AudioVolumeDown (AudioVolumeDown) -> linux:114 (KEY_VOLUMEDOWN) -> atset1:57390 */
-  "AudioVolumeMute": 0xe020, /* html:AudioVolumeMute (AudioVolumeMute) -> linux:113 (KEY_MUTE) -> atset1:57376 */
-  "AudioVolumeUp": 0xe030, /* html:AudioVolumeUp (AudioVolumeUp) -> linux:115 (KEY_VOLUMEUP) -> atset1:57392 */
-  "Backquote": 0x29, /* html:Backquote (Backquote) -> linux:41 (KEY_GRAVE) -> atset1:41 */
-  "Backslash": 0x2b, /* html:Backslash (Backslash) -> linux:43 (KEY_BACKSLASH) -> atset1:43 */
-  "Backspace": 0xe, /* html:Backspace (Backspace) -> linux:14 (KEY_BACKSPACE) -> atset1:14 */
-  "BracketLeft": 0x1a, /* html:BracketLeft (BracketLeft) -> linux:26 (KEY_LEFTBRACE) -> atset1:26 */
-  "BracketRight": 0x1b, /* html:BracketRight (BracketRight) -> linux:27 (KEY_RIGHTBRACE) -> atset1:27 */
-  "BrowserBack": 0xe06a, /* html:BrowserBack (BrowserBack) -> linux:158 (KEY_BACK) -> atset1:57450 */
-  "BrowserFavorites": 0xe066, /* html:BrowserFavorites (BrowserFavorites) -> linux:156 (KEY_BOOKMARKS) -> atset1:57446 */
-  "BrowserForward": 0xe069, /* html:BrowserForward (BrowserForward) -> linux:159 (KEY_FORWARD) -> atset1:57449 */
-  "BrowserHome": 0xe032, /* html:BrowserHome (BrowserHome) -> linux:172 (KEY_HOMEPAGE) -> atset1:57394 */
-  "BrowserRefresh": 0xe067, /* html:BrowserRefresh (BrowserRefresh) -> linux:173 (KEY_REFRESH) -> atset1:57447 */
-  "BrowserSearch": 0xe065, /* html:BrowserSearch (BrowserSearch) -> linux:217 (KEY_SEARCH) -> atset1:57445 */
-  "BrowserStop": 0xe068, /* html:BrowserStop (BrowserStop) -> linux:128 (KEY_STOP) -> atset1:57448 */
-  "CapsLock": 0x3a, /* html:CapsLock (CapsLock) -> linux:58 (KEY_CAPSLOCK) -> atset1:58 */
-  "Comma": 0x33, /* html:Comma (Comma) -> linux:51 (KEY_COMMA) -> atset1:51 */
-  "ContextMenu": 0xe05d, /* html:ContextMenu (ContextMenu) -> linux:127 (KEY_COMPOSE) -> atset1:57437 */
-  "ControlLeft": 0x1d, /* html:ControlLeft (ControlLeft) -> linux:29 (KEY_LEFTCTRL) -> atset1:29 */
-  "ControlRight": 0xe01d, /* html:ControlRight (ControlRight) -> linux:97 (KEY_RIGHTCTRL) -> atset1:57373 */
-  "Convert": 0x79, /* html:Convert (Convert) -> linux:92 (KEY_HENKAN) -> atset1:121 */
-  "Copy": 0xe078, /* html:Copy (Copy) -> linux:133 (KEY_COPY) -> atset1:57464 */
-  "Cut": 0xe03c, /* html:Cut (Cut) -> linux:137 (KEY_CUT) -> atset1:57404 */
-  "Delete": 0xe053, /* html:Delete (Delete) -> linux:111 (KEY_DELETE) -> atset1:57427 */
-  "Digit0": 0xb, /* html:Digit0 (Digit0) -> linux:11 (KEY_0) -> atset1:11 */
-  "Digit1": 0x2, /* html:Digit1 (Digit1) -> linux:2 (KEY_1) -> atset1:2 */
-  "Digit2": 0x3, /* html:Digit2 (Digit2) -> linux:3 (KEY_2) -> atset1:3 */
-  "Digit3": 0x4, /* html:Digit3 (Digit3) -> linux:4 (KEY_3) -> atset1:4 */
-  "Digit4": 0x5, /* html:Digit4 (Digit4) -> linux:5 (KEY_4) -> atset1:5 */
-  "Digit5": 0x6, /* html:Digit5 (Digit5) -> linux:6 (KEY_5) -> atset1:6 */
-  "Digit6": 0x7, /* html:Digit6 (Digit6) -> linux:7 (KEY_6) -> atset1:7 */
-  "Digit7": 0x8, /* html:Digit7 (Digit7) -> linux:8 (KEY_7) -> atset1:8 */
-  "Digit8": 0x9, /* html:Digit8 (Digit8) -> linux:9 (KEY_8) -> atset1:9 */
-  "Digit9": 0xa, /* html:Digit9 (Digit9) -> linux:10 (KEY_9) -> atset1:10 */
-  "Eject": 0xe07d, /* html:Eject (Eject) -> linux:162 (KEY_EJECTCLOSECD) -> atset1:57469 */
-  "End": 0xe04f, /* html:End (End) -> linux:107 (KEY_END) -> atset1:57423 */
-  "Enter": 0x1c, /* html:Enter (Enter) -> linux:28 (KEY_ENTER) -> atset1:28 */
-  "Equal": 0xd, /* html:Equal (Equal) -> linux:13 (KEY_EQUAL) -> atset1:13 */
-  "Escape": 0x1, /* html:Escape (Escape) -> linux:1 (KEY_ESC) -> atset1:1 */
-  "F1": 0x3b, /* html:F1 (F1) -> linux:59 (KEY_F1) -> atset1:59 */
-  "F10": 0x44, /* html:F10 (F10) -> linux:68 (KEY_F10) -> atset1:68 */
-  "F11": 0x57, /* html:F11 (F11) -> linux:87 (KEY_F11) -> atset1:87 */
-  "F12": 0x58, /* html:F12 (F12) -> linux:88 (KEY_F12) -> atset1:88 */
-  "F13": 0x5d, /* html:F13 (F13) -> linux:183 (KEY_F13) -> atset1:93 */
-  "F14": 0x5e, /* html:F14 (F14) -> linux:184 (KEY_F14) -> atset1:94 */
-  "F15": 0x5f, /* html:F15 (F15) -> linux:185 (KEY_F15) -> atset1:95 */
-  "F16": 0x55, /* html:F16 (F16) -> linux:186 (KEY_F16) -> atset1:85 */
-  "F17": 0xe003, /* html:F17 (F17) -> linux:187 (KEY_F17) -> atset1:57347 */
-  "F18": 0xe077, /* html:F18 (F18) -> linux:188 (KEY_F18) -> atset1:57463 */
-  "F19": 0xe004, /* html:F19 (F19) -> linux:189 (KEY_F19) -> atset1:57348 */
-  "F2": 0x3c, /* html:F2 (F2) -> linux:60 (KEY_F2) -> atset1:60 */
-  "F20": 0x5a, /* html:F20 (F20) -> linux:190 (KEY_F20) -> atset1:90 */
-  "F21": 0x74, /* html:F21 (F21) -> linux:191 (KEY_F21) -> atset1:116 */
-  "F22": 0xe079, /* html:F22 (F22) -> linux:192 (KEY_F22) -> atset1:57465 */
-  "F23": 0x6d, /* html:F23 (F23) -> linux:193 (KEY_F23) -> atset1:109 */
-  "F24": 0x6f, /* html:F24 (F24) -> linux:194 (KEY_F24) -> atset1:111 */
-  "F3": 0x3d, /* html:F3 (F3) -> linux:61 (KEY_F3) -> atset1:61 */
-  "F4": 0x3e, /* html:F4 (F4) -> linux:62 (KEY_F4) -> atset1:62 */
-  "F5": 0x3f, /* html:F5 (F5) -> linux:63 (KEY_F5) -> atset1:63 */
-  "F6": 0x40, /* html:F6 (F6) -> linux:64 (KEY_F6) -> atset1:64 */
-  "F7": 0x41, /* html:F7 (F7) -> linux:65 (KEY_F7) -> atset1:65 */
-  "F8": 0x42, /* html:F8 (F8) -> linux:66 (KEY_F8) -> atset1:66 */
-  "F9": 0x43, /* html:F9 (F9) -> linux:67 (KEY_F9) -> atset1:67 */
-  "Find": 0xe041, /* html:Find (Find) -> linux:136 (KEY_FIND) -> atset1:57409 */
-  "Help": 0xe075, /* html:Help (Help) -> linux:138 (KEY_HELP) -> atset1:57461 */
-  "Hiragana": 0x77, /* html:Hiragana (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */
-  "Home": 0xe047, /* html:Home (Home) -> linux:102 (KEY_HOME) -> atset1:57415 */
-  "Insert": 0xe052, /* html:Insert (Insert) -> linux:110 (KEY_INSERT) -> atset1:57426 */
-  "IntlBackslash": 0x56, /* html:IntlBackslash (IntlBackslash) -> linux:86 (KEY_102ND) -> atset1:86 */
-  "IntlRo": 0x73, /* html:IntlRo (IntlRo) -> linux:89 (KEY_RO) -> atset1:115 */
-  "IntlYen": 0x7d, /* html:IntlYen (IntlYen) -> linux:124 (KEY_YEN) -> atset1:125 */
-  "KanaMode": 0x70, /* html:KanaMode (KanaMode) -> linux:93 (KEY_KATAKANAHIRAGANA) -> atset1:112 */
-  "Katakana": 0x78, /* html:Katakana (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */
-  "KeyA": 0x1e, /* html:KeyA (KeyA) -> linux:30 (KEY_A) -> atset1:30 */
-  "KeyB": 0x30, /* html:KeyB (KeyB) -> linux:48 (KEY_B) -> atset1:48 */
-  "KeyC": 0x2e, /* html:KeyC (KeyC) -> linux:46 (KEY_C) -> atset1:46 */
-  "KeyD": 0x20, /* html:KeyD (KeyD) -> linux:32 (KEY_D) -> atset1:32 */
-  "KeyE": 0x12, /* html:KeyE (KeyE) -> linux:18 (KEY_E) -> atset1:18 */
-  "KeyF": 0x21, /* html:KeyF (KeyF) -> linux:33 (KEY_F) -> atset1:33 */
-  "KeyG": 0x22, /* html:KeyG (KeyG) -> linux:34 (KEY_G) -> atset1:34 */
-  "KeyH": 0x23, /* html:KeyH (KeyH) -> linux:35 (KEY_H) -> atset1:35 */
-  "KeyI": 0x17, /* html:KeyI (KeyI) -> linux:23 (KEY_I) -> atset1:23 */
-  "KeyJ": 0x24, /* html:KeyJ (KeyJ) -> linux:36 (KEY_J) -> atset1:36 */
-  "KeyK": 0x25, /* html:KeyK (KeyK) -> linux:37 (KEY_K) -> atset1:37 */
-  "KeyL": 0x26, /* html:KeyL (KeyL) -> linux:38 (KEY_L) -> atset1:38 */
-  "KeyM": 0x32, /* html:KeyM (KeyM) -> linux:50 (KEY_M) -> atset1:50 */
-  "KeyN": 0x31, /* html:KeyN (KeyN) -> linux:49 (KEY_N) -> atset1:49 */
-  "KeyO": 0x18, /* html:KeyO (KeyO) -> linux:24 (KEY_O) -> atset1:24 */
-  "KeyP": 0x19, /* html:KeyP (KeyP) -> linux:25 (KEY_P) -> atset1:25 */
-  "KeyQ": 0x10, /* html:KeyQ (KeyQ) -> linux:16 (KEY_Q) -> atset1:16 */
-  "KeyR": 0x13, /* html:KeyR (KeyR) -> linux:19 (KEY_R) -> atset1:19 */
-  "KeyS": 0x1f, /* html:KeyS (KeyS) -> linux:31 (KEY_S) -> atset1:31 */
-  "KeyT": 0x14, /* html:KeyT (KeyT) -> linux:20 (KEY_T) -> atset1:20 */
-  "KeyU": 0x16, /* html:KeyU (KeyU) -> linux:22 (KEY_U) -> atset1:22 */
-  "KeyV": 0x2f, /* html:KeyV (KeyV) -> linux:47 (KEY_V) -> atset1:47 */
-  "KeyW": 0x11, /* html:KeyW (KeyW) -> linux:17 (KEY_W) -> atset1:17 */
-  "KeyX": 0x2d, /* html:KeyX (KeyX) -> linux:45 (KEY_X) -> atset1:45 */
-  "KeyY": 0x15, /* html:KeyY (KeyY) -> linux:21 (KEY_Y) -> atset1:21 */
-  "KeyZ": 0x2c, /* html:KeyZ (KeyZ) -> linux:44 (KEY_Z) -> atset1:44 */
-  "Lang3": 0x78, /* html:Lang3 (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */
-  "Lang4": 0x77, /* html:Lang4 (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */
-  "Lang5": 0x76, /* html:Lang5 (Lang5) -> linux:85 (KEY_ZENKAKUHANKAKU) -> atset1:118 */
-  "LaunchApp1": 0xe06b, /* html:LaunchApp1 (LaunchApp1) -> linux:157 (KEY_COMPUTER) -> atset1:57451 */
-  "LaunchApp2": 0xe021, /* html:LaunchApp2 (LaunchApp2) -> linux:140 (KEY_CALC) -> atset1:57377 */
-  "LaunchMail": 0xe06c, /* html:LaunchMail (LaunchMail) -> linux:155 (KEY_MAIL) -> atset1:57452 */
-  "MediaPlayPause": 0xe022, /* html:MediaPlayPause (MediaPlayPause) -> linux:164 (KEY_PLAYPAUSE) -> atset1:57378 */
-  "MediaSelect": 0xe06d, /* html:MediaSelect (MediaSelect) -> linux:226 (KEY_MEDIA) -> atset1:57453 */
-  "MediaStop": 0xe024, /* html:MediaStop (MediaStop) -> linux:166 (KEY_STOPCD) -> atset1:57380 */
-  "MediaTrackNext": 0xe019, /* html:MediaTrackNext (MediaTrackNext) -> linux:163 (KEY_NEXTSONG) -> atset1:57369 */
-  "MediaTrackPrevious": 0xe010, /* html:MediaTrackPrevious (MediaTrackPrevious) -> linux:165 (KEY_PREVIOUSSONG) -> atset1:57360 */
-  "MetaLeft": 0xe05b, /* html:MetaLeft (MetaLeft) -> linux:125 (KEY_LEFTMETA) -> atset1:57435 */
-  "MetaRight": 0xe05c, /* html:MetaRight (MetaRight) -> linux:126 (KEY_RIGHTMETA) -> atset1:57436 */
-  "Minus": 0xc, /* html:Minus (Minus) -> linux:12 (KEY_MINUS) -> atset1:12 */
-  "NonConvert": 0x7b, /* html:NonConvert (NonConvert) -> linux:94 (KEY_MUHENKAN) -> atset1:123 */
-  "NumLock": 0x45, /* html:NumLock (NumLock) -> linux:69 (KEY_NUMLOCK) -> atset1:69 */
-  "Numpad0": 0x52, /* html:Numpad0 (Numpad0) -> linux:82 (KEY_KP0) -> atset1:82 */
-  "Numpad1": 0x4f, /* html:Numpad1 (Numpad1) -> linux:79 (KEY_KP1) -> atset1:79 */
-  "Numpad2": 0x50, /* html:Numpad2 (Numpad2) -> linux:80 (KEY_KP2) -> atset1:80 */
-  "Numpad3": 0x51, /* html:Numpad3 (Numpad3) -> linux:81 (KEY_KP3) -> atset1:81 */
-  "Numpad4": 0x4b, /* html:Numpad4 (Numpad4) -> linux:75 (KEY_KP4) -> atset1:75 */
-  "Numpad5": 0x4c, /* html:Numpad5 (Numpad5) -> linux:76 (KEY_KP5) -> atset1:76 */
-  "Numpad6": 0x4d, /* html:Numpad6 (Numpad6) -> linux:77 (KEY_KP6) -> atset1:77 */
-  "Numpad7": 0x47, /* html:Numpad7 (Numpad7) -> linux:71 (KEY_KP7) -> atset1:71 */
-  "Numpad8": 0x48, /* html:Numpad8 (Numpad8) -> linux:72 (KEY_KP8) -> atset1:72 */
-  "Numpad9": 0x49, /* html:Numpad9 (Numpad9) -> linux:73 (KEY_KP9) -> atset1:73 */
-  "NumpadAdd": 0x4e, /* html:NumpadAdd (NumpadAdd) -> linux:78 (KEY_KPPLUS) -> atset1:78 */
-  "NumpadComma": 0x7e, /* html:NumpadComma (NumpadComma) -> linux:121 (KEY_KPCOMMA) -> atset1:126 */
-  "NumpadDecimal": 0x53, /* html:NumpadDecimal (NumpadDecimal) -> linux:83 (KEY_KPDOT) -> atset1:83 */
-  "NumpadDivide": 0xe035, /* html:NumpadDivide (NumpadDivide) -> linux:98 (KEY_KPSLASH) -> atset1:57397 */
-  "NumpadEnter": 0xe01c, /* html:NumpadEnter (NumpadEnter) -> linux:96 (KEY_KPENTER) -> atset1:57372 */
-  "NumpadEqual": 0x59, /* html:NumpadEqual (NumpadEqual) -> linux:117 (KEY_KPEQUAL) -> atset1:89 */
-  "NumpadMultiply": 0x37, /* html:NumpadMultiply (NumpadMultiply) -> linux:55 (KEY_KPASTERISK) -> atset1:55 */
-  "NumpadParenLeft": 0xe076, /* html:NumpadParenLeft (NumpadParenLeft) -> linux:179 (KEY_KPLEFTPAREN) -> atset1:57462 */
-  "NumpadParenRight": 0xe07b, /* html:NumpadParenRight (NumpadParenRight) -> linux:180 (KEY_KPRIGHTPAREN) -> atset1:57467 */
-  "NumpadSubtract": 0x4a, /* html:NumpadSubtract (NumpadSubtract) -> linux:74 (KEY_KPMINUS) -> atset1:74 */
-  "Open": 0x64, /* html:Open (Open) -> linux:134 (KEY_OPEN) -> atset1:100 */
-  "PageDown": 0xe051, /* html:PageDown (PageDown) -> linux:109 (KEY_PAGEDOWN) -> atset1:57425 */
-  "PageUp": 0xe049, /* html:PageUp (PageUp) -> linux:104 (KEY_PAGEUP) -> atset1:57417 */
-  "Paste": 0x65, /* html:Paste (Paste) -> linux:135 (KEY_PASTE) -> atset1:101 */
-  "Pause": 0xe046, /* html:Pause (Pause) -> linux:119 (KEY_PAUSE) -> atset1:57414 */
-  "Period": 0x34, /* html:Period (Period) -> linux:52 (KEY_DOT) -> atset1:52 */
-  "Power": 0xe05e, /* html:Power (Power) -> linux:116 (KEY_POWER) -> atset1:57438 */
-  "PrintScreen": 0x54, /* html:PrintScreen (PrintScreen) -> linux:99 (KEY_SYSRQ) -> atset1:84 */
-  "Props": 0xe006, /* html:Props (Props) -> linux:130 (KEY_PROPS) -> atset1:57350 */
-  "Quote": 0x28, /* html:Quote (Quote) -> linux:40 (KEY_APOSTROPHE) -> atset1:40 */
-  "ScrollLock": 0x46, /* html:ScrollLock (ScrollLock) -> linux:70 (KEY_SCROLLLOCK) -> atset1:70 */
-  "Semicolon": 0x27, /* html:Semicolon (Semicolon) -> linux:39 (KEY_SEMICOLON) -> atset1:39 */
-  "ShiftLeft": 0x2a, /* html:ShiftLeft (ShiftLeft) -> linux:42 (KEY_LEFTSHIFT) -> atset1:42 */
-  "ShiftRight": 0x36, /* html:ShiftRight (ShiftRight) -> linux:54 (KEY_RIGHTSHIFT) -> atset1:54 */
-  "Slash": 0x35, /* html:Slash (Slash) -> linux:53 (KEY_SLASH) -> atset1:53 */
-  "Sleep": 0xe05f, /* html:Sleep (Sleep) -> linux:142 (KEY_SLEEP) -> atset1:57439 */
-  "Space": 0x39, /* html:Space (Space) -> linux:57 (KEY_SPACE) -> atset1:57 */
-  "Suspend": 0xe025, /* html:Suspend (Suspend) -> linux:205 (KEY_SUSPEND) -> atset1:57381 */
-  "Tab": 0xf, /* html:Tab (Tab) -> linux:15 (KEY_TAB) -> atset1:15 */
-  "Undo": 0xe007, /* html:Undo (Undo) -> linux:131 (KEY_UNDO) -> atset1:57351 */
-  "WakeUp": 0xe063, /* html:WakeUp (WakeUp) -> linux:143 (KEY_WAKEUP) -> atset1:57443 */
-};

+ 0 - 2540
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/rfb.js

@@ -1,2540 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Copyright (C) 2017 Samuel Mannehed for Cendio AB
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- *
- * TIGHT decoder portion:
- * (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca)
- */
-
-import * as Log from './util/logging.js';
-import { decodeUTF8 } from './util/strings.js';
-import { supportsCursorURIs, isTouchDevice } from './util/browser.js';
-import EventTargetMixin from './util/eventtarget.js';
-import Display from "./display.js";
-import Keyboard from "./input/keyboard.js";
-import Mouse from "./input/mouse.js";
-import Websock from "./websock.js";
-import DES from "./des.js";
-import KeyTable from "./input/keysym.js";
-import XtScancode from "./input/xtscancodes.js";
-import Inflator from "./inflator.js";
-import { encodings, encodingName } from "./encodings.js";
-import "./util/polyfill.js";
-
-/*jslint white: false, browser: true */
-/*global window, Util, Display, Keyboard, Mouse, Websock, Websock_native, Base64, DES, KeyTable, Inflator, XtScancode */
-
-// How many seconds to wait for a disconnect to finish
-var DISCONNECT_TIMEOUT = 3;
-
-export default function RFB(target, url, options) {
-    if (!target) {
-        throw Error("Must specify target");
-    }
-    if (!url) {
-        throw Error("Must specify URL");
-    }
-
-    this._target = target;
-    this._url = url;
-
-    // Connection details
-    options = options || {};
-    this._rfb_credentials = options.credentials || {};
-    this._shared = 'shared' in options ? !!options.shared : true;
-    this._repeaterID = options.repeaterID || '';
-
-    // Internal state
-    this._rfb_connection_state = '';
-    this._rfb_init_state = '';
-    this._rfb_auth_scheme = '';
-    this._rfb_clean_disconnect = true;
-
-    // Server capabilities
-    this._rfb_version = 0;
-    this._rfb_max_version = 3.8;
-    this._rfb_tightvnc = false;
-    this._rfb_xvp_ver = 0;
-
-    this._fb_width = 0;
-    this._fb_height = 0;
-
-    this._fb_name = "";
-
-    this._capabilities = { power: false };
-
-    this._supportsFence = false;
-
-    this._supportsContinuousUpdates = false;
-    this._enabledContinuousUpdates = false;
-
-    this._supportsSetDesktopSize = false;
-    this._screen_id = 0;
-    this._screen_flags = 0;
-
-    this._qemuExtKeyEventSupported = false;
-
-    // Internal objects
-    this._sock = null;              // Websock object
-    this._display = null;           // Display object
-    this._flushing = false;         // Display flushing state
-    this._keyboard = null;          // Keyboard input handler object
-    this._mouse = null;             // Mouse input handler object
-
-    // Timers
-    this._disconnTimer = null;      // disconnection timer
-    this._resizeTimeout = null;     // resize rate limiting
-
-    // Decoder states and stats
-    this._encHandlers = {};
-    this._encStats = {};
-
-    this._FBU = {
-        rects: 0,
-        subrects: 0,            // RRE and HEXTILE
-        lines: 0,               // RAW
-        tiles: 0,               // HEXTILE
-        bytes: 0,
-        x: 0,
-        y: 0,
-        width: 0,
-        height: 0,
-        encoding: 0,
-        subencoding: -1,
-        background: null,
-        zlibs: []               // TIGHT zlib streams
-    };
-    for (var i = 0; i < 4; i++) {
-        this._FBU.zlibs[i] = new Inflator();
-    }
-
-    this._destBuff = null;
-    this._paletteBuff = new Uint8Array(1024);  // 256 * 4 (max palette size * max bytes-per-pixel)
-
-    this._rre_chunk_sz = 100;
-
-    this._timing = {
-        last_fbu: 0,
-        fbu_total: 0,
-        fbu_total_cnt: 0,
-        full_fbu_total: 0,
-        full_fbu_cnt: 0,
-
-        fbu_rt_start: 0,
-        fbu_rt_total: 0,
-        fbu_rt_cnt: 0,
-        pixels: 0
-    };
-
-    // Mouse state
-    this._mouse_buttonMask = 0;
-    this._mouse_arr = [];
-    this._viewportDragging = false;
-    this._viewportDragPos = {};
-    this._viewportHasMoved = false;
-
-    // Bound event handlers
-    this._eventHandlers = {
-        focusCanvas: this._focusCanvas.bind(this),
-        windowResize: this._windowResize.bind(this),
-    };
-
-    // main setup
-    Log.Debug(">> RFB.constructor");
-
-    // Create DOM elements
-    this._screen = document.createElement('div');
-    this._screen.style.display = 'flex';
-    this._screen.style.width = '100%';
-    this._screen.style.height = '100%';
-    this._screen.style.overflow = 'auto';
-    this._screen.style.backgroundColor = 'rgb(40, 40, 40)';
-    this._canvas = document.createElement('canvas');
-    this._canvas.style.margin = 'auto';
-    // Some browsers add an outline on focus
-    this._canvas.style.outline = 'none';
-    // IE miscalculates width without this :(
-    this._canvas.style.flexShrink = '0';
-    this._canvas.width = 0;
-    this._canvas.height = 0;
-    this._canvas.tabIndex = -1;
-    this._screen.appendChild(this._canvas);
-
-    // populate encHandlers with bound versions
-    this._encHandlers[encodings.encodingRaw] = RFB.encodingHandlers.RAW.bind(this);
-    this._encHandlers[encodings.encodingCopyRect] = RFB.encodingHandlers.COPYRECT.bind(this);
-    this._encHandlers[encodings.encodingRRE] = RFB.encodingHandlers.RRE.bind(this);
-    this._encHandlers[encodings.encodingHextile] = RFB.encodingHandlers.HEXTILE.bind(this);
-    this._encHandlers[encodings.encodingTight] = RFB.encodingHandlers.TIGHT.bind(this);
-
-    this._encHandlers[encodings.pseudoEncodingDesktopSize] = RFB.encodingHandlers.DesktopSize.bind(this);
-    this._encHandlers[encodings.pseudoEncodingLastRect] = RFB.encodingHandlers.last_rect.bind(this);
-    this._encHandlers[encodings.pseudoEncodingCursor] = RFB.encodingHandlers.Cursor.bind(this);
-    this._encHandlers[encodings.pseudoEncodingQEMUExtendedKeyEvent] = RFB.encodingHandlers.QEMUExtendedKeyEvent.bind(this);
-    this._encHandlers[encodings.pseudoEncodingExtendedDesktopSize] = RFB.encodingHandlers.ExtendedDesktopSize.bind(this);
-
-    // NB: nothing that needs explicit teardown should be done
-    // before this point, since this can throw an exception
-    try {
-        this._display = new Display(this._canvas);
-    } catch (exc) {
-        Log.Error("Display exception: " + exc);
-        throw exc;
-    }
-    this._display.onflush = this._onFlush.bind(this);
-    this._display.clear();
-
-    this._keyboard = new Keyboard(this._canvas);
-    this._keyboard.onkeyevent = this._handleKeyEvent.bind(this);
-
-    this._mouse = new Mouse(this._canvas);
-    this._mouse.onmousebutton = this._handleMouseButton.bind(this);
-    this._mouse.onmousemove = this._handleMouseMove.bind(this);
-
-    this._sock = new Websock();
-    this._sock.on('message', this._handle_message.bind(this));
-    this._sock.on('open', function () {
-        if ((this._rfb_connection_state === 'connecting') &&
-            (this._rfb_init_state === '')) {
-            this._rfb_init_state = 'ProtocolVersion';
-            Log.Debug("Starting VNC handshake");
-        } else {
-            this._fail("Unexpected server connection while " +
-                       this._rfb_connection_state);
-        }
-    }.bind(this));
-    this._sock.on('close', function (e) {
-        Log.Debug("WebSocket on-close event");
-        var msg = "";
-        if (e.code) {
-            msg = "(code: " + e.code;
-            if (e.reason) {
-                msg += ", reason: " + e.reason;
-            }
-            msg += ")";
-        }
-        switch (this._rfb_connection_state) {
-            case 'connecting':
-                this._fail("Connection closed " + msg);
-                break;
-            case 'connected':
-                // Handle disconnects that were initiated server-side
-                this._updateConnectionState('disconnecting');
-                this._updateConnectionState('disconnected');
-                break;
-            case 'disconnecting':
-                // Normal disconnection path
-                this._updateConnectionState('disconnected');
-                break;
-            case 'disconnected':
-                this._fail("Unexpected server disconnect " +
-                           "when already disconnected " + msg);
-                break;
-            default:
-                this._fail("Unexpected server disconnect before connecting " +
-                           msg);
-                break;
-        }
-        this._sock.off('close');
-    }.bind(this));
-    this._sock.on('error', function (e) {
-        Log.Warn("WebSocket on-error event");
-    });
-
-    // Slight delay of the actual connection so that the caller has
-    // time to set up callbacks
-    setTimeout(this._updateConnectionState.bind(this, 'connecting'));
-
-    Log.Debug("<< RFB.constructor");
-};
-
-RFB.prototype = {
-    // ===== PROPERTIES =====
-
-    dragViewport: false,
-    focusOnClick: true,
-
-    _viewOnly: false,
-    get viewOnly() { return this._viewOnly; },
-    set viewOnly(viewOnly) {
-        this._viewOnly = viewOnly;
-
-        if (this._rfb_connection_state === "connecting" ||
-            this._rfb_connection_state === "connected") {
-            if (viewOnly) {
-                this._keyboard.ungrab();
-                this._mouse.ungrab();
-            } else {
-                this._keyboard.grab();
-                this._mouse.grab();
-            }
-        }
-    },
-
-    get capabilities() { return this._capabilities; },
-
-    get touchButton() { return this._mouse.touchButton; },
-    set touchButton(button) { this._mouse.touchButton = button; },
-
-    _clipViewport: false,
-    get clipViewport() { return this._clipViewport; },
-    set clipViewport(viewport) {
-        this._clipViewport = viewport;
-        this._updateClip();
-    },
-
-    _scaleViewport: false,
-    get scaleViewport() { return this._scaleViewport; },
-    set scaleViewport(scale) {
-        this._scaleViewport = scale;
-        // Scaling trumps clipping, so we may need to adjust
-        // clipping when enabling or disabling scaling
-        if (scale && this._clipViewport) {
-            this._updateClip();
-        }
-        this._updateScale();
-        if (!scale && this._clipViewport) {
-            this._updateClip();
-        }
-    },
-
-    _resizeSession: false,
-    get resizeSession() { return this._resizeSession; },
-    set resizeSession(resize) {
-        this._resizeSession = resize;
-        if (resize) {
-            this._requestRemoteResize();
-        }
-    },
-
-    // ===== PUBLIC METHODS =====
-
-    disconnect: function () {
-        this._updateConnectionState('disconnecting');
-        this._sock.off('error');
-        this._sock.off('message');
-        this._sock.off('open');
-    },
-
-    sendCredentials: function (creds) {
-        this._rfb_credentials = creds;
-        setTimeout(this._init_msg.bind(this), 0);
-    },
-
-    sendCtrlAltDel: function () {
-        if (this._rfb_connection_state !== 'connected' || this._viewOnly) { return; }
-        Log.Info("Sending Ctrl-Alt-Del");
-
-        this.sendKey(KeyTable.XK_Control_L, "ControlLeft", true);
-        this.sendKey(KeyTable.XK_Alt_L, "AltLeft", true);
-        this.sendKey(KeyTable.XK_Delete, "Delete", true);
-        this.sendKey(KeyTable.XK_Delete, "Delete", false);
-        this.sendKey(KeyTable.XK_Alt_L, "AltLeft", false);
-        this.sendKey(KeyTable.XK_Control_L, "ControlLeft", false);
-    },
-
-    machineShutdown: function () {
-        this._xvpOp(1, 2);
-    },
-
-    machineReboot: function () {
-        this._xvpOp(1, 3);
-    },
-
-    machineReset: function () {
-        this._xvpOp(1, 4);
-    },
-
-    // Send a key press. If 'down' is not specified then send a down key
-    // followed by an up key.
-    sendKey: function (keysym, code, down) {
-        if (this._rfb_connection_state !== 'connected' || this._viewOnly) { return; }
-
-        if (down === undefined) {
-            this.sendKey(keysym, code, true);
-            this.sendKey(keysym, code, false);
-            return;
-        }
-
-        var scancode = XtScancode[code];
-
-        if (this._qemuExtKeyEventSupported && scancode) {
-            // 0 is NoSymbol
-            keysym = keysym || 0;
-
-            Log.Info("Sending key (" + (down ? "down" : "up") + "): keysym " + keysym + ", scancode " + scancode);
-
-            RFB.messages.QEMUExtendedKeyEvent(this._sock, keysym, down, scancode);
-        } else {
-            if (!keysym) {
-                return;
-            }
-            Log.Info("Sending keysym (" + (down ? "down" : "up") + "): " + keysym);
-            RFB.messages.keyEvent(this._sock, keysym, down ? 1 : 0);
-        }
-    },
-
-    focus: function () {
-        this._canvas.focus();
-    },
-
-    blur: function () {
-        this._canvas.blur();
-    },
-
-    clipboardPasteFrom: function (text) {
-        if (this._rfb_connection_state !== 'connected' || this._viewOnly) { return; }
-        RFB.messages.clientCutText(this._sock, text);
-    },
-
-    // ===== PRIVATE METHODS =====
-
-    _connect: function () {
-        Log.Debug(">> RFB.connect");
-
-        Log.Info("connecting to " + this._url);
-
-        try {
-            // WebSocket.onopen transitions to the RFB init states
-            this._sock.open(this._url, ['binary']);
-        } catch (e) {
-            if (e.name === 'SyntaxError') {
-                this._fail("Invalid host or port (" + e + ")");
-            } else {
-                this._fail("Error when opening socket (" + e + ")");
-            }
-        }
-
-        // Make our elements part of the page
-        this._target.appendChild(this._screen);
-
-        // Monitor size changes of the screen
-        // FIXME: Use ResizeObserver, or hidden overflow
-        window.addEventListener('resize', this._eventHandlers.windowResize);
-
-        // Always grab focus on some kind of click event
-        this._canvas.addEventListener("mousedown", this._eventHandlers.focusCanvas);
-        this._canvas.addEventListener("touchstart", this._eventHandlers.focusCanvas);
-
-        Log.Debug("<< RFB.connect");
-    },
-
-    _disconnect: function () {
-        Log.Debug(">> RFB.disconnect");
-        this._canvas.removeEventListener("mousedown", this._eventHandlers.focusCanvas);
-        this._canvas.removeEventListener("touchstart", this._eventHandlers.focusCanvas);
-        window.removeEventListener('resize', this._eventHandlers.windowResize);
-        this._keyboard.ungrab();
-        this._mouse.ungrab();
-        this._sock.close();
-        this._print_stats();
-        try {
-            this._target.removeChild(this._screen);
-        } catch (e) {
-            if (e.name === 'NotFoundError') {
-                // Some cases where the initial connection fails
-                // can disconnect before the _screen is created
-            } else {
-                throw e;
-            }
-        }
-        clearTimeout(this._resizeTimeout);
-        Log.Debug("<< RFB.disconnect");
-    },
-
-    _print_stats: function () {
-        var stats = this._encStats;
-
-        Log.Info("Encoding stats for this connection:");
-        Object.keys(stats).forEach(function (key) {
-            var s = stats[key];
-            if (s[0] + s[1] > 0) {
-                Log.Info("    " + encodingName(key) + ": " + s[0] + " rects");
-            }
-        });
-
-        Log.Info("Encoding stats since page load:");
-        Object.keys(stats).forEach(function (key) {
-            var s = stats[key];
-            Log.Info("    " + encodingName(key) + ": " + s[1] + " rects");
-        });
-    },
-
-    _focusCanvas: function(event) {
-        // Respect earlier handlers' request to not do side-effects
-        if (event.defaultPrevented) {
-            return;
-        }
-
-        if (!this.focusOnClick) {
-            return;
-        }
-
-        this.focus();
-    },
-
-    _windowResize: function (event) {
-        // If the window resized then our screen element might have
-        // as well. Update the viewport dimensions.
-        window.requestAnimationFrame(function () {
-            this._updateClip();
-            this._updateScale();
-        }.bind(this));
-
-        if (this._resizeSession) {
-            // Request changing the resolution of the remote display to
-            // the size of the local browser viewport.
-
-            // In order to not send multiple requests before the browser-resize
-            // is finished we wait 0.5 seconds before sending the request.
-            clearTimeout(this._resizeTimeout);
-            this._resizeTimeout = setTimeout(this._requestRemoteResize.bind(this), 500);
-        }
-    },
-
-    // Update state of clipping in Display object, and make sure the
-    // configured viewport matches the current screen size
-    _updateClip: function () {
-        var cur_clip = this._display.clipViewport;
-        var new_clip = this._clipViewport;
-
-        if (this._scaleViewport) {
-            // Disable viewport clipping if we are scaling
-            new_clip = false;
-        }
-
-        if (cur_clip !== new_clip) {
-            this._display.clipViewport = new_clip;
-        }
-
-        if (new_clip) {
-            // When clipping is enabled, the screen is limited to
-            // the size of the container.
-            let size = this._screenSize();
-            this._display.viewportChangeSize(size.w, size.h);
-            this._fixScrollbars();
-        }
-    },
-
-    _updateScale: function () {
-        if (!this._scaleViewport) {
-            this._display.scale = 1.0;
-        } else {
-            let size = this._screenSize();
-            this._display.autoscale(size.w, size.h);
-        }
-        this._fixScrollbars();
-    },
-
-    // Requests a change of remote desktop size. This message is an extension
-    // and may only be sent if we have received an ExtendedDesktopSize message
-    _requestRemoteResize: function () {
-        clearTimeout(this._resizeTimeout);
-        this._resizeTimeout = null;
-
-        if (!this._resizeSession || this._viewOnly ||
-            !this._supportsSetDesktopSize) {
-            return;
-        }
-
-        let size = this._screenSize();
-        RFB.messages.setDesktopSize(this._sock, size.w, size.h,
-                                    this._screen_id, this._screen_flags);
-
-        Log.Debug('Requested new desktop size: ' +
-                   size.w + 'x' + size.h);
-    },
-
-    // Gets the the size of the available screen
-    _screenSize: function () {
-        return { w: this._screen.offsetWidth,
-                 h: this._screen.offsetHeight };
-    },
-
-    _fixScrollbars: function () {
-        // This is a hack because Chrome screws up the calculation
-        // for when scrollbars are needed. So to fix it we temporarily
-        // toggle them off and on.
-        var orig = this._screen.style.overflow;
-        this._screen.style.overflow = 'hidden';
-        // Force Chrome to recalculate the layout by asking for
-        // an element's dimensions
-        this._screen.getBoundingClientRect();
-        this._screen.style.overflow = orig;
-    },
-
-    /*
-     * Connection states:
-     *   connecting
-     *   connected
-     *   disconnecting
-     *   disconnected - permanent state
-     */
-    _updateConnectionState: function (state) {
-        var oldstate = this._rfb_connection_state;
-
-        if (state === oldstate) {
-            Log.Debug("Already in state '" + state + "', ignoring");
-            return;
-        }
-
-        // The 'disconnected' state is permanent for each RFB object
-        if (oldstate === 'disconnected') {
-            Log.Error("Tried changing state of a disconnected RFB object");
-            return;
-        }
-
-        // Ensure proper transitions before doing anything
-        switch (state) {
-            case 'connected':
-                if (oldstate !== 'connecting') {
-                    Log.Error("Bad transition to connected state, " +
-                               "previous connection state: " + oldstate);
-                    return;
-                }
-                break;
-
-            case 'disconnected':
-                if (oldstate !== 'disconnecting') {
-                    Log.Error("Bad transition to disconnected state, " +
-                               "previous connection state: " + oldstate);
-                    return;
-                }
-                break;
-
-            case 'connecting':
-                if (oldstate !== '') {
-                    Log.Error("Bad transition to connecting state, " +
-                               "previous connection state: " + oldstate);
-                    return;
-                }
-                break;
-
-            case 'disconnecting':
-                if (oldstate !== 'connected' && oldstate !== 'connecting') {
-                    Log.Error("Bad transition to disconnecting state, " +
-                               "previous connection state: " + oldstate);
-                    return;
-                }
-                break;
-
-            default:
-                Log.Error("Unknown connection state: " + state);
-                return;
-        }
-
-        // State change actions
-
-        this._rfb_connection_state = state;
-
-        var smsg = "New state '" + state + "', was '" + oldstate + "'.";
-        Log.Debug(smsg);
-
-        if (this._disconnTimer && state !== 'disconnecting') {
-            Log.Debug("Clearing disconnect timer");
-            clearTimeout(this._disconnTimer);
-            this._disconnTimer = null;
-
-            // make sure we don't get a double event
-            this._sock.off('close');
-        }
-
-        switch (state) {
-            case 'connecting':
-                this._connect();
-                break;
-
-            case 'connected':
-                var event = new CustomEvent("connect", { detail: {} });
-                this.dispatchEvent(event);
-                break;
-
-            case 'disconnecting':
-                this._disconnect();
-
-                this._disconnTimer = setTimeout(function () {
-                    Log.Error("Disconnection timed out.");
-                    this._updateConnectionState('disconnected');
-                }.bind(this), DISCONNECT_TIMEOUT * 1000);
-                break;
-
-            case 'disconnected':
-                event = new CustomEvent(
-                    "disconnect", { detail:
-                                    { clean: this._rfb_clean_disconnect } });
-                this.dispatchEvent(event);
-                break;
-        }
-    },
-
-    /* Print errors and disconnect
-     *
-     * The parameter 'details' is used for information that
-     * should be logged but not sent to the user interface.
-     */
-    _fail: function (details) {
-        switch (this._rfb_connection_state) {
-            case 'disconnecting':
-                Log.Error("Failed when disconnecting: " + details);
-                break;
-            case 'connected':
-                Log.Error("Failed while connected: " + details);
-                break;
-            case 'connecting':
-                Log.Error("Failed when connecting: " + details);
-                break;
-            default:
-                Log.Error("RFB failure: " + details);
-                break;
-        }
-        this._rfb_clean_disconnect = false; //This is sent to the UI
-
-        // Transition to disconnected without waiting for socket to close
-        this._updateConnectionState('disconnecting');
-        this._updateConnectionState('disconnected');
-
-        return false;
-    },
-
-    _setCapability: function (cap, val) {
-        this._capabilities[cap] = val;
-        var event = new CustomEvent("capabilities",
-                                    { detail: { capabilities: this._capabilities } });
-        this.dispatchEvent(event);
-    },
-
-    _handle_message: function () {
-        if (this._sock.rQlen() === 0) {
-            Log.Warn("handle_message called on an empty receive queue");
-            return;
-        }
-
-        switch (this._rfb_connection_state) {
-            case 'disconnected':
-                Log.Error("Got data while disconnected");
-                break;
-            case 'connected':
-                while (true) {
-                    if (this._flushing) {
-                        break;
-                    }
-                    if (!this._normal_msg()) {
-                        break;
-                    }
-                    if (this._sock.rQlen() === 0) {
-                        break;
-                    }
-                }
-                break;
-            default:
-                this._init_msg();
-                break;
-        }
-    },
-
-    _handleKeyEvent: function (keysym, code, down) {
-        this.sendKey(keysym, code, down);
-    },
-
-    _handleMouseButton: function (x, y, down, bmask) {
-        if (down) {
-            this._mouse_buttonMask |= bmask;
-        } else {
-            this._mouse_buttonMask &= ~bmask;
-        }
-
-        if (this.dragViewport) {
-            if (down && !this._viewportDragging) {
-                this._viewportDragging = true;
-                this._viewportDragPos = {'x': x, 'y': y};
-                this._viewportHasMoved = false;
-
-                // Skip sending mouse events
-                return;
-            } else {
-                this._viewportDragging = false;
-
-                // If we actually performed a drag then we are done
-                // here and should not send any mouse events
-                if (this._viewportHasMoved) {
-                    return;
-                }
-
-                // Otherwise we treat this as a mouse click event.
-                // Send the button down event here, as the button up
-                // event is sent at the end of this function.
-                RFB.messages.pointerEvent(this._sock,
-                                          this._display.absX(x),
-                                          this._display.absY(y),
-                                          bmask);
-            }
-        }
-
-        if (this._viewOnly) { return; } // View only, skip mouse events
-
-        if (this._rfb_connection_state !== 'connected') { return; }
-        RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), this._mouse_buttonMask);
-    },
-
-    _handleMouseMove: function (x, y) {
-        if (this._viewportDragging) {
-            var deltaX = this._viewportDragPos.x - x;
-            var deltaY = this._viewportDragPos.y - y;
-
-            // The goal is to trigger on a certain physical width, the
-            // devicePixelRatio brings us a bit closer but is not optimal.
-            var dragThreshold = 10 * (window.devicePixelRatio || 1);
-
-            if (this._viewportHasMoved || (Math.abs(deltaX) > dragThreshold ||
-                                           Math.abs(deltaY) > dragThreshold)) {
-                this._viewportHasMoved = true;
-
-                this._viewportDragPos = {'x': x, 'y': y};
-                this._display.viewportChangePos(deltaX, deltaY);
-            }
-
-            // Skip sending mouse events
-            return;
-        }
-
-        if (this._viewOnly) { return; } // View only, skip mouse events
-
-        if (this._rfb_connection_state !== 'connected') { return; }
-        RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), this._mouse_buttonMask);
-    },
-
-    // Message Handlers
-
-    _negotiate_protocol_version: function () {
-        if (this._sock.rQlen() < 12) {
-            return this._fail("Received incomplete protocol version.");
-        }
-
-        var sversion = this._sock.rQshiftStr(12).substr(4, 7);
-        Log.Info("Server ProtocolVersion: " + sversion);
-        var is_repeater = 0;
-        switch (sversion) {
-            case "000.000":  // UltraVNC repeater
-                is_repeater = 1;
-                break;
-            case "003.003":
-            case "003.006":  // UltraVNC
-            case "003.889":  // Apple Remote Desktop
-                this._rfb_version = 3.3;
-                break;
-            case "003.007":
-                this._rfb_version = 3.7;
-                break;
-            case "003.008":
-            case "004.000":  // Intel AMT KVM
-            case "004.001":  // RealVNC 4.6
-            case "005.000":  // RealVNC 5.3
-                this._rfb_version = 3.8;
-                break;
-            default:
-                return this._fail("Invalid server version " + sversion);
-        }
-
-        if (is_repeater) {
-            var repeaterID = "ID:" + this._repeaterID;
-            while (repeaterID.length < 250) {
-                repeaterID += "\0";
-            }
-            this._sock.send_string(repeaterID);
-            return true;
-        }
-
-        if (this._rfb_version > this._rfb_max_version) {
-            this._rfb_version = this._rfb_max_version;
-        }
-
-        var cversion = "00" + parseInt(this._rfb_version, 10) +
-                       ".00" + ((this._rfb_version * 10) % 10);
-        this._sock.send_string("RFB " + cversion + "\n");
-        Log.Debug('Sent ProtocolVersion: ' + cversion);
-
-        this._rfb_init_state = 'Security';
-    },
-
-    _negotiate_security: function () {
-        // Polyfill since IE and PhantomJS doesn't have
-        // TypedArray.includes()
-        function includes(item, array) {
-            for (var i = 0; i < array.length; i++) {
-                if (array[i] === item) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        if (this._rfb_version >= 3.7) {
-            // Server sends supported list, client decides
-            var num_types = this._sock.rQshift8();
-            if (this._sock.rQwait("security type", num_types, 1)) { return false; }
-
-            if (num_types === 0) {
-                return this._handle_security_failure("no security types");
-            }
-
-            var types = this._sock.rQshiftBytes(num_types);
-            Log.Debug("Server security types: " + types);
-
-            // Look for each auth in preferred order
-            this._rfb_auth_scheme = 0;
-            if (includes(1, types)) {
-                this._rfb_auth_scheme = 1; // None
-            } else if (includes(22, types)) {
-                this._rfb_auth_scheme = 22; // XVP
-            } else if (includes(16, types)) {
-                this._rfb_auth_scheme = 16; // Tight
-            } else if (includes(2, types)) {
-                this._rfb_auth_scheme = 2; // VNC Auth
-            } else {
-                return this._fail("Unsupported security types (types: " + types + ")");
-            }
-
-            this._sock.send([this._rfb_auth_scheme]);
-        } else {
-            // Server decides
-            if (this._sock.rQwait("security scheme", 4)) { return false; }
-            this._rfb_auth_scheme = this._sock.rQshift32();
-        }
-
-        this._rfb_init_state = 'Authentication';
-        Log.Debug('Authenticating using scheme: ' + this._rfb_auth_scheme);
-
-        return this._init_msg(); // jump to authentication
-    },
-
-    /*
-     * Get the security failure reason if sent from the server and
-     * send the 'securityfailure' event.
-     *
-     * - The optional parameter context can be used to add some extra
-     *   context to the log output.
-     *
-     * - The optional parameter security_result_status can be used to
-     *   add a custom status code to the event.
-     */
-    _handle_security_failure: function (context, security_result_status) {
-
-        if (typeof context === 'undefined') {
-            context = "";
-        } else {
-            context = " on " + context;
-        }
-
-        if (typeof security_result_status === 'undefined') {
-            security_result_status = 1; // fail
-        }
-
-        if (this._sock.rQwait("reason length", 4)) {
-            return false;
-        }
-        let strlen = this._sock.rQshift32();
-        let reason = "";
-
-        if (strlen > 0) {
-            if (this._sock.rQwait("reason", strlen, 8)) { return false; }
-            reason = this._sock.rQshiftStr(strlen);
-        }
-
-        if (reason !== "") {
-
-            let event = new CustomEvent(
-                "securityfailure",
-                { detail: { status: security_result_status, reason: reason } });
-            this.dispatchEvent(event);
-
-            return this._fail("Security negotiation failed" + context +
-                              " (reason: " + reason + ")");
-        } else {
-
-            let event = new CustomEvent(
-                "securityfailure",
-                { detail: { status: security_result_status } });
-            this.dispatchEvent(event);
-
-            return this._fail("Security negotiation failed" + context);
-        }
-    },
-
-    // authentication
-    _negotiate_xvp_auth: function () {
-        if (!this._rfb_credentials.username ||
-            !this._rfb_credentials.password ||
-            !this._rfb_credentials.target) {
-            var event = new CustomEvent("credentialsrequired",
-                                        { detail: { types: ["username", "password", "target"] } });
-            this.dispatchEvent(event);
-            return false;
-        }
-
-        var xvp_auth_str = String.fromCharCode(this._rfb_credentials.username.length) +
-                           String.fromCharCode(this._rfb_credentials.target.length) +
-                           this._rfb_credentials.username +
-                           this._rfb_credentials.target;
-        this._sock.send_string(xvp_auth_str);
-        this._rfb_auth_scheme = 2;
-        return this._negotiate_authentication();
-    },
-
-    _negotiate_std_vnc_auth: function () {
-        if (this._sock.rQwait("auth challenge", 16)) { return false; }
-
-        if (!this._rfb_credentials.password) {
-            var event = new CustomEvent("credentialsrequired",
-                                        { detail: { types: ["password"] } });
-            this.dispatchEvent(event);
-            return false;
-        }
-
-        // TODO(directxman12): make genDES not require an Array
-        var challenge = Array.prototype.slice.call(this._sock.rQshiftBytes(16));
-        var response = RFB.genDES(this._rfb_credentials.password, challenge);
-        this._sock.send(response);
-        this._rfb_init_state = "SecurityResult";
-        return true;
-    },
-
-    _negotiate_tight_tunnels: function (numTunnels) {
-        var clientSupportedTunnelTypes = {
-            0: { vendor: 'TGHT', signature: 'NOTUNNEL' }
-        };
-        var serverSupportedTunnelTypes = {};
-        // receive tunnel capabilities
-        for (var i = 0; i < numTunnels; i++) {
-            var cap_code = this._sock.rQshift32();
-            var cap_vendor = this._sock.rQshiftStr(4);
-            var cap_signature = this._sock.rQshiftStr(8);
-            serverSupportedTunnelTypes[cap_code] = { vendor: cap_vendor, signature: cap_signature };
-        }
-
-        // choose the notunnel type
-        if (serverSupportedTunnelTypes[0]) {
-            if (serverSupportedTunnelTypes[0].vendor != clientSupportedTunnelTypes[0].vendor ||
-                serverSupportedTunnelTypes[0].signature != clientSupportedTunnelTypes[0].signature) {
-                return this._fail("Client's tunnel type had the incorrect " +
-                                  "vendor or signature");
-            }
-            this._sock.send([0, 0, 0, 0]);  // use NOTUNNEL
-            return false; // wait until we receive the sub auth count to continue
-        } else {
-            return this._fail("Server wanted tunnels, but doesn't support " +
-                              "the notunnel type");
-        }
-    },
-
-    _negotiate_tight_auth: function () {
-        if (!this._rfb_tightvnc) {  // first pass, do the tunnel negotiation
-            if (this._sock.rQwait("num tunnels", 4)) { return false; }
-            var numTunnels = this._sock.rQshift32();
-            if (numTunnels > 0 && this._sock.rQwait("tunnel capabilities", 16 * numTunnels, 4)) { return false; }
-
-            this._rfb_tightvnc = true;
-
-            if (numTunnels > 0) {
-                this._negotiate_tight_tunnels(numTunnels);
-                return false;  // wait until we receive the sub auth to continue
-            }
-        }
-
-        // second pass, do the sub-auth negotiation
-        if (this._sock.rQwait("sub auth count", 4)) { return false; }
-        var subAuthCount = this._sock.rQshift32();
-        if (subAuthCount === 0) {  // empty sub-auth list received means 'no auth' subtype selected
-            this._rfb_init_state = 'SecurityResult';
-            return true;
-        }
-
-        if (this._sock.rQwait("sub auth capabilities", 16 * subAuthCount, 4)) { return false; }
-
-        var clientSupportedTypes = {
-            'STDVNOAUTH__': 1,
-            'STDVVNCAUTH_': 2
-        };
-
-        var serverSupportedTypes = [];
-
-        for (var i = 0; i < subAuthCount; i++) {
-            var capNum = this._sock.rQshift32();
-            var capabilities = this._sock.rQshiftStr(12);
-            serverSupportedTypes.push(capabilities);
-        }
-
-        for (var authType in clientSupportedTypes) {
-            if (serverSupportedTypes.indexOf(authType) != -1) {
-                this._sock.send([0, 0, 0, clientSupportedTypes[authType]]);
-
-                switch (authType) {
-                    case 'STDVNOAUTH__':  // no auth
-                        this._rfb_init_state = 'SecurityResult';
-                        return true;
-                    case 'STDVVNCAUTH_': // VNC auth
-                        this._rfb_auth_scheme = 2;
-                        return this._init_msg();
-                    default:
-                        return this._fail("Unsupported tiny auth scheme " +
-                                          "(scheme: " + authType + ")");
-                }
-            }
-        }
-
-        return this._fail("No supported sub-auth types!");
-    },
-
-    _negotiate_authentication: function () {
-        switch (this._rfb_auth_scheme) {
-            case 0:  // connection failed
-                return this._handle_security_failure("authentication scheme");
-
-            case 1:  // no auth
-                if (this._rfb_version >= 3.8) {
-                    this._rfb_init_state = 'SecurityResult';
-                    return true;
-                }
-                this._rfb_init_state = 'ClientInitialisation';
-                return this._init_msg();
-
-            case 22:  // XVP auth
-                return this._negotiate_xvp_auth();
-
-            case 2:  // VNC authentication
-                return this._negotiate_std_vnc_auth();
-
-            case 16:  // TightVNC Security Type
-                return this._negotiate_tight_auth();
-
-            default:
-                return this._fail("Unsupported auth scheme (scheme: " +
-                                  this._rfb_auth_scheme + ")");
-        }
-    },
-
-    _handle_security_result: function () {
-        if (this._sock.rQwait('VNC auth response ', 4)) { return false; }
-
-        let status = this._sock.rQshift32();
-
-        if (status === 0) { // OK
-            this._rfb_init_state = 'ClientInitialisation';
-            Log.Debug('Authentication OK');
-            return this._init_msg();
-        } else {
-            if (this._rfb_version >= 3.8) {
-                return this._handle_security_failure("security result", status);
-            } else {
-                let event = new CustomEvent("securityfailure",
-                                            { detail: { status: status } });
-                this.dispatchEvent(event);
-
-                return this._fail("Security handshake failed");
-            }
-        }
-    },
-
-    _negotiate_server_init: function () {
-        if (this._sock.rQwait("server initialization", 24)) { return false; }
-
-        /* Screen size */
-        var width = this._sock.rQshift16();
-        var height = this._sock.rQshift16();
-
-        /* PIXEL_FORMAT */
-        var bpp         = this._sock.rQshift8();
-        var depth       = this._sock.rQshift8();
-        var big_endian  = this._sock.rQshift8();
-        var true_color  = this._sock.rQshift8();
-
-        var red_max     = this._sock.rQshift16();
-        var green_max   = this._sock.rQshift16();
-        var blue_max    = this._sock.rQshift16();
-        var red_shift   = this._sock.rQshift8();
-        var green_shift = this._sock.rQshift8();
-        var blue_shift  = this._sock.rQshift8();
-        this._sock.rQskipBytes(3);  // padding
-
-        // NB(directxman12): we don't want to call any callbacks or print messages until
-        //                   *after* we're past the point where we could backtrack
-
-        /* Connection name/title */
-        var name_length = this._sock.rQshift32();
-        if (this._sock.rQwait('server init name', name_length, 24)) { return false; }
-        this._fb_name = decodeUTF8(this._sock.rQshiftStr(name_length));
-
-        if (this._rfb_tightvnc) {
-            if (this._sock.rQwait('TightVNC extended server init header', 8, 24 + name_length)) { return false; }
-            // In TightVNC mode, ServerInit message is extended
-            var numServerMessages = this._sock.rQshift16();
-            var numClientMessages = this._sock.rQshift16();
-            var numEncodings = this._sock.rQshift16();
-            this._sock.rQskipBytes(2);  // padding
-
-            var totalMessagesLength = (numServerMessages + numClientMessages + numEncodings) * 16;
-            if (this._sock.rQwait('TightVNC extended server init header', totalMessagesLength, 32 + name_length)) { return false; }
-
-            // we don't actually do anything with the capability information that TIGHT sends,
-            // so we just skip the all of this.
-
-            // TIGHT server message capabilities
-            this._sock.rQskipBytes(16 * numServerMessages);
-
-            // TIGHT client message capabilities
-            this._sock.rQskipBytes(16 * numClientMessages);
-
-            // TIGHT encoding capabilities
-            this._sock.rQskipBytes(16 * numEncodings);
-        }
-
-        // NB(directxman12): these are down here so that we don't run them multiple times
-        //                   if we backtrack
-        Log.Info("Screen: " + width + "x" + height +
-                  ", bpp: " + bpp + ", depth: " + depth +
-                  ", big_endian: " + big_endian +
-                  ", true_color: " + true_color +
-                  ", red_max: " + red_max +
-                  ", green_max: " + green_max +
-                  ", blue_max: " + blue_max +
-                  ", red_shift: " + red_shift +
-                  ", green_shift: " + green_shift +
-                  ", blue_shift: " + blue_shift);
-
-        if (big_endian !== 0) {
-            Log.Warn("Server native endian is not little endian");
-        }
-
-        if (red_shift !== 16) {
-            Log.Warn("Server native red-shift is not 16");
-        }
-
-        if (blue_shift !== 0) {
-            Log.Warn("Server native blue-shift is not 0");
-        }
-
-        // we're past the point where we could backtrack, so it's safe to call this
-        var event = new CustomEvent("desktopname",
-                                    { detail: { name: this._fb_name } });
-        this.dispatchEvent(event);
-
-        this._resize(width, height);
-
-        if (!this._viewOnly) { this._keyboard.grab(); }
-        if (!this._viewOnly) { this._mouse.grab(); }
-
-        this._fb_depth = 24;
-
-        if (this._fb_name === "Intel(r) AMT KVM") {
-            Log.Warn("Intel AMT KVM only supports 8/16 bit depths. Using low color mode.");
-            this._fb_depth = 8;
-        }
-
-        RFB.messages.pixelFormat(this._sock, this._fb_depth, true);
-        this._sendEncodings();
-        RFB.messages.fbUpdateRequest(this._sock, false, 0, 0, this._fb_width, this._fb_height);
-
-        this._timing.fbu_rt_start = (new Date()).getTime();
-        this._timing.pixels = 0;
-
-        // Cursor will be server side until the server decides to honor
-        // our request and send over the cursor image
-        this._display.disableLocalCursor();
-
-        this._updateConnectionState('connected');
-        return true;
-    },
-
-    _sendEncodings: function () {
-        var encs = [];
-
-        // In preference order
-        encs.push(encodings.encodingCopyRect);
-        // Only supported with full depth support
-        if (this._fb_depth == 24) {
-            encs.push(encodings.encodingTight);
-            encs.push(encodings.encodingHextile);
-            encs.push(encodings.encodingRRE);
-        }
-        encs.push(encodings.encodingRaw);
-
-        // Psuedo-encoding settings
-        encs.push(encodings.pseudoEncodingTightPNG);
-        encs.push(encodings.pseudoEncodingQualityLevel0 + 6);
-        encs.push(encodings.pseudoEncodingCompressLevel0 + 2);
-
-        encs.push(encodings.pseudoEncodingDesktopSize);
-        encs.push(encodings.pseudoEncodingLastRect);
-        encs.push(encodings.pseudoEncodingQEMUExtendedKeyEvent);
-        encs.push(encodings.pseudoEncodingExtendedDesktopSize);
-        encs.push(encodings.pseudoEncodingXvp);
-        encs.push(encodings.pseudoEncodingFence);
-        encs.push(encodings.pseudoEncodingContinuousUpdates);
-
-        if (supportsCursorURIs() &&
-            !isTouchDevice && this._fb_depth == 24) {
-            encs.push(encodings.pseudoEncodingCursor);
-        }
-
-        RFB.messages.clientEncodings(this._sock, encs);
-    },
-
-    /* RFB protocol initialization states:
-     *   ProtocolVersion
-     *   Security
-     *   Authentication
-     *   SecurityResult
-     *   ClientInitialization - not triggered by server message
-     *   ServerInitialization
-     */
-    _init_msg: function () {
-        switch (this._rfb_init_state) {
-            case 'ProtocolVersion':
-                return this._negotiate_protocol_version();
-
-            case 'Security':
-                return this._negotiate_security();
-
-            case 'Authentication':
-                return this._negotiate_authentication();
-
-            case 'SecurityResult':
-                return this._handle_security_result();
-
-            case 'ClientInitialisation':
-                this._sock.send([this._shared ? 1 : 0]); // ClientInitialisation
-                this._rfb_init_state = 'ServerInitialisation';
-                return true;
-
-            case 'ServerInitialisation':
-                return this._negotiate_server_init();
-
-            default:
-                return this._fail("Unknown init state (state: " +
-                                  this._rfb_init_state + ")");
-        }
-    },
-
-    _handle_set_colour_map_msg: function () {
-        Log.Debug("SetColorMapEntries");
-
-        return this._fail("Unexpected SetColorMapEntries message");
-    },
-
-    _handle_server_cut_text: function () {
-        Log.Debug("ServerCutText");
-
-        if (this._sock.rQwait("ServerCutText header", 7, 1)) { return false; }
-        this._sock.rQskipBytes(3);  // Padding
-        var length = this._sock.rQshift32();
-        if (this._sock.rQwait("ServerCutText", length, 8)) { return false; }
-
-        var text = this._sock.rQshiftStr(length);
-
-        if (this._viewOnly) { return true; }
-
-        var event = new CustomEvent("clipboard",
-                                    { detail: { text: text } });
-        this.dispatchEvent(event);
-
-        return true;
-    },
-
-    _handle_server_fence_msg: function() {
-        if (this._sock.rQwait("ServerFence header", 8, 1)) { return false; }
-        this._sock.rQskipBytes(3); // Padding
-        var flags = this._sock.rQshift32();
-        var length = this._sock.rQshift8();
-
-        if (this._sock.rQwait("ServerFence payload", length, 9)) { return false; }
-
-        if (length > 64) {
-            Log.Warn("Bad payload length (" + length + ") in fence response");
-            length = 64;
-        }
-
-        var payload = this._sock.rQshiftStr(length);
-
-        this._supportsFence = true;
-
-        /*
-         * Fence flags
-         *
-         *  (1<<0)  - BlockBefore
-         *  (1<<1)  - BlockAfter
-         *  (1<<2)  - SyncNext
-         *  (1<<31) - Request
-         */
-
-        if (!(flags & (1<<31))) {
-            return this._fail("Unexpected fence response");
-        }
-
-        // Filter out unsupported flags
-        // FIXME: support syncNext
-        flags &= (1<<0) | (1<<1);
-
-        // BlockBefore and BlockAfter are automatically handled by
-        // the fact that we process each incoming message
-        // synchronuosly.
-        RFB.messages.clientFence(this._sock, flags, payload);
-
-        return true;
-    },
-
-    _handle_xvp_msg: function () {
-        if (this._sock.rQwait("XVP version and message", 3, 1)) { return false; }
-        this._sock.rQskip8();  // Padding
-        var xvp_ver = this._sock.rQshift8();
-        var xvp_msg = this._sock.rQshift8();
-
-        switch (xvp_msg) {
-            case 0:  // XVP_FAIL
-                Log.Error("XVP Operation Failed");
-                break;
-            case 1:  // XVP_INIT
-                this._rfb_xvp_ver = xvp_ver;
-                Log.Info("XVP extensions enabled (version " + this._rfb_xvp_ver + ")");
-                this._setCapability("power", true);
-                break;
-            default:
-                this._fail("Illegal server XVP message (msg: " + xvp_msg + ")");
-                break;
-        }
-
-        return true;
-    },
-
-    _normal_msg: function () {
-        var msg_type;
-
-        if (this._FBU.rects > 0) {
-            msg_type = 0;
-        } else {
-            msg_type = this._sock.rQshift8();
-        }
-
-        switch (msg_type) {
-            case 0:  // FramebufferUpdate
-                var ret = this._framebufferUpdate();
-                if (ret && !this._enabledContinuousUpdates) {
-                    RFB.messages.fbUpdateRequest(this._sock, true, 0, 0,
-                                                 this._fb_width, this._fb_height);
-                }
-                return ret;
-
-            case 1:  // SetColorMapEntries
-                return this._handle_set_colour_map_msg();
-
-            case 2:  // Bell
-                Log.Debug("Bell");
-                var event = new CustomEvent("bell", { detail: {} });
-                this.dispatchEvent(event);
-                return true;
-
-            case 3:  // ServerCutText
-                return this._handle_server_cut_text();
-
-            case 150: // EndOfContinuousUpdates
-                var first = !(this._supportsContinuousUpdates);
-                this._supportsContinuousUpdates = true;
-                this._enabledContinuousUpdates = false;
-                if (first) {
-                    this._enabledContinuousUpdates = true;
-                    this._updateContinuousUpdates();
-                    Log.Info("Enabling continuous updates.");
-                } else {
-                    // FIXME: We need to send a framebufferupdaterequest here
-                    // if we add support for turning off continuous updates
-                }
-                return true;
-
-            case 248: // ServerFence
-                return this._handle_server_fence_msg();
-
-            case 250:  // XVP
-                return this._handle_xvp_msg();
-
-            default:
-                this._fail("Unexpected server message (type " + msg_type + ")");
-                Log.Debug("sock.rQslice(0, 30): " + this._sock.rQslice(0, 30));
-                return true;
-        }
-    },
-
-    _onFlush: function() {
-        this._flushing = false;
-        // Resume processing
-        if (this._sock.rQlen() > 0) {
-            this._handle_message();
-        }
-    },
-
-    _framebufferUpdate: function () {
-        var ret = true;
-        var now;
-
-        if (this._FBU.rects === 0) {
-            if (this._sock.rQwait("FBU header", 3, 1)) { return false; }
-            this._sock.rQskip8();  // Padding
-            this._FBU.rects = this._sock.rQshift16();
-            this._FBU.bytes = 0;
-            this._timing.cur_fbu = 0;
-            if (this._timing.fbu_rt_start > 0) {
-                now = (new Date()).getTime();
-                Log.Info("First FBU latency: " + (now - this._timing.fbu_rt_start));
-            }
-
-            // Make sure the previous frame is fully rendered first
-            // to avoid building up an excessive queue
-            if (this._display.pending()) {
-                this._flushing = true;
-                this._display.flush();
-                return false;
-            }
-        }
-
-        while (this._FBU.rects > 0) {
-            if (this._rfb_connection_state !== 'connected') { return false; }
-
-            if (this._sock.rQwait("FBU", this._FBU.bytes)) { return false; }
-            if (this._FBU.bytes === 0) {
-                if (this._sock.rQwait("rect header", 12)) { return false; }
-                /* New FramebufferUpdate */
-
-                var hdr = this._sock.rQshiftBytes(12);
-                this._FBU.x        = (hdr[0] << 8) + hdr[1];
-                this._FBU.y        = (hdr[2] << 8) + hdr[3];
-                this._FBU.width    = (hdr[4] << 8) + hdr[5];
-                this._FBU.height   = (hdr[6] << 8) + hdr[7];
-                this._FBU.encoding = parseInt((hdr[8] << 24) + (hdr[9] << 16) +
-                                              (hdr[10] << 8) + hdr[11], 10);
-
-                if (!this._encHandlers[this._FBU.encoding]) {
-                    this._fail("Unsupported encoding (encoding: " +
-                               this._FBU.encoding + ")");
-                    return false;
-                }
-            }
-
-            this._timing.last_fbu = (new Date()).getTime();
-
-            ret = this._encHandlers[this._FBU.encoding]();
-
-            now = (new Date()).getTime();
-            this._timing.cur_fbu += (now - this._timing.last_fbu);
-
-            if (ret) {
-                if (!(this._FBU.encoding in this._encStats)) {
-                    this._encStats[this._FBU.encoding] = [0, 0];
-                }
-                this._encStats[this._FBU.encoding][0]++;
-                this._encStats[this._FBU.encoding][1]++;
-                this._timing.pixels += this._FBU.width * this._FBU.height;
-            }
-
-            if (this._timing.pixels >= (this._fb_width * this._fb_height)) {
-                if ((this._FBU.width === this._fb_width && this._FBU.height === this._fb_height) ||
-                    this._timing.fbu_rt_start > 0) {
-                    this._timing.full_fbu_total += this._timing.cur_fbu;
-                    this._timing.full_fbu_cnt++;
-                    Log.Info("Timing of full FBU, curr: " +
-                              this._timing.cur_fbu + ", total: " +
-                              this._timing.full_fbu_total + ", cnt: " +
-                              this._timing.full_fbu_cnt + ", avg: " +
-                              (this._timing.full_fbu_total / this._timing.full_fbu_cnt));
-                }
-
-                if (this._timing.fbu_rt_start > 0) {
-                    var fbu_rt_diff = now - this._timing.fbu_rt_start;
-                    this._timing.fbu_rt_total += fbu_rt_diff;
-                    this._timing.fbu_rt_cnt++;
-                    Log.Info("full FBU round-trip, cur: " +
-                              fbu_rt_diff + ", total: " +
-                              this._timing.fbu_rt_total + ", cnt: " +
-                              this._timing.fbu_rt_cnt + ", avg: " +
-                              (this._timing.fbu_rt_total / this._timing.fbu_rt_cnt));
-                    this._timing.fbu_rt_start = 0;
-                }
-            }
-
-            if (!ret) { return ret; }  // need more data
-        }
-
-        this._display.flip();
-
-        return true;  // We finished this FBU
-    },
-
-    _updateContinuousUpdates: function() {
-        if (!this._enabledContinuousUpdates) { return; }
-
-        RFB.messages.enableContinuousUpdates(this._sock, true, 0, 0,
-                                             this._fb_width, this._fb_height);
-    },
-
-    _resize: function(width, height) {
-        this._fb_width = width;
-        this._fb_height = height;
-
-        this._destBuff = new Uint8Array(this._fb_width * this._fb_height * 4);
-
-        this._display.resize(this._fb_width, this._fb_height);
-
-        // Adjust the visible viewport based on the new dimensions
-        this._updateClip();
-        this._updateScale();
-
-        this._timing.fbu_rt_start = (new Date()).getTime();
-        this._updateContinuousUpdates();
-    },
-
-    _xvpOp: function (ver, op) {
-        if (this._rfb_xvp_ver < ver) { return; }
-        Log.Info("Sending XVP operation " + op + " (version " + ver + ")");
-        RFB.messages.xvpOp(this._sock, ver, op);
-    },
-};
-
-Object.assign(RFB.prototype, EventTargetMixin);
-
-// Class Methods
-RFB.messages = {
-    keyEvent: function (sock, keysym, down) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 4;  // msg-type
-        buff[offset + 1] = down;
-
-        buff[offset + 2] = 0;
-        buff[offset + 3] = 0;
-
-        buff[offset + 4] = (keysym >> 24);
-        buff[offset + 5] = (keysym >> 16);
-        buff[offset + 6] = (keysym >> 8);
-        buff[offset + 7] = keysym;
-
-        sock._sQlen += 8;
-        sock.flush();
-    },
-
-    QEMUExtendedKeyEvent: function (sock, keysym, down, keycode) {
-        function getRFBkeycode(xt_scancode) {
-            var upperByte = (keycode >> 8);
-            var lowerByte = (keycode & 0x00ff);
-            if (upperByte === 0xe0 && lowerByte < 0x7f) {
-                lowerByte = lowerByte | 0x80;
-                return lowerByte;
-            }
-            return xt_scancode;
-        }
-
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 255; // msg-type
-        buff[offset + 1] = 0; // sub msg-type
-
-        buff[offset + 2] = (down >> 8);
-        buff[offset + 3] = down;
-
-        buff[offset + 4] = (keysym >> 24);
-        buff[offset + 5] = (keysym >> 16);
-        buff[offset + 6] = (keysym >> 8);
-        buff[offset + 7] = keysym;
-
-        var RFBkeycode = getRFBkeycode(keycode);
-
-        buff[offset + 8] = (RFBkeycode >> 24);
-        buff[offset + 9] = (RFBkeycode >> 16);
-        buff[offset + 10] = (RFBkeycode >> 8);
-        buff[offset + 11] = RFBkeycode;
-
-        sock._sQlen += 12;
-        sock.flush();
-    },
-
-    pointerEvent: function (sock, x, y, mask) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 5; // msg-type
-
-        buff[offset + 1] = mask;
-
-        buff[offset + 2] = x >> 8;
-        buff[offset + 3] = x;
-
-        buff[offset + 4] = y >> 8;
-        buff[offset + 5] = y;
-
-        sock._sQlen += 6;
-        sock.flush();
-    },
-
-    // TODO(directxman12): make this unicode compatible?
-    clientCutText: function (sock, text) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 6; // msg-type
-
-        buff[offset + 1] = 0; // padding
-        buff[offset + 2] = 0; // padding
-        buff[offset + 3] = 0; // padding
-
-        var n = text.length;
-
-        buff[offset + 4] = n >> 24;
-        buff[offset + 5] = n >> 16;
-        buff[offset + 6] = n >> 8;
-        buff[offset + 7] = n;
-
-        for (var i = 0; i < n; i++) {
-            buff[offset + 8 + i] =  text.charCodeAt(i);
-        }
-
-        sock._sQlen += 8 + n;
-        sock.flush();
-    },
-
-    setDesktopSize: function (sock, width, height, id, flags) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 251;              // msg-type
-        buff[offset + 1] = 0;            // padding
-        buff[offset + 2] = width >> 8;   // width
-        buff[offset + 3] = width;
-        buff[offset + 4] = height >> 8;  // height
-        buff[offset + 5] = height;
-
-        buff[offset + 6] = 1;            // number-of-screens
-        buff[offset + 7] = 0;            // padding
-
-        // screen array
-        buff[offset + 8] = id >> 24;     // id
-        buff[offset + 9] = id >> 16;
-        buff[offset + 10] = id >> 8;
-        buff[offset + 11] = id;
-        buff[offset + 12] = 0;           // x-position
-        buff[offset + 13] = 0;
-        buff[offset + 14] = 0;           // y-position
-        buff[offset + 15] = 0;
-        buff[offset + 16] = width >> 8;  // width
-        buff[offset + 17] = width;
-        buff[offset + 18] = height >> 8; // height
-        buff[offset + 19] = height;
-        buff[offset + 20] = flags >> 24; // flags
-        buff[offset + 21] = flags >> 16;
-        buff[offset + 22] = flags >> 8;
-        buff[offset + 23] = flags;
-
-        sock._sQlen += 24;
-        sock.flush();
-    },
-
-    clientFence: function (sock, flags, payload) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 248; // msg-type
-
-        buff[offset + 1] = 0; // padding
-        buff[offset + 2] = 0; // padding
-        buff[offset + 3] = 0; // padding
-
-        buff[offset + 4] = flags >> 24; // flags
-        buff[offset + 5] = flags >> 16;
-        buff[offset + 6] = flags >> 8;
-        buff[offset + 7] = flags;
-
-        var n = payload.length;
-
-        buff[offset + 8] = n; // length
-
-        for (var i = 0; i < n; i++) {
-            buff[offset + 9 + i] = payload.charCodeAt(i);
-        }
-
-        sock._sQlen += 9 + n;
-        sock.flush();
-    },
-
-    enableContinuousUpdates: function (sock, enable, x, y, width, height) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 150;             // msg-type
-        buff[offset + 1] = enable;      // enable-flag
-
-        buff[offset + 2] = x >> 8;      // x
-        buff[offset + 3] = x;
-        buff[offset + 4] = y >> 8;      // y
-        buff[offset + 5] = y;
-        buff[offset + 6] = width >> 8;  // width
-        buff[offset + 7] = width;
-        buff[offset + 8] = height >> 8; // height
-        buff[offset + 9] = height;
-
-        sock._sQlen += 10;
-        sock.flush();
-    },
-
-    pixelFormat: function (sock, depth, true_color) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        var bpp, bits;
-
-        if (depth > 16) {
-            bpp = 32;
-        } else if (depth > 8) {
-            bpp = 16;
-        } else {
-            bpp = 8;
-        }
-
-        bits = Math.floor(depth/3);
-
-        buff[offset] = 0;  // msg-type
-
-        buff[offset + 1] = 0; // padding
-        buff[offset + 2] = 0; // padding
-        buff[offset + 3] = 0; // padding
-
-        buff[offset + 4] = bpp;                 // bits-per-pixel
-        buff[offset + 5] = depth;               // depth
-        buff[offset + 6] = 0;                   // little-endian
-        buff[offset + 7] = true_color ? 1 : 0;  // true-color
-
-        buff[offset + 8] = 0;    // red-max
-        buff[offset + 9] = (1 << bits) - 1;  // red-max
-
-        buff[offset + 10] = 0;   // green-max
-        buff[offset + 11] = (1 << bits) - 1; // green-max
-
-        buff[offset + 12] = 0;   // blue-max
-        buff[offset + 13] = (1 << bits) - 1; // blue-max
-
-        buff[offset + 14] = bits * 2; // red-shift
-        buff[offset + 15] = bits * 1; // green-shift
-        buff[offset + 16] = bits * 0; // blue-shift
-
-        buff[offset + 17] = 0;   // padding
-        buff[offset + 18] = 0;   // padding
-        buff[offset + 19] = 0;   // padding
-
-        sock._sQlen += 20;
-        sock.flush();
-    },
-
-    clientEncodings: function (sock, encodings) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 2; // msg-type
-        buff[offset + 1] = 0; // padding
-
-        buff[offset + 2] = encodings.length >> 8;
-        buff[offset + 3] = encodings.length;
-
-        var i, j = offset + 4;
-        for (i = 0; i < encodings.length; i++) {
-            var enc = encodings[i];
-            buff[j] = enc >> 24;
-            buff[j + 1] = enc >> 16;
-            buff[j + 2] = enc >> 8;
-            buff[j + 3] = enc;
-
-            j += 4;
-        }
-
-        sock._sQlen += j - offset;
-        sock.flush();
-    },
-
-    fbUpdateRequest: function (sock, incremental, x, y, w, h) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        if (typeof(x) === "undefined") { x = 0; }
-        if (typeof(y) === "undefined") { y = 0; }
-
-        buff[offset] = 3;  // msg-type
-        buff[offset + 1] = incremental ? 1 : 0;
-
-        buff[offset + 2] = (x >> 8) & 0xFF;
-        buff[offset + 3] = x & 0xFF;
-
-        buff[offset + 4] = (y >> 8) & 0xFF;
-        buff[offset + 5] = y & 0xFF;
-
-        buff[offset + 6] = (w >> 8) & 0xFF;
-        buff[offset + 7] = w & 0xFF;
-
-        buff[offset + 8] = (h >> 8) & 0xFF;
-        buff[offset + 9] = h & 0xFF;
-
-        sock._sQlen += 10;
-        sock.flush();
-    },
-
-    xvpOp: function (sock, ver, op) {
-        var buff = sock._sQ;
-        var offset = sock._sQlen;
-
-        buff[offset] = 250; // msg-type
-        buff[offset + 1] = 0; // padding
-
-        buff[offset + 2] = ver;
-        buff[offset + 3] = op;
-
-        sock._sQlen += 4;
-        sock.flush();
-    },
-};
-
-RFB.genDES = function (password, challenge) {
-    var passwd = [];
-    for (var i = 0; i < password.length; i++) {
-        passwd.push(password.charCodeAt(i));
-    }
-    return (new DES(passwd)).encrypt(challenge);
-};
-
-RFB.encodingHandlers = {
-    RAW: function () {
-        if (this._FBU.lines === 0) {
-            this._FBU.lines = this._FBU.height;
-        }
-
-        var pixelSize = this._fb_depth == 8 ? 1 : 4;
-        this._FBU.bytes = this._FBU.width * pixelSize;  // at least a line
-        if (this._sock.rQwait("RAW", this._FBU.bytes)) { return false; }
-        var cur_y = this._FBU.y + (this._FBU.height - this._FBU.lines);
-        var curr_height = Math.min(this._FBU.lines,
-                                   Math.floor(this._sock.rQlen() / (this._FBU.width * pixelSize)));
-        var data = this._sock.get_rQ();
-        var index = this._sock.get_rQi();
-        if (this._fb_depth == 8) {
-            var pixels = this._FBU.width * curr_height
-            var newdata = new Uint8Array(pixels * 4);
-            var i;
-            for (i = 0;i < pixels;i++) {
-                newdata[i * 4 + 0] = ((data[index + i] >> 0) & 0x3) * 255 / 3;
-                newdata[i * 4 + 1] = ((data[index + i] >> 2) & 0x3) * 255 / 3;
-                newdata[i * 4 + 2] = ((data[index + i] >> 4) & 0x3) * 255 / 3;
-                newdata[i * 4 + 4] = 0;
-            }
-            data = newdata;
-            index = 0;
-        }
-        this._display.blitImage(this._FBU.x, cur_y, this._FBU.width,
-                                curr_height, data, index);
-        this._sock.rQskipBytes(this._FBU.width * curr_height * pixelSize);
-        this._FBU.lines -= curr_height;
-
-        if (this._FBU.lines > 0) {
-            this._FBU.bytes = this._FBU.width * pixelSize;  // At least another line
-        } else {
-            this._FBU.rects--;
-            this._FBU.bytes = 0;
-        }
-
-        return true;
-    },
-
-    COPYRECT: function () {
-        this._FBU.bytes = 4;
-        if (this._sock.rQwait("COPYRECT", 4)) { return false; }
-        this._display.copyImage(this._sock.rQshift16(), this._sock.rQshift16(),
-                                this._FBU.x, this._FBU.y, this._FBU.width,
-                                this._FBU.height);
-
-        this._FBU.rects--;
-        this._FBU.bytes = 0;
-        return true;
-    },
-
-    RRE: function () {
-        var color;
-        if (this._FBU.subrects === 0) {
-            this._FBU.bytes = 4 + 4;
-            if (this._sock.rQwait("RRE", 4 + 4)) { return false; }
-            this._FBU.subrects = this._sock.rQshift32();
-            color = this._sock.rQshiftBytes(4);  // Background
-            this._display.fillRect(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, color);
-        }
-
-        while (this._FBU.subrects > 0 && this._sock.rQlen() >= (4 + 8)) {
-            color = this._sock.rQshiftBytes(4);
-            var x = this._sock.rQshift16();
-            var y = this._sock.rQshift16();
-            var width = this._sock.rQshift16();
-            var height = this._sock.rQshift16();
-            this._display.fillRect(this._FBU.x + x, this._FBU.y + y, width, height, color);
-            this._FBU.subrects--;
-        }
-
-        if (this._FBU.subrects > 0) {
-            var chunk = Math.min(this._rre_chunk_sz, this._FBU.subrects);
-            this._FBU.bytes = (4 + 8) * chunk;
-        } else {
-            this._FBU.rects--;
-            this._FBU.bytes = 0;
-        }
-
-        return true;
-    },
-
-    HEXTILE: function () {
-        var rQ = this._sock.get_rQ();
-        var rQi = this._sock.get_rQi();
-
-        if (this._FBU.tiles === 0) {
-            this._FBU.tiles_x = Math.ceil(this._FBU.width / 16);
-            this._FBU.tiles_y = Math.ceil(this._FBU.height / 16);
-            this._FBU.total_tiles = this._FBU.tiles_x * this._FBU.tiles_y;
-            this._FBU.tiles = this._FBU.total_tiles;
-        }
-
-        while (this._FBU.tiles > 0) {
-            this._FBU.bytes = 1;
-            if (this._sock.rQwait("HEXTILE subencoding", this._FBU.bytes)) { return false; }
-            var subencoding = rQ[rQi];  // Peek
-            if (subencoding > 30) {  // Raw
-                this._fail("Illegal hextile subencoding (subencoding: " +
-                           subencoding + ")");
-                return false;
-            }
-
-            var subrects = 0;
-            var curr_tile = this._FBU.total_tiles - this._FBU.tiles;
-            var tile_x = curr_tile % this._FBU.tiles_x;
-            var tile_y = Math.floor(curr_tile / this._FBU.tiles_x);
-            var x = this._FBU.x + tile_x * 16;
-            var y = this._FBU.y + tile_y * 16;
-            var w = Math.min(16, (this._FBU.x + this._FBU.width) - x);
-            var h = Math.min(16, (this._FBU.y + this._FBU.height) - y);
-
-            // Figure out how much we are expecting
-            if (subencoding & 0x01) {  // Raw
-                this._FBU.bytes += w * h * 4;
-            } else {
-                if (subencoding & 0x02) {  // Background
-                    this._FBU.bytes += 4;
-                }
-                if (subencoding & 0x04) {  // Foreground
-                    this._FBU.bytes += 4;
-                }
-                if (subencoding & 0x08) {  // AnySubrects
-                    this._FBU.bytes++;  // Since we aren't shifting it off
-                    if (this._sock.rQwait("hextile subrects header", this._FBU.bytes)) { return false; }
-                    subrects = rQ[rQi + this._FBU.bytes - 1];  // Peek
-                    if (subencoding & 0x10) {  // SubrectsColoured
-                        this._FBU.bytes += subrects * (4 + 2);
-                    } else {
-                        this._FBU.bytes += subrects * 2;
-                    }
-                }
-            }
-
-            if (this._sock.rQwait("hextile", this._FBU.bytes)) { return false; }
-
-            // We know the encoding and have a whole tile
-            this._FBU.subencoding = rQ[rQi];
-            rQi++;
-            if (this._FBU.subencoding === 0) {
-                if (this._FBU.lastsubencoding & 0x01) {
-                    // Weird: ignore blanks are RAW
-                    Log.Debug("     Ignoring blank after RAW");
-                } else {
-                    this._display.fillRect(x, y, w, h, this._FBU.background);
-                }
-            } else if (this._FBU.subencoding & 0x01) {  // Raw
-                this._display.blitImage(x, y, w, h, rQ, rQi);
-                rQi += this._FBU.bytes - 1;
-            } else {
-                if (this._FBU.subencoding & 0x02) {  // Background
-                    this._FBU.background = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]];
-                    rQi += 4;
-                }
-                if (this._FBU.subencoding & 0x04) {  // Foreground
-                    this._FBU.foreground = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]];
-                    rQi += 4;
-                }
-
-                this._display.startTile(x, y, w, h, this._FBU.background);
-                if (this._FBU.subencoding & 0x08) {  // AnySubrects
-                    subrects = rQ[rQi];
-                    rQi++;
-
-                    for (var s = 0; s < subrects; s++) {
-                        var color;
-                        if (this._FBU.subencoding & 0x10) {  // SubrectsColoured
-                            color = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]];
-                            rQi += 4;
-                        } else {
-                            color = this._FBU.foreground;
-                        }
-                        var xy = rQ[rQi];
-                        rQi++;
-                        var sx = (xy >> 4);
-                        var sy = (xy & 0x0f);
-
-                        var wh = rQ[rQi];
-                        rQi++;
-                        var sw = (wh >> 4) + 1;
-                        var sh = (wh & 0x0f) + 1;
-
-                        this._display.subTile(sx, sy, sw, sh, color);
-                    }
-                }
-                this._display.finishTile();
-            }
-            this._sock.set_rQi(rQi);
-            this._FBU.lastsubencoding = this._FBU.subencoding;
-            this._FBU.bytes = 0;
-            this._FBU.tiles--;
-        }
-
-        if (this._FBU.tiles === 0) {
-            this._FBU.rects--;
-        }
-
-        return true;
-    },
-
-    TIGHT: function () {
-        this._FBU.bytes = 1;  // compression-control byte
-        if (this._sock.rQwait("TIGHT compression-control", this._FBU.bytes)) { return false; }
-
-        var checksum = function (data) {
-            var sum = 0;
-            for (var i = 0; i < data.length; i++) {
-                sum += data[i];
-                if (sum > 65536) sum -= 65536;
-            }
-            return sum;
-        };
-
-        var resetStreams = 0;
-        var streamId = -1;
-        var decompress = function (data, expected) {
-            for (var i = 0; i < 4; i++) {
-                if ((resetStreams >> i) & 1) {
-                    this._FBU.zlibs[i].reset();
-                    Log.Info("Reset zlib stream " + i);
-                }
-            }
-
-            //var uncompressed = this._FBU.zlibs[streamId].uncompress(data, 0);
-            var uncompressed = this._FBU.zlibs[streamId].inflate(data, true, expected);
-            /*if (uncompressed.status !== 0) {
-                Log.Error("Invalid data in zlib stream");
-            }*/
-
-            //return uncompressed.data;
-            return uncompressed;
-        }.bind(this);
-
-        var indexedToRGBX2Color = function (data, palette, width, height) {
-            // Convert indexed (palette based) image data to RGB
-            // TODO: reduce number of calculations inside loop
-            var dest = this._destBuff;
-            var w = Math.floor((width + 7) / 8);
-            var w1 = Math.floor(width / 8);
-
-            /*for (var y = 0; y < height; y++) {
-                var b, x, dp, sp;
-                var yoffset = y * width;
-                var ybitoffset = y * w;
-                var xoffset, targetbyte;
-                for (x = 0; x < w1; x++) {
-                    xoffset = yoffset + x * 8;
-                    targetbyte = data[ybitoffset + x];
-                    for (b = 7; b >= 0; b--) {
-                        dp = (xoffset + 7 - b) * 3;
-                        sp = (targetbyte >> b & 1) * 3;
-                        dest[dp] = palette[sp];
-                        dest[dp + 1] = palette[sp + 1];
-                        dest[dp + 2] = palette[sp + 2];
-                    }
-                }
-
-                xoffset = yoffset + x * 8;
-                targetbyte = data[ybitoffset + x];
-                for (b = 7; b >= 8 - width % 8; b--) {
-                    dp = (xoffset + 7 - b) * 3;
-                    sp = (targetbyte >> b & 1) * 3;
-                    dest[dp] = palette[sp];
-                    dest[dp + 1] = palette[sp + 1];
-                    dest[dp + 2] = palette[sp + 2];
-                }
-            }*/
-
-            for (var y = 0; y < height; y++) {
-                var b, x, dp, sp;
-                for (x = 0; x < w1; x++) {
-                    for (b = 7; b >= 0; b--) {
-                        dp = (y * width + x * 8 + 7 - b) * 4;
-                        sp = (data[y * w + x] >> b & 1) * 3;
-                        dest[dp] = palette[sp];
-                        dest[dp + 1] = palette[sp + 1];
-                        dest[dp + 2] = palette[sp + 2];
-                        dest[dp + 3] = 255;
-                    }
-                }
-
-                for (b = 7; b >= 8 - width % 8; b--) {
-                    dp = (y * width + x * 8 + 7 - b) * 4;
-                    sp = (data[y * w + x] >> b & 1) * 3;
-                    dest[dp] = palette[sp];
-                    dest[dp + 1] = palette[sp + 1];
-                    dest[dp + 2] = palette[sp + 2];
-                    dest[dp + 3] = 255;
-                }
-            }
-
-            return dest;
-        }.bind(this);
-
-        var indexedToRGBX = function (data, palette, width, height) {
-            // Convert indexed (palette based) image data to RGB
-            var dest = this._destBuff;
-            var total = width * height * 4;
-            for (var i = 0, j = 0; i < total; i += 4, j++) {
-                var sp = data[j] * 3;
-                dest[i] = palette[sp];
-                dest[i + 1] = palette[sp + 1];
-                dest[i + 2] = palette[sp + 2];
-                dest[i + 3] = 255;
-            }
-
-            return dest;
-        }.bind(this);
-
-        var rQi = this._sock.get_rQi();
-        var rQ = this._sock.rQwhole();
-        var cmode, data;
-        var cl_header, cl_data;
-
-        var handlePalette = function () {
-            var numColors = rQ[rQi + 2] + 1;
-            var paletteSize = numColors * 3;
-            this._FBU.bytes += paletteSize;
-            if (this._sock.rQwait("TIGHT palette " + cmode, this._FBU.bytes)) { return false; }
-
-            var bpp = (numColors <= 2) ? 1 : 8;
-            var rowSize = Math.floor((this._FBU.width * bpp + 7) / 8);
-            var raw = false;
-            if (rowSize * this._FBU.height < 12) {
-                raw = true;
-                cl_header = 0;
-                cl_data = rowSize * this._FBU.height;
-                //clength = [0, rowSize * this._FBU.height];
-            } else {
-                // begin inline getTightCLength (returning two-item arrays is bad for performance with GC)
-                var cl_offset = rQi + 3 + paletteSize;
-                cl_header = 1;
-                cl_data = 0;
-                cl_data += rQ[cl_offset] & 0x7f;
-                if (rQ[cl_offset] & 0x80) {
-                    cl_header++;
-                    cl_data += (rQ[cl_offset + 1] & 0x7f) << 7;
-                    if (rQ[cl_offset + 1] & 0x80) {
-                        cl_header++;
-                        cl_data += rQ[cl_offset + 2] << 14;
-                    }
-                }
-                // end inline getTightCLength
-            }
-
-            this._FBU.bytes += cl_header + cl_data;
-            if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { return false; }
-
-            // Shift ctl, filter id, num colors, palette entries, and clength off
-            this._sock.rQskipBytes(3);
-            //var palette = this._sock.rQshiftBytes(paletteSize);
-            this._sock.rQshiftTo(this._paletteBuff, paletteSize);
-            this._sock.rQskipBytes(cl_header);
-
-            if (raw) {
-                data = this._sock.rQshiftBytes(cl_data);
-            } else {
-                data = decompress(this._sock.rQshiftBytes(cl_data), rowSize * this._FBU.height);
-            }
-
-            // Convert indexed (palette based) image data to RGB
-            var rgbx;
-            if (numColors == 2) {
-                rgbx = indexedToRGBX2Color(data, this._paletteBuff, this._FBU.width, this._FBU.height);
-                this._display.blitRgbxImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, rgbx, 0, false);
-            } else {
-                rgbx = indexedToRGBX(data, this._paletteBuff, this._FBU.width, this._FBU.height);
-                this._display.blitRgbxImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, rgbx, 0, false);
-            }
-
-
-            return true;
-        }.bind(this);
-
-        var handleCopy = function () {
-            var raw = false;
-            var uncompressedSize = this._FBU.width * this._FBU.height * 3;
-            if (uncompressedSize < 12) {
-                raw = true;
-                cl_header = 0;
-                cl_data = uncompressedSize;
-            } else {
-                // begin inline getTightCLength (returning two-item arrays is for peformance with GC)
-                var cl_offset = rQi + 1;
-                cl_header = 1;
-                cl_data = 0;
-                cl_data += rQ[cl_offset] & 0x7f;
-                if (rQ[cl_offset] & 0x80) {
-                    cl_header++;
-                    cl_data += (rQ[cl_offset + 1] & 0x7f) << 7;
-                    if (rQ[cl_offset + 1] & 0x80) {
-                        cl_header++;
-                        cl_data += rQ[cl_offset + 2] << 14;
-                    }
-                }
-                // end inline getTightCLength
-            }
-            this._FBU.bytes = 1 + cl_header + cl_data;
-            if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { return false; }
-
-            // Shift ctl, clength off
-            this._sock.rQshiftBytes(1 + cl_header);
-
-            if (raw) {
-                data = this._sock.rQshiftBytes(cl_data);
-            } else {
-                data = decompress(this._sock.rQshiftBytes(cl_data), uncompressedSize);
-            }
-
-            this._display.blitRgbImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, data, 0, false);
-
-            return true;
-        }.bind(this);
-
-        var ctl = this._sock.rQpeek8();
-
-        // Keep tight reset bits
-        resetStreams = ctl & 0xF;
-
-        // Figure out filter
-        ctl = ctl >> 4;
-        streamId = ctl & 0x3;
-
-        if (ctl === 0x08)       cmode = "fill";
-        else if (ctl === 0x09)  cmode = "jpeg";
-        else if (ctl === 0x0A)  cmode = "png";
-        else if (ctl & 0x04)    cmode = "filter";
-        else if (ctl < 0x04)    cmode = "copy";
-        else return this._fail("Illegal tight compression received (ctl: " +
-                               ctl + ")");
-
-        switch (cmode) {
-            // fill use depth because TPIXELs drop the padding byte
-            case "fill":  // TPIXEL
-                this._FBU.bytes += 3;
-                break;
-            case "jpeg":  // max clength
-                this._FBU.bytes += 3;
-                break;
-            case "png":  // max clength
-                this._FBU.bytes += 3;
-                break;
-            case "filter":  // filter id + num colors if palette
-                this._FBU.bytes += 2;
-                break;
-            case "copy":
-                break;
-        }
-
-        if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { return false; }
-
-        // Determine FBU.bytes
-        switch (cmode) {
-            case "fill":
-                // skip ctl byte
-                this._display.fillRect(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, [rQ[rQi + 3], rQ[rQi + 2], rQ[rQi + 1]], false);
-                this._sock.rQskipBytes(4);
-                break;
-            case "png":
-            case "jpeg":
-                // begin inline getTightCLength (returning two-item arrays is for peformance with GC)
-                var cl_offset = rQi + 1;
-                cl_header = 1;
-                cl_data = 0;
-                cl_data += rQ[cl_offset] & 0x7f;
-                if (rQ[cl_offset] & 0x80) {
-                    cl_header++;
-                    cl_data += (rQ[cl_offset + 1] & 0x7f) << 7;
-                    if (rQ[cl_offset + 1] & 0x80) {
-                        cl_header++;
-                        cl_data += rQ[cl_offset + 2] << 14;
-                    }
-                }
-                // end inline getTightCLength
-                this._FBU.bytes = 1 + cl_header + cl_data;  // ctl + clength size + jpeg-data
-                if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { return false; }
-
-                // We have everything, render it
-                this._sock.rQskipBytes(1 + cl_header);  // shift off clt + compact length
-                data = this._sock.rQshiftBytes(cl_data);
-                this._display.imageRect(this._FBU.x, this._FBU.y, "image/" + cmode, data);
-                break;
-            case "filter":
-                var filterId = rQ[rQi + 1];
-                if (filterId === 1) {
-                    if (!handlePalette()) { return false; }
-                } else {
-                    // Filter 0, Copy could be valid here, but servers don't send it as an explicit filter
-                    // Filter 2, Gradient is valid but not use if jpeg is enabled
-                    this._fail("Unsupported tight subencoding received " +
-                               "(filter: " + filterId + ")");
-                }
-                break;
-            case "copy":
-                if (!handleCopy()) { return false; }
-                break;
-        }
-
-
-        this._FBU.bytes = 0;
-        this._FBU.rects--;
-
-        return true;
-    },
-
-    last_rect: function () {
-        this._FBU.rects = 0;
-        return true;
-    },
-
-    ExtendedDesktopSize: function () {
-        this._FBU.bytes = 1;
-        if (this._sock.rQwait("ExtendedDesktopSize", this._FBU.bytes)) { return false; }
-
-        var firstUpdate = !this._supportsSetDesktopSize;
-        this._supportsSetDesktopSize = true;
-
-        // Normally we only apply the current resize mode after a
-        // window resize event. However there is no such trigger on the
-        // initial connect. And we don't know if the server supports
-        // resizing until we've gotten here.
-        if (firstUpdate) {
-            this._requestRemoteResize();
-        }
-
-        var number_of_screens = this._sock.rQpeek8();
-
-        this._FBU.bytes = 4 + (number_of_screens * 16);
-        if (this._sock.rQwait("ExtendedDesktopSize", this._FBU.bytes)) { return false; }
-
-        this._sock.rQskipBytes(1);  // number-of-screens
-        this._sock.rQskipBytes(3);  // padding
-
-        for (var i = 0; i < number_of_screens; i += 1) {
-            // Save the id and flags of the first screen
-            if (i === 0) {
-                this._screen_id = this._sock.rQshiftBytes(4);    // id
-                this._sock.rQskipBytes(2);                       // x-position
-                this._sock.rQskipBytes(2);                       // y-position
-                this._sock.rQskipBytes(2);                       // width
-                this._sock.rQskipBytes(2);                       // height
-                this._screen_flags = this._sock.rQshiftBytes(4); // flags
-            } else {
-                this._sock.rQskipBytes(16);
-            }
-        }
-
-        /*
-         * The x-position indicates the reason for the change:
-         *
-         *  0 - server resized on its own
-         *  1 - this client requested the resize
-         *  2 - another client requested the resize
-         */
-
-        // We need to handle errors when we requested the resize.
-        if (this._FBU.x === 1 && this._FBU.y !== 0) {
-            var msg = "";
-            // The y-position indicates the status code from the server
-            switch (this._FBU.y) {
-            case 1:
-                msg = "Resize is administratively prohibited";
-                break;
-            case 2:
-                msg = "Out of resources";
-                break;
-            case 3:
-                msg = "Invalid screen layout";
-                break;
-            default:
-                msg = "Unknown reason";
-                break;
-            }
-            Log.Warn("Server did not accept the resize request: "
-                     + msg);
-        } else {
-            this._resize(this._FBU.width, this._FBU.height);
-        }
-
-        this._FBU.bytes = 0;
-        this._FBU.rects -= 1;
-        return true;
-    },
-
-    DesktopSize: function () {
-        this._resize(this._FBU.width, this._FBU.height);
-        this._FBU.bytes = 0;
-        this._FBU.rects -= 1;
-        return true;
-    },
-
-    Cursor: function () {
-        Log.Debug(">> set_cursor");
-        var x = this._FBU.x;  // hotspot-x
-        var y = this._FBU.y;  // hotspot-y
-        var w = this._FBU.width;
-        var h = this._FBU.height;
-
-        var pixelslength = w * h * 4;
-        var masklength = Math.floor((w + 7) / 8) * h;
-
-        this._FBU.bytes = pixelslength + masklength;
-        if (this._sock.rQwait("cursor encoding", this._FBU.bytes)) { return false; }
-
-        this._display.changeCursor(this._sock.rQshiftBytes(pixelslength),
-                                   this._sock.rQshiftBytes(masklength),
-                                   x, y, w, h);
-
-        this._FBU.bytes = 0;
-        this._FBU.rects--;
-
-        Log.Debug("<< set_cursor");
-        return true;
-    },
-
-    QEMUExtendedKeyEvent: function () {
-        this._FBU.rects--;
-
-        // Old Safari doesn't support creating keyboard events
-        try {
-            var keyboardEvent = document.createEvent("keyboardEvent");
-            if (keyboardEvent.code !== undefined) {
-                this._qemuExtKeyEventSupported = true;
-            }
-        } catch (err) {
-        }
-    },
-};

+ 0 - 69
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/browser.js

@@ -1,69 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-import * as Log from './logging.js';
-
-// Touch detection
-export var isTouchDevice = ('ontouchstart' in document.documentElement) ||
-                                 // requried for Chrome debugger
-                                 (document.ontouchstart !== undefined) ||
-                                 // required for MS Surface
-                                 (navigator.maxTouchPoints > 0) ||
-                                 (navigator.msMaxTouchPoints > 0);
-window.addEventListener('touchstart', function onFirstTouch() {
-    isTouchDevice = true;
-    window.removeEventListener('touchstart', onFirstTouch, false);
-}, false);
-
-var _cursor_uris_supported = null;
-
-export function supportsCursorURIs () {
-    if (_cursor_uris_supported === null) {
-        try {
-            var target = document.createElement('canvas');
-            target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default';
-
-            if (target.style.cursor) {
-                Log.Info("Data URI scheme cursor supported");
-                _cursor_uris_supported = true;
-            } else {
-                Log.Warn("Data URI scheme cursor not supported");
-                _cursor_uris_supported = false;
-            }
-        } catch (exc) {
-            Log.Error("Data URI scheme cursor test exception: " + exc);
-            _cursor_uris_supported = false;
-        }
-    }
-
-    return _cursor_uris_supported;
-};
-
-export function isMac() {
-    return navigator && !!(/mac/i).exec(navigator.platform);
-}
-
-export function isIE() {
-    return navigator && !!(/trident/i).exec(navigator.userAgent);
-}
-
-export function isEdge() {
-    return navigator && !!(/edge/i).exec(navigator.userAgent);
-}
-
-export function isWindows() {
-    return navigator && !!(/win/i).exec(navigator.platform);
-}
-
-export function isIOS() {
-    return navigator &&
-           (!!(/ipad/i).exec(navigator.platform) ||
-            !!(/iphone/i).exec(navigator.platform) ||
-            !!(/ipod/i).exec(navigator.platform));
-}
-

+ 0 - 138
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/events.js

@@ -1,138 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-/*
- * Cross-browser event and position routines
- */
-
-export function getPointerEvent (e) {
-    return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e;
-};
-
-export function stopEvent (e) {
-    e.stopPropagation();
-    e.preventDefault();
-};
-
-// Emulate Element.setCapture() when not supported
-var _captureRecursion = false;
-var _captureElem = null;
-function _captureProxy(e) {
-    // Recursion protection as we'll see our own event
-    if (_captureRecursion) return;
-
-    // Clone the event as we cannot dispatch an already dispatched event
-    var newEv = new e.constructor(e.type, e);
-
-    _captureRecursion = true;
-    _captureElem.dispatchEvent(newEv);
-    _captureRecursion = false;
-
-    // Avoid double events
-    e.stopPropagation();
-
-    // Respect the wishes of the redirected event handlers
-    if (newEv.defaultPrevented) {
-        e.preventDefault();
-    }
-
-    // Implicitly release the capture on button release
-    if (e.type === "mouseup") {
-        releaseCapture();
-    }
-};
-
-// Follow cursor style of target element
-function _captureElemChanged() {
-    var captureElem = document.getElementById("noVNC_mouse_capture_elem");
-    captureElem.style.cursor = window.getComputedStyle(_captureElem).cursor;
-};
-var _captureObserver = new MutationObserver(_captureElemChanged);
-
-var _captureIndex = 0;
-
-export function setCapture (elem) {
-    if (elem.setCapture) {
-
-        elem.setCapture();
-
-        // IE releases capture on 'click' events which might not trigger
-        elem.addEventListener('mouseup', releaseCapture);
-
-    } else {
-        // Release any existing capture in case this method is
-        // called multiple times without coordination
-        releaseCapture();
-
-        var captureElem = document.getElementById("noVNC_mouse_capture_elem");
-
-        if (captureElem === null) {
-            captureElem = document.createElement("div");
-            captureElem.id = "noVNC_mouse_capture_elem";
-            captureElem.style.position = "fixed";
-            captureElem.style.top = "0px";
-            captureElem.style.left = "0px";
-            captureElem.style.width = "100%";
-            captureElem.style.height = "100%";
-            captureElem.style.zIndex = 10000;
-            captureElem.style.display = "none";
-            document.body.appendChild(captureElem);
-
-            // This is to make sure callers don't get confused by having
-            // our blocking element as the target
-            captureElem.addEventListener('contextmenu', _captureProxy);
-
-            captureElem.addEventListener('mousemove', _captureProxy);
-            captureElem.addEventListener('mouseup', _captureProxy);
-        }
-
-        _captureElem = elem;
-        _captureIndex++;
-
-        // Track cursor and get initial cursor
-        _captureObserver.observe(elem, {attributes:true});
-        _captureElemChanged();
-
-        captureElem.style.display = "";
-
-        // We listen to events on window in order to keep tracking if it
-        // happens to leave the viewport
-        window.addEventListener('mousemove', _captureProxy);
-        window.addEventListener('mouseup', _captureProxy);
-    }
-};
-
-export function releaseCapture () {
-    if (document.releaseCapture) {
-
-        document.releaseCapture();
-
-    } else {
-        if (!_captureElem) {
-            return;
-        }
-
-        // There might be events already queued, so we need to wait for
-        // them to flush. E.g. contextmenu in Microsoft Edge
-        window.setTimeout(function(expected) {
-            // Only clear it if it's the expected grab (i.e. no one
-            // else has initiated a new grab)
-            if (_captureIndex === expected) {
-                _captureElem = null;
-            }
-        }, 0, _captureIndex);
-
-        _captureObserver.disconnect();
-
-        var captureElem = document.getElementById("noVNC_mouse_capture_elem");
-        captureElem.style.display = "none";
-
-        window.removeEventListener('mousemove', _captureProxy);
-        window.removeEventListener('mouseup', _captureProxy);
-    }
-};

+ 0 - 40
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/eventtarget.js

@@ -1,40 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright 2017 Pierre Ossman for Cendio AB
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-var EventTargetMixin = {
-    _listeners: null,
-
-   addEventListener: function(type, callback) {
-      if (!this._listeners) {
-         this._listeners = new Map();
-      }
-      if (!this._listeners.has(type)) {
-         this._listeners.set(type, new Set());
-      }
-      this._listeners.get(type).add(callback);
-   },
-
-   removeEventListener: function(type, callback) {
-      if (!this._listeners || !this._listeners.has(type)) {
-         return;
-      }
-      this._listeners.get(type).delete(callback);
-   },
-
-   dispatchEvent: function(event) {
-      if (!this._listeners || !this._listeners.has(event.type)) {
-         return true;
-      }
-      this._listeners.get(event.type).forEach(function (callback) {
-         callback.call(this, event);
-      }, this);
-      return !event.defaultPrevented;
-   },
-};
-
-export default EventTargetMixin;

+ 0 - 51
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/logging.js

@@ -1,51 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-/*
- * Logging/debug routines
- */
-
-var _log_level = 'warn';
-
-var Debug = function (msg) {};
-var Info = function (msg) {};
-var Warn = function (msg) {};
-var Error = function (msg) {};
-
-export function init_logging (level) {
-    if (typeof level === 'undefined') {
-        level = _log_level;
-    } else {
-        _log_level = level;
-    }
-
-    Debug = Info = Warn = Error = function (msg) {};
-    if (typeof window.console !== "undefined") {
-        switch (level) {
-            case 'debug':
-                Debug = console.debug.bind(window.console);
-            case 'info':
-                Info  = console.info.bind(window.console);
-            case 'warn':
-                Warn  = console.warn.bind(window.console);
-            case 'error':
-                Error = console.error.bind(window.console);
-            case 'none':
-                break;
-            default:
-                throw new Error("invalid logging type '" + level + "'");
-        }
-    }
-};
-export function get_logging () {
-    return _log_level;
-};
-export { Debug, Info, Warn, Error };
-
-// Initialize logging level
-init_logging();

+ 0 - 54
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/polyfill.js

@@ -1,54 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright 2017 Pierre Ossman for noVNC
- * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
- */
-
-/* Polyfills to provide new APIs in old browsers */
-
-/* Object.assign() (taken from MDN) */
-if (typeof Object.assign != 'function') {
-    // Must be writable: true, enumerable: false, configurable: true
-    Object.defineProperty(Object, "assign", {
-        value: function assign(target, varArgs) { // .length of function is 2
-            'use strict';
-            if (target == null) { // TypeError if undefined or null
-                throw new TypeError('Cannot convert undefined or null to object');
-            }
-
-            var to = Object(target);
-
-            for (var index = 1; index < arguments.length; index++) {
-                var nextSource = arguments[index];
-
-                if (nextSource != null) { // Skip over if undefined or null
-                    for (var nextKey in nextSource) {
-                        // Avoid bugs when hasOwnProperty is shadowed
-                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
-                            to[nextKey] = nextSource[nextKey];
-                        }
-                    }
-                }
-            }
-            return to;
-        },
-        writable: true,
-        configurable: true
-    });
-}
-
-/* CustomEvent constructor (taken from MDN) */
-(function () {
-    function CustomEvent ( event, params ) {
-        params = params || { bubbles: false, cancelable: false, detail: undefined };
-        var evt = document.createEvent( 'CustomEvent' );
-        evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
-        return evt;
-    }
-
-    CustomEvent.prototype = window.Event.prototype;
-
-    if (typeof window.CustomEvent !== "function") {
-        window.CustomEvent = CustomEvent;
-    }
-})();

+ 0 - 15
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/util/strings.js

@@ -1,15 +0,0 @@
-/*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
-
-/*
- * Decode from UTF-8
- */
-export function decodeUTF8 (utf8string) {
-    "use strict";
-    return decodeURIComponent(escape(utf8string));
-};

+ 0 - 316
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/websock.js

@@ -1,316 +0,0 @@
-/*
- * Websock: high-performance binary WebSockets
- * Copyright (C) 2012 Joel Martin
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * Websock is similar to the standard WebSocket object but with extra
- * buffer handling.
- *
- * Websock has built-in receive queue buffering; the message event
- * does not contain actual data but is simply a notification that
- * there is new data available. Several rQ* methods are available to
- * read binary data off of the receive queue.
- */
-
-import * as Log from './util/logging.js';
-
-export default function Websock() {
-    "use strict";
-
-    this._websocket = null;  // WebSocket object
-
-    this._rQi = 0;           // Receive queue index
-    this._rQlen = 0;         // Next write position in the receive queue
-    this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB)
-    this._rQmax = this._rQbufferSize / 8;
-    // called in init: this._rQ = new Uint8Array(this._rQbufferSize);
-    this._rQ = null; // Receive queue
-
-    this._sQbufferSize = 1024 * 10;  // 10 KiB
-    // called in init: this._sQ = new Uint8Array(this._sQbufferSize);
-    this._sQlen = 0;
-    this._sQ = null;  // Send queue
-
-    this._eventHandlers = {
-        'message': function () {},
-        'open': function () {},
-        'close': function () {},
-        'error': function () {}
-    };
-};
-
-// this has performance issues in some versions Chromium, and
-// doesn't gain a tremendous amount of performance increase in Firefox
-// at the moment.  It may be valuable to turn it on in the future.
-var ENABLE_COPYWITHIN = false;
-
-var MAX_RQ_GROW_SIZE = 40 * 1024 * 1024;  // 40 MiB
-
-var typedArrayToString = (function () {
-    // This is only for PhantomJS, which doesn't like apply-ing
-    // with Typed Arrays
-    try {
-        var arr = new Uint8Array([1, 2, 3]);
-        String.fromCharCode.apply(null, arr);
-        return function (a) { return String.fromCharCode.apply(null, a); };
-    } catch (ex) {
-        return function (a) {
-            return String.fromCharCode.apply(
-                null, Array.prototype.slice.call(a));
-        };
-    }
-})();
-
-Websock.prototype = {
-    // Getters and Setters
-    get_sQ: function () {
-        return this._sQ;
-    },
-
-    get_rQ: function () {
-        return this._rQ;
-    },
-
-    get_rQi: function () {
-        return this._rQi;
-    },
-
-    set_rQi: function (val) {
-        this._rQi = val;
-    },
-
-    // Receive Queue
-    rQlen: function () {
-        return this._rQlen - this._rQi;
-    },
-
-    rQpeek8: function () {
-        return this._rQ[this._rQi];
-    },
-
-    rQshift8: function () {
-        return this._rQ[this._rQi++];
-    },
-
-    rQskip8: function () {
-        this._rQi++;
-    },
-
-    rQskipBytes: function (num) {
-        this._rQi += num;
-    },
-
-    // TODO(directxman12): test performance with these vs a DataView
-    rQshift16: function () {
-        return (this._rQ[this._rQi++] << 8) +
-               this._rQ[this._rQi++];
-    },
-
-    rQshift32: function () {
-        return (this._rQ[this._rQi++] << 24) +
-               (this._rQ[this._rQi++] << 16) +
-               (this._rQ[this._rQi++] << 8) +
-               this._rQ[this._rQi++];
-    },
-
-    rQshiftStr: function (len) {
-        if (typeof(len) === 'undefined') { len = this.rQlen(); }
-        var arr = new Uint8Array(this._rQ.buffer, this._rQi, len);
-        this._rQi += len;
-        return typedArrayToString(arr);
-    },
-
-    rQshiftBytes: function (len) {
-        if (typeof(len) === 'undefined') { len = this.rQlen(); }
-        this._rQi += len;
-        return new Uint8Array(this._rQ.buffer, this._rQi - len, len);
-    },
-
-    rQshiftTo: function (target, len) {
-        if (len === undefined) { len = this.rQlen(); }
-        // TODO: make this just use set with views when using a ArrayBuffer to store the rQ
-        target.set(new Uint8Array(this._rQ.buffer, this._rQi, len));
-        this._rQi += len;
-    },
-
-    rQwhole: function () {
-        return new Uint8Array(this._rQ.buffer, 0, this._rQlen);
-    },
-
-    rQslice: function (start, end) {
-        if (end) {
-            return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start);
-        } else {
-            return new Uint8Array(this._rQ.buffer, this._rQi + start, this._rQlen - this._rQi - start);
-        }
-    },
-
-    // Check to see if we must wait for 'num' bytes (default to FBU.bytes)
-    // to be available in the receive queue. Return true if we need to
-    // wait (and possibly print a debug message), otherwise false.
-    rQwait: function (msg, num, goback) {
-        var rQlen = this._rQlen - this._rQi; // Skip rQlen() function call
-        if (rQlen < num) {
-            if (goback) {
-                if (this._rQi < goback) {
-                    throw new Error("rQwait cannot backup " + goback + " bytes");
-                }
-                this._rQi -= goback;
-            }
-            return true; // true means need more data
-        }
-        return false;
-    },
-
-    // Send Queue
-
-    flush: function () {
-        if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) {
-            this._websocket.send(this._encode_message());
-            this._sQlen = 0;
-        }
-    },
-
-    send: function (arr) {
-        this._sQ.set(arr, this._sQlen);
-        this._sQlen += arr.length;
-        this.flush();
-    },
-
-    send_string: function (str) {
-        this.send(str.split('').map(function (chr) {
-            return chr.charCodeAt(0);
-        }));
-    },
-
-    // Event Handlers
-    off: function (evt) {
-        this._eventHandlers[evt] = function () {};
-    },
-
-    on: function (evt, handler) {
-        this._eventHandlers[evt] = handler;
-    },
-
-    _allocate_buffers: function () {
-        this._rQ = new Uint8Array(this._rQbufferSize);
-        this._sQ = new Uint8Array(this._sQbufferSize);
-    },
-
-    init: function () {
-        this._allocate_buffers();
-        this._rQi = 0;
-        this._websocket = null;
-    },
-
-    open: function (uri, protocols) {
-        var ws_schema = uri.match(/^([a-z]+):\/\//)[1];
-        this.init();
-
-        this._websocket = new WebSocket(uri, protocols);
-        this._websocket.binaryType = 'arraybuffer';
-
-        this._websocket.onmessage = this._recv_message.bind(this);
-        this._websocket.onopen = (function () {
-            Log.Debug('>> WebSock.onopen');
-            if (this._websocket.protocol) {
-                Log.Info("Server choose sub-protocol: " + this._websocket.protocol);
-            }
-
-            this._eventHandlers.open();
-            Log.Debug("<< WebSock.onopen");
-        }).bind(this);
-        this._websocket.onclose = (function (e) {
-            Log.Debug(">> WebSock.onclose");
-            this._eventHandlers.close(e);
-            Log.Debug("<< WebSock.onclose");
-        }).bind(this);
-        this._websocket.onerror = (function (e) {
-            Log.Debug(">> WebSock.onerror: " + e);
-            this._eventHandlers.error(e);
-            Log.Debug("<< WebSock.onerror: " + e);
-        }).bind(this);
-    },
-
-    close: function () {
-        if (this._websocket) {
-            if ((this._websocket.readyState === WebSocket.OPEN) ||
-                    (this._websocket.readyState === WebSocket.CONNECTING)) {
-                Log.Info("Closing WebSocket connection");
-                this._websocket.close();
-            }
-
-            this._websocket.onmessage = function (e) { return; };
-        }
-    },
-
-    // private methods
-    _encode_message: function () {
-        // Put in a binary arraybuffer
-        // according to the spec, you can send ArrayBufferViews with the send method
-        return new Uint8Array(this._sQ.buffer, 0, this._sQlen);
-    },
-
-    _expand_compact_rQ: function (min_fit) {
-        var resizeNeeded = min_fit || this._rQlen - this._rQi > this._rQbufferSize / 2;
-        if (resizeNeeded) {
-            if (!min_fit) {
-                // just double the size if we need to do compaction
-                this._rQbufferSize *= 2;
-            } else {
-                // otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8
-                this._rQbufferSize = (this._rQlen - this._rQi + min_fit) * 8;
-            }
-        }
-
-        // we don't want to grow unboundedly
-        if (this._rQbufferSize > MAX_RQ_GROW_SIZE) {
-            this._rQbufferSize = MAX_RQ_GROW_SIZE;
-            if (this._rQbufferSize - this._rQlen - this._rQi < min_fit) {
-                throw new Exception("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit");
-            }
-        }
-
-        if (resizeNeeded) {
-            var old_rQbuffer = this._rQ.buffer;
-            this._rQmax = this._rQbufferSize / 8;
-            this._rQ = new Uint8Array(this._rQbufferSize);
-            this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi));
-        } else {
-            if (ENABLE_COPYWITHIN) {
-                this._rQ.copyWithin(0, this._rQi);
-            } else {
-                this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi));
-            }
-        }
-
-        this._rQlen = this._rQlen - this._rQi;
-        this._rQi = 0;
-    },
-
-    _decode_message: function (data) {
-        // push arraybuffer values onto the end
-        var u8 = new Uint8Array(data);
-        if (u8.length > this._rQbufferSize - this._rQlen) {
-            this._expand_compact_rQ(u8.length);
-        }
-        this._rQ.set(u8, this._rQlen);
-        this._rQlen += u8.length;
-    },
-
-    _recv_message: function (e) {
-        this._decode_message(e.data);
-        if (this.rQlen() > 0) {
-            this._eventHandlers.message();
-            // Compact the receive queue
-            if (this._rQlen == this._rQi) {
-                this._rQlen = 0;
-                this._rQi = 0;
-            } else if (this._rQlen > this._rQmax) {
-                this._expand_compact_rQ();
-            }
-        } else {
-            Log.Debug("Ignoring empty message");
-        }
-    }
-};

+ 202 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.Apache-2.0

@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.

+ 22 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.BSD-2-Clause

@@ -0,0 +1,22 @@
+Copyright (c) <year>, <copyright holder>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * 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 COPYRIGHT HOLDERS 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 <COPYRIGHT HOLDER> 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.

+ 24 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.BSD-3-Clause

@@ -0,0 +1,24 @@
+Copyright (c) <year>, <copyright holder>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * 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.
+    * Neither the name of the <organization> nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 <COPYRIGHT HOLDER> 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.

+ 621 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.GPL-3

@@ -0,0 +1,621 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS

+ 165 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.LGPL-3

@@ -0,0 +1,165 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.

+ 373 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.MPL-2.0

@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.

+ 91 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/docs/LICENSE.OFL-1.1

@@ -0,0 +1,91 @@
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded, 
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.

Some files were not shown because too many files changed in this diff