mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-12-24 06:05:53 -05:00
MeshAgents on Windows are now signed.
This commit is contained in:
parent
618dfbe42e
commit
80545a7e57
@ -1 +0,0 @@
|
|||||||
Subproject commit b6bfdbbc91375c12700a81048f29b6fc5dfd3e96
|
|
Binary file not shown.
Binary file not shown.
BIN
agents/MeshService-signed.exe
Normal file
BIN
agents/MeshService-signed.exe
Normal file
Binary file not shown.
Binary file not shown.
BIN
agents/MeshService64-signed.exe
Normal file
BIN
agents/MeshService64-signed.exe
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -455,15 +455,15 @@ function startLms(func) {
|
|||||||
setupMeiOsAdmin(func, amtLms.connected == false ? 0 : 3);
|
setupMeiOsAdmin(func, amtLms.connected == false ? 0 : 3);
|
||||||
});
|
});
|
||||||
amtLms.on('notify', function (data, options, str, code) {
|
amtLms.on('notify', function (data, options, str, code) {
|
||||||
if (str != null) {
|
if (code == 'iAMT0052-3') {
|
||||||
|
kvmGetData(true);
|
||||||
|
} else if (str != null) {
|
||||||
var notify = { date: Date.now(), str: str, code: code };
|
var notify = { date: Date.now(), str: str, code: code };
|
||||||
lmsNotifications.push(notify);
|
lmsNotifications.push(notify);
|
||||||
while (lmsNotifications.length > 100) { lmsNotifications.shift(); }
|
while (lmsNotifications.length > 100) { lmsNotifications.shift(); }
|
||||||
var notifyBuf = Buffer.concat([Buffer.from('0900', 'hex'), Buffer.from(JSON.stringify(notify))]) // Add a notification
|
var notifyBuf = Buffer.concat([Buffer.from('0900', 'hex'), Buffer.from(JSON.stringify(notify))]) // Add a notification
|
||||||
for (var i in lmsControlSockets) { lmsControlSockets[i].write(notifyBuf); }
|
for (var i in lmsControlSockets) { lmsControlSockets[i].write(notifyBuf); }
|
||||||
//console.log(str);
|
|
||||||
}
|
}
|
||||||
//else { console.log(JSON.stringify(data)); }
|
|
||||||
});
|
});
|
||||||
//console.log('LME Connecting...');
|
//console.log('LME Connecting...');
|
||||||
amtLms.on('connect', function () {
|
amtLms.on('connect', function () {
|
||||||
@ -539,9 +539,79 @@ function setupMeiOsAdmin(func, state) {
|
|||||||
if (func) { func(state); }
|
if (func) { func(state); }
|
||||||
//var AllWsman = "CIM_SoftwareIdentity,IPS_SecIOService,IPS_ScreenSettingData,IPS_ProvisioningRecordLog,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_IPv6PortSettings".split(',');
|
//var AllWsman = "CIM_SoftwareIdentity,IPS_SecIOService,IPS_ScreenSettingData,IPS_ProvisioningRecordLog,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_IPv6PortSettings".split(',');
|
||||||
//osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true);
|
//osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true);
|
||||||
|
|
||||||
|
tempTimer = setInterval(function () { kvmGetData(true); }, 2000);
|
||||||
|
kvmGetData(false);
|
||||||
|
kvmSetData(JSON.stringify({ action: 'restart', ver: 1 }));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function kvmGetData(tag) {
|
||||||
|
osamtstack.IPS_KVMRedirectionSettingData_DataChannelRead(kvmDataGetResponse, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
function kvmDataGetResponse(stack, name, response, status, tag) {
|
||||||
|
if ((tag == true) && (status == 200) && (response.Body.ReturnValue == 0)) {
|
||||||
|
var val = null;
|
||||||
|
try { val = Buffer.from(response.Body.DataMessage, 'base64').toString(); } catch (e) { return }
|
||||||
|
if (val != null) kvmProcessData(response.Body.RealmsBitmap, response.Body.MessageId, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var webRtcDesktop = null;
|
||||||
|
function kvmProcessData(realms, messageId, val) {
|
||||||
|
//console.log('kvmProcessData', val);
|
||||||
|
var data = null;
|
||||||
|
try { data = JSON.parse(val) } catch (e) { }
|
||||||
|
if ((data != null) && (data.action)) {
|
||||||
|
if (data.action == 'present') { kvmSetData(JSON.stringify({ action: 'present', ver: 1 })); }
|
||||||
|
if (data.action == 'offer') {
|
||||||
|
webRtcDesktop = {};
|
||||||
|
var rtc = require('ILibWebRTC');
|
||||||
|
webRtcDesktop.webrtc = rtc.createConnection();
|
||||||
|
webRtcDesktop.webrtc.on('connected', function () { });
|
||||||
|
webRtcDesktop.webrtc.on('disconnected', function () { webRtcCleanUp(); });
|
||||||
|
webRtcDesktop.webrtc.on('dataChannel', function (rtcchannel) {
|
||||||
|
webRtcDesktop.rtcchannel = rtcchannel;
|
||||||
|
var kvmmodule = require('meshDesktop');
|
||||||
|
webRtcDesktop.kvm = kvmmodule.getRemoteDesktopStream();
|
||||||
|
webRtcDesktop.kvm.pipe(webRtcDesktop.rtcchannel, { end: false });
|
||||||
|
webRtcDesktop.rtcchannel.pipe(webRtcDesktop.kvm, { end: false });
|
||||||
|
webRtcDesktop.rtcchannel.on('end', function () { webRtcCleanUp(); });
|
||||||
|
//webRtcDesktop.kvm.on('end', function () { console.log('WebRTC DataChannel closed2'); webRtcCleanUp(); });
|
||||||
|
//webRtcDesktop.rtcchannel.on('data', function (data) { console.log('WebRTC data: ' + data); });
|
||||||
|
});
|
||||||
|
kvmSetData(JSON.stringify({ action: 'answer', ver: 1, sdp: webRtcDesktop.webrtc.setOffer(data.sdp) }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function webRtcCleanUp() {
|
||||||
|
if (webRtcDesktop == null) return;
|
||||||
|
if (webRtcDesktop.rtcchannel) {
|
||||||
|
try { webRtcDesktop.rtcchannel.close(); } catch (e) { }
|
||||||
|
try { webRtcDesktop.rtcchannel.removeAllListeners('data'); } catch (e) { }
|
||||||
|
try { webRtcDesktop.rtcchannel.removeAllListeners('end'); } catch (e) { }
|
||||||
|
delete webRtcDesktop.rtcchannel;
|
||||||
|
}
|
||||||
|
if (webRtcDesktop.webrtc) {
|
||||||
|
try { webRtcDesktop.webrtc.close(); } catch (e) { }
|
||||||
|
try { webRtcDesktop.webrtc.removeAllListeners('connected'); } catch (e) { }
|
||||||
|
try { webRtcDesktop.webrtc.removeAllListeners('disconnected'); } catch (e) { }
|
||||||
|
try { webRtcDesktop.webrtc.removeAllListeners('dataChannel'); } catch (e) { }
|
||||||
|
delete webRtcDesktop.webrtc;
|
||||||
|
}
|
||||||
|
if (webRtcDesktop.kvm) {
|
||||||
|
try { webRtcDesktop.kvm.end(); } catch (e) { }
|
||||||
|
delete webRtcDesktop.kvm;
|
||||||
|
}
|
||||||
|
webRtcDesktop = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function kvmSetData(x) {
|
||||||
|
osamtstack.IPS_KVMRedirectionSettingData_DataChannelWrite(Buffer.from(x).toString('base64'), function () { });
|
||||||
|
}
|
||||||
|
|
||||||
function startLmsWsmanResponse(stack, name, responses, status) {
|
function startLmsWsmanResponse(stack, name, responses, status) {
|
||||||
if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); }
|
if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); }
|
||||||
else if (status != 200) { console.log('ERROR: Unable to get object from Intel(R) AMT, status = ' + status + '.'); }
|
else if (status != 200) { console.log('ERROR: Unable to get object from Intel(R) AMT, status = ' + status + '.'); }
|
||||||
@ -590,7 +660,7 @@ function processLmsControlData(data) {
|
|||||||
|
|
||||||
function startRouter() {
|
function startRouter() {
|
||||||
tcpserver = net.createServer(OnTcpClientConnected);
|
tcpserver = net.createServer(OnTcpClientConnected);
|
||||||
tcpserver.on('error', function (e) { console.log('ERRORa: ' + JSON.stringify(e)); exit(0); return; });
|
tcpserver.on('error', function (e) { console.log('ERROR: ' + JSON.stringify(e)); exit(0); return; });
|
||||||
tcpserver.listen(settings.localPort, function () {
|
tcpserver.listen(settings.localPort, function () {
|
||||||
// We started listening.
|
// We started listening.
|
||||||
if (settings.remoteName == null) {
|
if (settings.remoteName == null) {
|
||||||
|
@ -802,7 +802,12 @@ function createMeshCore(agent) {
|
|||||||
var response = null;
|
var response = null;
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case 'help': { // Displays available commands
|
case 'help': { // Displays available commands
|
||||||
response = 'Available commands: help, info, args, print, type, dbget, dbset, dbcompact, eval, parseuri, httpget,\r\nwslist, wsconnect, wssend, wsclose, notify, ls, amt, netinfo, location, power, wakeonlan, scanwifi, scanamt.';
|
response = 'Available commands: help, info, args, print, type, dbget, dbset, dbcompact, eval, parseuri, httpget,\r\nwslist, wsconnect, wssend, wsclose, notify, ls, amt, netinfo, location, power, wakeonlan, scanwifi, scanamt, setdebug.';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'setdebug': {
|
||||||
|
if (args['_'].length < 1) { response = 'Proper usage: setdebug (target), 0 = StdOut, 1 = This Console, * = All Consoles, 2 = WebLog, 3 = Disabled'; } // Display usage
|
||||||
|
else { if (args['_'][0] == '*') { console.setDestination(1); } else { console.setDestination(parseInt(args['_'][0]), sessionid); } }
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'eval': { // Eval JavaScript
|
case 'eval': { // Eval JavaScript
|
||||||
|
@ -1,164 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
CheckStartupType() {
|
|
||||||
# echo "Checking process autostart system..."
|
|
||||||
if [[ `systemctl` =~ -\.mount ]]; then return 1; # systemd;
|
|
||||||
elif [[ `/sbin/init --version` =~ upstart ]]; then return 2; # upstart;
|
|
||||||
elif [[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]]; then return 3; # sysv-init;
|
|
||||||
fi
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add "StartupType=(type)" to .msh file
|
|
||||||
UpdateMshFile() {
|
|
||||||
# Remove all lines that start with "StartupType="
|
|
||||||
sed '/^StartupType=/ d' < /usr/local/mesh/meshagent.msh >> /usr/local/mesh/meshagent2.msh
|
|
||||||
# Add the startup type to the file
|
|
||||||
echo "StartupType=$starttype" >> /usr/local/mesh/meshagent2.msh
|
|
||||||
mv /usr/local/mesh/meshagent2.msh /usr/local/mesh/meshagent.msh
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckInstallAgent() {
|
|
||||||
# echo "Checking mesh identifier..."
|
|
||||||
if [ -e "/usr/local" ]
|
|
||||||
then
|
|
||||||
installpath="/usr/local/mesh"
|
|
||||||
else
|
|
||||||
installpath="/usr/mesh"
|
|
||||||
fi
|
|
||||||
if [ $# -eq 2 ]
|
|
||||||
then
|
|
||||||
url=$1
|
|
||||||
meshid=$2
|
|
||||||
meshidlen=${#meshid}
|
|
||||||
if [ $meshidlen -eq 64 ]
|
|
||||||
then
|
|
||||||
# echo "Detecting computer type..."
|
|
||||||
machinetype=$( uname -m )
|
|
||||||
machineid=0
|
|
||||||
if [ $machinetype == 'x86_64' ]
|
|
||||||
then
|
|
||||||
# Linux x86, 64 bit
|
|
||||||
machineid=6
|
|
||||||
fi
|
|
||||||
if [ $machinetype == 'x86' ]
|
|
||||||
then
|
|
||||||
# Linux x86, 32 bit
|
|
||||||
machineid=5
|
|
||||||
fi
|
|
||||||
if [ $machinetype == 'armv6l' ] || [ $machinetype == 'armv7l' ]
|
|
||||||
then
|
|
||||||
# RaspberryPi 1 (armv6l) or RaspberryPi 2/3 (armv7l)
|
|
||||||
machineid=25
|
|
||||||
fi
|
|
||||||
# TODO: Add more machine types, detect KVM support, etc.
|
|
||||||
if [ $machineid -eq 0 ]
|
|
||||||
then
|
|
||||||
echo "Unsupported machine type: $machinetype, check with server administrator."
|
|
||||||
else
|
|
||||||
DownloadAgent $url $meshid $machineid
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "MeshID is not correct, must be 64 characters long."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "URI and/or MeshID have not been specified, must be passed in as arguments."
|
|
||||||
return 0;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
DownloadAgent() {
|
|
||||||
url=$1
|
|
||||||
meshid=$2
|
|
||||||
machineid=$3
|
|
||||||
# Create folder
|
|
||||||
mkdir -p /usr/local/mesh
|
|
||||||
cd /usr/local/mesh
|
|
||||||
# echo "Downloading mesh agent..."
|
|
||||||
wget $url/meshagents?id=$machineid -q --no-check-certificate -O /usr/local/mesh/meshagent
|
|
||||||
if [ $? -eq 0 ]
|
|
||||||
then
|
|
||||||
echo "Mesh agent downloaded."
|
|
||||||
# TODO: We could check the meshagent sha256 hash, but best to authenticate the server.
|
|
||||||
chmod 755 /usr/local/mesh/meshagent
|
|
||||||
wget $url/meshsettings?id=$meshid -q --no-check-certificate -O /usr/local/mesh/meshagent.msh
|
|
||||||
if [ $? -eq 0 ]
|
|
||||||
then
|
|
||||||
UpdateMshFile
|
|
||||||
if [ $starttype -eq 1 ]
|
|
||||||
then
|
|
||||||
echo -e "[Unit]\nDescription=MeshCentral Agent\n[Service]\nExecStart=/usr/local/mesh/meshagent\nStandardOutput=null\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nAlias=meshagent.service\n" > /lib/systemd/system/meshagent.service
|
|
||||||
systemctl enable meshagent
|
|
||||||
systemctl start meshagent
|
|
||||||
else
|
|
||||||
./meshagent start
|
|
||||||
ln -s /usr/local/mesh/meshagent /sbin/meshcmd
|
|
||||||
ln -s /usr/local/mesh/meshagent /etc/rc2.d/S20mesh
|
|
||||||
ln -s /usr/local/mesh/meshagent /etc/rc3.d/S20mesh
|
|
||||||
ln -s /usr/local/mesh/meshagent /etc/rc5.d/S20mesh
|
|
||||||
fi
|
|
||||||
echo "Mesh agent started."
|
|
||||||
else
|
|
||||||
echo "Unable to download mesh settings at: $url/meshsettings?id=$meshid."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Unable to download mesh agent at: $url/meshagents?id=$machineid."
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
UninstallAgent() {
|
|
||||||
# Uninstall agent
|
|
||||||
if [ -e "/usr/local" ]
|
|
||||||
then
|
|
||||||
installpath="/usr/local/mesh"
|
|
||||||
else
|
|
||||||
installpath="/usr/mesh"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $starttype -eq 1 ]
|
|
||||||
then
|
|
||||||
rm -f /sbin/meshcmd /lib/systemd/system/meshagent.service
|
|
||||||
systemctl disable meshagent
|
|
||||||
systemctl stop meshagent
|
|
||||||
else
|
|
||||||
rm -f /sbin/meshcmd /etc/rc2.d/S20mesh /etc/rc3.d/S20mesh /etc/rc5.d/S20mesh
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -e $installpath ]
|
|
||||||
then
|
|
||||||
cd $installpath
|
|
||||||
if [ -e "$installpath/meshagent" ]
|
|
||||||
then
|
|
||||||
./meshagent stop
|
|
||||||
fi
|
|
||||||
rm -rf $installpath/*
|
|
||||||
rmdir $installpath
|
|
||||||
fi
|
|
||||||
echo "Agent uninstalled."
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CheckStartupType
|
|
||||||
starttype=$?
|
|
||||||
#echo "Type: $starttype"
|
|
||||||
|
|
||||||
currentuser=$( whoami )
|
|
||||||
if [ $currentuser == 'root' ]
|
|
||||||
then
|
|
||||||
if [ $# -eq 0 ]
|
|
||||||
then
|
|
||||||
echo -e "This script will install or uninstall a mesh agent, usage:\n $0 [serverurl] [meshid]\n $0 uninstall"
|
|
||||||
else
|
|
||||||
if [ $# -eq 1 ]
|
|
||||||
then
|
|
||||||
if [ $1 == 'uninstall' ] || [ $1 == 'UNINSTALL' ]
|
|
||||||
then
|
|
||||||
UninstallAgent
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
CheckInstallAgent $1 $2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Must be root to install or uninstall mesh agent."
|
|
||||||
fi
|
|
@ -1,7 +0,0 @@
|
|||||||
|
|
||||||
function MyTestModule()
|
|
||||||
{
|
|
||||||
this.getValue = function () { return 1245; };
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = MyTestModule;
|
|
@ -1,266 +0,0 @@
|
|||||||
var MemoryStream = require('MemoryStream');
|
|
||||||
var WindowsWireless = new Buffer([
|
|
||||||
0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x77, 0x6C, 0x61, 0x6E,
|
|
||||||
0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
|
|
||||||
0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45,
|
|
||||||
0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x77, 0x6C,
|
|
||||||
0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20,
|
|
||||||
0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20,
|
|
||||||
0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65,
|
|
||||||
0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32,
|
|
||||||
0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61,
|
|
||||||
0x6C, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x4E, 0x4F, 0x54, 0x20, 0x52, 0x45, 0x41, 0x44, 0x59, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3A, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20,
|
|
||||||
0x32, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x44, 0x2D, 0x48, 0x4F, 0x43, 0x22,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73,
|
|
||||||
0x65, 0x20, 0x33, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F,
|
|
||||||
0x4E, 0x4E, 0x45, 0x43, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65,
|
|
||||||
0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
|
||||||
0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x35, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x53, 0x53, 0x4F, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x36, 0x3A, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x56, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x22, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65,
|
|
||||||
0x20, 0x37, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4E,
|
|
||||||
0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x22, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65,
|
|
||||||
0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x30, 0x29, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E,
|
|
||||||
0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66,
|
|
||||||
0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69,
|
|
||||||
0x64, 0x2C, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x5F, 0x6C, 0x71, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69, 0x64, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x5F, 0x6C, 0x71, 0x3B, 0x0A, 0x7D, 0x0A, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x2E, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x74, 0x79,
|
|
||||||
0x70, 0x65, 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72,
|
|
||||||
0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x20, 0x5B, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62,
|
|
||||||
0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x5D, 0x3A, 0x20, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x6C, 0x71, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63,
|
|
||||||
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x29, 0x0A,
|
|
||||||
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69,
|
|
||||||
0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74,
|
|
||||||
0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x26, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x3D, 0x20, 0x37, 0x29, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68,
|
|
||||||
0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20,
|
|
||||||
0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x47, 0x65, 0x74, 0x42,
|
|
||||||
0x53, 0x53, 0x4C, 0x69, 0x73, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47,
|
|
||||||
0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x33, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
|
|
||||||
0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
|
|
||||||
0x61, 0x72, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3D, 0x20,
|
|
||||||
0x30, 0x3B, 0x20, 0x69, 0x20, 0x3C, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x3B, 0x20, 0x2B, 0x2B, 0x69, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x3D, 0x20, 0x62,
|
|
||||||
0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x20, 0x2B, 0x20, 0x28, 0x33, 0x36, 0x30, 0x20, 0x2A, 0x20, 0x69, 0x29, 0x2C, 0x20,
|
|
||||||
0x33, 0x36, 0x30, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x74, 0x72, 0x69, 0x6D, 0x28, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x74,
|
|
||||||
0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x30, 0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x32, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x36, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61,
|
|
||||||
0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x36, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x65, 0x6D, 0x69, 0x74, 0x28,
|
|
||||||
0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x2C, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x62, 0x73,
|
|
||||||
0x73, 0x69, 0x64, 0x2C, 0x20, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x57, 0x69, 0x72, 0x65,
|
|
||||||
0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x20, 0x3D, 0x20,
|
|
||||||
0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x65, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x27, 0x29, 0x2E, 0x69, 0x6E, 0x68, 0x65, 0x72, 0x69, 0x74, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29,
|
|
||||||
0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x5F,
|
|
||||||
0x47, 0x65, 0x6E, 0x65, 0x72, 0x69, 0x63, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x27, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x22, 0x77, 0x6C, 0x61, 0x6E, 0x61, 0x70, 0x69, 0x2E, 0x64, 0x6C, 0x6C, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x22,
|
|
||||||
0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28,
|
|
||||||
0x22, 0x57, 0x6C, 0x61, 0x6E, 0x47, 0x65, 0x74, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x42, 0x73, 0x73, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x20, 0x22, 0x47, 0x65, 0x74, 0x42, 0x53, 0x53,
|
|
||||||
0x4C, 0x69, 0x73, 0x74, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65,
|
|
||||||
0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E,
|
|
||||||
0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x22, 0x29, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C,
|
|
||||||
0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x6E, 0x65, 0x67,
|
|
||||||
0x6F, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69,
|
|
||||||
0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x68, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C,
|
|
||||||
0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x28, 0x32, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6E, 0x65, 0x67, 0x6F, 0x74, 0x69, 0x61, 0x74,
|
|
||||||
0x65, 0x64, 0x2C, 0x20, 0x68, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x20, 0x3D, 0x20, 0x68, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x2C, 0x20, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46,
|
|
||||||
0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E,
|
|
||||||
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x46, 0x46, 0x46, 0x46, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x43, 0x61, 0x6C,
|
|
||||||
0x6C, 0x62, 0x61, 0x63, 0x6B, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54,
|
|
||||||
0x2E, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6D, 0x69,
|
|
||||||
0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x29, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x61, 0x64, 0x64, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27,
|
|
||||||
0x2C, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x47, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64,
|
|
||||||
0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61,
|
|
||||||
0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E,
|
|
||||||
0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E,
|
|
||||||
0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44,
|
|
||||||
0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20,
|
|
||||||
0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32, 0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x69, 0x6E,
|
|
||||||
0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x31, 0x29, 0x20, 0x2F, 0x2F,
|
|
||||||
0x20, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65,
|
|
||||||
0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x70, 0x44,
|
|
||||||
0x61, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72,
|
|
||||||
0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3D, 0x20,
|
|
||||||
0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66,
|
|
||||||
0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
|
|
||||||
0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x37, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53,
|
|
||||||
0x69, 0x7A, 0x65, 0x2C, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65,
|
|
||||||
0x64, 0x53, 0x53, 0x49, 0x44, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x34, 0x2C,
|
|
||||||
0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72,
|
|
||||||
0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x36, 0x30,
|
|
||||||
0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x37, 0x36,
|
|
||||||
0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
|
|
||||||
0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64,
|
|
||||||
0x53, 0x53, 0x49, 0x44, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6F, 0x77, 0x20, 0x28, 0x22, 0x47, 0x65,
|
|
||||||
0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x73, 0x3A, 0x20, 0x46, 0x41, 0x49, 0x4C, 0x45, 0x44, 0x20, 0x28, 0x6E, 0x6F, 0x74, 0x20,
|
|
||||||
0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x29, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x7D, 0x3B, 0x0A, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x6D, 0x6F, 0x64, 0x75, 0x6C,
|
|
||||||
0x65, 0x2E, 0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x73, 0x20, 0x3D, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x3B, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var WindowsChildScript = new Buffer([
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6F, 0x6E, 0x74,
|
|
||||||
0x61, 0x69, 0x6E, 0x65, 0x72, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x76, 0x61, 0x72, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
|
|
||||||
0x28, 0x27, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x6F, 0x6E, 0x28, 0x27, 0x53, 0x63,
|
|
||||||
0x61, 0x6E, 0x27, 0x2C, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x61, 0x70, 0x29, 0x20, 0x7B, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x73, 0x65, 0x6E, 0x64,
|
|
||||||
0x28, 0x61, 0x70, 0x29, 0x3B, 0x20, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x3B, 0x0D, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
function AccessPoint(_ssid, _bssid, _lq)
|
|
||||||
{
|
|
||||||
this.ssid = _ssid;
|
|
||||||
this.bssid = _bssid;
|
|
||||||
this.lq = _lq;
|
|
||||||
}
|
|
||||||
AccessPoint.prototype.toString = function ()
|
|
||||||
{
|
|
||||||
return (this.ssid + " [" + this.bssid + "]: " + this.lq);
|
|
||||||
}
|
|
||||||
|
|
||||||
function WiFiScanner()
|
|
||||||
{
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('accessPoint');
|
|
||||||
|
|
||||||
this.hasWireless = function ()
|
|
||||||
{
|
|
||||||
var retVal = false;
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
for (var name in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[name][0].type == 'wireless') { retVal = true; break; }
|
|
||||||
}
|
|
||||||
return (retVal);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.Scan = function ()
|
|
||||||
{
|
|
||||||
if (process.platform == 'win32')
|
|
||||||
{
|
|
||||||
this.master = require('ScriptContainer').Create(15, ContainerPermissions.DEFAULT);
|
|
||||||
this.master.parent = this;
|
|
||||||
this.master.on('data', function (j) { this.parent.emit('accessPoint', new AccessPoint(j.ssid, j.bssid, j.lq)); });
|
|
||||||
|
|
||||||
this.master.addModule('Wireless', WindowsWireless.toString());
|
|
||||||
this.master.ExecuteString(WindowsChildScript.toString());
|
|
||||||
}
|
|
||||||
else if (process.platform == 'linux')
|
|
||||||
{
|
|
||||||
// Need to get the wireless interface name
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
var wlan = null;
|
|
||||||
for (var i in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[i][0].type == 'wireless')
|
|
||||||
{
|
|
||||||
wlan = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (wlan != null)
|
|
||||||
{
|
|
||||||
this.child = require('ILibProcessPipe').CreateProcess("/sbin/iwlist", "iwlist", wlan, "scan");
|
|
||||||
this.child.parent = this;
|
|
||||||
this.child.ms = new MemoryStream();
|
|
||||||
this.child.ms.parent = this.child;
|
|
||||||
this.child.on('data', function (buffer) { this.ms.write(buffer); });
|
|
||||||
this.child.on('end', function () { this.ms.end(); });
|
|
||||||
this.child.ms.on('end', function ()
|
|
||||||
{
|
|
||||||
var str = this.buffer.toString();
|
|
||||||
tokens = str.split(' - Address: ');
|
|
||||||
for (var block in tokens)
|
|
||||||
{
|
|
||||||
if (block == 0) continue;
|
|
||||||
var ln = tokens[block].split('\n');
|
|
||||||
var _bssid = ln[0];
|
|
||||||
var _lq;
|
|
||||||
var _ssid;
|
|
||||||
|
|
||||||
for (var lnblock in ln)
|
|
||||||
{
|
|
||||||
lnblock = ln[lnblock].trim();
|
|
||||||
lnblock = lnblock.trim();
|
|
||||||
if (lnblock.startsWith('ESSID:'))
|
|
||||||
{
|
|
||||||
_ssid = lnblock.slice(7, lnblock.length - 1);
|
|
||||||
if (_ssid == '<hidden>') { _ssid = ''; }
|
|
||||||
}
|
|
||||||
if (lnblock.startsWith('Signal level='))
|
|
||||||
{
|
|
||||||
_lq = lnblock.slice(13,lnblock.length-4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.parent.parent.emit('accessPoint', new AccessPoint(_ssid, _bssid, _lq));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = WiFiScanner;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,266 +0,0 @@
|
|||||||
var MemoryStream = require('MemoryStream');
|
|
||||||
var WindowsWireless = new Buffer([
|
|
||||||
0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x77, 0x6C, 0x61, 0x6E,
|
|
||||||
0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
|
|
||||||
0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45,
|
|
||||||
0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x77, 0x6C,
|
|
||||||
0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20,
|
|
||||||
0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20,
|
|
||||||
0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65,
|
|
||||||
0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32,
|
|
||||||
0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61,
|
|
||||||
0x6C, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x4E, 0x4F, 0x54, 0x20, 0x52, 0x45, 0x41, 0x44, 0x59, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3A, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20,
|
|
||||||
0x32, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x44, 0x2D, 0x48, 0x4F, 0x43, 0x22,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73,
|
|
||||||
0x65, 0x20, 0x33, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F,
|
|
||||||
0x4E, 0x4E, 0x45, 0x43, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65,
|
|
||||||
0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
|
||||||
0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x35, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x53, 0x53, 0x4F, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x36, 0x3A, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x56, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x22, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65,
|
|
||||||
0x20, 0x37, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4E,
|
|
||||||
0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x22, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65,
|
|
||||||
0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x30, 0x29, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E,
|
|
||||||
0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66,
|
|
||||||
0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69,
|
|
||||||
0x64, 0x2C, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x5F, 0x6C, 0x71, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69, 0x64, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x5F, 0x6C, 0x71, 0x3B, 0x0A, 0x7D, 0x0A, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x2E, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x74, 0x79,
|
|
||||||
0x70, 0x65, 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72,
|
|
||||||
0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x20, 0x5B, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62,
|
|
||||||
0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x5D, 0x3A, 0x20, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x6C, 0x71, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63,
|
|
||||||
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x29, 0x0A,
|
|
||||||
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69,
|
|
||||||
0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74,
|
|
||||||
0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x26, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x3D, 0x20, 0x37, 0x29, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68,
|
|
||||||
0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20,
|
|
||||||
0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x47, 0x65, 0x74, 0x42,
|
|
||||||
0x53, 0x53, 0x4C, 0x69, 0x73, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47,
|
|
||||||
0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x33, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
|
|
||||||
0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
|
|
||||||
0x61, 0x72, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3D, 0x20,
|
|
||||||
0x30, 0x3B, 0x20, 0x69, 0x20, 0x3C, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x3B, 0x20, 0x2B, 0x2B, 0x69, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x3D, 0x20, 0x62,
|
|
||||||
0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x20, 0x2B, 0x20, 0x28, 0x33, 0x36, 0x30, 0x20, 0x2A, 0x20, 0x69, 0x29, 0x2C, 0x20,
|
|
||||||
0x33, 0x36, 0x30, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x74, 0x72, 0x69, 0x6D, 0x28, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x74,
|
|
||||||
0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x30, 0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x32, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x36, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61,
|
|
||||||
0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x36, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x65, 0x6D, 0x69, 0x74, 0x28,
|
|
||||||
0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x2C, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x62, 0x73,
|
|
||||||
0x73, 0x69, 0x64, 0x2C, 0x20, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x57, 0x69, 0x72, 0x65,
|
|
||||||
0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x20, 0x3D, 0x20,
|
|
||||||
0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x65, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x27, 0x29, 0x2E, 0x69, 0x6E, 0x68, 0x65, 0x72, 0x69, 0x74, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29,
|
|
||||||
0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x5F,
|
|
||||||
0x47, 0x65, 0x6E, 0x65, 0x72, 0x69, 0x63, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x27, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x22, 0x77, 0x6C, 0x61, 0x6E, 0x61, 0x70, 0x69, 0x2E, 0x64, 0x6C, 0x6C, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x22,
|
|
||||||
0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28,
|
|
||||||
0x22, 0x57, 0x6C, 0x61, 0x6E, 0x47, 0x65, 0x74, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x42, 0x73, 0x73, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x20, 0x22, 0x47, 0x65, 0x74, 0x42, 0x53, 0x53,
|
|
||||||
0x4C, 0x69, 0x73, 0x74, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65,
|
|
||||||
0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E,
|
|
||||||
0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x22, 0x29, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C,
|
|
||||||
0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x6E, 0x65, 0x67,
|
|
||||||
0x6F, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69,
|
|
||||||
0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x68, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C,
|
|
||||||
0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x28, 0x32, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6E, 0x65, 0x67, 0x6F, 0x74, 0x69, 0x61, 0x74,
|
|
||||||
0x65, 0x64, 0x2C, 0x20, 0x68, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x20, 0x3D, 0x20, 0x68, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x2C, 0x20, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46,
|
|
||||||
0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E,
|
|
||||||
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x46, 0x46, 0x46, 0x46, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x43, 0x61, 0x6C,
|
|
||||||
0x6C, 0x62, 0x61, 0x63, 0x6B, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54,
|
|
||||||
0x2E, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6D, 0x69,
|
|
||||||
0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x29, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x61, 0x64, 0x64, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27,
|
|
||||||
0x2C, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x47, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64,
|
|
||||||
0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61,
|
|
||||||
0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E,
|
|
||||||
0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E,
|
|
||||||
0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44,
|
|
||||||
0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20,
|
|
||||||
0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32, 0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x69, 0x6E,
|
|
||||||
0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x31, 0x29, 0x20, 0x2F, 0x2F,
|
|
||||||
0x20, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65,
|
|
||||||
0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x70, 0x44,
|
|
||||||
0x61, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72,
|
|
||||||
0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3D, 0x20,
|
|
||||||
0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66,
|
|
||||||
0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
|
|
||||||
0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x37, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53,
|
|
||||||
0x69, 0x7A, 0x65, 0x2C, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65,
|
|
||||||
0x64, 0x53, 0x53, 0x49, 0x44, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x34, 0x2C,
|
|
||||||
0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72,
|
|
||||||
0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x36, 0x30,
|
|
||||||
0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x37, 0x36,
|
|
||||||
0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
|
|
||||||
0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64,
|
|
||||||
0x53, 0x53, 0x49, 0x44, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6F, 0x77, 0x20, 0x28, 0x22, 0x47, 0x65,
|
|
||||||
0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x73, 0x3A, 0x20, 0x46, 0x41, 0x49, 0x4C, 0x45, 0x44, 0x20, 0x28, 0x6E, 0x6F, 0x74, 0x20,
|
|
||||||
0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x29, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x7D, 0x3B, 0x0A, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x6D, 0x6F, 0x64, 0x75, 0x6C,
|
|
||||||
0x65, 0x2E, 0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x73, 0x20, 0x3D, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x3B, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var WindowsChildScript = new Buffer([
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6F, 0x6E, 0x74,
|
|
||||||
0x61, 0x69, 0x6E, 0x65, 0x72, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x76, 0x61, 0x72, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
|
|
||||||
0x28, 0x27, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x6F, 0x6E, 0x28, 0x27, 0x53, 0x63,
|
|
||||||
0x61, 0x6E, 0x27, 0x2C, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x61, 0x70, 0x29, 0x20, 0x7B, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x73, 0x65, 0x6E, 0x64,
|
|
||||||
0x28, 0x61, 0x70, 0x29, 0x3B, 0x20, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x3B, 0x0D, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
function AccessPoint(_ssid, _bssid, _lq)
|
|
||||||
{
|
|
||||||
this.ssid = _ssid;
|
|
||||||
this.bssid = _bssid;
|
|
||||||
this.lq = _lq;
|
|
||||||
}
|
|
||||||
AccessPoint.prototype.toString = function ()
|
|
||||||
{
|
|
||||||
return (this.ssid + " [" + this.bssid + "]: " + this.lq);
|
|
||||||
}
|
|
||||||
|
|
||||||
function WiFiScanner()
|
|
||||||
{
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('accessPoint');
|
|
||||||
|
|
||||||
this.hasWireless = function ()
|
|
||||||
{
|
|
||||||
var retVal = false;
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
for (var name in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[name][0].type == 'wireless') { retVal = true; break; }
|
|
||||||
}
|
|
||||||
return (retVal);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.Scan = function ()
|
|
||||||
{
|
|
||||||
if (process.platform == 'win32')
|
|
||||||
{
|
|
||||||
this.master = require('ScriptContainer').Create(15, ContainerPermissions.DEFAULT);
|
|
||||||
this.master.parent = this;
|
|
||||||
this.master.on('data', function (j) { this.parent.emit('accessPoint', new AccessPoint(j.ssid, j.bssid, j.lq)); });
|
|
||||||
|
|
||||||
this.master.addModule('Wireless', WindowsWireless.toString());
|
|
||||||
this.master.ExecuteString(WindowsChildScript.toString());
|
|
||||||
}
|
|
||||||
else if (process.platform == 'linux')
|
|
||||||
{
|
|
||||||
// Need to get the wireless interface name
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
var wlan = null;
|
|
||||||
for (var i in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[i][0].type == 'wireless')
|
|
||||||
{
|
|
||||||
wlan = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (wlan != null)
|
|
||||||
{
|
|
||||||
this.child = require('ILibProcessPipe').CreateProcess("/sbin/iwlist", "iwlist", wlan, "scan");
|
|
||||||
this.child.parent = this;
|
|
||||||
this.child.ms = new MemoryStream();
|
|
||||||
this.child.ms.parent = this.child;
|
|
||||||
this.child.on('data', function (buffer) { this.ms.write(buffer); });
|
|
||||||
this.child.on('end', function () { this.ms.end(); });
|
|
||||||
this.child.ms.on('end', function ()
|
|
||||||
{
|
|
||||||
var str = this.buffer.toString();
|
|
||||||
tokens = str.split(' - Address: ');
|
|
||||||
for (var block in tokens)
|
|
||||||
{
|
|
||||||
if (block == 0) continue;
|
|
||||||
var ln = tokens[block].split('\n');
|
|
||||||
var _bssid = ln[0];
|
|
||||||
var _lq;
|
|
||||||
var _ssid;
|
|
||||||
|
|
||||||
for (var lnblock in ln)
|
|
||||||
{
|
|
||||||
lnblock = ln[lnblock].trim();
|
|
||||||
lnblock = lnblock.trim();
|
|
||||||
if (lnblock.startsWith('ESSID:'))
|
|
||||||
{
|
|
||||||
_ssid = lnblock.slice(7, lnblock.length - 1);
|
|
||||||
if (_ssid == '<hidden>') { _ssid = ''; }
|
|
||||||
}
|
|
||||||
if (lnblock.startsWith('Signal level='))
|
|
||||||
{
|
|
||||||
_lq = lnblock.slice(13,lnblock.length-4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.parent.parent.emit('accessPoint', new AccessPoint(_ssid, _bssid, _lq));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = WiFiScanner;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,456 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2018 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @fileoverview Script Compiler / Decompiler / Runner
|
|
||||||
* @author Ylian Saint-Hilaire
|
|
||||||
* @version v0.1.0e
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Core functions
|
|
||||||
script_functionTable1 = ['nop', 'jump', 'set', 'print', 'dialog', 'getitem', 'substr', 'indexof', 'split', 'join', 'length', 'jsonparse', 'jsonstr', 'add', 'substract', 'parseint', 'wsbatchenum', 'wsput', 'wscreate', 'wsdelete', 'wsexec', 'scriptspeed', 'wssubscribe', 'wsunsubscribe', 'readchar', 'signwithdummyca'];
|
|
||||||
|
|
||||||
// functions of type ARG1 = func(ARG2, ARG3, ARG4, ARG5, ARG6)
|
|
||||||
script_functionTable2 = ['encodeuri', 'decodeuri', 'passwordcheck', 'atob', 'btoa', 'hex2str', 'str2hex', 'random', 'md5', 'maketoarray', 'readshort', 'readshortx', 'readint', 'readsint', 'readintx', 'shorttostr', 'shorttostrx', 'inttostr', 'inttostrx'];
|
|
||||||
|
|
||||||
// functions of type ARG1 = func(ARG2, ARG3, ARG4, ARG5, ARG6)
|
|
||||||
script_functionTableX2 = [encodeURI, decodeURI, passwordcheck, window.atob.bind(window), window.btoa.bind(window), hex2rstr, rstr2hex, random, rstr_md5, MakeToArray, ReadShort, ReadShortX, ReadInt, ReadSInt, ReadIntX, ShortToStr, ShortToStrX, IntToStr, IntToStrX];
|
|
||||||
|
|
||||||
// Optional functions of type ARG1 = func(ARG2, ARG3, ARG4, ARG5, ARG6)
|
|
||||||
script_functionTable3 = ['pullsystemstatus', 'pulleventlog', 'pullauditlog', 'pullcertificates', 'pullwatchdog', 'pullsystemdefense', 'pullhardware', 'pulluserinfo', 'pullremoteaccess', 'highlightblock', 'disconnect', 'getsidstring', 'getsidbytearray', 'pulleventsubscriptions'];
|
|
||||||
|
|
||||||
// Optional functions of type ARG1 = func(ARG2, ARG3, ARG4, ARG5, ARG6)
|
|
||||||
script_functionTableX3 = [
|
|
||||||
PullSystemStatus
|
|
||||||
,
|
|
||||||
// ###BEGIN###{EventLog}
|
|
||||||
PullEventLog
|
|
||||||
// ###END###{EventLog}
|
|
||||||
,
|
|
||||||
// ###BEGIN###{AuditLog}
|
|
||||||
PullAuditLog
|
|
||||||
// ###END###{AuditLog}
|
|
||||||
,
|
|
||||||
// ###BEGIN###{Certificates}
|
|
||||||
PullCertificates
|
|
||||||
// ###END###{Certificates}
|
|
||||||
,
|
|
||||||
// ###BEGIN###{AgentPresence}
|
|
||||||
PullWatchdog
|
|
||||||
// ###END###{AgentPresence}
|
|
||||||
,
|
|
||||||
// ###BEGIN###{SystemDefense}
|
|
||||||
PullSystemDefense
|
|
||||||
// ###END###{SystemDefense}
|
|
||||||
,
|
|
||||||
// ###BEGIN###{HardwareInfo}
|
|
||||||
PullHardware
|
|
||||||
// ###END###{HardwareInfo}
|
|
||||||
,
|
|
||||||
PullUserInfo
|
|
||||||
,
|
|
||||||
// ###BEGIN###{RemoteAccess}
|
|
||||||
PullRemoteAccess
|
|
||||||
// ###END###{RemoteAccess}
|
|
||||||
,
|
|
||||||
// ###BEGIN###{Scripting-Editor}
|
|
||||||
script_HighlightBlock
|
|
||||||
// ###END###{Scripting-Editor}
|
|
||||||
,
|
|
||||||
// ###BEGIN###{ComputerSelector}
|
|
||||||
disconnect
|
|
||||||
// ###END###{ComputerSelector}
|
|
||||||
,
|
|
||||||
function (runner, x) { return GetSidString(x); }
|
|
||||||
,
|
|
||||||
function (runner, x) { return GetSidByteArray(x); }
|
|
||||||
,
|
|
||||||
// ###BEGIN###{EventSubscriptions}
|
|
||||||
PullEventSubscriptions
|
|
||||||
// ###END###{EventSubscriptions}
|
|
||||||
];
|
|
||||||
|
|
||||||
// Setup the script state
|
|
||||||
function script_setup(binary, startvars) {
|
|
||||||
var obj = { startvars:startvars };
|
|
||||||
if (binary.length < 6) { console.error('Invalid script length'); return null; } // Script must have at least 6 byte header
|
|
||||||
if (ReadInt(binary, 0) != 0x247D2945) { console.error('Invalid binary script'); return null; } // Check the script magic header
|
|
||||||
if (ReadShort(binary, 4) > 1) { console.error('Unsupported script version'); return null; } // Check the script version
|
|
||||||
obj.script = binary.substring(6);
|
|
||||||
// obj.onStep;
|
|
||||||
// obj.onConsole;
|
|
||||||
|
|
||||||
// Reset the script to the start
|
|
||||||
obj.reset = function (stepspeed) {
|
|
||||||
obj.stop();
|
|
||||||
obj.ip = 0;
|
|
||||||
obj.variables = startvars;
|
|
||||||
obj.state = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the script
|
|
||||||
obj.start = function (stepspeed) {
|
|
||||||
obj.stop();
|
|
||||||
obj.stepspeed = stepspeed;
|
|
||||||
if (stepspeed > 0) { obj.timer = setInterval(function () { obj.step() }, stepspeed); }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop the script
|
|
||||||
obj.stop = function () {
|
|
||||||
if (obj.timer != null) { clearInterval(obj.timer); }
|
|
||||||
obj.timer = null;
|
|
||||||
obj.stepspeed = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// function used to load and store variable values
|
|
||||||
obj.getVar = function (name) { if (name == undefined) return undefined; return obj.getVarEx(name.split('.'), obj.variables); }
|
|
||||||
obj.getVarEx = function (name, val) { try { if (name == undefined) return undefined; if (name.length == 0) return val; return obj.getVarEx(name.slice(1), val[name[0]]); } catch (e) { return null; } }
|
|
||||||
obj.setVar = function (name, val) { obj.setVarEx(name.split('.'), obj.variables, val); }
|
|
||||||
obj.setVarEx = function (name, vars, val) { if (name.length == 1) { vars[name[0]] = val; } else { obj.setVarEx(name.slice(1), vars[name[0]], val); } }
|
|
||||||
|
|
||||||
// Run the script one step forward
|
|
||||||
obj.step = function () {
|
|
||||||
if (obj.state != 1) return;
|
|
||||||
if (obj.ip < obj.script.length) {
|
|
||||||
var cmdid = ReadShort(obj.script, obj.ip);
|
|
||||||
var cmdlen = ReadShort(obj.script, obj.ip + 2);
|
|
||||||
var argcount = ReadShort(obj.script, obj.ip + 4);
|
|
||||||
var argptr = obj.ip + 6;
|
|
||||||
var args = [];
|
|
||||||
|
|
||||||
// Clear all temp variables (This is optional)
|
|
||||||
for (var i in obj.variables) { if (i.startsWith('__')) { delete obj.variables[i]; } }
|
|
||||||
|
|
||||||
// Loop on each argument, moving forward by the argument length each time
|
|
||||||
for (var i = 0; i < argcount; i++) {
|
|
||||||
var arglen = ReadShort(obj.script, argptr);
|
|
||||||
var argval = obj.script.substring(argptr + 2, argptr + 2 + arglen);
|
|
||||||
var argtyp = argval.charCodeAt(0);
|
|
||||||
argval = argval.substring(1);
|
|
||||||
if (argtyp < 2) {
|
|
||||||
// Get the value and replace all {var} with variable values
|
|
||||||
while (argval.split("{").length > 1) { var t = argval.split("{").pop().split("}").shift(); argval = argval.replace('{' + t + '}', obj.getVar(t)); }
|
|
||||||
if (argtyp == 1) { obj.variables['__' + i] = decodeURI(argval); argval = '__' + i; } // If argtyp is 1, this is a literal. Store in temp variable.
|
|
||||||
args.push(argval);
|
|
||||||
}
|
|
||||||
if (argtyp == 2 || argtyp == 3) {
|
|
||||||
obj.variables['__' + i] = ReadSInt(argval, 0);
|
|
||||||
args.push('__' + i);
|
|
||||||
}
|
|
||||||
argptr += (2 + arglen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move instruction pointer forward by command size
|
|
||||||
obj.ip += cmdlen;
|
|
||||||
|
|
||||||
// Get all variable values
|
|
||||||
var argsval = [];
|
|
||||||
for (var i = 0; i < 10; i++) { argsval.push(obj.getVar(args[i])); }
|
|
||||||
var storeInArg0;
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (cmdid < 10000) {
|
|
||||||
// Lets run the actual command
|
|
||||||
switch (cmdid) {
|
|
||||||
case 0: // nop
|
|
||||||
break;
|
|
||||||
case 1: // jump(label) or jump(label, a, compare, b)
|
|
||||||
if (argsval[2]) {
|
|
||||||
if (
|
|
||||||
(argsval[2] == '<' && argsval[1] < argsval[3]) ||
|
|
||||||
(argsval[2] == '<=' && argsval[1] <= argsval[3]) ||
|
|
||||||
(argsval[2] == '!=' && argsval[1] != argsval[3]) ||
|
|
||||||
(argsval[2] == '=' && argsval[1] == argsval[3]) ||
|
|
||||||
(argsval[2] == '>=' && argsval[1] >= argsval[3]) ||
|
|
||||||
(argsval[2] == '>' && argsval[1] > argsval[3])
|
|
||||||
) { obj.ip = argsval[0]; }
|
|
||||||
} else {
|
|
||||||
obj.ip = argsval[0]; // Set the instruction pointer to the new location in the script
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2: // set(variable, value)
|
|
||||||
if (args[1] == undefined) delete obj.variables[args[0]]; else obj.setVar(args[0], argsval[1]);
|
|
||||||
break;
|
|
||||||
case 3: // print(message)
|
|
||||||
if (obj.onConsole) { obj.onConsole(obj.toString(argsval[0]), obj); } else { console.log(obj.toString(argsval[0])); }
|
|
||||||
// Q(obj.consoleid).value += () + '\n'); Q(obj.console).scrollTop = Q(obj.console).scrollHeight;
|
|
||||||
break;
|
|
||||||
case 4: // dialog(title, content, buttons)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.dialog = true;
|
|
||||||
setDialogMode(11, argsval[0], argsval[2], obj.xxStepDialogOk, argsval[1], obj);
|
|
||||||
break;
|
|
||||||
case 5: // getitem(a, b, c)
|
|
||||||
for (var i in argsval[1]) { if (argsval[1][i][argsval[2]] == argsval[3]) { storeInArg0 = i; } };
|
|
||||||
break;
|
|
||||||
case 6: // substr(variable_dest, variable_src, index, len)
|
|
||||||
storeInArg0 = argsval[1].substr(argsval[2], argsval[3]);
|
|
||||||
break;
|
|
||||||
case 7: // indexOf(variable_dest, variable_src, index, len)
|
|
||||||
storeInArg0 = argsval[1].indexOf(argsval[2]);
|
|
||||||
break;
|
|
||||||
case 8: // split(variable_dest, variable_src, separator)
|
|
||||||
storeInArg0 = argsval[1].split(argsval[2]);
|
|
||||||
break;
|
|
||||||
case 9: // join(variable_dest, variable_src, separator)
|
|
||||||
storeInArg0 = argsval[1].join(argsval[2]);
|
|
||||||
break;
|
|
||||||
case 10: // length(variable_dest, variable_src)
|
|
||||||
storeInArg0 = argsval[1].length;
|
|
||||||
break;
|
|
||||||
case 11: // jsonparse(variable_dest, json)
|
|
||||||
storeInArg0 = JSON.parse(argsval[1]);
|
|
||||||
break;
|
|
||||||
case 12: // jsonstr(variable_dest, variable_src)
|
|
||||||
storeInArg0 = JSON.stringify(argsval[1]);
|
|
||||||
break;
|
|
||||||
case 13: // add(variable_dest, variable_src, value)
|
|
||||||
storeInArg0 = (argsval[1] + argsval[2]);
|
|
||||||
break;
|
|
||||||
case 14: // substract(variable_dest, variable_src, value)
|
|
||||||
storeInArg0 = (argsval[1] - argsval[2]);
|
|
||||||
break;
|
|
||||||
case 15: // parseInt(variable_dest, variable_src)
|
|
||||||
storeInArg0 = parseInt(argsval[1]);
|
|
||||||
break;
|
|
||||||
case 16: // wsbatchenum(name, objectList)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.amtstack.BatchEnum(argsval[0], argsval[1], obj.xxWsmanReturn, obj);
|
|
||||||
break;
|
|
||||||
case 17: // wsput(name, args)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.amtstack.Put(argsval[0], argsval[1], obj.xxWsmanReturn, obj);
|
|
||||||
break;
|
|
||||||
case 18: // wscreate(name, args)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.amtstack.Create(argsval[0], argsval[1], obj.xxWsmanReturn, obj);
|
|
||||||
break;
|
|
||||||
case 19: // wsdelete(name, args)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.amtstack.Delete(argsval[0], argsval[1], obj.xxWsmanReturn, obj);
|
|
||||||
break;
|
|
||||||
case 20: // wsexec(name, method, args, selectors)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.amtstack.Exec(argsval[0], argsval[1], argsval[2], obj.xxWsmanReturn, obj, 0, argsval[3]);
|
|
||||||
break;
|
|
||||||
case 21: // Script Speed
|
|
||||||
obj.stepspeed = argsval[0];
|
|
||||||
if (obj.timer != null) { clearInterval(obj.timer); obj.timer = setInterval(function () { obj.step() }, obj.stepspeed); }
|
|
||||||
break;
|
|
||||||
case 22: // wssubscribe(name, delivery, url, selectors, opaque, user, pass)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.amtstack.Subscribe(argsval[0], argsval[1], argsval[2], obj.xxWsmanReturn, obj, 0, argsval[3], argsval[4], argsval[5], argsval[6]);
|
|
||||||
break;
|
|
||||||
case 23: // wsunsubscribe(name, selectors)
|
|
||||||
obj.state = 2;
|
|
||||||
obj.amtstack.UnSubscribe(argsval[0], obj.xxWsmanReturn, obj, 0, argsval[1]);
|
|
||||||
break;
|
|
||||||
case 24: // readchar(str, pos)
|
|
||||||
console.log(argsval[1], argsval[2], argsval[1].charCodeAt(argsval[2]));
|
|
||||||
storeInArg0 = argsval[1].charCodeAt(argsval[2]);
|
|
||||||
break;
|
|
||||||
case 25: // signWithDummyCa
|
|
||||||
// ###BEGIN###{Certificates}
|
|
||||||
obj.state = 2;
|
|
||||||
// DERKey, xxCaPrivateKey, certattributes, issuerattributes
|
|
||||||
amtcert_signWithCaKey(argsval[0], null, argsval[1], { 'CN': 'Untrusted Root Certificate' }, obj.xxSignWithDummyCaReturn);
|
|
||||||
// ###END###{Certificates}
|
|
||||||
break;
|
|
||||||
default: {
|
|
||||||
obj.state = 9;
|
|
||||||
console.error("Script Error, unknown command: " + cmdid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (cmdid < 20000) {
|
|
||||||
// functions of type ARG1 = func(ARG2, ARG3, ARG4, ARG5, ARG6)
|
|
||||||
storeInArg0 = script_functionTableX2[cmdid - 10000](argsval[1], argsval[2], argsval[3], argsval[4], argsval[5], argsval[6]);
|
|
||||||
} else {
|
|
||||||
// Optional functions of type ARG1 = func(ARG2, ARG3, ARG4, ARG5, ARG6)
|
|
||||||
if (script_functionTableX3 && script_functionTableX3[cmdid - 20000]) {
|
|
||||||
storeInArg0 = script_functionTableX3[cmdid - 20000](obj, argsval[1], argsval[2], argsval[3], argsval[4], argsval[5], argsval[6]); // Note that optional calls start with "obj" as first argument.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (storeInArg0 != undefined) obj.setVar(args[0], storeInArg0);
|
|
||||||
} catch (e) {
|
|
||||||
if (typeof e == 'object') { e = e.message; }
|
|
||||||
obj.setVar('_exception', e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj.state == 1 && obj.ip >= obj.script.length) { obj.state = 0; obj.stop(); }
|
|
||||||
if (obj.onStep) obj.onStep(obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj.xxStepDialogOk = function (button) {
|
|
||||||
obj.variables['DialogSelect'] = button;
|
|
||||||
obj.state = 1;
|
|
||||||
obj.dialog = false;
|
|
||||||
if (obj.onStep) obj.onStep(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ###BEGIN###{**ClosureAdvancedMode}
|
|
||||||
obj.xxWsmanReturnFix = function (x) {
|
|
||||||
if (!x || x == null) return;
|
|
||||||
if (x.Header) { x['Header'] = x.Header; delete x.Header; }
|
|
||||||
if (x.Body) { x['Body'] = x.Body; delete x.Body; }
|
|
||||||
if (x.Responses) { x['Responses'] = x.Responses; delete x.Responses; }
|
|
||||||
if (x.Response) { x['Response'] = x.Response; delete x.Response; }
|
|
||||||
if (x.ReturnValueStr) { x['ReturnValueStr'] = x.ReturnValueStr; delete x.ReturnValueStr; }
|
|
||||||
}
|
|
||||||
// ###END###{**ClosureAdvancedMode}
|
|
||||||
|
|
||||||
obj.xxWsmanReturn = function (stack, name, responses, status) {
|
|
||||||
// ###BEGIN###{**ClosureAdvancedMode}
|
|
||||||
// This is required when Google Closure is used
|
|
||||||
if (responses) {
|
|
||||||
obj.xxWsmanReturnFix(responses);
|
|
||||||
for (var i in responses) {
|
|
||||||
obj.xxWsmanReturnFix(responses[i]);
|
|
||||||
for (var j in responses[i]) { obj.xxWsmanReturnFix(responses[i][j]); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ###END###{**ClosureAdvancedMode}
|
|
||||||
obj.setVar(name, responses);
|
|
||||||
obj.setVar('wsman_result', status);
|
|
||||||
obj.setVar('wsman_result_str', ((httpErrorTable[status]) ? (httpErrorTable[status]) : ('Error #' + status)));
|
|
||||||
obj.state = 1;
|
|
||||||
if (obj.onStep) obj.onStep(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ###BEGIN###{Certificates}
|
|
||||||
obj.xxSignWithDummyCaReturn = function (cert) {
|
|
||||||
obj.setVar('signed_cert', btoa(_arrayBufferToString(cert)));
|
|
||||||
obj.state = 1;
|
|
||||||
if (obj.onStep) obj.onStep(obj);
|
|
||||||
}
|
|
||||||
// ###END###{Certificates}
|
|
||||||
|
|
||||||
obj.toString = function (x) { if (typeof x == 'object') return JSON.stringify(x); return x; }
|
|
||||||
|
|
||||||
obj.reset();
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Argument types: 0 = Variable, 1 = String, 2 = Integer, 3 = Label
|
|
||||||
function script_compile(script, onmsg) {
|
|
||||||
var r = '', scriptlines = script.split('\n'), labels = {}, labelswap = [], swaps = [];
|
|
||||||
// Go thru each script line and encode it
|
|
||||||
for (var i in scriptlines) {
|
|
||||||
var scriptline = scriptlines[i];
|
|
||||||
if (scriptline.startsWith('##SWAP ')) { var x = scriptline.split(' '); if (x.length == 3) { swaps[x[1]] = x[2]; } } // Add a swap instance
|
|
||||||
if (scriptline[0] == '#' || scriptline.length == 0) continue; // Skip comments & blank lines
|
|
||||||
for (var x in swaps) { scriptline = scriptline.split(x).join(swaps[x]); } // Apply all swaps
|
|
||||||
var keywords = scriptline.match(/"[^"]*"|[^\s"]+/g);
|
|
||||||
if (keywords.length == 0) continue; // Skip blank lines
|
|
||||||
if (scriptline[0] == ':') { labels[keywords[0].toUpperCase()] = r.length; continue; } // Mark a label position
|
|
||||||
var funcIndex = script_functionTable1.indexOf(keywords[0].toLowerCase());
|
|
||||||
if (funcIndex == -1) { funcIndex = script_functionTable2.indexOf(keywords[0].toLowerCase()); if (funcIndex >= 0) funcIndex += 10000; }
|
|
||||||
if (funcIndex == -1) { funcIndex = script_functionTable3.indexOf(keywords[0].toLowerCase()); if (funcIndex >= 0) funcIndex += 20000; } // Optional methods
|
|
||||||
if (funcIndex == -1) { if (onmsg) { onmsg("Unabled to compile, unknown command: " + keywords[0]); } return ''; }
|
|
||||||
// Encode CommandId, CmdSize, ArgCount, Arg1Len, Arg1, Arg2Len, Arg2...
|
|
||||||
var cmd = ShortToStr(keywords.length - 1);
|
|
||||||
for (var j in keywords) {
|
|
||||||
if (j == 0) continue;
|
|
||||||
if (keywords[j][0] == ':') {
|
|
||||||
labelswap.push([keywords[j], r.length + cmd.length + 7]); // Add a label swap
|
|
||||||
cmd += ShortToStr(5) + String.fromCharCode(3) + IntToStr(0xFFFFFFFF); // Put an empty label
|
|
||||||
} else {
|
|
||||||
var argint = parseInt(keywords[j]);
|
|
||||||
if (argint == keywords[j]) {
|
|
||||||
cmd += ShortToStr(5) + String.fromCharCode(2) + IntToStr(argint);
|
|
||||||
} else {
|
|
||||||
if (keywords[j][0] == '"' && keywords[j][keywords[j].length - 1] == '"') {
|
|
||||||
cmd += ShortToStr(keywords[j].length - 1) + String.fromCharCode(1) + keywords[j].substring(1, keywords[j].length - 1);
|
|
||||||
} else {
|
|
||||||
cmd += ShortToStr(keywords[j].length + 1) + String.fromCharCode(0) + keywords[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cmd = ShortToStr(funcIndex) + ShortToStr(cmd.length + 4) + cmd;
|
|
||||||
r += cmd;
|
|
||||||
}
|
|
||||||
// Perform all the needed label swaps
|
|
||||||
for (i in labelswap) {
|
|
||||||
var label = labelswap[i][0].toUpperCase(), position = labelswap[i][1], target = labels[label];
|
|
||||||
if (target == undefined) { if (onmsg) { onmsg("Unabled to compile, unknown label: " + label); } return ''; }
|
|
||||||
r = r.substr(0, position) + IntToStr(target) + r.substr(position + 4);
|
|
||||||
}
|
|
||||||
return IntToStr(0x247D2945) + ShortToStr(1) + r;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decompile the script, intended for debugging only
|
|
||||||
function script_decompile(binary, onecmd) {
|
|
||||||
var r = '', ptr = 6, labelcount = 0, labels = {};
|
|
||||||
if (onecmd >= 0) {
|
|
||||||
ptr = onecmd; // If we are decompiling just one command, set the ptr to that command.
|
|
||||||
} else {
|
|
||||||
if (binary.length < 6) { return '# Invalid script length'; }
|
|
||||||
var magic = ReadInt(binary, 0);
|
|
||||||
var version = ReadShort(binary, 4);
|
|
||||||
if (magic != 0x247D2945) { return '# Invalid binary script: ' + magic; }
|
|
||||||
if (version != 1) { return '# Invalid script version'; }
|
|
||||||
}
|
|
||||||
// Loop on each command, moving forward by the command length each time.
|
|
||||||
while (ptr < binary.length) {
|
|
||||||
var cmdid = ReadShort(binary, ptr);
|
|
||||||
var cmdlen = ReadShort(binary, ptr + 2);
|
|
||||||
var argcount = ReadShort(binary, ptr + 4);
|
|
||||||
var argptr = ptr + 6;
|
|
||||||
var argstr = '';
|
|
||||||
if (!(onecmd >= 0)) r += ":label" + (ptr - 6) + "\n";
|
|
||||||
// Loop on each argument, moving forward by the argument length each time
|
|
||||||
for (var i = 0; i < argcount; i++) {
|
|
||||||
var arglen = ReadShort(binary, argptr);
|
|
||||||
var argval = binary.substring(argptr + 2, argptr + 2 + arglen);
|
|
||||||
var argtyp = argval.charCodeAt(0);
|
|
||||||
if (argtyp == 0) { argstr += ' ' + argval.substring(1); } // Variable
|
|
||||||
else if (argtyp == 1) { argstr += ' \"' + argval.substring(1) + '\"'; } // String
|
|
||||||
else if (argtyp == 2) { argstr += ' ' + ReadInt(argval, 1); } // Integer
|
|
||||||
else if (argtyp == 3) { // Label
|
|
||||||
var target = ReadInt(argval, 1);
|
|
||||||
var label = labels[target];
|
|
||||||
if (!label) { label = ":label" + target; labels[label] = target; }
|
|
||||||
argstr += ' ' + label;
|
|
||||||
}
|
|
||||||
argptr += (2 + arglen);
|
|
||||||
}
|
|
||||||
// Go in the script function table to decode the function
|
|
||||||
if (cmdid < 10000) {
|
|
||||||
r += script_functionTable1[cmdid] + argstr + "\n";
|
|
||||||
} else {
|
|
||||||
if (cmdid >= 20000) {
|
|
||||||
r += script_functionTable3[cmdid - 20000] + argstr + "\n"; // Optional methods
|
|
||||||
} else {
|
|
||||||
r += script_functionTable2[cmdid - 10000] + argstr + "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ptr += cmdlen;
|
|
||||||
if (onecmd >= 0) return r; // If we are decompiling just one command, exit now
|
|
||||||
}
|
|
||||||
// Remove all unused labels
|
|
||||||
var scriptlines = r.split('\n');
|
|
||||||
r = '';
|
|
||||||
for (var i in scriptlines) {
|
|
||||||
var line = scriptlines[i];
|
|
||||||
if (line[0] != ':') { r += line + '\n'; } else { if (labels[line]) { r += line + '\n'; } }
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
@ -1,332 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2018 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Intel(r) AMT WSMAN Stack
|
|
||||||
* @author Ylian Saint-Hilaire
|
|
||||||
* @version v0.2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Construct a MeshServer object
|
|
||||||
function WsmanStackCreateService(CreateWsmanComm, host, port, user, pass, tls, extra) {
|
|
||||||
var obj = {};
|
|
||||||
//obj.onDebugMessage = null; // Set to a function if you want to get debug messages.
|
|
||||||
obj.NextMessageId = 1; // Next message number, used to label WSMAN calls.
|
|
||||||
obj.Address = '/wsman';
|
|
||||||
obj.comm = new CreateWsmanComm(host, port, user, pass, tls, extra);
|
|
||||||
|
|
||||||
obj.PerformAjax = function (postdata, callback, tag, pri, namespaces) {
|
|
||||||
if (namespaces == null) namespaces = '';
|
|
||||||
obj.comm.PerformAjax('<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns=\"http://www.w3.org/2003/05/soap-envelope\" ' + namespaces + '><Header><a:Action>' + postdata, function (data, status, tag) {
|
|
||||||
if (status != 200) { callback(obj, null, { Header: { HttpError: status } }, status, tag); return; }
|
|
||||||
var wsresponse = obj.ParseWsman(data);
|
|
||||||
if (!wsresponse || wsresponse == null) { callback(obj, null, { Header: { HttpError: status } }, 601, tag); } else { callback(obj, wsresponse.Header["ResourceURI"], wsresponse, 200, tag); }
|
|
||||||
}, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
//obj.Debug = function (msg) { /*console.log(msg);*/ }
|
|
||||||
|
|
||||||
// Cancel all pending queries with given status
|
|
||||||
obj.CancelAllQueries = function (s) { obj.comm.CancelAllQueries(s); }
|
|
||||||
|
|
||||||
// Get the last element of a URI string
|
|
||||||
obj.GetNameFromUrl = function (resuri) {
|
|
||||||
var x = resuri.lastIndexOf("/");
|
|
||||||
return (x == -1)?resuri:resuri.substring(x + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN Subscribe operation
|
|
||||||
obj.ExecSubscribe = function (resuri, delivery, url, callback, tag, pri, selectors, opaque, user, pass) {
|
|
||||||
var digest = "", digest2 = "", opaque = "";
|
|
||||||
if (user != null && pass != null) { digest = '<t:IssuedTokens xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>' + user + '</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">' + pass + '</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>'; digest2 = '<w:Auth Profile="http://schemas.dmtf.org/wbem/wsman/1/wsman/secprofile/http/digest"/>'; }
|
|
||||||
if (opaque != null) { opaque = '<a:ReferenceParameters><m:arg>' + opaque + '</m:arg></a:ReferenceParameters>'; }
|
|
||||||
if (delivery == 'PushWithAck') { delivery = 'dmtf.org/wbem/wsman/1/wsman/PushWithAck'; } else if (delivery == 'Push') { delivery = 'xmlsoap.org/ws/2004/08/eventing/DeliveryModes/Push'; }
|
|
||||||
var data = "http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>" + _PutObjToSelectorsXml(selectors) + digest + '</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.' + delivery + '"><e:NotifyTo><a:Address>' + url + '</a:Address>' + opaque + '</e:NotifyTo>' + digest2 + '</e:Delivery></e:Subscribe>';
|
|
||||||
obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:m="http://x.com"');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN UnSubscribe operation
|
|
||||||
obj.ExecUnSubscribe = function (resuri, callback, tag, pri, selectors) {
|
|
||||||
var data = "http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>" + _PutObjToSelectorsXml(selectors) + '</Header><Body><e:Unsubscribe/>';
|
|
||||||
obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN PUT operation
|
|
||||||
obj.ExecPut = function (resuri, putobj, callback, tag, pri, selectors) {
|
|
||||||
var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + '</Header><Body>' + _PutObjToBodyXml(resuri, putobj);
|
|
||||||
obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN CREATE operation
|
|
||||||
obj.ExecCreate = function (resuri, putobj, callback, tag, pri, selectors) {
|
|
||||||
var objname = obj.GetNameFromUrl(resuri);
|
|
||||||
var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + "</Header><Body><g:" + objname + " xmlns:g=\"" + resuri + "\">";
|
|
||||||
for (var n in putobj) { data += "<g:" + n + ">" + putobj[n] + "</g:" + n + ">" }
|
|
||||||
obj.PerformAjax(data + "</g:" + objname + "></Body></Envelope>", callback, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN DELETE operation
|
|
||||||
obj.ExecDelete = function (resuri, putobj, callback, tag, pri) {
|
|
||||||
var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(putobj) + "</Header><Body /></Envelope>";
|
|
||||||
obj.PerformAjax(data, callback, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN GET operation
|
|
||||||
obj.ExecGet = function (resuri, callback, tag, pri) {
|
|
||||||
obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>", callback, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN method call operation
|
|
||||||
obj.ExecMethod = function (resuri, method, args, callback, tag, pri, selectors) {
|
|
||||||
var argsxml = "";
|
|
||||||
for (var i in args) { if (args[i] != null) { if (Array.isArray(args[i])) { for (var x in args[i]) { argsxml += "<r:" + i + ">" + args[i][x] + "</r:" + i + ">"; } } else { argsxml += "<r:" + i + ">" + args[i] + "</r:" + i + ">"; } } }
|
|
||||||
obj.ExecMethodXml(resuri, method, argsxml, callback, tag, pri, selectors);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN method call operation. The arguments are already formatted in XML.
|
|
||||||
obj.ExecMethodXml = function (resuri, method, argsxml, callback, tag, pri, selectors) {
|
|
||||||
obj.PerformAjax(resuri + "/" + method + "</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + "</Header><Body><r:" + method + '_INPUT' + " xmlns:r=\"" + resuri + "\">" + argsxml + "</r:" + method + "_INPUT></Body></Envelope>", callback, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN ENUM operation
|
|
||||||
obj.ExecEnum = function (resuri, callback, tag, pri) {
|
|
||||||
obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\" /></Body></Envelope>", callback, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a WSMAN PULL operation
|
|
||||||
obj.ExecPull = function (resuri, enumctx, callback, tag, pri) {
|
|
||||||
obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\"><EnumerationContext>" + enumctx + "</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>", callback, tag, pri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
obj.ParseWsman = function (xml) {
|
|
||||||
try {
|
|
||||||
if (!xml.childNodes) xml = _turnToXml(xml);
|
|
||||||
var r = { Header:{} }, header = xml.getElementsByTagName("Header")[0], t;
|
|
||||||
if (!header) header = xml.getElementsByTagName("a:Header")[0];
|
|
||||||
if (!header) return null;
|
|
||||||
for (var i = 0; i < header.childNodes.length; i++) {
|
|
||||||
var child = header.childNodes[i];
|
|
||||||
r.Header[child.localName] = child.textContent;
|
|
||||||
}
|
|
||||||
var body = xml.getElementsByTagName("Body")[0];
|
|
||||||
if (!body) body = xml.getElementsByTagName("a:Body")[0];
|
|
||||||
if (!body) return null;
|
|
||||||
if (body.childNodes.length > 0) {
|
|
||||||
t = body.childNodes[0].localName;
|
|
||||||
if (t.indexOf("_OUTPUT") == t.length - 7) { t = t.substring(0, t.length - 7); }
|
|
||||||
r.Header['Method'] = t;
|
|
||||||
r.Body = _ParseWsmanRec(body.childNodes[0]);
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
} catch (e) {
|
|
||||||
console.log("Unable to parse XML: " + xml);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
function _ParseWsmanRec(node) {
|
|
||||||
var data, r = {};
|
|
||||||
for (var i = 0; i < node.childNodes.length; i++) {
|
|
||||||
var child = node.childNodes[i];
|
|
||||||
if ((child.childElementCount == null) || (child.childElementCount == 0)) { data = child.textContent; } else { data = _ParseWsmanRec(child); }
|
|
||||||
if (data == 'true') data = true; // Convert 'true' into true
|
|
||||||
if (data == 'false') data = false; // Convert 'false' into false
|
|
||||||
if ((parseInt(data) + '') === data) data = parseInt(data); // Convert integers
|
|
||||||
|
|
||||||
var childObj = data;
|
|
||||||
if ((child.attributes != null) && (child.attributes.length > 0)) {
|
|
||||||
childObj = { 'Value': data };
|
|
||||||
for(var j = 0; j < child.attributes.length; j++) {
|
|
||||||
childObj['@' + child.attributes[j].name] = child.attributes[j].value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r[child.localName] instanceof Array) { r[child.localName].push(childObj); }
|
|
||||||
else if (r[child.localName] == null) { r[child.localName] = childObj; }
|
|
||||||
else { r[child.localName] = [r[child.localName], childObj]; }
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _PutObjToBodyXml(resuri, putObj) {
|
|
||||||
if (!resuri || putObj == null) return '';
|
|
||||||
var objname = obj.GetNameFromUrl(resuri);
|
|
||||||
var result = '<r:' + objname + ' xmlns:r="' + resuri + '">';
|
|
||||||
|
|
||||||
for (var prop in putObj) {
|
|
||||||
if (!putObj.hasOwnProperty(prop) || prop.indexOf('__') === 0 || prop.indexOf('@') === 0) continue;
|
|
||||||
if (putObj[prop] == null || typeof putObj[prop] === 'function') continue;
|
|
||||||
if (typeof putObj[prop] === 'object' && putObj[prop]['ReferenceParameters']) {
|
|
||||||
result += '<r:' + prop + '><a:Address>' + putObj[prop].Address + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + putObj[prop]['ReferenceParameters']["ResourceURI"] + '</w:ResourceURI><w:SelectorSet>';
|
|
||||||
var selectorArray = putObj[prop]['ReferenceParameters']['SelectorSet']['Selector'];
|
|
||||||
if (Array.isArray(selectorArray)) {
|
|
||||||
for (var i=0; i< selectorArray.length; i++) {
|
|
||||||
result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
|
|
||||||
}
|
|
||||||
result += '</w:SelectorSet></a:ReferenceParameters></r:' + prop + '>';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (Array.isArray(putObj[prop])) {
|
|
||||||
for (var i = 0; i < putObj[prop].length; i++) {
|
|
||||||
result += '<r:' + prop + '>' + putObj[prop][i].toString() + '</r:' + prop + '>';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result += '<r:' + prop + '>' + putObj[prop].toString() + '</r:' + prop + '>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result += '</r:' + objname + '>';
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
convert
|
|
||||||
{ @Name: 'InstanceID', @AttrName: 'Attribute Value'}
|
|
||||||
into
|
|
||||||
' Name="InstanceID" AttrName="Attribute Value" '
|
|
||||||
*/
|
|
||||||
function _ObjectToXmlAttributes(objWithAttributes) {
|
|
||||||
if(!objWithAttributes) return '';
|
|
||||||
var result = ' ';
|
|
||||||
for (var propName in objWithAttributes) {
|
|
||||||
if (!objWithAttributes.hasOwnProperty(propName) || propName.indexOf('@') !== 0) continue;
|
|
||||||
result += propName.substring(1) + '="' + objWithAttributes[propName] + '" ';
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _PutObjToSelectorsXml(selectorSet) {
|
|
||||||
if (!selectorSet) return '';
|
|
||||||
if (typeof selectorSet == 'string') return selectorSet;
|
|
||||||
if (selectorSet['InstanceID']) return "<w:SelectorSet><w:Selector Name=\"InstanceID\">" + selectorSet['InstanceID'] + "</w:Selector></w:SelectorSet>";
|
|
||||||
var result = '<w:SelectorSet>';
|
|
||||||
for(var propName in selectorSet) {
|
|
||||||
if (!selectorSet.hasOwnProperty(propName)) continue;
|
|
||||||
result += '<w:Selector Name="' + propName + '">';
|
|
||||||
if (selectorSet[propName]['ReferenceParameters']) {
|
|
||||||
result += '<a:EndpointReference>';
|
|
||||||
result += '<a:Address>' + selectorSet[propName]['Address'] + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + selectorSet[propName]['ReferenceParameters']['ResourceURI'] + '</w:ResourceURI><w:SelectorSet>';
|
|
||||||
var selectorArray = selectorSet[propName]['ReferenceParameters']['SelectorSet']['Selector'];
|
|
||||||
if (Array.isArray(selectorArray)) {
|
|
||||||
for (var i = 0; i < selectorArray.length; i++) {
|
|
||||||
result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
|
|
||||||
}
|
|
||||||
result += '</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>';
|
|
||||||
} else {
|
|
||||||
result += selectorSet[propName];
|
|
||||||
}
|
|
||||||
result += '</w:Selector>';
|
|
||||||
}
|
|
||||||
result += '</w:SelectorSet>';
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is a drop-in replacement to _turnToXml() that works without xml parser dependency.
|
|
||||||
Object.defineProperty(Array.prototype, "peek", { value: function () { return (this.length > 0 ? this[this.length - 1] : null); } });
|
|
||||||
function _treeBuilder() {
|
|
||||||
this.tree = [];
|
|
||||||
this.push = function (element) { this.tree.push(element); };
|
|
||||||
this.pop = function () { var element = this.tree.pop(); if (this.tree.length > 0) { var x = this.tree.peek(); x.childNodes.push(element); x.childElementCount = x.childNodes.length; } return (element); };
|
|
||||||
this.peek = function () { return (this.tree.peek()); }
|
|
||||||
this.addNamespace = function (prefix, namespace) { this.tree.peek().nsTable[prefix] = namespace; if (this.tree.peek().attributes.length > 0) { for (var i = 0; i < this.tree.peek().attributes; ++i) { var a = this.tree.peek().attributes[i]; if (prefix == '*' && a.name == a.localName) { a.namespace = namespace; } else if (prefix != '*' && a.name != a.localName) { var pfx = a.name.split(':')[0]; if (pfx == prefix) { a.namespace = namespace; } } } } }
|
|
||||||
this.getNamespace = function (prefix) { for (var i = this.tree.length - 1; i >= 0; --i) { if (this.tree[i].nsTable[prefix] != null) { return (this.tree[i].nsTable[prefix]); } } return null; }
|
|
||||||
}
|
|
||||||
function _turnToXml(text) { if (text == null) return null; return ({ childNodes: [_turnToXmlRec(text)], getElementsByTagName: _getElementsByTagName, getChildElementsByTagName: _getChildElementsByTagName, getElementsByTagNameNS: _getElementsByTagNameNS }); }
|
|
||||||
function _getElementsByTagNameNS(ns, name) { var ret = []; _xmlTraverseAllRec(this.childNodes, function (node) { if (node.localName == name && (node.namespace == ns || ns == '*')) { ret.push(node); } }); return ret; }
|
|
||||||
function _getElementsByTagName(name) { var ret = []; _xmlTraverseAllRec(this.childNodes, function (node) { if (node.localName == name) { ret.push(node); } }); return ret; }
|
|
||||||
function _getChildElementsByTagName(name) { var ret = []; if (this.childNodes != null) { for (var node in this.childNodes) { if (this.childNodes[node].localName == name) { ret.push(this.childNodes[node]); } } } return (ret); }
|
|
||||||
function _getChildElementsByTagNameNS(ns, name) { var ret = []; if (this.childNodes != null) { for (var node in this.childNodes) { if (this.childNodes[node].localName == name && (ns == '*' || this.childNodes[node].namespace == ns)) { ret.push(this.childNodes[node]); } } } return (ret); }
|
|
||||||
function _xmlTraverseAllRec(nodes, func) { for (var i in nodes) { func(nodes[i]); if (nodes[i].childNodes) { _xmlTraverseAllRec(nodes[i].childNodes, func); } } }
|
|
||||||
function _turnToXmlRec(text) {
|
|
||||||
var elementStack = new _treeBuilder(), lastElement = null, x1 = text.split('<'), ret = [], element = null, currentElementName = null;
|
|
||||||
for (var i in x1) {
|
|
||||||
var x2 = x1[i].split('>'), x3 = x2[0].split(' '), elementName = x3[0];
|
|
||||||
if ((elementName.length > 0) && (elementName[0] != '?')) {
|
|
||||||
if (elementName[0] != '/') {
|
|
||||||
var attributes = [], localName, localname2 = elementName.split(' ')[0].split(':'), localName = (localname2.length > 1) ? localname2[1] : localname2[0];
|
|
||||||
Object.defineProperty(attributes, "get",
|
|
||||||
{
|
|
||||||
value: function () {
|
|
||||||
if (arguments.length == 1) {
|
|
||||||
for (var a in this) { if (this[a].name == arguments[0]) { return (this[a]); } }
|
|
||||||
}
|
|
||||||
else if (arguments.length == 2) {
|
|
||||||
for (var a in this) { if (this[a].name == arguments[1] && (arguments[0] == '*' || this[a].namespace == arguments[0])) { return (this[a]); } }
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw ('attributes.get(): Invalid number of parameters');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
elementStack.push({ name: elementName, localName: localName, getChildElementsByTagName: _getChildElementsByTagName, getElementsByTagNameNS: _getElementsByTagNameNS, getChildElementsByTagNameNS: _getChildElementsByTagNameNS, attributes: attributes, childNodes: [], nsTable: {} });
|
|
||||||
// Parse Attributes
|
|
||||||
if (x3.length > 0) {
|
|
||||||
var skip = false;
|
|
||||||
for (var j in x3) {
|
|
||||||
if (x3[j] == '/') {
|
|
||||||
// This is an empty Element
|
|
||||||
elementStack.peek().namespace = elementStack.peek().name == elementStack.peek().localName ? elementStack.getNamespace('*') : elementStack.getNamespace(elementStack.peek().name.substring(0, elementStack.peek().name.indexOf(':')));
|
|
||||||
elementStack.peek().textContent = '';
|
|
||||||
lastElement = elementStack.pop();
|
|
||||||
skip = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var k = x3[j].indexOf('=');
|
|
||||||
if (k > 0) {
|
|
||||||
var attrName = x3[j].substring(0, k);
|
|
||||||
var attrValue = x3[j].substring(k + 2, x3[j].length - 1);
|
|
||||||
var attrNS = elementStack.getNamespace('*');
|
|
||||||
|
|
||||||
if (attrName == 'xmlns') {
|
|
||||||
elementStack.addNamespace('*', attrValue);
|
|
||||||
attrNS = attrValue;
|
|
||||||
} else if (attrName.startsWith('xmlns:')) {
|
|
||||||
elementStack.addNamespace(attrName.substring(6), attrValue);
|
|
||||||
} else {
|
|
||||||
var ax = attrName.split(':');
|
|
||||||
if (ax.length == 2) { attrName = ax[1]; attrNS = elementStack.getNamespace(ax[0]); }
|
|
||||||
}
|
|
||||||
var x = { name: attrName, value: attrValue }
|
|
||||||
if (attrNS != null) x.namespace = attrNS;
|
|
||||||
elementStack.peek().attributes.push(x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (skip) { continue; }
|
|
||||||
}
|
|
||||||
elementStack.peek().namespace = elementStack.peek().name == elementStack.peek().localName ? elementStack.getNamespace('*') : elementStack.getNamespace(elementStack.peek().name.substring(0, elementStack.peek().name.indexOf(':')));
|
|
||||||
if (x2[1]) { elementStack.peek().textContent = x2[1]; }
|
|
||||||
} else { lastElement = elementStack.pop(); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = WsmanStackCreateService;
|
|
@ -1,121 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2018 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description WSMAN communication using duktape http
|
|
||||||
* @author Ylian Saint-Hilaire
|
|
||||||
* @version v0.2.0c
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Construct a WSMAN communication object
|
|
||||||
function CreateWsmanComm(host, port, user, pass, tls, extra) {
|
|
||||||
var obj = {};
|
|
||||||
obj.PendingAjax = []; // List of pending AJAX calls. When one frees up, another will start.
|
|
||||||
obj.ActiveAjaxCount = 0; // Number of currently active AJAX calls
|
|
||||||
obj.MaxActiveAjaxCount = 1; // Maximum number of activate AJAX calls at the same time.
|
|
||||||
obj.FailAllError = 0; // Set this to non-zero to fail all AJAX calls with that error status, 999 causes responses to be silent.
|
|
||||||
obj.host = host;
|
|
||||||
obj.port = port;
|
|
||||||
obj.user = user;
|
|
||||||
obj.pass = pass;
|
|
||||||
obj.tls = tls;
|
|
||||||
obj.digest = null;
|
|
||||||
obj.RequestCount = 0;
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
// pri = priority, if set to 1, the call is high priority and put on top of the stack.
|
|
||||||
obj.PerformAjax = function (postdata, callback, tag, pri, url, action) {
|
|
||||||
if ((obj.ActiveAjaxCount == 0 || ((obj.ActiveAjaxCount < obj.MaxActiveAjaxCount) && (obj.challengeParams != null))) && obj.PendingAjax.length == 0) {
|
|
||||||
// There are no pending AJAX calls, perform the call now.
|
|
||||||
obj.PerformAjaxEx(postdata, callback, tag, url, action);
|
|
||||||
} else {
|
|
||||||
// If this is a high priority call, put this call in front of the array, otherwise put it in the back.
|
|
||||||
if (pri == 1) { obj.PendingAjax.unshift([postdata, callback, tag, url, action]); } else { obj.PendingAjax.push([postdata, callback, tag, url, action]); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
obj.PerformNextAjax = function () {
|
|
||||||
if (obj.ActiveAjaxCount >= obj.MaxActiveAjaxCount || obj.PendingAjax.length == 0) return;
|
|
||||||
var x = obj.PendingAjax.shift();
|
|
||||||
obj.PerformAjaxEx(x[0], x[1], x[2], x[3], x[4]);
|
|
||||||
obj.PerformNextAjax();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
obj.PerformAjaxEx = function (postdata, callback, tag, url, action) {
|
|
||||||
if (obj.FailAllError != 0) { if (obj.FailAllError != 999) { obj.gotNextMessagesError({ status: obj.FailAllError }, 'error', null, [postdata, callback, tag]); } return; }
|
|
||||||
if (!postdata) postdata = "";
|
|
||||||
//console.log("SEND: " + postdata); // DEBUG
|
|
||||||
|
|
||||||
// We are in a DukTape environement
|
|
||||||
if (obj.digest == null) { obj.digest = require('http-digest').create(obj.user, obj.pass); obj.digest.http = require('http'); }
|
|
||||||
var request = { protocol: (obj.tls == 1 ? 'https:' : 'http:'), method: 'POST', host: obj.host, path: '/wsman', port: obj.port, rejectUnauthorized: false, checkServerIdentity: function (cert) { console.log('checkServerIdentity', JSON.stringify(cert)); } };
|
|
||||||
var req = obj.digest.request(request);
|
|
||||||
//console.log('Request ' + (obj.RequestCount++));
|
|
||||||
req.on('error', function (e) { obj.gotNextMessagesError({ status: 600 }, 'error', null, [postdata, callback, tag]); });
|
|
||||||
req.on('response', function (response) {
|
|
||||||
//console.log('Response: ' + response.statusCode);
|
|
||||||
if (response.statusCode != 200) {
|
|
||||||
console.log('ERR:' + JSON.stringify(response));
|
|
||||||
obj.gotNextMessagesError({ status: response.statusCode }, 'error', null, [postdata, callback, tag]);
|
|
||||||
} else {
|
|
||||||
response.acc = '';
|
|
||||||
response.on('data', function (data2) { this.acc += data2; });
|
|
||||||
response.on('end', function () { obj.gotNextMessages(response.acc, 'success', { status: response.statusCode }, [postdata, callback, tag]); });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Send POST body, this work with binary.
|
|
||||||
req.write(postdata);
|
|
||||||
req.end();
|
|
||||||
obj.ActiveAjaxCount++;
|
|
||||||
return req;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AJAX specific private method
|
|
||||||
obj.pendingAjaxCall = [];
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
obj.gotNextMessages = function (data, status, request, callArgs) {
|
|
||||||
obj.ActiveAjaxCount--;
|
|
||||||
if (obj.FailAllError == 999) return;
|
|
||||||
//console.log("RECV: " + data); // DEBUG
|
|
||||||
if (obj.FailAllError != 0) { callArgs[1](null, obj.FailAllError, callArgs[2]); return; }
|
|
||||||
if (request.status != 200) { callArgs[1](null, request.status, callArgs[2]); return; }
|
|
||||||
callArgs[1](data, 200, callArgs[2]);
|
|
||||||
obj.PerformNextAjax();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private method
|
|
||||||
obj.gotNextMessagesError = function (request, status, errorThrown, callArgs) {
|
|
||||||
obj.ActiveAjaxCount--;
|
|
||||||
if (obj.FailAllError == 999) return;
|
|
||||||
if (obj.FailAllError != 0) { callArgs[1](null, obj.FailAllError, callArgs[2]); return; }
|
|
||||||
//if (status != 200) { console.log("ERROR, status=" + status + "\r\n\r\nreq=" + callArgs[0]); } // Debug: Display the request & response if something did not work.
|
|
||||||
if (obj.FailAllError != 999) { callArgs[1]({ Header: { HttpError: request.status } }, request.status, callArgs[2]); }
|
|
||||||
obj.PerformNextAjax();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cancel all pending queries with given status
|
|
||||||
obj.CancelAllQueries = function (s) {
|
|
||||||
while (obj.PendingAjax.length > 0) { var x = obj.PendingAjax.shift(); x[1](null, s, x[2]); }
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = CreateWsmanComm;
|
|
@ -356,8 +356,8 @@ function AmtStackCreateService(wsmanStack) {
|
|||||||
obj.IPS_HostBasedSetupService_UpgradeClientToAdmin = function (McNonce, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "UpgradeClientToAdmin", { "McNonce": McNonce, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
|
obj.IPS_HostBasedSetupService_UpgradeClientToAdmin = function (McNonce, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "UpgradeClientToAdmin", { "McNonce": McNonce, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
|
||||||
obj.IPS_HostBasedSetupService_DisableClientControlMode = function (_method_dummy, callback_func) { obj.Exec("IPS_HostBasedSetupService", "DisableClientControlMode", { "_method_dummy": _method_dummy }, callback_func); }
|
obj.IPS_HostBasedSetupService_DisableClientControlMode = function (_method_dummy, callback_func) { obj.Exec("IPS_HostBasedSetupService", "DisableClientControlMode", { "_method_dummy": _method_dummy }, callback_func); }
|
||||||
obj.IPS_KVMRedirectionSettingData_TerminateSession = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "TerminateSession", {}, callback_func); }
|
obj.IPS_KVMRedirectionSettingData_TerminateSession = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "TerminateSession", {}, callback_func); }
|
||||||
obj.IPS_KVMRedirectionSettingData_DataChannelRead = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelRead", {}, callback_func); }
|
obj.IPS_KVMRedirectionSettingData_DataChannelRead = function (callback_func, tag) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelRead", {}, callback_func, tag); }
|
||||||
obj.IPS_KVMRedirectionSettingData_DataChannelWrite = function (Data, callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelWrite", { "DataMessage": Data }, callback_func); }
|
obj.IPS_KVMRedirectionSettingData_DataChannelWrite = function (Data, callback_func, tag) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelWrite", { "DataMessage": Data }, callback_func, tag); }
|
||||||
obj.IPS_OptInService_StartOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "StartOptIn", {}, callback_func); }
|
obj.IPS_OptInService_StartOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "StartOptIn", {}, callback_func); }
|
||||||
obj.IPS_OptInService_CancelOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "CancelOptIn", {}, callback_func); }
|
obj.IPS_OptInService_CancelOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "CancelOptIn", {}, callback_func); }
|
||||||
obj.IPS_OptInService_SendOptInCode = function (OptInCode, callback_func) { obj.Exec("IPS_OptInService", "SendOptInCode", { "OptInCode": OptInCode }, callback_func); }
|
obj.IPS_OptInService_SendOptInCode = function (OptInCode, callback_func) { obj.Exec("IPS_OptInService", "SendOptInCode", { "OptInCode": OptInCode }, callback_func); }
|
||||||
|
@ -1,297 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2018 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Q = require('queue');
|
|
||||||
|
|
||||||
function amt_heci() {
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('error');
|
|
||||||
emitterUtils.createEvent('connect');
|
|
||||||
|
|
||||||
var heci = require('heci');
|
|
||||||
|
|
||||||
this._amt = heci.create();
|
|
||||||
this._amt.BiosVersionLen = 65;
|
|
||||||
this._amt.UnicodeStringLen = 20;
|
|
||||||
|
|
||||||
this._amt.rq = new Q();
|
|
||||||
this._amt.Parent = this;
|
|
||||||
this._amt.on('error', function (e) { this.Parent.emit('error', e); });
|
|
||||||
this._amt.on('connect', function () {
|
|
||||||
this.Parent.emit('connect');
|
|
||||||
this.on('data', function (chunk) {
|
|
||||||
//console.log("Received: " + chunk.length + " bytes");
|
|
||||||
var header = this.Parent.getCommand(chunk);
|
|
||||||
//console.log("CMD = " + header.Command + " (Status: " + header.Status + ") Response = " + header.IsResponse);
|
|
||||||
|
|
||||||
var user = this.rq.deQueue();
|
|
||||||
var params = user.optional;
|
|
||||||
var callback = user.func;
|
|
||||||
|
|
||||||
params.unshift(header);
|
|
||||||
callback.apply(this.Parent, params);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
this._amt.connect(heci.GUIDS.AMT, { noPipeline: 1 });
|
|
||||||
|
|
||||||
this.getCommand = function (chunk) {
|
|
||||||
var command = chunk.length == 0 ? (this._amt.rq.peekQueue().cmd | 0x800000) : chunk.readUInt32LE(4);
|
|
||||||
var ret = { IsResponse: (command & 0x800000) == 0x800000 ? true : false, Command: (command & 0x7FFFFF), Status: chunk.length != 0 ? chunk.readUInt32LE(12) : -1, Data: chunk.length != 0 ? chunk.slice(16) : null };
|
|
||||||
return (ret);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.sendCommand = function () {
|
|
||||||
if (arguments.length < 3 || typeof (arguments[0]) != 'number' || typeof (arguments[1]) != 'object' || typeof (arguments[2]) != 'function') { throw ('invalid parameters'); }
|
|
||||||
var args = [];
|
|
||||||
for (var i = 3; i < arguments.length; ++i) { args.push(arguments[i]); }
|
|
||||||
|
|
||||||
this._amt.rq.enQueue({ cmd: arguments[0], func: arguments[2], optional: args });
|
|
||||||
|
|
||||||
var header = Buffer.from('010100000000000000000000', 'hex');
|
|
||||||
header.writeUInt32LE(arguments[0] | 0x04000000, 4);
|
|
||||||
header.writeUInt32LE(arguments[1] == null ? 0 : arguments[1].length, 8);
|
|
||||||
|
|
||||||
this._amt.write(arguments[1] == null ? header : Buffer.concat([header, arguments[1]]));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.getVersion = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(26, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var i, CodeVersion = header.Data, val = { BiosVersion: CodeVersion.slice(0, this._amt.BiosVersionLen), Versions: [] }, v = CodeVersion.slice(this._amt.BiosVersionLen + 4);
|
|
||||||
for (i = 0; i < CodeVersion.readUInt32LE(this._amt.BiosVersionLen) ; ++i) {
|
|
||||||
val.Versions[i] = { Description: v.slice(2, v.readUInt16LE(0) + 2).toString(), Version: v.slice(4 + this._amt.UnicodeStringLen, 4 + this._amt.UnicodeStringLen + v.readUInt16LE(2 + this._amt.UnicodeStringLen)).toString() };
|
|
||||||
v = v.slice(4 + (2 * this._amt.UnicodeStringLen));
|
|
||||||
}
|
|
||||||
opt.unshift(val);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.getProvisioningState = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(17, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.state = header.Data.readUInt32LE(0);
|
|
||||||
if (result.state < 3) { result.stateStr = ["PRE", "IN", "POST"][result.state]; }
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getProvisioningMode = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(8, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.mode = header.Data.readUInt32LE(0);
|
|
||||||
if (result.mode < 4) { result.modeStr = ["NONE", "ENTERPRISE", "SMALL_BUSINESS", "REMOTE_ASSISTANCE"][result.mode]; }
|
|
||||||
result.legacy = header.Data.readUInt32LE(4) == 0 ? false : true;
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getEHBCState = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(132, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
opt.unshift({ EHBC: header.Data.readUInt32LE(0) != 0 });
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getControlMode = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(107, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.controlMode = header.Data.readUInt32LE(0);
|
|
||||||
if (result.controlMode < 3) { result.controlModeStr = ["NONE_RPAT", "CLIENT", "ADMIN", "REMOTE_ASSISTANCE"][result.controlMode]; }
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getMACAddresses = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(37, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
opt.unshift({ DedicatedMAC: header.Data.slice(0, 6).toString('hex:'), HostMAC: header.Data.slice(6, 12).toString('hex:') });
|
|
||||||
} else { opt.unshift({ DedicatedMAC: null, HostMAC: null }); }
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getDnsSuffix = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(54, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var resultLen = header.Data.readUInt16LE(0);
|
|
||||||
if (resultLen > 0) { opt.unshift(header.Data.slice(2, 2 + resultLen).toString()); } else { opt.unshift(null); }
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getHashHandles = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x2C, null, function (header, fn, opt) {
|
|
||||||
var result = [];
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var resultLen = header.Data.readUInt32LE(0);
|
|
||||||
for (var i = 0; i < resultLen; ++i) {
|
|
||||||
result.push(header.Data.readUInt32LE(4 + (4 * i)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
opt.unshift(result);
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getCertHashEntry = function (handle, callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
|
|
||||||
var data = new Buffer(4);
|
|
||||||
data.writeUInt32LE(handle, 0);
|
|
||||||
|
|
||||||
this.sendCommand(0x2D, data, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.isDefault = header.Data.readUInt32LE(0);
|
|
||||||
result.isActive = header.Data.readUInt32LE(4);
|
|
||||||
result.hashAlgorithm = header.Data.readUInt8(72);
|
|
||||||
if (result.hashAlgorithm < 4) {
|
|
||||||
result.hashAlgorithmStr = ["MD5", "SHA1", "SHA256", "SHA512"][result.hashAlgorithm];
|
|
||||||
result.hashAlgorithmSize = [16, 20, 32, 64][result.hashAlgorithm];
|
|
||||||
result.certificateHash = header.Data.slice(8, 8 + result.hashAlgorithmSize).toString('hex');
|
|
||||||
}
|
|
||||||
result.name = header.Data.slice(73 + 2, 73 + 2 + header.Data.readUInt16LE(73)).toString();
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getCertHashEntries = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
|
|
||||||
this.getHashHandles(function (handles, fn, opt) {
|
|
||||||
var entries = [];
|
|
||||||
this.getCertHashEntry(handles.shift(), this._getHashEntrySink, fn, opt, entries, handles);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this._getHashEntrySink = function (result, fn, opt, entries, handles) {
|
|
||||||
entries.push(result);
|
|
||||||
if (handles.length > 0) {
|
|
||||||
this.getCertHashEntry(handles.shift(), this._getHashEntrySink, fn, opt, entries, handles);
|
|
||||||
} else {
|
|
||||||
opt.unshift(entries);
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.getLocalSystemAccount = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(103, Buffer.alloc(40), function (header, fn, opt) {
|
|
||||||
if (header.Data.length == 68) { opt.unshift({ user: header.Data.slice(0, 34).toString(), pass: header.Data.slice(34, 67).toString(), raw: header.Data }); } else { opt.unshift(null); }
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
}
|
|
||||||
this.unprovision = function (mode, callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
var data = new Buffer(4);
|
|
||||||
data.writeUInt32LE(mode, 0);
|
|
||||||
this.sendCommand(16, data, function (header, fn, opt) {
|
|
||||||
opt.unshift(header.Status);
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
}
|
|
||||||
this.startConfiguration = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x29, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.stopConfiguration = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x5E, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.openUserInitiatedConnection = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x44, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.closeUserInitiatedConnection = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x45, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.getRemoteAccessConnectionStatus = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x46, data, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var hostname = v.slice(14, header.Data.readUInt16LE(12) + 14).toString()
|
|
||||||
opt.unshift({ status: header.Status, networkStatus: header.Data.readUInt32LE(0), remoteAccessStatus: header.Data.readUInt32LE(4), remoteAccessTrigger: header.Data.readUInt32LE(8), mpsHostname: hostname, raw: header.Data });
|
|
||||||
} else {
|
|
||||||
opt.unshift({ status: header.Status });
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
}
|
|
||||||
this.getProtocolVersion = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { opt.push(arguments[i]); }
|
|
||||||
|
|
||||||
heci.doIoctl(heci.IOCTL.HECI_VERSION, Buffer.alloc(5), Buffer.alloc(5), function (status, buffer, self, fn, opt) {
|
|
||||||
if (status == 0) {
|
|
||||||
var result = buffer.readUInt8(0).toString() + '.' + buffer.readUInt8(1).toString() + '.' + buffer.readUInt8(2).toString() + '.' + buffer.readUInt16BE(3).toString();
|
|
||||||
opt.unshift(result);
|
|
||||||
fn.apply(self, opt);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
opt.unshift(null);
|
|
||||||
fn.apply(self, opt);
|
|
||||||
}
|
|
||||||
}, this, callback, optional);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = amt_heci;
|
|
@ -1,324 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2018 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var MemoryStream = require('MemoryStream');
|
|
||||||
var lme_id = 0;
|
|
||||||
var lme_port_offset = 0; // Debug: Set this to "-100" to bind to 16892 & 16893 and IN_ADDRANY. This is for LMS debugging.
|
|
||||||
|
|
||||||
|
|
||||||
var APF_DISCONNECT = 1;
|
|
||||||
var APF_SERVICE_REQUEST = 5;
|
|
||||||
var APF_SERVICE_ACCEPT = 6;
|
|
||||||
var APF_USERAUTH_REQUEST = 50;
|
|
||||||
var APF_USERAUTH_FAILURE = 51;
|
|
||||||
var APF_USERAUTH_SUCCESS = 52;
|
|
||||||
var APF_GLOBAL_REQUEST = 80;
|
|
||||||
var APF_REQUEST_SUCCESS = 81;
|
|
||||||
var APF_REQUEST_FAILURE = 82;
|
|
||||||
var APF_CHANNEL_OPEN = 90;
|
|
||||||
var APF_CHANNEL_OPEN_CONFIRMATION = 91;
|
|
||||||
var APF_CHANNEL_OPEN_FAILURE = 92;
|
|
||||||
var APF_CHANNEL_WINDOW_ADJUST = 93;
|
|
||||||
var APF_CHANNEL_DATA = 94;
|
|
||||||
var APF_CHANNEL_CLOSE = 97;
|
|
||||||
var APF_PROTOCOLVERSION = 192;
|
|
||||||
|
|
||||||
|
|
||||||
function lme_object() {
|
|
||||||
this.ourId = ++lme_id;
|
|
||||||
this.amtId = -1;
|
|
||||||
this.LME_CHANNEL_STATUS = 'LME_CS_FREE';
|
|
||||||
this.txWindow = 0;
|
|
||||||
this.rxWindow = 0;
|
|
||||||
this.localPort = 0;
|
|
||||||
this.errorCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function stream_bufferedWrite() {
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
this.buffer = [];
|
|
||||||
this._readCheckImmediate = undefined;
|
|
||||||
|
|
||||||
// Writable Events
|
|
||||||
emitterUtils.createEvent('close');
|
|
||||||
emitterUtils.createEvent('drain');
|
|
||||||
emitterUtils.createEvent('error');
|
|
||||||
emitterUtils.createEvent('finish');
|
|
||||||
emitterUtils.createEvent('pipe');
|
|
||||||
emitterUtils.createEvent('unpipe');
|
|
||||||
|
|
||||||
// Readable Events
|
|
||||||
emitterUtils.createEvent('readable');
|
|
||||||
this.isEmpty = function () {
|
|
||||||
return (this.buffer.length == 0);
|
|
||||||
};
|
|
||||||
this.isWaiting = function () {
|
|
||||||
return (this._readCheckImmediate == undefined);
|
|
||||||
};
|
|
||||||
this.write = function (chunk) {
|
|
||||||
for (var args in arguments) { if (typeof (arguments[args]) == 'function') { this.once('drain', arguments[args]); break; } }
|
|
||||||
var tmp = Buffer.alloc(chunk.length);
|
|
||||||
chunk.copy(tmp);
|
|
||||||
this.buffer.push({ offset: 0, data: tmp });
|
|
||||||
this.emit('readable');
|
|
||||||
return (this.buffer.length == 0 ? true : false);
|
|
||||||
};
|
|
||||||
this.read = function () {
|
|
||||||
var size = arguments.length == 0 ? undefined : arguments[0];
|
|
||||||
var bytesRead = 0;
|
|
||||||
var list = [];
|
|
||||||
while ((size == undefined || bytesRead < size) && this.buffer.length > 0) {
|
|
||||||
var len = this.buffer[0].data.length - this.buffer[0].offset;
|
|
||||||
var offset = this.buffer[0].offset;
|
|
||||||
|
|
||||||
if (len > (size - bytesRead)) {
|
|
||||||
// Only reading a subset
|
|
||||||
list.push(this.buffer[0].data.slice(offset, offset + size - bytesRead));
|
|
||||||
this.buffer[0].offset += (size - bytesRead);
|
|
||||||
bytesRead += (size - bytesRead);
|
|
||||||
} else {
|
|
||||||
// Reading the entire thing
|
|
||||||
list.push(this.buffer[0].data.slice(offset));
|
|
||||||
bytesRead += len;
|
|
||||||
this.buffer.shift();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._readCheckImmediate = setImmediate(function (buffered) {
|
|
||||||
buffered._readCheckImmediate = undefined;
|
|
||||||
if (buffered.buffer.length == 0) {
|
|
||||||
buffered.emit('drain'); // Drained
|
|
||||||
} else {
|
|
||||||
buffered.emit('readable'); // Not drained
|
|
||||||
}
|
|
||||||
}, this);
|
|
||||||
return (Buffer.concat(list));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function lme_heci(options) {
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('error');
|
|
||||||
emitterUtils.createEvent('connect');
|
|
||||||
|
|
||||||
if (options.debug == true) { lme_port_offset = -100; } // LMS debug mode
|
|
||||||
|
|
||||||
var heci = require('heci');
|
|
||||||
this.INITIAL_RXWINDOW_SIZE = 4096;
|
|
||||||
|
|
||||||
this._LME = heci.create();
|
|
||||||
this._LME.LMS = this;
|
|
||||||
this._LME.on('error', function (e) { this.LMS.emit('error', e); });
|
|
||||||
this._LME.on('connect', function () {
|
|
||||||
this.LMS.emit('connect');
|
|
||||||
this.on('data', function (chunk) {
|
|
||||||
// this = HECI
|
|
||||||
var cmd = chunk.readUInt8(0);
|
|
||||||
|
|
||||||
switch (cmd) {
|
|
||||||
default:
|
|
||||||
//console.log('Received ' + chunk.length + ' bytes of data for LMS');
|
|
||||||
//console.log('Command = ' + cmd);
|
|
||||||
break;
|
|
||||||
case APF_SERVICE_REQUEST:
|
|
||||||
var nameLen = chunk.readUInt32BE(1);
|
|
||||||
var name = chunk.slice(5, nameLen + 5);
|
|
||||||
//console.log("Service Request for: " + name);
|
|
||||||
if (name == 'pfwd@amt.intel.com' || name == 'auth@amt.intel.com') {
|
|
||||||
var outBuffer = Buffer.alloc(5 + nameLen);
|
|
||||||
outBuffer.writeUInt8(6, 0);
|
|
||||||
outBuffer.writeUInt32BE(nameLen, 1);
|
|
||||||
outBuffer.write(name.toString(), 5);
|
|
||||||
this.write(outBuffer);
|
|
||||||
//console.log('Answering APF_SERVICE_REQUEST');
|
|
||||||
} else {
|
|
||||||
//console.log('UNKNOWN APF_SERVICE_REQUEST');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_GLOBAL_REQUEST:
|
|
||||||
var nameLen = chunk.readUInt32BE(1);
|
|
||||||
var name = chunk.slice(5, nameLen + 5).toString();
|
|
||||||
|
|
||||||
switch (name) {
|
|
||||||
case 'tcpip-forward':
|
|
||||||
var len = chunk.readUInt32BE(nameLen + 6);
|
|
||||||
var port = chunk.readUInt32BE(nameLen + 10 + len);
|
|
||||||
//console.log("[" + chunk.length + "/" + len + "] APF_GLOBAL_REQUEST for: " + name + " on port " + port);
|
|
||||||
if (this[name] == undefined) {
|
|
||||||
this[name] = {};
|
|
||||||
}
|
|
||||||
this[name][port] = require('net').createServer();
|
|
||||||
this[name][port].HECI = this;
|
|
||||||
if (lme_port_offset == 0) {
|
|
||||||
this[name][port].listen({ port: port, host: '127.0.0.1' }); // Normal mode
|
|
||||||
} else {
|
|
||||||
this[name][port].listen({ port: (port + lme_port_offset) }); // Debug mode
|
|
||||||
}
|
|
||||||
this[name][port].on('connection', function (socket) {
|
|
||||||
//console.log('New [' + socket.remoteFamily + '] TCP Connection on: ' + socket.remoteAddress + ' :' + socket.localPort);
|
|
||||||
this.HECI.LMS.bindDuplexStream(socket, socket.remoteFamily, socket.localPort - lme_port_offset);
|
|
||||||
});
|
|
||||||
var outBuffer = Buffer.alloc(5);
|
|
||||||
outBuffer.writeUInt8(81, 0);
|
|
||||||
outBuffer.writeUInt32BE(port, 1);
|
|
||||||
this.write(outBuffer);
|
|
||||||
break;
|
|
||||||
case 'cancel-tcpip-forward':
|
|
||||||
break;
|
|
||||||
case 'udp-send-to@amt.intel.com':
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//console.log("Unknown APF_GLOBAL_REQUEST for: " + name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_OPEN_CONFIRMATION:
|
|
||||||
var rChannel = chunk.readUInt32BE(1);
|
|
||||||
var sChannel = chunk.readUInt32BE(5);
|
|
||||||
var wSize = chunk.readUInt32BE(9);
|
|
||||||
//console.log('rChannel/' + rChannel + ', sChannel/' + sChannel + ', wSize/' + wSize);
|
|
||||||
if (this.sockets[rChannel] != undefined) {
|
|
||||||
this.sockets[rChannel].lme.amtId = sChannel;
|
|
||||||
this.sockets[rChannel].lme.rxWindow = wSize;
|
|
||||||
this.sockets[rChannel].lme.txWindow = wSize;
|
|
||||||
this.sockets[rChannel].lme.LME_CHANNEL_STATUS = 'LME_CS_CONNECTED';
|
|
||||||
//console.log('LME_CS_CONNECTED');
|
|
||||||
this.sockets[rChannel].bufferedStream = new stream_bufferedWrite();
|
|
||||||
this.sockets[rChannel].bufferedStream.socket = this.sockets[rChannel];
|
|
||||||
this.sockets[rChannel].bufferedStream.on('readable', function () {
|
|
||||||
if (this.socket.lme.txWindow > 0) {
|
|
||||||
var buffer = this.read(this.socket.lme.txWindow);
|
|
||||||
var packet = Buffer.alloc(9 + buffer.length);
|
|
||||||
packet.writeUInt8(APF_CHANNEL_DATA, 0);
|
|
||||||
packet.writeUInt32BE(this.socket.lme.amtId, 1);
|
|
||||||
packet.writeUInt32BE(buffer.length, 5);
|
|
||||||
buffer.copy(packet, 9);
|
|
||||||
this.socket.lme.txWindow -= buffer.length;
|
|
||||||
this.socket.HECI.write(packet);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].bufferedStream.on('drain', function () {
|
|
||||||
this.socket.resume();
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].on('data', function (chunk) {
|
|
||||||
if (!this.bufferedStream.write(chunk)) { this.pause(); }
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].on('end', function () {
|
|
||||||
var outBuffer = Buffer.alloc(5);
|
|
||||||
outBuffer.writeUInt8(APF_CHANNEL_CLOSE, 0);
|
|
||||||
outBuffer.writeUInt32BE(this.lme.amtId, 1);
|
|
||||||
this.HECI.write(outBuffer);
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case APF_PROTOCOLVERSION:
|
|
||||||
var major = chunk.readUInt32BE(1);
|
|
||||||
var minor = chunk.readUInt32BE(5);
|
|
||||||
var reason = chunk.readUInt32BE(9);
|
|
||||||
var outBuffer = Buffer.alloc(93);
|
|
||||||
outBuffer.writeUInt8(192, 0);
|
|
||||||
outBuffer.writeUInt32BE(1, 1);
|
|
||||||
outBuffer.writeUInt32BE(0, 5);
|
|
||||||
outBuffer.writeUInt32BE(reason, 9);
|
|
||||||
//console.log('Answering PROTOCOL_VERSION');
|
|
||||||
this.write(outBuffer);
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_WINDOW_ADJUST:
|
|
||||||
var rChannelId = chunk.readUInt32BE(1);
|
|
||||||
var bytesToAdd = chunk.readUInt32BE(5);
|
|
||||||
if (this.sockets[rChannelId] != undefined) {
|
|
||||||
this.sockets[rChannelId].lme.txWindow += bytesToAdd;
|
|
||||||
if (!this.sockets[rChannelId].bufferedStream.isEmpty() && this.sockets[rChannelId].bufferedStream.isWaiting()) {
|
|
||||||
this.sockets[rChannelId].bufferedStream.emit('readable');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//console.log('Unknown Recipient ID/' + rChannelId + ' for APF_CHANNEL_WINDOW_ADJUST');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_DATA:
|
|
||||||
var rChannelId = chunk.readUInt32BE(1);
|
|
||||||
var dataLen = chunk.readUInt32BE(5);
|
|
||||||
var data = chunk.slice(9, 9 + dataLen);
|
|
||||||
if (this.sockets[rChannelId] != undefined) {
|
|
||||||
this.sockets[rChannelId].pendingBytes.push(data.length);
|
|
||||||
this.sockets[rChannelId].write(data, function () {
|
|
||||||
var written = this.pendingBytes.shift();
|
|
||||||
var outBuffer = Buffer.alloc(9);
|
|
||||||
outBuffer.writeUInt8(APF_CHANNEL_WINDOW_ADJUST, 0);
|
|
||||||
outBuffer.writeUInt32BE(this.lme.amtId, 1);
|
|
||||||
outBuffer.writeUInt32BE(written, 5);
|
|
||||||
this.HECI.write(outBuffer);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
//console.log('Unknown Recipient ID/' + rChannelId + ' for APF_CHANNEL_DATA');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_CLOSE:
|
|
||||||
var rChannelId = chunk.readUInt32BE(1);
|
|
||||||
if (this.sockets[rChannelId] != undefined) {
|
|
||||||
this.sockets[rChannelId].end();
|
|
||||||
var amtId = this.sockets[rChannelId].lme.amtId;
|
|
||||||
var buffer = Buffer.alloc(5);
|
|
||||||
delete this.sockets[rChannelId];
|
|
||||||
|
|
||||||
buffer.writeUInt8(APF_CHANNEL_CLOSE, 0);
|
|
||||||
buffer.writeUInt32BE(amtId, 1);
|
|
||||||
this.write(buffer);
|
|
||||||
} else {
|
|
||||||
//console.log('Unknown Recipient ID/' + rChannelId + ' for APF_CHANNEL_CLOSE');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.bindDuplexStream = function (duplexStream, remoteFamily, localPort) {
|
|
||||||
var socket = duplexStream;
|
|
||||||
//console.log('New [' + remoteFamily + '] Virtual Connection/' + socket.localPort);
|
|
||||||
socket.pendingBytes = [];
|
|
||||||
socket.HECI = this._LME;
|
|
||||||
socket.LMS = this;
|
|
||||||
socket.lme = new lme_object();
|
|
||||||
socket.lme.Socket = socket;
|
|
||||||
var buffer = new MemoryStream();
|
|
||||||
buffer.writeUInt8(0x5A);
|
|
||||||
buffer.writeUInt32BE(15);
|
|
||||||
buffer.write('forwarded-tcpip');
|
|
||||||
buffer.writeUInt32BE(socket.lme.ourId);
|
|
||||||
buffer.writeUInt32BE(this.INITIAL_RXWINDOW_SIZE);
|
|
||||||
buffer.writeUInt32BE(0xFFFFFFFF);
|
|
||||||
for (var i = 0; i < 2; ++i) {
|
|
||||||
if (remoteFamily == 'IPv6') {
|
|
||||||
buffer.writeUInt32BE(3);
|
|
||||||
buffer.write('::1');
|
|
||||||
} else {
|
|
||||||
buffer.writeUInt32BE(9);
|
|
||||||
buffer.write('127.0.0.1');
|
|
||||||
}
|
|
||||||
buffer.writeUInt32BE(localPort);
|
|
||||||
}
|
|
||||||
this._LME.write(buffer.buffer);
|
|
||||||
if (this._LME.sockets == undefined) { this._LME.sockets = {}; }
|
|
||||||
this._LME.sockets[socket.lme.ourId] = socket;
|
|
||||||
socket.pause();
|
|
||||||
};
|
|
||||||
|
|
||||||
this._LME.connect(heci.GUIDS.LME, { noPipeline: 0 });
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = lme_heci;
|
|
@ -1,272 +0,0 @@
|
|||||||
var MemoryStream = require('MemoryStream');
|
|
||||||
var WindowsWireless = new Buffer([
|
|
||||||
0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x77, 0x6C, 0x61, 0x6E,
|
|
||||||
0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
|
|
||||||
0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45,
|
|
||||||
0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x77, 0x6C,
|
|
||||||
0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20,
|
|
||||||
0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20,
|
|
||||||
0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65,
|
|
||||||
0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32,
|
|
||||||
0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61,
|
|
||||||
0x6C, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x4E, 0x4F, 0x54, 0x20, 0x52, 0x45, 0x41, 0x44, 0x59, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3A, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20,
|
|
||||||
0x32, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x44, 0x2D, 0x48, 0x4F, 0x43, 0x22,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73,
|
|
||||||
0x65, 0x20, 0x33, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F,
|
|
||||||
0x4E, 0x4E, 0x45, 0x43, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65,
|
|
||||||
0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
|
||||||
0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x35, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x53, 0x53, 0x4F, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x36, 0x3A, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x56, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x22, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65,
|
|
||||||
0x20, 0x37, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4E,
|
|
||||||
0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x22, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65,
|
|
||||||
0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x30, 0x29, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E,
|
|
||||||
0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66,
|
|
||||||
0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69,
|
|
||||||
0x64, 0x2C, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x5F, 0x6C, 0x71, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69, 0x64, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x5F, 0x6C, 0x71, 0x3B, 0x0A, 0x7D, 0x0A, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x2E, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x74, 0x79,
|
|
||||||
0x70, 0x65, 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72,
|
|
||||||
0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x20, 0x5B, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62,
|
|
||||||
0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x5D, 0x3A, 0x20, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x6C, 0x71, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63,
|
|
||||||
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x29, 0x0A,
|
|
||||||
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69,
|
|
||||||
0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74,
|
|
||||||
0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x26, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x3D, 0x20, 0x37, 0x29, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68,
|
|
||||||
0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20,
|
|
||||||
0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x47, 0x65, 0x74, 0x42,
|
|
||||||
0x53, 0x53, 0x4C, 0x69, 0x73, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47,
|
|
||||||
0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x33, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
|
|
||||||
0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
|
|
||||||
0x61, 0x72, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3D, 0x20,
|
|
||||||
0x30, 0x3B, 0x20, 0x69, 0x20, 0x3C, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x3B, 0x20, 0x2B, 0x2B, 0x69, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x3D, 0x20, 0x62,
|
|
||||||
0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x20, 0x2B, 0x20, 0x28, 0x33, 0x36, 0x30, 0x20, 0x2A, 0x20, 0x69, 0x29, 0x2C, 0x20,
|
|
||||||
0x33, 0x36, 0x30, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x74, 0x72, 0x69, 0x6D, 0x28, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x74,
|
|
||||||
0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x30, 0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x32, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x36, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61,
|
|
||||||
0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x36, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x65, 0x6D, 0x69, 0x74, 0x28,
|
|
||||||
0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x2C, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x62, 0x73,
|
|
||||||
0x73, 0x69, 0x64, 0x2C, 0x20, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x57, 0x69, 0x72, 0x65,
|
|
||||||
0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x20, 0x3D, 0x20,
|
|
||||||
0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x65, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x27, 0x29, 0x2E, 0x69, 0x6E, 0x68, 0x65, 0x72, 0x69, 0x74, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29,
|
|
||||||
0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x5F,
|
|
||||||
0x47, 0x65, 0x6E, 0x65, 0x72, 0x69, 0x63, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x27, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x22, 0x77, 0x6C, 0x61, 0x6E, 0x61, 0x70, 0x69, 0x2E, 0x64, 0x6C, 0x6C, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x22,
|
|
||||||
0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28,
|
|
||||||
0x22, 0x57, 0x6C, 0x61, 0x6E, 0x47, 0x65, 0x74, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x42, 0x73, 0x73, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x20, 0x22, 0x47, 0x65, 0x74, 0x42, 0x53, 0x53,
|
|
||||||
0x4C, 0x69, 0x73, 0x74, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65,
|
|
||||||
0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E,
|
|
||||||
0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x22, 0x29, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C,
|
|
||||||
0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x6E, 0x65, 0x67,
|
|
||||||
0x6F, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69,
|
|
||||||
0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x68, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C,
|
|
||||||
0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x28, 0x32, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6E, 0x65, 0x67, 0x6F, 0x74, 0x69, 0x61, 0x74,
|
|
||||||
0x65, 0x64, 0x2C, 0x20, 0x68, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x20, 0x3D, 0x20, 0x68, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x2C, 0x20, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46,
|
|
||||||
0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E,
|
|
||||||
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x46, 0x46, 0x46, 0x46, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x43, 0x61, 0x6C,
|
|
||||||
0x6C, 0x62, 0x61, 0x63, 0x6B, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54,
|
|
||||||
0x2E, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6D, 0x69,
|
|
||||||
0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x29, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x61, 0x64, 0x64, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27,
|
|
||||||
0x2C, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x47, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64,
|
|
||||||
0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61,
|
|
||||||
0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E,
|
|
||||||
0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E,
|
|
||||||
0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44,
|
|
||||||
0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20,
|
|
||||||
0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32, 0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x69, 0x6E,
|
|
||||||
0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x31, 0x29, 0x20, 0x2F, 0x2F,
|
|
||||||
0x20, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65,
|
|
||||||
0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x70, 0x44,
|
|
||||||
0x61, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72,
|
|
||||||
0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3D, 0x20,
|
|
||||||
0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66,
|
|
||||||
0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
|
|
||||||
0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x37, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53,
|
|
||||||
0x69, 0x7A, 0x65, 0x2C, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65,
|
|
||||||
0x64, 0x53, 0x53, 0x49, 0x44, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x34, 0x2C,
|
|
||||||
0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72,
|
|
||||||
0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x36, 0x30,
|
|
||||||
0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x37, 0x36,
|
|
||||||
0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
|
|
||||||
0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64,
|
|
||||||
0x53, 0x53, 0x49, 0x44, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6F, 0x77, 0x20, 0x28, 0x22, 0x47, 0x65,
|
|
||||||
0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x73, 0x3A, 0x20, 0x46, 0x41, 0x49, 0x4C, 0x45, 0x44, 0x20, 0x28, 0x6E, 0x6F, 0x74, 0x20,
|
|
||||||
0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x29, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x7D, 0x3B, 0x0A, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x6D, 0x6F, 0x64, 0x75, 0x6C,
|
|
||||||
0x65, 0x2E, 0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x73, 0x20, 0x3D, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x3B, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var WindowsChildScript = new Buffer([
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6F, 0x6E, 0x74,
|
|
||||||
0x61, 0x69, 0x6E, 0x65, 0x72, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x76, 0x61, 0x72, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
|
|
||||||
0x28, 0x27, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x6F, 0x6E, 0x28, 0x27, 0x53, 0x63,
|
|
||||||
0x61, 0x6E, 0x27, 0x2C, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x61, 0x70, 0x29, 0x20, 0x7B, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x73, 0x65, 0x6E, 0x64,
|
|
||||||
0x28, 0x61, 0x70, 0x29, 0x3B, 0x20, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x3B, 0x0D, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
function AccessPoint(_ssid, _bssid, _lq)
|
|
||||||
{
|
|
||||||
this.ssid = _ssid;
|
|
||||||
this.bssid = _bssid;
|
|
||||||
this.lq = _lq;
|
|
||||||
}
|
|
||||||
AccessPoint.prototype.toString = function ()
|
|
||||||
{
|
|
||||||
return ("[" + this.bssid + "]: " + this.ssid + " (" + this.lq + ")");
|
|
||||||
//return (this.ssid + " [" + this.bssid + "]: " + this.lq);
|
|
||||||
}
|
|
||||||
|
|
||||||
function WiFiScanner()
|
|
||||||
{
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('accessPoint');
|
|
||||||
|
|
||||||
this.hasWireless = function ()
|
|
||||||
{
|
|
||||||
var retVal = false;
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
for (var name in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[name][0].type == 'wireless') { retVal = true; break; }
|
|
||||||
}
|
|
||||||
return (retVal);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.Scan = function ()
|
|
||||||
{
|
|
||||||
if (process.platform == 'win32')
|
|
||||||
{
|
|
||||||
this.master = require('ScriptContainer').Create(15, ContainerPermissions.DEFAULT);
|
|
||||||
this.master.parent = this;
|
|
||||||
this.master.on('data', function (j) { this.parent.emit('accessPoint', new AccessPoint(j.ssid, j.bssid, j.lq)); });
|
|
||||||
|
|
||||||
this.master.addModule('Wireless', WindowsWireless.toString());
|
|
||||||
this.master.ExecuteString(WindowsChildScript.toString());
|
|
||||||
}
|
|
||||||
else if (process.platform == 'linux')
|
|
||||||
{
|
|
||||||
// Need to get the wireless interface name
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
var wlan = null;
|
|
||||||
for (var i in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[i][0].type == 'wireless')
|
|
||||||
{
|
|
||||||
wlan = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (wlan != null)
|
|
||||||
{
|
|
||||||
this.child = require('child_process').execFile('/sbin/iwlist', ['iwlist', wlan, 'scan']);
|
|
||||||
this.child.parent = this;
|
|
||||||
this.child.ms = new MemoryStream();
|
|
||||||
this.child.ms.parent = this.child;
|
|
||||||
this.child.stdout.on('data', function (buffer) { this.parent.ms.write(buffer); });
|
|
||||||
this.child.on('exit', function () { this.ms.end(); });
|
|
||||||
this.child.ms.on('end', function ()
|
|
||||||
{
|
|
||||||
var str = this.buffer.toString();
|
|
||||||
tokens = str.split(' - Address: ');
|
|
||||||
for (var block in tokens)
|
|
||||||
{
|
|
||||||
if (block == 0) continue;
|
|
||||||
var ln = tokens[block].split('\n');
|
|
||||||
var _bssid = ln[0];
|
|
||||||
var _lq;
|
|
||||||
var _ssid;
|
|
||||||
|
|
||||||
for (var lnblock in ln)
|
|
||||||
{
|
|
||||||
lnblock = ln[lnblock].trim();
|
|
||||||
lnblock = lnblock.trim();
|
|
||||||
if (lnblock.startsWith('ESSID:'))
|
|
||||||
{
|
|
||||||
_ssid = lnblock.slice(7, lnblock.length - 1);
|
|
||||||
if (_ssid == '<hidden>') { _ssid = ''; }
|
|
||||||
}
|
|
||||||
if (lnblock.startsWith('Signal level='))
|
|
||||||
{
|
|
||||||
_lq = lnblock.slice(13,lnblock.length-4);
|
|
||||||
}
|
|
||||||
else if (lnblock.startsWith('Quality='))
|
|
||||||
{
|
|
||||||
_lq = lnblock.slice(8, 10);
|
|
||||||
var scale = lnblock.slice(11, 13);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.parent.parent.emit('accessPoint', new AccessPoint(_ssid, _bssid, _lq));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = WiFiScanner;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,297 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2018 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Q = require('queue');
|
|
||||||
|
|
||||||
function amt_heci() {
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('error');
|
|
||||||
emitterUtils.createEvent('connect');
|
|
||||||
|
|
||||||
var heci = require('heci');
|
|
||||||
|
|
||||||
this._amt = heci.create();
|
|
||||||
this._amt.BiosVersionLen = 65;
|
|
||||||
this._amt.UnicodeStringLen = 20;
|
|
||||||
|
|
||||||
this._amt.rq = new Q();
|
|
||||||
this._amt.Parent = this;
|
|
||||||
this._amt.on('error', function (e) { this.Parent.emit('error', e); });
|
|
||||||
this._amt.on('connect', function () {
|
|
||||||
this.Parent.emit('connect');
|
|
||||||
this.on('data', function (chunk) {
|
|
||||||
//console.log("Received: " + chunk.length + " bytes");
|
|
||||||
var header = this.Parent.getCommand(chunk);
|
|
||||||
//console.log("CMD = " + header.Command + " (Status: " + header.Status + ") Response = " + header.IsResponse);
|
|
||||||
|
|
||||||
var user = this.rq.deQueue();
|
|
||||||
var params = user.optional;
|
|
||||||
var callback = user.func;
|
|
||||||
|
|
||||||
params.unshift(header);
|
|
||||||
callback.apply(this.Parent, params);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
this._amt.connect(heci.GUIDS.AMT, { noPipeline: 1 });
|
|
||||||
|
|
||||||
this.getCommand = function (chunk) {
|
|
||||||
var command = chunk.length == 0 ? (this._amt.rq.peekQueue().cmd | 0x800000) : chunk.readUInt32LE(4);
|
|
||||||
var ret = { IsResponse: (command & 0x800000) == 0x800000 ? true : false, Command: (command & 0x7FFFFF), Status: chunk.length != 0 ? chunk.readUInt32LE(12) : -1, Data: chunk.length != 0 ? chunk.slice(16) : null };
|
|
||||||
return (ret);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.sendCommand = function () {
|
|
||||||
if (arguments.length < 3 || typeof (arguments[0]) != 'number' || typeof (arguments[1]) != 'object' || typeof (arguments[2]) != 'function') { throw ('invalid parameters'); }
|
|
||||||
var args = [];
|
|
||||||
for (var i = 3; i < arguments.length; ++i) { args.push(arguments[i]); }
|
|
||||||
|
|
||||||
this._amt.rq.enQueue({ cmd: arguments[0], func: arguments[2], optional: args });
|
|
||||||
|
|
||||||
var header = Buffer.from('010100000000000000000000', 'hex');
|
|
||||||
header.writeUInt32LE(arguments[0] | 0x04000000, 4);
|
|
||||||
header.writeUInt32LE(arguments[1] == null ? 0 : arguments[1].length, 8);
|
|
||||||
|
|
||||||
this._amt.write(arguments[1] == null ? header : Buffer.concat([header, arguments[1]]));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.getVersion = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(26, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var i, CodeVersion = header.Data, val = { BiosVersion: CodeVersion.slice(0, this._amt.BiosVersionLen), Versions: [] }, v = CodeVersion.slice(this._amt.BiosVersionLen + 4);
|
|
||||||
for (i = 0; i < CodeVersion.readUInt32LE(this._amt.BiosVersionLen) ; ++i) {
|
|
||||||
val.Versions[i] = { Description: v.slice(2, v.readUInt16LE(0) + 2).toString(), Version: v.slice(4 + this._amt.UnicodeStringLen, 4 + this._amt.UnicodeStringLen + v.readUInt16LE(2 + this._amt.UnicodeStringLen)).toString() };
|
|
||||||
v = v.slice(4 + (2 * this._amt.UnicodeStringLen));
|
|
||||||
}
|
|
||||||
opt.unshift(val);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.getProvisioningState = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(17, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.state = header.Data.readUInt32LE(0);
|
|
||||||
if (result.state < 3) { result.stateStr = ["PRE", "IN", "POST"][result.state]; }
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getProvisioningMode = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(8, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.mode = header.Data.readUInt32LE(0);
|
|
||||||
if (result.mode < 4) { result.modeStr = ["NONE", "ENTERPRISE", "SMALL_BUSINESS", "REMOTE_ASSISTANCE"][result.mode]; }
|
|
||||||
result.legacy = header.Data.readUInt32LE(4) == 0 ? false : true;
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getEHBCState = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(132, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
opt.unshift({ EHBC: header.Data.readUInt32LE(0) != 0 });
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getControlMode = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(107, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.controlMode = header.Data.readUInt32LE(0);
|
|
||||||
if (result.controlMode < 3) { result.controlModeStr = ["NONE_RPAT", "CLIENT", "ADMIN", "REMOTE_ASSISTANCE"][result.controlMode]; }
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getMACAddresses = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(37, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
opt.unshift({ DedicatedMAC: header.Data.slice(0, 6).toString('hex:'), HostMAC: header.Data.slice(6, 12).toString('hex:') });
|
|
||||||
} else { opt.unshift({ DedicatedMAC: null, HostMAC: null }); }
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getDnsSuffix = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(54, null, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var resultLen = header.Data.readUInt16LE(0);
|
|
||||||
if (resultLen > 0) { opt.unshift(header.Data.slice(2, 2 + resultLen).toString()); } else { opt.unshift(null); }
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getHashHandles = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x2C, null, function (header, fn, opt) {
|
|
||||||
var result = [];
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var resultLen = header.Data.readUInt32LE(0);
|
|
||||||
for (var i = 0; i < resultLen; ++i) {
|
|
||||||
result.push(header.Data.readUInt32LE(4 + (4 * i)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
opt.unshift(result);
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getCertHashEntry = function (handle, callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
|
|
||||||
var data = new Buffer(4);
|
|
||||||
data.writeUInt32LE(handle, 0);
|
|
||||||
|
|
||||||
this.sendCommand(0x2D, data, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var result = {};
|
|
||||||
result.isDefault = header.Data.readUInt32LE(0);
|
|
||||||
result.isActive = header.Data.readUInt32LE(4);
|
|
||||||
result.hashAlgorithm = header.Data.readUInt8(72);
|
|
||||||
if (result.hashAlgorithm < 4) {
|
|
||||||
result.hashAlgorithmStr = ["MD5", "SHA1", "SHA256", "SHA512"][result.hashAlgorithm];
|
|
||||||
result.hashAlgorithmSize = [16, 20, 32, 64][result.hashAlgorithm];
|
|
||||||
result.certificateHash = header.Data.slice(8, 8 + result.hashAlgorithmSize).toString('hex');
|
|
||||||
}
|
|
||||||
result.name = header.Data.slice(73 + 2, 73 + 2 + header.Data.readUInt16LE(73)).toString();
|
|
||||||
opt.unshift(result);
|
|
||||||
} else {
|
|
||||||
opt.unshift(null);
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this.getCertHashEntries = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
|
|
||||||
this.getHashHandles(function (handles, fn, opt) {
|
|
||||||
var entries = [];
|
|
||||||
this.getCertHashEntry(handles.shift(), this._getHashEntrySink, fn, opt, entries, handles);
|
|
||||||
}, callback, optional);
|
|
||||||
};
|
|
||||||
this._getHashEntrySink = function (result, fn, opt, entries, handles) {
|
|
||||||
entries.push(result);
|
|
||||||
if (handles.length > 0) {
|
|
||||||
this.getCertHashEntry(handles.shift(), this._getHashEntrySink, fn, opt, entries, handles);
|
|
||||||
} else {
|
|
||||||
opt.unshift(entries);
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.getLocalSystemAccount = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(103, Buffer.alloc(40), function (header, fn, opt) {
|
|
||||||
if (header.Data.length == 68) { opt.unshift({ user: header.Data.slice(0, 34).toString(), pass: header.Data.slice(34, 67).toString(), raw: header.Data }); } else { opt.unshift(null); }
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
}
|
|
||||||
this.unprovision = function (mode, callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
var data = new Buffer(4);
|
|
||||||
data.writeUInt32LE(mode, 0);
|
|
||||||
this.sendCommand(16, data, function (header, fn, opt) {
|
|
||||||
opt.unshift(header.Status);
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
}
|
|
||||||
this.startConfiguration = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x29, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.stopConfiguration = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x5E, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.openUserInitiatedConnection = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x44, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.closeUserInitiatedConnection = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x45, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional);
|
|
||||||
}
|
|
||||||
this.getRemoteAccessConnectionStatus = function () {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); }
|
|
||||||
this.sendCommand(0x46, data, function (header, fn, opt) {
|
|
||||||
if (header.Status == 0) {
|
|
||||||
var hostname = v.slice(14, header.Data.readUInt16LE(12) + 14).toString()
|
|
||||||
opt.unshift({ status: header.Status, networkStatus: header.Data.readUInt32LE(0), remoteAccessStatus: header.Data.readUInt32LE(4), remoteAccessTrigger: header.Data.readUInt32LE(8), mpsHostname: hostname, raw: header.Data });
|
|
||||||
} else {
|
|
||||||
opt.unshift({ status: header.Status });
|
|
||||||
}
|
|
||||||
fn.apply(this, opt);
|
|
||||||
}, callback, optional);
|
|
||||||
}
|
|
||||||
this.getProtocolVersion = function (callback) {
|
|
||||||
var optional = [];
|
|
||||||
for (var i = 1; i < arguments.length; ++i) { opt.push(arguments[i]); }
|
|
||||||
|
|
||||||
heci.doIoctl(heci.IOCTL.HECI_VERSION, Buffer.alloc(5), Buffer.alloc(5), function (status, buffer, self, fn, opt) {
|
|
||||||
if (status == 0) {
|
|
||||||
var result = buffer.readUInt8(0).toString() + '.' + buffer.readUInt8(1).toString() + '.' + buffer.readUInt8(2).toString() + '.' + buffer.readUInt16BE(3).toString();
|
|
||||||
opt.unshift(result);
|
|
||||||
fn.apply(self, opt);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
opt.unshift(null);
|
|
||||||
fn.apply(self, opt);
|
|
||||||
}
|
|
||||||
}, this, callback, optional);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = amt_heci;
|
|
@ -1,324 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2018 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var MemoryStream = require('MemoryStream');
|
|
||||||
var lme_id = 0;
|
|
||||||
var lme_port_offset = 0; // Debug: Set this to "-100" to bind to 16892 & 16893 and IN_ADDRANY. This is for LMS debugging.
|
|
||||||
|
|
||||||
|
|
||||||
var APF_DISCONNECT = 1;
|
|
||||||
var APF_SERVICE_REQUEST = 5;
|
|
||||||
var APF_SERVICE_ACCEPT = 6;
|
|
||||||
var APF_USERAUTH_REQUEST = 50;
|
|
||||||
var APF_USERAUTH_FAILURE = 51;
|
|
||||||
var APF_USERAUTH_SUCCESS = 52;
|
|
||||||
var APF_GLOBAL_REQUEST = 80;
|
|
||||||
var APF_REQUEST_SUCCESS = 81;
|
|
||||||
var APF_REQUEST_FAILURE = 82;
|
|
||||||
var APF_CHANNEL_OPEN = 90;
|
|
||||||
var APF_CHANNEL_OPEN_CONFIRMATION = 91;
|
|
||||||
var APF_CHANNEL_OPEN_FAILURE = 92;
|
|
||||||
var APF_CHANNEL_WINDOW_ADJUST = 93;
|
|
||||||
var APF_CHANNEL_DATA = 94;
|
|
||||||
var APF_CHANNEL_CLOSE = 97;
|
|
||||||
var APF_PROTOCOLVERSION = 192;
|
|
||||||
|
|
||||||
|
|
||||||
function lme_object() {
|
|
||||||
this.ourId = ++lme_id;
|
|
||||||
this.amtId = -1;
|
|
||||||
this.LME_CHANNEL_STATUS = 'LME_CS_FREE';
|
|
||||||
this.txWindow = 0;
|
|
||||||
this.rxWindow = 0;
|
|
||||||
this.localPort = 0;
|
|
||||||
this.errorCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function stream_bufferedWrite() {
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
this.buffer = [];
|
|
||||||
this._readCheckImmediate = undefined;
|
|
||||||
|
|
||||||
// Writable Events
|
|
||||||
emitterUtils.createEvent('close');
|
|
||||||
emitterUtils.createEvent('drain');
|
|
||||||
emitterUtils.createEvent('error');
|
|
||||||
emitterUtils.createEvent('finish');
|
|
||||||
emitterUtils.createEvent('pipe');
|
|
||||||
emitterUtils.createEvent('unpipe');
|
|
||||||
|
|
||||||
// Readable Events
|
|
||||||
emitterUtils.createEvent('readable');
|
|
||||||
this.isEmpty = function () {
|
|
||||||
return (this.buffer.length == 0);
|
|
||||||
};
|
|
||||||
this.isWaiting = function () {
|
|
||||||
return (this._readCheckImmediate == undefined);
|
|
||||||
};
|
|
||||||
this.write = function (chunk) {
|
|
||||||
for (var args in arguments) { if (typeof (arguments[args]) == 'function') { this.once('drain', arguments[args]); break; } }
|
|
||||||
var tmp = Buffer.alloc(chunk.length);
|
|
||||||
chunk.copy(tmp);
|
|
||||||
this.buffer.push({ offset: 0, data: tmp });
|
|
||||||
this.emit('readable');
|
|
||||||
return (this.buffer.length == 0 ? true : false);
|
|
||||||
};
|
|
||||||
this.read = function () {
|
|
||||||
var size = arguments.length == 0 ? undefined : arguments[0];
|
|
||||||
var bytesRead = 0;
|
|
||||||
var list = [];
|
|
||||||
while ((size == undefined || bytesRead < size) && this.buffer.length > 0) {
|
|
||||||
var len = this.buffer[0].data.length - this.buffer[0].offset;
|
|
||||||
var offset = this.buffer[0].offset;
|
|
||||||
|
|
||||||
if (len > (size - bytesRead)) {
|
|
||||||
// Only reading a subset
|
|
||||||
list.push(this.buffer[0].data.slice(offset, offset + size - bytesRead));
|
|
||||||
this.buffer[0].offset += (size - bytesRead);
|
|
||||||
bytesRead += (size - bytesRead);
|
|
||||||
} else {
|
|
||||||
// Reading the entire thing
|
|
||||||
list.push(this.buffer[0].data.slice(offset));
|
|
||||||
bytesRead += len;
|
|
||||||
this.buffer.shift();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._readCheckImmediate = setImmediate(function (buffered) {
|
|
||||||
buffered._readCheckImmediate = undefined;
|
|
||||||
if (buffered.buffer.length == 0) {
|
|
||||||
buffered.emit('drain'); // Drained
|
|
||||||
} else {
|
|
||||||
buffered.emit('readable'); // Not drained
|
|
||||||
}
|
|
||||||
}, this);
|
|
||||||
return (Buffer.concat(list));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function lme_heci(options) {
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('error');
|
|
||||||
emitterUtils.createEvent('connect');
|
|
||||||
|
|
||||||
if (options.debug == true) { lme_port_offset = -100; } // LMS debug mode
|
|
||||||
|
|
||||||
var heci = require('heci');
|
|
||||||
this.INITIAL_RXWINDOW_SIZE = 4096;
|
|
||||||
|
|
||||||
this._LME = heci.create();
|
|
||||||
this._LME.LMS = this;
|
|
||||||
this._LME.on('error', function (e) { this.LMS.emit('error', e); });
|
|
||||||
this._LME.on('connect', function () {
|
|
||||||
this.LMS.emit('connect');
|
|
||||||
this.on('data', function (chunk) {
|
|
||||||
// this = HECI
|
|
||||||
var cmd = chunk.readUInt8(0);
|
|
||||||
|
|
||||||
switch (cmd) {
|
|
||||||
default:
|
|
||||||
//console.log('Received ' + chunk.length + ' bytes of data for LMS');
|
|
||||||
//console.log('Command = ' + cmd);
|
|
||||||
break;
|
|
||||||
case APF_SERVICE_REQUEST:
|
|
||||||
var nameLen = chunk.readUInt32BE(1);
|
|
||||||
var name = chunk.slice(5, nameLen + 5);
|
|
||||||
//console.log("Service Request for: " + name);
|
|
||||||
if (name == 'pfwd@amt.intel.com' || name == 'auth@amt.intel.com') {
|
|
||||||
var outBuffer = Buffer.alloc(5 + nameLen);
|
|
||||||
outBuffer.writeUInt8(6, 0);
|
|
||||||
outBuffer.writeUInt32BE(nameLen, 1);
|
|
||||||
outBuffer.write(name.toString(), 5);
|
|
||||||
this.write(outBuffer);
|
|
||||||
//console.log('Answering APF_SERVICE_REQUEST');
|
|
||||||
} else {
|
|
||||||
//console.log('UNKNOWN APF_SERVICE_REQUEST');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_GLOBAL_REQUEST:
|
|
||||||
var nameLen = chunk.readUInt32BE(1);
|
|
||||||
var name = chunk.slice(5, nameLen + 5).toString();
|
|
||||||
|
|
||||||
switch (name) {
|
|
||||||
case 'tcpip-forward':
|
|
||||||
var len = chunk.readUInt32BE(nameLen + 6);
|
|
||||||
var port = chunk.readUInt32BE(nameLen + 10 + len);
|
|
||||||
//console.log("[" + chunk.length + "/" + len + "] APF_GLOBAL_REQUEST for: " + name + " on port " + port);
|
|
||||||
if (this[name] == undefined) {
|
|
||||||
this[name] = {};
|
|
||||||
}
|
|
||||||
this[name][port] = require('net').createServer();
|
|
||||||
this[name][port].HECI = this;
|
|
||||||
if (lme_port_offset == 0) {
|
|
||||||
this[name][port].listen({ port: port, host: '127.0.0.1' }); // Normal mode
|
|
||||||
} else {
|
|
||||||
this[name][port].listen({ port: (port + lme_port_offset) }); // Debug mode
|
|
||||||
}
|
|
||||||
this[name][port].on('connection', function (socket) {
|
|
||||||
//console.log('New [' + socket.remoteFamily + '] TCP Connection on: ' + socket.remoteAddress + ' :' + socket.localPort);
|
|
||||||
this.HECI.LMS.bindDuplexStream(socket, socket.remoteFamily, socket.localPort - lme_port_offset);
|
|
||||||
});
|
|
||||||
var outBuffer = Buffer.alloc(5);
|
|
||||||
outBuffer.writeUInt8(81, 0);
|
|
||||||
outBuffer.writeUInt32BE(port, 1);
|
|
||||||
this.write(outBuffer);
|
|
||||||
break;
|
|
||||||
case 'cancel-tcpip-forward':
|
|
||||||
break;
|
|
||||||
case 'udp-send-to@amt.intel.com':
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//console.log("Unknown APF_GLOBAL_REQUEST for: " + name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_OPEN_CONFIRMATION:
|
|
||||||
var rChannel = chunk.readUInt32BE(1);
|
|
||||||
var sChannel = chunk.readUInt32BE(5);
|
|
||||||
var wSize = chunk.readUInt32BE(9);
|
|
||||||
//console.log('rChannel/' + rChannel + ', sChannel/' + sChannel + ', wSize/' + wSize);
|
|
||||||
if (this.sockets[rChannel] != undefined) {
|
|
||||||
this.sockets[rChannel].lme.amtId = sChannel;
|
|
||||||
this.sockets[rChannel].lme.rxWindow = wSize;
|
|
||||||
this.sockets[rChannel].lme.txWindow = wSize;
|
|
||||||
this.sockets[rChannel].lme.LME_CHANNEL_STATUS = 'LME_CS_CONNECTED';
|
|
||||||
//console.log('LME_CS_CONNECTED');
|
|
||||||
this.sockets[rChannel].bufferedStream = new stream_bufferedWrite();
|
|
||||||
this.sockets[rChannel].bufferedStream.socket = this.sockets[rChannel];
|
|
||||||
this.sockets[rChannel].bufferedStream.on('readable', function () {
|
|
||||||
if (this.socket.lme.txWindow > 0) {
|
|
||||||
var buffer = this.read(this.socket.lme.txWindow);
|
|
||||||
var packet = Buffer.alloc(9 + buffer.length);
|
|
||||||
packet.writeUInt8(APF_CHANNEL_DATA, 0);
|
|
||||||
packet.writeUInt32BE(this.socket.lme.amtId, 1);
|
|
||||||
packet.writeUInt32BE(buffer.length, 5);
|
|
||||||
buffer.copy(packet, 9);
|
|
||||||
this.socket.lme.txWindow -= buffer.length;
|
|
||||||
this.socket.HECI.write(packet);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].bufferedStream.on('drain', function () {
|
|
||||||
this.socket.resume();
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].on('data', function (chunk) {
|
|
||||||
if (!this.bufferedStream.write(chunk)) { this.pause(); }
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].on('end', function () {
|
|
||||||
var outBuffer = Buffer.alloc(5);
|
|
||||||
outBuffer.writeUInt8(APF_CHANNEL_CLOSE, 0);
|
|
||||||
outBuffer.writeUInt32BE(this.lme.amtId, 1);
|
|
||||||
this.HECI.write(outBuffer);
|
|
||||||
});
|
|
||||||
this.sockets[rChannel].resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case APF_PROTOCOLVERSION:
|
|
||||||
var major = chunk.readUInt32BE(1);
|
|
||||||
var minor = chunk.readUInt32BE(5);
|
|
||||||
var reason = chunk.readUInt32BE(9);
|
|
||||||
var outBuffer = Buffer.alloc(93);
|
|
||||||
outBuffer.writeUInt8(192, 0);
|
|
||||||
outBuffer.writeUInt32BE(1, 1);
|
|
||||||
outBuffer.writeUInt32BE(0, 5);
|
|
||||||
outBuffer.writeUInt32BE(reason, 9);
|
|
||||||
//console.log('Answering PROTOCOL_VERSION');
|
|
||||||
this.write(outBuffer);
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_WINDOW_ADJUST:
|
|
||||||
var rChannelId = chunk.readUInt32BE(1);
|
|
||||||
var bytesToAdd = chunk.readUInt32BE(5);
|
|
||||||
if (this.sockets[rChannelId] != undefined) {
|
|
||||||
this.sockets[rChannelId].lme.txWindow += bytesToAdd;
|
|
||||||
if (!this.sockets[rChannelId].bufferedStream.isEmpty() && this.sockets[rChannelId].bufferedStream.isWaiting()) {
|
|
||||||
this.sockets[rChannelId].bufferedStream.emit('readable');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//console.log('Unknown Recipient ID/' + rChannelId + ' for APF_CHANNEL_WINDOW_ADJUST');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_DATA:
|
|
||||||
var rChannelId = chunk.readUInt32BE(1);
|
|
||||||
var dataLen = chunk.readUInt32BE(5);
|
|
||||||
var data = chunk.slice(9, 9 + dataLen);
|
|
||||||
if (this.sockets[rChannelId] != undefined) {
|
|
||||||
this.sockets[rChannelId].pendingBytes.push(data.length);
|
|
||||||
this.sockets[rChannelId].write(data, function () {
|
|
||||||
var written = this.pendingBytes.shift();
|
|
||||||
var outBuffer = Buffer.alloc(9);
|
|
||||||
outBuffer.writeUInt8(APF_CHANNEL_WINDOW_ADJUST, 0);
|
|
||||||
outBuffer.writeUInt32BE(this.lme.amtId, 1);
|
|
||||||
outBuffer.writeUInt32BE(written, 5);
|
|
||||||
this.HECI.write(outBuffer);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
//console.log('Unknown Recipient ID/' + rChannelId + ' for APF_CHANNEL_DATA');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APF_CHANNEL_CLOSE:
|
|
||||||
var rChannelId = chunk.readUInt32BE(1);
|
|
||||||
if (this.sockets[rChannelId] != undefined) {
|
|
||||||
this.sockets[rChannelId].end();
|
|
||||||
var amtId = this.sockets[rChannelId].lme.amtId;
|
|
||||||
var buffer = Buffer.alloc(5);
|
|
||||||
delete this.sockets[rChannelId];
|
|
||||||
|
|
||||||
buffer.writeUInt8(APF_CHANNEL_CLOSE, 0);
|
|
||||||
buffer.writeUInt32BE(amtId, 1);
|
|
||||||
this.write(buffer);
|
|
||||||
} else {
|
|
||||||
//console.log('Unknown Recipient ID/' + rChannelId + ' for APF_CHANNEL_CLOSE');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.bindDuplexStream = function (duplexStream, remoteFamily, localPort) {
|
|
||||||
var socket = duplexStream;
|
|
||||||
//console.log('New [' + remoteFamily + '] Virtual Connection/' + socket.localPort);
|
|
||||||
socket.pendingBytes = [];
|
|
||||||
socket.HECI = this._LME;
|
|
||||||
socket.LMS = this;
|
|
||||||
socket.lme = new lme_object();
|
|
||||||
socket.lme.Socket = socket;
|
|
||||||
var buffer = new MemoryStream();
|
|
||||||
buffer.writeUInt8(0x5A);
|
|
||||||
buffer.writeUInt32BE(15);
|
|
||||||
buffer.write('forwarded-tcpip');
|
|
||||||
buffer.writeUInt32BE(socket.lme.ourId);
|
|
||||||
buffer.writeUInt32BE(this.INITIAL_RXWINDOW_SIZE);
|
|
||||||
buffer.writeUInt32BE(0xFFFFFFFF);
|
|
||||||
for (var i = 0; i < 2; ++i) {
|
|
||||||
if (remoteFamily == 'IPv6') {
|
|
||||||
buffer.writeUInt32BE(3);
|
|
||||||
buffer.write('::1');
|
|
||||||
} else {
|
|
||||||
buffer.writeUInt32BE(9);
|
|
||||||
buffer.write('127.0.0.1');
|
|
||||||
}
|
|
||||||
buffer.writeUInt32BE(localPort);
|
|
||||||
}
|
|
||||||
this._LME.write(buffer.buffer);
|
|
||||||
if (this._LME.sockets == undefined) { this._LME.sockets = {}; }
|
|
||||||
this._LME.sockets[socket.lme.ourId] = socket;
|
|
||||||
socket.pause();
|
|
||||||
};
|
|
||||||
|
|
||||||
this._LME.connect(heci.GUIDS.LME, { noPipeline: 0 });
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = lme_heci;
|
|
@ -1,172 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 Intel Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
// Polyfill String.endsWith
|
|
||||||
if (!String.prototype.endsWith) {
|
|
||||||
String.prototype.endsWith = function (searchString, position) {
|
|
||||||
var subjectString = this.toString();
|
|
||||||
if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { position = subjectString.length; }
|
|
||||||
position -= searchString.length;
|
|
||||||
var lastIndex = subjectString.lastIndexOf(searchString, position);
|
|
||||||
return lastIndex !== -1 && lastIndex === position;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace a string with a number if the string is an exact number
|
|
||||||
function toNumberIfNumber(x) { if ((typeof x == 'string') && (+parseInt(x) == x)) { x = parseInt(x); } return x; }
|
|
||||||
|
|
||||||
// Convert decimal to hex
|
|
||||||
function char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }
|
|
||||||
|
|
||||||
// Convert a raw string to a hex string
|
|
||||||
function rstr2hex(input) { var r = '', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }
|
|
||||||
|
|
||||||
// Convert a buffer into a string
|
|
||||||
function buf2rstr(buf) { var r = ''; for (var i = 0; i < buf.length; i++) { r += String.fromCharCode(buf[i]); } return r; }
|
|
||||||
|
|
||||||
// Convert a hex string to a raw string // TODO: Do this using Buffer(), will be MUCH faster
|
|
||||||
function hex2rstr(d) {
|
|
||||||
if (typeof d != "string" || d.length == 0) return '';
|
|
||||||
var r = '', m = ('' + d).match(/../g), t;
|
|
||||||
while (t = m.shift()) r += String.fromCharCode('0x' + t);
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert an object to string with all functions
|
|
||||||
function objToString(x, p, ret) {
|
|
||||||
if (ret == undefined) ret = '';
|
|
||||||
if (p == undefined) p = 0;
|
|
||||||
if (x == null) { return '[null]'; }
|
|
||||||
if (p > 8) { return '[...]'; }
|
|
||||||
if (x == undefined) { return '[undefined]'; }
|
|
||||||
if (typeof x == 'string') { if (p == 0) return x; return '"' + x + '"'; }
|
|
||||||
if (typeof x == 'buffer') { return '[buffer]'; }
|
|
||||||
if (typeof x != 'object') { return x; }
|
|
||||||
var r = '{' + (ret ? '\r\n' : ' ');
|
|
||||||
for (var i in x) { r += (addPad(p + 2, ret) + i + ': ' + objToString(x[i], p + 2, ret) + (ret ? '\r\n' : ' ')); }
|
|
||||||
return r + addPad(p, ret) + '}';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return p number of spaces
|
|
||||||
function addPad(p, ret) { var r = ''; for (var i = 0; i < p; i++) { r += ret; } return r; }
|
|
||||||
|
|
||||||
// Split a string taking into account the quoats. Used for command line parsing
|
|
||||||
function splitArgs(str) {
|
|
||||||
var myArray = [], myRegexp = /[^\s"]+|"([^"]*)"/gi;
|
|
||||||
do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);
|
|
||||||
return myArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse arguments string array into an object
|
|
||||||
function parseArgs(argv) {
|
|
||||||
var results = { '_': [] }, current = null;
|
|
||||||
for (var i = 1, len = argv.length; i < len; i++) {
|
|
||||||
var x = argv[i];
|
|
||||||
if (x.length > 2 && x[0] == '-' && x[1] == '-') {
|
|
||||||
if (current != null) { results[current] = true; }
|
|
||||||
current = x.substring(2);
|
|
||||||
} else {
|
|
||||||
if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results['_'].push(toNumberIfNumber(x)); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (current != null) { results[current] = true; }
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parge a URL string into an options object
|
|
||||||
function parseUrl(url) {
|
|
||||||
var x = url.split('/');
|
|
||||||
if (x.length < 4) return null;
|
|
||||||
var y = x[2].split(':');
|
|
||||||
var options = {};
|
|
||||||
var options = { protocol: x[0], hostname: y[0], path: '/' + x.splice(3).join('/') };
|
|
||||||
if (y.length == 1) { options.port = ((x[0] == 'https:') || (x[0] == 'wss:')) ? 443 : 80; } else { options.port = parseInt(y[1]); }
|
|
||||||
if (isNaN(options.port) == true) return null;
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read a entire file into a buffer
|
|
||||||
function readFileToBuffer(filePath) {
|
|
||||||
try {
|
|
||||||
var fs = require('fs');
|
|
||||||
var stats = fs.statSync(filePath);
|
|
||||||
if (stats == null) { return null; }
|
|
||||||
var fileData = new Buffer(stats.size);
|
|
||||||
var fd = fs.openSync(filePath, 'r');
|
|
||||||
fs.readSync(fd, fileData, 0, stats.size, 0);
|
|
||||||
fs.closeSync(fd);
|
|
||||||
return fileData;
|
|
||||||
} catch (e) { return null; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Performs an HTTP get on a URL and return the data back
|
|
||||||
function makeHttpGetRequest(url, func) {
|
|
||||||
var http = require('http');
|
|
||||||
var request = http.get(url, function (res) {
|
|
||||||
var htmlData = '';
|
|
||||||
res.on('data', function (d) { htmlData += d; });
|
|
||||||
res.on('end', function (d) { func(res.statusCode, htmlData); });
|
|
||||||
}).on('error', function (e) { func(0, null); });
|
|
||||||
}
|
|
||||||
|
|
||||||
// Performs an HTTP get on a URL and return the data back (Alternative implementation)
|
|
||||||
function makeHttpGetRequest2(url, func) {
|
|
||||||
var http = require('http');
|
|
||||||
var options = http.parseUri(url);
|
|
||||||
options.username = 'admin';
|
|
||||||
options.password = 'P@ssw0rd';
|
|
||||||
var request = http.request(options, function (res) {
|
|
||||||
var htmlData = '';
|
|
||||||
res.on('data', function (d) { htmlData += d; });
|
|
||||||
res.on('end', function () { func(res.statusCode, htmlData); });
|
|
||||||
});
|
|
||||||
request.on('error', function (e) { func(0, null); });
|
|
||||||
request.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Performs an HTTP get on a URL and return the data back (Alternative implementation)
|
|
||||||
function intelAmtSetStorage(url, buffer, func) {
|
|
||||||
var http = require('http');
|
|
||||||
var options = http.parseUri(url);
|
|
||||||
options.user = 'admin'; // TODO: Does not support HTTP digest auth yet!!!!!!!!!!!!!!!!
|
|
||||||
options.pass = 'P@ssw0rd';
|
|
||||||
var request = http.request(options, function (res) {
|
|
||||||
var htmlData = '';
|
|
||||||
res.on('data', function (d) { htmlData += d; });
|
|
||||||
res.on('end', function () { func(res.statusCode, htmlData); });
|
|
||||||
});
|
|
||||||
request.on('error', function (e) { func(0, null); });
|
|
||||||
request.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
//console.log(objToString(db2, 2, ' '));
|
|
||||||
|
|
||||||
console.log('--- Start ---');
|
|
||||||
|
|
||||||
var fileData = readFileToBuffer('MeshCommander-Small.gz');
|
|
||||||
if (fileData != null) {
|
|
||||||
makeHttpGetRequest2('http://192.168.2.105:16992/index.htm', function (status, htmlData) { console.log(status, htmlData); });
|
|
||||||
|
|
||||||
/*
|
|
||||||
intelAmtSetStorage('http://192.168.2.105:16992/amt-storage/index.htm', fileData, function (status, htmlData) {
|
|
||||||
console.log('intelAmtSetStorage', status, htmlData);
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('--- End ---');
|
|
||||||
//process.exit(2);
|
|
@ -1,266 +0,0 @@
|
|||||||
var MemoryStream = require('MemoryStream');
|
|
||||||
var WindowsWireless = new Buffer([
|
|
||||||
0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x77, 0x6C, 0x61, 0x6E,
|
|
||||||
0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
|
|
||||||
0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45,
|
|
||||||
0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x77, 0x6C,
|
|
||||||
0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20,
|
|
||||||
0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20,
|
|
||||||
0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x77, 0x6C, 0x61, 0x6E, 0x49, 0x6E, 0x74, 0x65,
|
|
||||||
0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32,
|
|
||||||
0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61,
|
|
||||||
0x6C, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x4E, 0x4F, 0x54, 0x20, 0x52, 0x45, 0x41, 0x44, 0x59, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3A, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20,
|
|
||||||
0x32, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x44, 0x2D, 0x48, 0x4F, 0x43, 0x22,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73,
|
|
||||||
0x65, 0x20, 0x33, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F,
|
|
||||||
0x4E, 0x4E, 0x45, 0x43, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65,
|
|
||||||
0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
|
||||||
0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x35, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x53, 0x53, 0x4F, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x36, 0x3A, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x56, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x22, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65,
|
|
||||||
0x20, 0x37, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x22, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4E,
|
|
||||||
0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x3A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x22, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x22, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6B,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65,
|
|
||||||
0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x30, 0x29, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E,
|
|
||||||
0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66,
|
|
||||||
0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69,
|
|
||||||
0x64, 0x2C, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x5F, 0x6C, 0x71, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x5F, 0x73, 0x73, 0x69, 0x64, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x5F, 0x62, 0x73, 0x73, 0x69, 0x64, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x5F, 0x72, 0x73, 0x73, 0x69, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x5F, 0x6C, 0x71, 0x3B, 0x0A, 0x7D, 0x0A, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x2E, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x74, 0x79,
|
|
||||||
0x70, 0x65, 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72,
|
|
||||||
0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x20, 0x5B, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x62,
|
|
||||||
0x73, 0x73, 0x69, 0x64, 0x20, 0x2B, 0x20, 0x22, 0x5D, 0x3A, 0x20, 0x22, 0x20, 0x2B, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x6C, 0x71, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63,
|
|
||||||
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x29, 0x0A,
|
|
||||||
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69,
|
|
||||||
0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74,
|
|
||||||
0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x26, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x4E,
|
|
||||||
0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x3D, 0x3D, 0x20, 0x37, 0x29, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68,
|
|
||||||
0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20,
|
|
||||||
0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x47, 0x65, 0x74, 0x42,
|
|
||||||
0x53, 0x53, 0x4C, 0x69, 0x73, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x47,
|
|
||||||
0x75, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x33, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
|
|
||||||
0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
|
|
||||||
0x61, 0x72, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x20, 0x3D, 0x20, 0x62, 0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28,
|
|
||||||
0x34, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3D, 0x20,
|
|
||||||
0x30, 0x3B, 0x20, 0x69, 0x20, 0x3C, 0x20, 0x6E, 0x75, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x3B, 0x20, 0x2B, 0x2B, 0x69, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x3D, 0x20, 0x62,
|
|
||||||
0x73, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x20, 0x2B, 0x20, 0x28, 0x33, 0x36, 0x30, 0x20, 0x2A, 0x20, 0x69, 0x29, 0x2C, 0x20,
|
|
||||||
0x33, 0x36, 0x30, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D,
|
|
||||||
0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x2C, 0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x74, 0x72, 0x69, 0x6D, 0x28, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x74,
|
|
||||||
0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x34, 0x30, 0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x32, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x73, 0x73, 0x69, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x36, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61,
|
|
||||||
0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x69, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x36, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x65, 0x6D, 0x69, 0x74, 0x28,
|
|
||||||
0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x2C, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x62, 0x73,
|
|
||||||
0x73, 0x69, 0x64, 0x2C, 0x20, 0x72, 0x73, 0x73, 0x69, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A, 0x0A, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x57, 0x69, 0x72, 0x65,
|
|
||||||
0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x0A, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x20, 0x3D, 0x20,
|
|
||||||
0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x65, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x27, 0x29, 0x2E, 0x69, 0x6E, 0x68, 0x65, 0x72, 0x69, 0x74, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29,
|
|
||||||
0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x5F,
|
|
||||||
0x47, 0x65, 0x6E, 0x65, 0x72, 0x69, 0x63, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x27, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76,
|
|
||||||
0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x22, 0x77, 0x6C, 0x61, 0x6E, 0x61, 0x70, 0x69, 0x2E, 0x64, 0x6C, 0x6C, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x22,
|
|
||||||
0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28,
|
|
||||||
0x22, 0x57, 0x6C, 0x61, 0x6E, 0x47, 0x65, 0x74, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x42, 0x73, 0x73, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x20, 0x22, 0x47, 0x65, 0x74, 0x42, 0x53, 0x53,
|
|
||||||
0x4C, 0x69, 0x73, 0x74, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65,
|
|
||||||
0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x29,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22,
|
|
||||||
0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E,
|
|
||||||
0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C, 0x61, 0x6E, 0x53, 0x63, 0x61, 0x6E, 0x22, 0x29, 0x3B, 0x0A,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x22, 0x57, 0x6C,
|
|
||||||
0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x6E, 0x65, 0x67,
|
|
||||||
0x6F, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69,
|
|
||||||
0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x68, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C,
|
|
||||||
0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x4F, 0x70, 0x65, 0x6E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x28, 0x32, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6E, 0x65, 0x67, 0x6F, 0x74, 0x69, 0x61, 0x74,
|
|
||||||
0x65, 0x64, 0x2C, 0x20, 0x68, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x20, 0x3D, 0x20, 0x68, 0x2E, 0x56, 0x61, 0x6C, 0x3B,
|
|
||||||
0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x50, 0x72, 0x6F,
|
|
||||||
0x78, 0x79, 0x28, 0x4F, 0x6E, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x79, 0x2C, 0x20, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46,
|
|
||||||
0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E,
|
|
||||||
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4E, 0x6F, 0x74, 0x69, 0x66, 0x69,
|
|
||||||
0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x58, 0x30, 0x30, 0x30, 0x30, 0x46, 0x46, 0x46, 0x46, 0x2C, 0x20,
|
|
||||||
0x30, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x2E, 0x43, 0x61, 0x6C,
|
|
||||||
0x6C, 0x62, 0x61, 0x63, 0x6B, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x5F, 0x4E, 0x4F, 0x54, 0x49, 0x46, 0x59, 0x5F, 0x50, 0x52, 0x4F, 0x58, 0x59, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54,
|
|
||||||
0x2E, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x50, 0x72, 0x65, 0x76, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6D, 0x69,
|
|
||||||
0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27, 0x29, 0x3B, 0x0A, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x65, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x72, 0x55, 0x74, 0x69, 0x6C, 0x73, 0x2E, 0x61, 0x64, 0x64, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x28, 0x27, 0x53, 0x63, 0x61, 0x6E, 0x27,
|
|
||||||
0x2C, 0x20, 0x5F, 0x53, 0x63, 0x61, 0x6E, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x47, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64,
|
|
||||||
0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x3D, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61,
|
|
||||||
0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
|
|
||||||
0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x45, 0x6E, 0x75, 0x6D, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2E,
|
|
||||||
0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E,
|
|
||||||
0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x30, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44,
|
|
||||||
0x65, 0x72, 0x65, 0x66, 0x28, 0x38, 0x2C, 0x20, 0x35, 0x33, 0x32, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6E, 0x61, 0x6D, 0x65, 0x20,
|
|
||||||
0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x31, 0x36, 0x2C, 0x20, 0x35, 0x31, 0x32, 0x29, 0x2E, 0x41, 0x6E, 0x73, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67,
|
|
||||||
0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65,
|
|
||||||
0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x69, 0x6E,
|
|
||||||
0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x38, 0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x31, 0x29, 0x20, 0x2F, 0x2F,
|
|
||||||
0x20, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65,
|
|
||||||
0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x70, 0x44,
|
|
||||||
0x61, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72,
|
|
||||||
0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3D, 0x20,
|
|
||||||
0x74, 0x68, 0x69, 0x73, 0x2E, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x2E, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x28, 0x29, 0x3B, 0x0A, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66,
|
|
||||||
0x28, 0x30, 0x2C, 0x20, 0x31, 0x36, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20,
|
|
||||||
0x3D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2E, 0x57, 0x6C, 0x61, 0x6E, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
|
|
||||||
0x28, 0x74, 0x68, 0x69, 0x73, 0x2E, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x2C, 0x20, 0x69, 0x67, 0x75, 0x69, 0x64, 0x2C, 0x20, 0x37, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x64, 0x61, 0x74, 0x61, 0x53,
|
|
||||||
0x69, 0x7A, 0x65, 0x2C, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65,
|
|
||||||
0x64, 0x53, 0x53, 0x49, 0x44, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x32, 0x34, 0x2C,
|
|
||||||
0x20, 0x33, 0x32, 0x29, 0x2E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72,
|
|
||||||
0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x36, 0x30,
|
|
||||||
0x2C, 0x20, 0x36, 0x29, 0x2E, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x6C, 0x71, 0x20, 0x3D, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x29, 0x2E, 0x44, 0x65, 0x72, 0x65, 0x66, 0x28, 0x35, 0x37, 0x36,
|
|
||||||
0x2C, 0x20, 0x34, 0x29, 0x2E, 0x49, 0x6E, 0x74, 0x56, 0x61, 0x6C, 0x3B, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
|
|
||||||
0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x6E, 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x28, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64,
|
|
||||||
0x53, 0x53, 0x49, 0x44, 0x2C, 0x20, 0x62, 0x73, 0x73, 0x69, 0x64, 0x2C, 0x20, 0x30, 0x2C, 0x20, 0x6C, 0x71, 0x29, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6F, 0x77, 0x20, 0x28, 0x22, 0x47, 0x65,
|
|
||||||
0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x73, 0x3A, 0x20, 0x46, 0x41, 0x49, 0x4C, 0x45, 0x44, 0x20, 0x28, 0x6E, 0x6F, 0x74, 0x20,
|
|
||||||
0x61, 0x73, 0x73, 0x6F, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x29, 0x22, 0x29, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x7D, 0x3B, 0x0A, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x6D, 0x6F, 0x64, 0x75, 0x6C,
|
|
||||||
0x65, 0x2E, 0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x73, 0x20, 0x3D, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x28, 0x29, 0x3B, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var WindowsChildScript = new Buffer([
|
|
||||||
0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6F, 0x6E, 0x74,
|
|
||||||
0x61, 0x69, 0x6E, 0x65, 0x72, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x76, 0x61, 0x72, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x20, 0x3D, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
|
|
||||||
0x28, 0x27, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x27, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x6F, 0x6E, 0x28, 0x27, 0x53, 0x63,
|
|
||||||
0x61, 0x6E, 0x27, 0x2C, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x61, 0x70, 0x29, 0x20, 0x7B, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x2E, 0x73, 0x65, 0x6E, 0x64,
|
|
||||||
0x28, 0x61, 0x70, 0x29, 0x3B, 0x20, 0x7D, 0x29, 0x3B, 0x0D, 0x0A, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73, 0x2E, 0x53, 0x63, 0x61, 0x6E, 0x28, 0x29, 0x3B, 0x0D, 0x0A]);
|
|
||||||
|
|
||||||
|
|
||||||
function AccessPoint(_ssid, _bssid, _lq)
|
|
||||||
{
|
|
||||||
this.ssid = _ssid;
|
|
||||||
this.bssid = _bssid;
|
|
||||||
this.lq = _lq;
|
|
||||||
}
|
|
||||||
AccessPoint.prototype.toString = function ()
|
|
||||||
{
|
|
||||||
return (this.ssid + " [" + this.bssid + "]: " + this.lq);
|
|
||||||
}
|
|
||||||
|
|
||||||
function WiFiScanner()
|
|
||||||
{
|
|
||||||
var emitterUtils = require('events').inherits(this);
|
|
||||||
emitterUtils.createEvent('accessPoint');
|
|
||||||
|
|
||||||
this.hasWireless = function ()
|
|
||||||
{
|
|
||||||
var retVal = false;
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
for (var name in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[name][0].type == 'wireless') { retVal = true; break; }
|
|
||||||
}
|
|
||||||
return (retVal);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.Scan = function ()
|
|
||||||
{
|
|
||||||
if (process.platform == 'win32')
|
|
||||||
{
|
|
||||||
this.master = require('ScriptContainer').Create(15, ContainerPermissions.DEFAULT);
|
|
||||||
this.master.parent = this;
|
|
||||||
this.master.on('data', function (j) { this.parent.emit('accessPoint', new AccessPoint(j.ssid, j.bssid, j.lq)); });
|
|
||||||
|
|
||||||
this.master.addModule('Wireless', WindowsWireless.toString());
|
|
||||||
this.master.ExecuteString(WindowsChildScript.toString());
|
|
||||||
}
|
|
||||||
else if (process.platform == 'linux')
|
|
||||||
{
|
|
||||||
// Need to get the wireless interface name
|
|
||||||
var interfaces = require('os').networkInterfaces();
|
|
||||||
var wlan = null;
|
|
||||||
for (var i in interfaces)
|
|
||||||
{
|
|
||||||
if (interfaces[i][0].type == 'wireless')
|
|
||||||
{
|
|
||||||
wlan = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (wlan != null)
|
|
||||||
{
|
|
||||||
this.child = require('ILibProcessPipe').CreateProcess("/sbin/iwlist", "iwlist", wlan, "scan");
|
|
||||||
this.child.parent = this;
|
|
||||||
this.child.ms = new MemoryStream();
|
|
||||||
this.child.ms.parent = this.child;
|
|
||||||
this.child.on('data', function (buffer) { this.ms.write(buffer); });
|
|
||||||
this.child.on('end', function () { this.ms.end(); });
|
|
||||||
this.child.ms.on('end', function ()
|
|
||||||
{
|
|
||||||
var str = this.buffer.toString();
|
|
||||||
tokens = str.split(' - Address: ');
|
|
||||||
for (var block in tokens)
|
|
||||||
{
|
|
||||||
if (block == 0) continue;
|
|
||||||
var ln = tokens[block].split('\n');
|
|
||||||
var _bssid = ln[0];
|
|
||||||
var _lq;
|
|
||||||
var _ssid;
|
|
||||||
|
|
||||||
for (var lnblock in ln)
|
|
||||||
{
|
|
||||||
lnblock = ln[lnblock].trim();
|
|
||||||
lnblock = lnblock.trim();
|
|
||||||
if (lnblock.startsWith('ESSID:'))
|
|
||||||
{
|
|
||||||
_ssid = lnblock.slice(7, lnblock.length - 1);
|
|
||||||
if (_ssid == '<hidden>') { _ssid = ''; }
|
|
||||||
}
|
|
||||||
if (lnblock.startsWith('Signal level='))
|
|
||||||
{
|
|
||||||
_lq = lnblock.slice(13,lnblock.length-4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.parent.parent.emit('accessPoint', new AccessPoint(_ssid, _bssid, _lq));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = WiFiScanner;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -97,45 +97,37 @@ module.exports.streamExeWithMeshPolicy = function (options) {
|
|||||||
// Pipe the entire source binary without ending the stream.
|
// Pipe the entire source binary without ending the stream.
|
||||||
options.destinationStream.sourceStream.pipe(options.destinationStream, { end: false });
|
options.destinationStream.sourceStream.pipe(options.destinationStream, { end: false });
|
||||||
} else if (options.platform == 'win32' && options.peinfo.CertificateTableAddress != 0) {
|
} else if (options.platform == 'win32' && options.peinfo.CertificateTableAddress != 0) {
|
||||||
// This is a signed windows binary, so we need to do some magic
|
|
||||||
options.mshPadding = (8 - ((options.peinfo.certificateDwLength + options.msh.length + 20) % 8)) % 8; // Compute the padding with quad-align
|
|
||||||
|
|
||||||
//console.log('old table size = ' + options.peinfo.CertificateTableSize);
|
|
||||||
options.peinfo.CertificateTableSize += (options.msh.length + 20 + options.mshPadding); // Add to the certificate table size
|
|
||||||
//console.log('new table size = ' + options.peinfo.CertificateTableSize);
|
|
||||||
//console.log('old certificate dwLength = ' + options.peinfo.certificateDwLength);
|
|
||||||
options.peinfo.certificateDwLength += (options.msh.length + 20 + options.mshPadding); // Add to the certificate size
|
|
||||||
//console.log('new certificate dwLength = ' + options.peinfo.certificateDwLength);
|
|
||||||
//console.log('values were padded with ' + options.mshPadding + ' bytes');
|
|
||||||
|
|
||||||
// Read up to the certificate table size and stream that out
|
// Read up to the certificate table size and stream that out
|
||||||
options.destinationStream.sourceStream = require('fs').createReadStream(options.sourceFileName, { flags: 'r', start: 0, end: options.peinfo.CertificateTableSizePos - 1 });
|
options.destinationStream.sourceStream = require('fs').createReadStream(options.sourceFileName, { flags: 'r', start: 0, end: options.peinfo.CertificateTableSizePos - 1 });
|
||||||
|
options.destinationStream.sourceStream.mshPadding = (8 - ((options.peinfo.certificateDwLength + options.msh.length + 20) % 8)) % 8; // Compute the padding with quad-align
|
||||||
|
options.destinationStream.sourceStream.CertificateTableSize = (options.peinfo.CertificateTableSize + options.msh.length + 20 + options.destinationStream.sourceStream.mshPadding); // Add to the certificate table size
|
||||||
|
options.destinationStream.sourceStream.certificateDwLength = (options.peinfo.certificateDwLength + options.msh.length + 20 + options.destinationStream.sourceStream.mshPadding); // Add to the certificate size
|
||||||
options.destinationStream.sourceStream.options = options;
|
options.destinationStream.sourceStream.options = options;
|
||||||
|
|
||||||
options.destinationStream.sourceStream.on('end', function () {
|
options.destinationStream.sourceStream.on('end', function () {
|
||||||
// We sent up to the CertificateTableSize, now we need to send the updated certificate table size
|
// We sent up to the CertificateTableSize, now we need to send the updated certificate table size
|
||||||
//console.log('read first block');
|
|
||||||
var sz = Buffer.alloc(4);
|
var sz = Buffer.alloc(4);
|
||||||
sz.writeUInt32LE(this.options.peinfo.CertificateTableSize, 0);
|
sz.writeUInt32LE(this.CertificateTableSize, 0);
|
||||||
this.options.destinationStream.write(sz); // New cert table size
|
this.options.destinationStream.write(sz); // New cert table size
|
||||||
|
|
||||||
// Stream everything up to the start of the certificate table entry
|
// Stream everything up to the start of the certificate table entry
|
||||||
var source2 = require('fs').createReadStream(options.sourceFileName, { flags: 'r', start: this.options.peinfo.CertificateTableSizePos + 4, end: this.options.peinfo.CertificateTableAddress - 1 });
|
var source2 = require('fs').createReadStream(options.sourceFileName, { flags: 'r', start: this.options.peinfo.CertificateTableSizePos + 4, end: this.options.peinfo.CertificateTableAddress - 1 });
|
||||||
source2.options = this.options;
|
source2.options = this.options;
|
||||||
|
source2.mshPadding = this.mshPadding;
|
||||||
|
source2.certificateDwLength = this.certificateDwLength;
|
||||||
source2.on('end', function () {
|
source2.on('end', function () {
|
||||||
// We've sent up to the Certificate DWLength, which we need to update
|
// We've sent up to the Certificate DWLength, which we need to update
|
||||||
//console.log('read second block');
|
|
||||||
var sz = Buffer.alloc(4);
|
var sz = Buffer.alloc(4);
|
||||||
sz.writeUInt32LE(this.options.peinfo.certificateDwLength, 0);
|
sz.writeUInt32LE(this.certificateDwLength, 0);
|
||||||
this.options.destinationStream.write(sz); // New certificate length
|
this.options.destinationStream.write(sz); // New certificate length
|
||||||
|
|
||||||
// Stream the entire binary until the end
|
// Stream the entire binary until the end
|
||||||
var source3 = require('fs').createReadStream(options.sourceFileName, { flags: 'r', start: this.options.peinfo.CertificateTableAddress + 4 });
|
var source3 = require('fs').createReadStream(options.sourceFileName, { flags: 'r', start: this.options.peinfo.CertificateTableAddress + 4 });
|
||||||
source3.options = this.options;
|
source3.options = this.options;
|
||||||
|
source3.mshPadding = this.mshPadding;
|
||||||
source3.on('end', function () {
|
source3.on('end', function () {
|
||||||
// We've sent the entire binary... Now send: Padding + MSH + MSHLength + GUID
|
// We've sent the entire binary... Now send: Padding + MSH + MSHLength + GUID
|
||||||
//console.log('read third block');
|
if (this.mshPadding > 0) { this.options.destinationStream.write(Buffer.alloc(this.mshPadding)); } // Padding
|
||||||
if (this.options.mshPadding > 0) { this.options.destinationStream.write(Buffer.alloc(this.options.mshPadding)); } // Padding
|
|
||||||
|
|
||||||
this.options.destinationStream.write(this.options.msh); // MSH content
|
this.options.destinationStream.write(this.options.msh); // MSH content
|
||||||
var sz = Buffer.alloc(4);
|
var sz = Buffer.alloc(4);
|
||||||
sz.writeUInt32BE(this.options.msh.length, 0);
|
sz.writeUInt32BE(this.options.msh.length, 0);
|
||||||
@ -148,7 +140,7 @@ module.exports.streamExeWithMeshPolicy = function (options) {
|
|||||||
source2.pipe(this.options.destinationStream, { end: false });
|
source2.pipe(this.options.destinationStream, { end: false });
|
||||||
this.options.destinationStream.sourceStream = source2;
|
this.options.destinationStream.sourceStream = source2;
|
||||||
});
|
});
|
||||||
this.options.destinationStream.sourceStream.pipe(this.options.destinationStream, { end: false });
|
options.destinationStream.sourceStream.pipe(options.destinationStream, { end: false });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ function CreateMeshCentralServer(config) {
|
|||||||
try { require('./pass').hash('test', function () { }); } catch (e) { console.log('Old version of node, must upgrade.'); return; } // TODO: Not sure if this test works or not.
|
try { require('./pass').hash('test', function () { }); } catch (e) { console.log('Old version of node, must upgrade.'); return; } // TODO: Not sure if this test works or not.
|
||||||
|
|
||||||
// Check for invalid arguments
|
// Check for invalid arguments
|
||||||
var validArguments = ['_', 'notls', 'user', 'port', 'mpsport', 'mpsaliasport', 'redirport', 'cert', 'mpscert', 'deletedomain', 'deletedefaultdomain', 'showall', 'showusers', 'shownodes', 'showmeshes', 'showevents', 'showpower', 'clearpower', 'showiplocations', 'help', 'exactports', 'install', 'uninstall', 'start', 'stop', 'restart', 'debug', 'filespath', 'datapath', 'noagentupdate', 'launch', 'noserverbackup', 'mongodb', 'mongodbcol', 'wanonly', 'lanonly', 'nousers', 'mpsdebug', 'mpspass', 'ciralocalfqdn', 'dbexport', 'dbimport', 'selfupdate', 'tlsoffload', 'userallowedip', 'fastcert', 'swarmport', 'swarmdebug', 'logintoken', 'logintokenkey', 'logintokengen', 'logintokengen', 'mailtokengen'];
|
var validArguments = ['_', 'notls', 'user', 'port', 'aliasport', 'mpsport', 'mpsaliasport', 'redirport', 'cert', 'mpscert', 'deletedomain', 'deletedefaultdomain', 'showall', 'showusers', 'shownodes', 'showmeshes', 'showevents', 'showpower', 'clearpower', 'showiplocations', 'help', 'exactports', 'install', 'uninstall', 'start', 'stop', 'restart', 'debug', 'filespath', 'datapath', 'noagentupdate', 'launch', 'noserverbackup', 'mongodb', 'mongodbcol', 'wanonly', 'lanonly', 'nousers', 'mpsdebug', 'mpspass', 'ciralocalfqdn', 'dbexport', 'dbimport', 'selfupdate', 'tlsoffload', 'userallowedip', 'fastcert', 'swarmport', 'swarmdebug', 'logintoken', 'logintokenkey', 'logintokengen', 'logintokengen', 'mailtokengen'];
|
||||||
for (var arg in obj.args) { obj.args[arg.toLocaleLowerCase()] = obj.args[arg]; if (validArguments.indexOf(arg.toLocaleLowerCase()) == -1) { console.log('Invalid argument "' + arg + '", use --help.'); return; } }
|
for (var arg in obj.args) { obj.args[arg.toLocaleLowerCase()] = obj.args[arg]; if (validArguments.indexOf(arg.toLocaleLowerCase()) == -1) { console.log('Invalid argument "' + arg + '", use --help.'); return; } }
|
||||||
if (obj.args.mongodb == true) { console.log('Must specify: --mongodb [connectionstring] \r\nSee https://docs.mongodb.com/manual/reference/connection-string/ for MongoDB connection string.'); return; }
|
if (obj.args.mongodb == true) { console.log('Must specify: --mongodb [connectionstring] \r\nSee https://docs.mongodb.com/manual/reference/connection-string/ for MongoDB connection string.'); return; }
|
||||||
for (var i in obj.config.settings) { obj.args[i] = obj.config.settings[i]; } // Place all settings into arguments, arguments have already been placed into settings so arguments take precedence.
|
for (var i in obj.config.settings) { obj.args[i] = obj.config.settings[i]; } // Place all settings into arguments, arguments have already been placed into settings so arguments take precedence.
|
||||||
@ -106,7 +106,7 @@ function CreateMeshCentralServer(config) {
|
|||||||
|
|
||||||
// Check if we need to install, start, stop, remove ourself as a background service
|
// Check if we need to install, start, stop, remove ourself as a background service
|
||||||
if ((obj.service != null) && ((obj.args.install == true) || (obj.args.uninstall == true) || (obj.args.start == true) || (obj.args.stop == true) || (obj.args.restart == true))) {
|
if ((obj.service != null) && ((obj.args.install == true) || (obj.args.uninstall == true) || (obj.args.start == true) || (obj.args.stop == true) || (obj.args.restart == true))) {
|
||||||
var env = [], xenv = ['user', 'port', 'mpsport', 'mpsaliasport', 'redirport', 'exactport', 'debug'];
|
var env = [], xenv = ['user', 'port', 'aliasport', 'mpsport', 'mpsaliasport', 'redirport', 'exactport', 'debug'];
|
||||||
for (var i in xenv) { if (obj.args[xenv[i]] != null) { env.push({ name: 'mesh' + xenv[i], value: obj.args[xenv[i]] }); } } // Set some args as service environement variables.
|
for (var i in xenv) { if (obj.args[xenv[i]] != null) { env.push({ name: 'mesh' + xenv[i], value: obj.args[xenv[i]] }); } } // Set some args as service environement variables.
|
||||||
var svc = new obj.service({ name: 'MeshCentral', description: 'MeshCentral Remote Management Server', script: obj.path.join(__dirname, 'meshcentral.js'), env: env, wait: 2, grow: .5 });
|
var svc = new obj.service({ name: 'MeshCentral', description: 'MeshCentral Remote Management Server', script: obj.path.join(__dirname, 'meshcentral.js'), env: env, wait: 2, grow: .5 });
|
||||||
svc.on('install', function () { console.log('MeshCentral service installed.'); svc.start(); });
|
svc.on('install', function () { console.log('MeshCentral service installed.'); svc.start(); });
|
||||||
@ -224,6 +224,7 @@ function CreateMeshCentralServer(config) {
|
|||||||
if ((obj.args.ciralocalfqdn != null) && ((obj.args.lanonly == true) || (obj.args.wanonly == true))) { console.log("WARNING: CIRA local FQDN's ignored when server in LAN-only or WAN-only mode."); }
|
if ((obj.args.ciralocalfqdn != null) && ((obj.args.lanonly == true) || (obj.args.wanonly == true))) { console.log("WARNING: CIRA local FQDN's ignored when server in LAN-only or WAN-only mode."); }
|
||||||
if ((obj.args.ciralocalfqdn != null) && (obj.args.ciralocalfqdn.split(',').length > 4)) { console.log("WARNING: Can't have more than 4 CIRA local FQDN's. Ignoring value."); obj.args.ciralocalfqdn = null; }
|
if ((obj.args.ciralocalfqdn != null) && (obj.args.ciralocalfqdn.split(',').length > 4)) { console.log("WARNING: Can't have more than 4 CIRA local FQDN's. Ignoring value."); obj.args.ciralocalfqdn = null; }
|
||||||
if (obj.args.port == null || typeof obj.args.port != 'number') { if (obj.args.notls == null) { obj.args.port = 443; } else { obj.args.port = 80; } }
|
if (obj.args.port == null || typeof obj.args.port != 'number') { if (obj.args.notls == null) { obj.args.port = 443; } else { obj.args.port = 80; } }
|
||||||
|
if (obj.args.aliasport != null && (typeof obj.args.aliasport != 'number')) obj.args.aliasport = null;
|
||||||
if (obj.args.mpsport == null || typeof obj.args.mpsport != 'number') obj.args.mpsport = 4433;
|
if (obj.args.mpsport == null || typeof obj.args.mpsport != 'number') obj.args.mpsport = 4433;
|
||||||
if (obj.args.mpsaliasport != null && (typeof obj.args.mpsaliasport != 'number')) obj.args.mpsaliasport = null;
|
if (obj.args.mpsaliasport != null && (typeof obj.args.mpsaliasport != 'number')) obj.args.mpsaliasport = null;
|
||||||
if (obj.args.notls == null && obj.args.redirport == null) obj.args.redirport = 80;
|
if (obj.args.notls == null && obj.args.redirport == null) obj.args.redirport = 80;
|
||||||
@ -848,8 +849,8 @@ function CreateMeshCentralServer(config) {
|
|||||||
0: { id: 0, localname: 'Unknown', rname: 'meshconsole.exe', desc: 'Unknown agent', update: false, amt: true, platform: 'unknown' },
|
0: { id: 0, localname: 'Unknown', rname: 'meshconsole.exe', desc: 'Unknown agent', update: false, amt: true, platform: 'unknown' },
|
||||||
1: { id: 1, localname: 'MeshConsole.exe', rname: 'meshconsole.exe', desc: 'Windows x86-32 console', update: true, amt: true, platform: 'win32' },
|
1: { id: 1, localname: 'MeshConsole.exe', rname: 'meshconsole.exe', desc: 'Windows x86-32 console', update: true, amt: true, platform: 'win32' },
|
||||||
2: { id: 2, localname: 'MeshConsole64.exe', rname: 'meshconsole.exe', desc: 'Windows x86-64 console', update: true, amt: true, platform: 'win32' },
|
2: { id: 2, localname: 'MeshConsole64.exe', rname: 'meshconsole.exe', desc: 'Windows x86-64 console', update: true, amt: true, platform: 'win32' },
|
||||||
3: { id: 3, localname: 'MeshService.exe', rname: 'meshagent.exe', desc: 'Windows x86-32 service', update: true, amt: true, platform: 'win32' },
|
3: { id: 3, localname: 'MeshService-signed.exe', rname: 'meshagent.exe', desc: 'Windows x86-32 service', update: true, amt: true, platform: 'win32' },
|
||||||
4: { id: 4, localname: 'MeshService64.exe', rname: 'meshagent.exe', desc: 'Windows x86-64 service', update: true, amt: true, platform: 'win32' },
|
4: { id: 4, localname: 'MeshService64-signed.exe', rname: 'meshagent.exe', desc: 'Windows x86-64 service', update: true, amt: true, platform: 'win32' },
|
||||||
5: { id: 5, localname: 'meshagent_x86', rname: 'meshagent', desc: 'Linux x86-32', update: true, amt: true, platform: 'linux' },
|
5: { id: 5, localname: 'meshagent_x86', rname: 'meshagent', desc: 'Linux x86-32', update: true, amt: true, platform: 'linux' },
|
||||||
6: { id: 6, localname: 'meshagent_x86-64', rname: 'meshagent', desc: 'Linux x86-64', update: true, amt: true, platform: 'linux' },
|
6: { id: 6, localname: 'meshagent_x86-64', rname: 'meshagent', desc: 'Linux x86-64', update: true, amt: true, platform: 'linux' },
|
||||||
7: { id: 7, localname: 'meshagent_mips', rname: 'meshagent', desc: 'Linux MIPS', update: true, amt: false, platform: 'linux' },
|
7: { id: 7, localname: 'meshagent_mips', rname: 'meshagent', desc: 'Linux MIPS', update: true, amt: false, platform: 'linux' },
|
||||||
@ -870,7 +871,9 @@ function CreateMeshCentralServer(config) {
|
|||||||
22: { id: 22, localname: 'MeshAgent-WinMinCore-Service-x86-64.exe', rname: 'meshagent.exe', desc: 'Windows MinCore Service x86-32', update: true, amt: false, platform: 'win32' },
|
22: { id: 22, localname: 'MeshAgent-WinMinCore-Service-x86-64.exe', rname: 'meshagent.exe', desc: 'Windows MinCore Service x86-32', update: true, amt: false, platform: 'win32' },
|
||||||
23: { id: 23, localname: 'MeshAgent-NodeJS', rname: 'meshagent', desc: 'NodeJS', update: false, amt: false, platform: 'node' }, // Get this one from NPM
|
23: { id: 23, localname: 'MeshAgent-NodeJS', rname: 'meshagent', desc: 'NodeJS', update: false, amt: false, platform: 'node' }, // Get this one from NPM
|
||||||
24: { id: 24, localname: 'meshagent_arm-linaro', rname: 'meshagent', desc: 'Linux ARM Linaro', update: true, amt: false, platform: 'linux' },
|
24: { id: 24, localname: 'meshagent_arm-linaro', rname: 'meshagent', desc: 'Linux ARM Linaro', update: true, amt: false, platform: 'linux' },
|
||||||
25: { id: 25, localname: 'meshagent_pi', rname: 'meshagent', desc: 'Linux ARM - Raspberry Pi', update: true, amt: false, platform: 'linux' } // "armv6l" and "armv7l"
|
25: { id: 25, localname: 'meshagent_pi', rname: 'meshagent', desc: 'Linux ARM - Raspberry Pi', update: true, amt: false, platform: 'linux' }, // "armv6l" and "armv7l"
|
||||||
|
10003: { id: 3, localname: 'MeshService.exe', rname: 'meshagent.exe', desc: 'Windows x86-32 service', update: true, amt: true, platform: 'win32' }, // Unsigned version of the MeshAgent
|
||||||
|
10004: { id: 4, localname: 'MeshService64.exe', rname: 'meshagent.exe', desc: 'Windows x86-64 service', update: true, amt: true, platform: 'win32' } // Unsigned version of the MeshAgent
|
||||||
};
|
};
|
||||||
|
|
||||||
// Update the list of available mesh agents
|
// Update the list of available mesh agents
|
||||||
@ -1091,7 +1094,7 @@ InstallModules(['minimist'], function () {
|
|||||||
if (config == null) { process.exit(); }
|
if (config == null) { process.exit(); }
|
||||||
|
|
||||||
// Build the list of required modules
|
// Build the list of required modules
|
||||||
var modules = ['ws', 'nedb', 'https', 'unzip', 'xmldom', 'express', 'mongojs', 'archiver', 'multiparty', 'node-forge', 'express-ws', 'compression', 'body-parser', 'connect-redis', 'express-session', 'express-handlebars'];
|
var modules = ['ws', 'nedb', 'https', 'unzip', 'xmldom', 'express', 'archiver', 'multiparty', 'node-forge', 'express-ws', 'compression', 'body-parser', 'connect-redis', 'express-session', 'express-handlebars'];
|
||||||
if (require('os').platform() == 'win32') { modules.push('node-sspi'); modules.push('node-windows'); } // Add Windows modules
|
if (require('os').platform() == 'win32') { modules.push('node-sspi'); modules.push('node-windows'); } // Add Windows modules
|
||||||
if (config.letsencrypt != null) { modules.push('greenlock'); modules.push('le-store-certbot'); modules.push('le-challenge-fs'); modules.push('le-acme-core'); } // Add Greenlock Modules
|
if (config.letsencrypt != null) { modules.push('greenlock'); modules.push('le-store-certbot'); modules.push('le-challenge-fs'); modules.push('le-acme-core'); } // Add Greenlock Modules
|
||||||
if (config.settings.mongodb != null) { modules.push('mongojs'); } // Add MongoDB
|
if (config.settings.mongodb != null) { modules.push('mongojs'); } // Add MongoDB
|
||||||
|
@ -928,9 +928,10 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) {
|
|||||||
|
|
||||||
// Figure out the MPS port, use the alias if set
|
// Figure out the MPS port, use the alias if set
|
||||||
var mpsport = ((obj.args.mpsaliasport != null) ? obj.args.mpsaliasport : obj.args.mpsport);
|
var mpsport = ((obj.args.mpsaliasport != null) ? obj.args.mpsaliasport : obj.args.mpsport);
|
||||||
|
var httpport = ((obj.args.aliasport != null) ? obj.args.aliasport : obj.args.port);
|
||||||
|
|
||||||
// Build server information object
|
// Build server information object
|
||||||
var serverinfo = { name: obj.parent.certificates.CommonName, mpsname: obj.parent.certificates.AmtMpsName, mpsport: mpsport, mpspass: obj.args.mpspass, port: obj.args.port, emailcheck: obj.parent.parent.mailserver != null }
|
var serverinfo = { name: obj.parent.certificates.CommonName, mpsname: obj.parent.certificates.AmtMpsName, mpsport: mpsport, mpspass: obj.args.mpspass, port: httpport, emailcheck: obj.parent.parent.mailserver != null }
|
||||||
if (obj.args.notls != true) { serverinfo.https = false; } else { serverinfo.https = true; serverinfo.redirport = obj.args.redirport; }
|
if (obj.args.notls != true) { serverinfo.https = false; } else { serverinfo.https = true; serverinfo.redirport = obj.args.redirport; }
|
||||||
|
|
||||||
// Send server information
|
// Send server information
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "meshcentral",
|
"name": "meshcentral",
|
||||||
"version": "0.1.4-s",
|
"version": "0.1.4-v",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Remote Management",
|
"Remote Management",
|
||||||
"Intel AMT",
|
"Intel AMT",
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
|
|
||||||
<assemblyIdentity name="MeshMiniRouter.application" version="2.0.0.7" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
|
|
||||||
<description asmv2:publisher="Meshcentral.com" asmv2:product="Meshcentral Mini-Router" asmv2:supportUrl="https://meshcentral.com/" xmlns="urn:schemas-microsoft-com:asm.v1" />
|
|
||||||
<deployment install="false" mapFileExtensions="true" trustURLParameters="true" />
|
|
||||||
<compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
|
|
||||||
<framework targetVersion="4.5" profile="Full" supportedRuntime="4.0.30319" />
|
|
||||||
</compatibleFrameworks>
|
|
||||||
<dependency>
|
|
||||||
<dependentAssembly dependencyType="install" codebase="Application Files\MeshMiniRouter_2_0_0_7\MeshMiniRouter.exe.manifest" size="4711">
|
|
||||||
<assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.7" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
|
|
||||||
<hash>
|
|
||||||
<dsig:Transforms>
|
|
||||||
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
|
|
||||||
</dsig:Transforms>
|
|
||||||
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
|
|
||||||
<dsig:DigestValue>VsPkLYR71TSqI8oGBBeXzb5hGi4R2xtQaGQJ0zmsTic=</dsig:DigestValue>
|
|
||||||
</hash>
|
|
||||||
</dependentAssembly>
|
|
||||||
</dependency>
|
|
||||||
</asmv1:assembly>
|
|
@ -1,42 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<configuration>
|
|
||||||
<configSections>
|
|
||||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<section name="MeshMiniRouterTool.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
|
||||||
<section name="MeshMiniRouterTool.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
|
||||||
<section name="MeshNetworkRouterTool.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
|
||||||
</sectionGroup>
|
|
||||||
</configSections>
|
|
||||||
<userSettings>
|
|
||||||
<MeshMiniRouterTool.Properties.Settings>
|
|
||||||
<setting name="PuttyPath" serializeAs="String">
|
|
||||||
<value/>
|
|
||||||
</setting>
|
|
||||||
<setting name="Upgraded" serializeAs="String">
|
|
||||||
<value>False</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="UltraVncPath" serializeAs="String">
|
|
||||||
<value/>
|
|
||||||
</setting>
|
|
||||||
<setting name="HybridCloudManager" serializeAs="String">
|
|
||||||
<value/>
|
|
||||||
</setting>
|
|
||||||
<setting name="TightVncPath" serializeAs="String">
|
|
||||||
<value/>
|
|
||||||
</setting>
|
|
||||||
<setting name="WinSCPPath" serializeAs="String">
|
|
||||||
<value/>
|
|
||||||
</setting>
|
|
||||||
</MeshMiniRouterTool.Properties.Settings>
|
|
||||||
<MeshMiniRouterTool.Settings1>
|
|
||||||
<setting name="puttypath" serializeAs="String">
|
|
||||||
<value/>
|
|
||||||
</setting>
|
|
||||||
</MeshMiniRouterTool.Settings1>
|
|
||||||
<MeshNetworkRouterTool.Properties.Settings>
|
|
||||||
<setting name="Server" serializeAs="String">
|
|
||||||
<value/>
|
|
||||||
</setting>
|
|
||||||
</MeshNetworkRouterTool.Properties.Settings>
|
|
||||||
</userSettings>
|
|
||||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
|
|
Binary file not shown.
@ -1,82 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
|
|
||||||
<asmv1:assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.7" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
|
|
||||||
<description asmv2:iconFile="MeshMiniRouter.ico" xmlns="urn:schemas-microsoft-com:asm.v1" />
|
|
||||||
<application />
|
|
||||||
<entryPoint>
|
|
||||||
<assemblyIdentity name="MeshMiniRouter" version="1.0.6505.20092" language="neutral" processorArchitecture="msil" />
|
|
||||||
<commandLine file="MeshMiniRouter.exe" parameters="" />
|
|
||||||
</entryPoint>
|
|
||||||
<trustInfo>
|
|
||||||
<security>
|
|
||||||
<applicationRequestMinimum>
|
|
||||||
<PermissionSet version="1" class="System.Security.NamedPermissionSet" Name="Internet" Description="Default rights given to Internet applications" Unrestricted="true" ID="Custom" SameSite="site" />
|
|
||||||
<defaultAssemblyRequest permissionSetReference="Custom" />
|
|
||||||
</applicationRequestMinimum>
|
|
||||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<!-- UAC Manifest Options
|
|
||||||
If you want to change the Windows User Account Control level replace the
|
|
||||||
requestedExecutionLevel node with one of the following.
|
|
||||||
|
|
||||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
|
||||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
|
||||||
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
|
||||||
|
|
||||||
Specifying requestedExecutionLevel node will disable file and registry virtualization.
|
|
||||||
If you want to utilize File and Registry Virtualization for backward
|
|
||||||
compatibility then delete the requestedExecutionLevel node.
|
|
||||||
-->
|
|
||||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
|
||||||
</requestedPrivileges>
|
|
||||||
</security>
|
|
||||||
</trustInfo>
|
|
||||||
<dependency>
|
|
||||||
<dependentOS>
|
|
||||||
<osVersionInfo>
|
|
||||||
<os majorVersion="5" minorVersion="1" buildNumber="2600" servicePackMajor="0" />
|
|
||||||
</osVersionInfo>
|
|
||||||
</dependentOS>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
|
|
||||||
<assemblyIdentity name="Microsoft.Windows.CommonLanguageRuntime" version="4.0.30319.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="MeshMiniRouter.exe" size="193536">
|
|
||||||
<assemblyIdentity name="MeshMiniRouter" version="1.0.6505.20092" language="neutral" processorArchitecture="msil" />
|
|
||||||
<hash>
|
|
||||||
<dsig:Transforms>
|
|
||||||
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
|
|
||||||
</dsig:Transforms>
|
|
||||||
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
|
|
||||||
<dsig:DigestValue>G2b79xma2HCz/aTfnkt2L3I8c7mPbDDlU8IsdlFiDg8=</dsig:DigestValue>
|
|
||||||
</hash>
|
|
||||||
</dependentAssembly>
|
|
||||||
</dependency>
|
|
||||||
<file name="MeshMiniRouter.exe.config" size="2397">
|
|
||||||
<hash>
|
|
||||||
<dsig:Transforms>
|
|
||||||
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
|
|
||||||
</dsig:Transforms>
|
|
||||||
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
|
|
||||||
<dsig:DigestValue>UylUFD4/o0KBti+5/eodTDgq4BkUJD0J0aUXNd3yHbY=</dsig:DigestValue>
|
|
||||||
</hash>
|
|
||||||
</file>
|
|
||||||
<file name="MeshMiniRouter.ico" size="1078">
|
|
||||||
<hash>
|
|
||||||
<dsig:Transforms>
|
|
||||||
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
|
|
||||||
</dsig:Transforms>
|
|
||||||
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
|
|
||||||
<dsig:DigestValue>mkjbDQuo7YXa8wZxdKEu/ECXrORwwtpRgNj8NBKbzHo=</dsig:DigestValue>
|
|
||||||
</hash>
|
|
||||||
</file>
|
|
||||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
|
||||||
<application>
|
|
||||||
<!-- A list of all Windows versions that this application is designed to work with. Windows will automatically select the most compatible environment.-->
|
|
||||||
<!-- If your application is designed to work with Windows 7, uncomment the following supportedOS node-->
|
|
||||||
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
|
|
||||||
</application>
|
|
||||||
</compatibility>
|
|
||||||
</asmv1:assembly>
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
3091
public/index.html
3091
public/index.html
File diff suppressed because it is too large
Load Diff
@ -1,10 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<script type="text/javascript" src="relay.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<script>
|
|
||||||
var relay = createMeshConnection('0D49FDEFFB778D40C062DD34A3E96113:1485387591408:b2970207326684b4de5375d097db23c85e64497eaa72013b56a8ecd8063fb9b3').connect();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,48 +0,0 @@
|
|||||||
/**
|
|
||||||
* @fileoverview Dynamic interface to MeshCentral2
|
|
||||||
* @author Ylian Saint-Hilaire
|
|
||||||
* @version v0.0.1
|
|
||||||
*/
|
|
||||||
|
|
||||||
var createMeshConnection = function (connectionId) {
|
|
||||||
var obj = {};
|
|
||||||
obj.connectionId = connectionId;
|
|
||||||
obj.state = 0;
|
|
||||||
obj.websocket = null;
|
|
||||||
obj.onStateChanged = null;
|
|
||||||
obj.onData = null;
|
|
||||||
|
|
||||||
obj.connect = function () {
|
|
||||||
if (obj.state == 0) {
|
|
||||||
obj.websocket = new WebSocket(window.location.protocol.replace('http', 'ws') + '//' + window.location.host + '/meshrelay.ashx?id=' + obj.connectionId);
|
|
||||||
obj.websocket.binaryType = "arraybuffer";
|
|
||||||
obj.websocket.onopen = function (e) { console.log('WebSocket Connected', e); };
|
|
||||||
obj.websocket.onmessage = function (e) {
|
|
||||||
console.log('WebSocket Message', e);
|
|
||||||
if ((obj.state = 1) && (e.data == 'c')) {
|
|
||||||
obj.state = 2;
|
|
||||||
if (obj.onStateChanged) { onStateChanged(obj, 2); }
|
|
||||||
console.log('WebSocket Peer Connection', e);
|
|
||||||
obj.send('bob');
|
|
||||||
} else {
|
|
||||||
if (obj.onData != null) { obj.onData(obj, e.data); }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
obj.websocket.onclose = function (e) {
|
|
||||||
console.log('WebSocket Closed', e);
|
|
||||||
obj.state = 0;
|
|
||||||
if (obj.onStateChanged) { onStateChanged(obj, 0); }
|
|
||||||
};
|
|
||||||
obj.websocket.onerror = function (e) { console.log('WebSocket Error', e); };
|
|
||||||
obj.state = 1;
|
|
||||||
if (obj.onStateChanged) { onStateChanged(obj, 1); }
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
};
|
|
||||||
|
|
||||||
obj.send = function (data) {
|
|
||||||
if ((obj.state == 2) && (obj.websocket != null)) { obj.websocket.send(data); }
|
|
||||||
};
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
@ -1,732 +0,0 @@
|
|||||||
/*
|
|
||||||
* Port of script by Masanao Izumo.
|
|
||||||
*
|
|
||||||
* Wrapped all the variables in a function, created a
|
|
||||||
* constructor for interacting with the lib. Everything
|
|
||||||
* else was written by M. Izumo.
|
|
||||||
*
|
|
||||||
* Original code can be found here: http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var zip_WSIZE = 32768; // Sliding Window size
|
|
||||||
var zip_STORED_BLOCK = 0;
|
|
||||||
var zip_STATIC_TREES = 1;
|
|
||||||
var zip_DYN_TREES = 2;
|
|
||||||
|
|
||||||
/* for inflate */
|
|
||||||
var zip_lbits = 9; // bits in base literal/length lookup table
|
|
||||||
var zip_dbits = 6; // bits in base distance lookup table
|
|
||||||
var zip_INBUFSIZ = 32768; // Input buffer size
|
|
||||||
var zip_INBUF_EXTRA = 64; // Extra buffer
|
|
||||||
|
|
||||||
/* variables (inflate) */
|
|
||||||
var zip_slide;
|
|
||||||
var zip_wp; // current position in slide
|
|
||||||
var zip_fixed_tl = null; // inflate static
|
|
||||||
var zip_fixed_td; // inflate static
|
|
||||||
var zip_fixed_bl, fixed_bd; // inflate static
|
|
||||||
var zip_bit_buf; // bit buffer
|
|
||||||
var zip_bit_len; // bits in bit buffer
|
|
||||||
var zip_method;
|
|
||||||
var zip_eof;
|
|
||||||
var zip_copy_leng;
|
|
||||||
var zip_copy_dist;
|
|
||||||
var zip_tl, zip_td; // literal/length and distance decoder tables
|
|
||||||
var zip_bl, zip_bd; // number of bits decoded by tl and td
|
|
||||||
|
|
||||||
var zip_inflate_data;
|
|
||||||
var zip_inflate_pos;
|
|
||||||
|
|
||||||
|
|
||||||
/* constant tables (inflate) */
|
|
||||||
var zip_MASK_BITS = new Array(
|
|
||||||
0x0000,
|
|
||||||
0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
|
|
||||||
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff);
|
|
||||||
// Tables for deflate from PKZIP's appnote.txt.
|
|
||||||
var zip_cplens = new Array( // Copy lengths for literal codes 257..285
|
|
||||||
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
|
|
||||||
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0);
|
|
||||||
/* note: see note #13 above about the 258 in this list. */
|
|
||||||
var zip_cplext = new Array( // Extra bits for literal codes 257..285
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
|
|
||||||
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); // 99==invalid
|
|
||||||
var zip_cpdist = new Array( // Copy offsets for distance codes 0..29
|
|
||||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
|
||||||
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
|
||||||
8193, 12289, 16385, 24577);
|
|
||||||
var zip_cpdext = new Array( // Extra bits for distance codes
|
|
||||||
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
|
|
||||||
7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
|
|
||||||
12, 12, 13, 13);
|
|
||||||
var zip_border = new Array( // Order of the bit length code lengths
|
|
||||||
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15);
|
|
||||||
/* objects (inflate) */
|
|
||||||
|
|
||||||
function zip_HuftList() {
|
|
||||||
this.next = null;
|
|
||||||
this.list = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_HuftNode() {
|
|
||||||
this.e = 0; // number of extra bits or operation
|
|
||||||
this.b = 0; // number of bits in this code or subcode
|
|
||||||
|
|
||||||
// union
|
|
||||||
this.n = 0; // literal, length base, or distance base
|
|
||||||
this.t = null; // (zip_HuftNode) pointer to next level of table
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_HuftBuild(b, // code lengths in bits (all assumed <= BMAX)
|
|
||||||
n, // number of codes (assumed <= N_MAX)
|
|
||||||
s, // number of simple-valued codes (0..s-1)
|
|
||||||
d, // list of base values for non-simple codes
|
|
||||||
e, // list of extra bits for non-simple codes
|
|
||||||
mm // maximum lookup bits
|
|
||||||
) {
|
|
||||||
this.BMAX = 16; // maximum bit length of any code
|
|
||||||
this.N_MAX = 288; // maximum number of codes in any set
|
|
||||||
this.status = 0; // 0: success, 1: incomplete table, 2: bad input
|
|
||||||
this.root = null; // (zip_HuftList) starting table
|
|
||||||
this.m = 0; // maximum lookup bits, returns actual
|
|
||||||
|
|
||||||
/* Given a list of code lengths and a maximum table size, make a set of
|
|
||||||
tables to decode that set of codes. Return zero on success, one if
|
|
||||||
the given code set is incomplete (the tables are still built in this
|
|
||||||
case), two if the input is invalid (all zero length codes or an
|
|
||||||
oversubscribed set of lengths), and three if not enough memory.
|
|
||||||
The code with value 256 is special, and the tables are constructed
|
|
||||||
so that no bits beyond that code are fetched when that code is
|
|
||||||
decoded. */
|
|
||||||
{
|
|
||||||
var a; // counter for codes of length k
|
|
||||||
var c = new Array(this.BMAX + 1); // bit length count table
|
|
||||||
var el; // length of EOB code (value 256)
|
|
||||||
var f; // i repeats in table every f entries
|
|
||||||
var g; // maximum code length
|
|
||||||
var h; // table level
|
|
||||||
var i; // counter, current code
|
|
||||||
var j; // counter
|
|
||||||
var k; // number of bits in current code
|
|
||||||
var lx = new Array(this.BMAX + 1); // stack of bits per table
|
|
||||||
var p; // pointer into c[], b[], or v[]
|
|
||||||
var pidx; // index of p
|
|
||||||
var q; // (zip_HuftNode) points to current table
|
|
||||||
var r = new zip_HuftNode(); // table entry for structure assignment
|
|
||||||
var u = new Array(this.BMAX); // zip_HuftNode[BMAX][] table stack
|
|
||||||
var v = new Array(this.N_MAX); // values in order of bit length
|
|
||||||
var w;
|
|
||||||
var x = new Array(this.BMAX + 1);// bit offsets, then code stack
|
|
||||||
var xp; // pointer into x or c
|
|
||||||
var y; // number of dummy codes added
|
|
||||||
var z; // number of entries in current table
|
|
||||||
var o;
|
|
||||||
var tail; // (zip_HuftList)
|
|
||||||
|
|
||||||
tail = this.root = null;
|
|
||||||
for (i = 0; i < c.length; i++)
|
|
||||||
c[i] = 0;
|
|
||||||
for (i = 0; i < lx.length; i++)
|
|
||||||
lx[i] = 0;
|
|
||||||
for (i = 0; i < u.length; i++)
|
|
||||||
u[i] = null;
|
|
||||||
for (i = 0; i < v.length; i++)
|
|
||||||
v[i] = 0;
|
|
||||||
for (i = 0; i < x.length; i++)
|
|
||||||
x[i] = 0;
|
|
||||||
|
|
||||||
// Generate counts for each bit length
|
|
||||||
el = n > 256 ? b[256] : this.BMAX; // set length of EOB code, if any
|
|
||||||
p = b; pidx = 0;
|
|
||||||
i = n;
|
|
||||||
do {
|
|
||||||
c[p[pidx]]++; // assume all entries <= BMAX
|
|
||||||
pidx++;
|
|
||||||
} while (--i > 0);
|
|
||||||
if (c[0] == n) { // null input--all zero length codes
|
|
||||||
this.root = null;
|
|
||||||
this.m = 0;
|
|
||||||
this.status = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find minimum and maximum length, bound *m by those
|
|
||||||
for (j = 1; j <= this.BMAX; j++)
|
|
||||||
if (c[j] != 0)
|
|
||||||
break;
|
|
||||||
k = j; // minimum code length
|
|
||||||
if (mm < j)
|
|
||||||
mm = j;
|
|
||||||
for (i = this.BMAX; i != 0; i--)
|
|
||||||
if (c[i] != 0)
|
|
||||||
break;
|
|
||||||
g = i; // maximum code length
|
|
||||||
if (mm > i)
|
|
||||||
mm = i;
|
|
||||||
|
|
||||||
// Adjust last length count to fill out codes, if needed
|
|
||||||
for (y = 1 << j; j < i; j++, y <<= 1)
|
|
||||||
if ((y -= c[j]) < 0) {
|
|
||||||
this.status = 2; // bad input: more codes than bits
|
|
||||||
this.m = mm;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((y -= c[i]) < 0) {
|
|
||||||
this.status = 2;
|
|
||||||
this.m = mm;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
c[i] += y;
|
|
||||||
|
|
||||||
// Generate starting offsets into the value table for each length
|
|
||||||
x[1] = j = 0;
|
|
||||||
p = c;
|
|
||||||
pidx = 1;
|
|
||||||
xp = 2;
|
|
||||||
while (--i > 0) // note that i == g from above
|
|
||||||
x[xp++] = (j += p[pidx++]);
|
|
||||||
|
|
||||||
// Make a table of values in order of bit lengths
|
|
||||||
p = b; pidx = 0;
|
|
||||||
i = 0;
|
|
||||||
do {
|
|
||||||
if ((j = p[pidx++]) != 0)
|
|
||||||
v[x[j]++] = i;
|
|
||||||
} while (++i < n);
|
|
||||||
n = x[g]; // set n to length of v
|
|
||||||
|
|
||||||
// Generate the Huffman codes and for each, make the table entries
|
|
||||||
x[0] = i = 0; // first Huffman code is zero
|
|
||||||
p = v; pidx = 0; // grab values in bit order
|
|
||||||
h = -1; // no tables yet--level -1
|
|
||||||
w = lx[0] = 0; // no bits decoded yet
|
|
||||||
q = null; // ditto
|
|
||||||
z = 0; // ditto
|
|
||||||
|
|
||||||
// go through the bit lengths (k already is bits in shortest code)
|
|
||||||
for (; k <= g; k++) {
|
|
||||||
a = c[k];
|
|
||||||
while (a-- > 0) {
|
|
||||||
// here i is the Huffman code of length k bits for value p[pidx]
|
|
||||||
// make tables up to required level
|
|
||||||
while (k > w + lx[1 + h]) {
|
|
||||||
w += lx[1 + h]; // add bits already decoded
|
|
||||||
h++;
|
|
||||||
|
|
||||||
// compute minimum size table less than or equal to *m bits
|
|
||||||
z = (z = g - w) > mm ? mm : z; // upper limit
|
|
||||||
if ((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table
|
|
||||||
// too few codes for k-w bit table
|
|
||||||
f -= a + 1; // deduct codes from patterns left
|
|
||||||
xp = k;
|
|
||||||
while (++j < z) { // try smaller tables up to z bits
|
|
||||||
if ((f <<= 1) <= c[++xp])
|
|
||||||
break; // enough codes to use up j bits
|
|
||||||
f -= c[xp]; // else deduct codes from patterns
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (w + j > el && w < el)
|
|
||||||
j = el - w; // make EOB code end at table
|
|
||||||
z = 1 << j; // table entries for j-bit table
|
|
||||||
lx[1 + h] = j; // set table size in stack
|
|
||||||
|
|
||||||
// allocate and link in new table
|
|
||||||
q = new Array(z);
|
|
||||||
for (o = 0; o < z; o++) {
|
|
||||||
q[o] = new zip_HuftNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tail == null)
|
|
||||||
tail = this.root = new zip_HuftList();
|
|
||||||
else
|
|
||||||
tail = tail.next = new zip_HuftList();
|
|
||||||
tail.next = null;
|
|
||||||
tail.list = q;
|
|
||||||
u[h] = q; // table starts after link
|
|
||||||
|
|
||||||
/* connect to last table, if there is one */
|
|
||||||
if (h > 0) {
|
|
||||||
x[h] = i; // save pattern for backing up
|
|
||||||
r.b = lx[h]; // bits to dump before this table
|
|
||||||
r.e = 16 + j; // bits in this table
|
|
||||||
r.t = q; // pointer to this table
|
|
||||||
j = (i & ((1 << w) - 1)) >> (w - lx[h]);
|
|
||||||
u[h - 1][j].e = r.e;
|
|
||||||
u[h - 1][j].b = r.b;
|
|
||||||
u[h - 1][j].n = r.n;
|
|
||||||
u[h - 1][j].t = r.t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set up table entry in r
|
|
||||||
r.b = k - w;
|
|
||||||
if (pidx >= n)
|
|
||||||
r.e = 99; // out of values--invalid code
|
|
||||||
else if (p[pidx] < s) {
|
|
||||||
r.e = (p[pidx] < 256 ? 16 : 15); // 256 is end-of-block code
|
|
||||||
r.n = p[pidx++]; // simple code is just the value
|
|
||||||
} else {
|
|
||||||
r.e = e[p[pidx] - s]; // non-simple--look up in lists
|
|
||||||
r.n = d[p[pidx++] - s];
|
|
||||||
}
|
|
||||||
|
|
||||||
// fill code-like entries with r //
|
|
||||||
f = 1 << (k - w);
|
|
||||||
for (j = i >> w; j < z; j += f) {
|
|
||||||
q[j].e = r.e;
|
|
||||||
q[j].b = r.b;
|
|
||||||
q[j].n = r.n;
|
|
||||||
q[j].t = r.t;
|
|
||||||
}
|
|
||||||
|
|
||||||
// backwards increment the k-bit code i
|
|
||||||
for (j = 1 << (k - 1) ; (i & j) != 0; j >>= 1)
|
|
||||||
i ^= j;
|
|
||||||
i ^= j;
|
|
||||||
|
|
||||||
// backup over finished tables
|
|
||||||
while ((i & ((1 << w) - 1)) != x[h]) {
|
|
||||||
w -= lx[h]; // don't need to update q
|
|
||||||
h--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return actual size of base table */
|
|
||||||
this.m = lx[1];
|
|
||||||
|
|
||||||
/* Return true (1) if we were given an incomplete table */
|
|
||||||
this.status = ((y != 0 && g != 1) ? 1 : 0);
|
|
||||||
} /* end of constructor */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* routines (inflate) */
|
|
||||||
|
|
||||||
function zip_GET_BYTE() {
|
|
||||||
if (zip_inflate_data.length == zip_inflate_pos)
|
|
||||||
return -1;
|
|
||||||
return zip_inflate_data.charCodeAt(zip_inflate_pos++) & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_NEEDBITS(n) {
|
|
||||||
while (zip_bit_len < n) {
|
|
||||||
zip_bit_buf |= zip_GET_BYTE() << zip_bit_len;
|
|
||||||
zip_bit_len += 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_GETBITS(n) {
|
|
||||||
return zip_bit_buf & zip_MASK_BITS[n];
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_DUMPBITS(n) {
|
|
||||||
zip_bit_buf >>= n;
|
|
||||||
zip_bit_len -= n;
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_inflate_codes(buff, off, size) {
|
|
||||||
/* inflate (decompress) the codes in a deflated (compressed) block.
|
|
||||||
Return an error code or zero if it all goes ok. */
|
|
||||||
var e; // table entry flag/number of extra bits
|
|
||||||
var t; // (zip_HuftNode) pointer to table entry
|
|
||||||
var n;
|
|
||||||
|
|
||||||
if (size == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// inflate the coded data
|
|
||||||
n = 0;
|
|
||||||
for (; ;) { // do until end of block
|
|
||||||
zip_NEEDBITS(zip_bl);
|
|
||||||
t = zip_tl.list[zip_GETBITS(zip_bl)];
|
|
||||||
e = t.e;
|
|
||||||
while (e > 16) {
|
|
||||||
if (e == 99)
|
|
||||||
return -1;
|
|
||||||
zip_DUMPBITS(t.b);
|
|
||||||
e -= 16;
|
|
||||||
zip_NEEDBITS(e);
|
|
||||||
t = t.t[zip_GETBITS(e)];
|
|
||||||
e = t.e;
|
|
||||||
}
|
|
||||||
zip_DUMPBITS(t.b);
|
|
||||||
|
|
||||||
if (e == 16) { // then it's a literal
|
|
||||||
zip_wp &= zip_WSIZE - 1;
|
|
||||||
buff[off + n++] = zip_slide[zip_wp++] = t.n;
|
|
||||||
if (n == size)
|
|
||||||
return size;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// exit if end of block
|
|
||||||
if (e == 15)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// it's an EOB or a length
|
|
||||||
|
|
||||||
// get length of block to copy
|
|
||||||
zip_NEEDBITS(e);
|
|
||||||
zip_copy_leng = t.n + zip_GETBITS(e);
|
|
||||||
zip_DUMPBITS(e);
|
|
||||||
|
|
||||||
// decode distance of block to copy
|
|
||||||
zip_NEEDBITS(zip_bd);
|
|
||||||
t = zip_td.list[zip_GETBITS(zip_bd)];
|
|
||||||
e = t.e;
|
|
||||||
|
|
||||||
while (e > 16) {
|
|
||||||
if (e == 99)
|
|
||||||
return -1;
|
|
||||||
zip_DUMPBITS(t.b);
|
|
||||||
e -= 16;
|
|
||||||
zip_NEEDBITS(e);
|
|
||||||
t = t.t[zip_GETBITS(e)];
|
|
||||||
e = t.e;
|
|
||||||
}
|
|
||||||
zip_DUMPBITS(t.b);
|
|
||||||
zip_NEEDBITS(e);
|
|
||||||
zip_copy_dist = zip_wp - t.n - zip_GETBITS(e);
|
|
||||||
zip_DUMPBITS(e);
|
|
||||||
|
|
||||||
// do the copy
|
|
||||||
while (zip_copy_leng > 0 && n < size) {
|
|
||||||
zip_copy_leng--;
|
|
||||||
zip_copy_dist &= zip_WSIZE - 1;
|
|
||||||
zip_wp &= zip_WSIZE - 1;
|
|
||||||
buff[off + n++] = zip_slide[zip_wp++]
|
|
||||||
= zip_slide[zip_copy_dist++];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n == size)
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
zip_method = -1; // done
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_inflate_stored(buff, off, size) {
|
|
||||||
/* "decompress" an inflated type 0 (stored) block. */
|
|
||||||
var n;
|
|
||||||
|
|
||||||
// go to byte boundary
|
|
||||||
n = zip_bit_len & 7;
|
|
||||||
zip_DUMPBITS(n);
|
|
||||||
|
|
||||||
// get the length and its complement
|
|
||||||
zip_NEEDBITS(16);
|
|
||||||
n = zip_GETBITS(16);
|
|
||||||
zip_DUMPBITS(16);
|
|
||||||
zip_NEEDBITS(16);
|
|
||||||
if (n != ((~zip_bit_buf) & 0xffff))
|
|
||||||
return -1; // error in compressed data
|
|
||||||
zip_DUMPBITS(16);
|
|
||||||
|
|
||||||
// read and output the compressed data
|
|
||||||
zip_copy_leng = n;
|
|
||||||
|
|
||||||
n = 0;
|
|
||||||
while (zip_copy_leng > 0 && n < size) {
|
|
||||||
zip_copy_leng--;
|
|
||||||
zip_wp &= zip_WSIZE - 1;
|
|
||||||
zip_NEEDBITS(8);
|
|
||||||
buff[off + n++] = zip_slide[zip_wp++] =
|
|
||||||
zip_GETBITS(8);
|
|
||||||
zip_DUMPBITS(8);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zip_copy_leng == 0)
|
|
||||||
zip_method = -1; // done
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_inflate_fixed(buff, off, size) {
|
|
||||||
/* decompress an inflated type 1 (fixed Huffman codes) block. We should
|
|
||||||
either replace this with a custom decoder, or at least precompute the
|
|
||||||
Huffman tables. */
|
|
||||||
|
|
||||||
// if first time, set up tables for fixed blocks
|
|
||||||
if (zip_fixed_tl == null) {
|
|
||||||
var i; // temporary variable
|
|
||||||
var l = new Array(288); // length list for huft_build
|
|
||||||
var h; // zip_HuftBuild
|
|
||||||
|
|
||||||
// literal table
|
|
||||||
for (i = 0; i < 144; i++)
|
|
||||||
l[i] = 8;
|
|
||||||
for (; i < 256; i++)
|
|
||||||
l[i] = 9;
|
|
||||||
for (; i < 280; i++)
|
|
||||||
l[i] = 7;
|
|
||||||
for (; i < 288; i++) // make a complete, but wrong code set
|
|
||||||
l[i] = 8;
|
|
||||||
zip_fixed_bl = 7;
|
|
||||||
|
|
||||||
h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext,
|
|
||||||
zip_fixed_bl);
|
|
||||||
if (h.status != 0) {
|
|
||||||
alert("HufBuild error: " + h.status);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
zip_fixed_tl = h.root;
|
|
||||||
zip_fixed_bl = h.m;
|
|
||||||
|
|
||||||
// distance table
|
|
||||||
for (i = 0; i < 30; i++) // make an incomplete code set
|
|
||||||
l[i] = 5;
|
|
||||||
zip_fixed_bd = 5;
|
|
||||||
|
|
||||||
h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd);
|
|
||||||
if (h.status > 1) {
|
|
||||||
zip_fixed_tl = null;
|
|
||||||
alert("HufBuild error: " + h.status);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
zip_fixed_td = h.root;
|
|
||||||
zip_fixed_bd = h.m;
|
|
||||||
}
|
|
||||||
|
|
||||||
zip_tl = zip_fixed_tl;
|
|
||||||
zip_td = zip_fixed_td;
|
|
||||||
zip_bl = zip_fixed_bl;
|
|
||||||
zip_bd = zip_fixed_bd;
|
|
||||||
return zip_inflate_codes(buff, off, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_inflate_dynamic(buff, off, size) {
|
|
||||||
// decompress an inflated type 2 (dynamic Huffman codes) block.
|
|
||||||
var i; // temporary variables
|
|
||||||
var j;
|
|
||||||
var l; // last length
|
|
||||||
var n; // number of lengths to get
|
|
||||||
var t; // (zip_HuftNode) literal/length code table
|
|
||||||
var nb; // number of bit length codes
|
|
||||||
var nl; // number of literal/length codes
|
|
||||||
var nd; // number of distance codes
|
|
||||||
var ll = new Array(286 + 30); // literal/length and distance code lengths
|
|
||||||
var h; // (zip_HuftBuild)
|
|
||||||
|
|
||||||
for (i = 0; i < ll.length; i++)
|
|
||||||
ll[i] = 0;
|
|
||||||
|
|
||||||
// read in table lengths
|
|
||||||
zip_NEEDBITS(5);
|
|
||||||
nl = 257 + zip_GETBITS(5); // number of literal/length codes
|
|
||||||
zip_DUMPBITS(5);
|
|
||||||
zip_NEEDBITS(5);
|
|
||||||
nd = 1 + zip_GETBITS(5); // number of distance codes
|
|
||||||
zip_DUMPBITS(5);
|
|
||||||
zip_NEEDBITS(4);
|
|
||||||
nb = 4 + zip_GETBITS(4); // number of bit length codes
|
|
||||||
zip_DUMPBITS(4);
|
|
||||||
if (nl > 286 || nd > 30)
|
|
||||||
return -1; // bad lengths
|
|
||||||
|
|
||||||
// read in bit-length-code lengths
|
|
||||||
for (j = 0; j < nb; j++) {
|
|
||||||
zip_NEEDBITS(3);
|
|
||||||
ll[zip_border[j]] = zip_GETBITS(3);
|
|
||||||
zip_DUMPBITS(3);
|
|
||||||
}
|
|
||||||
for (; j < 19; j++)
|
|
||||||
ll[zip_border[j]] = 0;
|
|
||||||
|
|
||||||
// build decoding table for trees--single level, 7 bit lookup
|
|
||||||
zip_bl = 7;
|
|
||||||
h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl);
|
|
||||||
if (h.status != 0)
|
|
||||||
return -1; // incomplete code set
|
|
||||||
|
|
||||||
zip_tl = h.root;
|
|
||||||
zip_bl = h.m;
|
|
||||||
|
|
||||||
// read in literal and distance code lengths
|
|
||||||
n = nl + nd;
|
|
||||||
i = l = 0;
|
|
||||||
while (i < n) {
|
|
||||||
zip_NEEDBITS(zip_bl);
|
|
||||||
t = zip_tl.list[zip_GETBITS(zip_bl)];
|
|
||||||
j = t.b;
|
|
||||||
zip_DUMPBITS(j);
|
|
||||||
j = t.n;
|
|
||||||
if (j < 16) // length of code in bits (0..15)
|
|
||||||
ll[i++] = l = j; // save last length in l
|
|
||||||
else if (j == 16) { // repeat last length 3 to 6 times
|
|
||||||
zip_NEEDBITS(2);
|
|
||||||
j = 3 + zip_GETBITS(2);
|
|
||||||
zip_DUMPBITS(2);
|
|
||||||
if (i + j > n)
|
|
||||||
return -1;
|
|
||||||
while (j-- > 0)
|
|
||||||
ll[i++] = l;
|
|
||||||
} else if (j == 17) { // 3 to 10 zero length codes
|
|
||||||
zip_NEEDBITS(3);
|
|
||||||
j = 3 + zip_GETBITS(3);
|
|
||||||
zip_DUMPBITS(3);
|
|
||||||
if (i + j > n)
|
|
||||||
return -1;
|
|
||||||
while (j-- > 0)
|
|
||||||
ll[i++] = 0;
|
|
||||||
l = 0;
|
|
||||||
} else { // j == 18: 11 to 138 zero length codes
|
|
||||||
zip_NEEDBITS(7);
|
|
||||||
j = 11 + zip_GETBITS(7);
|
|
||||||
zip_DUMPBITS(7);
|
|
||||||
if (i + j > n)
|
|
||||||
return -1;
|
|
||||||
while (j-- > 0)
|
|
||||||
ll[i++] = 0;
|
|
||||||
l = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// build the decoding tables for literal/length and distance codes
|
|
||||||
zip_bl = zip_lbits;
|
|
||||||
h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl);
|
|
||||||
if (zip_bl == 0) // no literals or lengths
|
|
||||||
h.status = 1;
|
|
||||||
if (h.status != 0) {
|
|
||||||
if (h.status == 1)
|
|
||||||
;// **incomplete literal tree**
|
|
||||||
return -1; // incomplete code set
|
|
||||||
}
|
|
||||||
zip_tl = h.root;
|
|
||||||
zip_bl = h.m;
|
|
||||||
|
|
||||||
for (i = 0; i < nd; i++)
|
|
||||||
ll[i] = ll[i + nl];
|
|
||||||
zip_bd = zip_dbits;
|
|
||||||
h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd);
|
|
||||||
zip_td = h.root;
|
|
||||||
zip_bd = h.m;
|
|
||||||
|
|
||||||
if (zip_bd == 0 && nl > 257) { // lengths but no distances
|
|
||||||
// **incomplete distance tree**
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h.status == 1) {
|
|
||||||
;// **incomplete distance tree**
|
|
||||||
}
|
|
||||||
if (h.status != 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
// decompress until an end-of-block code
|
|
||||||
return zip_inflate_codes(buff, off, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_inflate_internal(buff, off, size) {
|
|
||||||
// decompress an inflated entry
|
|
||||||
var n, i;
|
|
||||||
|
|
||||||
n = 0;
|
|
||||||
while (n < size) {
|
|
||||||
if (zip_eof && zip_method == -1)
|
|
||||||
return n;
|
|
||||||
|
|
||||||
if (zip_copy_leng > 0) {
|
|
||||||
if (zip_method != zip_STORED_BLOCK) {
|
|
||||||
// STATIC_TREES or DYN_TREES
|
|
||||||
while (zip_copy_leng > 0 && n < size) {
|
|
||||||
zip_copy_leng--;
|
|
||||||
zip_copy_dist &= zip_WSIZE - 1;
|
|
||||||
zip_wp &= zip_WSIZE - 1;
|
|
||||||
buff[off + n++] = zip_slide[zip_wp++] =
|
|
||||||
zip_slide[zip_copy_dist++];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (zip_copy_leng > 0 && n < size) {
|
|
||||||
zip_copy_leng--;
|
|
||||||
zip_wp &= zip_WSIZE - 1;
|
|
||||||
zip_NEEDBITS(8);
|
|
||||||
buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8);
|
|
||||||
zip_DUMPBITS(8);
|
|
||||||
}
|
|
||||||
if (zip_copy_leng == 0)
|
|
||||||
zip_method = -1; // done
|
|
||||||
}
|
|
||||||
if (n == size)
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zip_method == -1) {
|
|
||||||
if (zip_eof)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// read in last block bit
|
|
||||||
zip_NEEDBITS(1);
|
|
||||||
if (zip_GETBITS(1) != 0)
|
|
||||||
zip_eof = true;
|
|
||||||
zip_DUMPBITS(1);
|
|
||||||
|
|
||||||
// read in block type
|
|
||||||
zip_NEEDBITS(2);
|
|
||||||
zip_method = zip_GETBITS(2);
|
|
||||||
zip_DUMPBITS(2);
|
|
||||||
zip_tl = null;
|
|
||||||
zip_copy_leng = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (zip_method) {
|
|
||||||
case 0: // zip_STORED_BLOCK
|
|
||||||
i = zip_inflate_stored(buff, off + n, size - n);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1: // zip_STATIC_TREES
|
|
||||||
if (zip_tl != null)
|
|
||||||
i = zip_inflate_codes(buff, off + n, size - n);
|
|
||||||
else
|
|
||||||
i = zip_inflate_fixed(buff, off + n, size - n);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2: // zip_DYN_TREES
|
|
||||||
if (zip_tl != null)
|
|
||||||
i = zip_inflate_codes(buff, off + n, size - n);
|
|
||||||
else
|
|
||||||
i = zip_inflate_dynamic(buff, off + n, size - n);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: // error
|
|
||||||
i = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == -1) {
|
|
||||||
if (zip_eof)
|
|
||||||
return 0;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
n += i;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
function zip_inflate_start() {
|
|
||||||
if (zip_slide == null) zip_slide = new Array(2 * zip_WSIZE);
|
|
||||||
zip_wp = 0;
|
|
||||||
zip_bit_buf = 0;
|
|
||||||
zip_bit_len = 0;
|
|
||||||
zip_method = -1;
|
|
||||||
zip_eof = false;
|
|
||||||
zip_copy_leng = zip_copy_dist = 0;
|
|
||||||
zip_tl = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
inflate_start = function () { zip_inflate_start(); };
|
|
||||||
inflate = function (data) {
|
|
||||||
var out = "", buff = [], i, j;
|
|
||||||
zip_bit_buf = 0;
|
|
||||||
zip_bit_len = 0;
|
|
||||||
zip_method = -1;
|
|
||||||
zip_eof = false;
|
|
||||||
zip_inflate_data = data;
|
|
||||||
zip_inflate_pos = 0;
|
|
||||||
|
|
||||||
do { i = zip_inflate_internal(buff, buff.length, 1024); } while (i > 0);
|
|
||||||
zip_inflate_data = null; // G.C.
|
|
||||||
|
|
||||||
return buff;
|
|
||||||
};
|
|
@ -29,7 +29,8 @@ module.exports.CreateRedirServer = function (parent, db, args, func) {
|
|||||||
host = obj.certificates.CommonName;
|
host = obj.certificates.CommonName;
|
||||||
if ((obj.certificates.CommonName == 'sample.org') || (obj.certificates.CommonName == 'un-configured')) { host = req.headers.host; }
|
if ((obj.certificates.CommonName == 'sample.org') || (obj.certificates.CommonName == 'un-configured')) { host = req.headers.host; }
|
||||||
}
|
}
|
||||||
if (req.headers && req.headers.host && (req.headers.host.split(':')[0].toLowerCase() == 'localhost')) { res.redirect('https://localhost:' + args.port + req.url); } else { res.redirect('https://' + host + ':' + args.port + req.url); }
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
|
if (req.headers && req.headers.host && (req.headers.host.split(':')[0].toLowerCase() == 'localhost')) { res.redirect('https://localhost:' + httpsPort + req.url); } else { res.redirect('https://' + host + ':' + httpsPort + req.url); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the current domain of the request
|
// Return the current domain of the request
|
||||||
|
40
webserver.js
40
webserver.js
@ -685,14 +685,16 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
|
|
||||||
// Send the master web application
|
// Send the master web application
|
||||||
if ((!obj.args.user) && (obj.args.nousers != true) && (nologout == false)) { logoutcontrol += ' <a href=' + domain.url + 'logout?' + Math.random() + ' style=color:white>Logout</a>'; } // If a default user is in use or no user mode, don't display the logout button
|
if ((!obj.args.user) && (obj.args.nousers != true) && (nologout == false)) { logoutcontrol += ' <a href=' + domain.url + 'logout?' + Math.random() + ' style=color:white>Logout</a>'; } // If a default user is in use or no user mode, don't display the logout button
|
||||||
res.render(obj.path.join(__dirname, 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: args.port, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, mpspass: args.mpspass, webcerthash: obj.webCertificateHashBase64, footer: (domain.footer == null) ? '' : domain.footer });
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
|
res.render(obj.path.join(__dirname, 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, mpspass: args.mpspass, webcerthash: obj.webCertificateHashBase64, footer: (domain.footer == null) ? '' : domain.footer });
|
||||||
} else {
|
} else {
|
||||||
// Send back the login application
|
// Send back the login application
|
||||||
var loginmode = req.session.loginmode;
|
var loginmode = req.session.loginmode;
|
||||||
delete req.session.loginmode; // Clear this state, if the user hits refresh, we want to go back to the login page.
|
delete req.session.loginmode; // Clear this state, if the user hits refresh, we want to go back to the login page.
|
||||||
var features = 0;
|
var features = 0;
|
||||||
if ((parent.config != null) && (parent.config.settings != null) && (parent.config.settings.allowframing == true)) { features += 32; } // Allow site within iframe
|
if ((parent.config != null) && (parent.config.settings != null) && (parent.config.settings.allowframing == true)) { features += 32; } // Allow site within iframe
|
||||||
res.render(obj.path.join(__dirname, 'views/login'), { loginmode: loginmode, rootCertLink: getRootCertLink(), title: domain.title, title2: domain.title2, newAccount: domain.newaccounts, newAccountPass: (((domain.newaccountspass == null) || (domain.newaccountspass == '')) ? 0 : 1), serverDnsName: getWebServerName(domain), serverPublicPort: obj.args.port, emailcheck: obj.parent.mailserver != null, features: features, footer: (domain.footer == null) ? '' : domain.footer });
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
|
res.render(obj.path.join(__dirname, 'views/login'), { loginmode: loginmode, rootCertLink: getRootCertLink(), title: domain.title, title2: domain.title2, newAccount: domain.newaccounts, newAccountPass: (((domain.newaccountspass == null) || (domain.newaccountspass == '')) ? 0 : 1), serverDnsName: getWebServerName(domain), serverPublicPort: httpsPort, emailcheck: obj.parent.mailserver != null, features: features, footer: (domain.footer == null) ? '' : domain.footer });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -767,6 +769,7 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
var scriptEngine = require('./amtscript.js').CreateAmtScriptEngine();
|
var scriptEngine = require('./amtscript.js').CreateAmtScriptEngine();
|
||||||
var runscript = scriptEngine.script_blocksToScript(scriptFile.blocks, scriptFile.scriptBlocks);
|
var runscript = scriptEngine.script_blocksToScript(scriptFile.blocks, scriptFile.scriptBlocks);
|
||||||
scriptFile.mescript = new Buffer(scriptEngine.script_compile(runscript), 'binary').toString('base64');
|
scriptFile.mescript = new Buffer(scriptEngine.script_compile(runscript), 'binary').toString('base64');
|
||||||
|
scriptFile.scriptText = runscript;
|
||||||
|
|
||||||
// Send the script
|
// Send the script
|
||||||
res.send(new Buffer(JSON.stringify(scriptFile, null, ' ')));
|
res.send(new Buffer(JSON.stringify(scriptFile, null, ' ')));
|
||||||
@ -792,6 +795,7 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
var scriptEngine = require('./amtscript.js').CreateAmtScriptEngine();
|
var scriptEngine = require('./amtscript.js').CreateAmtScriptEngine();
|
||||||
var runscript = scriptEngine.script_blocksToScript(scriptFile.blocks, scriptFile.scriptBlocks);
|
var runscript = scriptEngine.script_blocksToScript(scriptFile.blocks, scriptFile.scriptBlocks);
|
||||||
scriptFile.mescript = new Buffer(scriptEngine.script_compile(runscript), 'binary').toString('base64');
|
scriptFile.mescript = new Buffer(scriptEngine.script_compile(runscript), 'binary').toString('base64');
|
||||||
|
scriptFile.scriptText = runscript;
|
||||||
|
|
||||||
// Send the script
|
// Send the script
|
||||||
res.send(new Buffer(JSON.stringify(scriptFile, null, ' ')));
|
res.send(new Buffer(JSON.stringify(scriptFile, null, ' ')));
|
||||||
@ -1434,13 +1438,14 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
|
|
||||||
var meshidhex = new Buffer(req.query.meshid.replace(/\@/g, '+').replace(/\$/g, '/'), 'base64').toString('hex').toUpperCase();
|
var meshidhex = new Buffer(req.query.meshid.replace(/\@/g, '+').replace(/\$/g, '/'), 'base64').toString('hex').toUpperCase();
|
||||||
var serveridhex = new Buffer(obj.agentCertificateHashBase64.replace(/\@/g, '+').replace(/\$/g, '/'), 'base64').toString('hex').toUpperCase();
|
var serveridhex = new Buffer(obj.agentCertificateHashBase64.replace(/\@/g, '+').replace(/\$/g, '/'), 'base64').toString('hex').toUpperCase();
|
||||||
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
|
|
||||||
// Build the agent connection URL. If we are using a sub-domain or one with a DNS, we need to craft the URL correctly.
|
// Build the agent connection URL. If we are using a sub-domain or one with a DNS, we need to craft the URL correctly.
|
||||||
var xdomain = (domain.dns == null) ? domain.id : '';
|
var xdomain = (domain.dns == null) ? domain.id : '';
|
||||||
if (xdomain != '') xdomain += "/";
|
if (xdomain != '') xdomain += "/";
|
||||||
var meshsettings = "MeshName=" + mesh.name + "\r\nMeshType=" + mesh.mtype + "\r\nMeshID=0x" + meshidhex + "\r\nServerID=" + serveridhex + "\r\n";
|
var meshsettings = "MeshName=" + mesh.name + "\r\nMeshType=" + mesh.mtype + "\r\nMeshID=0x" + meshidhex + "\r\nServerID=" + serveridhex + "\r\n";
|
||||||
if (obj.args.lanonly != true) { meshsettings += "MeshServer=ws" + (obj.args.notls ? '' : 's') + "://" + getWebServerName(domain) + ":" + obj.args.port + "/" + xdomain + "agent.ashx\r\n"; } else { meshsettings += "MeshServer=local"; }
|
if (obj.args.lanonly != true) { meshsettings += "MeshServer=ws" + (obj.args.notls ? '' : 's') + "://" + getWebServerName(domain) + ":" + httpsPort + "/" + xdomain + "agent.ashx\r\n"; } else { meshsettings += "MeshServer=local"; }
|
||||||
if (req.query.tag != true) { meshsettings += "Tag=" + req.query.tag + "\r\n"; }
|
if (req.query.tag != null) { meshsettings += "Tag=" + req.query.tag + "\r\n"; }
|
||||||
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename=' + argentInfo.rname });
|
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename=' + argentInfo.rname });
|
||||||
obj.parent.exeHandler.streamExeWithMeshPolicy({ platform: 'win32', sourceFileName: obj.parent.meshAgentBinaries[req.query.id].path, destinationStream: res, msh: meshsettings, peinfo: obj.parent.meshAgentBinaries[req.query.id].pe });
|
obj.parent.exeHandler.streamExeWithMeshPolicy({ platform: 'win32', sourceFileName: obj.parent.meshAgentBinaries[req.query.id].path, destinationStream: res, msh: meshsettings, peinfo: obj.parent.meshAgentBinaries[req.query.id].pe });
|
||||||
});
|
});
|
||||||
@ -1453,11 +1458,19 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
res.sendFile(scriptInfo.path);
|
res.sendFile(scriptInfo.path);
|
||||||
} else if (req.query.meshcmd != null) {
|
} else if (req.query.meshcmd != null) {
|
||||||
// Send meshcmd for a specific platform back
|
// Send meshcmd for a specific platform back
|
||||||
var argentInfo = obj.parent.meshAgentBinaries[req.query.meshcmd];
|
var agentid = parseInt(req.query.meshcmd);
|
||||||
|
if ((agentid < 10000) && (obj.parent.meshAgentBinaries[agentid + 10000] != null)) { agentid += 10000; } // Avoid merging javascript to a signed mesh agent.
|
||||||
|
var argentInfo = obj.parent.meshAgentBinaries[agentid];
|
||||||
if ((argentInfo == null) || (obj.parent.defaultMeshCmd == null)) { res.sendStatus(404); return; }
|
if ((argentInfo == null) || (obj.parent.defaultMeshCmd == null)) { res.sendStatus(404); return; }
|
||||||
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename=meshcmd' + ((req.query.meshcmd <= 4) ? '.exe' : '') });
|
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename=meshcmd' + ((req.query.meshcmd <= 4) ? '.exe' : '') });
|
||||||
res.statusCode = 200;
|
res.statusCode = 200;
|
||||||
obj.parent.exeHandler.streamExeWithJavaScript({ platform: argentInfo.platform, sourceFileName: argentInfo.path, destinationStream: res, js: new Buffer(obj.parent.defaultMeshCmd, 'utf8'), peinfo: argentInfo.pe });
|
if (argentInfo.signedMeshCmdPath != null) {
|
||||||
|
// If we hav a pre-signed MeshCmd, send that.
|
||||||
|
res.sendFile(argentInfo.signedMeshCmdPath);
|
||||||
|
} else {
|
||||||
|
// Merge JavaScript to a unsigned agent and send that.
|
||||||
|
obj.parent.exeHandler.streamExeWithJavaScript({ platform: argentInfo.platform, sourceFileName: argentInfo.path, destinationStream: res, js: new Buffer(obj.parent.defaultMeshCmd, 'utf8'), peinfo: argentInfo.pe });
|
||||||
|
}
|
||||||
} else if (req.query.meshaction != null) {
|
} else if (req.query.meshaction != null) {
|
||||||
var domain = checkUserIpAddress(req, res);
|
var domain = checkUserIpAddress(req, res);
|
||||||
if (domain == null) { res.sendStatus(404); return; }
|
if (domain == null) { res.sendStatus(404); return; }
|
||||||
@ -1480,7 +1493,8 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
debugLevel: 0
|
debugLevel: 0
|
||||||
}
|
}
|
||||||
if (user != null) { meshaction.username = user.name; }
|
if (user != null) { meshaction.username = user.name; }
|
||||||
if (obj.args.lanonly != true) { meshaction.serverUrl = ((obj.args.notls == true) ? 'ws://' : 'wss://') + getWebServerName(domain) + ':' + obj.args.port + '/' + ((domain.id == '') ? '' : ('/' + domain.id)) + 'meshrelay.ashx'; }
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
|
if (obj.args.lanonly != true) { meshaction.serverUrl = ((obj.args.notls == true) ? 'ws://' : 'wss://') + getWebServerName(domain) + ':' + httpsPort + '/' + ((domain.id == '') ? '' : ('/' + domain.id)) + 'meshrelay.ashx'; }
|
||||||
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'text/plain', 'Content-Disposition': 'attachment; filename=meshaction.txt' });
|
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'text/plain', 'Content-Disposition': 'attachment; filename=meshaction.txt' });
|
||||||
res.send(JSON.stringify(meshaction, null, ' '));
|
res.send(JSON.stringify(meshaction, null, ' '));
|
||||||
});
|
});
|
||||||
@ -1494,7 +1508,8 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
debugLevel: 0
|
debugLevel: 0
|
||||||
}
|
}
|
||||||
if (user != null) { meshaction.username = user.name; }
|
if (user != null) { meshaction.username = user.name; }
|
||||||
if (obj.args.lanonly != true) { meshaction.serverUrl = ((obj.args.notls == true) ? 'ws://' : 'wss://') + getWebServerName(domain) + ':' + obj.args.port + '/' + ((domain.id == '') ? '' : ('/' + domain.id)) + 'meshrelay.ashx'; }
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
|
if (obj.args.lanonly != true) { meshaction.serverUrl = ((obj.args.notls == true) ? 'ws://' : 'wss://') + getWebServerName(domain) + ':' + httpsPort + '/' + ((domain.id == '') ? '' : ('/' + domain.id)) + 'meshrelay.ashx'; }
|
||||||
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'text/plain', 'Content-Disposition': 'attachment; filename=meshaction.txt' });
|
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'text/plain', 'Content-Disposition': 'attachment; filename=meshaction.txt' });
|
||||||
res.send(JSON.stringify(meshaction, null, ' '));
|
res.send(JSON.stringify(meshaction, null, ' '));
|
||||||
} else {
|
} else {
|
||||||
@ -1550,7 +1565,8 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
var xdomain = (domain.dns == null) ? domain.id : '';
|
var xdomain = (domain.dns == null) ? domain.id : '';
|
||||||
if (xdomain != '') xdomain += "/";
|
if (xdomain != '') xdomain += "/";
|
||||||
var meshsettings = "MeshName=" + mesh.name + "\r\nMeshType=" + mesh.mtype + "\r\nMeshID=0x" + meshidhex + "\r\nServerID=" + serveridhex + "\r\n";
|
var meshsettings = "MeshName=" + mesh.name + "\r\nMeshType=" + mesh.mtype + "\r\nMeshID=0x" + meshidhex + "\r\nServerID=" + serveridhex + "\r\n";
|
||||||
if (obj.args.lanonly != true) { meshsettings += "MeshServer=ws" + (obj.args.notls ? '' : 's') + "://" + getWebServerName(domain) + ":" + obj.args.port + "/" + xdomain + "agent.ashx\r\n"; } else { meshsettings += "MeshServer=local"; }
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
|
if (obj.args.lanonly != true) { meshsettings += "MeshServer=ws" + (obj.args.notls ? '' : 's') + "://" + getWebServerName(domain) + ":" + httpsPort + "/" + xdomain + "agent.ashx\r\n"; } else { meshsettings += "MeshServer=local"; }
|
||||||
|
|
||||||
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename=meshagent.msh' });
|
res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename=meshagent.msh' });
|
||||||
res.send(meshsettings);
|
res.send(meshsettings);
|
||||||
@ -1643,12 +1659,12 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
obj.args.port = port;
|
obj.args.port = port;
|
||||||
if (obj.tlsServer != null) {
|
if (obj.tlsServer != null) {
|
||||||
if (obj.args.lanonly == true) {
|
if (obj.args.lanonly == true) {
|
||||||
obj.tcpServer = obj.tlsServer.listen(port, function () { console.log('MeshCentral HTTPS web server running on port ' + port + '.'); });
|
obj.tcpServer = obj.tlsServer.listen(port, function () { console.log('MeshCentral HTTPS web server running on port ' + port + ((args.aliasport != null) ? (', alias port ' + args.aliasport) : '') + '.'); });
|
||||||
} else {
|
} else {
|
||||||
obj.tcpServer = obj.tlsServer.listen(port, function () { console.log('MeshCentral HTTPS web server running on ' + certificates.CommonName + ':' + port + '.'); });
|
obj.tcpServer = obj.tlsServer.listen(port, function () { console.log('MeshCentral HTTPS web server running on ' + certificates.CommonName + ':' + port + ((args.aliasport != null) ? (', alias port ' + args.aliasport) : '') + '.'); });
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.tcpServer = obj.app.listen(port, function () { console.log('MeshCentral HTTP web server running on port ' + port + '.'); });
|
obj.tcpServer = obj.app.listen(port, function () { console.log('MeshCentral HTTP web server running on port ' + port + ((args.aliasport != null) ? (', alias port ' + args.aliasport) : '') + '.'); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user