parent
7aa61f8e65
commit
cfe38ba0ef
Binary file not shown.
@ -1,171 +0,0 @@ |
||||
//
|
||||
// Copyright (C) 1999 AT&T Laboratories Cambridge. 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; either 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.awt.Button; |
||||
import java.awt.Color; |
||||
import java.awt.Font; |
||||
import java.awt.GridBagConstraints; |
||||
import java.awt.GridBagLayout; |
||||
import java.awt.Insets; |
||||
import java.awt.Label; |
||||
import java.awt.Panel; |
||||
import java.awt.TextField; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
//
|
||||
// The panel which implements the user authentication scheme
|
||||
//
|
||||
|
||||
class AuthPanel extends Panel implements ActionListener { |
||||
|
||||
Label title, retry, prompt; |
||||
TextField password; |
||||
Button ok; |
||||
|
||||
// mslgon support
|
||||
Label promptuser; |
||||
TextField username; |
||||
boolean mslogon = false; |
||||
// mslogon support end
|
||||
|
||||
//
|
||||
// Constructor.
|
||||
//
|
||||
|
||||
// mslgon support 2
|
||||
public AuthPanel(boolean logon) { |
||||
|
||||
mslogon = logon; |
||||
// mslgon support 2 end
|
||||
|
||||
title = new Label("VNC Authentication",Label.CENTER); |
||||
title.setFont(new Font("Helvetica", Font.BOLD, 18)); |
||||
|
||||
prompt = new Label("Password:",Label.CENTER); |
||||
|
||||
password = new TextField(10); |
||||
password.setForeground(Color.black); |
||||
password.setBackground(Color.white); |
||||
password.setEchoChar('*'); |
||||
|
||||
// mslogon support 3
|
||||
|
||||
if (mslogon) { |
||||
promptuser = new Label("Username:",Label.CENTER); |
||||
username = new TextField(10); |
||||
username.setForeground(Color.black); |
||||
username.setBackground(Color.white); |
||||
} |
||||
// mslogon support 3 end
|
||||
|
||||
ok = new Button("OK"); |
||||
|
||||
retry = new Label("",Label.CENTER); |
||||
retry.setFont(new Font("Courier", Font.BOLD, 16)); |
||||
|
||||
|
||||
GridBagLayout gridbag = new GridBagLayout(); |
||||
GridBagConstraints gbc = new GridBagConstraints(); |
||||
|
||||
setLayout(gridbag); |
||||
|
||||
gbc.gridwidth = GridBagConstraints.REMAINDER; |
||||
gridbag.setConstraints(title,gbc); |
||||
add(title); |
||||
|
||||
gbc.fill = GridBagConstraints.HORIZONTAL; |
||||
gridbag.setConstraints(retry,gbc); |
||||
add(retry); |
||||
|
||||
gbc.fill = GridBagConstraints.NONE; |
||||
gbc.gridwidth = 1; |
||||
|
||||
//mslogon support 4
|
||||
|
||||
if (mslogon) { |
||||
gridbag.setConstraints(promptuser,gbc); |
||||
add(promptuser); |
||||
gridbag.setConstraints(username,gbc); |
||||
add(username); |
||||
username.addActionListener(this); |
||||
} |
||||
//mslogon support 4 end
|
||||
|
||||
gridbag.setConstraints(prompt,gbc); |
||||
add(prompt); |
||||
|
||||
gridbag.setConstraints(password,gbc); |
||||
add(password); |
||||
password.addActionListener(this); |
||||
|
||||
gbc.ipady = 10; |
||||
gbc.gridwidth = GridBagConstraints.REMAINDER; |
||||
gbc.fill = GridBagConstraints.BOTH; |
||||
gbc.insets = new Insets(0,20,0,0); |
||||
gbc.ipadx = 40; |
||||
gridbag.setConstraints(ok,gbc); |
||||
add(ok); |
||||
ok.addActionListener(this); |
||||
} |
||||
|
||||
// mslogon support 5
|
||||
public void setmslogon(boolean InfoMsLogon) { |
||||
mslogon = InfoMsLogon; |
||||
} |
||||
|
||||
public void moveFocusToUsernameField() { |
||||
if (mslogon) { username.requestFocus(); } |
||||
else { moveFocusToPasswordField();} |
||||
} |
||||
|
||||
// mslogon support 5 end
|
||||
|
||||
//
|
||||
// Move keyboard focus to the password text field object.
|
||||
//
|
||||
|
||||
public void moveFocusToPasswordField() { |
||||
password.requestFocus(); |
||||
} |
||||
|
||||
//
|
||||
// This method is called when a button is pressed or return is
|
||||
// pressed in the password text field.
|
||||
//
|
||||
|
||||
public synchronized void actionPerformed(ActionEvent evt) { |
||||
if (evt.getSource() == password || evt.getSource() == ok) { |
||||
password.setEnabled(false); |
||||
notify(); |
||||
} |
||||
} |
||||
|
||||
//
|
||||
// retry().
|
||||
//
|
||||
|
||||
public void retry() { |
||||
retry.setText("Sorry. Try again."); |
||||
password.setEnabled(true); |
||||
password.setText(""); |
||||
moveFocusToPasswordField(); |
||||
} |
||||
|
||||
} |
Binary file not shown.
@ -1,172 +0,0 @@ |
||||
// Copyright (C) 2002-2003 Ultr@VNC Team. All Rights Reserved.
|
||||
// Copyright (C) 2004 Kenn Min Chong, John Witchel. All Rights Reserved.
|
||||
// Copyright (C) 2001,2002 HorizonLive.com, Inc. All Rights Reserved.
|
||||
// Copyright (C) 1999 AT&T Laboratories Cambridge. 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; either 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.
|
||||
//
|
||||
|
||||
//
|
||||
// ButtonPanel class implements panel with four buttons in the
|
||||
// VNCViewer desktop window.
|
||||
//
|
||||
|
||||
import java.awt.*; |
||||
import java.awt.event.*; |
||||
import java.io.*; |
||||
|
||||
class ButtonPanel extends Panel implements ActionListener { |
||||
|
||||
VncViewer viewer; |
||||
Button disconnectButton; |
||||
Button optionsButton; |
||||
Button recordButton; |
||||
Button clipboardButton; |
||||
Button ctrlAltDelButton; |
||||
Button refreshButton; |
||||
Button ftpButton; |
||||
|
||||
ButtonPanel(VncViewer v) { |
||||
viewer = v; |
||||
|
||||
setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); |
||||
disconnectButton = new Button("Disconnect"); |
||||
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); |
||||
ftpButton = new Button("File Transfer"); |
||||
ftpButton.setEnabled(false); |
||||
add(ftpButton); |
||||
ftpButton.addActionListener(this); |
||||
} |
||||
|
||||
//
|
||||
// Enable buttons on successful connection.
|
||||
//
|
||||
|
||||
public void enableButtons() { |
||||
disconnectButton.setEnabled(true); |
||||
clipboardButton.setEnabled(true); |
||||
refreshButton.setEnabled(true); |
||||
ftpButton.setEnabled(true); |
||||
} |
||||
|
||||
//
|
||||
// Disable all buttons on disconnect.
|
||||
//
|
||||
|
||||
public void disableButtonsOnDisconnect() { |
||||
remove(disconnectButton); |
||||
disconnectButton = new Button("Hide desktop"); |
||||
disconnectButton.setEnabled(true); |
||||
add(disconnectButton, 0); |
||||
disconnectButton.addActionListener(this); |
||||
|
||||
optionsButton.setEnabled(false); |
||||
clipboardButton.setEnabled(false); |
||||
ctrlAltDelButton.setEnabled(false); |
||||
refreshButton.setEnabled(false); |
||||
ftpButton.setEnabled(false); |
||||
|
||||
validate(); |
||||
} |
||||
|
||||
//
|
||||
// Enable/disable controls that should not be available in view-only
|
||||
// mode.
|
||||
//
|
||||
|
||||
public void enableRemoteAccessControls(boolean enable) { |
||||
ctrlAltDelButton.setEnabled(enable); |
||||
} |
||||
|
||||
//
|
||||
// Event processing.
|
||||
//
|
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
|
||||
viewer.moveFocusToDesktop(); |
||||
|
||||
if (evt.getSource() == disconnectButton) { |
||||
viewer.disconnect(); |
||||
|
||||
} else if (evt.getSource() == optionsButton) { |
||||
viewer.options.setVisible(!viewer.options.isVisible()); |
||||
|
||||
} else if (evt.getSource() == recordButton) { |
||||
viewer.rec.setVisible(!viewer.rec.isVisible()); |
||||
|
||||
} else if (evt.getSource() == clipboardButton) { |
||||
viewer.clipboard.setVisible(!viewer.clipboard.isVisible()); |
||||
|
||||
} else if (evt.getSource() == ctrlAltDelButton) { |
||||
try { |
||||
final int modifiers = InputEvent.CTRL_MASK | InputEvent.ALT_MASK; |
||||
|
||||
KeyEvent ctrlAltDelEvent = |
||||
new KeyEvent(this, KeyEvent.KEY_PRESSED, 0, modifiers, 127); |
||||
viewer.rfb.writeKeyEvent(ctrlAltDelEvent); |
||||
|
||||
ctrlAltDelEvent = |
||||
new KeyEvent(this, KeyEvent.KEY_RELEASED, 0, modifiers, 127); |
||||
viewer.rfb.writeKeyEvent(ctrlAltDelEvent); |
||||
|
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
else if (evt.getSource() == refreshButton) |
||||
{ |
||||
try { |
||||
RfbProto rfb = viewer.rfb; |
||||
rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth, |
||||
rfb.framebufferHeight, false); |
||||
} |
||||
catch (IOException e) |
||||
{ |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
else if (evt.getSource() == ftpButton) |
||||
{ |
||||
viewer.ftp.setVisible(!viewer.ftp.isVisible()); |
||||
viewer.rfb.readServerDriveList(); |
||||
|
||||
} |
||||
} |
||||
} |
||||
|
@ -1,44 +0,0 @@ |
||||
2006-05 UltraVNC Team |
||||
* Improved MS Logon |
||||
* MS Logon weak challenge fixed |
||||
|
||||
2005-01-?? and 2005-02-?? ??:?? Ultr@VNC team |
||||
|
||||
* Made the viewer compilable with Java SDK 1.3 |
||||
* Added support for huge files transfers (> 4Gb) |
||||
* Added more color modes (64 colors, 8 Colors, Grey scales). Default settings |
||||
are now Tight and 64 Colors. |
||||
|
||||
|
||||
2004-11-10 23:00 Ultr@VNC Team |
||||
|
||||
* Prevented the FT GUI to be closed while a transfer is running |
||||
* Made FT GUI window non resizable |
||||
* Added confirmation dialogs for file Deletion and Overwrite |
||||
* Uniformized and cleaned the status/history messages |
||||
* Added "Stop" button |
||||
* Added certificate into the applet |
||||
* Made it compatible with enhanced FT protocole ( >= RC19) |
||||
* The selected pane is more "white" so the user knows to which |
||||
side the buttons apply |
||||
* Directory names are listed first, and are surrounded with |
||||
"[ " and " ]" |
||||
|
||||
2004-08-15 18:00 Ultr@VNC Team |
||||
|
||||
* Added Kenn Min Chong and John Witchel FileTransfer code and GUI |
||||
* Added improvements in FileTransfer code (compression...) and GUI |
||||
|
||||
|
||||
2004-07-05 12:00 Alban Chazot - Carmi Grenoble |
||||
|
||||
* Modified AuthPanel to show username if Ultr@VNC mslogon connection required |
||||
* Modified VncViewer to accept Ultravnc mslogon |
||||
* Modified VncViewer to add scrollPane to applet mode |
||||
|
||||
2002-09-30 12:00 Ultr@VNC Team |
||||
|
||||
* Replaced "TightVNC" with "Ultr@VNC" string in ClipboardFrame.java, |
||||
OptionsFrame.java and VncViewer.java |
||||
|
||||
* Added Ultr@VNC in the .vnc files |
Binary file not shown.
@ -1,133 +0,0 @@ |
||||
//
|
||||
// Copyright (C) 2001 HorizonLive.com, Inc. All Rights Reserved.
|
||||
// Copyright (C) 1999 AT&T Laboratories Cambridge. 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; either 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.
|
||||
//
|
||||
|
||||
//
|
||||
// Clipboard frame.
|
||||
//
|
||||
|
||||
import java.awt.*; |
||||
import java.awt.event.*; |
||||
|
||||
class ClipboardFrame extends Frame |
||||
implements WindowListener, ActionListener { |
||||
|
||||
TextArea textArea; |
||||
Button clearButton, closeButton; |
||||
String selection; |
||||
VncViewer viewer; |
||||
|
||||
//
|
||||
// Constructor.
|
||||
//
|
||||
|
||||
ClipboardFrame(VncViewer v) { |
||||
super("Ultr@VNC Clipboard"); |
||||
|
||||
viewer = v; |
||||
|
||||
GridBagLayout gridbag = new GridBagLayout(); |
||||
setLayout(gridbag); |
||||
|
||||
GridBagConstraints gbc = new GridBagConstraints(); |
||||
gbc.gridwidth = GridBagConstraints.REMAINDER; |
||||
gbc.fill = GridBagConstraints.BOTH; |
||||
gbc.weighty = 1.0; |
||||
|
||||
textArea = new TextArea(5, 40); |
||||
gridbag.setConstraints(textArea, gbc); |
||||
add(textArea); |
||||
|
||||
gbc.fill = GridBagConstraints.HORIZONTAL; |
||||
gbc.weightx = 1.0; |
||||
gbc.weighty = 0.0; |
||||
gbc.gridwidth = 1; |
||||
|
||||
clearButton = new Button("Clear"); |
||||
gridbag.setConstraints(clearButton, gbc); |
||||
add(clearButton); |
||||
clearButton.addActionListener(this); |
||||
|
||||
closeButton = new Button("Close"); |
||||
gridbag.setConstraints(closeButton, gbc); |
||||
add(closeButton); |
||||
closeButton.addActionListener(this); |
||||
|
||||
pack(); |
||||
|
||||
addWindowListener(this); |
||||
} |
||||
|
||||
|
||||
//
|
||||
// Set the cut text from the RFB server.
|
||||
//
|
||||
|
||||
void setCutText(String text) { |
||||
selection = text; |
||||
textArea.setText(text); |
||||
if (isVisible()) { |
||||
textArea.selectAll(); |
||||
} |
||||
} |
||||
|
||||
|
||||
//
|
||||
// When the focus leaves the window, see if we have new cut text and
|
||||
// if so send it to the RFB server.
|
||||
//
|
||||
|
||||
public void windowDeactivated (WindowEvent evt) { |
||||
if (selection != null && !selection.equals(textArea.getText())) { |
||||
selection = textArea.getText(); |
||||
viewer.setCutText(selection); |
||||
} |
||||
} |
||||
|
||||
//
|
||||
// Close our window properly.
|
||||
//
|
||||
|
||||
public void windowClosing(WindowEvent evt) { |
||||
setVisible(false); |
||||
} |
||||
|
||||
//
|
||||
// Ignore window events we're not interested in.
|
||||
//
|
||||
|
||||
public void windowActivated(WindowEvent evt) {} |
||||
public void windowOpened(WindowEvent evt) {} |
||||
public void windowClosed(WindowEvent evt) {} |
||||
public void windowIconified(WindowEvent evt) {} |
||||
public void windowDeiconified(WindowEvent evt) {} |
||||
|
||||
|
||||
//
|
||||
// Respond to button presses
|
||||
//
|
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
if (evt.getSource() == clearButton) { |
||||
textArea.setText(""); |
||||
} else if (evt.getSource() == closeButton) { |
||||
setVisible(false); |
||||
} |
||||
} |
||||
} |
Binary file not shown.
@ -1,14 +0,0 @@ |
||||
|
||||
public class ConfigClientBean { |
||||
|
||||
boolean shareDesktop = true; |
||||
|
||||
public boolean isShareDesktop() { |
||||
return shareDesktop; |
||||
} |
||||
|
||||
public void setShareDesktop(boolean shareDesktop) { |
||||
this.shareDesktop = shareDesktop; |
||||
} |
||||
|
||||
} |
Binary file not shown.
@ -1,182 +0,0 @@ |
||||
// CRYPTO LIBRARY FOR EXCHANGING KEYS
|
||||
// USING THE DIFFIE-HELLMAN KEY EXCHANGE PROTOCOL
|
||||
|
||||
// The diffie-hellman can be used to securely exchange keys
|
||||
// between parties, where a third party eavesdropper given
|
||||
// the values being transmitted cannot determine the key.
|
||||
|
||||
// Implemented by Lee Griffiths, Jan 2004.
|
||||
// This software is freeware, you may use it to your discretion,
|
||||
// however by doing so you take full responsibility for any damage
|
||||
// it may cause.
|
||||
|
||||
// Hope you find it useful, even if you just use some of the functions
|
||||
// out of it like the prime number generator and the XtoYmodN function.
|
||||
|
||||
// It would be great if you could send me emails to: lee.griffiths@first4internet.co.uk
|
||||
// with any suggestions, comments, or questions!
|
||||
|
||||
// Enjoy.
|
||||
|
||||
// Adopted to ms-logon for ultravnc and ported to Java by marscha, 2006.
|
||||
|
||||
//import java.lang.Math;
|
||||
|
||||
public class DH { |
||||
|
||||
public DH() { |
||||
maxNum = (((long) 1) << DH_MAX_BITS) - 1; |
||||
} |
||||
|
||||
public DH(long generator, long modulus) throws Exception { |
||||
maxNum = (((long) 1) << DH_MAX_BITS) - 1; |
||||
if (generator >= maxNum || modulus >= maxNum) |
||||
throw new Exception("Modulus or generator too large."); |
||||
gen = generator; |
||||
mod = modulus; |
||||
} |
||||
|
||||
private long rng(long limit) { |
||||
return (long) (java.lang.Math.random() * limit); |
||||
} |
||||
|
||||
//Performs the miller-rabin primality test on a guessed prime n.
|
||||
//trials is the number of attempts to verify this, because the function
|
||||
//is not 100% accurate it may be a composite. However setting the trial
|
||||
//value to around 5 should guarantee success even with very large primes
|
||||
private boolean millerRabin (long n, int trials) { |
||||
long a = 0; |
||||
|
||||
for (int i = 0; i < trials; i++) { |
||||
a = rng(n - 3) + 2;// gets random value in [2..n-1]
|
||||
if (XpowYmodN(a, n - 1, n) != 1) return false; //n composite, return false
|
||||
} |
||||
return true; // n probably prime
|
||||
} |
||||
|
||||
//Generates a large prime number by
|
||||
//choosing a randomly large integer, and ensuring the value is odd
|
||||
//then uses the miller-rabin primality test on it to see if it is prime
|
||||
//if not the value gets increased until it is prime
|
||||
private long generatePrime() { |
||||
long prime = 0; |
||||
|
||||
do { |
||||
long start = rng(maxNum); |
||||
prime = tryToGeneratePrime(start); |
||||
} while (prime == 0); |
||||
return prime; |
||||
} |
||||
|
||||
private long tryToGeneratePrime(long prime) { |
||||
//ensure it is an odd number
|
||||
if ((prime & 1) == 0) |
||||
prime += 1; |
||||
|
||||
long cnt = 0; |
||||
while (!millerRabin(prime, 25) && (cnt++ < DH_RANGE) && prime < maxNum) { |
||||
prime += 2; |
||||
if ((prime % 3) == 0) prime += 2; |
||||
} |
||||
return (cnt >= DH_RANGE || prime >= maxNum) ? 0 : prime; |
||||
} |
||||
|
||||
//Raises X to the power Y in modulus N
|
||||
//the values of X, Y, and N can be massive, and this can be
|
||||
//achieved by first calculating X to the power of 2 then
|
||||
//using power chaining over modulus N
|
||||
private long XpowYmodN(long x, long y, long N) { |
||||
long result = 1; |
||||
final long oneShift63 = ((long) 1) << 63; |
||||
|
||||
for (int i = 0; i < 64; y <<= 1, i++){ |
||||
result = result * result % N; |
||||
if ((y & oneShift63) != 0) |
||||
result = result * x % N; |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
public void createKeys() { |
||||
gen = generatePrime(); |
||||
mod = generatePrime(); |
||||
|
||||
if (gen > mod) { |
||||
long swap = gen; |
||||
gen = mod; |
||||
mod = swap; |
||||
} |
||||
} |
||||
|
||||
public long createInterKey() { |
||||
priv = rng(maxNum); |
||||
return pub = XpowYmodN(gen,priv,mod); |
||||
} |
||||
|
||||
public long createEncryptionKey(long interKey) throws Exception { |
||||
if (interKey >= maxNum){ |
||||
throw new Exception("interKey too large"); |
||||
} |
||||
return key = XpowYmodN(interKey,priv,mod); |
||||
} |
||||
|
||||
|
||||
public long getValue(int flags) { |
||||
switch (flags) { |
||||
case DH_MOD: |
||||
return mod; |
||||
case DH_GEN: |
||||
return gen; |
||||
case DH_PRIV: |
||||
return priv; |
||||
case DH_PUB: |
||||
return pub; |
||||
case DH_KEY: |
||||
return key; |
||||
default: |
||||
return (long) 0; |
||||
} |
||||
} |
||||
|
||||
public int bits(long number){ |
||||
for (int i = 0; i < 64; i++){ |
||||
number /= 2; |
||||
if (number < 2) return i; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
public static byte[] longToBytes(long number) { |
||||
byte[] bytes = new byte[8]; |
||||
for (int i = 0; i < 8; i++) { |
||||
bytes[i] = (byte) (0xff & (number >> (8 * (7 - i)))); |
||||
} |
||||
return bytes; |
||||
} |
||||
|
||||
public static long bytesToLong(byte[] bytes) { |
||||
long result = 0; |
||||
for (int i = 0; i < 8; i++) { |
||||
result <<= 8; |
||||
result += (byte) bytes[i]; |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
private long gen; |
||||
private long mod; |
||||
private long priv; |
||||
private long pub; |
||||
private long key; |
||||
private long maxNum; |
||||
|
||||
private static final int DH_MAX_BITS = 31; |
||||
private static final int DH_RANGE = 100; |
||||
|
||||
private static final int DH_MOD = 1; |
||||
private static final int DH_GEN = 2; |
||||
private static final int DH_PRIV = 3; |
||||
private static final int DH_PUB = 4; |
||||
private static final int DH_KEY = 5; |
||||
|
||||
} |
Binary file not shown.
@ -1,524 +0,0 @@ |
||||
//
|
||||
// This DES class has been extracted from package Acme.Crypto for use in VNC.
|
||||
// The bytebit[] array has been reversed so that the most significant bit
|
||||
// in each byte of the key is ignored, not the least significant. Also the
|
||||
// unnecessary odd parity code has been removed.
|
||||
//
|
||||
// These changes are:
|
||||
// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
||||
//
|
||||
// This software is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
|
||||
// DesCipher - the DES encryption method
|
||||
//
|
||||
// The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
|
||||
//
|
||||
// Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
|
||||
//
|
||||
// Permission to use, copy, modify, and distribute this software
|
||||
// and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
|
||||
// without fee is hereby granted, provided that this copyright notice is kept
|
||||
// intact.
|
||||
//
|
||||
// WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
|
||||
// OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
// PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
|
||||
// FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
|
||||
// DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
|
||||
//
|
||||
// THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
|
||||
// CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
|
||||
// PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
|
||||
// NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
|
||||
// SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
|
||||
// SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
|
||||
// PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP
|
||||
// SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
|
||||
// HIGH RISK ACTIVITIES.
|
||||
//
|
||||
//
|
||||
// The rest is:
|
||||
//
|
||||
// Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
// 1. Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// 2. Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
// SUCH DAMAGE.
|
||||
//
|
||||
// Visit the ACME Labs Java page for up-to-date versions of this and other
|
||||
// fine Java utilities: http://www.acme.com/java/
|
||||
|
||||
|
||||
//import java.io.*;
|
||||
|
||||
/// The DES encryption method.
|
||||
// <P>
|
||||
// This is surprisingly fast, for pure Java. On a SPARC 20, wrapped
|
||||
// in Acme.Crypto.EncryptedOutputStream or Acme.Crypto.EncryptedInputStream,
|
||||
// it does around 7000 bytes/second.
|
||||
// <P>
|
||||
// Most of this code is by Dave Zimmerman <dzimm@widget.com>, and is
|
||||
// Copyright (c) 1996 Widget Workshop, Inc. See the source file for details.
|
||||
// <P>
|
||||
// <A HREF="/resources/classes/Acme/Crypto/DesCipher.java">Fetch the software.</A><BR>
|
||||
// <A HREF="/resources/classes/Acme.tar.Z">Fetch the entire Acme package.</A>
|
||||
// <P>
|
||||
// @see Des3Cipher
|
||||
// @see EncryptedOutputStream
|
||||
// @see EncryptedInputStream
|
||||
|
||||
public class DesCipher |
||||
{ |
||||
|
||||
// Constructor, byte-array key.
|
||||
public DesCipher( byte[] key ) |
||||
{ |
||||
setKey( key ); |
||||
} |
||||
|
||||
// Key routines.
|
||||
|
||||
private int[] encryptKeys = new int[32]; |
||||
private int[] decryptKeys = new int[32]; |
||||
|
||||
/// Set the key.
|
||||
public void setKey( byte[] key ) |
||||
{ |
||||
deskey( key, true, encryptKeys ); |
||||
deskey( key, false, decryptKeys ); |
||||
} |
||||
|
||||
// Turn an 8-byte key into internal keys.
|
||||
private void deskey( byte[] keyBlock, boolean encrypting, int[] KnL ) |
||||
{ |
||||
int i, j, l, m, n; |
||||
int[] pc1m = new int[56]; |
||||
int[] pcr = new int[56]; |
||||
int[] kn = new int[32]; |
||||
|
||||
for ( j = 0; j < 56; ++j ) |
||||
{ |
||||
l = pc1[j]; |
||||
m = l & 07; |
||||
pc1m[j] = ( (keyBlock[l >>> 3] & bytebit[m]) != 0 )? 1: 0; |
||||
} |
||||
|
||||
for ( i = 0; i < 16; ++i ) |
||||
{ |
||||
if ( encrypting ) |
||||
m = i << 1; |
||||
else |
||||
m = (15-i) << 1; |
||||
n = m+1; |
||||
kn[m] = kn[n] = 0; |
||||
for ( j = 0; j < 28; ++j ) |
||||
{ |
||||
l = j+totrot[i]; |
||||
if ( l < 28 ) |
||||
pcr[j] = pc1m[l]; |
||||
else |
||||
pcr[j] = pc1m[l-28]; |
||||
} |
||||
for ( j=28; j < 56; ++j ) |
||||
{ |
||||
l = j+totrot[i]; |
||||
if ( l < 56 ) |
||||
pcr[j] = pc1m[l]; |
||||
else |
||||
pcr[j] = pc1m[l-28]; |
||||
} |
||||
for ( j = 0; j < 24; ++j ) |
||||
{ |
||||
if ( pcr[pc2[j]] != 0 ) |
||||
kn[m] |= bigbyte[j]; |
||||
if ( pcr[pc2[j+24]] != 0 ) |
||||
kn[n] |= bigbyte[j]; |
||||
} |
||||
} |
||||
cookey( kn, KnL ); |
||||
} |
||||
|
||||
private void cookey( int[] raw, int KnL[] ) |
||||
{ |
||||
int raw0, raw1; |
||||
int rawi, KnLi; |
||||
int i; |
||||
|
||||
for ( i = 0, rawi = 0, KnLi = 0; i < 16; ++i ) |
||||
{ |
||||
raw0 = raw[rawi++]; |
||||
raw1 = raw[rawi++]; |
||||
KnL[KnLi] = (raw0 & 0x00fc0000) << 6; |
||||
KnL[KnLi] |= (raw0 & 0x00000fc0) << 10; |
||||
KnL[KnLi] |= (raw1 & 0x00fc0000) >>> 10; |
||||
KnL[KnLi] |= (raw1 & 0x00000fc0) >>> 6; |
||||
++KnLi; |
||||
KnL[KnLi] = (raw0 & 0x0003f000) << 12; |
||||
KnL[KnLi] |= (raw0 & 0x0000003f) << 16; |
||||
KnL[KnLi] |= (raw1 & 0x0003f000) >>> 4; |
||||
KnL[KnLi] |= (raw1 & 0x0000003f); |
||||
++KnLi; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Block encryption routines.
|
||||
|
||||
private int[] tempInts = new int[2]; |
||||
|
||||
/// Encrypt a block of eight bytes.
|
||||
public void encrypt( byte[] clearText, int clearOff, byte[] cipherText, int cipherOff ) |
||||
{ |
||||
squashBytesToInts( clearText, clearOff, tempInts, 0, 2 ); |
||||
des( tempInts, tempInts, encryptKeys ); |
||||
spreadIntsToBytes( tempInts, 0, cipherText, cipherOff, 2 ); |
||||
} |
||||
|
||||
/// Decrypt a block of eight bytes.
|
||||
public void decrypt( byte[] cipherText, int cipherOff, byte[] clearText, int clearOff ) |
||||
{ |
||||
squashBytesToInts( cipherText, cipherOff, tempInts, 0, 2 ); |
||||
des( tempInts, tempInts, decryptKeys ); |
||||
spreadIntsToBytes( tempInts, 0, clearText, clearOff, 2 ); |
||||
} |
||||
|
||||
// Encrypt a text which is a multiple of 8 bytes.
|
||||
public void encryptText( byte[] clearText, byte[] cipherText, byte[] key) { |
||||
int i, j; |
||||
|
||||
for (i = 0; i< 8; i++) |
||||
clearText[i] ^= key[i]; |
||||
encrypt(clearText, 0, cipherText, 0); |
||||
for (i = 8; i < clearText.length; i += 8) { |
||||
for (j = 0; j < 8; j++) |
||||
clearText[i + j] ^= cipherText[i + j - 8]; |
||||
encrypt(clearText, i, cipherText, i); |
||||
} |
||||
} |
||||
|
||||
// Decrypt a text which is a multiple of 8 bytes.
|
||||
public void decryptText( byte[] cipherText, byte[] clearText, byte[] key) { |
||||
int i, j; |
||||
for (i = cipherText.length - 8; i > 0; i -= 8) { |
||||
decrypt(cipherText, i, clearText, i); |
||||
for (j = 0; j < 8; j++) |
||||
clearText[i + j] ^= cipherText[i + j - 8]; |
||||
} |
||||
/* i = 0 */ |
||||
decrypt(cipherText, 0, clearText, 0); |
||||
for (i = 0; i < 8; i++) |
||||
clearText[i] ^= key[i]; |
||||
} |
||||
|
||||
// The DES function.
|
||||
private void des( int[] inInts, int[] outInts, int[] keys ) |
||||
{ |
||||
int fval, work, right, leftt; |
||||
int round; |
||||
int keysi = 0; |
||||
|
||||
leftt = inInts[0]; |
||||
right = inInts[1]; |
||||
|
||||
work = ((leftt >>> 4) ^ right) & 0x0f0f0f0f; |
||||
right ^= work; |
||||
leftt ^= (work << 4); |
||||
|
||||
work = ((leftt >>> 16) ^ right) & 0x0000ffff; |
||||
right ^= work; |
||||
leftt ^= (work << 16); |
||||
|
||||
work = ((right >>> 2) ^ leftt) & 0x33333333; |
||||
leftt ^= work; |
||||
right ^= (work << 2); |
||||
|
||||
work = ((right >>> 8) ^ leftt) & 0x00ff00ff; |
||||
leftt ^= work; |
||||
right ^= (work << 8); |
||||
right = (right << 1) | ((right >>> 31) & 1); |
||||
|
||||
work = (leftt ^ right) & 0xaaaaaaaa; |
||||
leftt ^= work; |
||||
right ^= work; |
||||
leftt = (leftt << 1) | ((leftt >>> 31) & 1); |
||||
|
||||
for ( round = 0; round < 8; ++round ) |
||||
{ |
||||
work = (right << 28) | (right >>> 4); |
||||
work ^= keys[keysi++]; |
||||
fval = SP7[ work & 0x0000003f ]; |
||||
fval |= SP5[(work >>> 8) & 0x0000003f ]; |
||||
fval |= SP3[(work >>> 16) & 0x0000003f ]; |
||||
fval |= SP1[(work >>> 24) & 0x0000003f ]; |
||||
work = right ^ keys[keysi++]; |
||||
fval |= SP8[ work & 0x0000003f ]; |
||||
fval |= SP6[(work >>> 8) & 0x0000003f ]; |
||||
fval |= SP4[(work >>> 16) & 0x0000003f ]; |
||||
fval |= SP2[(work >>> 24) & 0x0000003f ]; |
||||
leftt ^= fval; |
||||
work = (leftt << 28) | (leftt >>> 4); |
||||
work ^= keys[keysi++]; |
||||
fval = SP7[ work & 0x0000003f ]; |
||||
fval |= SP5[(work >>> 8) & 0x0000003f ]; |
||||
fval |= SP3[(work >>> 16) & 0x0000003f ]; |
||||
fval |= SP1[(work >>> 24) & 0x0000003f ]; |
||||
work = leftt ^ keys[keysi++]; |
||||
fval |= SP8[ work & 0x0000003f ]; |
||||
fval |= SP6[(work >>> 8) & 0x0000003f ]; |
||||
fval |= SP4[(work >>> 16) & 0x0000003f ]; |
||||
fval |= SP2[(work >>> 24) & 0x0000003f ]; |
||||
right ^= fval; |
||||
} |
||||
|
||||
right = (right << 31) | (right >>> 1); |
||||
work = (leftt ^ right) & 0xaaaaaaaa; |
||||
leftt ^= work; |
||||
right ^= work; |
||||
leftt = (leftt << 31) | (leftt >>> 1); |
||||
work = ((leftt >>> 8) ^ right) & 0x00ff00ff; |
||||
right ^= work; |
||||
leftt ^= (work << 8); |
||||
work = ((leftt >>> 2) ^ right) & 0x33333333; |
||||
right ^= work; |
||||
leftt ^= (work << 2); |
||||
work = ((right >>> 16) ^ leftt) & 0x0000ffff; |
||||
leftt ^= work; |
||||
right ^= (work << 16); |
||||
work = ((right >>> 4) ^ leftt) & 0x0f0f0f0f; |
||||
leftt ^= work; |
||||
right ^= (work << 4); |
||||
outInts[0] = right; |
||||
outInts[1] = leftt; |
||||
} |
||||
|
||||
|
||||
// Tables, permutations, S-boxes, etc.
|
||||
|
||||
private static byte[] bytebit = { |
||||
(byte)0x01, (byte)0x02, (byte)0x04, (byte)0x08, |
||||
(byte)0x10, (byte)0x20, (byte)0x40, (byte)0x80 |
||||
}; |
||||
private static int[] bigbyte = { |
||||
0x800000, 0x400000, 0x200000, 0x100000, |
||||
0x080000, 0x040000, 0x020000, 0x010000, |
||||
0x008000, 0x004000, 0x002000, 0x001000, |
||||
0x000800, 0x000400, 0x000200, 0x000100, |
||||
0x000080, 0x000040, 0x000020, 0x000010, |
||||
0x000008, 0x000004, 0x000002, 0x000001 |
||||
}; |
||||
private static byte[] pc1 = { |
||||
(byte)56, (byte)48, (byte)40, (byte)32, (byte)24, (byte)16, (byte) 8, |
||||
(byte) 0, (byte)57, (byte)49, (byte)41, (byte)33, (byte)25, (byte)17, |
||||
(byte) 9, (byte) 1, (byte)58, (byte)50, (byte)42, (byte)34, (byte)26, |
||||
(byte)18, (byte)10, (byte) 2, (byte)59, (byte)51, (byte)43, (byte)35, |
||||
(byte)62, (byte)54, (byte)46, (byte)38, (byte)30, (byte)22, (byte)14, |
||||
(byte) 6, (byte)61, (byte)53, (byte)45, (byte)37, (byte)29, (byte)21, |
||||
(byte)13, (byte) 5, (byte)60, (byte)52, (byte)44, (byte)36, (byte)28, |
||||
(byte)20, (byte)12, (byte) 4, (byte)27, (byte)19, (byte)11, (byte)3 |
||||
}; |
||||
private static int[] totrot = { |
||||
1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 |
||||
}; |
||||
|
||||
private static byte[] pc2 = { |
||||
(byte)13, (byte)16, (byte)10, (byte)23, (byte) 0, (byte) 4, |
||||
(byte) 2, (byte)27, (byte)14, (byte) 5, (byte)20, (byte) 9, |
||||
(byte)22, (byte)18, (byte)11, (byte)3 , (byte)25, (byte) 7, |
||||
(byte)15, (byte) 6, (byte)26, (byte)19, (byte)12, (byte) 1, |
||||
(byte)40, (byte)51, (byte)30, (byte)36, (byte)46, (byte)54, |
||||
(byte)29, (byte)39, (byte)50, (byte)44, (byte)32, (byte)47, |
||||
(byte)43, (byte)48, (byte)38, (byte)55, (byte)33, (byte)52, |
||||
(byte)45, (byte)41, (byte)49, (byte)35, (byte)28, (byte)31, |
||||
}; |
||||
|
||||
private static int[] SP1 = { |
||||
0x01010400, 0x00000000, 0x00010000, 0x01010404, |
||||
0x01010004, 0x00010404, 0x00000004, 0x00010000, |
||||
0x00000400, 0x01010400, 0x01010404, 0x00000400, |
||||
0x01000404, 0x01010004, 0x01000000, 0x00000004, |
||||
0x00000404, 0x01000400, 0x01000400, 0x00010400, |
||||
0x00010400, 0x01010000, 0x01010000, 0x01000404, |
||||
0x00010004, 0x01000004, 0x01000004, 0x00010004, |
||||
0x00000000, 0x00000404, 0x00010404, 0x01000000, |
||||
0x00010000, 0x01010404, 0x00000004, 0x01010000, |
||||
0x01010400, 0x01000000, 0x01000000, 0x00000400, |
||||
0x01010004, 0x00010000, 0x00010400, 0x01000004, |
||||
0x00000400, 0x00000004, 0x01000404, 0x00010404, |
||||
0x01010404, 0x00010004, 0x01010000, 0x01000404, |
||||
0x01000004, 0x00000404, 0x00010404, 0x01010400, |
||||
0x00000404, 0x01000400, 0x01000400, 0x00000000, |
||||
0x00010004, 0x00010400, 0x00000000, 0x01010004 |
||||
}; |
||||
private static int[] SP2 = { |
||||
0x80108020, 0x80008000, 0x00008000, 0x00108020, |
||||
0x00100000, 0x00000020, 0x80100020, 0x80008020, |
||||
0x80000020, 0x80108020, 0x80108000, 0x80000000, |
||||
0x80008000, 0x00100000, 0x00000020, 0x80100020, |
||||
0x00108000, 0x00100020, 0x80008020, 0x00000000, |
||||
0x80000000, 0x00008000, 0x00108020, 0x80100000, |
||||
0x00100020, 0x80000020, 0x00000000, 0x00108000, |
||||
0x00008020, 0x80108000, 0x80100000, 0x00008020, |
||||
0x00000000, 0x00108020, 0x80100020, 0x00100000, |
||||
0x80008020, 0x80100000, 0x80108000, 0x00008000, |
||||
0x80100000, 0x80008000, 0x00000020, 0x80108020, |
||||
0x00108020, 0x00000020, 0x00008000, 0x80000000, |
||||
0x00008020, 0x80108000, 0x00100000, 0x80000020, |
||||
0x00100020, 0x80008020, 0x80000020, 0x00100020, |
||||
0x00108000, 0x00000000, 0x80008000, 0x00008020, |
||||
0x80000000, 0x80100020, 0x80108020, 0x00108000 |
||||
}; |
||||
private static int[] SP3 = { |
||||
0x00000208, 0x08020200, 0x00000000, 0x08020008, |
||||
0x08000200, 0x00000000, 0x00020208, 0x08000200, |
||||
0x00020008, 0x08000008, 0x08000008, 0x00020000, |
||||
0x08020208, 0x00020008, 0x08020000, 0x00000208, |
||||
0x08000000, 0x00000008, 0x08020200, 0x00000200, |
||||
0x00020200, 0x08020000, 0x08020008, 0x00020208, |
||||
0x08000208, 0x00020200, 0x00020000, 0x08000208, |
||||
0x00000008, 0x08020208, 0x00000200, 0x08000000, |
||||
0x08020200, 0x08000000, 0x00020008, 0x00000208, |
||||
0x00020000, 0x08020200, 0x08000200, 0x00000000, |
||||
0x00000200, 0x00020008, 0x08020208, 0x08000200, |
||||
0x08000008, 0x00000200, 0x00000000, 0x08020008, |
||||
0x08000208, 0x00020000, 0x08000000, 0x08020208, |
||||
0x00000008, 0x00020208, 0x00020200, 0x08000008, |
||||
0x08020000, 0x08000208, 0x00000208, 0x08020000, |
||||
0x00020208, 0x00000008, 0x08020008, 0x00020200 |
||||
}; |
||||
private static int[] SP4 = { |
||||
0x00802001, 0x00002081, 0x00002081, 0x00000080, |
||||
0x00802080, 0x00800081, 0x00800001, 0x00002001, |
||||
0x00000000, 0x00802000, 0x00802000, 0x00802081, |
||||
0x00000081, 0x00000000, 0x00800080, 0x00800001, |
||||
0x00000001, 0x00002000, 0x00800000, 0x00802001, |
||||
0x00000080, 0x00800000, 0x00002001, 0x00002080, |
||||
0x00800081, 0x00000001, 0x00002080, 0x00800080, |
||||
0x00002000, 0x00802080, 0x00802081, 0x00000081, |
||||
0x00800080, 0x00800001, 0x00802000, 0x00802081, |
||||
0x00000081, 0x00000000, 0x00000000, 0x00802000, |
||||
0x00002080, 0x00800080, 0x00800081, 0x00000001, |
||||
0x00802001, 0x00002081, 0x00002081, 0x00000080, |
||||
0x00802081, 0x00000081, 0x00000001, 0x00002000, |
||||
0x00800001, 0x00002001, 0x00802080, 0x00800081, |
||||
0x00002001, 0x00002080, 0x00800000, 0x00802001, |
||||
0x00000080, 0x00800000, 0x00002000, 0x00802080 |
||||
}; |
||||
private static int[] SP5 = { |
||||
0x00000100, 0x02080100, 0x02080000, 0x42000100, |
||||
0x00080000, 0x00000100, 0x40000000, 0x02080000, |
||||
0x40080100, 0x00080000, 0x02000100, 0x40080100, |
||||
0x42000100, 0x42080000, 0x00080100, 0x40000000, |
||||
0x02000000, 0x40080000, 0x40080000, 0x00000000, |
||||
0x40000100, 0x42080100, 0x42080100, 0x02000100, |
||||
0x42080000, 0x40000100, 0x00000000, 0x42000000, |
||||
0x02080100, 0x02000000, 0x42000000, 0x00080100, |
||||
0x00080000, 0x42000100, 0x00000100, 0x02000000, |
||||
0x40000000, 0x02080000, 0x42000100, 0x40080100, |
||||
0x02000100, 0x40000000, 0x42080000, 0x02080100, |
||||
0x40080100, 0x00000100, 0x02000000, 0x42080000, |
||||
0x42080100, 0x00080100, 0x42000000, 0x42080100, |
||||
0x02080000, 0x00000000, 0x40080000, 0x42000000, |
||||
0x00080100, 0x02000100, 0x40000100, 0x00080000, |
||||
0x00000000, 0x40080000, 0x02080100, 0x40000100 |
||||
}; |
||||
private static int[] SP6 = { |
||||
0x20000010, 0x20400000, 0x00004000, 0x20404010, |
||||
0x20400000, 0x00000010, 0x20404010, 0x00400000, |
||||
0x20004000, 0x00404010, 0x00400000, 0x20000010, |
||||
0x00400010, 0x20004000, 0x20000000, 0x00004010, |
||||
0x00000000, 0x00400010, 0x20004010, 0x00004000, |
||||
0x00404000, 0x20004010, 0x00000010, 0x20400010, |
||||
0x20400010, 0x00000000, 0x00404010, 0x20404000, |
||||
0x00004010, 0x00404000, 0x20404000, 0x20000000, |
||||
0x20004000, 0x00000010, 0x20400010, 0x00404000, |
||||
0x20404010, 0x00400000, 0x00004010, 0x20000010, |
||||
0x00400000, 0x20004000, 0x20000000, 0x00004010, |
||||
0x20000010, 0x20404010, 0x00404000, 0x20400000, |
||||
0x00404010, 0x20404000, 0x00000000, 0x20400010, |
||||
0x00000010, 0x00004000, 0x20400000, 0x00404010, |
||||
0x00004000, 0x00400010, 0x20004010, 0x00000000, |
||||
0x20404000, 0x20000000, 0x00400010, 0x20004010 |
||||
}; |
||||
private static int[] SP7 = { |
||||
0x00200000, 0x04200002, 0x04000802, 0x00000000, |
||||
0x00000800, 0x04000802, 0x00200802, 0x04200800, |
||||
0x04200802, 0x00200000, 0x00000000, 0x04000002, |
||||
0x00000002, 0x04000000, 0x04200002, 0x00000802, |
||||
0x04000800, 0x00200802, 0x00200002, 0x04000800, |
||||
0x04000002, 0x04200000, 0x04200800, 0x00200002, |
||||
0x04200000, 0x00000800, 0x00000802, 0x04200802, |
||||
0x00200800, 0x00000002, 0x04000000, 0x00200800, |
||||
0x04000000, 0x00200800, 0x00200000, 0x04000802, |
||||
0x04000802, 0x04200002, 0x04200002, 0x00000002, |
||||
0x00200002, 0x04000000, 0x04000800, 0x00200000, |
||||
0x04200800, 0x00000802, 0x00200802, 0x04200800, |
||||
0x00000802, 0x04000002, 0x04200802, 0x04200000, |
||||
0x00200800, 0x00000000, 0x00000002, 0x04200802, |
||||
0x00000000, 0x00200802, 0x04200000, 0x00000800, |
||||
0x04000002, 0x04000800, 0x00000800, 0x00200002 |
||||
}; |
||||
private static int[] SP8 = { |
||||
0x10001040, 0x00001000, 0x00040000, 0x10041040, |
||||
0x10000000, 0x10001040, 0x00000040, 0x10000000, |
||||
0x00040040, 0x10040000, 0x10041040, 0x00041000, |
||||
0x10041000, 0x00041040, 0x00001000, 0x00000040, |
||||
0x10040000, 0x10000040, 0x10001000, 0x00001040, |
||||
0x00041000, 0x00040040, 0x10040040, 0x10041000, |
||||
0x00001040, 0x00000000, 0x00000000, 0x10040040, |
||||
0x10000040, 0x10001000, 0x00041040, 0x00040000, |
||||
0x00041040, 0x00040000, 0x10041000, 0x00001000, |
||||
0x00000040, 0x10040040, 0x00001000, 0x00041040, |
||||
0x10001000, 0x00000040, 0x10000040, 0x10040000, |
||||
0x10040040, 0x10000000, 0x00040000, 0x10001040, |
||||
0x00000000, 0x10041040, 0x00040040, 0x10000040, |
||||
0x10040000, 0x10001000, 0x10001040, 0x00000000, |
||||
0x10041040, 0x00041000, 0x00041000, 0x00001040, |
||||
0x00001040, 0x00040040, 0x10000000, 0x10041000 |
||||
}; |
||||
|
||||
// Routines taken from other parts of the Acme utilities.
|
||||
|
||||
/// Squash bytes down to ints.
|
||||
public static void squashBytesToInts( byte[] inBytes, int inOff, int[] outInts, int outOff, int intLen ) |
||||
{ |
||||
for ( int i = 0; i < intLen; ++i ) |
||||
outInts[outOff + i] = |
||||
( ( inBytes[inOff + i * 4 ] & 0xff ) << 24 ) | |
||||
( ( inBytes[inOff + i * 4 + 1] & 0xff ) << 16 ) | |
||||
( ( inBytes[inOff + i * 4 + 2] & 0xff ) << 8 ) | |
||||
( inBytes[inOff + i * 4 + 3] & 0xff ); |
||||
} |
||||
|
||||
/// Spread ints into bytes.
|
||||
public static void spreadIntsToBytes( int[] inInts, int inOff, byte[] outBytes, int outOff, int intLen ) |
||||
{ |
||||
for ( int i = 0; i < intLen; ++i ) |
||||
{ |
||||
outBytes[outOff + i * 4 ] = (byte) ( inInts[inOff + i] >>> 24 ); |
||||
outBytes[outOff + i * 4 + 1] = (byte) ( inInts[inOff + i] >>> 16 ); |
||||
outBytes[outOff + i * 4 + 2] = (byte) ( inInts[inOff + i] >>> 8 ); |
||||
outBytes[outOff + i * 4 + 3] = (byte) inInts[inOff + i]; |
||||
} |
||||
} |
||||
} |
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -1,18 +0,0 @@ |
||||
|
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
public interface IProtocolCommand { |
||||
|
||||
public static final int SERVER_CONNECTION = 10; |
||||
public static final int CLIENT_CONNECTION = 20; |
||||
|
||||
public static final int RELAY_CONNECTION = 30; |
||||
|
||||
/*public Set<Integer> ALL_COMMANDS = new HashSet<Integer>(Arrays.asList(new Integer[] { new Integer(SERVER_CONNECTION), |
||||
new Integer(CLIENT_CONNECTION), |
||||
new Integer(RELAY_CONNECTION)})); |
||||
*/ |
||||
} |
@ -1,35 +0,0 @@ |
||||
#
|
||||
# Making the VNC applet.
|
||||
#
|
||||
|
||||
CP = cp
|
||||
JC = javac
|
||||
JAR = jar
|
||||
ARCHIVE = VncViewer.jar
|
||||
PAGES = index.vnc shared.vnc noshared.vnc hextile.vnc zlib.vnc tight.vnc
|
||||
INSTALL_DIR = /usr/local/vnc/classes
|
||||
|
||||
CLASSES = VncViewer.class RfbProto.class AuthPanel.class VncCanvas.class \
|
||||
OptionsFrame.class ClipboardFrame.class ButtonPanel.class \
|
||||
DesCipher.class RecordingFrame.class SessionRecorder.class DH.class
|
||||
|
||||
SOURCES = VncViewer.java RfbProto.java AuthPanel.java VncCanvas.java \
|
||||
OptionsFrame.java ClipboardFrame.java ButtonPanel.java \
|
||||
DesCipher.java RecordingFrame.java SessionRecorder.java DH.java
|
||||
|
||||
all: $(CLASSES) $(ARCHIVE) |
||||
|
||||
$(CLASSES): $(SOURCES) |
||||
$(JC) -O $(SOURCES)
|
||||
|
||||
$(ARCHIVE): $(CLASSES) |
||||
$(JAR) cf $(ARCHIVE) $(CLASSES)
|
||||
|
||||
install: $(CLASSES) $(ARCHIVE) |
||||
$(CP) $(CLASSES) $(ARCHIVE) $(PAGES) $(INSTALL_DIR)
|
||||
|
||||
export:: $(CLASSES) $(ARCHIVE) $(PAGES) |
||||
@$(ExportJavaClasses)
|
||||
|
||||
clean:: |
||||
$(RM) *.class *.jar
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -1,398 +0,0 @@ |
||||
//
|
||||
// Copyright (C) 2001 HorizonLive.com, Inc. All Rights Reserved.
|
||||
// Copyright (C) 2001 Constantin Kaplinsky. All Rights Reserved.
|
||||
// Copyright (C) 2000 Tridia Corporation. All Rights Reserved.
|
||||
// Copyright (C) 1999 AT&T Laboratories Cambridge. 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; either 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.
|
||||
//
|
||||
|
||||
//
|
||||
// Options frame.
|
||||
//
|
||||
// This deals with all the options the user can play with.
|
||||
// It sets the encodings array and some booleans.
|
||||
//
|
||||
|
||||
import java.awt.*; |
||||
import java.awt.event.*; |
||||
|
||||
class OptionsFrame extends Frame |
||||
implements WindowListener, ActionListener, ItemListener { |
||||
|
||||
static String[] names = { |
||||
"Encoding", |
||||
"Compression level", |
||||
"JPEG image quality", |
||||
"Cursor shape updates", |
||||
"Use CopyRect", |
||||
"Restricted colors", |
||||
"Mouse buttons 2 and 3", |
||||
"View only", |
||||
"Share desktop", |
||||
}; |
||||
|
||||
static String[][] values = { |
||||
{ "Raw", "RRE", "CoRRE", "Hextile", "Zlib", "Tight" }, |
||||
{ "Default", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, |
||||
{ "JPEG off", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, |
||||
{ "Enable", "Ignore", "Disable" }, |
||||
{ "Yes", "No" }, |
||||
{ "Full", "256", "64", "8", "4 (Grey)", "2 (B&W)" }, |
||||
{ "Normal", "Reversed" }, |
||||
{ "Yes", "No" }, |
||||
{ "Yes", "No" }, |
||||
}; |
||||
|
||||
final int |
||||
encodingIndex = 0, |
||||
compressLevelIndex = 1, |
||||
jpegQualityIndex = 2, |
||||
cursorUpdatesIndex = 3, |
||||
useCopyRectIndex = 4, |
||||
eightBitColorsIndex = 5, |
||||
mouseButtonIndex = 6, |
||||
viewOnlyIndex = 7, |
||||
shareDesktopIndex = 8; |
||||
|
||||
Label[] labels = new Label[names.length]; |
||||
Choice[] choices = new Choice[names.length]; |
||||
Button closeButton; |
||||
VncViewer viewer; |
||||
|
||||
|
||||
//
|
||||
// The actual data which other classes look at:
|
||||
//
|
||||
|
||||
int[] encodings = new int[20]; |
||||
int nEncodings; |
||||
|
||||
int compressLevel; |
||||
int jpegQuality; |
||||
|
||||
int eightBitColors; // sf@2005
|
||||
int oldEightBitColors; |
||||
|
||||
boolean requestCursorUpdates; |
||||
boolean ignoreCursorUpdates; |
||||
|
||||
boolean reverseMouseButtons2And3; |
||||
boolean shareDesktop; |
||||
boolean viewOnly; |
||||
|
||||
//
|
||||
// Constructor. Set up the labels and choices from the names and values
|
||||
// arrays.
|
||||
//
|
||||
|
||||
OptionsFrame(VncViewer v) { |
||||
super("Ultr@VNC Options"); |
||||
|
||||
viewer = v; |
||||
|
||||
GridBagLayout gridbag = new GridBagLayout(); |
||||
setLayout(gridbag); |
||||
|
||||
GridBagConstraints gbc = new GridBagConstraints(); |
||||
gbc.fill = GridBagConstraints.BOTH; |
||||
|
||||
for (int i = 0; i < names.length; i++) { |
||||
labels[i] = new Label(names[i]); |
||||
gbc.gridwidth = 1; |
||||
gridbag.setConstraints(labels[i],gbc); |
||||
add(labels[i]); |
||||
|
||||
choices[i] = new Choice(); |
||||
gbc.gridwidth = GridBagConstraints.REMAINDER; |
||||
gridbag.setConstraints(choices[i],gbc); |
||||
add(choices[i]); |
||||
choices[i].addItemListener(this); |
||||
|
||||
for (int j = 0; j < values[i].length; j++) { |
||||
choices[i].addItem(values[i][j]); |
||||
} |
||||
} |
||||
|
||||
closeButton = new Button("Close"); |
||||
gbc.gridwidth = GridBagConstraints.REMAINDER; |
||||
gridbag.setConstraints(closeButton, gbc); |
||||
add(closeButton); |
||||
closeButton.addActionListener(this); |
||||
|
||||
pack(); |
||||
|
||||
addWindowListener(this); |
||||
|
||||
// Set up defaults
|
||||
|
||||
choices[encodingIndex].select("Tight"); |
||||
choices[compressLevelIndex].select("Default"); |
||||
choices[jpegQualityIndex].select("6"); |
||||
choices[cursorUpdatesIndex].select("Enable"); |
||||
choices[useCopyRectIndex].select("Yes"); |
||||
choices[eightBitColorsIndex].select("256"); |
||||
choices[mouseButtonIndex].select("Normal"); |
||||
choices[viewOnlyIndex].select("No"); |
||||
choices[shareDesktopIndex].select("Yes"); |
||||
|
||||
// But let them be overridden by parameters
|
||||
|
||||
for (int i = 0; i < names.length; i++) { |
||||
String s = viewer.readParameter(names[i], false); |
||||
if (s != null) { |
||||
for (int j = 0; j < values[i].length; j++) { |
||||
if (s.equalsIgnoreCase(values[i][j])) { |
||||
choices[i].select(j); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Make the booleans and encodings array correspond to the state of the GUI
|
||||
|
||||
setEncodings(); |
||||
setColorFormat(); |
||||
setOtherOptions(); |
||||
} |
||||
|
||||
|
||||
//
|
||||
// Disable the shareDesktop option
|
||||
//
|
||||
|
||||
void disableShareDesktop() { |
||||
labels[shareDesktopIndex].setEnabled(false); |
||||
choices[shareDesktopIndex].setEnabled(false); |
||||
} |
||||
|
||||
|
||||
//
|
||||
// setEncodings looks at the encoding, compression level, JPEG
|
||||
// quality level, cursor shape updates and copyRect choices and sets
|
||||
// the encodings array appropriately. It also calls the VncViewer's
|
||||
// setEncodings method to send a message to the RFB server if
|
||||
// necessary.
|
||||
//
|
||||
|
||||
void setEncodings() { |
||||
nEncodings = 0; |
||||
if (choices[useCopyRectIndex].getSelectedItem().equals("Yes")) { |
||||
encodings[nEncodings++] = RfbProto.EncodingCopyRect; |
||||
} |
||||
|
||||
int preferredEncoding = RfbProto.EncodingRaw; |
||||
boolean enableCompressLevel = false; |
||||
|
||||
if (choices[encodingIndex].getSelectedItem().equals("RRE")) { |
||||
preferredEncoding = RfbProto.EncodingRRE; |
||||
} else if (choices[encodingIndex].getSelectedItem().equals("CoRRE")) { |
||||
preferredEncoding = RfbProto.EncodingCoRRE; |
||||
} else if (choices[encodingIndex].getSelectedItem().equals("Hextile")) { |
||||
preferredEncoding = RfbProto.EncodingHextile; |
||||
} else if (choices[encodingIndex].getSelectedItem().equals("Zlib")) { |
||||
preferredEncoding = RfbProto.EncodingZlib; |
||||
enableCompressLevel = true; |
||||
} else if (choices[encodingIndex].getSelectedItem().equals("Tight")) { |
||||
preferredEncoding = RfbProto.EncodingTight; |
||||
enableCompressLevel = true; |
||||
} |
||||
|
||||
encodings[nEncodings++] = preferredEncoding; |
||||
if (preferredEncoding != RfbProto.EncodingHextile) { |
||||
encodings[nEncodings++] = RfbProto.EncodingHextile; |
||||
} |
||||
if (preferredEncoding != RfbProto.EncodingTight) { |
||||
encodings[nEncodings++] = RfbProto.EncodingTight; |
||||
} |
||||
if (preferredEncoding != RfbProto.EncodingZlib) { |
||||
encodings[nEncodings++] = RfbProto.EncodingZlib; |
||||
} |
||||
if (preferredEncoding != RfbProto.EncodingCoRRE) { |
||||
encodings[nEncodings++] = RfbProto.EncodingCoRRE; |
||||
} |
||||
if (preferredEncoding != RfbProto.EncodingRRE) { |
||||
encodings[nEncodings++] = RfbProto.EncodingRRE; |
||||
} |
||||
|
||||
// Handle compression level setting.
|
||||
|
||||
if (enableCompressLevel) { |
||||
labels[compressLevelIndex].setEnabled(true); |
||||
choices[compressLevelIndex].setEnabled(true); |
||||
try { |
||||
compressLevel = |
||||
Integer.parseInt(choices[compressLevelIndex].getSelectedItem()); |
||||
} |
||||
catch (NumberFormatException e) { |
||||
compressLevel = -1; |
||||
} |
||||
if (compressLevel >= 1 && compressLevel <= 9) { |
||||
encodings[nEncodings++] = |
||||
RfbProto.EncodingCompressLevel0 + compressLevel; |
||||
} else { |
||||
compressLevel = -1; |
||||
} |
||||
} else { |
||||
labels[compressLevelIndex].setEnabled(false); |
||||
choices[compressLevelIndex].setEnabled(false); |
||||
} |
||||
|
||||
// Handle JPEG quality setting.
|
||||
|
||||
if (preferredEncoding == RfbProto.EncodingTight && (eightBitColors == 0)) { |
||||
labels[jpegQualityIndex].setEnabled(true); |
||||
choices[jpegQualityIndex].setEnabled(true); |
||||
try { |
||||
jpegQuality = |
||||
Integer.parseInt(choices[jpegQualityIndex].getSelectedItem()); |
||||
} |
||||
catch (NumberFormatException e) { |
||||
jpegQuality = -1; |
||||
} |
||||
if (jpegQuality >= 0 && jpegQuality <= 9) { |
||||
encodings[nEncodings++] = |
||||
RfbProto.EncodingQualityLevel0 + jpegQuality; |
||||
} else { |
||||
jpegQuality = -1; |
||||
} |
||||
} else { |
||||
labels[jpegQualityIndex].setEnabled(false); |
||||
choices[jpegQualityIndex].setEnabled(false); |
||||
} |
||||
|
||||
// Request cursor shape updates if necessary.
|
||||
|
||||
requestCursorUpdates = |
||||
!choices[cursorUpdatesIndex].getSelectedItem().equals("Disable"); |
||||
|
||||
if (requestCursorUpdates) { |
||||
encodings[nEncodings++] = RfbProto.EncodingXCursor; |
||||
encodings[nEncodings++] = RfbProto.EncodingRichCursor; |
||||
ignoreCursorUpdates = |
||||
choices[cursorUpdatesIndex].getSelectedItem().equals("Ignore"); |
||||
// marscha - PointerPos
|
||||
if (!ignoreCursorUpdates) { |
||||
encodings[nEncodings++] = RfbProto.EncodingPointerPos; |
||||
} |
||||
} |
||||
|
||||
encodings[nEncodings++] = RfbProto.EncodingLastRect; |
||||
encodings[nEncodings++] = RfbProto.EncodingNewFBSize; |
||||
|
||||
viewer.setEncodings(); |
||||
} |
||||
|
||||
//
|
||||
// setColorFormat sets eightBitColors variable depending on the GUI
|
||||
// setting, causing switches between 8-bit and 24-bit colors mode if
|
||||
// necessary.
|
||||
//
|
||||
|
||||
void setColorFormat() { |
||||
|
||||
// sf@2005 - Adding more color modes
|
||||
if (choices[eightBitColorsIndex].getSelectedItem().equals("Full")) |
||||
eightBitColors = 0; |
||||
else if (choices[eightBitColorsIndex].getSelectedItem().equals("256")) |
||||
eightBitColors = 1; |
||||
else if (choices[eightBitColorsIndex].getSelectedItem().equals("64")) |
||||
eightBitColors = 2; |
||||
else if (choices[eightBitColorsIndex].getSelectedItem().equals("8")) |
||||
eightBitColors = 3; |
||||
else if (choices[eightBitColorsIndex].getSelectedItem().equals("4 (Grey)")) |
||||
eightBitColors = 4; |
||||
else if (choices[eightBitColorsIndex].getSelectedItem().equals("2 (B&W)")) |
||||
eightBitColors = 5; |
||||
|
||||
boolean enableJPEG = (eightBitColors == 0) && |
||||
choices[encodingIndex].getSelectedItem().equals("Tight"); |
||||
|
||||
labels[jpegQualityIndex].setEnabled(enableJPEG); |
||||
choices[jpegQualityIndex].setEnabled(enableJPEG); |
||||
} |
||||
|
||||
//
|
||||
// setOtherOptions looks at the "other" choices (ones which don't set the
|
||||
// encoding or the color format) and sets the boolean flags appropriately.
|
||||
//
|
||||
|
||||
void setOtherOptions() { |
||||
|
||||
reverseMouseButtons2And3 |
||||
= choices[mouseButtonIndex].getSelectedItem().equals("Reversed"); |
||||
|
||||
viewOnly |
||||
= choices[viewOnlyIndex].getSelectedItem().equals("Yes"); |
||||
if (viewer.vc != null) |
||||
viewer.vc.enableInput(!viewOnly); |
||||
|
||||
shareDesktop |
||||
= choices[shareDesktopIndex].getSelectedItem().equals("Yes"); |
||||
} |
||||
|
||||
|
||||
//
|
||||
// Respond to actions on Choice controls
|
||||
//
|
||||
|
||||
public void itemStateChanged(ItemEvent evt) { |
||||
Object source = evt.getSource(); |
||||
|
||||
if (source == choices[encodingIndex] || |
||||
source == choices[compressLevelIndex] || |
||||
source == choices[jpegQualityIndex] || |
||||
source == choices[cursorUpdatesIndex] || |
||||
source == choices[useCopyRectIndex]) { |
||||
|
||||
setEncodings(); |
||||
|
||||
} else if (source == choices[eightBitColorsIndex]) { |
||||
|
||||
setColorFormat(); |
||||
|
||||
} else if (source == choices[mouseButtonIndex] || |
||||
source == choices[shareDesktopIndex] || |
||||
source == choices[viewOnlyIndex]) { |
||||
|
||||
setOtherOptions(); |
||||
} |
||||
} |
||||
|
||||
//
|
||||
// Respond to button press
|
||||
//
|
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
if (evt.getSource() == closeButton) |
||||
setVisible(false); |
||||
} |
||||
|
||||
//
|
||||
// Respond to window events
|
||||
//
|
||||
|
||||
public void windowClosing(WindowEvent evt) { |
||||
setVisible(false); |
||||
} |
||||
|
||||
public void windowActivated(WindowEvent evt) {} |
||||
public void windowDeactivated(WindowEvent evt) {} |
||||
public void windowOpened(WindowEvent evt) {} |
||||
public void windowClosed(WindowEvent evt) {} |
||||
public void windowIconified(WindowEvent evt) {} |
||||
public void windowDeiconified(WindowEvent evt) {} |
||||
} |
Binary file not shown.
@ -1,40 +0,0 @@ |
||||
import java.io.InputStream; |
||||
|
||||
|
||||
public class POCConnection { |
||||
|
||||
public static final String HOST = "127.0.0.1"; |
||||
public static final int PORT = 5900; |
||||
|
||||
/** |
||||
* @param args |
||||
*/ |
||||
public static void main(String[] args) { |
||||
|
||||
try { |
||||
NoctisRfbProto rfb = new NoctisRfbProto(HOST, PORT, new ConfigClientBean()); |
||||
System.out.println("TRACE: [POCConnection]-[main] - authentification : "+rfb.tryAuthenticate("", "1234")); //TODO: remove trace
|
||||
|
||||
rfb.doProtocolInitialisation(); |
||||
|
||||
InputStream in = rfb.is; |
||||
System.out.println("reading..."); |
||||
int read = in.read(); |
||||
int c = 0; |
||||
if (read<0) { |
||||
System.out.println("nothing found on stream."); |
||||
} |
||||
while ((read >= 0)&&(c<30)) { |
||||
System.out.print(read); |
||||
read = in.read(); |
||||
c++; |
||||
} |
||||
in.close(); |
||||
} catch (Exception e) { |
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -1,444 +0,0 @@ |
||||
|
||||
Ultr@VNC 1.0.0 RC19 Java Viewer |
||||
=================================== |
||||
|
||||
Copyright (C) 2002-2005 Ultr@VNC Team. All Rights Reserved. |
||||
Copyright (C) 2004 Kenn Min Chong, John Witchel. All Rights Reserved. |
||||
Copyright (C) 2004 Alban Chazot. All Rights Reserved. |
||||
Copyright (C) 2001,2002 HorizonLive.com, Inc. All Rights Reserved. |
||||
Copyright (C) 2001,2002 Constantin Kaplinsky. All Rights Reserved. |
||||
Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. |
||||
|
||||
This software is distributed under the GNU General Public Licence as |
||||
published by the Free Software Foundation. See the file LICENCE.TXT for the |
||||
conditions under which this software is made available. VNC also contains |
||||
code from other sources. See the Acknowledgements section below, and the |
||||
individual files for details of the conditions under which they are made |
||||
available. |
||||
|
||||
**************************************************************************** |
||||
|
||||
|
||||
|
||||
This JavaViewer supports Ultr@VNC FileTransfer ( >= RC19 protocole version) |
||||
as well as Ultr@VNC MS Logon. |
||||
|
||||
So even from a Unix or Mac machine you can use a simple Web browser and do |
||||
some FileTransfer with the UltraVNC Win32 Server, as well as taking advantage |
||||
of the more secure MSLogon authentication method. |
||||
|
||||
When loaded in the WebBrowser (browsing http://YourUltraServerIP:5800), the |
||||
user is prompted to accept or reject the Ultr@VNC JavaViewer applet signed |
||||
certificate. It is necessary as this new JavaViewer does some FileTransfer |
||||
and consequently needs to access the user's local drives. |
||||
|
||||
WARNING: This JavaViewer Applet can't be loaded using the default MS IE JVM |
||||
as it doesn't support Swing. You must install a Java JVM (v1.3 or >). |
||||
|
||||
What still needs to be implemented as soon as possible (that is already in |
||||
the Win32 Viewer): |
||||
|
||||
- Add files datetime and size in the files lists |
||||
- Add files multi-selection for transfer |
||||
- Add a "Parent Directory" button the the files panels. |
||||
- Directory transfer |
||||
- Delta transfer |
||||
- ... |
||||
|
||||
|
||||
NEW: added support for more color modes, usefull on slow connections: |
||||
64 Colors, 8 Colors, 2 B/W, 8 and 4 Grey Scale colors. |
||||
|
||||
|
||||
Compiling and Running the JavaViewer |
||||
==================================== |
||||
|
||||
** To compile the JavaViewer |
||||
|
||||
1. Edit the "mk.bat" file and replace the path "c:\soft" with the |
||||
path where your Java sdk stands. |
||||
|
||||
2. Save and execute your mk.bat |
||||
|
||||
3. If you want to sign the generated applet so it can be embedded into |
||||
Ultra winvnc.exe and injected into web browsers on connections to port 5800, |
||||
use the keytool.exe and jarsigner.exe programs that can be found in the |
||||
Java sdk. |
||||
|
||||
4. To replace the winvnc JavaViewer applet with your modifed |
||||
and signed applet, copy the generated .class files and the vncviewer.jar |
||||
file into winvnc\res directory and recompile WinVNC. |
||||
|
||||
|
||||
|
||||
** To run this JavaViewer as a Java application, you must have the Java |
||||
Runtime installed. |
||||
|
||||
1. Edit the "run.bat" file and replace the path "c:\Ultravnc\JavaViewer" |
||||
with the path where you've copied the JavaViewer, then replace "127.0.0.1" |
||||
with the IP adress or network name of the machine where WinVNC server is |
||||
running. |
||||
|
||||
2. Save and Execute run.bat |
||||
|
||||
=> If the path and adress you've written are correct, you should be prompted |
||||
for the VNC password. If MS Logon is required on the server, you will also be |
||||
prompted for Windows Username. |
||||
|
||||
|
||||
Under Linux and Mac, you can also make a batchfile that executes this command: |
||||
|
||||
java.exe -cp **YourJavaViewerFullPath** VncViewer HOST **YourServerIP** PORT 5900 |
||||
|
||||
|
||||
As soon as this new JavaViewer reaches the "beta" stage we'll put the source |
||||
code in Ultr@VNC CVS repository. For now, the source code is available on demand |
||||
only. If you know Java, have time and want to improve the Ultr@VNC project, your |
||||
help would be greatly appreciated. |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Compiling from the sources |
||||
========================== |
||||
|
||||
To compile all the .java files to .class files, simply do: |
||||
|
||||
% make all |
||||
|
||||
This will also generate a JAR (Java archive) file containing all the classes. |
||||
Copy all the .class files, the .jar file and the .vnc files to an |
||||
installation directory (e.g. /usr/local/vnc/classes): |
||||
|
||||
% cp *.class *.jar *.vnc /usr/local/vnc/classes |
||||
|
||||
Make sure that the vncserver script is configured to point to the |
||||
installation directory. |
||||
|
||||
|
||||
Configuration |
||||
============= |
||||
|
||||
Ultr@VNC Java viewer supports a number of parameters allowing you to |
||||
customize its behaviour. Most parameter names copy settings available from |
||||
the Options frame in the Java viewer. Both parameter names and their values |
||||
are case-insensitive, with one exception for the "PASSWORD" parameter. Here |
||||
is the full list of parameters supported in Ultr@VNC Java viewer: |
||||
|
||||
--> "HOST" (no GUI equivalent) |
||||
|
||||
Value: host name or IP address of the VNC server. |
||||
Default: in applet mode, the host from which the applet was loaded. |
||||
|
||||
This parameter tells the viewer which server to connect to. Normally, |
||||
it's not needed, because default Java security policy allow connections |
||||
from applets to the only one host anyway, and that is the host from which |
||||
the applet was loaded. |
||||
|
||||
--> "PORT" (no GUI equivalent) |
||||
|
||||
Value: TCP port number on the VNC server. |
||||
Default: none. |
||||
|
||||
This parameter is required in all cases. Note that this port is not the |
||||
one used for HTTP connection from the browser, it is the port used for |
||||
RFB connection. Usually, VNC servers use ports 58xx for HTTP connections, |
||||
and ports 59xx for RFB connections. Thus, most likely, this parameter |
||||
should be set to something like 5900, 5901 etc. |
||||
|
||||
--> "PASSWORD" |
||||
|
||||
Value: session password in plan text. |
||||
Default: none, ask user. |
||||
|
||||
DO NOT EVER USE THIS PARAMETER, unless you really know what you are |
||||
doing. It's extremely dangerous from the security point of view. When |
||||
this parameter is set, the viewer won't ever ask for a password. |
||||
|
||||
--> "ENCPASSWORD" |
||||
|
||||
Value: encrypted session password in hex-ascii. |
||||
Default: none, ask user. |
||||
|
||||
The same as the "PASSWORD" parameter but DES-encrypted using a fixed key. |
||||
Its value should be represented in hex-ascii e.g. "494015f9a35e8b22". |
||||
This parameter has higher priority over the "PASSWORD" parameter. DO NOT |
||||
EVER USE THIS PARAMETER, unless you really know what you are doing. It's |
||||
extremely dangerous from the security point of view, and encryption does |
||||
not actually help here since the decryption key is always known. |
||||
|
||||
--> "Encoding" |
||||
|
||||
Values: "Raw", "RRE", "CoRRE", "Hextile", "Zlib", "Tight". |
||||
Default: "Tight". |
||||
|
||||
The preferred encoding. "Hextile" is a good choice for fast networks, |
||||
while "Tight" is better suited for low-bandwidth connections. From the |
||||
other side, the "Tight" decoder in Ultr@VNC Java viewer seems to be more |
||||
efficient than "Hextile" decoder so it's possible that this default |
||||
setting can be ok for fast networks too. |
||||
|
||||
--> "Compression level" |
||||
|
||||
Values: "Default", "1", "2", "3", "4", "5", "6", "7", "8", "9". |
||||
Default: "Default". ;-) |
||||
|
||||
Use specified compression level for "Tight" and "Zlib" encodings. Level 1 |
||||
uses minimum of CPU time on the server but achieves weak compression |
||||
ratios. Level 9 offers best compression but may be slow in terms of CPU |
||||
time consumption on the server side. Use high levels with very slow |
||||
network connections, and low levels when working over higher-speed |
||||
networks. The "Default" value means that the server's default compression |
||||
level should be used. |
||||
|
||||
--> "JPEG image quality" |
||||
|
||||
Values: "JPEG off", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9". |
||||
Default: "6". |
||||
|
||||
Use the specified image quality level in "Tight" encoding. Quality level |
||||
0 denotes bad image quality but very impressive compression ratios, while |
||||
level 9 offers very good image quality at lower compression ratios. If |
||||
the value is "JPEG off", the server will not use lossy JPEG compression |
||||
in "Tight" encoding. |
||||
|
||||
--> "Cursor shape updates" |
||||
|
||||
Values: "Enable", "Ignore", "Disable". |
||||
Default: "Enable". |
||||
|
||||
Cursor shape updates is a protocol extension used to handle remote cursor |
||||
movements locally on the client side, saving bandwidth and eliminating |
||||
delays in mouse pointer movement. Note that current implementation of |
||||
cursor shape updates does not allow a client to track mouse cursor |
||||
position at the server side. This means that clients would not see mouse |
||||
cursor movements if mouse was moved either locally on the server, or by |
||||
another remote VNC client. Set this parameter to "Disable" if you always |
||||
want to see real cursor position on the remote side. Setting this option |
||||
to "Ignore" is similar to "Enable" but the remote cursor will not be |
||||
visible at all. This can be a reasonable setting if you don't care about |
||||
cursor shape and don't want to see two mouse cursors, one above another. |
||||
|
||||
--> "Use CopyRect" |
||||
|
||||
Values: "Yes", "No". |
||||
Default: "Yes". |
||||
|
||||
The "CopyRect" encoding saves bandwidth and drawing time when parts of |
||||
the remote screen are moving around. Most likely, you don't want to |
||||
change this setting. |
||||
|
||||
--> "Restricted colors" |
||||
|
||||
Values: "Yes", "No". |
||||
Default: "No". |
||||
|
||||
If set to "No", then 24-bit color format is used to represent pixel data. |
||||
If set to "Yes", then only 8 bits are used to represent each pixel. 8-bit |
||||
color format can save bandwidth, but colors may look very inaccurate. |
||||
|
||||
--> "Mouse buttons 2 and 3" |
||||
|
||||
Values: "Normal", "Reversed". |
||||
Default: "Normal". |
||||
|
||||
If set to "Reversed", then right mouse button (button 2) will act as it |
||||
was middle mouse button (button 3), and vice versa. |
||||
|
||||
--> "View only" |
||||
|
||||
Values: "Yes", "No". |
||||
Default: "No". |
||||
|
||||
If set to "Yes", then all keyboard and mouse events in the desktop window |
||||
will be silently ignored and will not be passed to the remote side. |
||||
|
||||
--> "Share desktop" |
||||
|
||||
Values: "Yes", "No". |
||||
Default: "Yes". |
||||
|
||||
Share the connection with other clients on the same VNC server. The exact |
||||
behaviour in each case depends on the server configuration. |
||||
|
||||
--> "Open new window" (no GUI equivalent, applicable only in the applet mode) |
||||
|
||||
Values: "Yes", "No". |
||||
Default: "No". |
||||
|
||||
Operate in a separate window. This makes possible resizing the desktop, |
||||
and adds scroll bars when necessary. If the server supports variable |
||||
desktop size, the window will resize automatically when remote desktop |
||||
size changes. |
||||
|
||||
--> "Show controls" (no GUI equivalent) |
||||
|
||||
Values: "Yes", "No". |
||||
Default: "Yes". |
||||
|
||||
Set to "No" if you want to get rid of that button panel at the top. |
||||
|
||||
--> "Show offline desktop" (no GUI equivalent) |
||||
|
||||
Values: "Yes", "No". |
||||
Default: "No". |
||||
|
||||
If set to "Yes", the viewer would continue to display desktop even |
||||
if the remote side has closed the connection. In this case, if the |
||||
button panel is enabled, then the "Disconnect" button would be |
||||
changed to "Hide desktop" after the connection is lost. |
||||
|
||||
--> "Defer screen updates" (no GUI equivalent) |
||||
|
||||
Value: time in milliseconds. |
||||
Default: "20". |
||||
|
||||
When updating the desktop contents after receiving an update from server, |
||||
schedule repaint within the specified number of milliseconds. Small delay |
||||
helps to coalesce several small updates into one drawing operation, |
||||
improving CPU usage. Set this parameter to 0 to disable deferred updates. |
||||
|
||||
--> "Defer cursor updates" (no GUI equivalent) |
||||
|
||||
Value: time in milliseconds. |
||||
Default: "10". |
||||
|
||||
When updating the desktop after moving the mouse, schedule repaint within |
||||
the specified number of milliseconds. This setting makes sense only when |
||||
"Cursor shape updates" parameter is set to "Enable". Small delay helps to |
||||
coalesce several small updates into one drawing operation, improving CPU |
||||
usage. Set this parameter to 0 to disable deferred cursor updates. |
||||
|
||||
--> "Defer update requests" (no GUI equivalent) |
||||
|
||||
Value: time in milliseconds. |
||||
Default: "50". |
||||
|
||||
After processing an update received from server, wait for the specified |
||||
number of milliseconds before requesting next screen update. Such delay |
||||
will end immediately on every mouse or keyboard event if not in the "view |
||||
only" mode. Small delay helps the server to coalesce several small |
||||
updates into one framebuffer update, improving both bandwidth and CPU |
||||
usage. Increasing the parameter value does not affect responsiveness on |
||||
mouse and keyboard events, but causes delays in updating the screen when |
||||
there is no mouse and keyboard activity on the client side. |
||||
|
||||
|
||||
RECORDING VNC SESSIONS |
||||
====================== |
||||
|
||||
Current version of the Ultr@VNC Java viewer is able to record VNC (RFB) |
||||
sessions in files for later playback. The data format in saved session files |
||||
is compatible with the rfbproxy program written by Tim Waugh. Most important |
||||
thing about session recording is that it's supported only if Java security |
||||
manager allows access to local filesystem. Typically, it would not work for |
||||
unsigned applets. To use this feature, either use Ultr@VNC Java viewer as a |
||||
standalone application (Java Runtime Environment or Java Development Kit |
||||
should be installed), or as a signed applet. The code checks if it's possible |
||||
to support session recording, and if everything's fine, the new "Record" |
||||
button should appear in the button panel. Pressing this button opens new |
||||
window which controls session recording. The GUI is pretty self-explained. |
||||
|
||||
Other important facts about session recording: |
||||
|
||||
--> All sessions are recorded in the 24-bit color format. If you use |
||||
restricted colors (8-bit format), it will be temporarly switched to |
||||
24-bit mode during session recording. |
||||
|
||||
--> All sessions are recorded with cursor shape updates turned off. This is |
||||
necessary to represent remote cursor movements in recorded sessions. |
||||
|
||||
--> Closing and re-opening the recording control window does not affect the |
||||
recording. It's not necessary to keep that window open during recording a |
||||
session. |
||||
|
||||
--> Avoid using Zlib encoding when recording sessions. It's ok if you started |
||||
recording BEFORE the connection to the VNC server has been established, |
||||
but if you started recording during an active session, all Zlib sessions |
||||
will be saved Raw-encoded (that is, without compression at all). Zlib |
||||
decoding depends on the pixel data received earlier, thus saving the data |
||||
received from the server at an arbitrary moment is not sufficient to |
||||
decompress it correctly. And there is no way to say Zlib decoder to reset |
||||
decompressor's state -- that's a limitation of the Zlib encoder. The |
||||
viewer could re-compress raw pixel data again before saving Zlib-encoded |
||||
sessions, but unfortunately Java API does not allow to flush zlib data |
||||
streams making it impossible to save Zlib-encoded RFB pixel data without |
||||
using native code. |
||||
|
||||
--> Usually, Tight encoding is the most suitable one for session recording, |
||||
but some of the issues described above for the Zlib encoding affect the |
||||
Tight encoding as well. Unlike Zlib sessions, Tight-encoded sessions are |
||||
always saved Tight-encoded, but the viewer has to re-compress parts of |
||||
data to synchronize encoder's and decoder's zlib streams. And, due to |
||||
Java zlib API limitations, zlib streams' states have to be reset on each |
||||
compressed rectangle, causing compression ratios to be lower than in the |
||||
original VNC session. If you want to achieve the best possible |
||||
performance, turn recording on BEFORE connecting to the VNC server, |
||||
otherwise CPU usage and compression ratios may be notably less efficient. |
||||
|
||||
|
||||
HINTS |
||||
===== |
||||
|
||||
--> To refresh remote desktop in the view-only mode, press "r" or "R" |
||||
on the keyboard. |
||||
|
||||
|
||||
ACKNOWLEDGEMENTS |
||||
================ |
||||
|
||||
This distribution contains Java DES software by Dave Zimmerman |
||||
<dzimm@widget.com> and Jef Poskanzer <jef@acme.com>. This is: |
||||
|
||||
Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. |
||||
|
||||
Permission to use, copy, modify, and distribute this software and its |
||||
documentation for NON-COMMERCIAL or COMMERCIAL purposes and without fee |
||||
is hereby granted, provided that this copyright notice is kept intact. |
||||
|
||||
WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE |
||||
SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT |
||||
NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
||||
PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE |
||||
LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, |
||||
MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. |
||||
|
||||
THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE |
||||
CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE |
||||
PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT |
||||
NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE |
||||
SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE |
||||
SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE |
||||
PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET |
||||
WORKSHOP SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF |
||||
FITNESS FOR HIGH RISK ACTIVITIES. |
||||
|
||||
Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights |
||||
reserved. |
||||
|
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions |
||||
are met: |
||||
1. Redistributions of source code must retain the above copyright |
||||
notice, this list of conditions and the following disclaimer. |
||||
2. Redistributions in binary form must reproduce the above copyright |
||||
notice, this list of conditions and the following disclaimer in the |
||||
documentation and/or other materials provided with the distribution. |
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS |
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
Visit the ACME Labs Java page for up-to-date versions of this and other |
||||
fine Java utilities: http://www.acme.com/java/ |
Binary file not shown.
@ -1,322 +0,0 @@ |
||||
//
|
||||
// Copyright (C) 2002 Constantin Kaplinsky. 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; either 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.
|
||||
//
|
||||
|
||||
//
|
||||
// Recording frame. It allows to control recording RFB sessions into
|
||||
// FBS (FrameBuffer Stream) files.
|
||||
//
|
||||
|
||||
import java.awt.Button; |
||||
import java.awt.Color; |
||||
import java.awt.FileDialog; |
||||
import java.awt.Font; |
||||
import java.awt.Frame; |
||||
import java.awt.GridBagConstraints; |
||||
import java.awt.GridBagLayout; |
||||
import java.awt.Insets; |
||||
import java.awt.Label; |
||||
import java.awt.Panel; |
||||
import java.awt.TextField; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.WindowEvent; |
||||
import java.awt.event.WindowListener; |
||||
import java.io.File; |
||||
|
||||
class RecordingFrame extends Frame |
||||
implements WindowListener, ActionListener { |
||||
|
||||
boolean recording; |
||||
|
||||
TextField fnameField; |
||||
Button browseButton; |
||||
|
||||
Label statusLabel; |
||||
|
||||
Button recordButton, nextButton, closeButton; |
||||
VncViewer viewer; |
||||
|
||||
//
|
||||
// Check if current security manager allows to create a
|
||||
// RecordingFrame object.
|
||||
//
|
||||
|
||||
public static boolean checkSecurity() { |
||||
SecurityManager security = System.getSecurityManager(); |
||||
if (security != null) { |
||||
try { |
||||
security.checkPropertyAccess("user.dir"); |
||||
security.checkPropertyAccess("file.separator"); |
||||
} catch (SecurityException e) { |
||||
System.out.println("SecurityManager restricts session recording."); |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
//
|
||||
// Constructor.
|
||||
//
|
||||
|
||||
RecordingFrame(VncViewer v) { |
||||
super("TightVNC Session Recording"); |
||||
|
||||
viewer = v; |
||||
|
||||
// Determine initial filename for next saved session.
|
||||
// FIXME: Check SecurityManager.
|
||||
|
||||
String fname = nextNewFilename(System.getProperty("user.dir") + |
||||
System.getProperty("file.separator") + |
||||
"vncsession.fbs"); |
||||
|
||||
// Construct new panel with file name field and "Browse" button.
|
||||
|
||||
Panel fnamePanel = new Panel(); |
||||
GridBagLayout fnameGridbag = new GridBagLayout(); |
||||
fnamePanel.setLayout(fnameGridbag); |
||||
|
||||
GridBagConstraints fnameConstraints = new GridBagConstraints(); |
||||
fnameConstraints.gridwidth = GridBagConstraints.RELATIVE; |
||||
fnameConstraints.fill = GridBagConstraints.BOTH; |
||||
fnameConstraints.weightx = 4.0; |
||||
|
||||
fnameField = new TextField(fname, 64); |
||||
fnameGridbag.setConstraints(fnameField, fnameConstraints); |
||||
fnamePanel.add(fnameField); |
||||
fnameField.addActionListener(this); |
||||
|
||||
fnameConstraints.gridwidth = GridBagConstraints.REMAINDER; |
||||
fnameConstraints.weightx = 1.0; |
||||
|
||||
browseButton = new Button("Browse"); |
||||
fnameGridbag.setConstraints(browseButton, fnameConstraints); |
||||
fnamePanel.add(browseButton); |
||||
browseButton.addActionListener(this); |
||||
|
||||
// Construct the frame.
|
||||
|
||||
GridBagLayout gridbag = new GridBagLayout(); |
||||
setLayout(gridbag); |
||||
|
||||
GridBagConstraints gbc = new GridBagConstraints(); |
||||
gbc.gridwidth = GridBagConstraints.REMAINDER; |
||||
gbc.fill = GridBagConstraints.BOTH; |
||||
gbc.weighty = 1.0; |
||||
gbc.insets = new Insets(10, 0, 0, 0); |
||||
|
||||
Label helpLabel = |
||||
new Label("File name to save next recorded session in:", Label.CENTER); |
||||
gridbag.setConstraints(helpLabel, gbc); |
||||
add(helpLabel); |
||||
|
||||
gbc.fill = GridBagConstraints.HORIZONTAL; |
||||
gbc.weighty = 0.0; |
||||
gbc.insets = new Insets(0, 0, 0, 0); |
||||
|
||||
gridbag.setConstraints(fnamePanel, gbc); |
||||
add(fnamePanel); |
||||
|
||||
gbc.fill = GridBagConstraints.BOTH; |
||||
gbc.weighty = 1.0; |
||||
gbc.insets = new Insets(10, 0, 10, 0); |
||||
|
||||
statusLabel = new Label("", Label.CENTER); |
||||
gridbag.setConstraints(statusLabel, gbc); |
||||
add(statusLabel); |
||||
|
||||
gbc.fill = GridBagConstraints.HORIZONTAL; |
||||
gbc.weightx = 1.0; |
||||
gbc.weighty = 0.0; |
||||
gbc.gridwidth = 1; |
||||
gbc.insets = new Insets(0, 0, 0, 0); |
||||
|
||||
recordButton = new Button("Record"); |
||||
gridbag.setConstraints(recordButton, gbc); |
||||
add(recordButton); |
||||
recordButton.addActionListener(this); |
||||
|
||||
nextButton = new Button("Next file"); |
||||
gridbag.setConstraints(nextButton, gbc); |
||||
add(nextButton); |
||||
nextButton.addActionListener(this); |
||||
|
||||
closeButton = new Button("Close"); |
||||
gridbag.setConstraints(closeButton, gbc); |
||||
add(closeButton); |
||||
closeButton.addActionListener(this); |
||||
|
||||
// Set correct text, font and color for the statusLabel.
|
||||
stopRecording(); |
||||
|
||||
pack(); |
||||
|
||||
addWindowListener(this); |
||||
} |
||||
|
||||
//
|
||||
// If the given string ends with ".NNN" where NNN is a decimal
|
||||
// number, increase this number by one. Otherwise, append ".001"
|
||||
// to the given string.
|
||||
//
|
||||
|
||||
protected String nextFilename(String fname) { |
||||
int len = fname.length(); |
||||
int suffixPos = len; |
||||
int suffixNum = 1; |
||||
|
||||
if (len > 4 && fname.charAt(len - 4) == '.') { |
||||
try { |
||||
suffixNum = Integer.parseInt(fname.substring(len - 3, len)) + 1; |
||||
suffixPos = len - 4; |
||||
} catch (NumberFormatException e) { } |
||||
} |
||||
|
||||
char[] zeroes = {'0', '0', '0'}; |
||||
String suffix = String.valueOf(suffixNum); |
||||
if (suffix.length() < 3) { |
||||
suffix = new String(zeroes, 0, 3 - suffix.length()) + suffix; |
||||
} |
||||
|
||||
return fname.substring(0, suffixPos) + '.' + suffix; |
||||
} |
||||
|
||||
//
|
||||
// Find next name of a file which does not exist yet.
|
||||
//
|
||||
|
||||
protected String nextNewFilename(String fname) { |
||||
String newName = fname; |
||||
File f; |
||||
try { |
||||
do { |
||||
newName = nextFilename(newName); |
||||
f = new File(newName); |
||||
} while (f.exists()); |
||||
} catch (SecurityException e) { } |
||||
|
||||
return newName; |
||||
} |
||||
|
||||
//
|
||||
// Let the user choose a file name showing a FileDialog.
|
||||
//
|
||||
|
||||
protected boolean browseFile() { |
||||
File currentFile = new File(fnameField.getText()); |
||||
|
||||
FileDialog fd = |
||||
new FileDialog(this, "Save next session as...", FileDialog.SAVE); |
||||
fd.setDirectory(currentFile.getParent()); |
||||
fd.setVisible(true); |
||||
if (fd.getFile() != null) { |
||||
String newDir = fd.getDirectory(); |
||||
String sep = System.getProperty("file.separator"); |
||||
if (newDir.length() > 0) { |
||||
if (!sep.equals(newDir.substring(newDir.length() - sep.length()))) |
||||
newDir += sep; |
||||
} |
||||
String newFname = newDir + fd.getFile(); |
||||
if (newFname.equals(fnameField.getText())) { |
||||
fnameField.setText(newFname); |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
//
|
||||
// Start recording.
|
||||
//
|
||||
|
||||
public void startRecording() { |
||||
statusLabel.setText("Status: Recording..."); |
||||
statusLabel.setFont(new Font("Helvetica", Font.BOLD, 12)); |
||||
statusLabel.setForeground(Color.red); |
||||
recordButton.setLabel("Stop recording"); |
||||
|
||||
recording = true; |
||||
|
||||
viewer.setRecordingStatus(fnameField.getText()); |
||||
} |
||||
|
||||
//
|
||||
// Stop recording.
|
||||
//
|
||||
|
||||
public void stopRecording() { |
||||
statusLabel.setText("Status: Not recording."); |
||||
statusLabel.setFont(new Font("Helvetica", Font.PLAIN, 12)); |
||||
statusLabel.setForeground(Color.black); |
||||
recordButton.setLabel("Record"); |
||||
|
||||
recording = false; |
||||
|
||||
viewer.setRecordingStatus(null); |
||||
} |
||||
|
||||
//
|
||||
// Close our window properly.
|
||||
//
|
||||
|
||||
public void windowClosing(WindowEvent evt) { |
||||
setVisible(false); |
||||
} |
||||
|
||||
//
|
||||
// Ignore window events we're not interested in.
|
||||
//
|
||||
|
||||
public void windowActivated(WindowEvent evt) {} |
||||
public void windowDeactivated (WindowEvent evt) {} |
||||
public void windowOpened(WindowEvent evt) {} |
||||
public void windowClosed(WindowEvent evt) {} |
||||
public void windowIconified(WindowEvent evt) {} |
||||
public void windowDeiconified(WindowEvent evt) {} |
||||
|
||||
|
||||
//
|
||||
// Respond to button presses
|
||||
//
|
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
if (evt.getSource() == browseButton) { |
||||
if (browseFile() && recording) |
||||
startRecording(); |
||||
|
||||
} else if (evt.getSource() == recordButton) { |
||||
if (!recording) { |
||||
startRecording(); |
||||
} else { |
||||
stopRecording(); |
||||
fnameField.setText(nextNewFilename(fnameField.getText())); |
||||
} |
||||
|
||||
} else if (evt.getSource() == nextButton) { |
||||
fnameField.setText(nextNewFilename(fnameField.getText())); |
||||
if (recording) |
||||
startRecording(); |
||||
|
||||
} else if (evt.getSource() == closeButton) { |
||||
setVisible(false); |
||||
|
||||
} |
||||
} |
||||
} |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -1,193 +0,0 @@ |
||||
//
|
||||
// Copyright (C) 2002 Constantin Kaplinsky. 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; either 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.
|
||||
//
|
||||
|
||||
//
|
||||
// SessionRecorder is a class to write FBS (FrameBuffer Stream) files.
|
||||
// FBS files are used to save RFB sessions for later playback.
|
||||
//
|
||||
|
||||
import java.io.*; |
||||
|
||||
class SessionRecorder { |
||||
|
||||
protected FileOutputStream f; |
||||
protected DataOutputStream df; |
||||
protected long startTime, lastTimeOffset; |
||||
|
||||
protected byte[] buffer; |
||||
protected int bufferSize; |
||||
protected int bufferBytes; |
||||
|
||||
public SessionRecorder(String name, int bufsize) throws IOException { |
||||
f = new FileOutputStream(name); |
||||
df = new DataOutputStream(f); |
||||
startTime = System.currentTimeMillis(); |
||||
lastTimeOffset = 0; |
||||
|
||||
bufferSize = bufsize; |
||||
bufferBytes = 0; |
||||
buffer = new byte[bufferSize]; |
||||
} |
||||
|
||||
public SessionRecorder(String name) throws IOException { |
||||
this(name, 65536); |
||||
} |
||||
|
||||
//
|
||||
// Close the file, free resources.
|
||||
//
|
||||
|
||||
public void close() throws IOException { |
||||
try { |
||||
flush(); |
||||
} catch (IOException e) { |
||||
} |
||||
|
||||
df = null; |
||||
f.close(); |
||||
f = null; |
||||
buffer = null; |
||||
} |
||||
|
||||
//
|
||||
// Write the FBS file header as defined in the rfbproxy utility.
|
||||
//
|
||||
|
||||
public void writeHeader() throws IOException { |
||||
df.write("FBS 001.000\n".getBytes()); |
||||
} |
||||
|
||||
//
|
||||
// Write one byte.
|
||||
//
|
||||
|
||||
public void writeByte(int b) throws IOException { |
||||
prepareWriting(); |
||||
buffer[bufferBytes++] = (byte)b; |
||||
} |
||||
|
||||
//
|
||||
// Write 16-bit value, big-endian.
|
||||
//
|
||||
|
||||
public void writeShortBE(int v) throws IOException { |
||||
prepareWriting(); |
||||
buffer[bufferBytes++] = (byte)(v >> 8); |
||||
buffer[bufferBytes++] = (byte)v; |
||||
} |
||||
|
||||
//
|
||||
// Write 32-bit value, big-endian.
|
||||
//
|
||||
|
||||
public void writeIntBE(int v) throws IOException { |
||||
prepareWriting(); |
||||
buffer[bufferBytes] = (byte)(v >> 24); |
||||
buffer[bufferBytes + 1] = (byte)(v >> 16); |
||||
buffer[bufferBytes + 2] = (byte)(v >> 8); |
||||
buffer[bufferBytes + 3] = (byte)v; |
||||
bufferBytes += 4; |
||||
} |
||||
|
||||
//
|
||||
// Write 16-bit value, little-endian.
|
||||
//
|
||||
|
||||
public void writeShortLE(int v) throws IOException { |
||||
prepareWriting(); |
||||
buffer[bufferBytes++] = (byte)v; |
||||
buffer[bufferBytes++] = (byte)(v >> 8); |
||||
} |
||||
|
||||
//
|
||||
// Write 32-bit value, little-endian.
|
||||
//
|
||||
|
||||
public void writeIntLE(int v) throws IOException { |
||||
prepareWriting(); |
||||
buffer[bufferBytes] = (byte)v; |
||||
buffer[bufferBytes + 1] = (byte)(v >> 8); |
||||
buffer[bufferBytes + 2] = (byte)(v >> 16); |
||||
buffer[bufferBytes + 3] = (byte)(v >> 24); |
||||
bufferBytes += 4; |
||||
} |
||||
|
||||
//
|
||||
// Write byte arrays.
|
||||
//
|
||||
|
||||
public void write(byte b[], int off, int len) throws IOException { |
||||
prepareWriting(); |
||||
while (len > 0) { |
||||
if (bufferBytes > bufferSize - 4) |
||||
flush(false); |
||||
|
||||
int partLen; |
||||
if (bufferBytes + len > bufferSize) { |
||||
partLen = bufferSize - bufferBytes; |
||||
} else { |
||||
partLen = len; |
||||
} |
||||
System.arraycopy(b, off, buffer, bufferBytes, partLen); |
||||
bufferBytes += partLen; |
||||
off += partLen; |
||||
len -= partLen; |
||||
} |
||||
} |
||||
|
||||
public void write(byte b[]) throws IOException { |
||||
write(b, 0, b.length); |
||||
} |
||||
|
||||
//
|
||||
// Flush the output. This method saves buffered data in the
|
||||
// underlying file object adding data sizes and timestamps. If the
|
||||
// updateTimeOffset is set to false, then the current time offset
|
||||
// will not be changed for next write operation.
|
||||
//
|
||||
|
||||
public void flush(boolean updateTimeOffset) throws IOException { |
||||
if (bufferBytes > 0) { |
||||
df.writeInt(bufferBytes); |
||||
df.write(buffer, 0, (bufferBytes + 3) & 0x7FFFFFFC); |
||||
df.writeInt((int)lastTimeOffset); |
||||
bufferBytes = 0; |
||||
if (updateTimeOffset) |
||||
lastTimeOffset = -1; |
||||
} |
||||
} |
||||
|
||||
public void flush() throws IOException { |
||||
flush(true); |
||||
} |
||||
|
||||
//
|
||||
// Before writing any data, remember time offset and flush the
|
||||
// buffer before it becomes full.
|
||||
//
|
||||
|
||||
protected void prepareWriting() throws IOException { |
||||
if (lastTimeOffset == -1) |
||||
lastTimeOffset = System.currentTimeMillis() - startTime; |
||||
if (bufferBytes > bufferSize - 4) |
||||
flush(false); |
||||
} |
||||
|
||||
} |
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,20 +0,0 @@ |
||||
#
|
||||
# Making the VNC applet.
|
||||
#
|
||||
|
||||
CLASSES = VncViewer.class RfbProto.class AuthPanel.class VncCanvas.class \
|
||||
OptionsFrame.class ClipboardFrame.class ButtonPanel.class \
|
||||
DesCipher.class
|
||||
|
||||
PAGES = index.vnc shared.vnc noshared.vnc hextile.vnc zlib.vnc tight.vnc
|
||||
|
||||
all: $(CLASSES) VncViewer.jar |
||||
|
||||
VncViewer.jar: $(CLASSES) |
||||
@$(JavaArchive)
|
||||
|
||||
export:: $(CLASSES) VncViewer.jar $(PAGES) |
||||
@$(ExportJavaClasses)
|
||||
|
||||
clean:: |
||||
$(RM) *.class *.jar
|
@ -1,19 +0,0 @@ |
||||
<!-- hextile.vnc - hextile html page for Java VNC viewer applet. On |
||||
any file ending in .vnc, the HTTP server embedded in Xvnc will |
||||
substitute the following variables when preceded by a dollar: |
||||
USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, |
||||
PORT. Use two dollar signs ($$) to get a dollar sign in the |
||||
generated html. --> |
||||
|
||||
<HTML> |
||||
<TITLE> |
||||
$USER's $DESKTOP desktop ($DISPLAY) |
||||
</TITLE> |
||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar |
||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT> |
||||
<param name=PORT value=$PORT> |
||||
<param name=ENCODING value=Hextile> |
||||
</APPLET> |
||||
<BR> |
||||
<A href="http://ultravnc.sf.net/">UltraVNC Site</A> |
||||
</HTML> |
@ -1,36 +0,0 @@ |
||||
<HTML> |
||||
<HEAD><TITLE> [test viewApplet] </TITLE></HEAD> |
||||
<BODY> |
||||
<SPAN style='position: absolute; top:0px;left:0px'> |
||||
<OBJECT |
||||
ID='VncViewer' |
||||
classid = 'clsid:8AD9C840-044E-11D1-B3E9-00805F499D93' |
||||
codebase = 'http://java.sun.com/update/1.4.2/jinstall-1_4-windows-i586.cab#Version=1,4,0,0' |
||||
WIDTH = 798 HEIGHT = 600 > |
||||
<PARAM NAME = CODE VALUE = VncViewer.class > |
||||
<PARAM NAME = ARCHIVE VALUE = VncViewer.jar > |
||||
<PARAM NAME = 'type' VALUE = 'application/x-java-applet;version=1.4'> |
||||
<PARAM NAME = 'scriptable' VALUE = 'false'> |
||||
<PARAM NAME = PORT VALUE=443> |
||||
<PARAM NAME = 'HOST' VALUE='dokeos.noctis.be'> |
||||
<PARAM NAME = ENCODING VALUE=Tight> |
||||
<PARAM NAME = 'Open New Window' VALUE='Yes'> |
||||
<COMMENT> |
||||
<EMBED |
||||
type = 'application/x-java-applet;version=1.4' \ |
||||
CODE = VncViewer.class \ |
||||
ARCHIVE = VncViewer.jar \ |
||||
WIDTH = 798 \ |
||||
HEIGHT = 600 \ |
||||
PORT =5900 \ |
||||
ENCODING =Tight \ |
||||
scriptable = false \ |
||||
pluginspage ='http://java.sun.com/products/plugin/index.html#download'> |
||||
<NOEMBED> |
||||
</NOEMBED> |
||||
</EMBED> |
||||
</COMMENT> |
||||
</OBJECT> |
||||
</SPAN> |
||||
</BODY> |
||||
</HTML> |
@ -1,125 +0,0 @@ |
||||
<?php // $Id: infocours.php 10902 2007-01-25 14:44:35Z elixir_julian $
|
||||
/* For licensing terms, see /dokeos_license.txt */ |
||||
/* |
||||
============================================================================== |
||||
INIT SECTION |
||||
============================================================================== |
||||
*/ |
||||
// name of the language file that needs to be included |
||||
$language_file = array('create_course', 'course_info'); |
||||
require '../inc/global.inc.php'; |
||||
$this_section = SECTION_COURSES; |
||||
|
||||
$nameTools = get_lang("ModifInfo"); |
||||
|
||||
$course_code = $_course["sysCode"]; |
||||
|
||||
$app_share_tmp_dir_base = api_get_path(SYS_ARCHIVE_PATH).'app_share/'; |
||||
//mkdir ($app_share_tmp_dir_base, 0700); |
||||
mkdir ($app_share_tmp_dir_base, api_get_permissions_for_new_directories()); |
||||
$app_share_tmp_dir = $app_share_tmp_dir_base.$course_code; |
||||
$app_base_file = api_get_path(SYS_CODE_PATH).'app_share/DokeosAppShare.exe'; |
||||
$app_share_app_file = $app_share_tmp_dir.'/DokeosAppShare.exe'; |
||||
|
||||
$specialCode=''; |
||||
if (!file_exists($app_share_app_file)) { |
||||
|
||||
//mkdir ($app_share_tmp_dir, 0700); |
||||
mkdir ($app_share_tmp_dir, api_get_permissions_for_new_directories()); |
||||
|
||||
if (!file_exists($app_base_file)) { |
||||
echo('FATAL ERROR: file <strong>'.$app_base_file.'</strong> not found.<br />'); |
||||
} else { |
||||
$source = fopen($app_base_file, "r"); |
||||
$target = fopen($app_share_app_file, "a" ); |
||||
|
||||
$specialCode = rand(100000,999999).time().rand(100000,999999); |
||||
$contents = fread ($source, filesize ($app_base_file)); |
||||
fwrite ($target, $contents, filesize ($app_base_file)); |
||||
fwrite ($target, $specialCode, filesize ($app_base_file)); |
||||
fclose($source); |
||||
fclose($target); |
||||
} |
||||
|
||||
} else { |
||||
$source = fopen($app_share_app_file, "r" ); |
||||
fread ($source, filesize ($app_base_file)); // skip binary content |
||||
$serverID = fread ($source, filesize($app_share_app_file)-filesize ($app_base_file)); |
||||
fclose($source); |
||||
} |
||||
|
||||
/* |
||||
============================================================================== |
||||
HEADER |
||||
============================================================================== |
||||
*/ |
||||
Display :: display_header("appShare"); |
||||
|
||||
if ($_GET["client"] == 'true') { |
||||
?> |
||||
<HTML> |
||||
<HEAD><TITLE> [test viewApplet appShare] </TITLE></HEAD> |
||||
<BODY> |
||||
<SPAN style='position: absolute; top:0px;left:0px'> |
||||
<OBJECT style="width: 100%; height: 100%" |
||||
ID='DokeosSharing' |
||||
classid = 'clsid:8AD9C840-044E-11D1-B3E9-00805F499D93' |
||||
codebase = 'http://java.sun.com/update/1.4.2/jinstall-1_4-windows-i586.cab#Version=1,4,0,0' |
||||
WIDTH = 1000 HEIGHT = 700 > |
||||
<PARAM NAME = CODE VALUE = VncViewer.class > |
||||
<PARAM NAME = ARCHIVE VALUE = VncViewer.jar > |
||||
<PARAM NAME = 'type' VALUE = 'application/x-java-applet;version=1.4'> |
||||
<PARAM NAME = 'scriptable' VALUE = 'false'> |
||||
<PARAM NAME = PORT VALUE=443> |
||||
<PARAM NAME = 'HOST' VALUE='dokeos.noctis.be'> |
||||
<PARAM NAME = 'SERVERID' VALUE='<?php echo($serverID);?>'>
|
||||
<PARAM NAME = ENCODING VALUE=Tight> |
||||
<PARAM NAME = 'Open New Window' VALUE='Yes'> |
||||
<COMMENT> |
||||
<EMBED |
||||
type = 'application/x-java-applet;version=1.4' \ |
||||
CODE = VncViewer.class \ |
||||
ARCHIVE = VncViewer.jar \ |
||||
WIDTH = 1000 \ |
||||
HEIGHT = 700 \ |
||||
PORT = 443 \ |
||||
SERVERID = '<?php echo($serverID);?>' \
|
||||
ENCODING =Tight \ |
||||
scriptable = false \ |
||||
pluginspage ='http://java.sun.com/products/plugin/index.html#download'> |
||||
<NOEMBED> |
||||
</NOEMBED> |
||||
</EMBED> |
||||
</COMMENT> |
||||
</OBJECT> |
||||
</SPAN> |
||||
</BODY> |
||||
</HTML> |
||||
<?php |
||||
} else { |
||||
|
||||
if (api_is_allowed_to_edit()) { |
||||
$linkToFile = api_get_path(WEB_ARCHIVE_PATH).'app_share/'.$course_code.'/DokeosAppShare.exe'; |
||||
?> |
||||
<h3><?php echo get_lang('PrerequisitesForAppShare'); ?></h3>
|
||||
<ul> |
||||
<li>Microsoft .NET : <a target="top" href="http://www.microsoft.com/downloads/details.aspx?familyid=0856eacb-4362-4b0d-8edd-aab15c5e04f5&displaylang=en">install</a></li> |
||||
<li style="margin-top: 5px;">Visual J# Redistributable Packages : <a target="top" href="http://msdn2.microsoft.com/en-us/vjsharp/bb188598.aspx">install</a></li> |
||||
</ul> |
||||
<form style="float: left;" id="view_screen" action="<?php echo($linkToFile);?>">
|
||||
<input style="width: 220px; font-size: 14px; font-weight: bold;" type="submit" value="<?php echo get_lang('ShareMyScreen'); ?>" />
|
||||
</form> |
||||
<?php |
||||
}?> |
||||
<form style="float: left;" id="view_screen" action=""> |
||||
<input type="hidden" name="client" value="true" /> |
||||
<input style="margin-left: 20px; width: 220px; font-size: 14px; font-weight: bold;" type="submit" value="<?php echo get_lang('SeeTheSharedScreen'); ?>" />
|
||||
</form><?php |
||||
} |
||||
|
||||
/* |
||||
============================================================================== |
||||
FOOTER |
||||
============================================================================== |
||||
*/ |
||||
Display::display_footer(); |
@ -1,16 +0,0 @@ |
||||
<!-- index.vnc - default html page for Java VNC viewer applet. On any file |
||||
ending in .vnc, the HTTP server embedded in Xvnc will substitute the |
||||
following variables when preceded by a dollar: USER, DESKTOP, DISPLAY, |
||||
APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT. Use two dollar signs |
||||
($$) to get a dollar sign in the generated html. --> |
||||
|
||||
<HTML> |
||||
<TITLE> |
||||
$USER's $DESKTOP desktop ($DISPLAY) |
||||
</TITLE> |
||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar |
||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT> |
||||
<param name=PORT value=$PORT> |
||||
</APPLET> |
||||
<BR> |
||||
<A href="http://ultravnc.sf.net/">UltraVNC Site</A></HTML> |
@ -1,7 +0,0 @@ |
||||
/* AUTOMATICALLY GENERATED ON Tue Apr 16 17:20:59 EDT 2002*/ |
||||
/* DO NOT EDIT */ |
||||
|
||||
grant { |
||||
permission java.security.AllPermission; |
||||
}; |
||||
|
@ -1,2 +0,0 @@ |
||||
javac.exe *.java |
||||
jar.exe cf VncViewer.jar *.class |
@ -1,17 +0,0 @@ |
||||
<!-- This is an example of how to set default options in the Java VNC viewer |
||||
applet - in this case the "Share Desktop" option is set to "No". Any |
||||
option can be set by giving a parameter with the same name as the |
||||
option (spaces are important, but case isn't) --> |
||||
|
||||
<HTML> |
||||
<TITLE> |
||||
$USER's $DESKTOP desktop ($DISPLAY) [not shared] |
||||
</TITLE> |
||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar |
||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT> |
||||
<param name=PORT value=$PORT> |
||||
<param name="share desktop" value=no> |
||||
</APPLET> |
||||
<BR> |
||||
<A href="http://ultravnc.sf.net/">UltraVNC Site</A> |
||||
</HTML> |
@ -1,17 +0,0 @@ |
||||
<?php |
||||
/** |
||||
* Plugin details (must be present) |
||||
*/ |
||||
//the plugin title |
||||
$plugin_info['title']='AppShare'; |
||||
//the comments that go with the plugin |
||||
$plugin_info['comment']="This plugin allows the student to visualize the screen of his teacher."; |
||||
//the locations where this plugin can be shown |
||||
$plugin_info['location']=array('mycourses_main'); |
||||
//the plugin version |
||||
$plugin_info['version']='0.1'; |
||||
//the plugin author |
||||
$plugin_info['author']='Patrick Vandermaesen'; |
||||
//the email adres of the plugin author |
||||
$plugin_info['email']='pvandermaesen@noctis.be'; |
||||
?> |
Binary file not shown.
@ -1,18 +0,0 @@ |
||||
package be.noctis.vnc.relay; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
public interface IProtocolCommand { |
||||
|
||||
public static final int SERVER_CONNECTION = 10; |
||||
public static final int CLIENT_CONNECTION = 20; |
||||
|
||||
public static final int RELAY_CONNECTION = 30; |
||||
|
||||
public Set<Integer> ALL_COMMANDS = new HashSet<Integer>(Arrays.asList(new Integer[] { new Integer(SERVER_CONNECTION), |
||||
new Integer(CLIENT_CONNECTION), |
||||
new Integer(RELAY_CONNECTION)})); |
||||
|
||||
} |
Binary file not shown.
@ -1,24 +0,0 @@ |
||||
package be.noctis.vnc.relay; |
||||
|
||||
public class ProtocolBean { |
||||
|
||||
private int command = -1; |
||||
private String serverID = null; |
||||
|
||||
public int getCommand() { |
||||
return command; |
||||
} |
||||
|
||||
public void setCommand(int command) { |
||||
this.command = command; |
||||
} |
||||
|
||||
public String getServerID() { |
||||
return serverID; |
||||
} |
||||
|
||||
public void setServerID(String serverID) { |
||||
this.serverID = serverID; |
||||
} |
||||
|
||||
} |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,297 +0,0 @@ |
||||
package be.noctis.vnc.relay; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.net.InetAddress; |
||||
import java.net.ServerSocket; |
||||
import java.net.Socket; |
||||
import java.util.HashMap; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
public class Relay { |
||||
|
||||
private ServerSocket listeningSocket; |
||||
|
||||
private List<ConnectClientThread> clientWaitServer = new LinkedList<ConnectClientThread>(); |
||||
|
||||
private Map<String, Socket> commandSockets = new HashMap<String, Socket>(); |
||||
|
||||
private class ConnectClientThread extends Thread { |
||||
|
||||
private int MAX_WAITING_CYCLE = 1000; |
||||
|
||||
private String serverID = null; |
||||
|
||||
private Socket clientSocket = null; |
||||
|
||||
private Socket serverSocket = null; |
||||
|
||||
public ConnectClientThread(String inServerID, Socket inClientSocket) { |
||||
serverID = inServerID; |
||||
clientSocket = inClientSocket; |
||||
} |
||||
|
||||
public void run() { |
||||
try { |
||||
int waitingCycle = 0; |
||||
while ((serverSocket == null) && waitingCycle < MAX_WAITING_CYCLE) { |
||||
synchronized (serverID) { |
||||
serverID.wait(10000); |
||||
} |
||||
waitingCycle++; |
||||
} |
||||
synchronized (clientWaitServer) { |
||||
clientWaitServer.remove(this); |
||||
} |
||||
if (serverSocket != null) { |
||||
System.out.println("New connection create with server : " + serverID); |
||||
RelayThread serverClient = new RelayThread(serverSocket, clientSocket); |
||||
RelayThread clientServer = new RelayThread(clientSocket, serverSocket); |
||||
clientServer.touch(); |
||||
serverClient.start(); |
||||
clientServer.start(); |
||||
} else { |
||||
System.out.println("Error when client create connection to server : " + serverID); |
||||
try { |
||||
clientSocket.close(); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} catch (InterruptedException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
public String getServerID() { |
||||
return serverID; |
||||
} |
||||
|
||||
public void setServerSocket(Socket serverSocket) { |
||||
this.serverSocket = serverSocket; |
||||
synchronized (serverID) { |
||||
serverID.notify(); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
private class RelayThread extends Thread { |
||||
|
||||
private Socket clientSocket = null; |
||||
|
||||
private Socket serverSocket = null; |
||||
|
||||
public RelayThread(Socket server, Socket client) { |
||||
serverSocket = server; |
||||
clientSocket = client; |
||||
} |
||||
|
||||
public void touch() { |
||||
try { |
||||
clientSocket.getOutputStream().write(0); |
||||
} catch (IOException e) { |
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace(); |
||||
} |
||||
System.out.println("touch"); |
||||
} |
||||
|
||||
@Override |
||||
public void run() { |
||||
System.out.println("start a relay"); |
||||
try { |
||||
InputStream in = serverSocket.getInputStream(); |
||||
OutputStream out = clientSocket.getOutputStream(); |
||||
|
||||
byte[] readBuffer = new byte[4096]; |
||||
|
||||
int b = in.read(); |
||||
while (b >= 0) { |
||||
out.write(b); |
||||
if (in.available() == 0) { |
||||
out.flush(); |
||||
} else { |
||||
int readedLength = in.read(readBuffer); |
||||
out.write(readBuffer, 0, readedLength); |
||||
out.flush(); |
||||
} |
||||
b = in.read(); |
||||
} |
||||
|
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
if (clientSocket != null) { |
||||
try { |
||||
clientSocket.close(); |
||||
} catch (IOException e1) { |
||||
e1.printStackTrace(); |
||||
} |
||||
} |
||||
if (serverSocket != null) { |
||||
try { |
||||
serverSocket.close(); |
||||
} catch (IOException e1) { |
||||
e1.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
System.out.println("stop a relay."); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* read a protocol command (first bytes send by client or server or command on command connection) protocol : [command][data length][data]* |
||||
* |
||||
* @param inStream |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
private ProtocolBean readProtocolCommand(InputStream inStream) throws IOException { |
||||
ProtocolBean outBean = new ProtocolBean(); |
||||
int command = inStream.read(); |
||||
if (!IProtocolCommand.ALL_COMMANDS.contains(new Integer(command))) { |
||||
throw new IOException("unknow command found as protocol : " + command); |
||||
} |
||||
outBean.setCommand(command); |
||||
int codeSize = inStream.read(); |
||||
byte[] b = new byte[codeSize]; |
||||
inStream.read(b); |
||||
outBean.setServerID(new String(b)); |
||||
return outBean; |
||||
} |
||||
|
||||
private void sendProtocolCommand(OutputStream out, ProtocolBean bean) throws IOException { |
||||
out.write((byte) bean.getCommand()); |
||||
byte[] data = bean.getServerID().getBytes(); |
||||
out.write(data.length); |
||||
out.write(data); |
||||
out.flush(); |
||||
} |
||||
|
||||
public void addClientSocket(String serverID, Socket inSocket) throws IOException { |
||||
ConnectClientThread cc = new ConnectClientThread(serverID, inSocket); |
||||
cc.start(); |
||||
synchronized (clientWaitServer) { |
||||
clientWaitServer.add(cc); |
||||
} |
||||
askConnection(serverID); |
||||
} |
||||
|
||||
public void askConnection(String serverID) throws IOException { |
||||
|
||||
Socket serverSocket = commandSockets.get(serverID); |
||||
if (serverSocket != null) { |
||||
synchronized (commandSockets) { |
||||
ProtocolBean bean = new ProtocolBean(); |
||||
bean.setCommand(IProtocolCommand.RELAY_CONNECTION); |
||||
// send server ID for check it when server receive this command.
|
||||
bean.setServerID(serverID); |
||||
System.out.println("ask new connection to server local relay : " + serverID); |
||||
sendProtocolCommand(serverSocket.getOutputStream(), bean); |
||||
} |
||||
} else { |
||||
System.out.println("server socket not found : " + serverID); |
||||
} |
||||
} |
||||
|
||||
public void addServerSocket(String serverID, Socket inSocket) { |
||||
commandSockets.put(serverID, inSocket); |
||||
} |
||||
|
||||
public void addRelaySocket(String serverID, Socket inSocket) { |
||||
ConnectClientThread needConnectionFound = null; |
||||
synchronized (clientWaitServer) { |
||||
for (ConnectClientThread cc : clientWaitServer) { |
||||
if (cc.getServerID().equals(serverID)) { |
||||
needConnectionFound = cc; |
||||
} |
||||
} |
||||
if (needConnectionFound != null) { |
||||
clientWaitServer.remove(needConnectionFound); |
||||
} |
||||
} |
||||
needConnectionFound.setServerSocket(inSocket); |
||||
} |
||||
|
||||
private class ClientThread extends Thread { |
||||
|
||||
private Socket newSocket = null; |
||||
|
||||
@Override |
||||
public void run() { |
||||
try { |
||||
|
||||
ProtocolBean bean = readProtocolCommand(newSocket.getInputStream()); |
||||
System.out.println("command receive : " + bean.getCommand() + " serverID : " + bean.getServerID()); |
||||
if (bean.getCommand() == IProtocolCommand.SERVER_CONNECTION) { |
||||
addServerSocket(bean.getServerID(), newSocket); |
||||
} else if (bean.getCommand() == IProtocolCommand.CLIENT_CONNECTION) { |
||||
addClientSocket(bean.getServerID(), newSocket); |
||||
} else if (bean.getCommand() == IProtocolCommand.RELAY_CONNECTION) { |
||||
addRelaySocket(bean.getServerID(), newSocket); |
||||
} |
||||
|
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
public void setNewSocket(Socket newSocket) { |
||||
this.newSocket = newSocket; |
||||
} |
||||
} |
||||
|
||||
public void startRelay(int port, InetAddress ip) { |
||||
try { |
||||
String ipStr = "all"; |
||||
if (ip != null) { |
||||
ipStr = ip.getHostAddress(); |
||||
} |
||||
System.out.println("create server on [port:" + port + "] [ip=" + ipStr + "]"); |
||||
if (ip != null) { |
||||
listeningSocket = new ServerSocket(port, 10, ip); |
||||
} else { |
||||
listeningSocket = new ServerSocket(port, 10); |
||||
} |
||||
for (;;) { |
||||
System.out.println("Wait client..."); |
||||
Socket newSocket = listeningSocket.accept(); |
||||
System.out.println("New client connected."); |
||||
ClientThread clientThread = new ClientThread(); |
||||
clientThread.setNewSocket(newSocket); |
||||
clientThread.start(); |
||||
} |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
Relay rel = new Relay(); |
||||
|
||||
int port = 443; |
||||
InetAddress ip = null; |
||||
if (args.length > 0) { |
||||
String portStr = args[0]; |
||||
try { |
||||
port = Integer.parseInt(portStr); |
||||
|
||||
// ip defined
|
||||
if (args.length > 1) { |
||||
String ipStr = args[1]; |
||||
ip = InetAddress.getByName(ipStr); |
||||
} |
||||
} catch (Throwable e) { |
||||
e.printStackTrace(); |
||||
System.out.println("ERROR : parameter format : [Port number] [ip]"); |
||||
System.exit(-1); |
||||
} |
||||
} |
||||
|
||||
rel.startRelay(port, ip); |
||||
} |
||||
} |
@ -1 +0,0 @@ |
||||
java.exe -cp "s:\Ultravnc.sam\JavaViewer FT" VncViewer HOST localhost PORT 5900 |
@ -1,2 +0,0 @@ |
||||
appletviewer.exe -debug vncviewer.jar |
||||
|
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 1.1 KiB |
@ -1,92 +0,0 @@ |
||||
package DokeosAppShare; |
||||
|
||||
import java.net.*; |
||||
import java.io.*; |
||||
|
||||
/** |
||||
* Summary description for ConnectionToRelay. |
||||
*/ |
||||
public class CommandConnection extends Thread |
||||
{ |
||||
|
||||
/* COMMANDS */ |
||||
public static final int SERVER_CONNECTION = 10; |
||||
public static final int CLIENT_CONNECTION = 20; |
||||
public static final int RELAY_CONNECTION = 30; |
||||
|
||||
Socket relay; |
||||
String serverID; |
||||
|
||||
public CommandConnection(String inServerID) throws IOException |
||||
{ |
||||
serverID = inServerID; |
||||
relay = new Socket(Config.getRelayHostName(), Config.getRelayPort()); |
||||
|
||||
this.setDaemon(true); |
||||
} |
||||
|
||||
public void run() |
||||
{ |
||||
try |
||||
{ |
||||
InputStream in = relay.getInputStream(); |
||||
OutputStream out = relay.getOutputStream(); |
||||
writeCommand(out, SERVER_CONNECTION, serverID); |
||||
for (; ; ) |
||||
{ |
||||
//Wait command from relay |
||||
System.out.println("Waiting command from relay..."); |
||||
int command = in.read(); |
||||
System.out.println("Command receive : " + command); |
||||
if (command == RELAY_CONNECTION) |
||||
{ |
||||
String connServerId = readCommandParam(in); |
||||
System.out.println("relay try connection to : " + connServerId); |
||||
if (connServerId.equals(serverID)) |
||||
{ |
||||
try |
||||
{ |
||||
new ConnectionToRelay(serverID); |
||||
} |
||||
catch (Exception ex) |
||||
{ |
||||
System.out.println("Exception on ConnectionToRelay instanciation"); |
||||
ex.printStackTrace(); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
System.out.println("bad server name : " + connServerId); |
||||
} |
||||
} |
||||
|
||||
} |
||||
} |
||||
catch (IOException ex) |
||||
{ |
||||
System.out.println("Exception in CommandConnection listener thread"); |
||||
ex.printStackTrace(); |
||||
} |
||||
finally |
||||
{ |
||||
try { relay.close(); } |
||||
catch (Exception ex) { } |
||||
//TODO Exit application |
||||
} |
||||
} |
||||
public static String readCommandParam(InputStream in) throws IOException |
||||
{ |
||||
int size = in.read(); |
||||
byte[] data = new byte[size]; |
||||
in.read(data); |
||||
return new String(data); |
||||
} |
||||
public static void writeCommand(OutputStream out, int command, String param) throws IOException |
||||
{ |
||||
out.write(command); |
||||
byte[] data = param.getBytes(); |
||||
out.write(data.length); |
||||
out.write(data); |
||||
} |
||||
|
||||
} |
@ -1,64 +0,0 @@ |
||||
package DokeosAppShare; |
||||
|
||||
/** |
||||
* Summary description for Config. |
||||
*/ |
||||
public class Config |
||||
{ |
||||
public static String getVNCExecutableURL() |
||||
{ |
||||
return "http://dokeos.noctis.be/vnc/winvnc.exe"; |
||||
} |
||||
|
||||
public static void writeRegOptions() |
||||
{ |
||||
final String KEY_PATH = "SOFTWARE\\ORL"; |
||||
final String SUB_KEY_PATH = "WinVNC3"; |
||||
Microsoft.Win32.RegistryKey lm = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(KEY_PATH); |
||||
Microsoft.Win32.RegistryKey cu = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(KEY_PATH); |
||||
try |
||||
{ |
||||
lm.DeleteSubKeyTree(SUB_KEY_PATH); |
||||
cu.DeleteSubKeyTree(SUB_KEY_PATH); |
||||
} |
||||
catch (Exception e) |
||||
{ |
||||
} |
||||
lm = lm.CreateSubKey(SUB_KEY_PATH); |
||||
cu = cu.CreateSubKey(SUB_KEY_PATH); |
||||
lm.SetValue("AllowLoopback", new Integer(1), Microsoft.Win32.RegistryValueKind.DWord); |
||||
lm.SetValue("LoopbackOnly", new Integer(1), Microsoft.Win32.RegistryValueKind.DWord); |
||||
//lm.SetValue("DisableTrayIcon", new Integer(1), Microsoft.Win32.RegistryValueKind.DWord); |
||||
cu.SetValue("Password", (Object)new ubyte[] { (ubyte)0x8C, (ubyte)0xEA, (ubyte)0x0C, (ubyte)0x33, (ubyte)0x74, (ubyte)0xAC, (ubyte)0x87, (ubyte)0x17 }, Microsoft.Win32.RegistryValueKind.Binary); |
||||
cu.SetValue("InputsEnabled", new Integer(0), Microsoft.Win32.RegistryValueKind.DWord); |
||||
cu.SetValue("LocalInputsDisabled", new Integer(0), Microsoft.Win32.RegistryValueKind.DWord); |
||||
cu.SetValue("FileTransferEnabled", new Integer(0), Microsoft.Win32.RegistryValueKind.DWord); |
||||
} |
||||
|
||||
public static int getConnexionCount() |
||||
{ |
||||
return 5; |
||||
} |
||||
|
||||
public static String getRelayHostName() |
||||
{ |
||||
//return "dokeos.noctis.be"; |
||||
//return "localhost"; |
||||
return "www.dokeos.com"; |
||||
} |
||||
|
||||
public static int getRelayPort() |
||||
{ |
||||
return 443; |
||||
} |
||||
|
||||
public static String getVNCHostName() |
||||
{ |
||||
return "localhost"; |
||||
} |
||||
|
||||
public static int getVNCPort() |
||||
{ |
||||
return 5900; |
||||
} |
||||
} |
@ -1,101 +0,0 @@ |
||||
package DokeosAppShare; |
||||
|
||||
import java.net.*; |
||||
import java.io.*; |
||||
|
||||
/** |
||||
* Summary description for ConnectionToRelay. |
||||
*/ |
||||
public class ConnectionToRelay |
||||
{ |
||||
Socket relay; |
||||
ReadWriteThread thrdReadRelay; |
||||
Socket vnc; |
||||
ReadWriteThread thrdReadVNC; |
||||
|
||||
public ConnectionToRelay(String serverID) throws IOException |
||||
{ |
||||
relay = new Socket(Config.getRelayHostName(), Config.getRelayPort()); |
||||
|
||||
OutputStream out = relay.getOutputStream(); |
||||
|
||||
CommandConnection.writeCommand(out, CommandConnection.RELAY_CONNECTION, serverID); |
||||
|
||||
InputStream in = relay.getInputStream(); |
||||
|
||||
//Wait for byte from relay |
||||
System.out.println("Waiting for byte from relay..."); |
||||
int read = in.read(); |
||||
System.out.println("read on relay socket : " + read); |
||||
|
||||
//Connect to VNC |
||||
System.out.println("Connecting to VNC..."); |
||||
vnc = new Socket(Config.getVNCHostName(), Config.getVNCPort()); |
||||
|
||||
//Duplex |
||||
thrdReadRelay = new ReadWriteThread(relay, vnc); |
||||
thrdReadRelay.setDaemon(true); |
||||
thrdReadRelay.start(); |
||||
thrdReadVNC = new ReadWriteThread(vnc, relay); |
||||
thrdReadVNC.setDaemon(true); |
||||
thrdReadVNC.start(); |
||||
System.out.println("Duplex started"); |
||||
} |
||||
} |
||||
|
||||
class ReadWriteThread extends Thread |
||||
{ |
||||
private final Socket socketIn; |
||||
private final Socket socketOut; |
||||
|
||||
public ReadWriteThread(final Socket socketIn, final Socket socketOut) |
||||
{ |
||||
this.socketIn = socketIn; |
||||
this.socketOut = socketOut; |
||||
} |
||||
|
||||
public void run() |
||||
{ |
||||
try |
||||
{ |
||||
readWrite(socketIn.getInputStream(), socketOut.getOutputStream()); |
||||
} |
||||
catch (Throwable e) |
||||
{ |
||||
e.printStackTrace(); |
||||
try |
||||
{ |
||||
socketIn.close(); |
||||
} |
||||
catch (Exception ex) |
||||
{ |
||||
ex.printStackTrace(); |
||||
} |
||||
try |
||||
{ |
||||
socketOut.close(); |
||||
} |
||||
catch (Exception ex) |
||||
{ |
||||
ex.printStackTrace(); |
||||
} |
||||
} |
||||
System.out.println("end connection relay."); |
||||
} |
||||
|
||||
private void readWrite(InputStream in, OutputStream out) throws IOException |
||||
{ |
||||
int b = 0; |
||||
int readCount = 0; |
||||
byte[] buffer = new byte[1024*10]; |
||||
|
||||
b = in.read(); |
||||
while (b >= 0) |
||||
{ |
||||
out.write(b); |
||||
readCount = in.read(buffer, 0, buffer.length); |
||||
out.write(buffer, 0, readCount); |
||||
b = in.read(); |
||||
} |
||||
} |
||||
} |
@ -1,11 +0,0 @@ |
||||
package DokeosAppShare; |
||||
import java.io.*; |
||||
|
||||
public interface DownloadProgressEventListener |
||||
{ |
||||
void connecting(); |
||||
void started(); |
||||
void progressChange(int progress, int max); |
||||
void done(File fileDest) throws Exception; |
||||
void exception(Exception ex); |
||||
} |
@ -1,154 +0,0 @@ |
||||
package DokeosAppShare; |
||||
import java.net.*; |
||||
import java.io.*; |
||||
import java.util.*; |
||||
|
||||
/** |
||||
* Summary description for DownloadThread. |
||||
*/ |
||||
public class DownloadThread extends Thread |
||||
{ |
||||
private List listeners = new LinkedList(); |
||||
private URL fileURL; |
||||
private File fileDest; |
||||
|
||||
private boolean canceling = false; |
||||
|
||||
public DownloadThread(URL fileURL, File fileDest) |
||||
{ |
||||
this.fileURL = fileURL; |
||||
this.fileDest = fileDest; |
||||
} |
||||
|
||||
public void cancel() |
||||
{ |
||||
canceling = true; |
||||
} |
||||
|
||||
public void run() |
||||
{ |
||||
try |
||||
{ |
||||
fireConnecting(); |
||||
URLConnection connection = fileURL.openConnection(); |
||||
int max = connection.getContentLength(); |
||||
InputStream in = connection.getInputStream(); |
||||
OutputStream out = new FileOutputStream(fileDest); |
||||
fireStarted(); |
||||
fireProgressChange(0, max); |
||||
{ |
||||
int count = 0; |
||||
int b = 0; |
||||
int readCount = 0; |
||||
byte[] buffer = new byte[1024*10]; |
||||
|
||||
b = in.read(); |
||||
while (!canceling && b >= 0) |
||||
{ |
||||
out.write(b); |
||||
count += 1; |
||||
readCount = in.read(buffer, 0, buffer.length); |
||||
out.write(buffer, 0, readCount); |
||||
count += readCount; |
||||
fireProgressChange(count, max); |
||||
b = in.read(); |
||||
} |
||||
} |
||||
in.close(); |
||||
out.close(); |
||||
if (!canceling) |
||||
{ |
||||
fireDone(fileDest); |
||||
} |
||||
else |
||||
{ |
||||
//fireCancel(fileDest);
|
||||
} |
||||
} |
||||
catch (Exception ex) |
||||
{ |
||||
fireException(ex); |
||||
ex.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
public void addDownloadProgressEventListener(DownloadProgressEventListener eventListener) |
||||
{ |
||||
synchronized (listeners) |
||||
{ |
||||
listeners.add(eventListener); |
||||
} |
||||
} |
||||
|
||||
public void removeDownloadProgressEventListener(DownloadProgressEventListener eventListener) |
||||
{ |
||||
synchronized (listeners) |
||||
{ |
||||
listeners.remove(eventListener); |
||||
} |
||||
} |
||||
|
||||
protected void fireConnecting() |
||||
{ |
||||
Object[] ls; |
||||
synchronized (listeners) |
||||
{ |
||||
ls = listeners.toArray(); |
||||
} |
||||
for (int i = 0; i < ls.length; i++) |
||||
{ |
||||
((DownloadProgressEventListener)ls[i]).connecting(); |
||||
} |
||||
} |
||||
|
||||
protected void fireStarted() |
||||
{ |
||||
Object[] ls; |
||||
synchronized (listeners) |
||||
{ |
||||
ls = listeners.toArray(); |
||||
} |
||||
for (int i = 0; i < ls.length; i++) |
||||
{ |
||||
((DownloadProgressEventListener)ls[i]).started(); |
||||
} |
||||
} |
||||
|
||||
protected void fireProgressChange(int progress, int max) |
||||
{ |
||||
Object[] ls; |
||||
synchronized (listeners) |
||||
{ |
||||
ls = listeners.toArray(); |
||||
} |
||||
for (int i = 0; i < ls.length; i++) |
||||
{ |
||||
((DownloadProgressEventListener)ls[i]).progressChange(progress, max); |
||||
} |
||||
} |
||||
|
||||
protected void fireDone(File fileDest) throws Exception |
||||
{ |
||||
Object[] ls; |
||||
synchronized (listeners) |
||||
{ |
||||
ls = listeners.toArray(); |
||||
} |
||||
for (int i = 0; i < ls.length; i++) |
||||
{ |
||||
((DownloadProgressEventListener)ls[i]).done(fileDest); |
||||
} |
||||
} |
||||
protected void fireException(Exception ex) |
||||
{ |
||||
Object[] ls; |
||||
synchronized (listeners) |
||||
{ |
||||
ls = listeners.toArray(); |
||||
} |
||||
for (int i = 0; i < ls.length; i++) |
||||
{ |
||||
((DownloadProgressEventListener)ls[i]).exception(ex); |
||||
} |
||||
} |
||||
} |
@ -1,231 +0,0 @@ |
||||
package DokeosAppShare; |
||||
|
||||
import System.Collections.Generic.*; |
||||
import System.ComponentModel.*; |
||||
import System.Data.*; |
||||
import System.Drawing.*; |
||||
import System.Windows.Forms.*; |
||||
import java.io.*; |
||||
|
||||
/** |
||||
* Summary description for LocalRelay. |
||||
*/ |
||||
public class LocalRelay extends System.Windows.Forms.Form implements DownloadProgressEventListener |
||||
{ |
||||
private Thread thread; |
||||
private DownloadThread download; |
||||
|
||||
private Button button1; |
||||
private PictureBox pictureBox1; |
||||
private ProgressBar prgDownload; |
||||
private Label serverID; |
||||
/** |
||||
* Required designer variable. |
||||
*/ |
||||
private System.ComponentModel.IContainer components; |
||||
|
||||
public LocalRelay(DownloadThread download) |
||||
{ |
||||
// |
||||
// Required for Windows Form Designer support |
||||
// |
||||
InitializeComponent(); |
||||
|
||||
this.thread = Thread.currentThread(); |
||||
this.download = download; |
||||
this.download.addDownloadProgressEventListener(this); |
||||
} |
||||
|
||||
#region Windows Form Designer generated code |
||||
/** |
||||
* Clean up any resources being used. |
||||
*/ |
||||
protected void Dispose(boolean disposing) |
||||
{ |
||||
if (disposing) |
||||
{ |
||||
if (components != null) |
||||
{ |
||||
components.Dispose(); |
||||
} |
||||
} |
||||
super.Dispose(disposing); |
||||
} |
||||
|
||||
/** |
||||
* Required method for Designer support - do not modify |
||||
* the contents of this method with the code editor. |
||||
*/ |
||||
private void InitializeComponent() |
||||
{ |
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(LocalRelay.class.ToType()); |
||||
this.button1 = new System.Windows.Forms.Button(); |
||||
this.pictureBox1 = new System.Windows.Forms.PictureBox(); |
||||
this.prgDownload = new System.Windows.Forms.ProgressBar(); |
||||
this.serverID = new System.Windows.Forms.Label(); |
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); |
||||
this.SuspendLayout(); |
||||
// |
||||
// button1 |
||||
// |
||||
this.button1.set_Image(((System.Drawing.Image)(resources.GetObject("button1.Image")))); |
||||
this.button1.set_Location(new System.Drawing.Point(170, 231)); |
||||
this.button1.set_Name("button1"); |
||||
this.button1.set_Size(new System.Drawing.Size(49, 42)); |
||||
this.button1.set_TabIndex(2); |
||||
this.button1.set_UseVisualStyleBackColor(true); |
||||
this.button1.add_Click(new System.EventHandler(this.button1_Click)); |
||||
// |
||||
// pictureBox1 |
||||
// |
||||
this.pictureBox1.set_Image(((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")))); |
||||
this.pictureBox1.set_Location(new System.Drawing.Point(20, 11)); |
||||
this.pictureBox1.set_Name("pictureBox1"); |
||||
this.pictureBox1.set_Size(new System.Drawing.Size(199, 182)); |
||||
this.pictureBox1.set_TabIndex(4); |
||||
this.pictureBox1.set_TabStop(false); |
||||
// |
||||
// prgDownload |
||||
// |
||||
this.prgDownload.set_Location(new System.Drawing.Point(20, 199)); |
||||
this.prgDownload.set_Name("prgDownload"); |
||||
this.prgDownload.set_Size(new System.Drawing.Size(199, 26)); |
||||
this.prgDownload.set_Style(System.Windows.Forms.ProgressBarStyle.Marquee); |
||||
this.prgDownload.set_TabIndex(6); |
||||
this.prgDownload.set_Value(50); |
||||
// |
||||
// serverID |
||||
// |
||||
this.serverID.set_AutoSize(true); |
||||
this.serverID.set_Location(new System.Drawing.Point(17, 239)); |
||||
this.serverID.set_Name("serverID"); |
||||
this.serverID.set_Size(new System.Drawing.Size(10, 13)); |
||||
this.serverID.set_TabIndex(7); |
||||
this.serverID.set_Text("."); |
||||
// |
||||
// LocalRelay |
||||
// |
||||
this.set_AutoScaleDimensions(new System.Drawing.SizeF(6F, 13F)); |
||||
this.set_AutoScaleMode(System.Windows.Forms.AutoScaleMode.Font); |
||||
this.set_ClientSize(new System.Drawing.Size(237, 287)); |
||||
this.get_Controls().Add(this.serverID); |
||||
this.get_Controls().Add(this.prgDownload); |
||||
this.get_Controls().Add(this.pictureBox1); |
||||
this.get_Controls().Add(this.button1); |
||||
this.set_FormBorderStyle(System.Windows.Forms.FormBorderStyle.FixedSingle); |
||||
this.set_Icon(((System.Drawing.Icon)(resources.GetObject("$this.Icon")))); |
||||
this.set_MaximizeBox(false); |
||||
this.set_Name("LocalRelay"); |
||||
this.set_Text("LocalRelay"); |
||||
this.add_FormClosed(new System.Windows.Forms.FormClosedEventHandler(this.LocalRelay_FormClosed)); |
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); |
||||
this.ResumeLayout(false); |
||||
this.PerformLayout(); |
||||
|
||||
} |
||||
#endregion |
||||
|
||||
/** @delegate */ |
||||
private delegate void connectingDelegate(); |
||||
public void connecting() |
||||
{ |
||||
if (!Thread.currentThread().equals(thread)) |
||||
{ |
||||
this.BeginInvoke(new connectingDelegate(this.connecting)); |
||||
return; |
||||
} |
||||
prgDownload.set_Style(ProgressBarStyle.Marquee); |
||||
prgDownload.set_Value(prgDownload.get_Maximum()); |
||||
} |
||||
/** @delegate */ |
||||
private delegate void startedDelegate(); |
||||
public void started() |
||||
{ |
||||
if (!Thread.currentThread().equals(thread)) |
||||
{ |
||||
this.BeginInvoke(new startedDelegate(this.started)); |
||||
return; |
||||
} |
||||
prgDownload.set_Style(ProgressBarStyle.Blocks); |
||||
prgDownload.set_Value(prgDownload.get_Minimum()); |
||||
} |
||||
/** @delegate */ |
||||
private delegate void progressChangeIntegerDelegate(Integer progress, Integer max); |
||||
private void progressChangeInteger(Integer progress, Integer max) { progressChange(progress.intValue(), max.intValue()); } |
||||
public void progressChange(int progress, int max) |
||||
{ |
||||
if (!Thread.currentThread().equals(thread)) |
||||
{ |
||||
this.BeginInvoke(new progressChangeIntegerDelegate(this.progressChangeInteger), new Object[] { new Integer(progress), new Integer(max) }); |
||||
return; |
||||
} |
||||
if (max <= 0) |
||||
{ |
||||
max = 364544; |
||||
} |
||||
if (progress > max) |
||||
{ |
||||
progress = max; |
||||
} |
||||
prgDownload.set_Value(progress); |
||||
prgDownload.set_Maximum(max); |
||||
} |
||||
/** @delegate */ |
||||
private delegate void doneDelegate(File fileDest); |
||||
public void done(File fileDest) |
||||
{ |
||||
if (!Thread.currentThread().equals(thread)) |
||||
{ |
||||
if (download != null) |
||||
{ |
||||
download.removeDownloadProgressEventListener(this); |
||||
download = null; |
||||
} |
||||
|
||||
this.BeginInvoke(new doneDelegate(this.done), new Object[] { fileDest }); |
||||
return; |
||||
} |
||||
//this.set_Text("done"); |
||||
//prgDownload.set_Value(0); |
||||
} |
||||
/** @delegate */ |
||||
private delegate void exceptionDelegate(Exception ex); |
||||
public void exception(Exception ex) |
||||
{ |
||||
ex.printStackTrace(System.out); |
||||
if (!Thread.currentThread().equals(thread)) |
||||
{ |
||||
this.BeginInvoke(new exceptionDelegate(this.exception), new Object[] { ex }); |
||||
return; |
||||
} |
||||
//this.set_Text("Exception: " + ex.getMessage()); |
||||
String errorMsg = "Connection error."; |
||||
if (ex.getMessage() != null) |
||||
{ |
||||
errorMsg = ex.getMessage(); |
||||
} |
||||
MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); |
||||
Application.Exit(); |
||||
} |
||||
|
||||
private void button1_Click(Object sender, System.EventArgs e) |
||||
{ |
||||
this.Close(); |
||||
} |
||||
|
||||
private void LocalRelay_FormClosed(Object sender, FormClosedEventArgs e) |
||||
{ |
||||
if (download != null) |
||||
{ |
||||
download.removeDownloadProgressEventListener(this); |
||||
download.cancel(); |
||||
download = null; |
||||
} |
||||
} |
||||
|
||||
public void setServerID(String inServerID) |
||||
{ |
||||
serverID.set_Text(inServerID); |
||||
} |
||||
|
||||
} |
@ -1,848 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<root> |
||||
<!-- |
||||
Microsoft ResX Schema |
||||
|
||||
Version 2.0 |
||||
|
||||
The primary goals of this format is to allow a simple XML format |
||||
that is mostly human readable. The generation and parsing of the |
||||
various data types are done through the TypeConverter classes |
||||
associated with the data types. |
||||
|
||||
Example: |
||||
|
||||
... ado.net/XML headers & schema ... |
||||
<resheader name="resmimetype">text/microsoft-resx</resheader> |
||||
<resheader name="version">2.0</resheader> |
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
||||
<value>[base64 mime encoded serialized .NET Framework object]</value> |
||||
</data> |
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
||||
<comment>This is a comment</comment> |
||||
</data> |
||||
|
||||
There are any number of "resheader" rows that contain simple |
||||
name/value pairs. |
||||
|
||||
Each data row contains a name, and value. The row also contains a |
||||
type or mimetype. Type corresponds to a .NET class that support |
||||
text/value conversion through the TypeConverter architecture. |
||||
Classes that don't support this are serialized and stored with the |
||||
mimetype set. |
||||
|
||||
The mimetype is used for serialized objects, and tells the |
||||
ResXResourceReader how to depersist the object. This is currently not |
||||
extensible. For a given mimetype the value must be set accordingly: |
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format |
||||
that the ResXResourceWriter will generate, however the reader can |
||||
read any of the formats listed below. |
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64 |
||||
value : The object must be serialized into a byte array |
||||
: using a System.ComponentModel.TypeConverter |
||||
: and then encoded with base64 encoding. |
||||
--> |
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> |
||||
<xsd:element name="root" msdata:IsDataSet="true"> |
||||
<xsd:complexType> |
||||
<xsd:choice maxOccurs="unbounded"> |
||||
<xsd:element name="metadata"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" use="required" type="xsd:string" /> |
||||
<xsd:attribute name="type" type="xsd:string" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="assembly"> |
||||
<xsd:complexType> |
||||
<xsd:attribute name="alias" type="xsd:string" /> |
||||
<xsd:attribute name="name" type="xsd:string" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="data"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> |
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="resheader"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:choice> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:schema> |
||||
<resheader name="resmimetype"> |
||||
<value>text/microsoft-resx</value> |
||||
</resheader> |
||||
<resheader name="version"> |
||||
<value>2.0</value> |
||||
</resheader> |
||||
<resheader name="reader"> |
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
<resheader name="writer"> |
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> |
||||
<data name="button1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value> |
||||
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 |
||||
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABxxJREFUWEell3dM |
||||
VFkUxi/2uqIUERFcNSq6mth7WXuL3cRYo66F6Lrqura4ltgWe1kTRUGy2aZ/amJBdkFhARUEC0MXWBmG |
||||
YWBmGGbeMCie/c5jHjIMTZfki86b++73u+ece+4dF9GIv2NCfOMixLVGDK0a0lSIn3cL8e2nvFPr2JNC |
||||
bLjq7i6VBgaS9dIlZ128SNbz58l67hxJp0+TdPIkWU6coN/9/CS8e+p/AfwkRMBVDw+p5MgR0qxfT2kT |
||||
JzpqwgRKg1LHj6fUceModexYSh0zhnIXLqSS/fvpNx8fCXMggJ/xFyjElmuenlLJ0aOk2bCB0iZNctTX |
||||
X1Mai6FqgcgBhHHPHvrV25shDn8SAsy3srnp2DHK55VPniwrfcoUWcpnGaoeiNwFC8iwcyf94uXFEPsa |
||||
BYG8bQ/28rIo5opp+tSp5CAFpDYIeypSR4+mnPnzSb9tG93AgrCw7+uF4AEhdnP1unWVK2bjadMoffr0 |
||||
j+LP/LwmRI1UpABANWoUZc+bR/otWyjE3d2CBX5XKwTMfwjt0kUOu3rt2o8hZyOYq2fPpnJMlDVjRiWI |
||||
HUJOR7Uo6AAl4R0uSBUAkgHweuRIGaJo0yYK7tSJ0xHgAIEHe0K9veWw561eXTmhknNMpp41i2xr1pDh |
||||
5k2yLl5MmXUAFALKsnkzGc+eJRPGMMBrALwCwMsRIyhrzhzSIrJBHTpI3FuqII4LQRJeylu5srKqubAA |
||||
wSFWY8VlgMrPyCC1Wk3627fJigrPrJECHcZJCLM6N5fy8vLIgP5gwrPqAInDhlEmIlmMXcWeDgBWvMD7 |
||||
mbeUAsBReI9J9Lduyeb5+fmk0WjIcOdOJYQ9/DpMKm3fTgUw5u95XH5aGhHezUAqXiACScOHEwM8HzqU |
||||
DIhS/QDVosAmZYsWkf7uXSooKCCtVkuFhYVkvHePrEuXUtHcuWTdvZt0MObv5DFZWVSG7ZuNKMrmCH8i |
||||
AJ4DIGHIEDIEBNQBwN1MiYLS9ZCODIZYtoyMYWGyuU6no6KiIjLhsw3NpgjG/Ex+npNDNqQiG/XwAvlP |
||||
AkAiAGRzrD4eAPqNG2sBuHChspXaIWqCZACkDIVoioig4uJi0uv1znr7lmw7dlD2zJmO5lh9AgDiAfBs |
||||
8GDSIzrOKWAA9HFZtYGgNhjCiq1kjowkg8FARqPxo5CC8r17KRs7xmHlMI8fNIieDhhAcf7+FNu3LxWj |
||||
qJ0BcKKlIGTcvaogFBCOil3FSEX58eNUUlJCJpOpSpbERKpAIb7CHM969aJYT0+KbtuWIps0oQhU/N/Q |
||||
X1A4pMVczgA4TlOQryoIBaRaVAqXLycbImXC6ktLS2WZzWZZ8v8RGTMKNqZ5c3oEo0iopnkYA2BOJwDp |
||||
zBlKQbHIsoMwjAJUuGoV2S5fplKEnc0sFgtJqAMrKp4BOBoclVLUiHnFCopu0cLB/CGM2fwBVIB5nQFO |
||||
naIUFEoKcuYAAhjZPCioauVsbkUUyg8fpgpUdFlsrAzEYDJEVBSVotk8btlSDnt18/v4rMGczgC48ahQ |
||||
pTKEAgIYHVpnWXAwlcCQVymbY+W2gwdJhVzHwcSCbWeLj6+C4OI0xcSQGTsiAt8rK2fzewyAeZ0AzCis |
||||
XDQVFfYpgyiy4jZkCQ+vXBmHHvvfhkuKqk8fisZkUVBMq1Zk2bWLylCInA4ea8zOpg+4nkV7eMhhV8zv |
||||
oyjzMb8DAA6ji3/27Gk17ttHOTgwVNirrGTAJCMapgMHyPLwIZWg4diQKlW/flXmjzE5F1x069ZkPnSI |
||||
pJcvqRQtme+JMV27Opmn9e5NCd27f3AA4EMBt8cLf/ToYTVs3UpvuH/j5edubvQUIXzStCnxc8JOUWE/ |
||||
KytXzLnaeZs9atOGLACsuHKFYnx8HMwfYI4M9ICnfn4VgS4uxTj+/Z3uBXh4LtTNTSpasoRUfn70BJPG |
||||
QbEsTJDAe9sedsW85jaLQCQeubo6mjdrRpnchHx9K+BRcESIL+u8GWHAmdCOHaVCnHbJvr6yeQz0D4e5 |
||||
AfOa1c4FF8bmSFmUj8973Ib+xfw+Dd4N+T4f4uoqFaIok7t1czKvrcHUZv4QDelN//4U4e39DsbpSLNn |
||||
g+bKgKOIRAhuLlr09lfIJ1c7h72x5uFoRNmolzAvr3cnhFAtEaJro80xsC3ktVeIK9fbt7cW4GhNQlE2 |
||||
2hyFmzNwIN3t3PkdfhAk+wkxGPNx6DtA+JVX/x8P+AJi4r64R98IateujG89RThmdbjr6XAd0+KOoMXp |
||||
qMUpyYcL93cNWqwGrTwfW/eOh0f5j0IkuQsxEfN8BYFDdGwMAOPht6U8uBvkv0OI67xvP0X7hYhrL8Q4 |
||||
uzlXvSvUpKHV1/yeQTgdnaGeUH9oEDQCGguNhybYxWajoCHQAPt4Lro2n2NcFyinh6FaQK2g1nYD/pc/ |
||||
83P+vsE8Kwb/ARnx5FQWQTVzAAAAAElFTkSuQmCC |
||||
</value> |
||||
</data> |
||||
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value> |
||||
Qk3GjgAAAAAAADIEAAAoAAAAxAAAALUAAAABAAgAAAAAAAAAAADTDgAA0w4AAP8AAAD/AAAAAAMA/wAB |
||||
Cf8IAgX/BQsF/wIUAv8DAy3/DhEP/wMgCf8CBUH/Ex0S/wgpAv8iGxf/GRwb/wQzA/8MHzH/Aj4D/ywn |
||||
Jf8MPAn/BTwN/zEvGf8oKin/Iy4j/ys6Cv8bFGb/XzIb/0cyJf8lRQ3/VDMg/xY6K/8IUQT/EhN9/wBS |
||||
Cf8SSxH/NDU0/xpKFf8yIWL/DFsB/w0OoP8pGof/QEkn/3NEIP8XNWL/BGcH/wVaJP9zPzL/V0wj/z9C |
||||
QP9nRi3/Aw3D/wAXsf9eRjP/RTRg/wc1eP8CKpD/CAPi/wIA7f9cP1L/BXcH/wFKY/8SCtv/AH0A/wt8 |
||||
AP8MQHb/AAL2/xtTTf8FAP3/AAD//3VTMv8DggD/AoAH/25HUP8AhQD/hVQx/whWXv9dU0j/AlxY/2xV |
||||
Qv8XdyD/UVRR/xFCjP8QigD/MEl1/yNIf/8MhRP/PFJs/0RhTv8rUnb/FIMh/51fN/8LfTL/KSjP/0Rd |
||||
Xf+LX0H/lWE6/wNWjP8XkBP/alVs/4hkRv9eYWH/IVGa/zl5Rv8Zbm7/GX5P/ylYlv8TeV//rWdN/z08 |
||||
y/8VZ4b/C3N0/0VjgP8UU7L/gWtc/xxXqf8zb3L/u3E9/75uQv+jcEj/rnFC/7FuR/91bGH/Ol6T/7Vy |
||||
P/9SZX7/R2CM/zpZof/GbkX/GFqv/yuKTv9BVrH/MVe1/21xcf8DhXz/fXJ4/7x9Tv8Ag4j/D1zQ/w+D |
||||
hP+ofVz/Fn6S/09R1/9Bjm7/M4KN/7SBYP8ab7z/an2F/yRoyv97f33/vYRb/zyIhf8Ua83/iYB6/5yC |
||||
cf86b8P/SYaS/wRq4/9aa8T/QXuv/yJ/tP9gY9X/H2ve/3mBlv9WeLX/AGX7/3qUdP9afqz/a4Gh/xd0 |
||||
3v/Kk23/Jnfh/yOB0P8ab/f/Mnje/yV17P+Ykon/w5Z0/6uTg/+BkZj/jpOS/4OEwv97fNb/ZJeq/xl9 |
||||
/v8jfvv/JXz//y1++f97heD/Qojx/9GlhP9olsn/l6Cl/3WXxf9tktP/WJDi/8ankf+ipKX/jZ66/zaQ |
||||
+P+ppaX/LJT7/zqa9P8um/n/lpvZ/7Gptv9QnvH/1bSb/5el0v+nsrT/t7Kx/7G0sf+ersz/car0/12w |
||||
8f+8v77/38Ou/5W35P+tvtP/2cW2/6a92v+Kt/L/zMXA/7rC1P9+vfX/tr3j/8XJyP/p0cD/ssvm/87S |
||||
0f+/097/yc/j/+HWzf/a2NH/2tPd/9rW2P/W2tn/rNj8/+Xi3v/b3ez/3uLi/+/k2v/N4Pn/1ubq/+jr |
||||
6f/u6+j/6fP4//H18//69fX//fb////+7//s/Pv/+Pv5//P9/f/6+/////74///7/v/8//3//v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v5ydnJy |
||||
dnJ2cnJ5eXL+/v7+/v7+/v7+/v7+/v7+/v5ydnJ2cnZ5dnl2/v7+/v7+/v7+/nl5dnZy/v7+/v7+/v5y |
||||
eXJ5dnJ5/v7+/nJ2cnlycnZydnJ2cnZydnL+/v7+/v7+/v5ydnJ2cnZ5dnl2/v7+/v7+/v7+/v7+cnZy |
||||
dnJ2cnZ2eXb+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+eXl5eXl5eXl5dnZ5cnl5/v7+/v7+/v7+/v7+/nl2eXl5eXl5dnlyeXl5/v7+/v7+ |
||||
/v52dnl5ef7+/v7+/v55eXZ5cnl5/v7+/v55eXl2eXl5eXl5eXl5eXl5/v7+/v7+/nl2eXl5eXl5dnly |
||||
eXl5/v7+/v7+/v52cnl5eXl5eXl5eXJ5eXn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nJ2cnZ2cnZydnJ5eXZ5cnJ2/v7+/v7+/v7+/nZ2dnl2 |
||||
cnZydnJ5cnlycnb+/v7+/v7+dnl5dnL+/v7+/v52eXJ2eXZ5/v7+/v7+cnZydnl2dnJ2cnZydnJ2cv7+ |
||||
/v7+/nZ2dnl2cnZydnJ5cnlycnb+/v7+/v7+dnl5dnJ2cnZydnJyeXJ2cv7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5eXl5eXl5cnZ5dnl5 |
||||
eXn+/v7+/v7+/nJ5eXlyeXl5eXl5cnl2eXl5ef7+/v7+/nlycnl5/v7+/v7+eXZ5eXJ5/v7+/v7+/nl5 |
||||
eXlyeXl5eXl5eXl5eXn+/v7+/nJ5eXlyeXl5eXl5cnl2eXl5ef7+/v7+/nlydnl5eXl5eXl5eXZ5eXl5 |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
cnZydnL+/v7+/v55eXJ5dnZy/v7+/v7+/nZyeXJycnn+/v7+/v55dnl2dnL+/v7+/v5ycnl5cv7+/v7+ |
||||
cnlyeXZyef7+/v7+/v5ydnJ2cnn+/v7+/v7+/v7+/v7+/nZyeXJycnn+/v7+/v55dnl2dnL+/v7+/v52 |
||||
cnl5/v7+/v7+/v52eXZydnL+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/nl5eXl5/v7+/v7+/nJ5cnl5eXn+/v7+/v55eXZ5eXn+/v7+/v7+/nlyeXl5 |
||||
ef7+/v7+eXl2dnn+/v7+eXl2eXJ5ef7+/v7+/v7+eXl5eXn+/v7+/v7+/v7+/v7+/v55eXZ5eXn+/v7+ |
||||
/v7+/nlyeXl5ef7+/v7+eXn+/v7+/v7+/v7+eXJ5eXl5/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v5ydnJ2cv7+/v7+/v7+eXZ5cnJ2cv7+/v5ydnJ2 |
||||
eXb+/v7+/v7+/v55cnlycnb+/v7+/nJ2dnl5/v7+cnlydnl2ef7+/v7+/v7+/nJ2cnZy/v7+/v7+/v7+ |
||||
/v7+/v5ydnJ2eXb+/v7+/v7+/v55cnlycnb+/v7+/v7+/v7+/v7+/v7+/nZyeXJ2cv7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+eXl5eXn+/v7+/v7+ |
||||
/v55dnl5eXn+/v7+eXl5eXJ5/v7+/v7+/v7+/nl2eXl5ef7+/v55eXlycnL+/nl2eXlyef7+/v7+/v7+ |
||||
/v55eXl5ef7+/v7+/v7+/v7+/v7+eXl5eXJ5/v7+/v7+/v7+/nl2eXl5ef7+/v7+/v7+/v7+/v7+/nl5 |
||||
eXZ5eXn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/nZ2cnZy/v7+/v7+/v7+eXJ5dnZy/v7+/nJ2cnZyef7+/v7+/v7+/v55dnl2dnL+/v7+cnZycoV5 |
||||
eXZydnl2cnn+/v7+/v7+/v7+cnZydnL+/v7+/v7+/v7+/v7+/nJ2cnZyef7+/v7+/v7+/v55dnl2dnL+ |
||||
/v7+/v7+/v7+/nZyeXl5cnJ2eXZy/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5ef7+/v7+/v7+/nZ5cnl5ef7+/v55eXl5ef7+/v7+/v7+/v7+ |
||||
dnlyeXl5/v7+/nl5eXZydnZ5eXlyeXn+/v7+/v7+/v7+/nl5eXl5ef7+/v7+/v7+/v7+/v55eXl5ef7+ |
||||
/v7+/v7+/v7+dnlyeXl5/v7+/v7+/v55eXl5eXJydnl5eXJ5ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+dnJydnL+/v7+/v7+/v7+eXZ5dnL+/v7+ |
||||
eXZydnL+/v7+/v7+/v7+/nJ5cnlycv7+/v5ydnJ2eXl5eXJ2cnn+/v7+/v7+/v7+/v5ydnJ2cnZydnJ2 |
||||
cnZydnL+/v7+eXZydnL+/v7+/v7+/v7+/nJ5cnlycv7+/v7+/nJyeXJydnJ2eXl5dnZyef7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nl5eXl5/v7+ |
||||
/v7+/v7+/nJ5dnl5/v7+/nZ5eXl5/v7+/v7+/v7+/v55cnl2eXn+/v7+eXl5eXJ2cnJ5eXn+/v7+/v7+ |
||||
/v7+/v7+eXl5eXl5eXl5eXl5eXl5/v7+/nZ5eXl5/v7+/v7+/v7+/v55cnl2eXn+/v7+/nl5eXZ5eXl5 |
||||
eXJ2cnl5ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v52cnZ2cv7+/v7+/v7+/nlyeXJ5cv7+/v55eXJ2cv7+/v7+/v7+/v7+eXZ5dnl2/v7+/nJ2 |
||||
cnZyeXl5eXZydv7+/v7+/v7+/v7+/nJ2cnZydnJ2cnZydnJ2cv7+/v55eXJ2cv7+/v7+/v7+/v7+eXZ5 |
||||
dnl2/v7+/nl2cnZ2eXZ2cnZyeXl5/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+eXl5eXn+/v7+/v7+/v52eXZ5cnn+/v7+dnJ5eXl5/v7+/v7+ |
||||
/v7+/nJ5dnlyef7+/v55eXl5ef7+dnZ5eXl5/v7+/v7+/v7+/v55eXl5eXl5eXl5eXl5eXn+/v7+dnJ5 |
||||
eXl5/v7+/v7+/v7+/nJ5dnlyef7+/v5yeXl5eXJ5eXl5ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nZydnJy/v7+/v7+/v7+eXl2eXZ5 |
||||
/v7+/nl5eXZydv7+/v7+/v7+/v5yeXJ5cnn+/v7+cnZydnL+/nl5eXJ2cnb+/v7+/v7+/v7+cnZydnL+ |
||||
/v7+/v7+/v7+/v7+/nl5eXZydv7+/v7+/v7+/v5yeXJ5cnn+/v7+eXlydnJyef7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5 |
||||
ef7+/v7+/v7+eXZyeXJ5/v7+/v52cnZ5eXn+/v7+/v7+/v55eXZ5cnn+/v7+/nl5eXl5/v7+cnJ5eXl5 |
||||
/v7+/v7+/v7+/nl5eXl5/v7+/v7+/v7+/v7+/v52cnZ5eXn+/v7+/v7+/v55eXZ5cnn+/v7+/nJ2eXl5 |
||||
ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+dnJ2cnb+/v7+/v7+eXJ2eXlyef7+/v7+/nl5eXJ2cv7+/v7+/v55dnJ2eXZ5/v7+ |
||||
/v5ydnJ2cv7+/v55eXZydnL+/v7+/v7+/v5ydnJ2cv7+/v7+/v7+/v7+/v7+/nl5eXJ2cv7+/v7+/v55 |
||||
dnJ2eXZ5/v7+/v55eXl2cnb+/v7+/v7+/v7+cv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nl5eXl5ef7+/v52cnZ5eXJ2ef7+/v7+/v5ydnJ5eXl5 |
||||
/v7+/v52cnl5eXJ5/v7+/v7+eXl5eXn+/v7+/nZ5eXl5ef7+/v7+/v7+eXl5eXl5/v7+/v7+/v7+/v7+ |
||||
/v5ydnJ5eXl5/v7+/v52cnl5eXJ5/v7+/v7+cnZyeXl5ef7+/v7+/nZyeXn+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v52cnZydnJ2cnZydnl5eXZy |
||||
eXn+/v7+/v7+/nl5eXZydnJ2cnZydnl5cnZyef7+/v7+/nJ2cnZy/v7+/v7+eXJ2cnZy/v7+/v7+/nJ2 |
||||
cnZydnJ2cnZydnJ2eXb+/v7+/nl5eXZydnJ2cnZydnl5cnZyef7+/v7+/v55eXlydnJ2cnZydnJ2eXly |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
eXl5eXl5eXl5eXlydnJ5ef7+/v7+/v7+/v7+cnZ5eXl5eXl5eXlydnl5ef7+/v7+/v55eXl5ef7+/v7+ |
||||
/nJ5eXl5eXn+/v7+/v55eXl5eXl5eXl5eXl5eXJ5/v7+/v7+cnZ5eXl5eXl5eXlydnl5ef7+/v7+/v7+ |
||||
/nJ2eXl5eXl5eXl5eXJ2ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/nZydnJ2cnZydnJ2cnl5ef7+/v7+/v7+/v7+/v55eXJ2cnZydnJ2cnl5/v7+ |
||||
/v7+/v7+cnZydnL+/v7+/v7+eXZydnJ2cv7+/v7+cnZydnJ2cnZydnJ2cnZyef7+/v7+/v55eXJ2cnZy |
||||
dnJ2cnl5/v7+/v7+/v7+/v7+eXl2cnZydnJ2cnZyeXn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5eXl5eXl5eXn+/v7+/v7+/v7+/v7+/v7+ |
||||
/v55eXl5eXl5eXn+/v7+/v7+/v7+/nl5eXl5/v7+/v7+/v55eXl5eXn+/v7+/nl5eXl5eXl5eXl5eXl5 |
||||
ef7+/v7+/v7+/v55eXl5eXl5eXn+/v7+/v7+/v7+/v7+/v7+eXl5eXl5eXl5ef7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
+/7++/7+/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f77/v7+/v77/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f7+/v7+/f7+/v7+/vv+ |
||||
/vv++/v+/fz+/P7+/vz+/v78+/z8/v7+/v77+/v++/z8/v7+/P7+/v7+/P79/f7+/P7+/v7+/vz8/vz9 |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+ |
||||
/v7+/v7+/v7+/v7+/f78/vn++/z8/fv9/f78/v76+v39/vn6+vn5/vz8/Pz7+/z9/fv7+/v+/v7+/vv9 |
||||
+vr7+/v8/v7+/v7+/f37+/39/v7+/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v3+/P7++/v+/v39/v3+/f77/fz8/fv8/Pr8/P78+f33/P7++fX39/fx8e3m |
||||
5tvPw7C9sbGxvc/b6/L1+/n7+f75/P7+/v7+/P7+/v7+/v79/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv+/v7+/fv9+/z8/P35/vv++/r+/Pz5/Pf3/vn5+vn7 |
||||
+/7z8uvm39TOvbB6bVZSUj4+PlJ8Z3xnY3xSUlFUoM/r9Pz7+/7+/v75+fn9+/z+/vv++fn9/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P39+/7+/v78+/n5/v7+ |
||||
/P36+fn79P38/Pz39O7lz8WSoIJ6UVJ8Y25ukZiYwLy81tbZ2dnR0dHRvr68oWc+VMr1+ff8+/n7+/77 |
||||
+/39/f39/P79/vn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/f7+/vz9+/39+/77+/v9/fv08/T18qB6bXtRUVE0NE9wcJifkavAwNLNzeTs5/Ly8e3m7ejo6Ojo29vn |
||||
1NzRw6FR7P3y8/Hy6+bp7e3t8u3x9Pv7+fv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7++f79+/Ty8enp6Ojo6OLi4ujl2NBUeG6BfpGRkavAwL+/1tnv7+zx7fPx |
||||
7ezs5OPt7fHr7ejo6eLo39vn29vJVKCtkKV6VHttbXt7UXp6oK3P5vn+/P7+/v79/f7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P377enn39TU29TU1NDU1MrOz8/QemeHkZir |
||||
mLrAwMDSwNLSwMDAy7q6urq6urra8fLx8fLt6ejo6ejf29/c3nwppJykw8PNw8PDw8OlvqV4e1F6zvH+ |
||||
/v3++f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3t6dvf29/U29vU |
||||
1NTU1M/U0NTP0KA+kZGYkZGrkaaogGCbgYCAgYGAgICAm4Gf0vz79PHx8fLy6eno4ujf28+heuTs6+3r |
||||
5+ji4tvf39zc3NzRpVag/f39/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7++/Ht7eni6OLf5Nvb29vU29Tb29TOUZGHn6ufn6ysrHgbI5uAgJuAgJuAm4GBqtL09fT49fLx |
||||
8fLr6eji6N/coWLk5Ojj7ufo7uXm5t/f29vb3Ne+UfT+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v77/vz8+/318fXy6/Lr7e3p6enp6OLb6HqBn5+fn6yfrLa6m7q6urq6 |
||||
uri4xLi4uLjT+/X7+/X0+/Ht7e3r6eji278pwLrA1vHn7fLo6enp4uLf29vUzVLf+f7+/f7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/7+/v7+/v7+/P37+/Xx+/Lx7PHt6ejo6ejo4t/o4t+x |
||||
UZ+fn5+4n7q4tbi4uLe3tre4uLe3t7i30vr29fT5/fTx9fLr6ebp5t+/NKi3ttrz8vDt7Ozp6eni4t/b |
||||
29d4wv77/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/v3+/v7+/f78/v79/v78/Pz+/v7+/v779PT78fTx |
||||
8fHt8vLy7eno4uLf5OLbylSRn6usrKy4tri4uLi3t7e3t7i3t7i4t9P6/fv0+/309fXx7e3t6ejjoTS6 |
||||
t7ja/PLz9vLt6+vo5eTf29vcmJL5/fz+/f7+/v7+/v7+/v7+/vv7+/v7/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f39/f39/v3+/v7+/f7+/v7+/vz+ |
||||
/vn5/vv7+/39+fv78vTr6+jp6OLf1MrQxcLCsa2xrZZbUp+qq6i4uLe2uLe3t7i3uLe3t7i3t7XL7/f3 |
||||
+/z0+/vx8vHt6e3m3nxPxLe36vT19PXs++3r6+nm5tvb3L6E+f7+/v7+/v7+/v7+/v7+/vv8/Pz8/P7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v78/v7+/v7++fn7+/39+/v9/f319fXy8enp6Nvf29zU1M/PwsLCscKxwsLFwrHFsVFjn6qsrLa2uLa3 |
||||
uLe4t7e4t7i3t7e2y+/39fP0+f318fLy7e3t6M1SkcS3t9r0+/T28fXy8uzt6OLo5eSkgvT9/v79/v7+ |
||||
/v7+/v7+/v78/Pz8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7++/v+/v7++/79+/v7+/399fvx8fHy7e3p6eLi4uLo6Nvi39Tb1NTU1M/Qz9DK0MrC |
||||
wsLFrcWSUZGsqqysuLa4uLe3uLe4t7i3uLe4t7rq9/v7+/v0+/Hz8u7l5d+hNKu4uLfa+/X8+/b08fHy |
||||
6+ni6NvcoYT5+f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P78/Pv++f359fT19fLy8e3t6+3t6+no6Ojn6enp6OLi |
||||
4t/b59/b29vP1M/Q0NDQwsXCwsLFxWJWq7isrLi4uLe3t7e3uLe3uLe3uLe42v719fT88fvx8e7o6OTX |
||||
Y4G4t7i30vvz+f319Pvx8u3s6ejl3KGx/v7+/v7+/v7+/v7+/v7+/v3+/v39/f78/v39/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f7+/vn89fX08vTy8fHx8fHy |
||||
8e3r6+zy7e3t7evr5+vm6Obo4t/f39TU3M/U1NDP0NDQz8/Fz8/QkFKrrKysuLi4t7i3uLe3uLi3t7i3 |
||||
uNL49fv19PXy8evo6+fhvzSruLi3uNLz+/T1/fvx8u3t7Ono59xSz/39/f7+/v79/f78/v79/P399vb9 |
||||
/fb2/fv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/vn5+fT09PH08fT08fTy8vHy8vHx8fHx8fHx8fHx7ezp6eLm5ubm4t/f39/b29/b29/i3+Tk3+l6Y5Gs |
||||
rLisuLa4t6q4t7e3t7e4t7jL7/X19/Ty8e3t7evhvjSYuLi3t7jA8/38/PT78vbt6+vp5d/DUvH5/v7+ |
||||
/fz7+/n8/fb89PDe3smyssnK3uTt+/38/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/f39/f39/f39/f399f319PTx9PT09PHx8fHx8fLy8vLy8vHx7e3t7evr6+vr |
||||
7e3x7fHy8fLx9fX97aVnkbasuKy4uLe4uLi4uLi4uLe4ut3+9+vy8e3t6eLpw1Jjt7i4t7i3uO/3/PP9 |
||||
9fHx8u3p6ObjpW37/v7+/P79/Pn8/Pfz3rOLOzY3Nzc7O1pqs8rk/f7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++fn+/f39/fX19fX19fX1 |
||||
9PT0+fn5/f39/f39/v7+/v7+/v7+/v79+f75+f70vVF8qJqsrKysuqy4uLi4qri4uLjA7Ovt7e3m6enn |
||||
zVJPuri3t7i3uLrv/PX0+/Hx8e3t6ebivlbc/v7+/vz7/fX9/fPenlo2P0I/NzZanrnJ3uTp+/3+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f39/f3+/v79/v79/PXfkFKRn6ysrKymrKys |
||||
rLisrKisn9bs7Onp7Obee1KHrLi4uLi3uLe42vz19fHy7evr5ubi2Xuw9P7+/v77/Pz2/fOzOz8/QT83 |
||||
O4vN8Pj+/Pz8/Pf+/v7++/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v39/f39/f39/f3+/v7+/v7+/v7+/v7+/f3+/v79/f39/f39/f39/f3+/v7+/v3+/f79 |
||||
/fr5/PLRVIGYq6ufrJ+frKyfn6urrKq/5Ojp5N6lUU+Rtba2uLe3t7e4uNLs9fHz8u3r6eLr2Xh66/n+ |
||||
/f7+/vz89/CbOz83P0E/O7Pv+vn8/PX9+fz1/fv+/v38/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7++/7+/v75+vn5/fKSDlFjmIefn5+fn5+sn5+fq7/Rw3pUerGkq6i2uLe4uLi4uLi6 |
||||
7/Xy7enr5uvo13t66fz+/P79+/7+/O+LN0FBQUFBO7ny/f38/PXz8/b1/P38/fv+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv8/vv+/vn+/vWxSpbQoHpRfE9jcJhuboGBcE9SVHqg |
||||
2/Lx8L6YqLaquLisuLiqutby5unp5uPXw3p66fz9/v77/vv+9PKeNkE/P0FBQYvs9/Xk3rOenp6enrPN |
||||
4/bz+/z8/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/v78+/n59OlOSs/r7u7l |
||||
5cXFoIJUe1R6eoSxytvo6/Lu7u7y0aGYrJ+frJ+fn6i/7Obi4uTRoFax6/3++/z+/v35/PazOzdBP0E/ |
||||
QTvN7MmLWjs2NzY3Nzc3O1qLyez7+/n+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/f7+/f7++d9gr+Du7u7u7u7u7u7u7vXu7u7u7u7u7u7u6+jg5e7foHCrqqqfqKyqmNHj182gVJDk+f7+ |
||||
+f7+/fb89/zJOz9CPz9BQT8wm2o2QUFBQUFBQUE/Qjc3O1omstz8/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/f79/OJKl+DV4ODg4ODg5eXl5eXg4ODg4O7l5eXl5eDp5tvg4NulUquf |
||||
q5WVn4G/pW16kN/3+f37+/7+/vv29/fviz8/QT8/QT8/Nzc3Pz9BQT83QUE/O2qeyc3e3uTp+/7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77/v3+/vJKr9Xg4ODg4ODg4ODg4ODg1eDg4ODg |
||||
4ODg4Njg5eDn4OfY2IQpfDRnVlJRerHO8Pr+/v78+/z8+/3+9ffzuTtCPz8/QUJBP0FBP0FBQUFBPzda |
||||
m9zw9PT5/f73/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f3+/f7+/v7+/v7+/v7+/v7+/v7+/v78/P7+/Otvl9XY1dXV |
||||
1dXV1dXV1djY1dvV2Njg4NXg1eDB1dXV4NXY1djPd4S9ztTp8fv7/fz9/fv5/vz++/z++vv15GpBQUFB |
||||
QUFBQUE/P0FBQT83Njay3v73/vr5+fn5/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f7+/v3+/v7+/f7+/v7+/v7+/v7+/v7+ |
||||
/v7++/n7+/zFb8zV1czV1czV1czV1dXV1dXY1dXY1dXV1dXVwa/V1dXV1czV1cFv2/z+/vf8/Pz8/Pz5 |
||||
/vz8/v78/vr2+7k2P0JCP0JCQkJBP0JCQTdBN4ve+/7+/fv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f79/f7+/v79 |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/fz5+/vlSsHMzMzMzMzMzMzMzNXM1czVzMzVzMzMzMzM1dWvwdXV1czV |
||||
zMzKr0ro+vn9+/v7+/37+/n5/v7++fn0/ORaPz9BP0FBQUI/Pz8/QkFBO5vs9vz+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7++/79/f79/v7+/v7+/v7+/v7+/v7+/v7+/v31l5fMzMHMzMzMzMzMzMzMzMzMzMzM |
||||
zMy7zMzKr4RKSq/MzMzMzMzMwcGXd/Pt6Nvbz8/P2+Xr9fr6+vr6+/3NO0E/QkJCQkJCPz8/Pz8/O7Pw |
||||
/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/fz9/v7+/v7+/v7+/v7+/v7+/v7+/v77/vn922+7u8y7 |
||||
u7u7u7u7u7u7u7u7u7u7u7vBzJdvGQsLSq/Mu8y7zMy7u7vBwTIyYVxdXGFcYUNhQ2+X2Ob0+vzznj9B |
||||
QUFBQUFBQUE3P0I/O7nt9/f5/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77/v7+/fz+/vn5/v7+/vv+/v7+/v7+/Pz+ |
||||
/v7+/v7+/v7+8pavp7u7rru7u7u7u7u7u7u7u7u7u7uuwW8TCwwUEK+7u7u7u7u7u7u7wa6JGF2FeXl5 |
||||
eXl5eXl5XUhhr9j83lo/Pz9CQkJCQkJCP0I/O7Pz/ff3+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/v77/v77/Pz8 |
||||
9P37/fv8/v7+/v7++/v7+/v+/v7+/vv+/utvrqenp6enp6e7rq6urq67p66np6enwW8QBgkJDBCup6eu |
||||
rq6uu66uu66urigseXJycnl5eXJ5c3J5dFxhyrI2QT9BQUJBQUFBQkE/N2rv/fz++/v+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v79/vv+/vf8/e3De3jD9Pf5/vv9/fz9/fn8/Pz8/P7+/v7+/PetYaenp6enp6enp6enp6enp6en |
||||
p6enp4kbCwwODAwLl6eup6enrq6up66np650G1yOcnNycnl5eXl5eXl5eUgjNj8/P0JBP0JCP0E/QVrk |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v78/v3+/vr6/fN6eGM0UtT9+/v+/P77/v7+/v7++/7+/v7+/vz8lpeF |
||||
k5OTk6eTk5OTk5OTk5OTk5OTp5OniTILCxALC0aOjq6nk6eujq6np5OTjkgodHZ2eXmFeXV5eXlycnN1 |
||||
MiU/P0FBQkJBQUFBQjaz8/3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv89/f+/vzjbdpjTz6g+/T+/v7++f75 |
||||
+/z5/vv5/v7+/v7+7UyJhYWTk5OFhZOTk4WFk4WTk5OTk5OThZOOQxMLCQwLLomOjoWOiY6Ok5OTk450 |
||||
GFxddF1cXEhcdFx0eXlycnQzNkJCQkJBQkJBQTdq8P39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v79/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv+/v76/vf39/T0 |
||||
zsO+Pk80w/n7/Pr6+fz8/fb9/fn6+v7+/v7+/tsvhYWFdoWFhXmFhYWFhYV5hYWFhYWFhYVyhZOJb0NM |
||||
GRkvXHSJXGF1k4WFhYWFWCgvl5avz9jb28+tl2F0dXKFYSVCQUFBQj9BQT87yfT9/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/vv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/fv8+O/q76XXpE9PNOT1+/z0/vf159vY2+X39/f8/P7+/v7FSIWFdnZ5eXl5hXl5eXl5 |
||||
eYV5eYV1dYV2coV2eXJydl10dI50dXRdeXl5eXl5eVhITO70/v7++vr69OVhXXV5cnQeNz9CQkJCQkE/ |
||||
i+z8+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/P77/v78+/v9/v7+/v7+/vv+/v7+ |
||||
/v7+/v7+/v7+/v7++/77/P7+/P7+/v79/f3289rLqcCc4XhPT1bx/vfmz5dMMi8vLy8ySnfC5v7+/f35 |
||||
klh5eXlyeXl5eXlydnl5eXl5dnl5cnl1eXJzcnJ5hXl5dXV5cnl1dXZ5cnlyeXlYSC/t/vn+/v76+Png |
||||
SHlydXN1FzZCQkJCPz9BO8n5+/n7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vn5/Pn7 |
||||
+/v7/vr5+f37+/r+/v39/f39/f39/f39/f39/f38/fz7/f37+vj+/frw1r+RpsbIy79nTzV71s6XQ0Nd |
||||
WHl5eXNpc3ZdQ0yt5vT884R2c2l5eXl5cnJ2dnl5dnl5dnZ5dnZ5eXlycnl5eXZyeXl0cnlhdHZ5eXJ5 |
||||
eXlyWF0vz/76/P3++/jll1h5eXV5dB43QUFCQkJCP1rz/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7++/vy6/Ly8vHy9Pv19fT5+v7+/v3+/f35/Pz9/f39/v77+f75/P3+/P7+9fXzuqjE |
||||
tqaVj9KcUk9PcMucSnR1cnJyeXR0eXlycnJYXErb+PF3dWlydnl2dnmFeXl2cnlycnl5cnl5dnZ2eXl2 |
||||
dnZ5eXZydXl2dHR5cnl5eXJ5eXldL5b99f76+/rul1x5eXV1eWElP0JCPz9CQjae9ff9/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v387enp5u3p6ent6/Lx8evr6+vr7evt7fHt7e3t7e3r |
||||
6+vy6/Ly8e7x6+vw1qnIx8fL3bzqfE9PT6nIyKSTdHV5eXV0eXl5eXV5c4VcQ5blb3VycnZ5cnl5dnJy |
||||
cnl5cnl5cnJ5cnJ5eXl2dnl5eXJ2eXV2dV11eXl5cnl5eXl5WEh37fLx8O3bYUh1eXSFfXk4O0E/QT8/ |
||||
QkJayfT1/fv7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v35+evbkpCSkoKQYpBbW1tb |
||||
W1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbbZzGyMbEx8vd2mNjT0/Lx8aol3V5cnJycnNyeXlyeXl5 |
||||
eV1ILxtdeXVycnlycnl5eXlydnl2dnl5dnl5cnJyeXlycnJ5eXJydXR5eXlyeXl5eXJ1dFhdE1tbW05K |
||||
TFh5eXV5dXNcJjc3QUI/QkI3JVRVwvz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78 |
||||
/vny31u0mY2UlGyKZWxlZWxsbGxsZWxlZWVlZWVlbGVsbGxsbGxsZWVrbGuVtsTGyMjEx8twTzR+yMjE |
||||
xKBpc3ZDShUcHC4yXXJ1dnN5dUgYWHl5cnl5dnl5dnZ2dnl5dnl5dnZ5dnaFeXlycoV5eXZycnR0aXJ5 |
||||
cnl5eXJ5eVhYeRNJjUAnSHZ5eXV1eXJ5MztCP0FCP0FBO25sQKD8+fv+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7++f7889BViIiIiIOUg4ODg4OIiIiIiIOGg4OIiIiDg2yDiIaDg4ODiJ2px9Op |
||||
rIeamqbGxserY2NPboeaxMShhV0nQEuIbIhsQCdKc3NyeXl1XChYdXJycnl5eXl5eXl2cnlycnl5cnly |
||||
cnZ2eXlydnZ5eXZ5dXJzeXl5dnl5eXV0WFghQEAtYXJyc3l5cnN2RiY3Pz9BQUJBQTBrhkCx/fn+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v799fPOcZSIiIhscXFxcXFxcXFxcXFxcXFxcXFx |
||||
cWVxbIaGg4aGhp3ExsjHx9Pa0sCRh37SmGNPY8fEn5qmwGIcZYaGioqGhoaKSRNdcnl5eXVdGFiFcmly |
||||
cnl5eXJycnmFcnl5cnKFcnl5eXl2dnl5eXJ2cnl5eXl5eXl5eXl1WFhYGS0tdXJyeXl1eXJyWB47P0I/ |
||||
QUJBP0ExiIZAsP78/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77/v3xzluDiI2IjbDQ |
||||
z8/Pz8/Pz8/Pz8/Pz8/Pz8/QzpSIg4OKhoiPxsbEyMfT3erq6uq81lZWPo/HyMjEmm5WiIaGhoaGhoaG |
||||
hoaKHEh5eXV5dV0sSHl5dnl5eXJ5hXlycnl2dnmFcnl2dnJyeXl2cnJ5eXl2dnJ5eVh5eXZ5WF1YWBtI |
||||
eXmFdXSTdXl5Rhc2QkI/P0FBQUI3NYiISbD0/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7++f79+dAcZWVJZUuj0NDQztTO0NDQ0NDQ0NDQ0NDQzs5AS0trOmxLj8TGyMjHx8TH093q6sBnZ2Op |
||||
yMjIxrWRa0lJS0tLS0tLS0tLSRwTSHJ9cnl5XShYdXl5dnZ2eXZydnl5dnl5dnJ2dnl5eXlycnl5eXZy |
||||
dnl5eXV5eXl5eXVdWEgbXXJ5eXVycnJpKBc7QUE/Pz9CQkJCOzRJSxyw+/3+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/vr+/f3fgmJiLgciktDQ0M/Pz9TU1NTQ1NDU0NTPz9DFJw8PDw8SEkCV |
||||
xMbIyMbHyMjEx8emcGNjx8fGyMfGpkANEg8SDw8PDw8PDw8PERpIc3JyeXRIKHV1dXJyeXZ5eXl2dnly |
||||
dnl5eXlycnZ2eYVydnZ5eXlycnl5dnlYeVhyXUhYGEh5eYV5c3NhLRoeNz8/Pz9CQj8/PzFtW5CCz/3+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+/39/vvx68IiJKPPz8/Pz8/Pz8/Pz8/P |
||||
z8/Pz8/QrWQ9U1NHZo2drJqaprbGxsbExsjIq3xnj8TGxsjExMRmPUREREc8REc8PUQ9PVMqGlx1cnl1 |
||||
XSh0dXVycnlyeXJ2cnl5cnl5cnZycoV5eXl2cnl5eXJ2cnl5eXl1eXlyWF1ISBhdeXl5eXZDHSo5NT9B |
||||
P0FBQkE/Qj8l6f39/f3++v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P398e3C |
||||
Ik2jytvQz8/PxcXFxcXFz8XPz8/PyspkPURTaNPIxsvLx8SmmprExsjIyH5nT4/Ix8TIyMedWUQ8R0RE |
||||
REdERDw8UEQ8RCoadZNycnkoXXJ5eXJyeXJ5eYVycoV2cnl5eXlydnJyeXl2cnJ5eXlyeXJyeXl5WFhd |
||||
SCwYcn19dC0iKj1HPDE/P0JCQkE/Qj82F+L9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/O3mwiJNZLGjsLClsLCwsLCwsLCwsKCwpaOjTTw8f6nIyMjIy+rq3dO2ppqp0r9j |
||||
Z0+oxsfGyMjEnVdEREQ9RERERERHREQ8OURQJBZdcnlzKF15dXVpdnZ2eXZycnl5cnJ5dnJ2dnl5eXly |
||||
dnl5hXZycnlycnl5WFhdWCwsG3RDJyIkOURFRyowQj9BQUFBQT8/Ow7o/f7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/3x6cUiOSpNK3CHboeHh4eHh4eHh4eHh25APTk8PGar |
||||
xMbGxsjH3erz3dOofs2hZ2dupsbEx8jIxIpTPEREREQ8RDxEPEQ8REQ8PEQkLXJ5eShdcnl5cnl5eXZ5 |
||||
eXlydoV5dnl5eXl2cnZ2eXlydnJ5eXl5cnl5WF1dWEgoGxYaHU09RDxERzwqMEJCQkJCQkFCQjAO4v3+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vz88enKEjw5RyuHoqKioqKi |
||||
oqKioqKioqKHSzxHRERZiqjEx8fHxMTL0+rqy2PWfHBjfsbGx8fIyKtmPEQ9RD1ER0RER0dERDxERDxE |
||||
PCAteV0oXXl1dXZ5cnJyeXJ2dnl5dnZ5cnZycnl5eXl2cnl5eXJyeXV5dVhdXUgoKBMgOVBHR0RHPDw8 |
||||
Kzs/QkFBQUFCQj8lB+n+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78 |
||||
/vDmwSI8PD0qSV5eXl5eXl5eXl5eXl5eaytER0Q9UFmKqcTGyMjExsbHy8CkzZxuj8TIxsbIyKaKPT1E |
||||
REQ8RDxERDw8RDw8PEQ8PFA8IkMvG11yeXVycnl5eXJ5eXl2cnl5cnl5eXlyeXJyeXl2cnZ5eXl5WFhd |
||||
SEhIKCgWKlBEPD1EPDxEPCs7Qj9CQkJCP0I/NArt/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7x5coPREQ8PDk5PTk5OTk5OTk5OTk5OTk9REQ8PEQ8V2iVpsbIxsjLyMSR |
||||
vr+Hq8fIxsjHx7aVWUQ8RERERERHPERHREQ8REREPEREPCoaGEhYWHZ1cnJ2eXlyeXl5eXl5cnJ5eXJ2 |
||||
dnl5eXl2dnKFcnZ5WFhdXUhIKCgbCkREPDw8RERHRzwrNj9CQkJBQkFBPykN6fv+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv87enCIkREREQ8REdERERERERHREdERDxHRERE |
||||
RDw8RDxEUGZrj6bEyMerY8CrxMjGxsjGxKhsWTw8REQ8RDxEPEREPEREREREPEREREREKhovXV1dXXVy |
||||
cnZIQy8yL1x1dnJyeXl1cnl0dXV5clhIKC8yGUovSEgoQy8sEyRERzxEREREPEdHOjc/P0E/Qj9BQjYr |
||||
Eeb9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/u3rxSI8RDxERERE |
||||
PEREPERERDxEPERERDxEREREPFA9RERTRWZsa52dnXC6xMjIyMbGxo9sWTxHRDxER0RHPERERERERERE |
||||
PEdEREREUD0gLUgoWFh5XEMvb63Fz61vLy9deXl5eXJ5eXl5dEMyl8XKz8WXMhkvLygsGAoqR0Q8RERE |
||||
PDxHRzo/P0JCQkJBQkEwKxHp/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/P3y7MIgPERHRERERDxEREREPEQ8R0REPEQ8R0Q8RDxEPEQ8PEQ8PT1XWWiPxsjExsjIxKloPTxE |
||||
REc8RDxEPERHRDxEPEQ8REQ8Rzw8PUREORoyKFhYSBlK1PD4+PP78ueXGVx0eXl5eXJyXRt35vj09Pn7 |
||||
9emtGRssGBMPOUdHREdEREc8Rz0pN0JCQkFBQj9BMCoS6Pv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v778ejFIjw8RDxEPERHREQ8REREREQ8REdEREQ8REREPTxEPERQR1NE |
||||
RFNoqcjHxMjGxKlmPEQ8R0RHREREREdERDxER0RHRERER0Q8PDxEPFAqGjIsLBmE8fb29uzb5/L198Uy |
||||
XFh5eVh2SC+t8/j09Pfb2+zz+c8QGBsKOUVHRDxEPEREPDw5PkJCQj8/QkJCQTU5Eun+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/fHpxSA9REdER0REPEQ8REQ8RDxEREQ8 |
||||
REREREREPDxEPEREPEQ8PERTisTIyMTIxo9oRzxEPDw8PEREPEQ8RERERDxEPEREPDxEPEQ9UEREPSoW |
||||
Lxl37v319c9OECGW9fXzrTJdWFhYXTKE9fP1/eiCFBBO2/X1ygsMJD1ERERERERHRDxEOT4/P0FCQkJC |
||||
Qj80ORLn/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvt68UgPERE |
||||
PEQ8RERHREdER0RHRDxERDxEREQ8REREREQ8UD1EPUREWZ26xsbExJVmPD09REREPDw8RERHREQ8RERE |
||||
REdEREdEREQ8PDw8PVNEIBMu4/j09M8hAQIBAoLw8/iEG0hIXS9K6fv9/ediBgMAAxDK9vOCCjlEPT08 |
||||
REc8RDxEPDw+Qj9CQkJCP0I3PkcR5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v778enCIDxEREREPEREPEQ8RDxEPERHRERER0Q8REREREQ8RERERERERD2NxMjIxpFoR0Q8 |
||||
REdEREdEREREPEREREQ8PEQ8REQ8REREREREPERERU0NxfX59OaCBgIAAAAGxf3+5jIvSC8Z0PP69f3U |
||||
IQEBAAABTu392yJNOSpEREQ8REREPEc8Pj9BQUE/P0JCNys8Euj8/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/fLrxSI9PEREREREREc8RERHPEdERDxEPEQ8RERERERERDxE |
||||
PERERFBXjay4xI9oR0dEREREPEREPEQ8REc8RDxER0REREQ8REREREREREREREVNIuv++/3y5JYGAQAC |
||||
AmL78/JvGygvMvH0+fX58ehiAgMCAAzQ++2jIB0NPUdER0REREREPDRCQkJCQkJCQjYrPBHo/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvt6cIgPERHRDxEREQ8REREPEQ8 |
||||
REQ8R0RHREREREREPEREREREPEQ9ZLTAh15mREdEPDxERERERDxHREQ8RERERDxERDxEREREREREREQ8 |
||||
REQ8JFX29fz0+fXxTgACAAMU9Pn7xRkoGXf58/n89fT08k4CAQEClvH8sQcCAypERDxERDw8Rzw0Pz9B |
||||
QkFCQUIxKlcS5v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798uvF |
||||
IjxEPDxERERER0REREdER0RER0Q8RDw8RERERERERERERERTPYy0oWtZPDxEPDw8REREPEdERDxERERE |
||||
RERHPERHRERERERERDxEPERERCSj9v759Pv79MUAAgABAuj0+9sZGwvF9fv9/PX79f2xAgAAAk7p/c4J |
||||
AgIkRzxERDxEREQ8NEJCQkI/Qj9CNTk8Eub9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+++3pwiA8RERER0Q8RDxEPEQ8RDxERDxEPEdEREdEREREPERERERHRESMv6FmPUQ8 |
||||
PDw8REREREQ8RDxER0RERDxEPEdEPEQ8RERERERERERHRz0dsfb0+f31+fvUAAAAAAbp/vfbGRsL0Pv1 |
||||
/PT59fvxzwwAAgaS8vniCQICJDxER0RER0Q8PDRCP0JBQkJCPzRNPBLm/f7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy68UiPDxEREQ8RERHPERERzxERDxEREdEPEREPERE |
||||
PERERDw8RVNXtL+kTTw8RDxEPEQ8RDxER0REREQ8PDxEREdEPERERERERDxEPEQ8RFA9Hb319Pn0+fT7 |
||||
rQABAAAQ9fz03xMbC7379v30/Pv09cUGAAIGwvX03wwCAB1HPEQ8PEc8PEQ1Qj9CP0JCQjc+PDwR6P3+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v777enFID1EREQ8RERHPERE |
||||
RDxEREREREQ8RERERERHRDxEREREPEVTV7ShmTlHRDxERERHREdERDxEREQ8RERHREc8RERERERERERH |
||||
RzxHRERHRSSx/fj1+/v96yECAAICgvX1+tQQGwLC+fT5/fv1/e1OAQIBLuv0/tQLAgISPUREPEc8R0RE |
||||
JT9CQkJBPz8/OkU5Eun8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/fLrxSA8RERER0RERDxEREREREQ8REREREREPERERDxHRERERDxERX++oYw8R0dHRDxERDxEPEREREQ8 |
||||
R0RERDxEPEQ8REQ8REREPFA8RDxEPD0qVfX79fn12yEBAAACFNT1/frFCxkLhPn1+fv0+/JiAwMCDND7 |
||||
+/utAgACDTlERERHRUQ8PDFBQkI/QkJCNitHPRHo+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/vvt6cUgPERERDxEPEQ8R0Q8RDxEREREPEQ8REREREREPEREPEVFRD2MvpxN |
||||
RDxHPERERDw8R0REPEQ8RDxHPERER0REREREREdEREc8REREREQ8KiDx9fT99N8uAgEADJL9+/X1ggYC |
||||
Ai71+/X89PztYhABLsX19fzxYgECAAc5REQ8PEVERTkxQT8/Pz9CPzAqR1MN7Pz+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778uvFID08RERERERER0Q8RERHRDxEPERER0Q8 |
||||
RERERERERDxERERNtLyNPUc9R0RERERHREQ8RERHRERHRDxEREQ8RDxEREREPEREPERERERERFcd0P37 |
||||
/fT+6IIULsLx/fT76SECAgIGxf35+fn1+e3m3+b0+/n03xABAAEEKkREPEQ8Rzw5MUFBQT9CQjcxOUdT |
||||
Den+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/e3pwiA8REdEPERE |
||||
RDxEPEdEPERHREdERDxEREREREQ8RERERUQ8TbScZEREPEQ8RDxEPEREREREPDxEPERER0Q8RERERERE |
||||
RDxHREREPEREPURHKlXr9fT79fTx8uv99fn8/JYBAgICAk7p+/39+/v1+f37/fn7/GICAgACAyRERDw8 |
||||
PEdHOTFBP0I/P0I3NTk5PRHp/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/Pvx68UiPUREPEREPERHREdEPERERDxEPERHPERERERERERERDxERX+8mX9EPDxHPEdEREc8RERE |
||||
PEdEREdEREQ8RERERERERERHRDxEPERHRDxERzkRhPb8+/n5+fz0+/T7+9QUAgEBAQAMkvv19PT0/Pn9 |
||||
9Pn0+dABAgIAAgAdRDxERERHPE0wQUE/Pz9CNj48RTwS5/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v797enFIDxEREREREdEPEQ8REREPEc8R0REPEREREQ8RDxEREREPEWM |
||||
vJRNUDw8REQ8REQ8REREPEQ8REQ8REQ8REREREREREREPERER0RHPEQ9PUdHHQut7Pz1/fX0+/H79NAh |
||||
AAACAQACAAKt8fv79fn59Pv18sIQAAAAAAIDDzw8RDw8RTw5MTc/QUE/PzdLPTw8Euj8/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HrxSA8RERERDxEPEREREQ8REdEPEQ8 |
||||
REdERERER0REREQ8PERXlL9/PUREPEdER0Q8R0Q8REdER0RERzxEREREREREREREREc8REQ8RDxEPDxE |
||||
VyQGDILm/fn0+f318sUQAgICAAAAAAACBoLi9fn5/f3965IMAgAAAAAAAA08RUQ8PERHTTA/QUFBQkI2 |
||||
KzxFPBLn+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P3y6MIgPERE |
||||
PDxER0REPEREREQ8RERHREQ8RERERDxEPERERDxEV7ShRTxERDxERDxERDxER0Q8RDxERDxHRDxERERE |
||||
RDxEREQ8R0Q8REdEREU8REckFAEGFJLU6OnfsS4GAAAAAAAAAAIAAgEDEILF39/QgiECAQACAAAAAAIN |
||||
OUVERzw8PColNjs3P0FBMU08RTwS6Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v778e3CIj08REdEREQ8RERERDxHRDxERDxEREREREREREREREc9RGa/mUQ8RDxEPERHPERE |
||||
REQ8RERHPERERDxEREREPEREREREREQ8R0REPEREREdEJAkMAgIAAwIGAgICAgIAAgICAgICAAADAAAA |
||||
AgACAQAAAAAAAgAAAAICBx0dHR0gEg0KBQgFMT83PzU8PFM8Euf7/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/LoxSA8REQ8REREPEdEREREPERER0RERERERERERDxERERT |
||||
PD2MvGRHPDw8RDxEPEREREREREREPERERDxERERERERHPEREREQ8RzxEREc8R0RHRCoVEAYBAQIAAAAA |
||||
AAAAAQAAAAAAAAACAQEBAAAAAAAAAgICAgACAAAAAAADAwQAAAADAgICAiU3Pzc0PTxFORLo/P7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3x6cIgPEREREQ8REdEPEQ8REdE |
||||
PEQ8RERERERERDxHREdERzw9mbRNRERERzxERERERDxEPEQ8RERERERERERERERERDw8PDw8PTw8R0RF |
||||
RUc8PFAqBxQhDAMAAQAAAAACAgIAAgICAAACAgEQEAIBAQEBAgECDCEDAgABAAICAQACAgACAgECAgII |
||||
N0I2S0c8RD0S6Pv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778uvF |
||||
IDxEREREREQ8RDxHREQ8REREREREREREREREPEQ8REdHV7SUPTxERDxEREc8RERER0REREc8REQ8REQ8 |
||||
REREPERHR0dHR0RQR0dER0dFVzxTTRwUIRAQAQEBAgEAAAAAAAAAAAICAAEABk4uEAsBAgYLLk4uAgAA |
||||
AAAAAAICAAACAAACAAAABTBCMCtHPEU8Euf8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/fHowiA9PERERDxER0RERDxEREREREREREREREREPERERERERGS+fz1ERERERERE |
||||
PEREPEQ8RDxEPEQ8RERER0RERERHRDxHPT08PDlNTSoqJB8kHxIEFCEQISELAQEBAgEBAQACAgEAAAAB |
||||
AAELLmJiTkpiYmIuBgEBAgICAgICAAACAgACAgACAQExPzEqRzxFPBLp+/7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy7cogPEdHRDxERDxEREREREREREREREREPDxEPERE |
||||
RERERFeMtD1EPERERDxEPERHREREPEdER0RHR0REPDxEREREPEQ9TR0SEg0HBwQEAwMAAAAAAhAhISEh |
||||
LhAQAQECAQMBAAAAAAAAAAAAAAMMLk5OTk4QAgICCxQhThQDAQICAAACAAACAAAAHjc0OUQ9RVcS5/z+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798e3CIDxERDxERERERERE |
||||
REREREREPERERDxHR0RERERER1c9mZRER0dERDxEREdERDw8RERHPEQ8RDw8REdEREQ8RERHRCoKAwAD |
||||
AQECAQECAgICAhAMFCEhIS4uLiEhDAELAgIBAQEBAQACAQAAAQICCwIGDCEuYoKCYiECAgICAAACAgAC |
||||
AgAAABc7K0Q8PURFEuf8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
+/LrxSA8RERERERERERERERERERERERHREREPFA8RDxEREVTV7R/PVA8REREREQ8RDxEREdEPERHRERE |
||||
REc8REREREdEPEc9DQMCAgAAAAICAAECAQAVThAMECEhISEhEBQhThQUEBQQAgsGBgsQFCEuTmKCkpKS |
||||
rZJOEAAAAAAAAAICAAACAAACAAEIMTk8RDxFORHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/vvx7cIgPEREREQ8REREREREPERERERERDxEREREPEREREREU1eZV0Q8RERE |
||||
REREREREREREPERERDxEPEREPERERDxEPEREPB0DAgICAgACAAAAAAACAiF3Yi4UEBQQIS5OhCEhYE5i |
||||
Sk5iYoRigoKSlpKSkpKEYiEGAgAAAgICAgICAAACAgACAgACARw5RTw9RDwR6P7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798uvFIj1ERDxEREdERERERERERDxEPERERDxE |
||||
PEREREREREV/lFM9R0Q8REREREREREREREREREQ8REdERERERzxER0RHPEcqBwICAAACAAIAAAIBAAEG |
||||
IU5igmJiYmKETi4QTk5iYmJiYoRigmKEhIKEkmIuDAEAAAACAgAAAAAAAAICAAACAAAAAAMSRERERUVX |
||||
Def8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HtwiA8RERERERE |
||||
PERERDxERzxER0RHRERERERERERERERXjH9FPEQ8R0REREREREREREREREQ8REREPEQ8REQ8REQ8PD1E |
||||
TQoAAgACAgACAAICAAAAFBQMIS5OTmJOLiEQTk5OYkpOhGJ3YoKEgmJOIQwCAgACAAICAgAAAgICAgIC |
||||
AAACAgACAAEADURHRT1EPBHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v3x68UiPERERERERERHRDxERzxHRDxEPEQ8RERERERHRERETYxXRURERDxHREREREREREQ8RERE |
||||
REREREREREREREREREdERzwSAAICAAACAAIAAAAAAQshIRQUEBAQEBAuTk5OSmJiYmJigmJOLhAGAAAC |
||||
AAACAAAAAAACAgAAAAAAAAICAAACAAICAgc5PT08RVcN5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v778evCIDxERERERDxERDxER0Q8RDxEREREREREREREREVFRH+MU0dE |
||||
PTxERDxEPEQ8REREREREREREPEQ8RDxERDxEREREPUdTIAACAAACAgACAAIAAAALISEuIS4uLi5OTk5O |
||||
Tk5iTk4uIQwBAwAAAAACAgAAAAACAgICAgAAAgICAgIAAAACAgACAQEEKj1EPEQ8Eej+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/fLtxSI8RERERERER0RERDxERERERDxE |
||||
PEQ8RDw8RUdHUER/fz1ERERERERER0RHREc8RDxHRERERERERERHREREREREPDxHRyQEAgICAAACAAIA |
||||
AgACAAMMEBAhIS4uLi4hIRAMDAICAgIAAAAAAgICAAAAAAAAAAAAAAACAAAAAQEBAAEAAAAAAAACAx1E |
||||
RDxTVw3n/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/Pvx7cUgPERE |
||||
REREREQ8RDxERERERDxER0RERERERDxHR1NXf009RDxERDxEPEQ8RDxEPERERDxEPERERERERDxEPERE |
||||
REREREcqBwIAAAACAgACAAIAAgAAAAEDBgICAgICAgICAAAAAAAAAAICAgIAAAACAgICAgICAgICAgAA |
||||
AAAAAgICAAICAAIAAgMPPUc8REUN6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v758evFIjxERERERDxERERERDxEPERHRDxERERERDw8PEdTV1dXREU8REREREdERERERERE |
||||
RERERERERERERDxEREREREREPEREPA0BAgICAAACAAIAAgAAAAACAgAAAAAAAAAAAAICAgICAgIAAAAA |
||||
AgICAAAAAAAAAAAAAAAAAgACAAICAAAAAAICAgIBCjlHPEQ5Eef+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77+/LrwiA8RERERDxHRERERDxERERERDxEREVERERFRDxHV1dX |
||||
OUQ8PDxEPEREPEQ8RDxEREQ8RDxERzxERERHRERERERERDw8R0UgAAAAAAACAgAAAAIAAgAAAgAAAgIC |
||||
AgICAAAAAAAAAAAAAAICAgIAAAACAgICAgICAgICAgICAgICAAAAAAABAQICAgQkRz1HPBHo/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P3x7cUgPEREPEREPEQ8RERERERE |
||||
REVHRERHRERER0VER0VXV0VEPDxERERERERERERERDxERERERDxEREREPEREREQ8REQ8PFBHJAMAAgIC |
||||
AAAAAAAAAAAAAgAAAAAAAAAAAAAAAgICAgAAAgIAAAAAAgICAAAAAAAAAAAAAAACAgIAAAACAgICAgAE |
||||
AAMKHz08RVcR5/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778evF |
||||
ID1EREREREQ8RERERERER0dFR0VEREVERERFRURXVz1HRzw8PEREREc8REVER0REREREREREREQ8REc8 |
||||
RDxER0REPDxHUCQHAAAAAAAAAgICAQIAAQAAAAAAAAACAgEBAAAAAAAAAAIAAAAAAAAAAAAAAAICAgAC |
||||
AgACAAQEBAQHBwoNDw8dHR8qKj1EPERFDef+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7++/HtxSI8RERERERER0RERURERD09U1NQX19QU1NFPUVXU1dFRUc8RUQ8PEQ8R0RH |
||||
PDxERERERERFREREREQ8REdERDxERDw8RDw5EgACAgICAgICAgIBAQAAAAAAAgICAAAAAAAAAAAAAAIA |
||||
AgICAAIDAAAAAgMEBAcKDRIPDx0kJCoqKjk5OTk8RDw8R0dHPDxHORHn/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy68ogPEQ8REREREQ9REREUF9fX19QUD1EV1BTX19f |
||||
X19fUEU8RUVFREVEPERFRTxERDxEPDw8PERFPDxERDxEPEREREQ8PDw8PB0CAgICAAABAAAAAAICAgAA |
||||
AgICAgACAgICAAAAAwQEBAQHCgoNDw8dJCQqKjk5OTk9OTxEPEdEPEQ8RERHREdEREREREQ8RVcS6fv+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v398e3CIDxER0REREREPDxE |
||||
UF9EUz08PD08PTw9PEU9RURQUFNfX1BTRTxFPDw9PUVFRDxEPDw8RERFRDxEREQ8RERHREREPDw8PEcd |
||||
AAICAgICAgICAAMCAgICAgMEBAQEBwoNDQ0PIh0dJCoqKjk9PUREUEQ8RERHRzw8R0dHR0Q8RzxHRERE |
||||
PEQ8REREPEREPUU9Euf8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
+/HrxSI9REQ8REREPDxEREVEPEQ9RERFRERERERHRTxEPERFRURQX19fX1BTREQ8PD08RTw8REQ8RUVF |
||||
RDw8RERERDxEREQ8RDw8JAQDAAADBAMEBAQEDQ0PDw8dHyQqKio5PD1EPEREPDxEPEdEPEQ8RDw8PTw8 |
||||
PDw8PTw8RzxER0Q8RDxEPERER0RERDxHRDxERRLp/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/Pvx7cUgPEREREQ8RERERERERzw8PDw8REREREREPEREREU8RTxFPDxER0df |
||||
X19fX1BQV0VFRT08REVFPERERDxEREREREQ8RDxEPDkdDw8PHSQqKio5OTk8PDw8RERER0RHRzxER0RE |
||||
R0RHR0dHPDw8PDw8PEQ8REQ9PTw5PD08RDxERERHREdERDxEREREPEQ9RT0S5/z+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778uvFIDxEREREREREPDw8REQ9RERERERFRTw8 |
||||
REVQRURERERHR0U8RDw9PUVFU1NTX1NfX19QU0VFR0VHX19HPEREPERERDw8PDxERDw9PTxERERHR0dH |
||||
RERER0c8PDw8RDw8PEQ8RDw8PDxERDxEREREPERERDw8PEdEPEQ8RERERERERDxEPEREREREPEREPUQ8 |
||||
Euj8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/PHtxSA8REREPERE |
||||
REQ8UEREPEQ9RDxTRTxTPD1ERUVEX19fOUVFRD09REQ8U0VFPD1TU1NTX19fUz1FUF9TUERHRERERDxE |
||||
PEc8R0c8REdER0RERDxEPEREPEdERDxHPEQ8PEQ8REREPEdEPEQ8R0RERDxEREREPEQ8REREREdEPEQ8 |
||||
REQ8R0REPERERERERERFVw3n/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v3x8sUgPDxEPEdERDxEREREREVQRERFX19TPERfRDxFUF9XX1NTUFBERERFPEU8PEVfX0c8PUVF |
||||
RFM8UF89UFBERDxERERER0REPEQ8REREPEQ8REREREc8REREPEQ8RDxER0REREREREREPERHREc8RDxE |
||||
REQ8PEdEREREPEREPEREREREREQ8REdEREREPEQ8RDwR6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/vz+8e3FID08REQ8RERER0Q8REc9X1NFU19fUD1fXzw8RVBfPT1fUF9f |
||||
V1dfU0RFPF9fUFNQUF9QPUU9PV9QU188PEQ8R0Q8RDxEREREREREREREPEdEPEQ8RERERERERERERDxE |
||||
REREPEQ8REREPEQ8REdER0REREQ8RzxERERHRERERDxEPEQ8REQ8REREPERHPUVXDef8/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HrxSA8RDxER0REREQ8REREPV9ERVNf |
||||
U1dTX0Q9RDxQXz1TX19TPV9QXzk9V19fX1M9RF9TU19EPURfUFBQPURHREQ8RERHPEQ8RDxEPEQ8RERE |
||||
PERERzxEPEQ8RDxEPEREREQ8PEREREREREdEREREPEQ8RDxER0Q8RDxERDxEPERHRERHRERERERERERE |
||||
RD1EPBHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P7y7cUgPERE |
||||
RDxERERERERERFdfUz09X1dfX1M9RDxFUF89V1NfPT1fV19fUF9QU19fRFdfPUVfU0Q9U19EPDxEPEQ8 |
||||
REdEPERHRERER0RHREdEPERHRDxER0REREdER0RHRDxER0RHRDxEPEQ8REQ8RDxHRERERDxEREdEREQ8 |
||||
R0REPEREPEREPEREREREPERERVcN5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v778u3KID08RERHRDxEREQ8REQ9X1BXV19XX19EPEREPFBfPVdQXz09UFdfV1c8PVNTPT09 |
||||
Xz08X1BEV19EPDw8REc8REREPERERDxEREQ8RDxEPERERDxEREQ8REREPEQ8RDxEREQ8RDxER0RERzxE |
||||
REdERDxEPERHREREPEQ8REQ8REREREdEPEdERDxEREREPEQ8Eej+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/PHyxSA8REdEPERERDxEPERFV1BQUD1fV19QXz1ERz1XV1BQ |
||||
PFBQX1BTUFBQPT1fUDw8PVBQV1A9PV9EPEQ8REQ8R0dEPERHRDxERzxEPEdERDxHRDxER0Q8REc8RDxH |
||||
REQ8R0Q8REdERzxERDxEREQ8REQ8REdEPEQ8RDxHREdEPEdEPEQ8REQ8RERER0Q8RDxFVw3n/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3x8sIgPEREPEREPERHREREU1BQ |
||||
X1dXX1NFPV9TREQ9X19QPT09UFA9RD09UEQ9UFBQUD1EX19QPV9fU1A8RDxER0Q8PERERDxER0Q8RERE |
||||
PERHRDxEREQ8REdEPERERDxER0Q8REREPEQ8RERHPEQ8REREREdEPERERERHRDxEPEREPERERzxER0RE |
||||
REQ8REQ8RDwR6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v789O3F |
||||
IDxEREREREREPEREREU9X19QUFNfUFNQRDxHR19fRDw8PDxEPDxEPDxEPDw8PTw8PD09PVBfU1BEPDxE |
||||
RDxERERHRERERDxEREdEREREPERER0REREQ8RERHRERERDxEREdERERERERHPERHREREPEQ8RERERERE |
||||
PERERERHRERERDxERDxEREREPEREPFNXDef+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/fHryiA8REREPEc8REdERDxEUF9XU19QUFBQR0REREdQRDw8PEc8PDxEPDw8PDw8 |
||||
PDxEPEQ8PDxHX1BQPTxEPERERERERDxEPEREREREPEQ8REREREQ8RDxERERERDxEPEREREREPEQ8RERE |
||||
RDxERDxERERER0REPEQ8REc8RDxERDxEPERHRERERERERERHRDxTRQ3o/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3y7cUgPTxEREQ8R0Q8RERHRD1fUD1TPT1EUDw8REQ8 |
||||
PDw8Rzw8RDw8PEREPEQ8PDw8RDw8REQ8PF9QRDw8PEdERDxEPEQ8R0REPEQ8RDxHREQ8RDxEPEdERDxE |
||||
PEQ8R0REPEQ8RDxHREQ8RDxEREQ8R0Q8RDxERERHREQ8REdER0RER0REPDxEPEREREREPEQ8RT0R5/7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798fLKIDxHRDxER0Q8RERE |
||||
RDw8UDw8PDw8PEQ8PDw8RERHR0Q8RDxEPEc8REQ8RERERzxEREdERDw8PDw8RzxEPEdERERHREQ8R0RE |
||||
REdERDxHRERER0REPEdERERHREQ8R0REREdERDxHRERER0Q8REQ8RERHPEQ8RDxEREREPEQ8RDw8REdE |
||||
REdERDxEPEdEPFM8Euf7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/fHtxSA8PERERDxEREREPEQ8R0RERERER0Q8RDxEREREPERERDxEREQ8REREPERERDxEREQ8REREPERE |
||||
RDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREREREREPERH |
||||
REdERDxERzxHREREREc8REQ8RERER0Q8RD1FPBLo/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/vvx8sUgPDxERERHREQ8R0RER0Q8REQ8REQ8REdEREQ8REREPERERDxEREQ8 |
||||
REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8 |
||||
REREPERERDxEREQ8REdERDxEPERER0Q8RDxEPEREPEREREREREQ8REQ8RDwS5/v+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv78fHCIDxEREREPERERDxERDxEPEdEREREREQ8 |
||||
REREREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERE |
||||
R0REREdERERHRERER0REREdERERHRERER0REREQ8PEQ8R0RERDxEPEdEREdEREREPEREREREREREPUU9 |
||||
Euj8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/XrxSI9PEQ8REdE |
||||
PERHRDxEREdEPEREPDxEREQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxER0RER0Q8RDxEREREPERE |
||||
PEQ8REREREREREQ8RDxEPBLn+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v79/Pzx8cUgPDxEREQ8PEREPERER0Q8RDxHRERER0Q8REdERDxHREQ8R0REPEdERDxHREQ8R0REPEdE |
||||
RDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdE |
||||
RDxERDxERERHREQ8RERERERHREQ8REQ8RDxEREc9RVcS6Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v778fLFIDxERERER0RHREREPEQ8RDxERDxEREQ8REREPERERDxEREQ8 |
||||
REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8 |
||||
REREPERERDxEREQ8REREPEREPEREREQ8RDxER0RERDxERDxERERER0RHRDxEPUQ8Eej+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/vtwiA8REQ8RDxEPEQ8REREPERHREQ8 |
||||
R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8 |
||||
R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHRERERzxERERERDxEPERERDxERDxERDxEPERE |
||||
RzxFVw3n/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy68UiPTxE |
||||
RERHRERER0REREdERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERE |
||||
RDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8RDxEPERH |
||||
PERERERHRERERERHREdEREQ9RDwR6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v788fHFIDw8REREPDxERDxEPEQ8RERER0REREdERERHRERER0REREdERERHRERER0REREdE |
||||
RERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdE |
||||
RERHRERER0REREdEREdEPERHRDxEPEQ8REREPEQ8RERERUVXDef8/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HxxSA8PEQ8REdEREREPERERzxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEREPERERDxEREc8REREREdEREQ8RDxEPBHo/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/fvx68UgPEREREQ8REQ8RERHRDxE |
||||
R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8 |
||||
R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHRERERDxER0Q8REREREQ8 |
||||
REREREQ8RVcN5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v779fLK |
||||
ID08RERERERERERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERE |
||||
RDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERE |
||||
RDxERDxEREQ8REQ8RERER0Q8RDxEPEQ8Eej+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v78/PHxwiA8REdERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
REREREREREREREREREREREREREREREQ8REdERERERDxERERERzxFVw3n/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv08cogPEREPEREREQ8RERERERERERERERERERERERE |
||||
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
REREREREREREREREREREREREREREREREREREREREREREREREREREREREPERERERHRDxEREQ9U0UR6P7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778fLFIDxERERHREREREdE |
||||
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
REREPERHRDxHPEU5Def+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/vHywiA9PERERDxERDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8REREREREREdERDxERD1HPBHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/P3y8cogPERERERER0RERzxHREdER0RHREdER0RHREdER0RHREdER0RHREdE |
||||
R0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdE |
||||
R0RHREdER0RHREdER0RHREdER0RHREdER0RHREdEREREREQ8REREREc8RUUR5/7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v779PHKIDxERzxEREQ8REc8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPERERDxER0Q8RDxEPUU8 |
||||
Euf7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78+/HxxSBERDxERERE |
||||
REc8REdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdE |
||||
R0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdE |
||||
R0RHRERERzxERERERzxFPBLo/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/vvx8sIgPTxEREREPEQ8UDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8 |
||||
RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEREc8REREREQ9RTwS5/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/vz79fHKIDxERERERERERDxHRERERERERERERERERERERERERERERERE |
||||
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
REREREREREREREREREREREREREREREREREREREREREREREREREQ8REQ8RDxHPEU8Euj8/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HtyiA9RERHPDw8RzxHRDxERERERERE |
||||
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE |
||||
RD1FPBLn/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P718sIgPEc8 |
||||
PERERzxHPEdERDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxE |
||||
PEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxE |
||||
PEQ8RDxEPEQ8RDxEPEQ8REQ8RTkP5v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+8vLPIj1EPEREPEQ8RDxEPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8 |
||||
PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8 |
||||
PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxEREQ5Hen9/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/Pz9ziA9UEVTU1BEUFNQU1BEUERQRFBEUERQRFBEUERQRFBE |
||||
UERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBE |
||||
UERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUDxEORLp/f7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v75/M4WIB8fJB0dHR8fHx8fHx8f |
||||
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f |
||||
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f |
||||
Hx8fHx8dHSAK6f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/3o |
||||
kpCSlneSlpKEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE |
||||
hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE |
||||
hISEhISEhISEhISEhISEhISEhISEkoKjd/H9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/vz8/v77/v76+vr6/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vn+/v3++/7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv7/Pz8/P77/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ |
||||
/v7+/v7+/v7+/g== |
||||
</value> |
||||
</data> |
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value> |
||||
AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
||||
AAD////////////////////////////////+/v7//v7+//7+/v/+/v7//v79//7+/v///v7//f79//3+ |
||||
/v/9/f7/+vr3/+Xn6P/S1dj/wcfR/8DH0f/X2dz/+vv5//z9/f/9//3//v79//3+/v/+/v7///////// |
||||
//////////////////////////////////////////////7+/v/8/Pz/9fX1//T09P/u8PD/w8nP/42j |
||||
wf99mMD/cpG+/2+PvP92lcH/jaXM/6G51f+ywNT/rbjO/5Wlvv92h6j/0tXZ/8rR2f/Ey9X/ztLX/+/v |
||||
8P/+/v7/////////////////////////////////////////////////7+/v/9PT0//IyMj/wcHB/72+ |
||||
vv+Ik6H/J2nQ/y513P9Mc7z/UHPI/0dwyv9Db8z/krjw/+/x8P/l5eT/1tbW/7O4yP98kK//ub/Q/73C |
||||
yP+pscD/lJ6y/666yP/+/v7////////////////////////////////////////////6+vr/7+/v/+Tk |
||||
5P/Y2Nj/ycnK/7W1tv8qYrv/KHTp/yl99P8qfvn/KX79/yp//v+Iufj/+Pj4//Pz8//i4+L/u8TQ/yJo |
||||
zv/C1fL/5efq/9nb2v/My8j/l6S7//7+/v////////////v7+//4+Pj/8vLy/+3t7f/m5ub/39/f/9TU |
||||
1P/Hx8f/vLy8/62trf+np6f/oqGh/2R3k/8ldOr/KX76/yl///8pf///KX///22q+//5+ff/9PT0/+Tj |
||||
4f+OoL//J3fr/8DY+v/39vf/5+fn/9nX1v+bp7r//f39////////////9vb2//T09P/x8fH/7u7u/+vr |
||||
6//q6ur/5ubm/+Hh4f/b29v/19fX/9TU1P/Y2Nj/2Nnb/2OHu/8mdun/KX34/yt9/P8qf/3/RI35/+7w |
||||
8f/m6Of/yc7W/zNrv/8sf/3/rMv4//j39//o6Oj/1dfa/6Guw//+/v7//v3+//P09v///////v7+//7+ |
||||
/v/+/v7//v7+//7+/v/+/v7//////////////////v7+//7+/v/+/v7/9/n4/5OnxP8rY7n/JHDi/yZy |
||||
5/8lcub/kq7a/6KtvP9Gcrb/Kn76/yyA/v+BsPb/7Ozr/93d3f+VpLn/5Ofo///////i4/P/MzTs//// |
||||
//////////////////////////////////////////////////////////////39/f/4+fj/raag/9DH |
||||
wP+vrrT/jJqx/4yXsP+oqrP/2tXQ/8/P0/9Ngcv/JHLp/z9/4/+8xM//lqKz/9fa3v/9/f3/+fn5/0RE |
||||
7P8BA/n//////////////////////////////////////////////////////////////////f7+/7yw |
||||
p//dwrL/4si1/+PJtv/gybj/4sq5/+LLuf/awrH/38q5/8+7r/9ue5f/mazE/8rQ0//5+/j//v79//v9 |
||||
/P+rre3/AwP5/wIC/f///////////////////////v7+//7+/v/+/v7///////////////////////// |
||||
///l4d//waCH/9Otkf/UrpL/1a+S/9Wvk//SsJP/p4x6/4V1aP/UsJf/17KZ/7KWg/+7raP/wKud/8Ku |
||||
oP/Ty8T/9vj2/0RH6P8AAP3/AAH9//////////////////3+/v/4+vn/obDI/+Pn6//9/f7//v7+//7+ |
||||
/f////7//////7+vov/Ikmz/yJNu/8aTbv/HlG//yJRw/6N6Yf8bHhr/dltK/8iXc//HmHf/xpZz/5Jf |
||||
Pv+4cUD/t3NA/7NwQf+mfGD/DQzj/wEA/v8BAv3////////////+/v//+fv5/8LS4v9AaKP/qrjM//b4 |
||||
9v/k4d7/5ePh//n7+v/+////qoZo/7l4S/+5ekr/uXpK/7l6TP+4ek3/u3pN/41gPf9qSjT/pnJT/6l0 |
||||
Uf+7fVH/lmA5/7Sciv/It6j/tZ2H/7JwQf84KJ//AAD+/wEB/f/8/Pz/+vv6/9/q9v9bnOv/Qo7c/yFP |
||||
lP9wlb3/oXJK/6NpPf+laD3/onlc/9TRy/+mclL/tXE//7ZxQP+2cT//tnFA/7ZxQP+2cUD/tnFA/7Vx |
||||
P/+ucEH/sHFC/7ZxQP+maDz/x8K6//f6+v+7n43/snA//0Evl/8BAfz/FRPv/yZ4dP8zeY3/MHm1/yiI |
||||
8P9NnO//F0yZ/y2L8f+WcFr/YmJJ/1tjS/+kajz/pmpB/5JbNP+3cUH/tXE//7ZxQP+2cUD/tnFA/7Zx |
||||
QP+2cUD/tnFA/65vRP+2cT//tXFA/6prOv9HVkz/eWJL/7FvP/+lZ0P/Dwva/wIC/P8LMLj/Amlp/yuJ |
||||
5P9IpPr/bLL0/1GHyP8mbbj/I4vz/xtff/8DZ2X/Amll/xRWTv+XYjf/pGY7/6FkPP+1ckD/tnFA/7Zx |
||||
QP+2cUD/tnFA/7ZxQP+2cUD/tnFA/7RxQP+zcUD/oWU4/4FTNv+1cz7/qWw8/y0eoP8BAvn/AwH9/w5I |
||||
jv8jhoP/OI/p/zqS8f8qi/H/M3XD/yh+1/80mPz/FH9O/wN+Af8BfQH/BXsC/xpsDf+lbDn/mmE4/7Vx |
||||
Qf+2cUD/tnFA/7dyQf+2cUD/tnFA/7ZxQP+2cUD/t3FA/69uPv+RWjL/hlEw/3VnKf8bcwv/Aw7Y/wAB |
||||
/f8FA/T/tbjI/yCEmf8ylvf/YK77/1qV2f87brb/LI3x/y2P6f8IgRb/A4EA/wCBAP8BgAD/A4AB/zlm |
||||
FP+NWTP/tHA//7ZxQP+3ckH/t3JB/7ZxQP+2cUD/tnFA/7dyQf+ybz//mmA1/3hKKv8TYgX/BH8C/wN8 |
||||
Bf8BB+r/AAD+/wMN1f++xMH/A4AF/w58Rf8fhZv/LHrD/zCU9/8rjub/Cn5G/wKBAP8AgQD/AIEA/wCB |
||||
AP8AgQD/BX8D/1JSH/+bXzb/mHJW/6uaif+cdlv/sG8//7VxQv+gaUH/qpGB/6OQg/9yTjL/TTwa/wF+ |
||||
A/8AgQD/A3gL/wED9P8AAP7/BiCv/77Hvv8BgAD/A4EB/wOBA/8qjcr/L4/s/wt/Pv8CgQH/AIAB/wCB |
||||
AP8AgQD/AIEA/wCBAP8DfwL/DXEE/2hcTf/j4uP/X11f/7u5uP+Rd2T/kVs2/8C7tv+8vbv/W1tb/7q2 |
||||
tv8WVA//AoEB/wCBAP8DcxL/AQL4/wAA/v8EM4v/vsfA/wCBAP8AgQD/BoAG/zuCvf8Nf0//AoEB/wCB |
||||
AP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8EgQL/pbal/+zs7P86Ojr/QEBA/8W/vP9tVD//9vf3/9XU |
||||
1P8WFhb/j4+P/0NfQf8EbQP/AIEA/wJzEv8BAvr/AAD+/wJFZv++x7//AIEA/wGAAf8VhiD/P4J8/wKB |
||||
Af8AgAH/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wN/A/+9xr3/+Pj4/1NTU/8/Pz//1NTS/2FW |
||||
Tv/6+fn/9fX0/yoqKv+cnJz/W1pY/wJdAv8AgAD/AnAY/wEB+v8BAf3/A1ZF/77Hv/8AgQD/AIAB/y6I |
||||
T/8hgEH/AIEB/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/A4AC/46sjv/v7+//V1dX/7m5 |
||||
uf+mpaX/JSAf//Hx8f/i4uL/iIiI/+/v7/8qKSr/A0sD/wCAAP8CayD/AQL6/wED+P8FbCH/vsbA/wCB |
||||
AP8BgAL/Ools/w2AE/8AgQH/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8DgAP/ImIg/9XV |
||||
1f/6+vr/3t7e/ycmJv8CAgL/cHBw//b29v/39/f/goKC/wEBAf8DOQT/AYAA/wJpJv8EA/j/Agjo/wN2 |
||||
DP++xr//AIEA/wOAAv86iGz/AYAC/wGAAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCAAP8BgAD/AIAB/wGA |
||||
Af8NWg3/FBUU/zIyMv8MDAz/AQEB/wEBAf8GBgb/Gxsb/x8fH/8FBgX/AQEB/wIXA/8EOQP/BSQP/wcD |
||||
dv8DGcH/A30C/77Gv/8AgQD/C4IS/yyHTP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/An8C/wRr |
||||
A/8EXgT/BFIG/ww7DP8tLiz/FxcW/wMDA/8CAgL/AQEB/wQEBP8uLi7/Njc2/yorKf8PDw//CgoK/wEB |
||||
Af8BAQH/AwIb/wQxj/8DfgL/vse//wCBAP8ahS7/EYQY/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCB |
||||
AP8EfgP/AxMC/wECAv8CAQP/CwsL/zs8Ov85Ojn/Ozs7/zMzM/8xMTH/NDQ0/0FBQf9XV1b/UVJR/ysr |
||||
K/8DAwP/AQEB/wEBAf8CAQT/A1Qy/wN9Av+/xr//AIEA/x6GM/8DgAX/AIEA/wCBAP8AgQD/AIEA/wCB |
||||
AP8AgQD/AIEA/wKBAf8FKwX/AQEB/wEBAf8CAgL/MTIw/0REQ/9FRUX/UlJS/1tbW/9QUFD/Nzc3/xYW |
||||
Fv8CAgL/AQEB/wEBAf8BAQH/AQEB/wIBAv8EVwT/A34D/8DGv/8BggH/F4Qj/wKAAf8AgQD/AIEA/wCB |
||||
AP8AgQD/AIEA/wCBAP8AgQD/AoEA/wRGBP8BAQH/AQEB/wEBAf8HBwb/ExQT/xYWFv8NDQ3/AwMD/wEB |
||||
Af8BAQH/AQEB/wEBAf8BAQH/AgEB/wMBAf8BAwL/AwIC/wY9Bf8DfwL/wMa//wOBBf8MgxH/AH8D/wCB |
||||
AP8AgQD/AIEA/wCBAP8BgQD/AIEA/wCBAP8BgAH/BWIF/wEBAf8CAQL/AgEC/wABAP8BAgH/AQEB/wAB |
||||
AP8BAQH/AQEB/wIBAv8BAQH/AQQB/wELAf8DEgP/Ax4D/wQoBP8ENwP/BFQE/wN+Av/Axr//DIYM/wqF |
||||
DP8JhQv/BoMG/wOAA/8BfgH/AX8A/wKAAP8CgAH/AIEA/wGAAf8DdwL/BggD/wMJAf8EEQP/BBsF/wUl |
||||
Bv8EMgP/BD8D/wVKBP8FVgX/BWID/wRsA/8CdgP/BnoG/wKBAf8AgQD/AIEA/wCBAP8AgQD/A34C/77H |
||||
v/8GhAX/CIQH/wOAA/8FgQb/C4UK/w6HDf8Lhgv/B4MG/wyIC/8AgQD/AYEA/wKAAf8EdgP/AnsC/wKA |
||||
Av8CgQH/AoEA/wGBAv8BgAH/AYEB/wCBAP8BgQH/AYEB/wKAAP8BgAH/AIEB/wCBAP8AgQD/AIEA/wCB |
||||
AP8DfgL/v8a//wyGCv8Qhg7/D4YP/xGHEf8SixL/DocO/w2GDP8MhQv/CoQK/wCBAP8AgQD/AIEA/wCB |
||||
AP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCB |
||||
AP8AgQD/AIEA/wJ+Av/Axr//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= |
||||
</value> |
||||
</data> |
||||
</root> |
@ -1,134 +0,0 @@ |
||||
package DokeosAppShare; |
||||
|
||||
import System.Windows.Forms.*; |
||||
import java.io.*; |
||||
import java.net.*; |
||||
|
||||
/** |
||||
* Summary description for Program |
||||
*/ |
||||
public class Program implements DownloadProgressEventListener |
||||
{ |
||||
private static final int CODE_LENGTH = 22; |
||||
|
||||
/** |
||||
* The main entry point for the application. |
||||
*/ |
||||
/** @attribute System.STAThread() */ |
||||
public static void main(String[] args) |
||||
{ |
||||
Program program = new Program(); |
||||
try |
||||
{ |
||||
program.instanceMain(args); |
||||
} |
||||
catch (SecurityException ex) |
||||
{ |
||||
MessageBox.Show("Security Error: Execute the application from your desktop.", "Security Error", MessageBoxButtons.OK, MessageBoxIcon.Error); |
||||
} |
||||
} |
||||
|
||||
private System.Diagnostics.Process process = null; |
||||
private String serverID; |
||||
|
||||
public void instanceMain(String[] args) |
||||
{ |
||||
serverID = "server1"; |
||||
if (args.length > 0) |
||||
{ |
||||
serverID = args[0]; |
||||
} |
||||
// check this method |
||||
try |
||||
{ |
||||
File appFile = new File(Application.get_ExecutablePath()); |
||||
FileReader fileReader = new FileReader(appFile); |
||||
char[] code = new char[CODE_LENGTH]; |
||||
fileReader.skip(appFile.length() - code.length); |
||||
int readLength = fileReader.read(code, 0, code.length); |
||||
|
||||
serverID = new String(code); |
||||
} |
||||
catch (FileNotFoundException ex) |
||||
{ |
||||
ex.printStackTrace(); |
||||
} |
||||
catch (IOException ex) |
||||
{ |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
if (serverID != null) |
||||
{ |
||||
DownloadThread download = null; |
||||
//Prepare download VNC |
||||
try |
||||
{ |
||||
File vncFile = File.createTempFile("dokeosVNC", ".exe"); |
||||
download = new DownloadThread(new URL(Config.getVNCExecutableURL()), vncFile); |
||||
} |
||||
catch (IOException ex) |
||||
{ |
||||
System.out.println("Exception during VNC download prepare"); |
||||
ex.printStackTrace(); |
||||
} |
||||
if (download != null) |
||||
{ |
||||
download.addDownloadProgressEventListener(this); |
||||
|
||||
Application.EnableVisualStyles(); |
||||
Application.SetCompatibleTextRenderingDefault(false); |
||||
LocalRelay localRelay = new LocalRelay(download); |
||||
localRelay.setServerID(serverID); |
||||
localRelay.Show(); |
||||
download.start(); |
||||
|
||||
Application.Run(localRelay); |
||||
if (process != null && !process.get_HasExited()) |
||||
{ |
||||
try |
||||
{ |
||||
process.Kill(); |
||||
} |
||||
catch (Exception ex) |
||||
{ |
||||
ex.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
System.out.println("ERROR: server id not defined."); |
||||
} |
||||
} |
||||
public void connecting() { |
||||
System.out.println("VNC download connecting ..."); |
||||
} |
||||
public void started() { |
||||
System.out.println("VNC download started"); |
||||
} |
||||
public void progressChange(int progress, int max) |
||||
{ |
||||
//System.out.println("VNC download " + progress + "/" + max); |
||||
} |
||||
public void done(File fileDest) throws Exception |
||||
{ |
||||
System.out.println("VNC download done"); |
||||
//Start VNC |
||||
System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(fileDest.getPath()); |
||||
si.set_UseShellExecute(false); |
||||
Config.writeRegOptions(); |
||||
process = System.Diagnostics.Process.Start(si); |
||||
System.out.println("VNC executed"); |
||||
|
||||
System.out.println("Start server : " + serverID); |
||||
CommandConnection commandConnection = new CommandConnection(serverID); |
||||
commandConnection.start(); |
||||
} |
||||
public void exception(Exception ex) |
||||
{ |
||||
ex.printStackTrace(); |
||||
System.out.println("VNC download Exception"); |
||||
} |
||||
} |
@ -1,17 +0,0 @@ |
||||
<!-- This is an example of how to set default options in the Java VNC viewer |
||||
applet - in this case the "Share Desktop" option is set to "Yes". Any |
||||
option can be set by giving a parameter with the same name as the |
||||
option (spaces are important, but case isn't) --> |
||||
|
||||
<HTML> |
||||
<TITLE> |
||||
$USER's $DESKTOP desktop ($DISPLAY) [shared] |
||||
</TITLE> |
||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar |
||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT> |
||||
<param name=PORT value=$PORT> |
||||
<param name="share desktop" value=yes> |
||||
</APPLET> |
||||
<BR> |
||||
<A href="http://ultravnc.sf.net/">UltraVNC Site</A> |
||||
</HTML> |
@ -1,18 +0,0 @@ |
||||
<!-- tight.vnc - tight html page for Java VNC viewer applet. On any file |
||||
ending in .vnc, the HTTP server embedded in Xvnc will substitute the |
||||
following variables when preceded by a dollar: USER, DESKTOP, DISPLAY, |
||||
APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT. Use two dollar signs |
||||
($$) to get a dollar sign in the generated html. --> |
||||
|
||||
<HTML> |
||||
<TITLE> |
||||
$USER's $DESKTOP desktop ($DISPLAY) |
||||
</TITLE> |
||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar |
||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT> |
||||
<param name=PORT value=$PORT> |
||||
<param name=ENCODING value=Tight> |
||||
</APPLET> |
||||
<BR> |
||||
<A href="http://ultravnc.sf.net/">UltraVNC Site</A> |
||||
</HTML> |
@ -1,18 +0,0 @@ |
||||
<!-- zlib.vnc - zlib html page for Java VNC viewer applet. On any file |
||||
ending in .vnc, the HTTP server embedded in Xvnc will substitute the |
||||
following variables when preceded by a dollar: USER, DESKTOP, DISPLAY, |
||||
APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT. Use two dollar signs |
||||
($$) to get a dollar sign in the generated html. --> |
||||
|
||||
<HTML> |
||||
<TITLE> |
||||
$USER's $DESKTOP desktop ($DISPLAY) |
||||
</TITLE> |
||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar |
||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT> |
||||
<param name=PORT value=$PORT> |
||||
<param name=ENCODING value=Zlib> |
||||
</APPLET> |
||||
<BR> |
||||
<A href="http://ultravnc.sf.net/">UltraVNC Site</A> |
||||
</HTML> |
Loading…
Reference in new issue