Module dependency cleanup.

Ylian Saint-Hilaire committed Mar 25, 2019 at 11:32 UTC ac6c39dabe52de28137612b65b4df40d80984821
11 files changed +16631 -49
meshcentral.js
+18 -22
@@ -1606,23 +1606,16 @@ function InstallModules(modules, func) {
1606 // Check if a module is present and install it if missing
1607 var InstallModuleChildProcess = null;
1608 function InstallModule(modulename, func, tag1, tag2) {
1609 - try {
1610 - var module = require(modulename);
1611 - } catch (e) {
1612 - console.log('Installing ' + modulename + '...');
1613 - var child_process = require('child_process');
1614 -
1615 - // Looks like we need to keep a global reference to the child process object for this to work correctly.
1616 - InstallModuleChildProcess = child_process.exec('npm install ' + modulename + ' --no-optional --save', { maxBuffer: 512000, timeout: 10000 }, function (error, stdout, stderr) {
1617 - InstallModuleChildProcess = null;
1618 - if (error != null) { console.log('ERROR: Unable to install missing package \'' + modulename + '\', make sure npm is installed: ' + error); process.exit(); return; }
1619 - func(tag1, tag2);
1620 - return;
1621 - });
1622 -
1609 + console.log('Installing ' + modulename + '...');
1610 + var child_process = require('child_process');
1611 +
1612 + // Looks like we need to keep a global reference to the child process object for this to work correctly.
1613 + InstallModuleChildProcess = child_process.exec('npm install ' + modulename + ' --no-optional --save', { maxBuffer: 512000, timeout: 10000 }, function (error, stdout, stderr) {
1614 + InstallModuleChildProcess = null;
1615 + if (error != null) { console.log('ERROR: Unable to install missing package \'' + modulename + '\', make sure npm is installed: ' + error); process.exit(); return; }
1616 + func(tag1, tag2);
1617 return;
1624 - }
1625 - func(tag1, tag2);
1618 + });
1619 }
1620
1621 // Detect CTRL-C on Linux and stop nicely
@@ -1640,10 +1633,12 @@ function mainStart(args) {
1633 var config = getConfig(false);
1634 if (config == null) { process.exit(); }
1635
1643 - // Check is Windows SSPI will be used
1636 + // Check is Windows SSPI and YubiKey OTP will be used
1637 var sspi = false;
1638 var allsspi = true;
1646 - if (require('os').platform() == 'win32') { for (var i in config.domains) { if (config.domains[i].auth == 'sspi') { sspi = true; } else { allsspi = false; } } }
1639 + var yubikey = false;
1640 + if (require('os').platform() == 'win32') { for (var i in config.domains) { if (config.domains[i].auth == 'sspi') { sspi = true; } else { allsspi = false; } } } else { allsspi = false; }
1641 + for (var i in config.domains) { if (config.domains[i].yubikey != null) { yubikey = true; } }
1642
1643 // Build the list of required modules
1644 var modules = ['ws', 'nedb', 'https', 'yauzl', 'xmldom', 'express', 'archiver', 'multiparty', 'node-forge', 'express-ws', 'compression', 'body-parser', 'connect-redis', 'express-handlebars'];
@@ -1651,6 +1646,7 @@ function mainStart(args) {
1646 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
1647 if (config.settings.mongodb != null) { modules.push('mongojs'); } // Add MongoDB
1648 if (config.smtp != null) { modules.push('nodemailer'); } // Add SMTP support
1649 + if (yubikey == true) { modules.push('yubikeyotp'); } // Add YubiKey OTP support
1650
1651 // Get the current node version
1652 var nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
@@ -1658,9 +1654,9 @@ function mainStart(args) {
1654 // If running NodeJS < 8, install "util.promisify"
1655 if (nodeVersion < 8) { modules.push('util.promisify'); }
1656
1661 - // if running NodeJS 8 or higher, we can install WebAuthn/FIDO2 support
1662 - if ((nodeVersion >= 8) && (allsspi == false)) { modules.push('@davedoesdev/fido2-lib'); }
1663 -
1657 + // if not all SSPI, WebAuthn/FIDO2 or U2F support depending on the NodeJS version. FIDO2 does not work below NodeJS 8.x
1658 + if (allsspi == false) { modules.push('otplib'); if (nodeVersion >= 8) { modules.push('@davedoesdev/fido2-lib'); } else { modules.push('authdog'); } }
1659 +
1660 // Install any missing modules and launch the server
1661 InstallModules(modules, function () { meshserver = CreateMeshCentralServer(config, args); meshserver.Start(); });
1662 });
@@ -1670,4 +1666,4 @@ if (require.main === module) {
1666 mainStart(require('minimist')(process.argv.slice(2))); // Called directly, launch normally.
1667 } else {
1668 module.exports.mainStart = mainStart; // Required as a module, useful for winservice.js
1673 -}
\ No newline at end of file
1669 +}
meshuser.js
+19 -10
@@ -1773,7 +1773,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1773 const twoStepLoginSupported = ((domain.auth != 'sspi') && (parent.parent.certificates.CommonName.indexOf('.') != -1) && (args.lanonly !== true) && (args.nousers !== true));
1774 if (twoStepLoginSupported) {
1775 // Request a one time password to be setup
1776 - const otplib = require('otplib');
1776 + var otplib = null;
1777 + try { otplib = require('otplib'); } catch (ex) { }
1778 + if (otplib == null) { break; }
1779 const secret = otplib.authenticator.generateSecret(); // TODO: Check the random source of this value.
1780 ws.send(JSON.stringify({ action: 'otpauth-request', secret: secret, url: otplib.authenticator.keyuri(user.name, parent.certificates.CommonName, secret) }));
1781 }
@@ -1785,7 +1787,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1787 const twoStepLoginSupported = ((domain.auth != 'sspi') && (parent.parent.certificates.CommonName.indexOf('.') != -1) && (args.lanonly !== true) && (args.nousers !== true));
1788 if (twoStepLoginSupported) {
1789 // Perform the one time password setup
1788 - const otplib = require('otplib');
1790 + var otplib = null;
1791 + try { otplib = require('otplib'); } catch (ex) { }
1792 + if (otplib == null) { break; }
1793 otplib.authenticator.options = { window: 2 }; // Set +/- 1 minute window
1794 if (otplib.authenticator.check(command.token, command.secret) === true) {
1795 // Token is valid, activate 2-step login on this account.
@@ -1853,8 +1857,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1857 }
1858 case 'otp-hkey-get':
1859 {
1856 -
1857 -
1860 // Check is 2-step login is supported
1861 const twoStepLoginSupported = ((domain.auth != 'sspi') && (parent.parent.certificates.CommonName.indexOf('.') != -1) && (args.lanonly !== true) && (args.nousers !== true));
1862 if (twoStepLoginSupported == false) break;
@@ -1887,10 +1889,12 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1889 case 'otp-hkey-yubikey-add':
1890 {
1891 // Yubico API id and signature key can be requested from https://upgrade.yubico.com/getapikey/
1892 + var yubikeyotp = null;
1893 + try { yubikeyotp = require('yubikeyotp'); } catch (ex) { }
1894
1895 // Check is 2-step login is supported
1896 const twoStepLoginSupported = ((domain.auth != 'sspi') && (parent.parent.certificates.CommonName.indexOf('.') != -1) && (args.lanonly !== true) && (args.nousers !== true));
1893 - if ((twoStepLoginSupported == false) || (typeof command.otp != 'string')) {
1897 + if ((yubikeyotp == null) || (twoStepLoginSupported == false) || (typeof command.otp != 'string')) {
1898 ws.send(JSON.stringify({ action: 'otp-hkey-yubikey-add', result: false, name: command.name }));
1899 break;
1900 }
@@ -1904,7 +1908,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1908 // TODO: Check if command.otp is modhex encoded, reject if not.
1909
1910 // Query the YubiKey server to validate the OTP
1907 - var yubikeyotp = require('yubikeyotp');
1911 var request = { otp: command.otp, id: domain.yubikey.id, key: domain.yubikey.secret, timestamp: true }
1912 if (domain.yubikey.proxy) { request.requestParams = { proxy: domain.yubikey.proxy }; }
1913 yubikeyotp.verifyOTP(request, function (err, results) {
@@ -1934,16 +1937,19 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1937 }
1938 case 'otp-hkey-setup-request':
1939 {
1940 + var authdoglib = null;
1941 + try { authdoglib = require('authdog'); } catch (ex) { }
1942 +
1943 // Check is 2-step login is supported
1944 const twoStepLoginSupported = ((domain.auth != 'sspi') && (parent.parent.certificates.CommonName.indexOf('.') != -1) && (args.lanonly !== true) && (args.nousers !== true));
1939 - if (twoStepLoginSupported == false) break;
1945 + if ((authdoglib == null) || (twoStepLoginSupported == false)) break;
1946
1947 // Build list of known keys
1948 var knownKeys = [];
1949 if (user.otphkeys != null) { for (var i = 0; i < user.otphkeys.length; i++) { if (user.otphkeys[i].type == 1) { knownKeys.push(user.otphkeys[i]); } } }
1950
1951 // Build a key registration request and send it over
1946 - require('authdog').startRegistration('https://' + parent.parent.certificates.CommonName, knownKeys, { requestId: 556, timeoutSeconds: 100 }).then(function (registrationRequest) {
1952 + authdoglib.startRegistration('https://' + parent.parent.certificates.CommonName, knownKeys, { requestId: 556, timeoutSeconds: 100 }).then(function (registrationRequest) {
1953 // Save registration request to session for later use
1954 obj.hardwareKeyRegistrationRequest = registrationRequest;
1955
@@ -1957,12 +1963,15 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1963 }
1964 case 'otp-hkey-setup-response':
1965 {
1966 + var authdoglib = null;
1967 + try { authdoglib = require('authdog'); } catch (ex) { }
1968 +
1969 // Check is 2-step login is supported
1970 const twoStepLoginSupported = ((domain.auth != 'sspi') && (parent.parent.certificates.CommonName.indexOf('.') != -1) && (args.lanonly !== true) && (args.nousers !== true));
1962 - if ((twoStepLoginSupported == false) || (command.response == null) || (command.name == null) || (obj.hardwareKeyRegistrationRequest == null)) break;
1971 + if ((authdoglib == null) || (twoStepLoginSupported == false) || (command.response == null) || (command.name == null) || (obj.hardwareKeyRegistrationRequest == null)) break;
1972
1973 // Check the key registration request
1965 - require('authdog').finishRegistration(obj.hardwareKeyRegistrationRequest, command.response).then(function (registrationStatus) {
1974 + authdoglib.finishRegistration(obj.hardwareKeyRegistrationRequest, command.response).then(function (registrationStatus) {
1975 var keyIndex = parent.crypto.randomBytes(4).readUInt32BE(0);
1976 ws.send(JSON.stringify({ action: 'otp-hkey-setup-response', result: true, name: command.name, index: keyIndex }));
1977 if (user.otphkeys == null) { user.otphkeys = []; }
package - Copy.json new
+57
@@ -0,0 +1,57 @@
1 +{
2 + "name": "meshcentral",
3 + "version": "0.3.0-x",
4 + "keywords": [
5 + "Remote Management",
6 + "Intel AMT",
7 + "Active Management",
8 + "Remote Desktop"
9 + ],
10 + "homepage": "http://meshcommander.com",
11 + "description": "Web based remote computer management and file server",
12 + "author": "Ylian Saint-Hilaire <ysainthilaire@hotmail.com>",
13 + "main": "meshcentral.js",
14 + "bin": {
15 + "meshcentral": "./bin/meshcentral"
16 + },
17 + "license": "Apache-2.0",
18 + "files": [
19 + "*.js",
20 + "sample-config.json",
21 + "license.txt",
22 + "readme.txt",
23 + "agents",
24 + "public",
25 + "views",
26 + "bin"
27 + ],
28 + "dependencies": {
29 + "archiver": "^3.0.0",
30 + "authdog": "^0.1.1",
31 + "body-parser": "^1.18.2",
32 + "compression": "^1.7.3",
33 + "connect-redis": "^3.4.0",
34 + "cookie-session": "^2.0.0-beta.3",
35 + "express": "^4.16.4",
36 + "express-handlebars": "^3.0.0",
37 + "express-ws": "^4.0.0",
38 + "ipcheck": "^0.1.0",
39 + "meshcentral": "*",
40 + "minimist": "^1.2.0",
41 + "mongojs": "^2.6.0",
42 + "multiparty": "^4.2.1",
43 + "nedb": "^1.8.0",
44 + "node-forge": "^0.7.6",
45 + "otplib": "^10.0.1",
46 + "ws": "^6.1.2",
47 + "xmldom": "^0.1.27",
48 + "yauzl": "^2.10.0",
49 + "yubikeyotp": "^0.2.0"
50 + },
51 + "devDependencies": {},
52 + "repository": {
53 + "type": "git",
54 + "url": "https://github.com/Ylianst/MeshCentral.git"
55 + },
56 + "readme": "readme.txt"
57 +}
package.json
+2 -5
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.3.0-u",
3 + "version": "0.3.0-y",
4 "keywords": [
5 "Remote Management",
6 "Intel AMT",
@@ -27,7 +27,6 @@
27 ],
28 "dependencies": {
29 "archiver": "^3.0.0",
30 - "authdog": "^0.1.1",
30 "body-parser": "^1.18.2",
31 "compression": "^1.7.3",
32 "connect-redis": "^3.4.0",
@@ -41,11 +40,9 @@
40 "multiparty": "^4.2.1",
41 "nedb": "^1.8.0",
42 "node-forge": "^0.7.6",
44 - "otplib": "^10.0.1",
43 "ws": "^6.1.2",
44 "xmldom": "^0.1.27",
47 - "yauzl": "^2.10.0",
48 - "yubikeyotp": "^0.2.0"
45 + "yauzl": "^2.10.0"
46 },
47 "devDependencies": {},
48 "repository": {
reinstall-modules.bat new
+1
@@ -0,0 +1 @@
1 +npm install archiver authdog body-parser compression connect-redis cookie-session express express-handlebars express-ws ipcheck minimist mongojs multiparty nedb node-forge otplib ws xmldom yauzl yubikeyotp
\ No newline at end of file
views/default-min.handlebars
+13940 -1
@@ -1 +1,13940 @@
1 -<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <style>body{margin:0;padding:0;border:0;color:black;font-size:13px;font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;background-color:#d3d9d6;}#container{background-color:#fff;width:960px;min-width:960px;margin:0 auto;border-top:0;border-right:1px solid #b7b7b7;border-bottom:0;border-left:1px solid #b7b7b7;padding:0;}#masthead{width:auto;margin:0;padding:0;overflow:auto;text-align:right;background-color:#036;width:960px;}#column_l{position:relative;float:left;width:930px;margin:0;padding:0 15px;background-color:#fff;}#footer{clear:both;overflow:auto;width:100%;text-align:center;background-color:#113962;padding-top:5px;padding-bottom:5px;}#masthead img{float:left;}#masthead p{font-size:11px;color:#fff;margin:10px 10px 0;}#footer a{color:#fff;text-decoration:underline;}#footer a:hover{color:#fff;text-decoration:none;}a{color:#036;text-decoration:underline;}.i1{background:url(../images/icons50.png) 0px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i2{background:url(../images/icons50.png) -50px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i3{background:url(../images/icons50.png) -100px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i4{background:url(../images/icons50.png) -150px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i5{background:url(../images/icons50.png) -200px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i6{background:url(../images/icons50.png) -250px 0px;height:50px;width:50px;cursor:pointer;border:none;}.j1{background:url(../images/icons16.png) 0px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j2{background:url(../images/icons16.png) -16px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j3{background:url(../images/icons16.png) -32px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j4{background:url(../images/icons16.png) -48px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j5{background:url(../images/icons16.png) -64px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j6{background:url(../images/icons16.png) -80px 0px;height:16px;width:16px;cursor:pointer;border:none;}.lbbutton{width:74px;height:74px;border-radius:5px;background-color:white;margin-left:8px;margin-top:8px;position:relative;cursor:pointer;opacity:0.5;}.lbbutton:hover{opacity:1;}.lbbuttonsel{opacity:0.9;}.lbbuttonsel2{width:82px;border-radius:5px 0px 0px 5px;opacity:1;}.lb1{background:url(../images/leftbar-62.jpg) -0px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb2{background:url(../images/leftbar-62.jpg) -75px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb3{background:url(../images/leftbar-62.jpg) -150px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb4{background:url(../images/leftbar-62.jpg) -225px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb5{background:url(../images/leftbar-62.jpg) -294px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb6{background:url(../images/leftbar-62.jpg) -360px 0px;height:62px;width:62px;cursor:pointer;border:none;}.m0{background :url(../images/images16.png) -32px 0px;height :16px;width :16px;border:none;float:left }.m1{background :url(../images/images16.png) -16px 0px;height :16px;width :16px;border:none;float:left }.m2{background :url(../images/images16.png) -96px 0px;height :16px;width :16px;border:none;float:left }.m3{background :url(../images/images16.png) -112px 0px;height :16px;width :16px;border:none;float:left }.si0{background :url(../images/icons16.png) 0px 0px;height :16px;width :16px;border:none;float:left }.si1{background :url(../images/icons16.png) -16px 0px;height :16px;width :16px;border:none;float:left }.si2{background :url(../images/icons16.png) -32px 0px;height :16px;width :16px;border:none;float:left }.si3{background :url(../images/icons16.png) -48px 0px;height :16px;width :16px;border:none;float:left }.si4{background :url(../images/icons16.png) -64px 0px;height :16px;width :16px;border:none;float:left }.mi{background :url(../images/meshicon50.png) 0px 0px;height:50px;width:50px;cursor:pointer;border:none }#floatframe{position:fixed;top:200px;height:300px;z-index:200;display:none;}.style1{text-align:center;}.style2{text-align:center;background-color:#808080;font-weight:bold;}.style3{text-align:center;color:white;background-color:#808080;font-weight:bold;}.style3x{text-align:center;color:white;background-color:#808080;font-weight:bold;}.style3x:hover{background-color:#606060;}.style3sel{text-align:center;color:white;background-color:#003366;font-weight:bold;}.style4{color:white;text-decoration:none;}.style5{text-align:center;background-color:#808080;font-weight:normal;}.style6{text-align:center;background-color:#D3D9D6;}.style7{font-size:large;background-color:#FFFFFF;}.style10{background-color:#C9C9C9;}.style11{font-size:large;background-color:#C9C9C9;}.style14{text-align:left;background-color:#D3D9D6;}.auto-style1{text-align:right;background-color:#D3D9D6;}.fileIcon1{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb49Y2Sj9LT2f///yH5BAEAAAMALAAAAAAQABAAAAImnI+py+1vhJwyUYAzHTL4D3qdlJWaIFJqmKod607sDKIiDUP63hQAOw==);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.fileIcon2{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAM2xV/Xur+XPgP///yH5BAEAAAMALAAAAAAQABAAAAJD3ISZIGHWUGihznesYDYATFVM+D2hJ4lgN1olxALAtAlmPCJvuMmJd6PJckDYwicrHhTD5o7plJmg0Uc0asNMkphHAQA7);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.fileIcon3{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb19IGBgbq6uv///yH5BAEAAAMALAAAAAAQABAAAAIy3ISpxgcPH2ouQgFEw1YmxnUXKEaaEZZnVWZk66JwzKpvuwZzwOgwb/C1gIOA8Yg8DgoAOw==);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.fileIcon4{background:url(../images/meshicon16.png);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.filelist{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;cursor:default;-khtml-user-drag:element;background-color:white;clear:both;}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.fsize{float:right;text-align:right;width:180px;}.g1{background-position:0% 0%;width:14px;height:100%;float:left; background-image:linear-gradient(to right, #ffffff 0%, #c9c9c9 100%);background-color:#c9c9c9;background-repeat:repeat;background-attachment:scroll;}.g1s{background-image:linear-gradient(to right, #ffffff 0%, #b9b9b9 100%);}.g2{background-position:0% 0%;width:14px;height:100%;float:right; background-image:linear-gradient(to right, #c9c9c9 0%, #ffffff 100%);background-color:#c9c9c9;background-repeat:repeat;background-attachment:scroll;}.g2s{background-image:linear-gradient(to right, #b9b9b9 0%, #ffffff 100%);}.h1{background-position:0% 0%;width:14px;height:100%; background-image:linear-gradient(to right, #ffffff 0%, #d3d9d6 100%);background-color:#d3d9d6;background-repeat:repeat;background-attachment:scroll;}.h2{background-position:0% 0%;width:14px;height:100%; background-image:linear-gradient(to right, #d3d9d6 0%, #ffffff 100%);background-color:#d3d9d6;background-repeat:repeat;background-attachment:scroll;}.e1{font-size:large;margin-top:4px;margin-bottom:3px;overflow:hidden;word-wrap:hyphenate;white-space:nowrap;text-overflow:ellipsis;}.e2{float:left;height:100%;background-color:#c9c9c9;}.e2s{background-color:#b9b9b9;}.bar{font-size:large;background-color:#C9C9C9;height:24px;float:left;margin-bottom:2px;}.bar2{font-size:large;height:24px;float:left;margin-bottom:2px;}.bar18{font-size:large;background-color:#C9C9C9;height:18px;float:left;margin-bottom:2px;}.bar182{font-size:large;height:18px;float:left;margin-bottom:2px;}.devHeaderx{color:lightgray;}.DevSt{border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#DDDDDD;}.contextMenu{background:#F9F9F9;box-shadow:0 0 12px rgba( 0, 0, 0, .3 );border:1px solid #ccc; display:none;position:absolute;top:0;left:0;list-style:none;margin:0;padding:5px;min-width:100px;max-width:150px;z-index:500;}.cmtext{color:#444;display:inline-block;padding-left:8px;padding-right:8px;padding-top:5px;padding-bottom:5px;text-decoration:none;width:85%;cursor:default;overflow:hidden;position:relative;}.cmtext:hover{color:#f9f9f9;background:#444;}.gray{ filter:gray; -webkit-filter:grayscale(100%) opacity(60%); }.unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.notifiyBox{position:absolute;z-index:1000;top:50px;right:26px;width:300px;text-align:left;background-color:#F0ECCD;border:4px solid #666;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;-webkit-box-shadow:2px 2px 4px #888;-moz-box-shadow:2px 2px 4px #888;box-shadow:2px 2px 4px #888;max-height:200px;}.notifiyBox:before{content:' ';position:absolute;width:0;height:0;right:5px;top:-30px;border:15px solid;border-color:transparent #666 #666 transparent;}.notifiyBox:after{content:' ';position:absolute;width:0;height:0;right:7px;top:-24px;border:12px solid;border-color:transparent #F0ECCD #F0ECCD transparent;}.notification{width:100%;min-height:30px;}.notification:hover{background-color:#EFE8B6;}.deskToolsBar{padding:3px;}.deskToolsBar:hover{background-color:#EFE8B6;}.userTableHeader{border-bottom:1pt solid lightgray;padding-top:4px;padding-bottom:4px;}.viewSelector{width:32px;height:32px;background-color:#DDD;border-radius:3px;float:left;margin-left:5px;cursor:pointer;opacity:0.3;}.viewSelectorSel{background-color:#BBB;opacity:0.8;}.viewSelector:hover{opacity:0.5;background-color:#AAA;}.viewSelector1{margin-left:2px;margin-top:2px;background:url(../images/views.png) -0px 0px;height:28px;width:28px;}.viewSelector2{margin-left:2px;margin-top:2px;background:url(../images/views.png) -28px 0px;height:28px;width:28px;}.viewSelector3{margin-left:2px;margin-top:2px;background:url(../images/views.png) -56px 0px;height:28px;width:28px;}.viewSelector4{margin-left:2px;margin-top:2px;background:url(../images/views.png) -84px 0px;height:28px;width:28px;}.viewSelector5{margin-left:2px;margin-top:2px;background:url(../images/views.png) -112px 0px;height:28px;width:28px;}.backButtonEx{margin-left:2px;margin-top:2px;background:url(../images/views.png) -140px 0px;height:28px;width:28px;}.backButton{width:32px;height:32px;background-color:#DDD;border-radius:3px;float:left;margin-right:5px;cursor:pointer;opacity:0.3;}.backButton:hover{opacity:0.5;background-color:#AAA;}.hoverButton{opacity:0.5;}.hoverButton:hover{opacity:1;}</style> <style>.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f;}.ol-mouse-position{top:8px;right:8px;position:absolute;}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute;}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width;}.ol-overlay-container{will-change:left,right,top,bottom;}.ol-unsupported{display:none;}.ol-unselectable, .ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing;}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px;}.ol-control:hover{background-color:rgba(255,255,255,.6);}.ol-zoom{top:.5em;right:.5em;}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear;}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s;}.ol-zoom-extent{top:4.643em;left:.5em;}.ol-full-screen{right:.5em;top:.5em;}@media print{.ol-control{display:none;}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px;}.ol-control button::-moz-focus-inner{border:none;padding:0;}.ol-zoom-extent button{line-height:1.4em;}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform;}.ol-touch .ol-control button{font-size:1.5em;}.ol-touch .ol-zoom-extent{top:5.5em;}.ol-control button:focus, .ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7);}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0;}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px;}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff;}.ol-attribution li{display:inline;list-style:none;line-height:inherit;}.ol-attribution li:not(:last-child):after{content:" ";}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle;}.ol-attribution button, .ol-attribution ul{display:inline-block;}.ol-attribution.ol-collapsed ul{display:none;}.ol-attribution.ol-logo-only ul{display:block;}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em;}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em;}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em;}.ol-attribution.ol-logo-only button, .ol-attribution.ol-uncollapsible button{display:none;}.ol-zoomslider{top:4.5em;left:.5em;height:200px;}.ol-zoomslider button{position:relative;height:10px;}.ol-touch .ol-zoomslider{top:5.5em;}.ol-overviewmap{left:.5em;bottom:.5em;}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0;}.ol-overviewmap .ol-overviewmap-map, .ol-overviewmap button{display:inline-block;}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px;}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute;}.ol-overviewmap.ol-collapsed .ol-overviewmap-map, .ol-overviewmap.ol-uncollapsible button{display:none;}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7);}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move;}</style> <style> .ol-ctx-menu-container{position:absolute;padding:8px;background:#fff;color:#222;font-size:13px;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,.2);box-sizing:border-box}.ol-ctx-menu-container a,.ol-ctx-menu-container div,.ol-ctx-menu-container img,.ol-ctx-menu-container li,.ol-ctx-menu-container span,.ol-ctx-menu-container ul{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}.ol-ctx-menu-container a img{border:none}.ol-ctx-menu-container *,.ol-ctx-menu-container :after,.ol-ctx-menu-container :before{box-sizing:inherit}.ol-ctx-menu-container.ol-ctx-menu-hidden{opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container ul{list-style:none}.ol-ctx-menu-container li{position:relative;line-height:20px;padding:2px 5px}.ol-ctx-menu-container li:not(.ol-ctx-menu-separator):hover{cursor:pointer;background-color:#333;color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-submenu .ol-ctx-menu-container{border:1px solid #eee;padding:8px;top:0;opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover .ol-ctx-menu-container{opacity:1;visibility:visible;-webkit-transition-delay:0s;transition-delay:0s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:after{position:absolute;top:7px;right:10px;content:"";display:inline-block;width:.6em;height:.6em;border-right:.3em solid #222;border-top:.3em solid #222;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover:after{border-color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-separator{padding:0}.ol-ctx-menu-container li.ol-ctx-menu-separator hr{border:0;height:1px;background-image:-webkit-linear-gradient(right,transparent,rgba(0,0,0,.75),transparent);background-image:linear-gradient(270deg,transparent,rgba(0,0,0,.75),transparent)}.ol-ctx-menu-icon{text-indent:20px;background-size:20px auto;background-repeat:no-repeat;background-position:0}.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABaUlEQVQ4T72U7VHCQBCGn90GtAMuNGCswFiBWIFQgWMFxg6wArECsQKhArEBiB1Qwa1zgQn5IAYcxv13k71n3919L8KJQ07M47+BzgG9TRfZ/JBuWhS6BJFHRJICYrZGZIz3z5Ct2+B7gG6I6kt+wewdkQVwjtkAkR5mC8yu26A1oItR/cTsOweQBdgutD8G7jGm2PJ2n8oqUKIpIjd4HxTM8gvaT/F+AlmWnyWaIXKF95eNguFzTYFhNsdWu9kFgFlaFMANUH3D8wDLoLgSTSD2il8NCe2ZXQBxWDGwxmyUzzOMBZ7wy7Qb2K0wQfXjMOBuhlFpZtNty5sFaTQBuTusZdymeqs1SpYKcO9HkE3KbTd9WFijMHJQ5hBNEAYNq5Qd0dhyke0GiE4QzjqfW23mHT8Hl4DG4Lce3FPE7AtbBSdsbNqpoJLgYkRnNeUV+xwJDHTnUEkxHGbhBXUs5TjJjew/KPy94g+NRaIVRYmMXwAAAABJRU5ErkJggg==")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABc0lEQVQ4T71U21ECQRDsJgGdvQDECMQIxAjECMQILCPwzAAjECIQI0AiEDPQAPaWCBhrcKHuCUcV5f7dY3v6tUscefHIePhfwBBCF8CZqRCReRs1tQxDCH1VfQLQz4EsSY4AvIjIsgm8AhhCGKrqa9zwrqoLAKckB5HtguR1E2gBMITQU9VPAD8GICIGtl3e+xHJBwBT59xtHcsCYJZlUwA3kcGHbfDep51OZywi3/acZZm9vyJ5WR5o38uACmDunNt6ZwAkUxFZDwghDFT1jeSjiJinhVUBVNVJkiTDKO8CQA+AsbNQ7s1Ps0VVn5MkSfcCtmBoDZi1Bdx4eJ7zbBolrwPy3o9J3rWSHPs3A1BbjVKlYBaIyDgvu9LDXDU2RTZmXVW1oKyLxRD+OrkOrJLy5mVM0iaftDhuhVbsvBzMglzKUNW6IV/OOWtCM8MmVvEkmbwt83LaB19fdgOtVquUZJeknaDdobTwbOcvBzPcN/AXH1DFFWP7u9oAAAAASUVORK5CYII=")}.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABU0lEQVQ4T72U7VECMRRFz3sNaAdkacC1AtcKxApcKnCsQOwAK3CtQKxAqEBsANYOqCDPyTIC+8WCw5jfybn33dxEOPGSE/P4b6BzQG89RT47ZJoWhy5B5BGRZAMxWyEyxvtnyFdt8AagS1F9KQ6YvSMyB84xGyDSw2yO2XUbtAJ0MaqfmH0XAPIA2y7tj4F7jAm2uG1yWQZKNEHkBu+Dg2njWBJNEbnC+8uaIFRuWfuG2QxbbrOrUd0A1Tc8D7AIjkur7DAAsVf8MiWMZ3ZR2m02LPIMscATfjHqBnY7TFD9OAy4zTCCPG/MUKMM5O6wkXFr9dZq7FQqqHk/hDzbFa73cFONTZFDdRyiCcKg5rrSiLaXkiI6RjjrfG6VzDs+B5eAxuDXeYpmNRGzL2wZ/wof+du4GNFpBVqqz5HA4MM5VEYYDrOs+1I6Q9u/4Q8O9wN/AGgWjBVqQjjgAAAAAElFTkSuQmCC")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABYklEQVQ4T72U4VHCQBCF36tA91KAWIFYgViBWIFYgWMFYgdYgVCBWAFSgdiBFpAsFWSdxcDkQoBkhnF/ZjbfvX377ogjF4/Mw/8CVbUD4MynEJF5k2lqFapqz8yeAPRKkCXJEYAXEVnugm8BVXVgZq/FD+9mtgBwSrJfqF2QvN4FjYCq2jWzTwA/DhARh20qTdMRyQcA0xDCbZ3KCJhl2RTATaHgo+6HLMv8+xXJy+qB3l8FGoB5CKHsXcRV1b6ZvZF8FBH3NKotoJlNkiQZFONdlLtJ3rufbouZPSdJMjwIbKDQEzBrClx7eC4i33Uepmk6JnnXaOQifzMAtdGoRApugYiMI1uqKkrRWAfZo9MxM1+UZzFewl8mN4nYdVM83L7BkwbXLUrF3sfBLQDQBbDy08x8vOohXyEE71lVq9emuEk+3gZa3XYroCvwFyjP8yHJDsnxwaU08GxvS2uFhw78BbzWrxXgMbsHAAAAAElFTkSuQmCC")}</style> <script type="text/javascript" src="scripts/charts.js"></script> <script type="text/javascript" src="scripts/filesaver.1.1.20151003.js"></script> <script type="text/javascript" src="scripts/ol.js"></script> <script type="text/javascript" src="scripts/ol3-contextmenu.js"></script> <title>MeshCentral</title> </head> <body id="body" onload="if (typeof(startup) !== 'undefined') startup();" oncontextmenu="handleContextMenu(event)" style="display:none"> <div id="contextMenu" class="contextMenu noselect" style="display:none"> <div id="cxinfo" class="cmtext" onclick="cmaction(1,event)"><b>Information</b></div> <div id="cxdesktop" class="cmtext" onclick="cmaction(3,event)">Desktop</div> <div id="cxterminal" class="cmtext" onclick="cmaction(2,event)">Terminal</div> <div id="cxfiles" class="cmtext" onclick="cmaction(4,event)">Files</div> <div id="cxevents" class="cmtext" onclick="cmaction(5,event)">Events</div> <div id="cxconsole" class="cmtext" onclick="cmaction(6,event)">Console</div> <hr id="cxmgroupsplit"> <div id="cxmdesktop" class="cmtext" onclick="cmaction(7,event)" style="display:none">Multi-Desktop</div> </div> <div id="meshContextMenu" class="contextMenu,noselect" style="display:none;min-width:0px"> <div id="cxselectall" class="cmtext" onclick="cmmeshaction(1,event)">Select All</div> <div id="cxselectnone" class="cmtext" onclick="cmmeshaction(2,event)">Select None</div> <hr id="cxmgroupsplit2" style="display:none"> <div id="cxmmdesktop" class="cmtext" style="display:none" onclick="cmmeshaction(3,event)">Multi-Desktop</div> </div> <div id="container" style="max-height:100vh;position:relative"> <div id="notifiyBox" class="notifiyBox" style="display:none"></div> <div id="mastheadx"></div> <div id="masthead" class="noselect" style="background:url(logo.png) 0px 0px;background-color:#036;background-repeat:no-repeat;height:66px;width:100%;overflow:hidden"> <div style="float:left;height:66px;color:#c8c8c8;padding-left:20px;padding-top:8px"> <strong><font style="font-size:46px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong> </div> <div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:14px"> <strong><font style="font-size:14px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong> </div> <div style="float:right"> <div id="notificationCount" onclick="clickNotificationIcon()" class="unselectable" style="display:none;min-width:28px;font-size:20px;border-radius:5px;background-color:lightblue;text-align:center;margin:8px;cursor:pointer;padding:4px" title="Click to view current notifications">0</div> </div> <p id="logoutControl">{{{logoutControl}}}</p> </div> <div id="page_leftbar" style="height:calc(100vh - 66px);width:90px;position:absolute;z-index:1000;background:#113962;background:linear-gradient(to bottom, #104893 0%,#113962 100%);color:white;display:none"> <div style="height:16px"></div> <div id="LeftMenuMyDevices" class="lbbutton lbbuttonsel" title="My Devices" onclick="go(1)"> <div class="lb2" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyAccount" class="lbbutton" title="My Account" onclick="go(2)"> <div class="lb1" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyEvents" class="lbbutton" title="My Events" onclick="go(3)"> <div class="lb3" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyFiles" class="lbbutton" title="My Files" onclick="go(5)"> <div class="lb4" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyUsers" class="lbbutton" title="My Users" onclick="go(4)"> <div class="lb5" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyServer" class="lbbutton" title="My Server" onclick="go(6)" style="display:none"> <div class="lb6" style="position:absolute;top:6px;left:6px"></div> </div> </div> <div id="page_content" style="max-height:calc(100vh - 130px)"> <div id="topbarmaster"> <div id="topbar" class="noselect"> <div> <div style="position:relative"> <div style="position:absolute;top:3px;right:6px"> <span title="Toggle full width" style="cursor:pointer;color:white" onclick="toggleFullScreen(1)">&harr;</span> </div> <table id="MainMenuSpan" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="MainMenuMyDevices" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(1)">My Devices</td> <td id="MainMenuMyAccount" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(2)">My Account</td> <td id="MainMenuMyEvents" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(3)">My Events</td> <td id="MainMenuMyFiles" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(5)">My Files</td> <td id="MainMenuMyUsers" style="width:100px;height:24px;cursor:pointer;display:none" class="style3x" onclick="go(4)">My Users</td> <td id="MainMenuMyServer" style="width:100px;height:24px;cursor:pointer;display:none" class="style3x" onclick="go(6)">My Server</td> <td class="style3" style="text-align:right;height:24px">&nbsp;</td> </tr> </table> <div id="MainSubMenuSpan" style="display:none"> <table id="MainSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="MainDev" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(10)">General</td> <td id="MainDevDesktop" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(11)">Desktop</td> <td id="MainDevTerminal" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(12)">Terminal</td> <td id="MainDevFiles" style="width:100px;height:24px;cursor:pointer;display:none" class="style3x" onclick="go(13)">Files</td> <td id="MainDevEvents" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(16)">Events</td> <td id="MainDevAmt" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(14)">Intel&reg; AMT</td> <td id="MainDevConsole" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(15)">Console</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="MeshSubMenuSpan" style="display:none"> <table id="MeshSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="MeshGeneral" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(20)">General</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="UserSubMenuSpan" style="display:none"> <table id="UserSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="UserGeneral" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(30)">General</td> <td id="UserEvents" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(31)">Events</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="ServerSubMenuSpan" style="display:none"> <table id="ServerSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="ServerGeneral" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(6)">General</td> <td id="ServerConsole" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(115)">Console</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="UserDummyMenuSpan"> <table id="UserDummyMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr><td class="style3" style="text-align:right;height:24px">&nbsp;</td></tr> </table> </div> </div> </div> </div> </div> <div id="column_l"> <div id="p0" style="display:none"> <div id="p0message" style="margin:50px;text-align:center"><span id="p0span">Server disconnected</span>, <href onclick="reload()" style="cursor:pointer"><u>click to reconnect</u></href>.</div> </div> <div id="p1" style="display:none"> <div style="float:right;display:none" id="devListToolbarViewIcons"> <div id="devViewButton1" class="viewSelector" onclick="onDeviceViewChange(1)" title="Columns"><div class="viewSelector2"></div></div> <div id="devViewButton2" class="viewSelector" onclick="onDeviceViewChange(2)" title="List"><div class="viewSelector1"></div></div> <div id="devViewButton3" class="viewSelector" onclick="onDeviceViewChange(3)" title="Desktops"><div class="viewSelector3"></div></div> <div id="devViewButton4" class="viewSelector" onclick="onDeviceViewChange(4)" title="Map"><div class="viewSelector4"></div></div> </div><div><h1>My Devices</h1></div> <table class="noselect" style="width:100%;height:24px;background-color:#d3d9d6;vertical-align:middle;border-spacing:0"> <tr> <td class="h1"></td> <td id="devListToolbar" class="style14" style="display:none"> &nbsp;&nbsp;<input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All">&nbsp; <input type="button" id="GroupActionButton" disabled="disabled" value="Group Action" onclick="groupActionFunction()">&nbsp; <input id="SearchInput" type="text" style="width:120px" placeholder="Filter" onchange="masterUpdate(5)" onkeyup="masterUpdate(5)" autocomplete="off" onfocus="onSearchFocus(1)" onblur="onSearchFocus(0)">&nbsp; <label><input type="checkbox" id="RealNameCheckBox" onclick="onRealNameCheckBox()"><span title="Show devices operating system name">OS Name</span></label> </td> <td id="kvmListToolbar" class="style14" style="height:100%;display:none"> &nbsp;&nbsp;<input type="button" onclick="connectAllKvmFunction()" value="Connect All">&nbsp; <input type="button" onclick="disconnectAllKvmFunction()" value="Disconnect All">&nbsp; <label><input type="checkbox" id="autoConnectDesktopCheckbox" onclick="autoConnectDesktops(event)" title="Automatic connect">Auto&nbsp;</label> <input type="button" onclick="showMultiDesktopSettings()" value="Settings">&nbsp; </td> <td id="devMapToolbar" class="style14" style="height:100%;display:none"> &nbsp;&nbsp;<input type="text" id="mapSearchLocation" placeholder="Search Location" onfocus="onMapSearchFocus(1)" onblur="onMapSearchFocus(0)"> <input type="button" value="Search" title="Search for location" onclick="getSearchLocation()"> <input type="button" id="refreshmap" title="Reset map view" value="Reset" style="margin-left:5px" onclick="refreshMap(false,true)"> </td> <td class="auto-style1" style="height:100%"> <div style="float:right;display:none" id="devListToolbarView"> View <select id="viewselect" onchange="onDeviceViewChange()"> <option value="1">Columns <option value="2">List <option value="3">Desktops <option id="viewselectmapoption" value="4">Map </select> </div> <div style="float:right;display:none" id="devListToolbarSort"> Sort <select id="sortselect" onchange="masterUpdate(6)"> <option>Group <option>Power <option>Device <option>Tags </select> &nbsp; </div> <div style="float:right;display:none" id="devListToolbarSize"> Size <select id="sizeselect" onchange="onDeviceViewChange()"> <option value="0">Small <option value="1">Medium <option value="2">Large </select> &nbsp; </div> </td> <td class="h2"></td> </tr> </table> <div id="NoMeshesPanel" style="display:none"> <table style="width:100%;padding:20px"> <tr> <td valign="top" style="width:50px"> <img src="images/info.png" height="48" width="47"> </td> <td> To get started, <a onclick="account_createMesh()" style="cursor:pointer"><strong>click here to create a device group</strong></a>. </td> </tr> </table> </div> <div id="xdevices" class="noselect" style="max-height:calc(100vh - 239px);overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;display:none"></div> <div id="xdevicesmap" style="height:calc(100vh - 239px);width:100%;overflow:hidden;position:relative;display:none"> <div id="xmapSearchResultsDlg" style="position:absolute;display:none;max-height:280px;left:5px;top:5px;max-width:250px;z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="xmapSearchClose" style="float:right;padding:5px;cursor:pointer" onclick="mapCloseSearchWindow()"><b>X</b></div> <div style="padding:5px">Location Results</div> <div style="width:100%;margin:6px"></div> </div> <div id="xmapSearchResults" style="margin:6px"></div> </div> </div> <div id="xmap-info-window" style="text-shadow:0px 0px 15px #FFF"></div> </div> <div id="p2" style="display:none"> <h1>My Account</h1> <img id="p2AccountImage" alt="" width="150" height="103" src="images/mainaccount.jpg" style="margin-bottom:10px;margin-right:20px;float:right"> <div id="p2AccountSecurity" style="display:none"> <p><strong>Account security</strong></p> <div style="margin-left:25px"> <div id="manageAuthApp"><div style="width:15px;display:inline-block"><span id="authAppSetupCheck" style="color:green;font-size:10px"><strong>&#x2713;</strong></span></div><span><a onclick="account_manageAuthApp()" style="cursor:pointer">Manage authenticator app</a><br></span></div> <div id="manageHardwareOtp"><div style="width:15px;display:inline-block"><span id="authKeySetupCheck" style="color:green;font-size:10px"><strong>&#x2713;</strong></span></div><span><a onclick="account_manageHardwareOtp(0)" style="cursor:pointer">Manage security keys</a><br></span></div> <div id="manageOtp"><div style="width:15px;display:inline-block"><span id="authCodesSetupCheck" style="color:green;font-size:10px"><strong>&#x2713;</strong></span></div><span><a onclick="account_manageOtp(0)" style="cursor:pointer">Manage backup codes</a><br></span></div> </div> </div> <div id="p2AccountActions"> <p><strong>Account actions</strong></p> <p style="margin-left:40px"> <span id="verifyEmailId" style="display:none"><a onclick="account_showVerifyEmail()" style="cursor:pointer">Verify email</a><br></span> <a onclick="account_showChangeEmail()" style="cursor:pointer">Change email address</a><br> <a onclick="account_showChangePassword()" style="cursor:pointer">Change password</a><span id="p2nextPasswordUpdateTime"></span><br> <a onclick="account_showDeleteAccount()" style="cursor:pointer">Delete account</a><br> </p> <br style="clear:both"> </div> <strong>Device Groups</strong> ( <a onclick="account_createMesh()" style="cursor:pointer"><img height="12" src="images/icon-addnew.png" width="12" border="0"> New</a> ) <br><br> <div id="p2meshes"></div> <div id="p2noMeshFound" style="margin-left:40px;display:none">No device groups. <a onclick="account_createMesh()" style="cursor:pointer"><strong>Get started here!</strong></a></div> <br style="clear:both"> </div> <div id="p3" style="display:none"> <h1>My Events</h1> <table style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px;vertical-align:middle;border-spacing:0"> <tr> <td class="h1"></td> <td>&nbsp;<input id="p2deleteall" type="button" onclick="showDeleteAllEventsDialog()" style="display:none" value="Delete All..."></td> <td class="auto-style1"> Show <select id="p3limitdropdown" onchange="refreshEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> </td> <td class="h2"></td> </tr> </table> <div id="p3events" style="height:calc(100vh - 243px);overflow-y:scroll"></div> </div> <div id="p4" style="display:none"> <h1>My Users</h1> <table style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px;vertical-align:middle;border-spacing:0"> <tr> <td class="h1"></td> <td class="style14"> <div style="float:right"> <input type="button" onclick="showUserBroadcastDialog()" style="margin-right:6px" value="Broadcast"> </div> <div> <input id="UserNewAccountButton" type="button" style="margin-left:6px" onclick="showCreateNewAccountDialog()" value="New Account..."> <input id="UserSearchInput" type="text" style="width:120px;margin-left:6px" placeholder="Filter" onchange="onUserSearchInputChanged()" onkeyup="onUserSearchInputChanged()" autocomplete="off" onfocus="onUserSearchFocus(1)" onblur="onUserSearchFocus(0)"> </div> </td> <td class="h2"></td> </tr> </table> <div id="p3users" style="max-height:calc(100vh - 243px);overflow-y:auto"></div> </div> <div id="p5" style="display:none"> <h1>My Files</h1> <table id="p5toolbar" style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:100%;background-color:#d3d9d6;text-align:left;padding:4px" valign="bottom"> <div id="p5rightOfButtons" style="float:right;margin-top:3px"></div> <div> <input type="button" id="p5FolderUp" disabled="disabled" onclick="p5folderup();" value="Up">&nbsp; <input type="button" id="p5SelectAllButton" disabled="disabled" onclick="p5selectallfile();" value="Select All" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5RenameFileButton" disabled="disabled" value="Rename" onclick="p5renamefile();" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5DeleteFileButton" disabled="disabled" value="Delete" onclick="p5deletefile();" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5NewFolderButton" disabled="disabled" value="New Folder" onclick="p5createfolder();" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5UploadButton" disabled="disabled" value="Upload" onclick="p5uploadFile()" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5CutButton" disabled="disabled" value="Cut" onclick="p5copyFile(1)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p5CopyButton" disabled="disabled" value="Copy" onclick="p5copyFile(0)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p5PasteButton" disabled="disabled" value="Paste" onclick="p5pasteFile()" onkeypress="return false" onkeydown="return false">&nbsp; </div> </td> </tr> <tr> <td style="background-color:#E4E9E7;height:28px"> <div style="float:right"> <select id="p5sortdropdown" onchange="updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div>&nbsp;&nbsp;<span id="p5currentpath"></span></div> </td> </tr> </table> <div id="p5filetable" style="width:100%;height:calc(100vh - 294px);overflow:auto;-webkit-user-select:none;position:relative"> <div id="p5PublicShare" style="display:none;width:100%;overflow:auto;-webkit-user-select:none;background-color:lightsteelblue"><div style="padding:4px">These files are shared publicly, click "link" to get public url.</div></div> <div id="bigok" style="width:256px;overflow:hidden;position:absolute;left:337px;top:20px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&checkmark;</b></div> <div id="bigfail" style="width:256px;overflow:hidden;position:absolute;left:337px;top:20px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&#10007;</b></div> <span id="p5files"></span> </div> <table id="p5toolbarBottom" style="width:100%" cellpadding="0" cellspacing="0"> <tr><td class="style6" style="text-align:left;padding:3px">&nbsp;<span id="p5bottomstatus"></span></td></tr> </table> </div> <div id="p6" style="display:none"> <img id="MainMeshImage" src="serverpic.ashx" style="border-width:0px;height:200px;width:200px;float:right"> <h1>My Server</h1> <p id="p2ServerActions"><strong>Server actions</strong></p> <p style="margin-left:40px"> <div id="p2ServerActionsBackup" style="margin-left:40px"><a href="/backup.zip" rel="noreferrer noopener" target="_blank" style="cursor:pointer">Download server backup</a></div> <div id="p2ServerActionsRestore" style="margin-left:40px"><a onclick="server_showRestoreDlg()" style="cursor:pointer">Restore server with backup</a></div> <div id="p2ServerActionsVersion" style="margin-left:40px"><a onclick="server_showVersionDlg()" style="cursor:pointer">Check server version</a></div> <div id="p2ServerActionsErrors" style="margin-left:40px"><a onclick="server_showErrorsDlg()" style="cursor:pointer">Show server error log</a></div> </p> <br><strong>Server Statistics</strong><br><br> <div id="serverStats" style="margin-left:40px"> <div id="serverCpuChartView" style="display:none"> <div style="width:60px;display:inline-block"><canvas id="serverCpuChart" style="width:60px;height:60px"></canvas></div> <div style="width:160px;display:inline-block" id="serverCpuChartText"></div> </div> <div id="serverMemoryChartView" style="display:none"> <div style="width:60px;display:inline-block"><canvas id="serverMemoryChart" style="width:60px;height:60px"></canvas></div> <div style="width:160px;display:inline-block" id="serverMemoryChartText"></div> </div><br><br> <div id="serverStatsTable"></div> </div> </div> <div id="p10" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p10title"> <div id="p10BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p10deviceName"></span></h1> </div> <div id="p10html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <a style="cursor:pointer" onclick="p10showiconselector()"><img id="MainComputerImage" style="border-width:0px;height:200px;width:200px"></a> <div style="width:100%;text-align:center"><strong><span id="MainComputerState"></span></strong></div> </td> </tr> </table><br> <div id="p10html2"></div> <div id="p10html3"></div> </div> <div id="p11" class="noselect" style="display:none"> <div id="p11title"> <div id="p11deviceNameHeader"> <div id="p11BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <div style="float:right" id="devListToolbarViewIcons"><div class="viewSelector" onclick="deskToggleFull(event)" title="Full Screen. Hold shift to browser full screen."><div class="viewSelector5"></div></div></div> <h1>Desktop - <span id="p11deviceName"></span></h1> </div> </div> <div id="p14warning" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showFeaturesDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Intel&reg; AMT Redirection port or KVM feature is disabled<span id="p14warninga">, click here to enable it.</span></div> </div> <div id="p14warning2" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showPowerActionDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Remote computer is not powered on, click here to issue a power command.</div> </div> <table id="deskarea0" cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px"> <tr id="deskarea1"> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <span id="p14power"></span>&nbsp; <div style='cursor:pointer;border:none;float:right;font-size:130%;margin-right:4px' title="Rotate Left" onclick="drotate(-1)">&olarr;</div> <div style='cursor:pointer;border:none;float:right;font-size:130%;margin-right:4px' title="Rotate Right" onclick="drotate(1)">&orarr;</div> <input id="deskFocusBtn" type="button" title="Toggle focus mode, when active only the region around the mouse is updated" onkeypress="return false" onkeydown="return false" value="Focus All" onclick="deskToggleFocus()" style="margin-right:3px;display:none"> <input id="deskSaveBtn" type="button" title="Save a screenshot of the remote desktop" onkeypress="return false" onkeydown="return false" value="Save..." onclick="deskSaveImage()" style="margin-right:3px"> <input id="deskActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" style="margin-right:3px"> <input id="deskActionsSettings" type="button" value="Settings..." title="Edit remote desktop settings" onkeypress="return false" onkeydown="return false" onclick="showDesktopSettings()" style="margin-right:3px"> <input type="button" title="Change the power state of the remote machine" onkeypress="return false" onkeydown="return false" value="Power Actions..." onclick="showPowerActionDlg()" style="margin-right:3px;display:none"> </div> <div> <div id="idx_deskFullBtn2" onclick="deskToggleFull(event)" style="float:left;font-size:large;cursor:pointer;display:none">&nbsp;&#x2716;</div> <input type="button" id="autoconnectbutton1" value="AutoConnect" onclick="autoConnectDesktop(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton1span">&nbsp;<input type="button" id="connectbutton1" value="Connect" onclick="connectDesktop(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton1hspan">&nbsp;<input type="button" id="connectbutton1h" value="HW Connect" onclick="connectDesktop(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton1span">&nbsp;<input type="button" id="disconnectbutton1" value="Disconnect" onclick="connectDesktop(event,0)" onkeypress="return false" onkeydown="return false"></span> &nbsp;<span id="deskstatus">Disconnected</span> </div> </td> </tr> <tr id="deskarea2"> <td> <div style="background-color:gray"><div id="progressbar" style="height:2px;width:0%;background-color:red"></div></div> </td> </tr> <tr id="deskarea3"> <td id="deskarea3x" style="background:black;text-align:center;position:relative;overflow:hidden"> <div id="DeskFocus" style="overflow:hidden;color:transparent;border:3px dotted rgba(255,0,0,.2);position:absolute;border-radius:5px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)"></div> <div id="DeskParent" style="overflow:hidden"> <canvas id="Desk" width="640" height="480" style="overflow:hidden;width:100%;-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" onmousewheel="dmousewheel(event)"></canvas> </div> <div id="DeskTools" style="position:absolute;width:400px;height:100%;background-color:gray;top:0;right:0;border-left:2px solid lightgray;display:none"> <a id="DeskToolsRefreshButton" style="float:right;padding:3px;cursor:pointer" onclick="refreshDeskTools()">Refresh</a> <div id="DeskToolsBar" style="position:absolute;padding:3px;border-radius:3px 3px 0px 0px;top:5px;left:4px;bottom:26px;background-color:lightgray;cursor:pointer">Processes</div> <div style="position:absolute;top:26px;left:4px;right:4px;bottom:4px;background-color:lightgray;text-align:left"> <div style="border-bottom:1px solid darkgray;padding:3px"><a style="width:50px;padding-right:5px;float:left;cursor:pointer" title="Sort by process id" onclick="sortProcess(0)">PID</a><a style="cursor:pointer" title="Sort by name" onclick="sortProcess(1)">Name</a></div> <div id="DeskToolsProcesses" style="overflow-y:scroll;position:absolute;top:24px;bottom:0px;width:100%"></div> </div> </div> </td> </tr> <tr id="deskarea4"> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <select id="termdisplays" style="display:none" onchange="deskSetDisplay(event)" onclick="deskGetDisplayNumbers(event)"></select>&nbsp; <input id="DeskToolsButton" type="button" value="Tools" title="Toggle tools view" onkeypress="return false" onkeydown="return false" onclick="toggleDeskTools()">&nbsp; <span id="DeskChatButton" style="float:right;margin-top:1px;margin-right:4px;cursor:pointer" title="Open chat window to this computer"><img src='images/icon-chat.png' onclick="deviceChat()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskNotifyButton" style="float:right;margin-top:1px;margin-right:4px;cursor:pointer" title="Display a notification on the remote computer"><img src='images/icon-notify.png' onclick="deviceToastFunction()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskOpenWebButton" style="float:right;margin-top:1px;margin-right:4px;cursor:pointer" title="Open a web address on remote computer"><img src='images/icon-url2.png' onclick="deviceUrlFunction()" height="16" width="16" style="padding-top:2px"></span> </div> <div> <select style="margin-left:6px" id="deskkeys"> <option value="5">Win <option value="0">Win+Down <option value="1">Win+Up <option value="2">Win+L <option value="3">Win+M <option value="4">Shift+Win+M <option value="6">Win+R </select> <input id="DeskWD" type="button" value="Send" onkeypress="return false" onkeydown="return false" onclick="deskSendKeys()"> <input id="DeskClip" style="margin-left:6px;display:none" type="button" value="Clipboard" onkeypress="return false" onkeydown="return false" onclick="showDeskClip()"> <input id="DeskCAD" type="button" value="Ctrl-Alt-Del" onkeypress="return false" onkeydown="return false" onclick="sendCAD()"> <label><span id="DeskControlSpan" style="margin-left:6px" title="Toggle mouse and keyboard input"><input id="DeskControl" type="checkbox" onkeypress="return false" onkeydown="return false" onclick="toggleKvmControl()">Input</span></label>&nbsp; </div> </td> </tr> </table> </div> <div id="p12" style="display:none"> <div id="p12title"> <div id="p12BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Terminal - <span id="p12deviceName"></span></h1> </div> <div id="p12warning" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showFeaturesDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Intel&reg; AMT Redirection port or KVM feature is disabled<span id="p14warninga">, click here to enable it.</span></div> </div> <div id="p12warning2" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showPowerActionDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Remote computer is not powered on, click here to issue a power command.</div> </div> <table cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px"> <tr> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <input id="termActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" style="margin-right:3px"> </div> <div> <input type="button" id="autoconnectbutton2" value="AutoConnect" onclick="autoConnectTerminal(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton2span">&nbsp;<input type="button" id="connectbutton2" value="Connect" onclick="connectTerminal(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton2hspan">&nbsp;<input type="button" id="connectbutton2h" value="HW Connect" onclick="connectTerminal(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton2span">&nbsp;<input type="button" id="disconnectbutton2" value="Disconnect" onclick="connectTerminal(event,0)" onkeypress="return false" onkeydown="return false"></span> &nbsp;<span id="termstatus">Disconnected</span> </div> </td> </tr> <tr> <td> <div style="background-color:gray"><div id="termprogressbar" style="height:2px;width:0%;background-color:red"></div></div> </td> </tr> <tr> <td style="background:black;text-align:center;height:500px;position:relative"> <pre id="Term" style="background:black;margin:0;padding:0"></pre> </td> </tr> <tr> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <span id="terminalSettingsButtons" style="display:none"> <input id="id_tcrbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="CR+LF" title="Toggle what the return key will send" onclick="termToggleCr()"> <input id="id_tfxkeysbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Intel (F10 = ESC+[OM)" title="Toggle F1 to F10 keys emulation type" onclick="termToggleFx()"> <input id="id_ttypebutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Extended Ascii" title="Toggle terminal emulation type" onclick="termToggleType()"> </span> <select id="specialkeylist" onkeypress="return false" style="margin-left:5px"></select> <input id="specialkeylistinput" type="button" onkeypress="return false" class="bottombutton" value="Send" title="Send the selected special key" onclick="sendSpecialKey()"> </div> <div> &nbsp; <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlcbutton" value="Ctl-C" onclick="termSendKey(3,'ctrlcbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlxbutton" value="Ctl-X" onclick="termSendKey(24,'ctrlxbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="escbutton" value="ESC" onclick="termSendKey(27,'escbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="bsbutton" value="Backspace" onclick="termSendKey(8,'bsbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="pastebutton" value="Paste" title="Paste text into the terminal" onclick="showTermPasteDialog()"> </div> </td> </tr> </table> </div> <div id="p13" style="display:none"> <div id="p13title"> <div id="p13BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Files - <span id="p13deviceName"></span></h1> </div> <table id="p13toolbar" style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="background-color:#C0C0C0;border-bottom:2px solid black;padding:2px"> <div style="float:right;text-align:right"> <input id="filesActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" style="margin-right:3px"> </div> <div> <input id="p13AutoConnect" value="AutoConnect" onclick="autoConnectFiles(event)" onkeypress="return false" onkeydown="return false" type="button" style="display:none"> <input id="p13Connect" value="Connect" onclick="connectFiles(event)" onkeypress="return false" onkeydown="return false" type="button"> <span id="p13Status">Disconnected</span> </div> </td> </tr> <tr> <td style="width:100%;background-color:#d3d9d6;text-align:left;padding:4px" valign="bottom"> <div id="p13rightOfButtons" style="float:right;margin-top:3px"></div> <div> <input type="button" id="p13FolderUp" disabled="disabled" onclick="p13folderup()" value="Up">&nbsp; <input type="button" id="p13SelectAllButton" disabled="disabled" onclick="p13selectallfile()" value="Select All" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13RenameFileButton" disabled="disabled" value="Rename" onclick="p13renamefile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13DeleteFileButton" disabled="disabled" value="Delete" onclick="p13deletefile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13NewFolderButton" disabled="disabled" value="New Folder" onclick="p13createfolder()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13UploadButton" disabled="disabled" value="Upload" onclick="p13uploadFile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13CutButton" disabled="disabled" value="Cut" onclick="p13copyFile(1)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13CopyButton" disabled="disabled" value="Copy" onclick="p13copyFile(0)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13PasteButton" disabled="disabled" value="Paste" onclick="p13pasteFile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13RefreshButton" disabled="disabled" value="Refresh" onclick="p13folderup(9999)" onkeypress="return false" onkeydown="return false">&nbsp; </div> </td> </tr> <tr> <td style="background-color:#E4E9E7;height:28px"> <div style="float:right"> <select id="p13sortdropdown" onchange="p13updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div>&nbsp;&nbsp;<span id="p13currentpath"></span></div> </td> </tr> </table> <div id="p13filetable" style="width:100%;height:calc(100vh - 346px);overflow:auto;-webkit-user-select:none"> <div id="p13bigok" style="width:256px;overflow:hidden;position:absolute;left:337px;top:200px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&checkmark;</b></div> <div id="p13bigfail" style="width:256px;overflow:hidden;position:absolute;left:337px;top:200px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&#10007;</b></div> <span id="p13files"></span> </div> <table id="p13toolbarBottom" style="width:100%" cellpadding="0" cellspacing="0"> <tr><td class="style6" style="text-align:left;padding:3px">&nbsp;<span id="p13bottomstatus"></span></td></tr> </table> </div> <div id="p14" style="display:none"> <div id="p14title"> <div id="p14BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Intel&reg; AMT - <span id="p14deviceName"></span></h1> </div> <iframe id="p14iframe" style="width:100%;height:calc(100vh - 242px);border:0;overflow:hidden" src="/commander.htm"></iframe> </div> <div id="p15" style="display:none"> <div id="p15title"> <div id="p15BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1><span id="p15deviceName"></span></h1> </div> <table cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px"> <tr> <td style="background:#C0C0C0"> <div style="float:right;padding-right:4px"> <div style="padding:4px;display:inline-block" id="p15coreName" title="Information about current core running on this agent"></div> <input type="button" id="p15uploadCore" value="Agent Action" onclick="p15uploadCore(event)" title="Change the agent Java Script code module"> </div> <div id="p15statetext" style="padding:4px"></div> </td> </tr> <tr> <td> <div style="background-color:gray"><div id="consoleprogressbar" style="height:2px;width:0%;background-color:red"></div></div> </td> </tr> <tr> <td id="p15agentConsole" style="background:black;margin:0;padding:0;color:lightgray;width:100%;height:calc(100vh - 296px);max-height:500px;position:relative"> <pre id="p15agentConsoleText" style="position:absolute;margin:0;padding:0;top:0;bottom:0;left:0;right:0;overflow-y:scroll;overflow-x:auto"></pre> </td> </tr> <tr> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <table style="width:100%"> <tr> <td style="width:99%"> <input id="p15consoleText" style="width:100%" onkeyup="p15consoleSend(event)" onfocus="onConsoleFocus(1)" onblur="onConsoleFocus(0)"> </td> <td>&nbsp;</td> <td style="width:1%"><input id="id_p15consoleClear" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Clear" onclick="p15consoleClear()"></td> </tr> </table> </td> </tr> </table> </div> <div id="p16" style="display:none"> <div id="p16title"> <div id="p16BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p16deviceName"></span></h1> </div> <div style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px"> <div class="style7" style="width:16px;height:100%;float:left">&nbsp;</div> <div class="h1" style="height:100%;float:left">&nbsp;</div> <div class="style14" style="height:100%;float:left">&nbsp;&nbsp;<input type="button" value="Refresh" onclick="refreshDeviceEvents()">&nbsp;</div> <div class="auto-style1" style="height:100%;float:right"> Show <select id="p16limitdropdown" onchange="refreshDeviceEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <div style="height:100%;width:20px;float:right;background-color:#ffffff"></div> <div class="h2" style="height:100%;float:right">&nbsp;</div> </div> </div> <div id="p16events" style="max-height:calc(100vh - 267px);overflow-y:auto"></div> </div> <div id="p20" style="display:none"> <picture id="MainMeshImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/mesh-200.webp"> <img alt="" width="200" height="200" src="images/mesh-200.jpg"> </source></picture> <div style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p20meshName"></span></h1> <p id="p20info"> </div> <div id="p30" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p30title"> <div style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p30userName"></span></h1> </div> <div id="p30html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <picture id="MainUserImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/user-200.webp"> <img alt="" width="200" height="200" src="images/user-200.jpg"> </source></picture> <div style="width:100%;text-align:center"><strong><span id="MainUserState"></span></strong></div> </td> </tr> </table><br> <div id="p30html2"></div> <div id="p30html3"></div> </div> <div id="p31" style="display:none"> <div style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p31userName"></span></h1> <div style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px"> <div class="style7" style="width:16px;height:100%;float:left">&nbsp;</div> <div class="h1" style="height:100%;float:left">&nbsp;</div> <div class="style14" style="height:100%;float:left">&nbsp;&nbsp;<input type="button" value="Refresh" onclick="refreshUsersEvents()">&nbsp;</div> <div class="auto-style1" style="height:100%;float:right"> Show <select id="p31limitdropdown" onchange="refreshUsersEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <div style="height:100%;width:20px;float:right;background-color:#ffffff"></div> <div class="h2" style="height:100%;float:right;">&nbsp;</div> </div> </div> <div id="p31events" style="max-height:calc(100vh - 267px);overflow-y:scroll"></div> </div> <br id="column_l_bottomgap"> </div> <div id="footer" class="noselect"> <table cellpadding="0" cellspacing="10" style="width:100%"> <tr> <td style="text-align:left;color:white"> {{{footer}}} </td> <td style="text-align:right"> <a id="verifyEmailId2" style="color:yellow;margin-left:3px;cursor:pointer;display:none" onclick="account_showVerifyEmail()">Verify Email</a> <a style="margin-left:3px" href="terms">Terms &amp; Privacy</a> </td> </tr> </table> </div> <div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:160px;width:400px;left:calc((100% / 2) - 200px);display:none"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="id_dialogclose" style="float:right;padding:3px;margin-right:3px;cursor:pointer" onclick="setDialogMode()">&#x2716;</div> <div id="id_dialogtitle" style="padding:5px"></div> <div style="width:100%;margin:6px"></div> </div> <div style="margin-right:16px;margin-left:8px"> <div id="dialog1" style="margin:auto;text-align:center;margin:3px"> <div id="id_dialogMessage" style="padding:10px"></div> </div> <div id="dialog2" style="margin:auto;margin:3px"> <div id="id_dialogOptions"></div> </div> <div id="dialog3" style="margin:auto;margin:3px"> <div style="height:26px"> <select id="d3uploadMode" style="float:right;width:260px" onchange="d3modechange()"> <option value="1">Local file upload <option value="2">Server file selection </select> <div>File Selection</div> </div> <div id="d3localmode" style="height:26px;display:none"> <form id="d3localmodeform" method="post" enctype="multipart/form-data" action="uploadfile.ashx" target="fileUploadFrame"> <input type="text" id="d3attrib" name="attrib" style="display:none"> <input type="file" id="d3localFile" name="files" style="float:right;width:260px" onchange="d3setActions()"> <input type="submit" id="d3submit" style="display:none"> </form> <div>Upload File</div> </div> <div id="d3servermode"> <div style="width:100%;background-color:#d3d9d6;text-align:left;padding:3px" valign="bottom"> <input type="button" id="p3FolderUp" disabled="disabled" onclick="d3folderup()" value="Up">&nbsp; </div> <div id="d3serverfiles" style="width:100%;height:150px;background-color:white;padding:2px;border:1px solid gray;overflow-y:scroll"></div> </div> </div> <div id="dialog7" style="margin:auto;margin:3px"> <div id="d7meshkvm"> <h4 style="width:100%;border-bottom:1px solid gray">Agent Remote Desktop</h4> <div style="margin:3px 0 3px 0"> <select id="d7bitmapquality" style="float:right;width:200px;height:20px" dir="rtl"></select> <div style="height:20px">Quality</div> </div> <div style="margin:3px 0 3px 0"> <select id="d7bitmapscaling" style="float:right;width:200px;height:20px" dir="rtl"> <option selected="selected" value="1024">100% <option value="896">87.5% <option value="768">75% <option value="640">62.5% <option value="512">50% <option value="384">37.5% <option value="256">25% <option value="128">12.5% </select> <div style="height:20px">Scaling</div> </div> <div style="margin:3px 0 3px 0"> <select id="d7framelimiter" style="float:right;width:200px;height:20px" dir="rtl"> <option selected="selected" value="50">Fast <option value="100">Medium <option value="400">Slow <option value="1000">Very slow </select> <div style="height:20px">Frame rate</div> </div> </div> <div id="d7amtkvm"> <h4 style="width:100%;border-bottom:1px solid gray">Intel&reg; AMT Hardware KVM</h4> <div style='height:26px'> <select id="d7desktopmode" style="float:right;width:200px"> <option value="1">RLE8, Fastest <option value="2">RLE16, Recommended <option value="3">RAW8, Slow <option value="4">RAW16, Very Slow </select> <div>Image Encoding</div> </div> <div style="height:60px"> <div style="float:right;border:1px solid #666;width:200px;height:60px;overflow-y:scroll;background-color:white"> <label><input type="checkbox" id='d7showfocus'>Show Focus Tool<br></label> <label><input type="checkbox" id='d7showcursor'>Show Local Mouse Cursor<br></label> <label><input type="checkbox" id='d7localKeyMap'>Local Keyboard Map<br></label> </div> <div>Other Settings</div> </div> </div> </div> </div> <div id="idx_dlgButtonBar" style="padding:10px;margin-bottom:4px"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="float:right;width:80px" onclick="dialogclose(1)"> <div style="height:25px"><input id="idx_dlgDeleteButton" type="button" value="Delete" style="width:80px;display:none" onclick="dialogclose(2)"></div> </div> </div> <iframe name="fileUploadFrame" style="display:none"></iframe> <form style="display:none" method="post" action="uploadfile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p5fileDragName" name="name"><input id="p5fileDragSize" name="size"><input id="p5fileDragType" name="type"><input id="p5fileDragData" name="data"><input id="p5fileDragLink" name="link"><input type="submit" id="p5loginSubmit2" style="display:none"></form> <form style="display:none" method="post" action="uploadnodefile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p13fileDragName" name="name"><input id="p13fileDragSize" name="size"><input id="p13fileDragType" name="type"><input id="p13fileDragData" name="data"><input id="p13fileDragLink" name="link"><input type="submit" id="p13loginSubmit2" style="display:none"></form> <audio id="chimes"><source src="sounds/chimes.mp3" type="audio/mp3"></source></audio> </div> </div> <script>if(!String.prototype.startsWith){String.prototype.startsWith=function(a){return this.lastIndexOf(a,0)===0}}if(!String.prototype.endsWith){String.prototype.endsWith=function(a){return this.indexOf(a,this.length-a.length)!==-1}}function Q(a){return document.getElementById(a)}function QS(a){try{return Q(a).style}catch(a){}}function QE(a,b){try{Q(a).disabled=!b}catch(a){}}function QV(a,b){try{QS(a).display=(b?"":"none")}catch(a){}}function QA(a,b){Q(a).innerHTML+=b}function QH(a,b){Q(a).innerHTML=b}function inputBoxFocus(b){Q(b).focus();var a=Q(b).value;Q(b).value="";Q(b).value=a}function ReadShort(b,a){return(b.charCodeAt(a)<<8)+b.charCodeAt(a+1)}function ReadShortX(b,a){return(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ReadInt(b,a){return(b.charCodeAt(a)*16777216)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadSInt(b,a){return(b.charCodeAt(a)<<24)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadIntX(b,a){return(b.charCodeAt(a+3)*16777216)+(b.charCodeAt(a+2)<<16)+(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ShortToStr(a){return String.fromCharCode((a>>8)&255,a&255)}function ShortToStrX(a){return String.fromCharCode(a&255,(a>>8)&255)}function IntToStr(a){return String.fromCharCode((a>>24)&255,(a>>16)&255,(a>>8)&255,a&255)}function IntToStrX(a){return String.fromCharCode(a&255,(a>>8)&255,(a>>16)&255,(a>>24)&255)}function MakeToArray(a){if(!a||a==null||typeof a=="object"){return a}return[a]}function SplitArray(a){return a.split(",")}function Clone(a){return JSON.parse(JSON.stringify(a))}function EscapeHtml(a){if(typeof a=="string"){return a.replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function EscapeHtmlBreaks(a){if(typeof a=="string"){return a.replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/\r/g,"<br />").replace(/\n/g,"").replace(/\t/g,"&nbsp;&nbsp;")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function ArrayElementMove(a,b,c){a.splice(c,0,a.splice(b,1)[0])}function ObjectToStringEx(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="<br />"+gap(a)+"Item #"+b+": "+ObjectToStringEx(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="<br />"+gap(a)+b+" = "+ObjectToStringEx(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function ObjectToStringEx2(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="\r\n"+gap2(a)+"Item #"+b+": "+ObjectToStringEx2(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="\r\n"+gap2(a)+b+" = "+ObjectToStringEx2(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function gap(a){var d="";for(var b=0;b<(a*4);b++){d+="&nbsp;"}return d}function gap2(a){var d="";for(var b=0;b<(a*4);b++){d+=" "}return d}function ObjectToString(a){return ObjectToStringEx(a,0)}function ObjectToString2(a){return ObjectToStringEx2(a,0)}function hex2rstr(a){if(typeof a!="string"||a.length==0){return""}var c="",b=(""+a).match(/../g),e;while(e=b.shift()){c+=String.fromCharCode("0x"+e)}return c}function char2hex(a){return(a+256).toString(16).substr(-2).toUpperCase()}function rstr2hex(b){var c="",a;for(a=0;a<b.length;a++){c+=char2hex(b.charCodeAt(a))}return c}function encode_utf8(a){return unescape(encodeURIComponent(a))}function decode_utf8(a){return decodeURIComponent(escape(a))}function data2blob(c){var b=new Array(c.length);for(var d=0;d<c.length;d++){b[d]=c.charCodeAt(d)}var a=new Blob([new Uint8Array(b)]);return a}function random(a){return Math.floor(Math.random()*a)}function trademarks(a){return a.replace(/\(R\)/g,"&reg;").replace(/\(TM\)/g,"&trade;")}var MeshServerCreateControl=function(b,a){var c={};c.State=0;c.connectstate=0;c.pingTimer=null;c.authCookie=a;c.xxStateChange=function(e,d){if(c.State==e){return}var g=c.State;c.State=e;if(c.onStateChanged){c.onStateChanged(c,c.State,g,d)}};c.Start=function(){if(c.connectstate!=0){return}c.connectstate=0;var d=window.location.protocol.replace("http","ws")+"//"+window.location.host+b+"control.ashx";if(c.authCookie&&(c.authCookie!="")){d+="?auth="+c.authCookie}c.socket=new WebSocket(d);c.socket.onopen=function(g){c.connectstate=1};c.socket.onmessage=c.xxOnMessage;c.socket.onclose=function(g){c.Stop(g.code)};c.xxStateChange(1,0);if(c.pingTimer!=null){clearInterval(c.pingTimer)}c.pingTimer=setInterval(function(){c.send({action:"ping"})},29000)};c.Stop=function(d){c.connectstate=0;if(c.socket){c.socket.close();delete c.socket}if(c.pingTimer!=null){clearInterval(c.pingTimer);c.pingTimer=null}c.xxStateChange(0,d)};c.xxOnMessage=function(d){if(c.State==1){c.xxStateChange(2)}var g;try{g=JSON.parse(d.data)}catch(d){return}if((typeof g!="object")||(g.action=="pong")){return}if(g.action=="close"){if(g.msg){console.log(g.msg)}c.Stop(g.cause);return}if(c.onMessage){c.onMessage(c,g)}};c.send=function(d){if(c.socket!=null&&c.connectstate==1){c.socket.send(JSON.stringify(d))}};return c};function AmtStackCreateService(t){var s=new Object();s.wsman=t;s.pfx=["http://intel.com/wbem/wscim/1/amt-schema/1/","http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/","http://intel.com/wbem/wscim/1/ips-schema/1/"];s.PendingEnums=[];s.PendingBatchOperations=0;s.ActiveEnumsCount=0;s.MaxActiveEnumsCount=1;s.onProcessChanged=null;var n=0;var m=0;s.GetPendingActions=function(){return(s.PendingEnums.length*2)+(s.ActiveEnumsCount)+s.wsman.comm.PendingAjax.length+s.wsman.comm.ActiveAjaxCount+s.PendingBatchOperations};function r(){var u=s.GetPendingActions();if(n<u){n=u}if(s.onProcessChanged!=null&&m!=u){m=u;s.onProcessChanged(u,n)}if(u==0){n=0}}s.Subscribe=function(w,v,C,u,B,z,A,x,D,y){s.wsman.ExecSubscribe(s.CompleteName(w),v,C,function(G,F,E,H){r();u(s,w,E,H,B)},0,z,A,x,D,y);r()};s.UnSubscribe=function(v,u,y,w,x){s.wsman.ExecUnSubscribe(s.CompleteName(v),function(B,A,z,C){r();u(s,v,z,C,y)},0,w,x);r()};s.Get=function(v,u,x,w){s.wsman.ExecGet(s.CompleteName(v),function(A,z,y,B){r();u(s,v,y,B,x)},0,w);r()};s.Put=function(v,x,u,z,w,y){s.wsman.ExecPut(s.CompleteName(v),x,function(C,B,A,D){r();u(s,v,A,D,z)},0,w,y);r()};s.Create=function(v,x,u,y,w){s.wsman.ExecCreate(s.CompleteName(v),x,function(B,A,z,C){r();u(s,v,z,C,y)},0,w);r()};s.Delete=function(v,x,u,y,w){s.wsman.ExecDelete(s.CompleteName(v),x,function(B,A,z,C){r();u(s,v,z,C,y)},0,w);r()};s.Exec=function(x,w,u,v,A,y,z){s.wsman.ExecMethod(s.CompleteName(x),w,u,function(D,C,B,E){r();v(s,x,s.CompleteExecResponse(B),E,A)},0,y,z);r()};s.ExecWithXml=function(x,w,u,v,A,y,z){s.wsman.ExecMethodXml(s.CompleteName(x),w,execArgumentsToXml(u),function(D,C,B,E){r();v(s,x,s.CompleteExecResponse(B),E,A)},0,y,z);r()};s.Enum=function(v,u,x,w){if(s.ActiveEnumsCount<s.MaxActiveEnumsCount){s.ActiveEnumsCount++;s.wsman.ExecEnum(s.CompleteName(v),function(B,z,y,C,A){r();d(v,y,u,z,C,A)},x,w)}else{s.PendingEnums.push([v,u,x,w])}r()};function d(w,y,u,z,A,B,x){if(A!=200){u(s,w,null,A,B);c(1);return}if(y==null||y.Header.Method!="EnumerateResponse"||!y.Body.EnumerationContext){u(s,w,null,603,B);c(1);return}var v=y.Body.EnumerationContext;s.wsman.ExecPull(z,v,function(E,D,C,F){b(w,C,u,D,[],F,B,x)})}function b(z,B,u,C,x,D,E,A){if(D!=200){u(s,z,null,D,E);c(1);return}if(B==null||B.Header.Method!="PullResponse"){u(s,z,null,604,E);c(1);return}for(var w in B.Body.Items){if(B.Body.Items[w] instanceof Array){for(var y in B.Body.Items[w]){x.push(B.Body.Items[w][y])}}else{x.push(B.Body.Items[w])}}if(B.Body.EnumerationContext){var v=B.Body.EnumerationContext;s.wsman.ExecPull(C,v,function(H,G,F,I){b(z,F,u,G,x,I,E,1)})}else{c(1);u(s,z,x,D,E);r()}}function c(u){s.ActiveEnumsCount-=u;if(s.ActiveEnumsCount>=s.MaxActiveEnumsCount||s.PendingEnums.length==0){return}var v=s.PendingEnums.shift();s.Enum(v[0],v[1],v[2]);c(0)}s.BatchEnum=function(u,x,v,z,w,y){s.PendingBatchOperations+=(x.length*2);a(u,Clone(x),v,z,{},w,y);r()};function a(u,z,v,C,B,w,A){s.PendingBatchOperations-=2;var y=z.shift(),x=s.Enum;if(y[0]=="*"){x=s.Get;y=y.substring(1)}x(y,function(F,D,E,G,H){H[2][D]={response:(E==null?null:E.Body),responses:E,status:G};if(H[1].length==0||G==401||(w!=true&&G!=200&&G!=400)){s.PendingBatchOperations-=(z.length*2);r();v(s,u,H[2],G,C)}else{r();a(u,z,v,C,H[2],A)}},[u,z,B],A);r()}s.BatchGet=function(u,w,v,y,x){h({name:u,names:w,callback:v,current:0,responses:{},tag:y,pri:x});r()};function h(u){if(u.names.length<=u.current){u.callback(s,u.name,u.responses,200,u.tag)}else{s.wsman.ExecGet(s.CompleteName(u.names[u.current]),function(x,w,v,y){g(u,v,y)},u.pri);u.current++}r()}function g(u,v,w){if(v==null||w!=200){u.callback(s,u.name,null,w,u.tag)}else{u.responses[v.Header.Method]=v;h(u)}}s.CompleteName=function(u){if(u.indexOf("AMT_")==0){return s.pfx[0]+u}if(u.indexOf("CIM_")==0){return s.pfx[1]+u}if(u.indexOf("IPS_")==0){return s.pfx[2]+u}};s.CompleteExecResponse=function(u){if(u&&u!=null&&u.Body&&u.Body.ReturnValue){u.Body.ReturnValueStr=s.AmtStatusToStr(u.Body.ReturnValue)}return u};s.RequestPowerStateChange=function(v,u){s.CIM_PowerManagementService_RequestPowerStateChange(v,'<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystem</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="CreationClassName">CIM_ComputerSystem</Selector><Selector Name="Name">ManagedSystem</Selector></SelectorSet></ReferenceParameters>',null,null,u)};s.SetBootConfigRole=function(v,u){s.CIM_BootService_SetBootConfigRole('<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootConfigSetting</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">Intel(r) AMT: Boot Configuration 0</Selector></SelectorSet></ReferenceParameters>',v,u)};s.CancelAllQueries=function(u){s.wsman.CancelAllQueries(u)};s.AMT_AgentPresenceWatchdog_RegisterAgent=function(u){s.Exec("AMT_AgentPresenceWatchdog","RegisterAgent",{},u)};s.AMT_AgentPresenceWatchdog_AssertPresence=function(v,u){s.Exec("AMT_AgentPresenceWatchdog","AssertPresence",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdog_AssertShutdown=function(v,u){s.Exec("AMT_AgentPresenceWatchdog","AssertShutdown",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdog_AddAction=function(z,y,x,v,u,w,C,A,B){s.Exec("AMT_AgentPresenceWatchdog","AddAction",{OldState:z,NewState:y,EventOnTransition:x,ActionSd:v,ActionEac:u},w,C,A,B)};s.AMT_AgentPresenceWatchdog_DeleteAllActions=function(u,x,v,w){s.Exec("AMT_AgentPresenceWatchdog","DeleteAllActions",{},u,x,v,w)};s.AMT_AgentPresenceWatchdogAction_GetActionEac=function(u){s.Exec("AMT_AgentPresenceWatchdogAction","GetActionEac",{},u)};s.AMT_AgentPresenceWatchdogVA_RegisterAgent=function(u){s.Exec("AMT_AgentPresenceWatchdogVA","RegisterAgent",{},u)};s.AMT_AgentPresenceWatchdogVA_AssertPresence=function(v,u){s.Exec("AMT_AgentPresenceWatchdogVA","AssertPresence",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdogVA_AssertShutdown=function(v,u){s.Exec("AMT_AgentPresenceWatchdogVA","AssertShutdown",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdogVA_AddAction=function(z,y,x,v,u,w){s.Exec("AMT_AgentPresenceWatchdogVA","AddAction",{OldState:z,NewState:y,EventOnTransition:x,ActionSd:v,ActionEac:u},w)};s.AMT_AgentPresenceWatchdogVA_DeleteAllActions=function(u,v){s.Exec("AMT_AgentPresenceWatchdogVA","DeleteAllActions",{_method_dummy:u},v)};s.AMT_AuditLog_ClearLog=function(u){s.Exec("AMT_AuditLog","ClearLog",{},u)};s.AMT_AuditLog_RequestStateChange=function(v,w,u){s.Exec("AMT_AuditLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_AuditLog_ReadRecords=function(v,u,w){s.Exec("AMT_AuditLog","ReadRecords",{StartIndex:v},u,w)};s.AMT_AuditLog_SetAuditLock=function(x,v,w,u){s.Exec("AMT_AuditLog","SetAuditLock",{LockTimeoutInSeconds:x,Flag:v,Handle:w},u)};s.AMT_AuditLog_ExportAuditLogSignature=function(v,u){s.Exec("AMT_AuditLog","ExportAuditLogSignature",{SigningMechanism:v},u)};s.AMT_AuditLog_SetSigningKeyMaterial=function(y,x,w,v,u){s.Exec("AMT_AuditLog","SetSigningKeyMaterial",{SigningMechanismType:y,SigningKey:x,LengthOfCertificates:w,Certificates:v},u)};s.AMT_AuditPolicyRule_SetAuditPolicy=function(w,u,x,y,v){s.Exec("AMT_AuditPolicyRule","SetAuditPolicy",{Enable:w,AuditedAppID:u,EventID:x,PolicyType:y},v)};s.AMT_AuditPolicyRule_SetAuditPolicyBulk=function(w,u,x,y,v){s.Exec("AMT_AuditPolicyRule","SetAuditPolicyBulk",{Enable:w,AuditedAppID:u,EventID:x,PolicyType:y},v)};s.AMT_AuthorizationService_AddUserAclEntryEx=function(x,w,y,u,z,v){s.Exec("AMT_AuthorizationService","AddUserAclEntryEx",{DigestUsername:x,DigestPassword:w,KerberosUserSid:y,AccessPermission:u,Realms:z},v)};s.AMT_AuthorizationService_EnumerateUserAclEntries=function(v,u){s.Exec("AMT_AuthorizationService","EnumerateUserAclEntries",{StartIndex:v},u)};s.AMT_AuthorizationService_GetUserAclEntryEx=function(v,u,w){s.Exec("AMT_AuthorizationService","GetUserAclEntryEx",{Handle:v},u,w)};s.AMT_AuthorizationService_UpdateUserAclEntryEx=function(y,x,w,z,u,A,v){s.Exec("AMT_AuthorizationService","UpdateUserAclEntryEx",{Handle:y,DigestUsername:x,DigestPassword:w,KerberosUserSid:z,AccessPermission:u,Realms:A},v)};s.AMT_AuthorizationService_RemoveUserAclEntry=function(v,u){s.Exec("AMT_AuthorizationService","RemoveUserAclEntry",{Handle:v},u)};s.AMT_AuthorizationService_SetAdminAclEntryEx=function(w,v,u){s.Exec("AMT_AuthorizationService","SetAdminAclEntryEx",{Username:w,DigestPassword:v},u)};s.AMT_AuthorizationService_GetAdminAclEntry=function(u){s.Exec("AMT_AuthorizationService","GetAdminAclEntry",{},u)};s.AMT_AuthorizationService_GetAdminAclEntryStatus=function(u){s.Exec("AMT_AuthorizationService","GetAdminAclEntryStatus",{},u)};s.AMT_AuthorizationService_GetAdminNetAclEntryStatus=function(u){s.Exec("AMT_AuthorizationService","GetAdminNetAclEntryStatus",{},u)};s.AMT_AuthorizationService_SetAclEnabledState=function(w,v,u,x){s.Exec("AMT_AuthorizationService","SetAclEnabledState",{Handle:w,Enabled:v},u,x)};s.AMT_AuthorizationService_GetAclEnabledState=function(v,u,w){s.Exec("AMT_AuthorizationService","GetAclEnabledState",{Handle:v},u,w)};s.AMT_EndpointAccessControlService_RequestStateChange=function(v,w,u){s.Exec("AMT_EndpointAccessControlService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_EndpointAccessControlService_GetPosture=function(v,u){s.Exec("AMT_EndpointAccessControlService","GetPosture",{PostureType:v},u)};s.AMT_EndpointAccessControlService_GetPostureHash=function(v,u){s.Exec("AMT_EndpointAccessControlService","GetPostureHash",{PostureType:v},u)};s.AMT_EndpointAccessControlService_UpdatePostureState=function(v,u){s.Exec("AMT_EndpointAccessControlService","UpdatePostureState",{UpdateType:v},u)};s.AMT_EndpointAccessControlService_GetEacOptions=function(u){s.Exec("AMT_EndpointAccessControlService","GetEacOptions",{},u)};s.AMT_EndpointAccessControlService_SetEacOptions=function(v,w,u){s.Exec("AMT_EndpointAccessControlService","SetEacOptions",{EacVendors:v,PostureHashAlgorithm:w},u)};s.AMT_EnvironmentDetectionSettingData_SetSystemDefensePolicy=function(v,u){s.Exec("AMT_EnvironmentDetectionSettingData","SetSystemDefensePolicy",{Policy:v},u)};s.AMT_EnvironmentDetectionSettingData_EnableVpnRouting=function(v,u){s.Exec("AMT_EnvironmentDetectionSettingData","EnableVpnRouting",{Enable:v},u)};s.AMT_EthernetPortSettings_SetLinkPreference=function(v,w,u){s.Exec("AMT_EthernetPortSettings","SetLinkPreference",{LinkPreference:v,Timeout:w},u)};s.AMT_HeuristicPacketFilterStatistics_ResetSelectedStats=function(v,u){s.Exec("AMT_HeuristicPacketFilterStatistics","ResetSelectedStats",{SelectedStatistics:v},u)};s.AMT_KerberosSettingData_GetCredentialCacheState=function(u){s.Exec("AMT_KerberosSettingData","GetCredentialCacheState",{},u)};s.AMT_KerberosSettingData_SetCredentialCacheState=function(v,u){s.Exec("AMT_KerberosSettingData","SetCredentialCacheState",{Enable:v},u)};s.AMT_MessageLog_CancelIteration=function(v,u){s.Exec("AMT_MessageLog","CancelIteration",{IterationIdentifier:v},u)};s.AMT_MessageLog_RequestStateChange=function(v,w,u){s.Exec("AMT_MessageLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_MessageLog_ClearLog=function(u){s.Exec("AMT_MessageLog","ClearLog",{},u)};s.AMT_MessageLog_GetRecords=function(v,w,u,x){s.Exec("AMT_MessageLog","GetRecords",{IterationIdentifier:v,MaxReadRecords:w},u,x)};s.AMT_MessageLog_GetRecord=function(v,w,u){s.Exec("AMT_MessageLog","GetRecord",{IterationIdentifier:v,PositionToNext:w},u)};s.AMT_MessageLog_PositionAtRecord=function(v,w,x,u){s.Exec("AMT_MessageLog","PositionAtRecord",{IterationIdentifier:v,MoveAbsolute:w,RecordNumber:x},u)};s.AMT_MessageLog_PositionToFirstRecord=function(u,v){s.Exec("AMT_MessageLog","PositionToFirstRecord",{},u,v)};s.AMT_MessageLog_FreezeLog=function(v,u){s.Exec("AMT_MessageLog","FreezeLog",{Freeze:v},u)};s.AMT_PublicKeyManagementService_AddCRL=function(w,v,u){s.Exec("AMT_PublicKeyManagementService","AddCRL",{Url:w,SerialNumbers:v},u)};s.AMT_PublicKeyManagementService_ResetCRLList=function(u,v){s.Exec("AMT_PublicKeyManagementService","ResetCRLList",{_method_dummy:u},v)};s.AMT_PublicKeyManagementService_AddCertificate=function(v,u){s.Exec("AMT_PublicKeyManagementService","AddCertificate",{CertificateBlob:v},u)};s.AMT_PublicKeyManagementService_AddTrustedRootCertificate=function(v,u){s.Exec("AMT_PublicKeyManagementService","AddTrustedRootCertificate",{CertificateBlob:v},u)};s.AMT_PublicKeyManagementService_AddKey=function(v,u){s.Exec("AMT_PublicKeyManagementService","AddKey",{KeyBlob:v},u)};s.AMT_PublicKeyManagementService_GeneratePKCS10Request=function(w,v,x,u){s.Exec("AMT_PublicKeyManagementService","GeneratePKCS10Request",{KeyPair:w,DNName:v,Usage:x},u)};s.AMT_PublicKeyManagementService_GeneratePKCS10RequestEx=function(v,x,w,u){s.Exec("AMT_PublicKeyManagementService","GeneratePKCS10RequestEx",{KeyPair:v,SigningAlgorithm:x,NullSignedCertificateRequest:w},u)};s.AMT_PublicKeyManagementService_GenerateKeyPair=function(v,w,u){s.Exec("AMT_PublicKeyManagementService","GenerateKeyPair",{KeyAlgorithm:v,KeyLength:w},u)};s.AMT_RedirectionService_RequestStateChange=function(v,u){s.Exec("AMT_RedirectionService","RequestStateChange",{RequestedState:v},u)};s.AMT_RedirectionService_TerminateSession=function(v,u){s.Exec("AMT_RedirectionService","TerminateSession",{SessionType:v},u)};s.AMT_RemoteAccessService_AddMpServer=function(u,z,B,v,x,C,A,y,w){s.Exec("AMT_RemoteAccessService","AddMpServer",{AccessInfo:u,InfoFormat:z,Port:B,AuthMethod:v,Certificate:x,Username:C,Password:A,CN:y},w)};s.AMT_RemoteAccessService_AddRemoteAccessPolicyRule=function(x,y,v,w,u){s.Exec("AMT_RemoteAccessService","AddRemoteAccessPolicyRule",{Trigger:x,TunnelLifeTime:y,ExtendedData:v,MpServer:w},u)};s.AMT_RemoteAccessService_CloseRemoteAccessConnection=function(u,v){s.Exec("AMT_RemoteAccessService","CloseRemoteAccessConnection",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_CommitChanges=function(u,v){s.Exec("AMT_SetupAndConfigurationService","CommitChanges",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_Unprovision=function(v,u){s.Exec("AMT_SetupAndConfigurationService","Unprovision",{ProvisioningMode:v},u)};s.AMT_SetupAndConfigurationService_PartialUnprovision=function(u,v){s.Exec("AMT_SetupAndConfigurationService","PartialUnprovision",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_ResetFlashWearOutProtection=function(u,v){s.Exec("AMT_SetupAndConfigurationService","ResetFlashWearOutProtection",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_ExtendProvisioningPeriod=function(v,u){s.Exec("AMT_SetupAndConfigurationService","ExtendProvisioningPeriod",{Duration:v},u)};s.AMT_SetupAndConfigurationService_SetMEBxPassword=function(v,u){s.Exec("AMT_SetupAndConfigurationService","SetMEBxPassword",{Password:v},u)};s.AMT_SetupAndConfigurationService_SetTLSPSK=function(v,w,u){s.Exec("AMT_SetupAndConfigurationService","SetTLSPSK",{PID:v,PPS:w},u)};s.AMT_SetupAndConfigurationService_GetProvisioningAuditRecord=function(u){s.Exec("AMT_SetupAndConfigurationService","GetProvisioningAuditRecord",{},u)};s.AMT_SetupAndConfigurationService_GetUuid=function(u){s.Exec("AMT_SetupAndConfigurationService","GetUuid",{},u)};s.AMT_SetupAndConfigurationService_GetUnprovisionBlockingComponents=function(u){s.Exec("AMT_SetupAndConfigurationService","GetUnprovisionBlockingComponents",{},u)};s.AMT_SetupAndConfigurationService_GetProvisioningAuditRecordV2=function(u){s.Exec("AMT_SetupAndConfigurationService","GetProvisioningAuditRecordV2",{},u)};s.AMT_SystemDefensePolicy_GetTimeout=function(u){s.Exec("AMT_SystemDefensePolicy","GetTimeout",{},u)};s.AMT_SystemDefensePolicy_SetTimeout=function(v,u){s.Exec("AMT_SystemDefensePolicy","SetTimeout",{Timeout:v},u)};s.AMT_SystemDefensePolicy_UpdateStatistics=function(v,x,u,z,w,y){s.Exec("AMT_SystemDefensePolicy","UpdateStatistics",{NetworkInterface:v,ResetOnRead:x},u,z,w,y)};s.AMT_SystemPowerScheme_SetPowerScheme=function(u,v,w){s.Exec("AMT_SystemPowerScheme","SetPowerScheme",{},u,w,0,{InstanceID:v})};s.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch=function(u,v){s.Exec("AMT_TimeSynchronizationService","GetLowAccuracyTimeSynch",{},u,v)};s.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch=function(v,x,y,u,w){s.Exec("AMT_TimeSynchronizationService","SetHighAccuracyTimeSynch",{Ta0:v,Tm1:x,Tm2:y},u,w)};s.AMT_UserInitiatedConnectionService_RequestStateChange=function(v,w,u){s.Exec("AMT_UserInitiatedConnectionService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_WebUIService_RequestStateChange=function(v,w,u){s.Exec("AMT_WebUIService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_WiFiPortConfigurationService_AddWiFiSettings=function(y,z,x,w,u,v){s.ExecWithXml("AMT_WiFiPortConfigurationService","AddWiFiSettings",{WiFiEndpoint:y,WiFiEndpointSettingsInput:z,IEEE8021xSettingsInput:x,ClientCredential:w,CACredential:u},v)};s.AMT_WiFiPortConfigurationService_UpdateWiFiSettings=function(y,z,x,w,u,v){s.ExecWithXml("AMT_WiFiPortConfigurationService","UpdateWiFiSettings",{WiFiEndpointSettings:y,WiFiEndpointSettingsInput:z,IEEE8021xSettingsInput:x,ClientCredential:w,CACredential:u},v)};s.AMT_WiFiPortConfigurationService_DeleteAllITProfiles=function(u,v){s.Exec("AMT_WiFiPortConfigurationService","DeleteAllITProfiles",{_method_dummy:u},v)};s.AMT_WiFiPortConfigurationService_DeleteAllUserProfiles=function(u,v){s.Exec("AMT_WiFiPortConfigurationService","DeleteAllUserProfiles",{_method_dummy:u},v)};s.CIM_Account_RequestStateChange=function(v,w,u){s.Exec("CIM_Account","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_AccountManagementService_CreateAccount=function(w,u,v){s.Exec("CIM_AccountManagementService","CreateAccount",{System:w,AccountTemplate:u},v)};s.CIM_BootConfigSetting_ChangeBootOrder=function(v,u){s.Exec("CIM_BootConfigSetting","ChangeBootOrder",{Source:v},u)};s.CIM_BootService_SetBootConfigRole=function(u,w,v){s.Exec("CIM_BootService","SetBootConfigRole",{BootConfigSetting:u,Role:w},v,0,1)};s.CIM_Card_ConnectorPower=function(v,w,u){s.Exec("CIM_Card","ConnectorPower",{Connector:v,PoweredOn:w},u)};s.CIM_Card_IsCompatible=function(v,u){s.Exec("CIM_Card","IsCompatible",{ElementToCheck:v},u)};s.CIM_Chassis_IsCompatible=function(v,u){s.Exec("CIM_Chassis","IsCompatible",{ElementToCheck:v},u)};s.CIM_Fan_SetSpeed=function(v,u){s.Exec("CIM_Fan","SetSpeed",{DesiredSpeed:v},u)};s.CIM_KVMRedirectionSAP_RequestStateChange=function(v,w,u){s.Exec("CIM_KVMRedirectionSAP","RequestStateChange",{RequestedState:v},u)};s.CIM_MediaAccessDevice_LockMedia=function(v,u){s.Exec("CIM_MediaAccessDevice","LockMedia",{Lock:v},u)};s.CIM_MediaAccessDevice_SetPowerState=function(v,w,u){s.Exec("CIM_MediaAccessDevice","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_MediaAccessDevice_Reset=function(u){s.Exec("CIM_MediaAccessDevice","Reset",{},u)};s.CIM_MediaAccessDevice_EnableDevice=function(v,u){s.Exec("CIM_MediaAccessDevice","EnableDevice",{Enabled:v},u)};s.CIM_MediaAccessDevice_OnlineDevice=function(v,u){s.Exec("CIM_MediaAccessDevice","OnlineDevice",{Online:v},u)};s.CIM_MediaAccessDevice_QuiesceDevice=function(v,u){s.Exec("CIM_MediaAccessDevice","QuiesceDevice",{Quiesce:v},u)};s.CIM_MediaAccessDevice_SaveProperties=function(u){s.Exec("CIM_MediaAccessDevice","SaveProperties",{},u)};s.CIM_MediaAccessDevice_RestoreProperties=function(u){s.Exec("CIM_MediaAccessDevice","RestoreProperties",{},u)};s.CIM_MediaAccessDevice_RequestStateChange=function(v,w,u){s.Exec("CIM_MediaAccessDevice","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_PhysicalFrame_IsCompatible=function(v,u){s.Exec("CIM_PhysicalFrame","IsCompatible",{ElementToCheck:v},u)};s.CIM_PhysicalPackage_IsCompatible=function(v,u){s.Exec("CIM_PhysicalPackage","IsCompatible",{ElementToCheck:v},u)};s.CIM_PowerManagementService_RequestPowerStateChange=function(w,v,x,y,u){s.Exec("CIM_PowerManagementService","RequestPowerStateChange",{PowerState:w,ManagedElement:v,Time:x,TimeoutPeriod:y},u,0,1)};s.CIM_PowerSupply_SetPowerState=function(v,w,u){s.Exec("CIM_PowerSupply","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_PowerSupply_Reset=function(u){s.Exec("CIM_PowerSupply","Reset",{},u)};s.CIM_PowerSupply_EnableDevice=function(v,u){s.Exec("CIM_PowerSupply","EnableDevice",{Enabled:v},u)};s.CIM_PowerSupply_OnlineDevice=function(v,u){s.Exec("CIM_PowerSupply","OnlineDevice",{Online:v},u)};s.CIM_PowerSupply_QuiesceDevice=function(v,u){s.Exec("CIM_PowerSupply","QuiesceDevice",{Quiesce:v},u)};s.CIM_PowerSupply_SaveProperties=function(u){s.Exec("CIM_PowerSupply","SaveProperties",{},u)};s.CIM_PowerSupply_RestoreProperties=function(u){s.Exec("CIM_PowerSupply","RestoreProperties",{},u)};s.CIM_PowerSupply_RequestStateChange=function(v,w,u){s.Exec("CIM_PowerSupply","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_Processor_SetPowerState=function(v,w,u){s.Exec("CIM_Processor","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_Processor_Reset=function(u){s.Exec("CIM_Processor","Reset",{},u)};s.CIM_Processor_EnableDevice=function(v,u){s.Exec("CIM_Processor","EnableDevice",{Enabled:v},u)};s.CIM_Processor_OnlineDevice=function(v,u){s.Exec("CIM_Processor","OnlineDevice",{Online:v},u)};s.CIM_Processor_QuiesceDevice=function(v,u){s.Exec("CIM_Processor","QuiesceDevice",{Quiesce:v},u)};s.CIM_Processor_SaveProperties=function(u){s.Exec("CIM_Processor","SaveProperties",{},u)};s.CIM_Processor_RestoreProperties=function(u){s.Exec("CIM_Processor","RestoreProperties",{},u)};s.CIM_Processor_RequestStateChange=function(v,w,u){s.Exec("CIM_Processor","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_RecordLog_ClearLog=function(u){s.Exec("CIM_RecordLog","ClearLog",{},u)};s.CIM_RecordLog_RequestStateChange=function(v,w,u){s.Exec("CIM_RecordLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_RedirectionService_RequestStateChange=function(v,w,u){s.Exec("CIM_RedirectionService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_Sensor_SetPowerState=function(v,w,u){s.Exec("CIM_Sensor","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_Sensor_Reset=function(u){s.Exec("CIM_Sensor","Reset",{},u)};s.CIM_Sensor_EnableDevice=function(v,u){s.Exec("CIM_Sensor","EnableDevice",{Enabled:v},u)};s.CIM_Sensor_OnlineDevice=function(v,u){s.Exec("CIM_Sensor","OnlineDevice",{Online:v},u)};s.CIM_Sensor_QuiesceDevice=function(v,u){s.Exec("CIM_Sensor","QuiesceDevice",{Quiesce:v},u)};s.CIM_Sensor_SaveProperties=function(u){s.Exec("CIM_Sensor","SaveProperties",{},u)};s.CIM_Sensor_RestoreProperties=function(u){s.Exec("CIM_Sensor","RestoreProperties",{},u)};s.CIM_Sensor_RequestStateChange=function(v,w,u){s.Exec("CIM_Sensor","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_StatisticalData_ResetSelectedStats=function(v,u){s.Exec("CIM_StatisticalData","ResetSelectedStats",{SelectedStatistics:v},u)};s.CIM_Watchdog_KeepAlive=function(u){s.Exec("CIM_Watchdog","KeepAlive",{},u)};s.CIM_Watchdog_SetPowerState=function(v,w,u){s.Exec("CIM_Watchdog","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_Watchdog_Reset=function(u){s.Exec("CIM_Watchdog","Reset",{},u)};s.CIM_Watchdog_EnableDevice=function(v,u){s.Exec("CIM_Watchdog","EnableDevice",{Enabled:v},u)};s.CIM_Watchdog_OnlineDevice=function(v,u){s.Exec("CIM_Watchdog","OnlineDevice",{Online:v},u)};s.CIM_Watchdog_QuiesceDevice=function(v,u){s.Exec("CIM_Watchdog","QuiesceDevice",{Quiesce:v},u)};s.CIM_Watchdog_SaveProperties=function(u){s.Exec("CIM_Watchdog","SaveProperties",{},u)};s.CIM_Watchdog_RestoreProperties=function(u){s.Exec("CIM_Watchdog","RestoreProperties",{},u)};s.CIM_Watchdog_RequestStateChange=function(v,w,u){s.Exec("CIM_Watchdog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_WiFiPort_SetPowerState=function(v,w,u){s.Exec("CIM_WiFiPort","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_WiFiPort_Reset=function(u){s.Exec("CIM_WiFiPort","Reset",{},u)};s.CIM_WiFiPort_EnableDevice=function(v,u){s.Exec("CIM_WiFiPort","EnableDevice",{Enabled:v},u)};s.CIM_WiFiPort_OnlineDevice=function(v,u){s.Exec("CIM_WiFiPort","OnlineDevice",{Online:v},u)};s.CIM_WiFiPort_QuiesceDevice=function(v,u){s.Exec("CIM_WiFiPort","QuiesceDevice",{Quiesce:v},u)};s.CIM_WiFiPort_SaveProperties=function(u){s.Exec("CIM_WiFiPort","SaveProperties",{},u)};s.CIM_WiFiPort_RestoreProperties=function(u){s.Exec("CIM_WiFiPort","RestoreProperties",{},u)};s.CIM_WiFiPort_RequestStateChange=function(v,w,u){s.Exec("CIM_WiFiPort","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.IPS_HostBasedSetupService_Setup=function(y,z,x,v,A,w,u){s.Exec("IPS_HostBasedSetupService","Setup",{NetAdminPassEncryptionType:y,NetworkAdminPassword:z,McNonce:x,Certificate:v,SigningAlgorithm:A,DigitalSignature:w},u)};s.IPS_HostBasedSetupService_AddNextCertInChain=function(x,v,w,u){s.Exec("IPS_HostBasedSetupService","AddNextCertInChain",{NextCertificate:x,IsLeafCertificate:v,IsRootCertificate:w},u)};s.IPS_HostBasedSetupService_AdminSetup=function(x,y,w,z,v,u){s.Exec("IPS_HostBasedSetupService","AdminSetup",{NetAdminPassEncryptionType:x,NetworkAdminPassword:y,McNonce:w,SigningAlgorithm:z,DigitalSignature:v},u)};s.IPS_HostBasedSetupService_UpgradeClientToAdmin=function(w,x,v,u){s.Exec("IPS_HostBasedSetupService","UpgradeClientToAdmin",{McNonce:w,SigningAlgorithm:x,DigitalSignature:v},u)};s.IPS_HostBasedSetupService_DisableClientControlMode=function(u,v){s.Exec("IPS_HostBasedSetupService","DisableClientControlMode",{_method_dummy:u},v)};s.IPS_KVMRedirectionSettingData_TerminateSession=function(u){s.Exec("IPS_KVMRedirectionSettingData","TerminateSession",{},u)};s.IPS_OptInService_StartOptIn=function(u){s.Exec("IPS_OptInService","StartOptIn",{},u)};s.IPS_OptInService_CancelOptIn=function(u){s.Exec("IPS_OptInService","CancelOptIn",{},u)};s.IPS_OptInService_SendOptInCode=function(v,u){s.Exec("IPS_OptInService","SendOptInCode",{OptInCode:v},u)};s.IPS_OptInService_StartService=function(u){s.Exec("IPS_OptInService","StartService",{},u)};s.IPS_OptInService_StopService=function(u){s.Exec("IPS_OptInService","StopService",{},u)};s.IPS_OptInService_RequestStateChange=function(v,w,u){s.Exec("IPS_OptInService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.IPS_ProvisioningRecordLog_RequestStateChange=function(v,w,u){s.Exec("IPS_ProvisioningRecordLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.IPS_ProvisioningRecordLog_ClearLog=function(u,v){s.Exec("IPS_ProvisioningRecordLog","ClearLog",{_method_dummy:u},v)};s.IPS_SecIOService_RequestStateChange=function(v,w,u){s.Exec("IPS_SecIOService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AmtStatusToStr=function(u){if(s.AmtStatusCodes[u]){return s.AmtStatusCodes[u]}else{return"UNKNOWN_ERROR"}};s.AmtStatusCodes={0:"SUCCESS",1:"INTERNAL_ERROR",2:"NOT_READY",3:"INVALID_PT_MODE",4:"INVALID_MESSAGE_LENGTH",5:"TABLE_FINGERPRINT_NOT_AVAILABLE",6:"INTEGRITY_CHECK_FAILED",7:"UNSUPPORTED_ISVS_VERSION",8:"APPLICATION_NOT_REGISTERED",9:"INVALID_REGISTRATION_DATA",10:"APPLICATION_DOES_NOT_EXIST",11:"NOT_ENOUGH_STORAGE",12:"INVALID_NAME",13:"BLOCK_DOES_NOT_EXIST",14:"INVALID_BYTE_OFFSET",15:"INVALID_BYTE_COUNT",16:"NOT_PERMITTED",17:"NOT_OWNER",18:"BLOCK_LOCKED_BY_OTHER",19:"BLOCK_NOT_LOCKED",20:"INVALID_GROUP_PERMISSIONS",21:"GROUP_DOES_NOT_EXIST",22:"INVALID_MEMBER_COUNT",23:"MAX_LIMIT_REACHED",24:"INVALID_AUTH_TYPE",25:"AUTHENTICATION_FAILED",26:"INVALID_DHCP_MODE",27:"INVALID_IP_ADDRESS",28:"INVALID_DOMAIN_NAME",29:"UNSUPPORTED_VERSION",30:"REQUEST_UNEXPECTED",31:"INVALID_TABLE_TYPE",32:"INVALID_PROVISIONING_STATE",33:"UNSUPPORTED_OBJECT",34:"INVALID_TIME",35:"INVALID_INDEX",36:"INVALID_PARAMETER",37:"INVALID_NETMASK",38:"FLASH_WRITE_LIMIT_EXCEEDED",39:"INVALID_IMAGE_LENGTH",40:"INVALID_IMAGE_SIGNATURE",41:"PROPOSE_ANOTHER_VERSION",42:"INVALID_PID_FORMAT",43:"INVALID_PPS_FORMAT",44:"BIST_COMMAND_BLOCKED",45:"CONNECTION_FAILED",46:"CONNECTION_TOO_MANY",47:"RNG_GENERATION_IN_PROGRESS",48:"RNG_NOT_READY",49:"CERTIFICATE_NOT_READY",1024:"DISABLED_BY_POLICY",2048:"NETWORK_IF_ERROR_BASE",2049:"UNSUPPORTED_OEM_NUMBER",2050:"UNSUPPORTED_BOOT_OPTION",2051:"INVALID_COMMAND",2052:"INVALID_SPECIAL_COMMAND",2053:"INVALID_HANDLE",2054:"INVALID_PASSWORD",2055:"INVALID_REALM",2056:"STORAGE_ACL_ENTRY_IN_USE",2057:"DATA_MISSING",2058:"DUPLICATE",2059:"EVENTLOG_FROZEN",2060:"PKI_MISSING_KEYS",2061:"PKI_GENERATING_KEYS",2062:"INVALID_KEY",2063:"INVALID_CERT",2064:"CERT_KEY_NOT_MATCH",2065:"MAX_KERB_DOMAIN_REACHED",2066:"UNSUPPORTED",2067:"INVALID_PRIORITY",2068:"NOT_FOUND",2069:"INVALID_CREDENTIALS",2070:"INVALID_PASSPHRASE",2072:"NO_ASSOCIATION",2075:"AUDIT_FAIL",2076:"BLOCKING_COMPONENT",2081:"USER_CONSENT_REQUIRED",4096:"APP_INTERNAL_ERROR",4097:"NOT_INITIALIZED",4098:"LIB_VERSION_UNSUPPORTED",4099:"INVALID_PARAM",4100:"RESOURCES",4101:"HARDWARE_ACCESS_ERROR",4102:"REQUESTOR_NOT_REGISTERED",4103:"NETWORK_ERROR",4104:"PARAM_BUFFER_TOO_SHORT",4105:"COM_NOT_INITIALIZED_IN_THREAD",4106:"URL_REQUIRED"};s.GetMessageLog=function(u,v){s.AMT_MessageLog_PositionToFirstRecord(k,[u,v,[]])};function k(w,u,v,x,y){if(x!=200||v.Body.ReturnValue!="0"){y[0](s,null,y[2]);return}s.AMT_MessageLog_GetRecords(v.Body.IterationIdentifier,390,l,y)}function l(D,A,C,E,G){if(E!=200||C.Body.ReturnValue!="0"){G[0](s,null,G[2]);return}var y,z,I,v,u=G[2],F=new Date(),H,B=C.Body.RecordArray;if(typeof B==="string"){C.Body.RecordArray=[C.Body.RecordArray]}for(y in B){v=null;try{v=window.atob(B[y])}catch(w){}if(v!=null){H=ReadIntX(v,0);if((H>0)&&(H<4294967295)){I={DeviceAddress:v.charCodeAt(4),EventSensorType:v.charCodeAt(5),EventType:v.charCodeAt(6),EventOffset:v.charCodeAt(7),EventSourceType:v.charCodeAt(8),EventSeverity:v.charCodeAt(9),SensorNumber:v.charCodeAt(10),Entity:v.charCodeAt(11),EntityInstance:v.charCodeAt(12),EventData:[],Time:new Date((H+(F.getTimezoneOffset()*60))*1000)};for(z=13;z<21;z++){I.EventData.push(v.charCodeAt(z))}I.EntityStr=o[I.Entity];I.Desc=j(I.EventSensorType,I.EventOffset,I.EventData,I.Entity);if(!I.EntityStr){I.EntityStr="Unknown"}u.push(I)}}}if(C.Body.NoMoreRecords!=true){s.AMT_MessageLog_GetRecords(C.Body.IterationIdentifier,390,l,[G[0],u,G[2]])}else{G[0](s,u,G[2])}}var e="Platform firmware (e.g. BIOS)|SMI handler|ISV system management software|Alert ASIC|IPMI|BIOS vendor|System board set vendor|System integrator|Third party add-in|OSV|NIC|System management card".split("|");var p="Unspecified.|No system memory is physically installed in the system.|No usable system memory, all installed memory has experienced an unrecoverable failure.|Unrecoverable hard-disk/ATAPI/IDE device failure.|Unrecoverable system-board failure.|Unrecoverable diskette subsystem failure.|Unrecoverable hard-disk controller failure.|Unrecoverable PS/2 or USB keyboard failure.|Removable boot media not found.|Unrecoverable video controller failure.|No video device detected.|Firmware (BIOS) ROM corruption detected.|CPU voltage mismatch (processors that share same supply have mismatched voltage requirements)|CPU speed matching failure".split("|");var q="Unspecified.|Memory initialization.|Starting hard-disk initialization and test|Secondary processor(s) initialization|User authentication|User-initiated system setup|USB resource configuration|PCI resource configuration|Option ROM initialization|Video initialization|Cache initialization|SM Bus initialization|Keyboard controller initialization|Embedded controller/management controller initialization|Docking station attachment|Enabling docking station|Docking station ejection|Disabling docking station|Calling operating system wake-up vector|Starting operating system boot process|Baseboard or motherboard initialization|reserved|Floppy initialization|Keyboard test|Pointing device test|Primary processor initialization".split("|");var o="Unspecified|Other|Unknown|Processor|Disk|Peripheral|System management module|System board|Memory module|Processor module|Power supply|Add in card|Front panel board|Back panel board|Power system board|Drive backplane|System internal expansion board|Other system board|Processor board|Power unit|Power module|Power management board|Chassis back panel board|System chassis|Sub chassis|Other chassis board|Disk drive bay|Peripheral bay|Device bay|Fan cooling|Cooling unit|Cable interconnect|Memory device|System management software|BIOS|Intel(r) ME|System bus|Group|Intel(r) ME|External environment|Battery|Processing blade|Connectivity switch|Processor/memory module|I/O module|Processor I/O module|Management controller firmware|IPMI channel|PCI bus|PCI express bus|SCSI bus|SATA/SAS bus|Processor front side bus".split("|");s.RealmNames="||Redirection|PT Administration|Hardware Asset|Remote Control|Storage|Event Manager|Storage Admin|Agent Presence Local|Agent Presence Remote|Circuit Breaker|Network Time|General Information|Firmware Update|EIT|LocalUN|Endpoint Access Control|Endpoint Access Control Admin|Event Log Reader|Audit Log|ACL Realm|||Local System".split("|");s.WatchdogCurrentStates={1:"Not Started",2:"Stopped",4:"Running",8:"Expired",16:"Suspended"};function j(x,w,v,u){if(x==15){if(v[0]==235){return"Invalid Data"}if(w==0){return p[v[1]]}return q[v[1]]}if(x==18&&v[0]==170){return"Agent watchdog "+char2hex(v[4])+char2hex(v[3])+char2hex(v[2])+char2hex(v[1])+"-"+char2hex(v[6])+char2hex(v[5])+"-... changed to "+s.WatchdogCurrentStates[v[7]]}if(x==6){return"Authentication failed "+(v[1]+(v[2]<<8))+" times. The system may be under attack."}if(x==30){return"No bootable media"}if(x==32){return"Operating system lockup or power interrupt"}if(x==35){return"System boot failure"}if(x==37){return"System firmware started (at least one CPU is properly executing)."}return"Unknown Sensor Type #"+x}return s}var md5_k=[];for(var i=0;i<64;){md5_k[i]=0|(Math.abs(Math.sin(++i))*4294967296)}function hex_md5(p){var g,k,l,o,r=[],q=unescape(encodeURI(p)),e=q.length,m=[g=1732584193,k=-271733879,~g,~k],n=0;for(;n<=e;){r[n>>2]|=(q.charCodeAt(n)||128)<<8*(n++%4)}r[p=(e+8>>6)*16+14]=e*8;n=0;for(;n<p;n+=16){e=m;o=0;for(;o<64;){e=[l=e[3],((g=e[1]|0)+((l=((e[0]+[g&(k=e[2])|~g&l,l&g|~l&k,g^k^l,k^(g|~l)][e=o>>4])+(md5_k[o]+(r[[o,5*o+1,3*o+5,7*o][e]%16+n]|0))))<<(e=[7,12,17,22,5,9,14,20,4,11,16,23,6,10,15,21][4*e+o++%4])|l>>>32-e)),g,k]}for(o=4;o;){m[--o]=m[o]+e[o]}}p="";for(;o<32;){p+=((m[o>>3]>>((1^o++&7)*4))&15).toString(16)}return p}function rstr_md5(a){return hex2rstr(hex_md5(a))}function execArgumentsToXml(c){if(c===undefined||c===null){return null}var d="";for(var b in c){var a=c[b];if(!a){continue}if(a.__parameterType==="reference"){d+=referenceToXml(b,a)}else{d+=instanceToXml(b,a)}}return d}function instanceToXml(d,c){if(c===undefined||c===null){return null}var b=!!c.__namespace;var j=b?"<q:":"<";var a=b?"</q:":"</";var e=b?(' xmlns:q="'+c.__namespace+'"'):"";var h="<r:"+d+e+">";for(var g in c){if(!c.hasOwnProperty(g)||g.indexOf("__")===0){continue}if(typeof c[g]==="function"||Array.isArray(c[g])){continue}if(typeof c[g]==="object"){console.error("only convert one level down...")}else{h+=j+g+">"+c[g].toString()+a+g+">"}}h+="</r:"+d+">";return h}function referenceToXml(b,a){if(a===undefined||a===null){return null}var c="<r:"+b+"><a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>"+a.__resourceUri+"</w:ResourceURI><w:SelectorSet>";for(var d in a){if(!a.hasOwnProperty(d)||d.indexOf("__")===0){continue}if(typeof a[d]==="function"||typeof a[d]==="object"||Array.isArray(a[d])){continue}c+='<w:Selector Name="'+d+'">'+a[d].toString()+"</w:Selector>"}c+="</w:SelectorSet></a:ReferenceParameters></r:"+b+">";return c}function GetSidString(c){var b="S-"+c.charCodeAt(0)+"-"+c.charCodeAt(7);for(var a=2;a<(c.length/4);a++){b+="-"+ReadIntX(c,a*4)}return b}function GetSidByteArray(d){if(!d||d==null){return null}var c=d.split("-");if(c.length<4||(c[0]!="s"&&c[0]!="S")){return null}for(var a=1;a<c.length;a++){var e=parseInt(c[a]);if(e!=c[a]){return null}c[a]=e}var b=String.fromCharCode(c[1])+String.fromCharCode(c.length-3)+ShortToStr(Math.floor(c[2]/Math.pow(2,32)))+IntToStr((c[2])&65535);for(var a=3;a<c.length;a++){b+=IntToStrX(c[a])}return b}var WsmanStackCreateService=function(h,l,n,k,m,g){var j={};j.NextMessageId=1;j.Address="/wsman";j.comm=CreateWsmanComm(h,l,n,k,m,g);j.PerformAjax=function(q,o,s,r,p){if(p==undefined){p=""}j.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" '+p+"><Header><a:Action>"+q,function(t,u,v){if(u!=200){o(j,null,{Header:{HttpError:u}},u,v);return}var w=j.ParseWsman(t);if(!w||w==null){o(j,null,{Header:{HttpError:u}},601,v)}else{o(j,w.Header.ResourceURI,w,200,v)}},s,r)};j.CancelAllQueries=function(o){j.comm.CancelAllQueries(o)};j.GetNameFromUrl=function(o){var p=o.lastIndexOf("/");return(p==-1)?o:o.substring(p+1)};j.ExecSubscribe=function(w,q,z,o,y,v,x,t,A,u){var r="",s="";if(A!=undefined&&u!=undefined){r="<t:IssuedTokens><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>"+A+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+u+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>";s='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'}if(t!=undefined&&t!=null){t="<a:ReferenceParameters>"+t+"</a:ReferenceParameters>"}else{t=""}var p="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+w+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+d(x)+r+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+q+'"><e:NotifyTo><a:Address>'+z+"</a:Address></e:NotifyTo>"+s+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";j.PerformAjax(p+"</Body></Envelope>",o,y,v,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" 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" xmlns:m="http://x.com"')};j.ExecUnSubscribe=function(r,o,t,q,s){var p="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+r+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+d(s)+"</Header><Body><e:Unsubscribe/>";j.PerformAjax(p+"</Body></Envelope>",o,t,q,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')};j.ExecPut=function(s,r,o,u,q,t){var p="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.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>"+d(t)+"</Header><Body>"+c(s,r);j.PerformAjax(p+"</Body></Envelope>",o,u,q)};j.ExecCreate=function(u,t,o,w,s,v){var r=j.GetNameFromUrl(u);var p="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+u+"</w:ResourceURI><a:MessageID>"+(j.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>"+d(v)+"</Header><Body><g:"+r+' xmlns:g="'+u+'">';for(var q in t){p+="<g:"+q+">"+t[q]+"</g:"+q+">"}j.PerformAjax(p+"</g:"+r+"></Body></Envelope>",o,w,s)};j.ExecCreateXml=function(s,o,p,u,r){var q=j.GetNameFromUrl(s),t="";j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.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></Header><Body><r:"+q+' xmlns:r="'+s+'">'+o+"</r:"+q+"></Body></Envelope>",p,u,r)};j.ExecDelete=function(s,r,o,t,q){var p="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.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>"+d(r)+"</Header><Body /></Envelope>";j.PerformAjax(p,o,t,q)};j.ExecGet=function(q,o,r,p){j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+q+"</w:ResourceURI><a:MessageID>"+(j.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>",o,r,p)};j.ExecMethod=function(u,s,o,q,w,t,v){var p="";for(var r in o){if(o[r]!=null){if(Array.isArray(o[r])){for(var y in o[r]){p+="<r:"+r+">"+o[r][y]+"</r:"+r+">"}}else{p+="<r:"+r+">"+o[r]+"</r:"+r+">"}}}j.ExecMethodXml(u,s,p,q,w,t,v)};j.ExecMethodXml=function(s,q,o,p,u,r,t){j.PerformAjax(s+"/"+q+"</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.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>"+d(t)+"</Header><Body><r:"+q+'_INPUT xmlns:r="'+s+'">'+o+"</r:"+q+"_INPUT></Body></Envelope>",p,u,r)};j.ExecEnum=function(q,o,r,p){j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+q+"</w:ResourceURI><a:MessageID>"+(j.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>',o,r,p)};j.ExecPull=function(r,p,o,s,q){j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+r+"</w:ResourceURI><a:MessageID>"+(j.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>'+p+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",o,s,q)};j.ParseWsman=function(x){try{if(!x.childNodes){x=e(x)}var v={Header:{}},s=x.getElementsByTagName("Header")[0],w;if(!s){s=x.getElementsByTagName("a:Header")[0]}if(!s){return null}for(var u=0;u<s.childNodes.length;u++){var p=s.childNodes[u];v.Header[p.localName]=p.textContent}var o=x.getElementsByTagName("Body")[0];if(!o){o=x.getElementsByTagName("a:Body")[0]}if(!o){return null}if(o.childNodes.length>0){w=o.childNodes[0].localName;if(w.indexOf("_OUTPUT")==w.length-7){w=w.substring(0,w.length-7)}v.Header.Method=w;v.Body=b(o.childNodes[0])}return v}catch(q){console.log("Unable to parse XML: "+x);return null}};function b(u){var q,v={};for(var s=0;s<u.childNodes.length;s++){var o=u.childNodes[s];if(o.childElementCount==0){q=o.textContent}else{q=b(o)}if(q=="true"){q=true}if(q=="false"){q=false}var p=q;if(o.attributes.length>0){p={Value:q};for(var t=0;t<o.attributes.length;t++){p["@"+o.attributes[t].name]=o.attributes[t].value}}if(v[o.localName] instanceof Array){v[o.localName].push(p)}else{if(v[o.localName]==undefined){v[o.localName]=p}else{v[o.localName]=[v[o.localName],p]}}}return v}function c(t,r){if(!t||r===undefined||r===null){return""}var p=j.GetNameFromUrl(t);var s="<r:"+p+' xmlns:r="'+t+'">';for(var q in r){if(!r.hasOwnProperty(q)||q.indexOf("__")===0||q.indexOf("@")===0){continue}if(r[q]===undefined||r[q]===null||typeof r[q]==="function"){continue}if(typeof r[q]==="object"&&r[q]["ReferenceParameters"]){s+="<r:"+q+"><a:Address>"+r[q].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+r[q]["ReferenceParameters"]["ResourceURI"]+"</w:ResourceURI><w:SelectorSet>";var u=r[q]["ReferenceParameters"]["SelectorSet"]["Selector"];if(Array.isArray(u)){for(var o=0;o<u.length;o++){s+="<w:Selector"+a(u[o])+">"+u[o]["Value"]+"</w:Selector>"}}else{s+="<w:Selector"+a(u)+">"+u.Value+"</w:Selector>"}s+="</w:SelectorSet></a:ReferenceParameters></r:"+q+">"}else{if(Array.isArray(r[q])){for(var o=0;o<r[q].length;o++){s+="<r:"+q+">"+r[q][o].toString()+"</r:"+q+">"}}else{s+="<r:"+q+">"+r[q].toString()+"</r:"+q+">"}}}s+="</r:"+p+">";return s}function a(o){if(!o){return""}var q=" ";for(var p in o){if(!o.hasOwnProperty(p)||p.indexOf("@")!==0){continue}q+=p.substring(1)+'="'+o[p]+'" '}return q}function d(s){if(!s){return""}if(typeof s=="string"){return s}if(s.InstanceID){return'<w:SelectorSet><w:Selector Name="InstanceID">'+s.InstanceID+"</w:Selector></w:SelectorSet>"}var q="<w:SelectorSet>";for(var p in s){if(!s.hasOwnProperty(p)){continue}q+='<w:Selector Name="'+p+'">';if(s[p]["ReferenceParameters"]){q+="<a:EndpointReference>";q+="<a:Address>"+s[p]["Address"]+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[p]["ReferenceParameters"]["ResourceURI"]+"</w:ResourceURI><w:SelectorSet>";var r=s[p]["ReferenceParameters"]["SelectorSet"]["Selector"];if(Array.isArray(r)){for(var o=0;o<r.length;o++){q+="<w:Selector"+a(r[o])+">"+r[o]["Value"]+"</w:Selector>"}}else{q+="<w:Selector"+a(r)+">"+r.Value+"</w:Selector>"}q+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else{q+=s[p]}q+="</w:Selector>"}q+="</w:SelectorSet>";return q}function e(o){if(window.DOMParser){return new DOMParser().parseFromString(o,"text/xml")}else{var p=new ActiveXObject("Microsoft.XMLDOM");p.async=false;p.loadXML(o);return p}}return j};var CreateAmtRemoteDesktop=function(m,p){var o={};o.canvasid=m;o.CanvasId=Q(m);o.scrolldiv=p;o.canvas=Q(m).getContext("2d");o.protocol=2;o.state=0;o.acc="";o.ScreenWidth=960;o.ScreenHeight=700;o.width=0;o.height=0;o.rwidth=0;o.rheight=0;o.bpp=2;o.useZRLE=true;o.showmouse=true;o.buttonmask=0;o.localKeyMap=true;o.spare=null;o.sparew=0;o.spareh=0;o.sparew2=0;o.spareh2=0;o.sparecache={};o.ZRLEfirst=1;o.onScreenSizeChange=null;o.frameRateDelay=0;o.kvmDataSupported=false;o.onKvmData=null;o.onKvmDataPending=[];o.onKvmDataAck=-1;o.holding=false;o.lastKeepAlive=Date.now();o.Debug=function(q){console.log(q)};o.xxStateChange=function(q){if(q==0){o.canvas.fillStyle="#000000";o.canvas.fillRect(0,0,o.width,o.height);o.canvas.canvas.width=o.rwidth=o.width=640;o.canvas.canvas.height=o.rheight=o.height=400;QS(o.canvasid).cursor="default"}else{QS(o.canvasid).cursor=o.showmouse?"default":"none"}};o.ProcessData=function(t){if(!t){return}o.acc+=t;while(o.acc.length>0){var q=0;if(o.state==0&&o.acc.length>=12){q=12;o.state=1;o.send("RFB 003.008\n")}else{if(o.state==1&&o.acc.length>=1){q=o.acc.charCodeAt(0)+1;o.send(String.fromCharCode(1));o.state=2}else{if(o.state==2&&o.acc.length>=4){q=4;if(ReadInt(o.acc,0)!=0){return o.Stop()}o.send(String.fromCharCode(1));o.state=3}else{if(o.state==3&&o.acc.length>=24){var D=ReadInt(o.acc,20);if(o.acc.length<24+D){return}q=24+D;o.canvas.canvas.width=o.rwidth=o.width=o.ScreenWidth=ReadShort(o.acc,0);o.canvas.canvas.height=o.rheight=o.height=o.ScreenHeight=ReadShort(o.acc,2);var G="";if(o.useZRLE){G+=IntToStr(16)}G+=IntToStr(0);G+=IntToStr(1092);o.send(String.fromCharCode(2,0)+ShortToStr((G.length/4)+1)+G+IntToStr(-223));if(o.bpp==1){o.send(String.fromCharCode(0,0,0,0,8,8,0,1)+ShortToStr(7)+ShortToStr(7)+ShortToStr(3)+String.fromCharCode(5,2,0,0,0,0))}o.state=4;o.parent.xxStateChange(3);h();if(o.onScreenSizeChange!=null){o.onScreenSizeChange(o,o.ScreenWidth,o.ScreenHeight)}}else{if(o.state==4){switch(o.acc.charCodeAt(0)){case 0:if(o.acc.length<4){return}o.state=100+ReadShort(o.acc,2);q=4;break;case 2:q=1;break;case 3:if(o.acc.length<8){return}var C=ReadInt(o.acc,4)+8;if(o.acc.length<C){return}q=n(o.acc);break}}else{if(o.state>100&&o.acc.length>=12){var I=ReadShort(o.acc,0),K=ReadShort(o.acc,2),H=ReadShort(o.acc,4),A=ReadShort(o.acc,6),F=H*A,z=ReadInt(o.acc,8);if(z<17){if(H<1||H>64||A<1||A>64){console.log("Invalid tile size ("+H+","+A+"), disconnecting.");return o.Stop()}if(o.sparew!=H||o.spareh!=A){o.sparew=o.sparew2=H;o.spareh=o.spareh2=A;var J=o.sparew2+"x"+o.spareh2;o.spare=o.sparecache[J];if(!o.spare){o.sparecache[J]=o.spare=o.canvas.createImageData(o.sparew2,o.spareh2)}}}if(z==4294967073){o.canvas.canvas.width=o.rwidth=o.width=H;o.canvas.canvas.height=o.rheight=o.height=A;o.send(String.fromCharCode(3,0,0,0,0,0)+ShortToStr(o.width)+ShortToStr(o.height));q=12;if(o.onScreenSizeChange!=null){o.onScreenSizeChange(o,o.ScreenWidth,o.ScreenHeight)}}else{if(z==0){var E=12,r=12+(F*o.bpp);if(o.acc.length<r){return}q=r;for(var B=0;B<F;B++){j(o.acc.charCodeAt(E++)+((o.bpp==2)?(o.acc.charCodeAt(E++)<<8):0),B)}g(o.spare,I,K)}else{if(z==16){if(o.acc.length<16){return}var u=ReadInt(o.acc,12);if(o.acc.length<(16+u)){return}var E=16,v=5,w=0;if(u>5&&o.acc.charCodeAt(E)==0&&ReadShortX(o.acc,E+1)==(u-v)){a(o.acc,E+5,I,K,H,A,F,u)}q=16+u}else{o.Debug("Unknown Encoding: "+z);return o.Stop()}}}if(--o.state==100){o.state=4;if(o.frameRateDelay==0){h()}else{setTimeout(h,o.frameRateDelay)}}}}}}}}if(q==0){return}o.acc=o.acc.substring(q)}};function a(t,C,K,L,J,w,G,u){var H=t.charCodeAt(C++),A,I,F,B={},D=0,E=0,z;if(H==0){for(z=0;z<G;z++){j(t.charCodeAt(C++)+((o.bpp==2)?(t.charCodeAt(C++)<<8):0),z)}g(o.spare,K,L)}else{if(H==1){I=t.charCodeAt(C++)+((o.bpp==2)?(t.charCodeAt(C++)<<8):0);o.canvas.fillStyle="rgb("+((o.bpp==1)?((I&224)+","+((I&28)<<3)+","+b((I&3)<<6)):(((I>>8)&248)+","+((I>>3)&252)+","+((I&31)<<3)))+")";o.canvas.fillRect(K,L,J,w)}else{if(H>1&&H<17){var r=4,q=15;for(z=0;z<H;z++){B[z]=t.charCodeAt(C++)+((o.bpp==2)?(t.charCodeAt(C++)<<8):0)}if(H==2){r=1;q=1}else{if(H<=4){r=2;q=3}}while(D<G&&C<t.length){I=t.charCodeAt(C++);for(z=(8-r);z>=0;z-=r){j(B[(I>>z)&q],D++)}}g(o.spare,K,L)}else{if(H==128){while(D<G&&C<t.length){I=t.charCodeAt(C++)+((o.bpp==2)?(t.charCodeAt(C++)<<8):0);E=1;do{E+=(F=t.charCodeAt(C++))}while(F==255);while(--E>=0){j(I,D++)}}g(o.spare,K,L)}else{if(H>129){for(z=0;z<(H-128);z++){B[z]=t.charCodeAt(C++)+((o.bpp==2)?(t.charCodeAt(C++)<<8):0)}while(D<G&&C<t.length){E=1;A=t.charCodeAt(C++);I=B[A%128];if(A>127){do{E+=(F=t.charCodeAt(C++))}while(F==255)}while(--E>=0){j(I,D++)}}g(o.spare,K,L)}}}}}}o.hold=function(q){if(o.holding==q){return}o.holding=q;o.canvas.fillStyle="#000000";o.canvas.fillRect(0,0,o.width,o.height);if(o.holding==false){if((o.canvas.canvas.width!=o.width)||(o.canvas.canvas.height!=o.height)){o.canvas.canvas.width=o.width;o.canvas.canvas.height=o.height;if(o.onScreenSizeChange!=null){o.onScreenSizeChange(o,o.ScreenWidth,o.ScreenHeight)}}o.Send(String.fromCharCode(3,0,0,0,0,0)+ShortToStr(o.width)+ShortToStr(o.height))}else{o.UnGrabMouseInput();o.UnGrabKeyInput()}};function g(q,r,s){if(o.holding==true){return}o.canvas.putImageData(q,r,s)}function j(s,q){var r=q*4;if(o.bpp==1){o.spare.data[r++]=s&224;o.spare.data[r++]=(s&28)<<3;o.spare.data[r++]=b((s&3)<<6)}else{o.spare.data[r++]=(s>>8)&248;o.spare.data[r++]=(s>>3)&252;o.spare.data[r++]=(s&31)<<3}o.spare.data[r]=255}function b(q){return(q>127)?(q+32):q}function h(){if(o.holding==true){return}o.send(String.fromCharCode(3,1,0,0,0,0)+ShortToStr(o.rwidth)+ShortToStr(o.rheight))}o.Start=function(){o.state=0;o.acc="";o.ZRLEfirst=1;o.onKvmDataPending=[];o.onKvmDataAck=-1;o.kvmDataSupported=false;for(var q in o.sparecache){delete o.sparecache[q]}};o.Stop=function(){o.UnGrabMouseInput();o.UnGrabKeyInput();o.parent.Stop()};o.send=function(q){o.parent.send(q)};var l={Pause:19,CapsLock:20,Space:32,Quote:39,Minus:45,NumpadMultiply:42,NumpadAdd:43,PrintScreen:44,Comma:44,NumpadSubtract:45,NumpadDecimal:46,Period:46,Slash:47,NumpadDivide:47,Semicolon:59,Equal:61,OSLeft:91,BracketLeft:91,OSRight:91,Backslash:92,BracketRight:93,ContextMenu:93,Backquote:96,NumLock:144,ScrollLock:145,Backspace:65288,Tab:65289,Enter:65293,NumpadEnter:65293,Escape:65307,Delete:65535,Home:65360,PageUp:65365,PageDown:65366,ArrowLeft:65361,ArrowUp:65362,ArrowRight:65363,ArrowDown:65364,End:65367,Insert:65379,F1:65470,F2:65471,F3:65472,F4:65473,F5:65474,F6:65475,F7:65476,F8:65477,F9:65478,F10:65479,F11:65480,F12:65481,ShiftLeft:65505,ShiftRight:65506,ControlLeft:65507,ControlRight:65508,AltLeft:65513,AltRight:65514,MetaLeft:65511,MetaRight:65512};function k(q){if(q.code.startsWith("Key")&&q.code.length==4){return q.code.charCodeAt(3)+((q.shiftKey==false)?32:0)}if(q.code.startsWith("Digit")&&q.code.length==6){return q.code.charCodeAt(5)}if(q.code.startsWith("Numpad")&&q.code.length==7){return q.code.charCodeAt(6)}return l[q.code]}function c(q,r){if(!r){r=window.event}if(r.code&&(o.localKeyMap==false)){var s=k(r);if(s!=null){o.sendkey(s,q)}}else{var s=r.keyCode,t=s;if(r.shiftKey==false&&s>=65&&s<=90){t=s+32}if(s>=112&&s<=124){t=s+65358}if(s==8){t=65288}if(s==9){t=65289}if(s==13){t=65293}if(s==16){t=65505}if(s==17){t=65507}if(s==18){t=65513}if(s==27){t=65307}if(s==33){t=65365}if(s==34){t=65366}if(s==35){t=65367}if(s==36){t=65360}if(s==37){t=65361}if(s==38){t=65362}if(s==39){t=65363}if(s==40){t=65364}if(s==45){t=65379}if(s==46){t=65535}if(s>=96&&s<=105){t=s-48}if(s==106){t=42}if(s==107){t=43}if(s==109){t=45}if(s==110){t=46}if(s==111){t=47}if(s==186){t=59}if(s==187){t=61}if(s==188){t=44}if(s==189){t=45}if(s==190){t=46}if(s==191){t=47}if(s==192){t=96}if(s==219){t=91}if(s==220){t=92}if(s==221){t=93}if(s==222){t=39}o.sendkey(t,q)}return o.haltEvent(r)}o.sendkey=function(s,q){if(typeof s=="object"){for(var r in s){o.sendkey(s[r][0],s[r][1])}}else{o.send(String.fromCharCode(4,q,0,0)+IntToStr(s))}};function n(q){if(q.length<8){return 0}var s=ReadInt(o.acc,4)+8;if(q.length<s){return 0}if(o.onKvmData!=null){var r=q.substring(8,s);if((r.length>=16)&&(r.substring(0,15)=="\0KvmDataChannel")){if(o.kvmDataSupported==false){o.kvmDataSupported=true;console.log("KVM Data Channel Supported.")}if(((o.onKvmDataAck==-1)&&(r.length==16))||(r.charCodeAt(15)!=0)){o.onKvmDataAck=true}if(r.length>=16){o.onKvmData(r.substring(16))}if((o.onKvmDataAck==true)&&(o.onKvmDataPending.length>0)){o.sendKvmData(o.onKvmDataPending.shift())}}}return s}o.sendKvmData=function(q){if(o.onKvmDataAck!==true){o.onKvmDataPending.push(q)}else{q="\0KvmDataChannel\0"+q;o.send(String.fromCharCode(6,0,0,0)+IntToStr(q.length)+q);o.onKvmDataAck=false}};o.sendKeepAlive=function(){if(o.lastKeepAlive<Date.now()-5000){o.lastKeepAlive=Date.now();o.send(String.fromCharCode(6,0,0,0)+IntToStr(16)+"\0KvmDataChannel\0")}};o.SendCtrlAltDelMsg=function(){o.sendcad()};o.sendcad=function(){o.sendkey([[65507,1],[65513,1],[65535,1],[65535,0],[65513,0],[65507,0]])};var e=false;var d=false;o.GrabMouseInput=function(){if(e==true){return}var q=o.canvas.canvas;q.onmouseup=o.mouseup;q.onmousedown=o.mousedown;q.onmousemove=o.mousemove;e=true};o.UnGrabMouseInput=function(){if(e==false){return}var q=o.canvas.canvas;q.onmousemove=null;q.onmouseup=null;q.onmousedown=null;e=false};o.GrabKeyInput=function(){if(d==true){return}document.onkeyup=o.handleKeyUp;document.onkeydown=o.handleKeyDown;document.onkeypress=o.handleKeys;d=true};o.UnGrabKeyInput=function(){if(d==false){return}document.onkeyup=null;document.onkeydown=null;document.onkeypress=null;d=false};o.handleKeys=function(q){return o.haltEvent(q)};o.handleKeyUp=function(q){return c(0,q)};o.handleKeyDown=function(q){return c(1,q)};o.haltEvent=function(q){if(q.preventDefault){q.preventDefault()}if(q.stopPropagation){q.stopPropagation()}return false};o.mousedblclick=function(q){};o.mousedown=function(q){o.buttonmask|=(1<<q.button);return o.mousemove(q)};o.mouseup=function(q){o.buttonmask&=(65535-(1<<q.button));return o.mousemove(q)};o.mousemove=function(q){if(o.state!=4){return true}var r=o.getPositionOfControl(Q(o.canvasid));o.mx=(q.pageX-r[0])*(o.canvas.canvas.height/Q(o.canvasid).offsetHeight);o.my=((q.pageY-r[1]+(p?p.scrollTop:0))*(o.canvas.canvas.width/Q(o.canvasid).offsetWidth));o.send(String.fromCharCode(5,o.buttonmask)+ShortToStr(o.mx)+ShortToStr(o.my));return o.haltEvent(q)};o.getPositionOfControl=function(q){var r=Array(2);r[0]=r[1]=0;while(q){r[0]+=q.offsetLeft;r[1]+=q.offsetTop;q=q.offsetParent}return r};return o};var CreateAmtRemoteTerminal=function(B){var C={};C.DivId=B;C.DivElement=document.getElementById(B);C.protocol=1;C.fxEmulation=0;C.lineFeed="\r\n";C.debugmode=0;C.width=80;C.height=25;var r=21;var s=13;var m=["000000","BB0000","00BB00","BBBB00","0000BB","BB00BB","00BBBB","BBBBBB","555555","FF5555","55FF55","FFFF55","5555FF","FF55FF","55FFFF","FFFFFF"];var p=0;var o=7;var n=0;var t=true;var w=0;var x=0;var v=0;var d=[];var e=0;var l=[];var y=[];var A=1;var z=2;C.Start=function(){};C.Init=function(E,D){C.width=E?E:80;C.height=D?D:25;for(var G=0;G<C.height;G++){y[G]=[];l[G]=[];for(var F=0;F<C.width;F++){y[G][F]=" ";l[G][F]=(7<<6)}}C.TermInit();C.TermDraw()};C.xxStateChange=function(D){};C.ProcessData=function(D){if(C.debugmode==2){console.log("TRecv("+D.length+"): "+rstr2hex(D))}if(C.capture!=null){C.capture+=D}k(D);C.TermDraw()};function k(E){for(var D=0;D<E.length;D++){j(String.fromCharCode(E.charCodeAt(D)),E.charCodeAt(D))}}function j(D,E){switch(v){case 0:switch(E){case 27:v=1;break;default:h(D);break}break;case 1:switch(D){case"[":e=0;d=[];v=2;break;case"(":v=4;break;case")":v=5;break;default:v=0;break}break;case 2:if(D>="0"&&D<="9"){if(!d[e]){d[e]=(D-"0")}else{d[e]=((d[e]*10)+(D-"0"))}break}else{if(D==";"){e++;break}else{if(!d[0]){d[0]=0}g(D,d,e+1);v=0}}break;case 4:v=0;break;case 5:v=0;break}}function g(G,D,E){var H;switch(G){case"c":C.TermResetScreen();break;case"A":if(E==1){x-=D[0];if(x<0){x=0}}break;case"B":if(E==1){x+=D[0];if(x>C.height){x=C.height}}break;case"C":if(E==1){w+=D[0];if(w>C.width){w=C.width}}break;case"D":if(E==1){w-=D[0];if(w<0){w=0}}break;case"d":if(E==1){x=D[0]-1;if(x>C.height){x=C.height}if(x<0){x=0}}break;case"G":if(E==1){w=D[0]-1;if(w<0){w=0}if(w>79){w=79}}break;case"J":if(E==1&&D[0]==2){C.TermClear((n<<12)+(o<<6));w=0;x=0}else{if(E==0||E==1&&D[0]==0){b();for(H=x+1;H<C.height;H++){c(H)}}else{if(E==1&&D[0]==1){b();for(H=0;H<x-1;H++){c(H)}}}}break;case"H":if(E==2){if(D[0]<1){D[0]=1}if(D[1]<1){D[1]=1}if(D[0]>C.height){D[0]=C.height}if(D[1]>C.width){D[1]=C.width}x=D[0]-1;w=D[1]-1}else{x=0;w=0}break;case"m":for(H=0;H<E;H++){if(!D[H]||D[H]==0){n=0;o=7;p=0}else{if(D[H]==1){if(o<8){o+=8}}else{if(D[H]==2||D[H]==22){if(o>=8){o-=8}}else{if(D[H]==7){p=2}else{if(D[H]==27){p=0}else{if(D[H]>=30&&D[H]<=37){var F=(o>=8);o=(D[H]-30);if(F&&o<=8){o+=8}}else{if(D[H]>=40&&D[H]<=47){n=(D[H]-40)}else{if(D[H]>=90&&D[H]<=99){o=(D[H]-82)}else{if(D[H]>=100&&D[H]<=109){n=(D[H]-92)}}}}}}}}}}break;case"K":if(E==0||(E==1&&(!D[0]||D[0]==0))){b()}else{if(E==1){if(D[0]==1){a()}else{if(D[0]==2){c(x)}}}}break;case"h":t=true;break;case"l":t=false;break;default:break}}C.ProcessVt100String=function(E){for(var D=0;D<E.length;D++){h(String.fromCharCode(E.charCodeAt(D)))}};function h(D){if(D=="\0"||D.charCodeAt()==7){return}var E=D.charCodeAt();switch(E){case 16:D=" ";break;case 24:D="?";break;case 25:D="?";break}if(w>C.width){w=C.width}if(x>(C.height-1)){x=(C.height-1)}switch(D){case"\b":if(w>0){w=w-1;q(" ")}break;case"\t":var F=8-(w%8);for(var G=0;G<F;G++){h(" ")}break;case"\n":x++;if(x>(C.height-1)){u(1);x=(C.height-1)}if(C.lineFeed="\n"){w=0}break;case"\r":w=0;break;default:if(w>=C.width){w=0;if(t){x++}if(x>=(C.height-1)){u(1);x=(C.height-1)}}q(D);w++;break}}function q(D){y[x][w]=D;l[x][w]=(o<<6)+(n<<12)+p}C.TermClear=function(D){for(var F=0;F<C.height;F++){for(var E=0;E<C.width;E++){y[F][E]=" ";l[F][E]=D}}};C.TermResetScreen=function(){p=0;o=7;n=0;t=true;w=0;x=0;C.TermClear(7<<6)};function b(){var D=(n<<12);for(var E=w;E<C.width;E++){y[x][E]=" ";l[x][E]=D}}function a(){var D=(n<<12);for(var E=0;E<w;E++){y[x][E]=" ";l[x][E]=D}}function c(D){var E=(n<<12);for(var F=0;F<C.width;F++){y[D][F]=" ";l[D][F]=E}}C.TermSendKeys=function(D){if(C.debugmode==2){if(C.debugmode==2){console.log("TSend("+D.length+"): "+rstr2hex(D))}}C.parent.send(D)};C.TermSendKey=function(D){if(C.debugmode==2){if(C.debugmode==2){console.log("TSend(1): "+rstr2hex(String.fromCharCode(D)))}}C.parent.send(String.fromCharCode(D))};function u(D){var E,F;for(F=0;F<C.height-D;F++){y[F]=y[F+D];l[F]=l[F+D]}for(F=C.height-D;F<C.height;F++){y[F]=[];l[F]=[];for(E=0;E<C.width;E++){y[F][E]=" ";l[F][E]=(7<<6)}}}C.TermHandleKeys=function(D){if(!D.ctrlKey){if(D.which==127){C.TermSendKey(8)}else{if(D.which==13){C.TermSendKeys(C.lineFeed)}else{if(D.which!=0){C.TermSendKey(D.which)}}}return false}if(D.preventDefault){D.preventDefault()}if(D.stopPropagation){D.stopPropagation()}};C.TermHandleKeyUp=function(D){if((D.which!=8)&&(D.which!=32)&&(D.which!=9)){return true}if(D.preventDefault){D.preventDefault()}if(D.stopPropagation){D.stopPropagation()}return false};C.TermHandleKeyDown=function(D){if((D.which>=65)&&(D.which<=90)&&(D.ctrlKey==true)){C.TermSendKey(D.which-64);if(D.preventDefault){D.preventDefault()}if(D.stopPropagation){D.stopPropagation()}return}if(D.which==27){C.TermSendKeys(String.fromCharCode(27));return true}if(D.which==37){C.TermSendKeys(String.fromCharCode(27,91,68));return true}if(D.which==38){C.TermSendKeys(String.fromCharCode(27,91,65));return true}if(D.which==39){C.TermSendKeys(String.fromCharCode(27,91,67));return true}if(D.which==40){C.TermSendKeys(String.fromCharCode(27,91,66));return true}if(D.which==9){C.TermSendKeys("\t");if(D.preventDefault){D.preventDefault()}if(D.stopPropagation){D.stopPropagation()}return true}if(D.which!=8&&D.which!=32&&D.which!=9){return true}C.TermSendKey(D.which);if(D.preventDefault){D.preventDefault()}if(D.stopPropagation){D.stopPropagation()}return false};C.TermDraw=function(){var E,D="",F="",G,H=1,J,K;for(var L=0;L<C.height;++L){for(var I=0;I<C.width;++I){G=l[L][I];if(w==I&&x==L){G|=z}if(G!=H){D+=F;F="";J=6;K=12;if(G&z){J=12;K=6}D+='<span style="color:#'+m[(G>>J)&63]+";background-color:#"+m[(G>>K)&63];if(G&A){D+=";text-decoration:underline"}D+=';">';F="</span>"+F;H=G}E=y[L][I];switch(E){case"&":D+="&amp;";break;case"<":D+="&lt;";break;case">":D+="&gt;";break;case" ":D+="&nbsp;";break;default:D+=E;break}}if(L!=(C.height-1)){D+="<br>"}}C.DivElement.innerHTML="<font size='4'><b>"+D+F+"</b></font>"};C.TermInit=function(){C.TermResetScreen()};C.Init();return C};var ZLIB=(ZLIB||{});if(typeof ZLIB.common_initialized==="undefined"){ZLIB.Z_NO_FLUSH=0;ZLIB.Z_PARTIAL_FLUSH=1;ZLIB.Z_SYNC_FLUSH=2;ZLIB.Z_FULL_FLUSH=3;ZLIB.Z_FINISH=4;ZLIB.Z_BLOCK=5;ZLIB.Z_TREES=6;ZLIB.Z_OK=0;ZLIB.Z_STREAM_END=1;ZLIB.Z_NEED_DICT=2;ZLIB.Z_ERRNO=(-1);ZLIB.Z_STREAM_ERROR=(-2);ZLIB.Z_DATA_ERROR=(-3);ZLIB.Z_MEM_ERROR=(-4);ZLIB.Z_BUF_ERROR=(-5);ZLIB.Z_VERSION_ERROR=(-6);ZLIB.Z_DEFLATED=8;ZLIB.z_stream=function(){this.next_in=0;this.avail_in=0;this.total_in=0;this.next_out=0;this.avail_out=0;this.total_out=0;this.msg=null;this.state=null;this.data_type=0;this.adler=0;this.input_data="";this.output_data="";this.error=0;this.checksum_function=null};ZLIB.gz_header=function(){this.text=0;this.time=0;this.xflags=0;this.os=255;this.extra=null;this.extra_len=0;this.extra_max=0;this.name=null;this.name_max=0;this.comment=null;this.comm_max=0;this.hcrc=0;this.done=0};ZLIB.common_initialized=true}if(typeof ZLIB==="undefined"){alert("ZLIB is not defined. SRC zlib.js before zlib-inflate.js")}(function(){var o=15;var G=0;var D=1;var am=2;var af=3;var A=4;var B=5;var ac=6;var j=7;var F=8;var q=9;var p=10;var an=11;var ao=12;var aj=13;var l=14;var k=15;var al=16;var W=17;var g=18;var S=19;var R=20;var T=21;var r=22;var s=23;var aa=24;var Y=25;var d=26;var V=27;var v=28;var a=29;var ab=30;var ak=31;var z=852;var y=592;var x=(z+y);var h=0;var X=1;var u=2;var N=[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];var O=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,203,69];var L=[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,0,0];var M=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];ZLIB.inflate_copyright=" inflate 1.2.6 Copyright 1995-2012 Mark Adler ";function K(aR,aV){var aM=15;var aU=aR.next;var at=(aV==u?aR.distbits:aR.lenbits);var aX=aR.work;var aH=aR.lens;var aI=(aV==u?aR.nlen:0);var aS=aR.codes;var au;if(aV==X){au=aR.nlen}else{if(aV==u){au=aR.ndist}else{au=19}}var aG;var aT;var aN,aL;var aQ;var aw;var ax;var aF;var aW;var aD;var aE;var aB;var aJ;var aK;var aC;var aO;var aq;var ar;var az;var aA;var ay;var av=new Array(aM+1);var aP=new Array(aM+1);for(aG=0;aG<=aM;aG++){av[aG]=0}for(aT=0;aT<au;aT++){av[aH[aI+aT]]++}aQ=at;for(aL=aM;aL>=1;aL--){if(av[aL]!=0){break}}if(aQ>aL){aQ=aL}if(aL==0){aC={op:64,bits:1,val:0};aS[aU++]=aC;aS[aU++]=aC;if(aV==u){aR.distbits=1}else{aR.lenbits=1}aR.next=aU;return 0}for(aN=1;aN<aL;aN++){if(av[aN]!=0){break}}if(aQ<aN){aQ=aN}aF=1;for(aG=1;aG<=aM;aG++){aF<<=1;aF-=av[aG];if(aF<0){return -1}}if(aF>0&&(aV==h||aL!=1)){aR.next=aU;return -1}aP[1]=0;for(aG=1;aG<aM;aG++){aP[aG+1]=aP[aG]+av[aG]}for(aT=0;aT<au;aT++){if(aH[aI+aT]!=0){aX[aP[aH[aI+aT]]++]=aT}}switch(aV){case h:aq=az=aX;ar=0;aA=0;ay=19;break;case X:aq=N;ar=-257;az=O;aA=-257;ay=256;break;default:aq=L;az=M;ar=0;aA=0;ay=-1}aD=0;aT=0;aG=aN;aO=aU;aw=aQ;ax=0;aJ=-1;aW=1<<aQ;aK=aW-1;if((aV==X&&aW>=z)||(aV==u&&aW>=y)){aR.next=aU;return 1}for(;;){aC={op:0,bits:aG-ax,val:0};if(aX[aT]<ay){aC.val=aX[aT]}else{if(aX[aT]>ay){aC.op=az[aA+aX[aT]];aC.val=aq[ar+aX[aT]]}else{aC.op=32+64}}aE=1<<(aG-ax);aB=1<<aw;aN=aB;do{aB-=aE;aS[aO+(aD>>>ax)+aB]=aC}while(aB!=0);aE=1<<(aG-1);while(aD&aE){aE>>>=1}if(aE!=0){aD&=aE-1;aD+=aE}else{aD=0}aT++;if(--(av[aG])==0){if(aG==aL){break}aG=aH[aI+aX[aT]]}if(aG>aQ&&(aD&aK)!=aJ){if(ax==0){ax=aQ}aO+=aN;aw=aG-ax;aF=(1<<aw);while(aw+ax<aL){aF-=av[aw+ax];if(aF<=0){break}aw++;aF<<=1}aW+=1<<aw;if((aV==X&&aW>=z)||(aV==u&&aW>=y)){aR.next=aU;return 1}aJ=aD&aK;aS[aU+aJ]={op:aw,bits:aQ,val:aO-aU}}}if(aD!=0){aS[aO+aD]={op:64,bits:aG-ax,val:0}}aR.next=aU+aW;if(aV==u){aR.distbits=aQ}else{aR.lenbits=aQ}return 0}function H(aN,aL){var aM;var aC;var aI;var aD;var aK;var aq;var ax;var aR;var aO;var aQ;var aP;var aB;var ar;var at;var aE;var au;var aH;var aw;var aA;var aJ;var aF;var av;var az=-1;var ay=-1;aM=aN.state;aC=aN.input_data;aI=aN.next_in;aD=aI+aN.avail_in-5;aK=aN.next_out;aq=aK-(aL-aN.avail_out);ax=aK+(aN.avail_out-257);aR=aM.wsize;aO=aM.whave;aQ=aM.wnext;aP=aM.window;aB=aM.hold;ar=aM.bits;at=aM.codes;aE=aM.lencode;au=aM.distcode;aH=(1<<aM.lenbits)-1;aw=(1<<aM.distbits)-1;loop:do{if(ar<15){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8;aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}aA=at[aE+(aB&aH)];dolen:while(true){aJ=aA.bits;aB>>>=aJ;ar-=aJ;aJ=aA.op;if(aJ==0){aN.output_data+=String.fromCharCode(aA.val);aK++}else{if(aJ&16){aF=aA.val;aJ&=15;if(aJ){if(ar<aJ){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}aF+=aB&((1<<aJ)-1);aB>>>=aJ;ar-=aJ}if(ar<15){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8;aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}aA=at[au+(aB&aw)];dodist:while(true){aJ=aA.bits;aB>>>=aJ;ar-=aJ;aJ=aA.op;if(aJ&16){av=aA.val;aJ&=15;if(ar<aJ){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8;if(ar<aJ){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}}av+=aB&((1<<aJ)-1);aB>>>=aJ;ar-=aJ;aJ=aK-aq;if(av>aJ){aJ=av-aJ;if(aJ>aO){if(aM.sane){aN.msg="invalid distance too far back";aM.mode=a;break loop}}az=0;ay=-1;if(aQ==0){az+=aR-aJ;if(aJ<aF){aF-=aJ;aN.output_data+=aP.substring(az,az+aJ);aK+=aJ;aJ=0;az=-1;ay=aK-av}}else{az+=aQ-aJ;if(aJ<aF){aF-=aJ;aN.output_data+=aP.substring(az,az+aJ);aK+=aJ;az=-1;ay=aK-av}}}else{az=-1;ay=aK-av}if(az>=0){aN.output_data+=aP.substring(az,az+aF);aK+=aF;az+=aF}else{var aG=aF;if(aG>aK-ay){aG=aK-ay}aN.output_data+=aN.output_data.substring(ay,ay+aG);aK+=aG;aF-=aG;ay+=aG;aK+=aF;while(aF>2){aN.output_data+=aN.output_data.charAt(ay++);aN.output_data+=aN.output_data.charAt(ay++);aN.output_data+=aN.output_data.charAt(ay++);aF-=3}if(aF){aN.output_data+=aN.output_data.charAt(ay++);if(aF>1){aN.output_data+=aN.output_data.charAt(ay++)}}}}else{if((aJ&64)==0){aA=at[au+(aA.val+(aB&((1<<aJ)-1)))];continue dodist}else{aN.msg="invalid distance code";aM.mode=a;break loop}}break dodist}}else{if((aJ&64)==0){aA=at[aE+(aA.val+(aB&((1<<aJ)-1)))];continue dolen}else{if(aJ&32){aM.mode=an;break loop}else{aN.msg="invalid literal/length code";aM.mode=a;break loop}}}}break dolen}}while(aI<aD&&aK<ax);aF=ar>>>3;aI-=aF;ar-=aF<<3;aB&=(1<<ar)-1;aN.next_in=aI;aN.next_out=aK;aN.avail_in=(aI<aD?5+(aD-aI):5-(aI-aD));aN.avail_out=(aK<ax?257+(ax-aK):257-(aK-ax));aM.hold=aB;aM.bits=ar}function ae(at){var ar;var aq=new Array(at);for(ar=0;ar<at;ar++){aq[ar]=0}return aq}function E(at,ar,aq){return(at&&(ar in at))?at[ar]:aq}function e(){return 0}function J(){var ar;this.mode=0;this.last=0;this.wrap=0;this.havedict=0;this.flags=0;this.dmax=0;this.check=0;this.total=0;this.head=null;this.wbits=0;this.wsize=0;this.whave=0;this.wnext=0;this.window=null;this.hold=0;this.bits=0;this.length=0;this.offset=0;this.extra=0;this.lencode=0;this.distcode=0;this.lenbits=0;this.distbits=0;this.ncode=0;this.nlen=0;this.ndist=0;this.have=0;this.next=0;this.lens=ae(320);this.work=ae(288);this.codes=new Array(x);var aq={op:0,bits:0,val:0};for(ar=0;ar<x;ar++){this.codes[ar]=aq}this.sane=0;this.back=0;this.was=0}ZLIB.inflateResetKeep=function(ar){var aq;if(!ar||!ar.state){return ZLIB.Z_STREAM_ERROR}aq=ar.state;ar.total_in=ar.total_out=aq.total=0;ar.msg=null;if(aq.wrap){ar.adler=aq.wrap&1}aq.mode=G;aq.last=0;aq.havedict=0;aq.dmax=32768;aq.head=null;aq.hold=0;aq.bits=0;aq.lencode=0;aq.distcode=0;aq.next=0;aq.sane=1;aq.back=-1;return ZLIB.Z_OK};ZLIB.inflateReset=function(ar,at){var au;var aq;if(!ar||!ar.state){return ZLIB.Z_STREAM_ERROR}aq=ar.state;if(typeof at==="undefined"){at=o}if(at<0){au=0;at=-at}else{au=(at>>>4)+1;if(at<48){at&=15}}if(au==1&&(typeof ZLIB.adler32==="function")){ar.checksum_function=ZLIB.adler32}else{if(au==2&&(typeof ZLIB.crc32==="function")){ar.checksum_function=ZLIB.crc32}else{ar.checksum_function=e}}if(at&&(at<8||at>15)){return ZLIB.Z_STREAM_ERROR}if(aq.window&&aq.wbits!=at){aq.window=null}aq.wrap=au;aq.wbits=at;aq.wsize=0;aq.whave=0;aq.wnext=0;return ZLIB.inflateResetKeep(ar)};ZLIB.inflateInit=function(ar){var aq=new ZLIB.z_stream();aq.state=new J();ZLIB.inflateReset(aq,ar);return aq};ZLIB.inflatePrime=function(at,aq,au){var ar;if(!at||!at.state){return ZLIB.Z_STREAM_ERROR}ar=at.state;if(aq<0){ar.hold=0;ar.bits=0;return ZLIB.Z_OK}if(aq>16||ar.bits+aq>32){return ZLIB.Z_STREAM_ERROR}au&=(1<<aq)-1;ar.hold+=au<<ar.bits;ar.bits+=aq;return ZLIB.Z_OK};var U=null;var t=null;function C(ar){var aq;if(!U){U=[{op:96,bits:7,val:0},{op:0,bits:8,val:80},{op:0,bits:8,val:16},{op:20,bits:8,val:115},{op:18,bits:7,val:31},{op:0,bits:8,val:112},{op:0,bits:8,val:48},{op:0,bits:9,val:192},{op:16,bits:7,val:10},{op:0,bits:8,val:96},{op:0,bits:8,val:32},{op:0,bits:9,val:160},{op:0,bits:8,val:0},{op:0,bits:8,val:128},{op:0,bits:8,val:64},{op:0,bits:9,val:224},{op:16,bits:7,val:6},{op:0,bits:8,val:88},{op:0,bits:8,val:24},{op:0,bits:9,val:144},{op:19,bits:7,val:59},{op:0,bits:8,val:120},{op:0,bits:8,val:56},{op:0,bits:9,val:208},{op:17,bits:7,val:17},{op:0,bits:8,val:104},{op:0,bits:8,val:40},{op:0,bits:9,val:176},{op:0,bits:8,val:8},{op:0,bits:8,val:136},{op:0,bits:8,val:72},{op:0,bits:9,val:240},{op:16,bits:7,val:4},{op:0,bits:8,val:84},{op:0,bits:8,val:20},{op:21,bits:8,val:227},{op:19,bits:7,val:43},{op:0,bits:8,val:116},{op:0,bits:8,val:52},{op:0,bits:9,val:200},{op:17,bits:7,val:13},{op:0,bits:8,val:100},{op:0,bits:8,val:36},{op:0,bits:9,val:168},{op:0,bits:8,val:4},{op:0,bits:8,val:132},{op:0,bits:8,val:68},{op:0,bits:9,val:232},{op:16,bits:7,val:8},{op:0,bits:8,val:92},{op:0,bits:8,val:28},{op:0,bits:9,val:152},{op:20,bits:7,val:83},{op:0,bits:8,val:124},{op:0,bits:8,val:60},{op:0,bits:9,val:216},{op:18,bits:7,val:23},{op:0,bits:8,val:108},{op:0,bits:8,val:44},{op:0,bits:9,val:184},{op:0,bits:8,val:12},{op:0,bits:8,val:140},{op:0,bits:8,val:76},{op:0,bits:9,val:248},{op:16,bits:7,val:3},{op:0,bits:8,val:82},{op:0,bits:8,val:18},{op:21,bits:8,val:163},{op:19,bits:7,val:35},{op:0,bits:8,val:114},{op:0,bits:8,val:50},{op:0,bits:9,val:196},{op:17,bits:7,val:11},{op:0,bits:8,val:98},{op:0,bits:8,val:34},{op:0,bits:9,val:164},{op:0,bits:8,val:2},{op:0,bits:8,val:130},{op:0,bits:8,val:66},{op:0,bits:9,val:228},{op:16,bits:7,val:7},{op:0,bits:8,val:90},{op:0,bits:8,val:26},{op:0,bits:9,val:148},{op:20,bits:7,val:67},{op:0,bits:8,val:122},{op:0,bits:8,val:58},{op:0,bits:9,val:212},{op:18,bits:7,val:19},{op:0,bits:8,val:106},{op:0,bits:8,val:42},{op:0,bits:9,val:180},{op:0,bits:8,val:10},{op:0,bits:8,val:138},{op:0,bits:8,val:74},{op:0,bits:9,val:244},{op:16,bits:7,val:5},{op:0,bits:8,val:86},{op:0,bits:8,val:22},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:118},{op:0,bits:8,val:54},{op:0,bits:9,val:204},{op:17,bits:7,val:15},{op:0,bits:8,val:102},{op:0,bits:8,val:38},{op:0,bits:9,val:172},{op:0,bits:8,val:6},{op:0,bits:8,val:134},{op:0,bits:8,val:70},{op:0,bits:9,val:236},{op:16,bits:7,val:9},{op:0,bits:8,val:94},{op:0,bits:8,val:30},{op:0,bits:9,val:156},{op:20,bits:7,val:99},{op:0,bits:8,val:126},{op:0,bits:8,val:62},{op:0,bits:9,val:220},{op:18,bits:7,val:27},{op:0,bits:8,val:110},{op:0,bits:8,val:46},{op:0,bits:9,val:188},{op:0,bits:8,val:14},{op:0,bits:8,val:142},{op:0,bits:8,val:78},{op:0,bits:9,val:252},{op:96,bits:7,val:0},{op:0,bits:8,val:81},{op:0,bits:8,val:17},{op:21,bits:8,val:131},{op:18,bits:7,val:31},{op:0,bits:8,val:113},{op:0,bits:8,val:49},{op:0,bits:9,val:194},{op:16,bits:7,val:10},{op:0,bits:8,val:97},{op:0,bits:8,val:33},{op:0,bits:9,val:162},{op:0,bits:8,val:1},{op:0,bits:8,val:129},{op:0,bits:8,val:65},{op:0,bits:9,val:226},{op:16,bits:7,val:6},{op:0,bits:8,val:89},{op:0,bits:8,val:25},{op:0,bits:9,val:146},{op:19,bits:7,val:59},{op:0,bits:8,val:121},{op:0,bits:8,val:57},{op:0,bits:9,val:210},{op:17,bits:7,val:17},{op:0,bits:8,val:105},{op:0,bits:8,val:41},{op:0,bits:9,val:178},{op:0,bits:8,val:9},{op:0,bits:8,val:137},{op:0,bits:8,val:73},{op:0,bits:9,val:242},{op:16,bits:7,val:4},{op:0,bits:8,val:85},{op:0,bits:8,val:21},{op:16,bits:8,val:258},{op:19,bits:7,val:43},{op:0,bits:8,val:117},{op:0,bits:8,val:53},{op:0,bits:9,val:202},{op:17,bits:7,val:13},{op:0,bits:8,val:101},{op:0,bits:8,val:37},{op:0,bits:9,val:170},{op:0,bits:8,val:5},{op:0,bits:8,val:133},{op:0,bits:8,val:69},{op:0,bits:9,val:234},{op:16,bits:7,val:8},{op:0,bits:8,val:93},{op:0,bits:8,val:29},{op:0,bits:9,val:154},{op:20,bits:7,val:83},{op:0,bits:8,val:125},{op:0,bits:8,val:61},{op:0,bits:9,val:218},{op:18,bits:7,val:23},{op:0,bits:8,val:109},{op:0,bits:8,val:45},{op:0,bits:9,val:186},{op:0,bits:8,val:13},{op:0,bits:8,val:141},{op:0,bits:8,val:77},{op:0,bits:9,val:250},{op:16,bits:7,val:3},{op:0,bits:8,val:83},{op:0,bits:8,val:19},{op:21,bits:8,val:195},{op:19,bits:7,val:35},{op:0,bits:8,val:115},{op:0,bits:8,val:51},{op:0,bits:9,val:198},{op:17,bits:7,val:11},{op:0,bits:8,val:99},{op:0,bits:8,val:35},{op:0,bits:9,val:166},{op:0,bits:8,val:3},{op:0,bits:8,val:131},{op:0,bits:8,val:67},{op:0,bits:9,val:230},{op:16,bits:7,val:7},{op:0,bits:8,val:91},{op:0,bits:8,val:27},{op:0,bits:9,val:150},{op:20,bits:7,val:67},{op:0,bits:8,val:123},{op:0,bits:8,val:59},{op:0,bits:9,val:214},{op:18,bits:7,val:19},{op:0,bits:8,val:107},{op:0,bits:8,val:43},{op:0,bits:9,val:182},{op:0,bits:8,val:11},{op:0,bits:8,val:139},{op:0,bits:8,val:75},{op:0,bits:9,val:246},{op:16,bits:7,val:5},{op:0,bits:8,val:87},{op:0,bits:8,val:23},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:119},{op:0,bits:8,val:55},{op:0,bits:9,val:206},{op:17,bits:7,val:15},{op:0,bits:8,val:103},{op:0,bits:8,val:39},{op:0,bits:9,val:174},{op:0,bits:8,val:7},{op:0,bits:8,val:135},{op:0,bits:8,val:71},{op:0,bits:9,val:238},{op:16,bits:7,val:9},{op:0,bits:8,val:95},{op:0,bits:8,val:31},{op:0,bits:9,val:158},{op:20,bits:7,val:99},{op:0,bits:8,val:127},{op:0,bits:8,val:63},{op:0,bits:9,val:222},{op:18,bits:7,val:27},{op:0,bits:8,val:111},{op:0,bits:8,val:47},{op:0,bits:9,val:190},{op:0,bits:8,val:15},{op:0,bits:8,val:143},{op:0,bits:8,val:79},{op:0,bits:9,val:254},{op:96,bits:7,val:0},{op:0,bits:8,val:80},{op:0,bits:8,val:16},{op:20,bits:8,val:115},{op:18,bits:7,val:31},{op:0,bits:8,val:112},{op:0,bits:8,val:48},{op:0,bits:9,val:193},{op:16,bits:7,val:10},{op:0,bits:8,val:96},{op:0,bits:8,val:32},{op:0,bits:9,val:161},{op:0,bits:8,val:0},{op:0,bits:8,val:128},{op:0,bits:8,val:64},{op:0,bits:9,val:225},{op:16,bits:7,val:6},{op:0,bits:8,val:88},{op:0,bits:8,val:24},{op:0,bits:9,val:145},{op:19,bits:7,val:59},{op:0,bits:8,val:120},{op:0,bits:8,val:56},{op:0,bits:9,val:209},{op:17,bits:7,val:17},{op:0,bits:8,val:104},{op:0,bits:8,val:40},{op:0,bits:9,val:177},{op:0,bits:8,val:8},{op:0,bits:8,val:136},{op:0,bits:8,val:72},{op:0,bits:9,val:241},{op:16,bits:7,val:4},{op:0,bits:8,val:84},{op:0,bits:8,val:20},{op:21,bits:8,val:227},{op:19,bits:7,val:43},{op:0,bits:8,val:116},{op:0,bits:8,val:52},{op:0,bits:9,val:201},{op:17,bits:7,val:13},{op:0,bits:8,val:100},{op:0,bits:8,val:36},{op:0,bits:9,val:169},{op:0,bits:8,val:4},{op:0,bits:8,val:132},{op:0,bits:8,val:68},{op:0,bits:9,val:233},{op:16,bits:7,val:8},{op:0,bits:8,val:92},{op:0,bits:8,val:28},{op:0,bits:9,val:153},{op:20,bits:7,val:83},{op:0,bits:8,val:124},{op:0,bits:8,val:60},{op:0,bits:9,val:217},{op:18,bits:7,val:23},{op:0,bits:8,val:108},{op:0,bits:8,val:44},{op:0,bits:9,val:185},{op:0,bits:8,val:12},{op:0,bits:8,val:140},{op:0,bits:8,val:76},{op:0,bits:9,val:249},{op:16,bits:7,val:3},{op:0,bits:8,val:82},{op:0,bits:8,val:18},{op:21,bits:8,val:163},{op:19,bits:7,val:35},{op:0,bits:8,val:114},{op:0,bits:8,val:50},{op:0,bits:9,val:197},{op:17,bits:7,val:11},{op:0,bits:8,val:98},{op:0,bits:8,val:34},{op:0,bits:9,val:165},{op:0,bits:8,val:2},{op:0,bits:8,val:130},{op:0,bits:8,val:66},{op:0,bits:9,val:229},{op:16,bits:7,val:7},{op:0,bits:8,val:90},{op:0,bits:8,val:26},{op:0,bits:9,val:149},{op:20,bits:7,val:67},{op:0,bits:8,val:122},{op:0,bits:8,val:58},{op:0,bits:9,val:213},{op:18,bits:7,val:19},{op:0,bits:8,val:106},{op:0,bits:8,val:42},{op:0,bits:9,val:181},{op:0,bits:8,val:10},{op:0,bits:8,val:138},{op:0,bits:8,val:74},{op:0,bits:9,val:245},{op:16,bits:7,val:5},{op:0,bits:8,val:86},{op:0,bits:8,val:22},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:118},{op:0,bits:8,val:54},{op:0,bits:9,val:205},{op:17,bits:7,val:15},{op:0,bits:8,val:102},{op:0,bits:8,val:38},{op:0,bits:9,val:173},{op:0,bits:8,val:6},{op:0,bits:8,val:134},{op:0,bits:8,val:70},{op:0,bits:9,val:237},{op:16,bits:7,val:9},{op:0,bits:8,val:94},{op:0,bits:8,val:30},{op:0,bits:9,val:157},{op:20,bits:7,val:99},{op:0,bits:8,val:126},{op:0,bits:8,val:62},{op:0,bits:9,val:221},{op:18,bits:7,val:27},{op:0,bits:8,val:110},{op:0,bits:8,val:46},{op:0,bits:9,val:189},{op:0,bits:8,val:14},{op:0,bits:8,val:142},{op:0,bits:8,val:78},{op:0,bits:9,val:253},{op:96,bits:7,val:0},{op:0,bits:8,val:81},{op:0,bits:8,val:17},{op:21,bits:8,val:131},{op:18,bits:7,val:31},{op:0,bits:8,val:113},{op:0,bits:8,val:49},{op:0,bits:9,val:195},{op:16,bits:7,val:10},{op:0,bits:8,val:97},{op:0,bits:8,val:33},{op:0,bits:9,val:163},{op:0,bits:8,val:1},{op:0,bits:8,val:129},{op:0,bits:8,val:65},{op:0,bits:9,val:227},{op:16,bits:7,val:6},{op:0,bits:8,val:89},{op:0,bits:8,val:25},{op:0,bits:9,val:147},{op:19,bits:7,val:59},{op:0,bits:8,val:121},{op:0,bits:8,val:57},{op:0,bits:9,val:211},{op:17,bits:7,val:17},{op:0,bits:8,val:105},{op:0,bits:8,val:41},{op:0,bits:9,val:179},{op:0,bits:8,val:9},{op:0,bits:8,val:137},{op:0,bits:8,val:73},{op:0,bits:9,val:243},{op:16,bits:7,val:4},{op:0,bits:8,val:85},{op:0,bits:8,val:21},{op:16,bits:8,val:258},{op:19,bits:7,val:43},{op:0,bits:8,val:117},{op:0,bits:8,val:53},{op:0,bits:9,val:203},{op:17,bits:7,val:13},{op:0,bits:8,val:101},{op:0,bits:8,val:37},{op:0,bits:9,val:171},{op:0,bits:8,val:5},{op:0,bits:8,val:133},{op:0,bits:8,val:69},{op:0,bits:9,val:235},{op:16,bits:7,val:8},{op:0,bits:8,val:93},{op:0,bits:8,val:29},{op:0,bits:9,val:155},{op:20,bits:7,val:83},{op:0,bits:8,val:125},{op:0,bits:8,val:61},{op:0,bits:9,val:219},{op:18,bits:7,val:23},{op:0,bits:8,val:109},{op:0,bits:8,val:45},{op:0,bits:9,val:187},{op:0,bits:8,val:13},{op:0,bits:8,val:141},{op:0,bits:8,val:77},{op:0,bits:9,val:251},{op:16,bits:7,val:3},{op:0,bits:8,val:83},{op:0,bits:8,val:19},{op:21,bits:8,val:195},{op:19,bits:7,val:35},{op:0,bits:8,val:115},{op:0,bits:8,val:51},{op:0,bits:9,val:199},{op:17,bits:7,val:11},{op:0,bits:8,val:99},{op:0,bits:8,val:35},{op:0,bits:9,val:167},{op:0,bits:8,val:3},{op:0,bits:8,val:131},{op:0,bits:8,val:67},{op:0,bits:9,val:231},{op:16,bits:7,val:7},{op:0,bits:8,val:91},{op:0,bits:8,val:27},{op:0,bits:9,val:151},{op:20,bits:7,val:67},{op:0,bits:8,val:123},{op:0,bits:8,val:59},{op:0,bits:9,val:215},{op:18,bits:7,val:19},{op:0,bits:8,val:107},{op:0,bits:8,val:43},{op:0,bits:9,val:183},{op:0,bits:8,val:11},{op:0,bits:8,val:139},{op:0,bits:8,val:75},{op:0,bits:9,val:247},{op:16,bits:7,val:5},{op:0,bits:8,val:87},{op:0,bits:8,val:23},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:119},{op:0,bits:8,val:55},{op:0,bits:9,val:207},{op:17,bits:7,val:15},{op:0,bits:8,val:103},{op:0,bits:8,val:39},{op:0,bits:9,val:175},{op:0,bits:8,val:7},{op:0,bits:8,val:135},{op:0,bits:8,val:71},{op:0,bits:9,val:239},{op:16,bits:7,val:9},{op:0,bits:8,val:95},{op:0,bits:8,val:31},{op:0,bits:9,val:159},{op:20,bits:7,val:99},{op:0,bits:8,val:127},{op:0,bits:8,val:63},{op:0,bits:9,val:223},{op:18,bits:7,val:27},{op:0,bits:8,val:111},{op:0,bits:8,val:47},{op:0,bits:9,val:191},{op:0,bits:8,val:15},{op:0,bits:8,val:143},{op:0,bits:8,val:79},{op:0,bits:9,val:255}]}if(!t){t=[{op:16,bits:5,val:1},{op:23,bits:5,val:257},{op:19,bits:5,val:17},{op:27,bits:5,val:4097},{op:17,bits:5,val:5},{op:25,bits:5,val:1025},{op:21,bits:5,val:65},{op:29,bits:5,val:16385},{op:16,bits:5,val:3},{op:24,bits:5,val:513},{op:20,bits:5,val:33},{op:28,bits:5,val:8193},{op:18,bits:5,val:9},{op:26,bits:5,val:2049},{op:22,bits:5,val:129},{op:64,bits:5,val:0},{op:16,bits:5,val:2},{op:23,bits:5,val:385},{op:19,bits:5,val:25},{op:27,bits:5,val:6145},{op:17,bits:5,val:7},{op:25,bits:5,val:1537},{op:21,bits:5,val:97},{op:29,bits:5,val:24577},{op:16,bits:5,val:4},{op:24,bits:5,val:769},{op:20,bits:5,val:49},{op:28,bits:5,val:12289},{op:18,bits:5,val:13},{op:26,bits:5,val:3073},{op:22,bits:5,val:193},{op:64,bits:5,val:0}]}ar.lencode=0;ar.distcode=512;for(aq=0;aq<512;aq++){ar.codes[aq]=U[aq]}for(aq=0;aq<32;aq++){ar.codes[aq+512]=t[aq]}ar.lenbits=9;ar.distbits=5}function ap(at){var ar=at.state;var aq=at.output_data.length;if(ar.window===null){ar.window=""}if(ar.wsize==0){ar.wsize=1<<ar.wbits}if(aq>=ar.wsize){ar.window=at.output_data.substring(aq-ar.wsize)}else{if(ar.whave+aq<ar.wsize){ar.window+=at.output_data}else{ar.window=ar.window.substring(ar.whave-(ar.wsize-aq))+at.output_data}}ar.whave=ar.window.length;if(ar.whave<ar.wsize){ar.wnext=ar.whave}else{ar.wnext=0}return 0}function m(ar,at){var aq=[at&255,(at>>>8)&255];ar.state.check=ar.checksum_function(ar.state.check,aq,0,2)}function n(ar,at){var aq=[at&255,(at>>>8)&255,(at>>>16)&255,(at>>>24)&255];ar.state.check=ar.checksum_function(ar.state.check,aq,0,4)}function Z(ar,aq){aq.strm=ar;aq.left=ar.avail_out;aq.next=ar.next_in;aq.have=ar.avail_in;aq.hold=ar.state.hold;aq.bits=ar.state.bits;return aq}function ah(aq){var ar=aq.strm;ar.next_in=aq.next;ar.avail_out=aq.left;ar.avail_in=aq.have;ar.state.hold=aq.hold;ar.state.bits=aq.bits}function P(aq){aq.hold=0;aq.bits=0}function ag(aq){if(aq.have==0){return false}aq.have--;aq.hold+=(aq.strm.input_data.charCodeAt(aq.next++)&255)<<aq.bits;aq.bits+=8;return true}function ad(ar,aq){while(ar.bits<aq){if(!ag(ar)){return false}}return true}function b(ar,aq){return ar.hold&((1<<aq)-1)}function w(ar,aq){ar.hold>>>=aq;ar.bits-=aq}function c(aq){aq.hold>>>=aq.bits&7;aq.bits-=aq.bits&7}function ai(aq){return((aq>>>24)&255)+((aq>>>8)&65280)+((aq&65280)<<8)+((aq&255)<<24)}var I=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];ZLIB.inflate=function(aD,at){var aC;var aB;var aq,az;var ar;var av=-1;var au=-1;var aw;var ax;var ay;var aA;if(!aD||!aD.state||(!aD.input_data&&aD.avail_in!=0)){return ZLIB.Z_STREAM_ERROR}aC=aD.state;if(aC.mode==an){aC.mode=ao}aB={};Z(aD,aB);aq=aB.have;az=aB.left;aA=ZLIB.Z_OK;inf_leave:for(;;){switch(aC.mode){case G:if(aC.wrap==0){aC.mode=ao;break}if(!ad(aB,16)){break inf_leave}if((aC.wrap&2)&&aB.hold==35615){aC.check=aD.checksum_function(0,null,0,0);m(aD,aB.hold);P(aB);aC.mode=D;break}aC.flags=0;if(aC.head!==null){aC.head.done=-1}if(!(aC.wrap&1)||((b(aB,8)<<8)+(aB.hold>>>8))%31){aD.msg="incorrect header check";aC.mode=a;break}if(b(aB,4)!=ZLIB.Z_DEFLATED){aD.msg="unknown compression method";aC.mode=a;break}w(aB,4);ay=b(aB,4)+8;if(aC.wbits==0){aC.wbits=ay}else{if(ay>aC.wbits){aD.msg="invalid window size";aC.mode=a;break}}aC.dmax=1<<ay;aD.adler=aC.check=aD.checksum_function(0,null,0,0);aC.mode=aB.hold&512?q:an;P(aB);break;case D:if(!ad(aB,16)){break inf_leave}aC.flags=aB.hold;if((aC.flags&255)!=ZLIB.Z_DEFLATED){aD.msg="unknown compression method";aC.mode=a;break}if(aC.flags&57344){aD.msg="unknown header flags set";aC.mode=a;break}if(aC.head!==null){aC.head.text=(aB.hold>>>8)&1}if(aC.flags&512){m(aD,aB.hold)}P(aB);aC.mode=am;case am:if(!ad(aB,32)){break inf_leave}if(aC.head!==null){aC.head.time=aB.hold}if(aC.flags&512){n(aD,aB.hold)}P(aB);aC.mode=af;case af:if(!ad(aB,16)){break inf_leave}if(aC.head!==null){aC.head.xflags=aB.hold&255;aC.head.os=aB.hold>>>8}if(aC.flags&512){m(aD,aB.hold)}P(aB);aC.mode=A;case A:if(aC.flags&1024){if(!ad(aB,16)){break inf_leave}aC.length=aB.hold;if(aC.head!==null){aC.head.extra_len=aB.hold}if(aC.flags&512){m(aD,aB.hold)}P(aB);aC.head.extra=""}else{if(aC.head!==null){aC.head.extra=null}}aC.mode=B;case B:if(aC.flags&1024){ar=aC.length;if(ar>aB.have){ar=aB.have}if(ar){if(aC.head!==null&&aC.head.extra!==null){ay=aC.head.extra_len-aC.length;aC.head.extra+=aD.input_data.substring(aB.next,aB.next+(ay+ar>aC.head.extra_max?aC.head.extra_max-ay:ar))}if(aC.flags&512){aC.check=aD.checksum_function(aC.check,aD.input_data,aB.next,ar)}aB.have-=ar;aB.next+=ar;aC.length-=ar}if(aC.length){break inf_leave}}aC.length=0;aC.mode=ac;case ac:if(aC.flags&2048){if(aB.have==0){break inf_leave}if(aC.head!==null&&aC.head.name===null){aC.head.name=""}ar=0;do{ay=aD.input_data.charAt(aB.next+ar);ar++;if(ay==="\0"){break}if(aC.head!==null&&aC.length<aC.head.name_max){aC.head.name+=ay;aC.length++}}while(ar<aB.have);if(aC.flags&512){aC.check=aD.checksum_function(aC.check,aD.input_data,aB.next,ar)}aB.have-=ar;aB.next+=ar;if(ay!=="\0"){break inf_leave}}else{if(aC.head!==null){aC.head.name=null}}aC.length=0;aC.mode=j;case j:if(aC.flags&4096){if(aB.have==0){break inf_leave}ar=0;if(aC.head!==null&&aC.head.comment===null){aC.head.comment=""}do{ay=aD.input_data.charAt(aB.next+ar);ar++;if(ay==="\0"){break}if(aC.head!==null&&aC.length<aC.head.comm_max){aC.head.comment+=ay;aC.length++}}while(ar<aB.have);if(aC.flags&512){aC.check=aD.checksum_function(aC.check,aD.input_data,aB.next,ar)}aB.have-=ar;aB.next+=ar;if(ay!=="\0"){break inf_leave}}else{if(aC.head!==null){aC.head.comment=null}}aC.mode=F;case F:if(aC.flags&512){if(!ad(aB,16)){break inf_leave}if(aB.hold!=(aC.check&65535)){aD.msg="header crc mismatch";aC.mode=a;break}P(aB)}if(aC.head!==null){aC.head.hcrc=(aC.flags>>>9)&1;aC.head.done=1}aD.adler=aC.check=aD.checksum_function(0,null,0,0);aC.mode=an;break;case q:if(!ad(aB,32)){break inf_leave}aD.adler=aC.check=ai(aB.hold);P(aB);aC.mode=p;case p:if(aC.havedict==0){ah(aB);return ZLIB.Z_NEED_DICT}aD.adler=aC.check=aD.checksum_function(0,null,0,0);aC.mode=an;case an:if(at==ZLIB.Z_BLOCK||at==ZLIB.Z_TREES){break inf_leave}case ao:if(aC.last){c(aB);aC.mode=d;break}if(!ad(aB,3)){break inf_leave}aC.last=b(aB,1);w(aB,1);switch(b(aB,2)){case 0:aC.mode=aj;break;case 1:C(aC);aC.mode=S;if(at==ZLIB.Z_TREES){w(aB,2);break inf_leave}break;case 2:aC.mode=al;break;case 3:aD.msg="invalid block type";aC.mode=a}w(aB,2);break;case aj:c(aB);if(!ad(aB,32)){break inf_leave}if((aB.hold&65535)!=(((aB.hold>>>16)&65535)^65535)){aD.msg="invalid stored block lengths";aC.mode=a;break}aC.length=aB.hold&65535;P(aB);aC.mode=l;if(at==ZLIB.Z_TREES){break inf_leave}case l:aC.mode=k;case k:ar=aC.length;if(ar){if(ar>aB.have){ar=aB.have}if(ar>aB.left){ar=aB.left}if(ar==0){break inf_leave}aD.output_data+=aD.input_data.substring(aB.next,aB.next+ar);aD.next_out+=ar;aB.have-=ar;aB.next+=ar;aB.left-=ar;aC.length-=ar;break}aC.mode=an;break;case al:if(!ad(aB,14)){break inf_leave}aC.nlen=b(aB,5)+257;w(aB,5);aC.ndist=b(aB,5)+1;w(aB,5);aC.ncode=b(aB,4)+4;w(aB,4);if(aC.nlen>286||aC.ndist>30){aD.msg="too many length or distance symbols";aC.mode=a;break}aC.have=0;aC.mode=W;case W:while(aC.have<aC.ncode){if(!ad(aB,3)){break inf_leave}var aE=b(aB,3);aC.lens[I[aC.have++]]=aE;w(aB,3)}while(aC.have<19){aC.lens[I[aC.have++]]=0}aC.next=0;aC.lencode=0;aC.lenbits=7;aA=K(aC,h);if(aA){aD.msg="invalid code lengths set";aC.mode=a;break}aC.have=0;aC.mode=g;case g:while(aC.have<aC.nlen+aC.ndist){for(;;){aw=aC.codes[aC.lencode+b(aB,aC.lenbits)];if(aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}if(aw.val<16){w(aB,aw.bits);aC.lens[aC.have++]=aw.val}else{if(aw.val==16){if(!ad(aB,aw.bits+2)){break inf_leave}w(aB,aw.bits);if(aC.have==0){aD.msg="invalid bit length repeat";aC.mode=a;break}ay=aC.lens[aC.have-1];ar=3+b(aB,2);w(aB,2)}else{if(aw.val==17){if(!ad(aB,aw.bits+3)){break inf_leave}w(aB,aw.bits);ay=0;ar=3+b(aB,3);w(aB,3)}else{if(!ad(aB,aw.bits+7)){break inf_leave}w(aB,aw.bits);ay=0;ar=11+b(aB,7);w(aB,7)}}if(aC.have+ar>aC.nlen+aC.ndist){aD.msg="invalid bit length repeat";aC.mode=a;break}while(ar--){aC.lens[aC.have++]=ay}}}if(aC.mode==a){break}if(aC.lens[256]==0){aD.msg="invalid code -- missing end-of-block";aC.mode=a;break}aC.next=0;aC.lencode=aC.next;aC.lenbits=9;aA=K(aC,X);if(aA){aD.msg="invalid literal/lengths set";aC.mode=a;break}aC.distcode=aC.next;aC.distbits=6;aA=K(aC,u);if(aA){aD.msg="invalid distances set";aC.mode=a;break}aC.mode=S;if(at==ZLIB.Z_TREES){break inf_leave}case S:aC.mode=R;case R:if(aB.have>=6&&aB.left>=258){ah(aB);H(aD,az);Z(aD,aB);if(aC.mode==an){aC.back=-1}break}aC.back=0;for(;;){aw=aC.codes[aC.lencode+b(aB,aC.lenbits)];if(aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}if(aw.op&&(aw.op&240)==0){ax=aw;for(;;){aw=aC.codes[aC.lencode+ax.val+(b(aB,ax.bits+ax.op)>>>ax.bits)];if(ax.bits+aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}w(aB,ax.bits);aC.back+=ax.bits}w(aB,aw.bits);aC.back+=aw.bits;aC.length=aw.val;if(aw.op==0){aC.mode=Y;break}if(aw.op&32){aC.back=-1;aC.mode=an;break}if(aw.op&64){aD.msg="invalid literal/length code";aC.mode=a;break}aC.extra=aw.op&15;aC.mode=T;case T:if(aC.extra){if(!ad(aB,aC.extra)){break inf_leave}aC.length+=b(aB,aC.extra);w(aB,aC.extra);aC.back+=aC.extra}aC.was=aC.length;aC.mode=r;case r:for(;;){aw=aC.codes[aC.distcode+b(aB,aC.distbits)];if(aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}if((aw.op&240)==0){ax=aw;for(;;){aw=aC.codes[aC.distcode+ax.val+(b(aB,ax.bits+ax.op)>>>ax.bits)];if((ax.bits+aw.bits)<=aB.bits){break}if(!ag(aB)){break inf_leave}}w(aB,ax.bits);aC.back+=ax.bits}w(aB,aw.bits);aC.back+=aw.bits;if(aw.op&64){aD.msg="invalid distance code";aC.mode=a;break}aC.offset=aw.val;aC.extra=aw.op&15;aC.mode=s;case s:if(aC.extra){if(!ad(aB,aC.extra)){break inf_leave}aC.offset+=b(aB,aC.extra);w(aB,aC.extra);aC.back+=aC.extra}aC.mode=aa;case aa:if(aB.left==0){break inf_leave}ar=az-aB.left;if(aC.offset>ar){ar=aC.offset-ar;if(ar>aC.whave){if(aC.sane){aD.msg="invalid distance too far back";aC.mode=a;break}}if(ar>aC.wnext){ar-=aC.wnext;av=aC.wsize-ar;au=-1}else{av=aC.wnext-ar;au=-1}if(ar>aC.length){ar=aC.length}}else{av=-1;au=aD.next_out-aC.offset;ar=aC.length}if(ar>aB.left){ar=aB.left}aB.left-=ar;aC.length-=ar;if(av>=0){aD.output_data+=aC.window.substring(av,av+ar);aD.next_out+=ar;ar=0}else{aD.next_out+=ar;do{aD.output_data+=aD.output_data.charAt(au++)}while(--ar)}if(aC.length==0){aC.mode=R}break;case Y:if(aB.left==0){break inf_leave}aD.output_data+=String.fromCharCode(aC.length);aD.next_out++;aB.left--;aC.mode=R;break;case d:if(aC.wrap){if(!ad(aB,32)){break inf_leave}az-=aB.left;aD.total_out+=az;aC.total+=az;if(az){aD.adler=aC.check=aD.checksum_function(aC.check,aD.output_data,aD.output_data.length-az,az)}az=aB.left;if((aC.flags?aB.hold:ai(aB.hold))!=aC.check){aD.msg="incorrect data check";aC.mode=a;break}P(aB)}aC.mode=V;case V:if(aC.wrap&&aC.flags){if(!ad(aB,32)){break inf_leave}if(aB.hold!=(aC.total&4294967295)){aD.msg="incorrect length check";aC.mode=a;break}P(aB)}aC.mode=v;case v:aA=ZLIB.Z_STREAM_END;break inf_leave;case a:aA=ZLIB.Z_DATA_ERROR;break inf_leave;case ab:return ZLIB.Z_MEM_ERROR;case ak:default:return ZLIB.Z_STREAM_ERROR}}inf_leave:ah(aB);if(aC.wsize||(az!=aD.avail_out&&aC.mode<a&&(aC.mode<d||at!=ZLIB.Z_FINISH))){if(ap(aD)){aC.mode=ab;return ZLIB.Z_MEM_ERROR}}aq-=aD.avail_in;az-=aD.avail_out;aD.total_in+=aq;aD.total_out+=az;aC.total+=az;if(aC.wrap&&az){aD.adler=aC.check=aD.checksum_function(aC.check,aD.output_data,0,aD.output_data.length)}aD.data_type=aC.bits+(aC.last?64:0)+(aC.mode==an?128:0)+(aC.mode==S||aC.mode==l?256:0);if(((aq==0&&az==0)||at==ZLIB.Z_FINISH)&&aA==ZLIB.Z_OK){aA=ZLIB.Z_BUF_ERROR}return aA};ZLIB.inflateEnd=function(ar){var aq;if(!ar||!ar.state){return ZLIB.Z_STREAM_ERROR}aq=ar.state;aq.window=null;ar.state=null;return ZLIB.Z_OK};ZLIB.z_stream.prototype.inflate=function(au,av){var at;var aq;var ar=16384;this.input_data=au;this.next_in=E(av,"next_in",0);this.avail_in=E(av,"avail_in",au.length-this.next_in);at=E(av,"flush",ZLIB.Z_SYNC_FLUSH);aq=E(av,"avail_out",-1);var aw="";do{this.avail_out=(aq>=0?aq:ar);this.output_data="";this.next_out=0;this.error=ZLIB.inflate(this,at);if(aq>=0){return this.output_data}aw+=this.output_data;if(this.avail_out>0){break}}while(this.error==ZLIB.Z_OK);return aw};ZLIB.z_stream.prototype.inflateReset=function(aq){return ZLIB.inflateReset(this,aq)}}());if(typeof ZLIB==="undefined"){alert("ZLIB is not defined. SRC zlib.js before zlib-adler32.js")}(function(){var c=65521;var d=5552;function b(e,g,k,h){var l;var j;l=(e>>>16)&65535;e&=65535;if(h==1){e+=g.charCodeAt(k)&255;if(e>=c){e-=c}l+=e;if(l>=c){l-=c}return e|(l<<16)}if(g===null){return 1}if(h<16){while(h--){e+=g.charCodeAt(k++)&255;l+=e}if(e>=c){e-=c}l%=c;return e|(l<<16)}while(h>=d){h-=d;j=d>>4;do{e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e}while(--j);e%=c;l%=c}if(h){while(h>=16){h-=16;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e}while(h--){e+=g.charCodeAt(k++)&255;l+=e}e%=c;l%=c}return e|(l<<16)}function a(e,g,k,h){var l;var j;l=(e>>>16)&65535;e&=65535;if(h==1){e+=g[k];if(e>=c){e-=c}l+=e;if(l>=c){l-=c}return e|(l<<16)}if(g===null){return 1}if(h<16){while(h--){e+=g[k++];l+=e}if(e>=c){e-=c}l%=c;return e|(l<<16)}while(h>=d){h-=d;j=d>>4;do{e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e}while(--j);e%=c;l%=c}if(h){while(h>=16){h-=16;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e}while(h--){e+=g[k++];l+=e}e%=c;l%=c}return e|(l<<16)}ZLIB.adler32=function(e,g,j,h){if(typeof g==="string"){return b(e,g,j,h)}else{return a(e,g,j,h)}};ZLIB.adler32_combine=function(e,g,h){var k;var l;var j;if(h<0){return 4294967295}h%=c;j=h;k=e&65535;l=j*k;l%=c;k+=(g&65535)+c-1;l+=((e>>16)&65535)+((g>>16)&65535)+c-j;if(k>=c){k-=c}if(k>=c){k-=c}if(l>=(c<<1)){l-=(c<<1)}if(l>=c){l-=c}return k|(l<<16)}}());if(typeof ZLIB==="undefined"){alert("ZLIB is not defined. SRC zlib.js before zlib-crc32.js")}(function(){var a=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918000,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];function c(j,h,l,k){if(h==null){return 0}j=j^4294967295;while(k>=8){j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);k-=8}if(k){do{j=a[(j^h.charCodeAt(l++))&255]^(j>>>8)}while(--k)}return j^4294967295}function b(j,h,l,k){if(h==null){return 0}j=j^4294967295;while(k>=8){j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);k-=8}if(k){do{j=a[(j^h[l++])&255]^(j>>>8)}while(--k)}return j^4294967295}ZLIB.crc32=function(j,h,l,k){if(typeof h==="string"){return c(j,h,l,k)}else{return b(j,h,l,k)}};var d=32;function g(h,l){var k;var j=0;k=0;while(l){if(l&1){k^=h[j]}l>>=1;j++}return k}function e(k,h){var j;for(j=0;j<d;j++){k[j]=g(h,h[j])}}ZLIB.crc32_combine=function(h,j,l){var m;var p;var k;var o;if(l<=0){return h}k=new Array(d);o=new Array(d);o[0]=3988292384;p=1;for(m=1;m<d;m++){o[m]=p;p<<=1}e(k,o);e(o,k);do{e(k,o);if(l&1){h=g(k,h)}l>>=1;if(l==0){break}e(o,k);if(l&1){h=g(o,h)}l>>=1}while(l!=0);h^=j;return h}}());var CreateAmtRedirect=function(e,a){var g={};g.m=e;e.parent=g;g.authCookie=a;g.State=0;g.socket=null;g.host=null;g.port=0;g.user=null;g.pass=null;g.authuri="/RedirectionService";g.tlsv1only=0;g.inDataCount=0;g.connectstate=0;g.protocol=e.protocol;g.debugmode=0;g.amtaccumulator="";g.amtsequence=1;g.amtkeepalivetimer=null;g.onStateChanged=null;g.Start=function(h,k,n,j,l){g.host=h;g.port=k;g.user=n;g.pass=j;g.connectstate=0;g.inDataCount=0;var m=window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/webrelay.ashx?p=2&host="+h+"&port="+k+"&tls="+l+((n=="*")?"&serverauth=1":"")+((typeof j==="undefined")?("&serverauth=1&user="+n):"");if((a!=null)&&(a!="")){m+="&auth="+a}g.socket=new WebSocket(m);g.socket.onopen=g.xxOnSocketConnected;g.socket.onmessage=g.xxOnMessage;g.socket.onclose=g.xxOnSocketClosed;g.xxStateChange(1)};g.xxOnSocketConnected=function(){if(g.debugmode==1){console.log("onSocketConnected")}g.xxStateChange(2);if(g.protocol==1){g.xxSend(g.RedirectStartSol)}if(g.protocol==2){g.xxSend(g.RedirectStartKvm)}if(g.protocol==3){g.xxSend(g.RedirectStartIder)}};var b=new FileReader();var d=false,c=[];if(b.readAsBinaryString){b.onload=function(h){g.xxOnSocketData(h.target.result);if(c.length==0){d=false}else{b.readAsBinaryString(new Blob([c.shift()]))}}}else{if(b.readAsArrayBuffer){b.onloadend=function(h){g.xxOnSocketData(h.target.result);if(c.length==0){d=false}else{b.readAsArrayBuffer(c.shift())}}}}g.xxOnMessage=function(k){g.inDataCount++;if(typeof k.data=="object"){if(d==true){c.push(k.data);return}if(b.readAsBinaryString){d=true;b.readAsBinaryString(new Blob([k.data]))}else{if(f.readAsArrayBuffer){d=true;b.readAsArrayBuffer(k.data)}else{var h="",j=new Uint8Array(k.data),m=j.byteLength;for(var l=0;l<m;l++){h+=String.fromCharCode(j[l])}g.xxOnSocketData(h)}}}else{g.xxOnSocketData(k.data)}};g.xxOnSocketData=function(t){if(!t||g.connectstate==-1){return}if(typeof t==="object"){var m="";var o=new Uint8Array(t);var y=o.byteLength;for(var x=0;x<y;x++){m+=String.fromCharCode(o[x])}t=m}else{if(typeof t!=="string"){return}}if((g.protocol==2||g.protocol==3)&&g.connectstate==1){return g.m.ProcessData(t)}g.amtaccumulator+=t;while(g.amtaccumulator.length>=1){var p=0;switch(g.amtaccumulator.charCodeAt(0)){case 17:if(g.amtaccumulator.length<4){return}var L=g.amtaccumulator.charCodeAt(1);switch(L){case 0:if(g.amtaccumulator.length<13){return}var C=g.amtaccumulator.charCodeAt(12);if(g.amtaccumulator.length<13+C){return}g.xxSend(String.fromCharCode(19,0,0,0,0,0,0,0,0));p=(13+C);break;default:g.Stop(1);break}break;case 20:if(g.amtaccumulator.length<9){return}var k=ReadIntX(g.amtaccumulator,5);if(g.amtaccumulator.length<9+k){return}var K=g.amtaccumulator.charCodeAt(1);var l=g.amtaccumulator.charCodeAt(4);var h=[];for(x=0;x<k;x++){h.push(g.amtaccumulator.charCodeAt(9+x))}var j=g.amtaccumulator.substring(9,9+k);p=9+k;if(l==0){if(h.indexOf(4)>=0){g.xxSend(String.fromCharCode(19,0,0,0,4)+IntToStrX(g.user.length+g.authuri.length+8)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(0,0)+String.fromCharCode(g.authuri.length)+g.authuri+String.fromCharCode(0,0,0,0))}else{if(h.indexOf(3)>=0){g.xxSend(String.fromCharCode(19,0,0,0,3)+IntToStrX(g.user.length+g.authuri.length+7)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(0,0)+String.fromCharCode(g.authuri.length)+g.authuri+String.fromCharCode(0,0,0))}else{if(h.indexOf(1)>=0){g.xxSend(String.fromCharCode(19,0,0,0,1)+IntToStrX(g.user.length+g.pass.length+2)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(g.pass.length)+g.pass)}else{g.Stop(2)}}}}else{if((l==3||l==4)&&K==1){var s=0;var G=j.charCodeAt(s);var F=j.substring(s+1,s+1+G);s+=(G+1);var B=j.charCodeAt(s);var A=j.substring(s+1,s+1+B);s+=(B+1);var E=0;var D=null;var q=g.xxRandomNonce(32);var J="00000002";var v="";if(l==4){E=j.charCodeAt(s);D=j.substring(s+1,s+1+E);s+=(E+1);v=J+":"+q+":"+D+":"}var u=hex_md5(hex_md5(g.user+":"+F+":"+g.pass)+":"+A+":"+v+hex_md5("POST:"+g.authuri));var M=g.user.length+F.length+A.length+g.authuri.length+q.length+J.length+u.length+7;if(l==4){M+=(D.length+1)}var n=String.fromCharCode(19,0,0,0,l)+IntToStrX(M)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(F.length)+F+String.fromCharCode(A.length)+A+String.fromCharCode(g.authuri.length)+g.authuri+String.fromCharCode(q.length)+q+String.fromCharCode(J.length)+J+String.fromCharCode(u.length)+u;if(l==4){n+=(String.fromCharCode(D.length)+D)}g.xxSend(n)}else{if(K==0){if(g.protocol==1){var z=10000;var O=100;var N=0;var I=10000;var H=100;var w=0;g.xxSend(String.fromCharCode(32,0,0,0)+IntToStrX(g.amtsequence++)+ShortToStrX(z)+ShortToStrX(O)+ShortToStrX(N)+ShortToStrX(I)+ShortToStrX(H)+ShortToStrX(w)+IntToStrX(0))}if(g.protocol==2){g.xxSend(String.fromCharCode(64,0,0,0,0,0,0,0))}if(g.protocol==3){g.connectstate=1;g.xxStateChange(3)}}else{g.Stop(3)}}}break;case 33:if(g.amtaccumulator.length<23){break}p=23;g.xxSend(String.fromCharCode(39,0,0,0)+IntToStrX(g.amtsequence++)+String.fromCharCode(0,0,27,0,0,0));if(g.protocol==1){g.amtkeepalivetimer=setInterval(g.xxSendAmtKeepAlive,2000)}g.connectstate=1;g.xxStateChange(3);break;case 41:if(g.amtaccumulator.length<10){break}p=10;break;case 42:if(g.amtaccumulator.length<10){break}var r=(10+((g.amtaccumulator.charCodeAt(9)&255)<<8)+(g.amtaccumulator.charCodeAt(8)&255));if(g.amtaccumulator.length<r){break}g.m.ProcessData(g.amtaccumulator.substring(10,r));p=r;break;case 43:if(g.amtaccumulator.length<8){break}p=8;break;case 65:if(g.amtaccumulator.length<8){break}g.connectstate=1;g.m.Start();if(g.amtaccumulator.length>8){g.m.ProcessData(g.amtaccumulator.substring(8))}p=g.amtaccumulator.length;break;default:console.log("Unknown Intel AMT command: "+g.amtaccumulator.charCodeAt(0)+" acclen="+g.amtaccumulator.length);g.Stop(4);return}if(p==0){return}g.amtaccumulator=g.amtaccumulator.substring(p)}};g.xxSend=function(k){if(g.socket!=null&&g.socket.readyState==WebSocket.OPEN){if(g.debugmode==1){console.log("Send",k)}var h=new Uint8Array(k.length);for(var j=0;j<k.length;++j){h[j]=k.charCodeAt(j)}g.socket.send(h.buffer)}};g.send=function(h){if(g.socket==null||g.connectstate!=1){return}if(g.protocol==1){g.xxSend(String.fromCharCode(40,0,0,0)+IntToStrX(g.amtsequence++)+ShortToStrX(h.length)+h)}else{g.xxSend(h)}};g.xxSendAmtKeepAlive=function(){if(g.socket==null){return}g.xxSend(String.fromCharCode(43,0,0,0)+IntToStrX(g.amtsequence++))};g.xxRandomNonceX="abcdef0123456789";g.xxRandomNonce=function(j){var k="";for(var h=0;h<j;h++){k+=g.xxRandomNonceX.charAt(Math.floor(Math.random()*g.xxRandomNonceX.length))}return k};g.xxOnSocketClosed=function(){if(g.debugmode==1){console.log("onSocketClosed")}if((g.inDataCount==0)&&(g.tlsv1only==0)){g.tlsv1only=1;g.socket=new WebSocket(window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/webrelay.ashx?p=2&host="+g.host+"&port="+g.port+"&tls="+g.tls+"&tls1only=1"+((g.user=="*")?"&serverauth=1":"")+((typeof pass==="undefined")?("&serverauth=1&user="+g.user):""));g.socket.onopen=g.xxOnSocketConnected;g.socket.onmessage=g.xxOnMessage;g.socket.onclose=g.xxOnSocketClosed}else{g.Stop(5)}};g.xxStateChange=function(h){if(g.State==h){return}g.State=h;g.m.xxStateChange(g.State);if(g.onStateChanged!=null){g.onStateChanged(g,g.State)}};g.Stop=function(h){if(g.debugmode==1){console.log("onSocketStop",h)}g.xxStateChange(0);g.connectstate=-1;g.amtaccumulator="";if(g.socket!=null){g.socket.close();g.socket=null}if(g.amtkeepalivetimer!=null){clearInterval(g.amtkeepalivetimer);g.amtkeepalivetimer=null}};g.RedirectStartSol=String.fromCharCode(16,0,0,0,83,79,76,32);g.RedirectStartKvm=String.fromCharCode(16,1,0,0,75,86,77,82);g.RedirectStartIder=String.fromCharCode(16,0,0,0,73,68,69,82);return g};var CreateWsmanComm=function(l,o,q,n,p){var m={};m.PendingAjax=[];m.ActiveAjaxCount=0;m.MaxActiveAjaxCount=1;m.FailAllError=0;m.challengeParams=null;m.noncecounter=1;m.authcounter=0;m.socket=null;m.socketState=0;m.host=l;m.port=o;m.user=q;m.pass=n;m.tls=p;m.tlsv1only=1;m.cnonce=Math.random().toString(36).substring(7);m.PerformAjax=function(t,s,v,u,w,r){if(m.ActiveAjaxCount<m.MaxActiveAjaxCount&&m.PendingAjax.length==0){m.PerformAjaxEx(t,s,v,w,r)}else{if(u==1){m.PendingAjax.unshift([t,s,v,w,r])}else{m.PendingAjax.push([t,s,v,w,r])}}};m.PerformNextAjax=function(){if(m.ActiveAjaxCount>=m.MaxActiveAjaxCount||m.PendingAjax.length==0){return}var r=m.PendingAjax.shift();m.PerformAjaxEx(r[0],r[1],r[2],r[3],r[4]);m.PerformNextAjax()};m.PerformAjaxEx=function(t,s,u,v,r){if(m.FailAllError!=0){m.gotNextMessagesError({status:m.FailAllError},"error",null,[t,s,u,v,r]);return}if(!t){t=""}m.ActiveAjaxCount++;return m.PerformAjaxExNodeJS(t,s,u,v,r)};m.pendingAjaxCall=[];m.PerformAjaxExNodeJS=function(t,s,u,v,r){m.PerformAjaxExNodeJS2(t,s,u,v,r,3)};m.PerformAjaxExNodeJS2=function(t,s,v,w,r,u){if(u<=0||m.FailAllError!=0){m.ActiveAjaxCount--;if(m.FailAllError!=999){m.gotNextMessages(null,"error",{status:((m.FailAllError==0)?408:m.FailAllError)},[t,s,v,w,r])}m.PerformNextAjax();return}m.pendingAjaxCall.push([t,s,v,w,r,u]);if(m.socketState==0){m.xxConnectHttpSocket()}else{if(m.socketState==2){m.sendRequest(t,w,r)}}};m.sendRequest=function(t,v,r){v=v?v:"/wsman";r=r?r:"POST";var s=r+" "+v+" HTTP/1.1\r\n";if(m.challengeParams!=null){var u=hex_md5(hex_md5(m.user+":"+m.challengeParams.realm+":"+m.pass)+":"+m.challengeParams.nonce+":"+m.noncecounter+":"+m.cnonce+":"+m.challengeParams.qop+":"+hex_md5(r+":"+v));s+="Authorization: "+m.renderDigest({username:m.user,realm:m.challengeParams.realm,nonce:m.challengeParams.nonce,uri:v,qop:m.challengeParams.qop,response:u,nc:m.noncecounter++,cnonce:m.cnonce})+"\r\n"}s+="Host: "+m.host+":"+m.port+"\r\nTransfer-Encoding: chunked\r\n\r\n"+t.length.toString(16).toUpperCase()+"\r\n"+t+"\r\n0\r\n\r\n";g(s)};m.parseDigest=function(r){var s=r.substring(7).split(",");for(i in s){s[i]=s[i].trim()}return s.reduce(function(t,v){var u=v.split("=");t[u[0]]=u[1].replace(/"/g,"");return t},{})};m.renderDigest=function(r){var s=[];for(i in r){s.push(i)}return"Digest "+s.reduce(function(u,t){return u+","+t+'="'+r[t]+'"'},"").substring(1)};m.xxConnectHttpSocket=function(){m.socketParseState=0;m.socketAccumulator="";m.socketHeader=null;m.socketData="";m.socketState=1;console.log(m.tlsv1only);m.socket=new WebSocket(window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/webrelay.ashx?p=1&host="+m.host+"&port="+m.port+"&tls="+m.tls+"&tlsv1only="+m.tlsv1only+((q=="*")?"&serverauth=1":"")+((typeof n==="undefined")?("&serverauth=1&user="+q):""));m.socket.onopen=c;m.socket.onmessage=a;m.socket.onclose=b};function c(){m.socketState=2;for(i in m.pendingAjaxCall){m.sendRequest(m.pendingAjaxCall[i][0],m.pendingAjaxCall[i][3],m.pendingAjaxCall[i][4])}}var h=new FileReader();var k=false,j=[];if(h.readAsBinaryString){h.onload=function(r){d(r.target.result);if(j.length==0){k=false}else{h.readAsBinaryString(new Blob([j.shift()]))}}}else{if(h.readAsArrayBuffer){h.onloadend=function(r){d(r.target.result);if(j.length==0){k=false}else{h.readAsArrayBuffer(j.shift())}}}}function a(t){if(typeof t.data=="object"){if(k==true){j.push(t.data);return}if(h.readAsBinaryString){k=true;h.readAsBinaryString(new Blob([t.data]))}else{if(h.readAsArrayBuffer){k=true;h.readAsArrayBuffer(t.data)}else{var r="",s=new Uint8Array(t.data),v=s.byteLength;for(var u=0;u<v;u++){r+=String.fromCharCode(s[u])}d(r)}}}else{d(t.data)}}function d(v){if(typeof v==="object"){var r="",s=new Uint8Array(v),y=s.byteLength;for(var x=0;x<y;x++){r+=String.fromCharCode(s[x])}v=r}else{if(typeof v!=="string"){return}}m.socketAccumulator+=v;while(true){if(m.socketParseState==0){var w=m.socketAccumulator.indexOf("\r\n\r\n");if(w<0){return}m.socketHeader=m.socketAccumulator.substring(0,w).split("\r\n");m.socketAccumulator=m.socketAccumulator.substring(w+4);m.socketParseState=1;m.socketData="";m.socketXHeader={Directive:m.socketHeader[0].split(" ")};for(x in m.socketHeader){if(x!=0){var z=m.socketHeader[x].indexOf(":");m.socketXHeader[m.socketHeader[x].substring(0,z).toLowerCase()]=m.socketHeader[x].substring(z+2)}}}if(m.socketParseState==1){var u=-1;if((m.socketXHeader.connection!=undefined)&&(m.socketXHeader.connection.toLowerCase()=="close")&&((m.socketXHeader["transfer-encoding"]==undefined)||(m.socketXHeader["transfer-encoding"].toLowerCase()!="chunked"))){u=0}else{if(m.socketXHeader["content-length"]!=undefined){u=parseInt(m.socketXHeader["content-length"]);if(m.socketAccumulator.length<u){return}var v=m.socketAccumulator.substring(0,u);m.socketAccumulator=m.socketAccumulator.substring(u);m.socketData=v;u=0}else{var t=m.socketAccumulator.indexOf("\r\n");if(t<0){return}u=parseInt(m.socketAccumulator.substring(0,t),16);if(isNaN(u)){if(m.websocket){m.websocket.close()}return}if(m.socketAccumulator.length<t+2+u+2){return}var v=m.socketAccumulator.substring(t+2,t+2+u);m.socketAccumulator=m.socketAccumulator.substring(t+2+u+2);m.socketData+=v}}if(u==0){e(m.socketXHeader,m.socketData);m.socketParseState=0;m.socketHeader=null}}}}function e(u,t){var w=parseInt(u.Directive[1]);if(isNaN(w)){w=602}if(w==401&&++(m.authcounter)<3){m.challengeParams=m.parseDigest(u["www-authenticate"])}else{var v=m.pendingAjaxCall.shift();m.authcounter=0;m.ActiveAjaxCount--;m.gotNextMessages(t,"success",{status:w},v);m.PerformNextAjax()}}function b(s){m.socketState=0;if(m.socket!=null){m.socket.close();m.socket=null}if(m.pendingAjaxCall.length>0){var t=m.pendingAjaxCall.shift();var u=t[5];m.PerformAjaxExNodeJS2(t[0],t[1],t[2],t[3],t[4],--u)}}function g(u){if(m.socketState==2&&m.socket!=null&&m.socket.readyState==WebSocket.OPEN){var r=new Uint8Array(u.length);for(var t=0;t<u.length;++t){r[t]=u.charCodeAt(t)}try{m.socket.send(r.buffer)}catch(s){}}}m.gotNextMessages=function(s,u,t,r){if(m.FailAllError==999){return}if(m.FailAllError!=0){r[1](null,m.FailAllError,r[2]);return}if(t.status!=200){r[1](null,t.status,r[2]);return}r[1](s,200,r[2])};m.gotNextMessagesError=function(t,u,s,r){if(m.FailAllError==999){return}if(m.FailAllError!=0){r[1](null,m.FailAllError,r[2]);return}r[1](m,null,{Header:{HttpError:t.status}},t.status,r[2])};m.CancelAllQueries=function(r){while(m.PendingAjax.length>0){var t=m.PendingAjax.shift();t[1](null,r,t[2])}if(m.websocket!=null){m.websocket.close();m.websocket=null;m.socketState=0}};return m};var CreateAgentRedirect=function(e,g,k,a){var h={};h.m=g;g.parent=h;h.meshserver=e;h.authCookie=a;h.State=0;h.nodeid=null;h.socket=null;h.connectstate=-1;h.tunnelid=Math.random().toString(36).substring(2);h.protocol=g.protocol;h.onStateChanged=null;h.ctrlMsgAllowed=true;h.attemptWebRTC=false;h.webRtcActive=false;h.webSwitchOk=false;h.webchannel=null;h.webrtc=null;h.debugmode=0;h.Start=function(l){var n,m=window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/meshrelay.ashx?id="+h.tunnelid;if((a!=null)&&(a!="")){m+="&auth="+a}h.nodeid=l;h.connectstate=0;h.socket=new WebSocket(m);h.socket.onopen=h.xxOnSocketConnected;h.socket.onmessage=h.xxOnMessage;h.socket.onerror=function(o){};h.socket.onclose=h.xxOnSocketClosed;h.xxStateChange(1);h.meshserver.send({action:"msg",type:"tunnel",nodeid:h.nodeid,value:"*/meshrelay.ashx?id="+h.tunnelid})};h.xxOnSocketConnected=function(){if(h.debugmode==1){console.log("onSocketConnected")}h.xxStateChange(2)};h.xxOnControlCommand=function(n){var l;try{l=JSON.parse(n)}catch(m){return}if(l.ctrlChannel!="102938"){h.xxOnSocketData(n);return}if(h.webrtc!=null){if(l.type=="answer"){h.webrtc.setRemoteDescription(new RTCSessionDescription(l),function(){},h.xxCloseWebRTC)}else{if(l.type=="webrtc0"){h.webSwitchOk=true;j()}else{if(l.type=="webrtc1"){h.sendCtrlMsg('{"ctrlChannel":"102938","type":"webrtc2"}')}else{if(l.type=="webrtc2"){}}}}}};h.sendCtrlMsg=function(m){if(h.ctrlMsgAllowed==true){if((typeof args!="undefined")&&args.redirtrace){console.log("RedirSend",typeof m,m)}try{h.socket.send(m)}catch(l){}}};function j(){if((h.webSwitchOk==true)&&(h.webRtcActive==true)){h.sendCtrlMsg('{"ctrlChannel":"102938","type":"webrtc0"}');h.sendCtrlMsg('{"ctrlChannel":"102938","type":"webrtc1"}');if(h.onStateChanged!=null){h.onStateChanged(h,h.State)}}}h.xxOnMessage=function(o){if(h.State<3){if(o.data=="c"){try{h.socket.send(h.protocol)}catch(p){}h.xxStateChange(3);if(h.attemptWebRTC==true){var n=null;if(typeof RTCPeerConnection!=="undefined"){h.webrtc=new RTCPeerConnection(n)}else{if(typeof webkitRTCPeerConnection!=="undefined"){h.webrtc=new webkitRTCPeerConnection(n)}}if(h.webrtc!=null){h.webchannel=h.webrtc.createDataChannel("DataChannel",{});h.webchannel.onmessage=h.xxOnMessage;h.webchannel.onopen=function(){h.webRtcActive=true;j()};h.webchannel.onclose=function(s){if(h.webRtcActive){h.Stop()}};h.webrtc.onicecandidate=function(s){if(s.candidate==null){try{h.socket.send(JSON.stringify(h.webrtcoffer))}catch(t){}}else{h.webrtcoffer.sdp+=("a="+s.candidate.candidate+"\r\n")}};h.webrtc.oniceconnectionstatechange=function(){if(h.webrtc!=null){if(h.webrtc.iceConnectionState=="disconnected"){if(h.webRtcActive==true){h.Stop()}else{h.xxCloseWebRTC()}}else{if(h.webrtc.iceConnectionState=="failed"){h.xxCloseWebRTC()}}}};h.webrtc.createOffer(function(s){h.webrtcoffer=s;h.webrtc.setLocalDescription(s,function(){},h.xxCloseWebRTC)},h.xxCloseWebRTC,{mandatory:{OfferToReceiveAudio:false,OfferToReceiveVideo:false}})}}return}}if(typeof o.data=="string"){h.xxOnControlCommand(o.data);return}if(typeof o.data=="object"){if(d==true){c.push(o.data);return}if(b.readAsBinaryString){d=true;b.readAsBinaryString(new Blob([o.data]))}else{if(b.readAsArrayBuffer){d=true;b.readAsArrayBuffer(o.data)}else{var l="",m=new Uint8Array(o.data),r=m.byteLength;for(var q=0;q<r;q++){l+=String.fromCharCode(m[q])}h.xxOnSocketData(l)}}}else{h.xxOnSocketData(o.data)}};var b=new FileReader();var d=false,c=[];if(b.readAsBinaryString){b.onload=function(l){h.xxOnSocketData(l.target.result);if(c.length==0){d=false}else{b.readAsBinaryString(new Blob([c.shift()]))}}}else{if(b.readAsArrayBuffer){b.onloadend=function(l){h.xxOnSocketData(l.target.result);if(c.length==0){d=false}else{b.readAsArrayBuffer(c.shift())}}}}h.xxOnSocketData=function(n){if(!n||h.connectstate==-1){return}if(typeof n==="object"){var l="",m=new Uint8Array(n),p=m.byteLength;for(var o=0;o<p;o++){l+=String.fromCharCode(m[o])}n=l}else{if(typeof n!=="string"){return}}if((typeof args!="undefined")&&args.redirtrace){console.log("RedirRecv",typeof n,n.length,n)}return h.m.ProcessData(n)};h.sendText=function(l){if(typeof l!="string"){l=JSON.stringify(l)}h.send(encode_utf8(l))};h.send=function(p){if((typeof args!="undefined")&&args.redirtrace){console.log("RedirSend",typeof p,p.length,p)}try{if(h.socket!=null&&h.socket.readyState==WebSocket.OPEN){if(typeof p=="string"){if(h.debugmode==1){var l=new Uint8Array(p.length),m=[];for(var o=0;o<p.length;++o){l[o]=p.charCodeAt(o);m.push(p.charCodeAt(o))}if(h.webRtcActive==true){h.webchannel.send(l.buffer)}else{h.socket.send(l.buffer)}}else{var l=new Uint8Array(p.length);for(var o=0;o<p.length;++o){l[o]=p.charCodeAt(o)}if(h.webRtcActive==true){h.webchannel.send(l.buffer)}else{h.socket.send(l.buffer)}}}else{if(h.webRtcActive==true){h.webchannel.send(p)}else{h.socket.send(p)}}}}catch(n){}};h.xxOnSocketClosed=function(){h.Stop(1)};h.xxStateChange=function(l){if(h.State==l){return}h.State=l;h.m.xxStateChange(h.State);if(h.onStateChanged!=null){h.onStateChanged(h,h.State)}};h.xxCloseWebRTC=function(){if(h.webchannel!=null){try{h.webchannel.close()}catch(l){}h.webchannel=null}if(h.webrtc!=null){try{h.webrtc.close()}catch(l){}h.webrtc=null}h.webRtcActive=false};h.Stop=function(m){if(h.debugmode==1){console.log("stop",m)}h.xxCloseWebRTC();h.connectstate=-1;if(h.socket!=null){try{if(h.socket.readyState==1){h.sendCtrlMsg('{"ctrlChannel":"102938","type":"close"}');h.socket.close()}}catch(l){}h.socket=null}h.xxStateChange(0)};return h};var CreateKvmDataChannel=function(h,e,d){var g={};g.m=e;e.parent=g;g.webchannel=h;g.State=0;g.protocol=e.protocol;g.onStateChanged=null;g.onControlMsg=null;g.debugmode=0;g.keepalive=d;g.rtcKeepAlive=null;g.Start=function(){if(g.debugmode==1){console.log("start")}g.xxStateChange(3);g.webchannel.onmessage=g.xxOnMessage;g.rtcKeepAlive=setInterval(g.xxSendRtcKeepAlive,30000)};var a=new FileReader();var c=false,b=[];if(a.readAsBinaryString){a.onload=function(j){g.xxOnSocketData(j.target.result);if(b.length==0){c=false}else{a.readAsBinaryString(new Blob([b.shift()]))}}}else{if(a.readAsArrayBuffer){a.onloadend=function(j){g.xxOnSocketData(j.target.result);if(b.length==0){c=false}else{a.readAsArrayBuffer(b.shift())}}}}g.xxOnMessage=function(l){if(typeof l.data=="string"){if(g.onControlMsg!=null){g.onControlMsg(l.data)}return}if(typeof l.data=="object"){if(c==true){b.push(l.data);return}if(a.readAsBinaryString){c=true;a.readAsBinaryString(new Blob([l.data]))}else{if(f.readAsArrayBuffer){c=true;a.readAsArrayBuffer(l.data)}else{var j="",k=new Uint8Array(l.data),n=k.byteLength;for(var m=0;m<n;m++){j+=String.fromCharCode(k[m])}g.xxOnSocketData(j)}}}else{g.xxOnSocketData(l.data)}};g.xxOnSocketData=function(l){if(!l){return}if(typeof l==="object"){var j="",k=new Uint8Array(l),n=k.byteLength;for(var m=0;m<n;m++){j+=String.fromCharCode(k[m])}l=j}else{if(typeof l!=="string"){return}}return g.m.ProcessData(l)};g.sendCtrlMsg=function(j){if(typeof j=="string"){g.webchannel.send(j);if(g.keepalive!=null){g.keepalive.sendKeepAlive()}}};g.send=function(l){if(typeof l=="string"){var j=new Uint8Array(l.length);for(var k=0;k<l.length;++k){j[k]=l.charCodeAt(k)}l=j}g.webchannel.send(l)};g.xxStateChange=function(j){if(g.State==j){return}g.State=j;g.m.xxStateChange(g.State);if(g.onStateChanged!=null){g.onStateChanged(g,g.State)}};g.Stop=function(){if(g.debugmode==1){console.log("stop")}if(g.rtcKeepAlive!=null){clearInterval(g.rtcKeepAlive);g.rtcKeepAlive=null}g.xxStateChange(0)};g.xxSendRtcKeepAlive=function(){g.sendCtrlMsg(JSON.stringify({action:"ping"}))};return g};var CreateAgentRemoteDesktop=function(a,e){var d={};d.CanvasId=a;if(typeof a==="string"){d.CanvasId=Q(a)}d.Canvas=d.CanvasId.getContext("2d");d.scrolldiv=e;d.State=0;d.PendingOperations=[];d.tilesReceived=0;d.TilesDrawn=0;d.KillDraw=0;d.ipad=false;d.tabletKeyboardVisible=false;d.LastX=0;d.LastY=0;d.touchenabled=0;d.submenuoffset=0;d.touchtimer=null;d.TouchArray={};d.connectmode=0;d.connectioncount=0;d.rotation=0;d.protocol=2;d.debugmode=0;d.firstUpKeys=[];d.stopInput=false;d.localKeyMap=true;d.sessionid=0;d.username;d.oldie=false;d.CompressionLevel=50;d.ScalingLevel=1024;d.FrameRateTimer=50;d.FirstDraw=false;d.ScreenWidth=960;d.ScreenHeight=700;d.width=960;d.height=960;d.onScreenSizeChange=null;d.onMessage=null;d.onConnectCountChanged=null;d.onDebugMessage=null;d.onTouchEnabledChanged=null;d.onDisplayinfo=null;d.accumulator=null;d.Start=function(){d.State=0;d.accumulator=null};d.Stop=function(){d.setRotation(0);d.UnGrabKeyInput();d.UnGrabMouseInput();d.touchenabled=0;if(d.onScreenSizeChange!=null){d.onScreenSizeChange(d,d.ScreenWidth,d.ScreenHeight,d.CanvasId)}d.Canvas.clearRect(0,0,d.CanvasId.width,d.CanvasId.height)};d.xxStateChange=function(g){if(d.State==g){return}d.State=g;d.CanvasId.style.cursor="default";switch(g){case 0:d.Stop();break;case 3:break}};d.send=function(g){if(d.debugmode>1){console.log("KSend("+g.length+"): "+rstr2hex(g))}d.parent.send(g)};d.ProcessPictureMsg=function(h,k,l){var j=new Image();j.xcount=d.tilesReceived++;var g=d.tilesReceived;j.src="data:image/jpeg;base64,"+btoa(h.substring(4,h.length));j.onload=function(){if(d.Canvas!=null&&d.KillDraw<g&&d.State!=0){d.PendingOperations.push([g,2,j,k,l]);while(d.DoPendingOperations()){}}};j.error=function(){console.log("DecodeTileError")}};d.DoPendingOperations=function(){if(d.PendingOperations.length==0){return false}for(var g=0;g<d.PendingOperations.length;g++){var h=d.PendingOperations[g];if(h[0]==(d.TilesDrawn+1)){if(h[1]==1){d.ProcessCopyRectMsg(h[2])}else{if(h[1]==2){d.Canvas.drawImage(h[2],d.rotX(h[3],h[4]),d.rotY(h[3],h[4]));delete h[2]}}d.PendingOperations.splice(g,1);delete h;d.TilesDrawn++;if(d.TilesDrawn==d.tilesReceived&&d.KillDraw<d.TilesDrawn){d.KillDraw=d.TilesDrawn=d.tilesReceived=0}return true}}if(d.oldie&&d.PendingOperations.length>0){d.TilesDrawn++}return false};d.ProcessCopyRectMsg=function(k){var l=((k.charCodeAt(0)&255)<<8)+(k.charCodeAt(1)&255);var m=((k.charCodeAt(2)&255)<<8)+(k.charCodeAt(3)&255);var g=((k.charCodeAt(4)&255)<<8)+(k.charCodeAt(5)&255);var h=((k.charCodeAt(6)&255)<<8)+(k.charCodeAt(7)&255);var n=((k.charCodeAt(8)&255)<<8)+(k.charCodeAt(9)&255);var j=((k.charCodeAt(10)&255)<<8)+(k.charCodeAt(11)&255);d.Canvas.drawImage(Canvas.canvas,l,m,n,j,g,h,n,j)};d.SendUnPause=function(){d.send(String.fromCharCode(0,8,0,5,0))};d.SendPause=function(){d.send(String.fromCharCode(0,8,0,5,1))};d.SendCompressionLevel=function(k,h,j,g){if(h){d.CompressionLevel=h}if(j){d.ScalingLevel=j}if(g){d.FrameRateTimer=g}d.send(String.fromCharCode(0,5,0,10,k,d.CompressionLevel)+d.shortToStr(d.ScalingLevel)+d.shortToStr(d.FrameRateTimer))};d.SendRefresh=function(){d.send(String.fromCharCode(0,6,0,4))};d.ProcessScreenMsg=function(h,g){if(d.debugmode>0){console.log("ScreenSize: "+h+" x "+g)}d.Canvas.setTransform(1,0,0,1,0,0);d.rotation=0;d.FirstDraw=true;d.ScreenWidth=d.width=h;d.ScreenHeight=d.height=g;d.KillDraw=d.tilesReceived;while(d.PendingOperations.length>0){d.PendingOperations.shift()}d.SendCompressionLevel(1);d.SendUnPause();if(d.onScreenSizeChange!=null){d.onScreenSizeChange(d,d.ScreenWidth,d.ScreenHeight,d.CanvasId)}};d.ProcessData=function(h){var g=0;while(g<h.length){g+=d.ProcessDataEx(h.substring(g))}};d.ProcessDataEx=function(r){if(d.accumulator!=null){r=d.accumulator+r;console.log("KVM using accumulated data, total size is now "+r.length+" bytes.");d.accumulator=null}if(d.debugmode>1){console.log("KRecv("+r.length+"): "+rstr2hex(r.substring(0,Math.min(r.length,40))))}if(r.length<4){return}var g=null,s=0,t=0,j=ReadShort(r,0),h=ReadShort(r,2),n=0;if((j==27)&&(h==8)){if(r.length<12){return}j=ReadShort(r,8);h=ReadInt(r,4);if((h+8)>r.length){console.log("KVM accumulator set to "+r.length+" bytes, need "+h+" bytes.");d.accumulator=r;return}r=r.substring(8);n=8}if((h!=r.length)&&(d.debugmode>0)){console.log(h,r.length,h==r.length)}if((j>=18)&&(j!=65)){console.error("Invalid KVM command "+j+" of size "+h);console.log("Invalid KVM data",r.length,rstr2hex(r.substring(0,40))+"...");return}if(h>r.length){console.log("KVM accumulator set to "+r.length+" bytes, need "+h+" bytes.");d.accumulator=r;return}if(j==3||j==4||j==7){g=r.substring(4,h);s=((g.charCodeAt(0)&255)<<8)+(g.charCodeAt(1)&255);t=((g.charCodeAt(2)&255)<<8)+(g.charCodeAt(3)&255);if(d.debugmode>0){console.log("CMD"+j+" at X="+s+" Y="+t)}}switch(j){case 3:if(d.FirstDraw){d.onResize()}d.ProcessPictureMsg(g,s,t);break;case 4:if(d.FirstDraw){d.onResize()}if(d.TilesDrawn==d.tilesReceived){d.ProcessCopyRectMsg(g)}else{d.PendingOperations.push([++tilesReceived,1,g])}break;case 7:d.ProcessScreenMsg(s,t);d.SendKeyMsgKC(d.KeyAction.UP,16);d.SendKeyMsgKC(d.KeyAction.UP,17);d.SendKeyMsgKC(d.KeyAction.UP,18);d.SendKeyMsgKC(d.KeyAction.UP,91);d.SendKeyMsgKC(d.KeyAction.UP,92);d.SendKeyMsgKC(d.KeyAction.UP,16);d.send(String.fromCharCode(0,14,0,4));break;case 11:var o=[],k=((r.charCodeAt(4)&255)<<8)+(r.charCodeAt(5)&255);if(k>0){var q=0,p=((r.charCodeAt(6+(k*2))&255)<<8)+(r.charCodeAt(7+(k*2))&255);for(var m=0;m<k;m++){var l=((r.charCodeAt(6+(m*2))&255)<<8)+(r.charCodeAt(7+(m*2))&255);if(l==65535){o.push("All Displays")}else{o.push("Display "+l)}if(l==p){q=m}}}if(d.onDisplayinfo!=null){d.onDisplayinfo(d,o,q)}break;case 12:break;case 14:d.touchenabled=1;d.TouchArray={};if(d.onTouchEnabledChanged!=null){d.onTouchEnabledChanged(d.touchenabled)}break;case 15:d.TouchArray={};break;case 16:d.connectioncount=ReadInt(r,4);if(d.onConnectCountChanged!=null){d.onConnectCountChanged(d.connectioncount,d)}break;case 17:if(d.onMessage!=null){d.onMessage(r.substring(4,h),d)}break;case 65:r=r.substring(4);if(r[0]!="."){console.log(r);alert("KVM: "+r)}else{console.log("KVM: "+r.substring(1))}break}return h+n};d.MouseButton={NONE:0,LEFT:2,RIGHT:8,MIDDLE:32};d.KeyAction={NONE:0,DOWN:1,UP:2,SCROLL:3,EXUP:4,EXDOWN:5,DBLCLICK:6};d.InputType={KEY:1,MOUSE:2,CTRLALTDEL:10,TOUCH:15};d.Alternate=0;var c={Pause:19,CapsLock:20,Space:32,Quote:222,Minus:189,NumpadMultiply:106,NumpadAdd:107,PrintScreen:44,Comma:188,NumpadSubtract:109,NumpadDecimal:110,Period:190,Slash:191,NumpadDivide:111,Semicolon:186,Equal:187,OSLeft:91,BracketLeft:219,OSRight:91,Backslash:220,BracketRight:221,ContextMenu:93,Backquote:192,NumLock:144,ScrollLock:145,Backspace:8,Tab:9,Enter:13,NumpadEnter:13,Escape:27,Delete:46,Home:36,PageUp:33,PageDown:34,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,End:35,Insert:45,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,VolumeMute:181};function b(g){if(g.code.startsWith("Key")&&g.code.length==4){return g.code.charCodeAt(3)}if(g.code.startsWith("Digit")&&g.code.length==6){return g.code.charCodeAt(5)}if(g.code.startsWith("Numpad")&&g.code.length==7){return g.code.charCodeAt(6)+48}return c[g.code]}d.SendKeyMsg=function(g,h){if(g==null){return}if(!h){h=window.event}if(h.code&&(d.localKeyMap==false)){var j=b(h);if(j!=null){d.SendKeyMsgKC(g,j)}}else{var j=h.keyCode;if(j==59){j=186}d.SendKeyMsgKC(g,j)}};d.SendMessage=function(g){if(d.State==3){d.send(String.fromCharCode(0,17)+d.shortToStr(4+g.length)+g)}};d.SendKeyMsgKC=function(g,j){if(d.State!=3){return}if(typeof g=="object"){for(var h in g){d.SendKeyMsgKC(g[h][0],g[h][1])}}else{d.send(String.fromCharCode(0,d.InputType.KEY,0,6,(g-1),j))}};d.sendcad=function(){d.SendCtrlAltDelMsg()};d.SendCtrlAltDelMsg=function(){if(d.State==3){d.send(String.fromCharCode(0,d.InputType.CTRLALTDEL,0,4))}};d.SendEscKey=function(){if(d.State==3){d.send(String.fromCharCode(0,d.InputType.KEY,0,6,0,27,0,d.InputType.KEY,0,6,1,27))}};d.SendStartMsg=function(){d.SendKeyMsgKC(d.KeyAction.EXDOWN,91);d.SendKeyMsgKC(d.KeyAction.EXUP,91)};d.SendCharmsMsg=function(){d.SendKeyMsgKC(d.KeyAction.EXDOWN,91);d.SendKeyMsgKC(d.KeyAction.DOWN,67);d.SendKeyMsgKC(d.KeyAction.UP,67);d.SendKeyMsgKC(d.KeyAction.EXUP,91)};d.SendTouchMsg1=function(h,g,j,k){if(d.State==3){d.send(String.fromCharCode(0,d.InputType.TOUCH)+d.shortToStr(14)+String.fromCharCode(1,h)+d.intToStr(g)+d.shortToStr(j)+d.shortToStr(k))}};d.SendTouchMsg2=function(j,g){var m="";var h;var n="TOUCHSEND: ";for(var l in d.TouchArray){if(l==j){h=g}else{if(d.TouchArray[l].f==1){h=65536|2|4;d.TouchArray[l].f=3;n+="START"+l}else{if(d.TouchArray[l].f==2){h=262144;n+="STOP"+l}else{h=2|4|131072}}}m+=String.fromCharCode(l)+d.intToStr(h)+d.shortToStr(d.TouchArray[l].x)+d.shortToStr(d.TouchArray[l].y);if(d.TouchArray[l].f==2){delete d.TouchArray[l]}}if(d.State==3){d.send(String.fromCharCode(0,d.InputType.TOUCH)+d.shortToStr(5+m.length)+String.fromCharCode(2)+m)}if(Object.keys(d.TouchArray).length==0&&d.touchtimer!=null){clearInterval(d.touchtimer);d.touchtimer=null}};d.SendMouseMsg=function(g,k){if(d.State!=3){return}if(g!=null&&d.Canvas!=null){if(!k){var k=window.event}var n=(d.Canvas.canvas.height/d.CanvasId.clientHeight);var o=(d.Canvas.canvas.width/d.CanvasId.clientWidth);var m=d.GetPositionOfControl(d.Canvas.canvas);var p=((k.pageX-m[0])*o);var q=((k.pageY-m[1])*n);if(p>=0&&p<=d.Canvas.canvas.width&&q>=0&&q<=d.Canvas.canvas.height){var h=0;var j=0;if(g==d.KeyAction.UP||g==d.KeyAction.DOWN){if(k.which){((k.which==1)?(h=d.MouseButton.LEFT):((k.which==2)?(h=d.MouseButton.MIDDLE):(h=d.MouseButton.RIGHT)))}else{if(k.button){((k.button==0)?(h=d.MouseButton.LEFT):((k.button==1)?(h=d.MouseButton.MIDDLE):(h=d.MouseButton.RIGHT)))}}}else{if(g==d.KeyAction.SCROLL){if(k.detail){j=(-1*(k.detail*120))}else{if(k.wheelDelta){j=(k.wheelDelta*3)}}}}var l="";if(g==d.KeyAction.DBLCLICK){l=String.fromCharCode(0,d.InputType.MOUSE,0,10,0,136,((p/256)&255),(p&255),((q/256)&255),(q&255))}else{if(g==d.KeyAction.SCROLL){l=String.fromCharCode(0,d.InputType.MOUSE,0,12,0,0,((p/256)&255),(p&255),((q/256)&255),(q&255),((j/256)&255),(j&255))}else{l=String.fromCharCode(0,d.InputType.MOUSE,0,10,0,((g==d.KeyAction.DOWN)?h:((h*2)&255)),((p/256)&255),(p&255),((q/256)&255),(q&255))}}if(d.Action==d.KeyAction.NONE){if(d.Alternate==0||d.ipad){d.send(l);d.Alternate=1}else{d.Alternate=0}}else{d.send(l)}}}};d.GetDisplayNumbers=function(){d.send(String.fromCharCode(0,11,0,4))};d.SetDisplay=function(g){d.send(String.fromCharCode(0,12,0,6,g>>8,g&255))};d.intToStr=function(g){return String.fromCharCode((g>>24)&255,(g>>16)&255,(g>>8)&255,g&255)};d.shortToStr=function(g){return String.fromCharCode((g>>8)&255,g&255)};d.onResize=function(){if(d.ScreenWidth==0||d.ScreenHeight==0){return}if(d.Canvas.canvas.width==d.ScreenWidth&&d.Canvas.canvas.height==d.ScreenHeight){return}if(d.FirstDraw){d.Canvas.canvas.width=d.ScreenWidth;d.Canvas.canvas.height=d.ScreenHeight;d.Canvas.fillRect(0,0,d.ScreenWidth,d.ScreenHeight);if(d.onScreenSizeChange!=null){d.onScreenSizeChange(d,d.ScreenWidth,d.ScreenHeight,d.CanvasId)}}d.FirstDraw=false};d.xxMouseInputGrab=false;d.xxKeyInputGrab=false;d.xxMouseMove=function(g){if(d.State==3){d.SendMouseMsg(d.KeyAction.NONE,g)}if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};d.xxMouseUp=function(g){if(d.State==3){d.SendMouseMsg(d.KeyAction.UP,g)}if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};d.xxMouseDown=function(g){if(d.State==3){d.SendMouseMsg(d.KeyAction.DOWN,g)}if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};d.xxMouseDblClick=function(g){if(d.State==3){d.SendMouseMsg(d.KeyAction.DBLCLICK,g)}if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};d.xxDOMMouseScroll=function(g){if(d.State==3){d.SendMouseMsg(d.KeyAction.SCROLL,g);return false}return true};d.xxMouseWheel=function(g){if(d.State==3){d.SendMouseMsg(d.KeyAction.SCROLL,g);return false}return true};d.xxKeyUp=function(g){if(d.State==3){d.SendKeyMsg(d.KeyAction.UP,g)}if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};d.xxKeyDown=function(g){if(d.State==3){d.SendKeyMsg(d.KeyAction.DOWN,g)}if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};d.xxKeyPress=function(g){if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};d.handleKeys=function(g){if(d.stopInput==true||desktop.State!=3){return false}return d.xxKeyPress(g)};d.handleKeyUp=function(g){if(d.stopInput==true||desktop.State!=3){return false}if(d.firstUpKeys.length<5){d.firstUpKeys.push(g.keyCode);if((d.firstUpKeys.length==5)){var h=d.firstUpKeys.join(",");if((h=="16,17,91,91,16")||(h=="16,17,18,91,92")){d.stopInput=true}}}return d.xxKeyUp(g)};d.handleKeyDown=function(g){if(d.stopInput==true||desktop.State!=3){return false}return d.xxKeyDown(g)};d.mousedblclick=function(g){if(d.stopInput==true){return false}return d.xxMouseDblClick(g)};d.mousedown=function(g){if(d.stopInput==true){return false}return d.xxMouseDown(g)};d.mouseup=function(g){if(d.stopInput==true){return false}return d.xxMouseUp(g)};d.mousemove=function(g){if(d.stopInput==true){return false}return d.xxMouseMove(g)};d.mousewheel=function(g){if(d.stopInput==true){return false}return d.xxMouseWheel(g)};d.xxMsTouchEvent=function(g){if(g.originalEvent.pointerType==4){return}if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}if(g.type=="MSPointerDown"||g.type=="MSPointerMove"||g.type=="MSPointerUp"){var h=0;var j=g.originalEvent.pointerId%256;var k=g.offsetX*(Canvas.canvas.width/d.CanvasId.clientWidth);var l=g.offsetY*(Canvas.canvas.height/d.CanvasId.clientHeight);if(g.type=="MSPointerDown"){h=65536|2|4}else{if(g.type=="MSPointerMove"){h=131072|2|4}else{if(g.type=="MSPointerUp"){h=262144}}}if(!d.TouchArray[j]){d.TouchArray[j]={x:k,y:l}}d.SendTouchMsg2(j,h);if(g.type=="MSPointerUp"){delete d.TouchArray[j]}}else{alert(g.type)}return true};d.xxTouchStart=function(g){if(d.State!=3){return}if(g.preventDefault){g.preventDefault()}if(d.touchenabled==0||d.touchenabled==1){if(g.originalEvent.touches.length>1){return}var l=g.originalEvent.touches[0];g.which=1;d.LastX=g.pageX=l.pageX;d.LastY=g.pageY=l.pageY;d.SendMouseMsg(KeyAction.DOWN,g)}else{var k=d.GetPositionOfControl(Canvas.canvas);for(var h in g.originalEvent.changedTouches){if(!g.originalEvent.changedTouches[h].identifier){continue}var j=g.originalEvent.changedTouches[h].identifier%256;if(!d.TouchArray[j]){d.TouchArray[j]={x:(g.originalEvent.touches[h].pageX-k[0])*(Canvas.canvas.width/d.CanvasId.clientWidth),y:(g.originalEvent.touches[h].pageY-k[1])*(Canvas.canvas.height/d.CanvasId.clientHeight),f:1}}}if(Object.keys(d.TouchArray).length>0&&touchtimer==null){d.touchtimer=setInterval(function(){d.SendTouchMsg2(256,0)},50)}}};d.xxTouchMove=function(g){if(d.State!=3){return}if(g.preventDefault){g.preventDefault()}if(d.touchenabled==0||d.touchenabled==1){if(g.originalEvent.touches.length>1){return}var l=g.originalEvent.touches[0];g.which=1;d.LastX=g.pageX=l.pageX;d.LastY=g.pageY=l.pageY;d.SendMouseMsg(d.KeyAction.NONE,g)}else{var k=d.GetPositionOfControl(Canvas.canvas);for(var h in g.originalEvent.changedTouches){if(!g.originalEvent.changedTouches[h].identifier){continue}var j=g.originalEvent.changedTouches[h].identifier%256;if(d.TouchArray[j]){d.TouchArray[j].x=(g.originalEvent.touches[h].pageX-k[0])*(d.Canvas.canvas.width/d.CanvasId.clientWidth);d.TouchArray[j].y=(g.originalEvent.touches[h].pageY-k[1])*(d.Canvas.canvas.height/d.CanvasId.clientHeight)}}}};d.xxTouchEnd=function(g){if(d.State!=3){return}if(g.preventDefault){g.preventDefault()}if(d.touchenabled==0||d.touchenabled==1){if(g.originalEvent.touches.length>1){return}g.which=1;g.pageX=LastX;g.pageY=LastY;d.SendMouseMsg(KeyAction.UP,g)}else{for(var h in g.originalEvent.changedTouches){if(!g.originalEvent.changedTouches[h].identifier){continue}var j=g.originalEvent.changedTouches[h].identifier%256;if(d.TouchArray[j]){d.TouchArray[j].f=2}}}};d.GrabMouseInput=function(){if(d.xxMouseInputGrab==true){return}var g=d.CanvasId;g.onmousemove=d.xxMouseMove;g.onmouseup=d.xxMouseUp;g.onmousedown=d.xxMouseDown;g.touchstart=d.xxTouchStart;g.touchmove=d.xxTouchMove;g.touchend=d.xxTouchEnd;g.MSPointerDown=d.xxMsTouchEvent;g.MSPointerMove=d.xxMsTouchEvent;g.MSPointerUp=d.xxMsTouchEvent;if(navigator.userAgent.match(/mozilla/i)){g.DOMMouseScroll=d.xxDOMMouseScroll}else{g.onmousewheel=d.xxMouseWheel}d.xxMouseInputGrab=true};d.UnGrabMouseInput=function(){if(d.xxMouseInputGrab==false){return}var g=d.CanvasId;g.onmousemove=null;g.onmouseup=null;g.onmousedown=null;g.touchstart=null;g.touchmove=null;g.touchend=null;g.MSPointerDown=null;g.MSPointerMove=null;g.MSPointerUp=null;if(navigator.userAgent.match(/mozilla/i)){g.DOMMouseScroll=null}else{g.onmousewheel=null}d.xxMouseInputGrab=false};d.GrabKeyInput=function(){if(d.xxKeyInputGrab==true){return}document.onkeyup=d.xxKeyUp;document.onkeydown=d.xxKeyDown;document.onkeypress=d.xxKeyPress;d.xxKeyInputGrab=true};d.UnGrabKeyInput=function(){if(d.xxKeyInputGrab==false){return}document.onkeyup=null;document.onkeydown=null;document.onkeypress=null;d.xxKeyInputGrab=false};d.GetPositionOfControl=function(g){var h=Array(2);h[0]=h[1]=0;while(g){h[0]+=g.offsetLeft;h[1]+=g.offsetTop;g=g.offsetParent}return h};d.crotX=function(g,h){if(d.rotation==0){return g}if(d.rotation==1){return h}if(d.rotation==2){return d.Canvas.canvas.width-g}if(d.rotation==3){return d.Canvas.canvas.height-h}};d.crotY=function(g,h){if(d.rotation==0){return h}if(d.rotation==1){return d.Canvas.canvas.width-g}if(d.rotation==2){return d.Canvas.canvas.height-h}if(d.rotation==3){return g}};d.rotX=function(g,h){if(d.rotation==0||d.rotation==1){return g}if(d.rotation==2){return g-d.Canvas.canvas.width}if(d.rotation==3){return g-d.Canvas.canvas.height}};d.rotY=function(g,h){if(d.rotation==0||d.rotation==3){return h}if(d.rotation==1){return h-d.Canvas.canvas.width}if(d.rotation==2){return h-d.Canvas.canvas.height}};d.tcanvas=null;d.setRotation=function(l){while(l<0){l+=4}var g=l%4;if(g==d.rotation){return true}var j=d.Canvas.canvas.width;var h=d.Canvas.canvas.height;if(d.rotation==1||d.rotation==3){j=d.Canvas.canvas.height;h=d.Canvas.canvas.width}if(d.tcanvas==null){d.tcanvas=document.createElement("canvas")}var k=d.tcanvas.getContext("2d");k.setTransform(1,0,0,1,0,0);k.canvas.width=j;k.canvas.height=h;k.rotate((d.rotation*-90)*Math.PI/180);if(d.rotation==0){k.drawImage(d.Canvas.canvas,0,0)}if(d.rotation==1){k.drawImage(d.Canvas.canvas,-d.Canvas.canvas.width,0)}if(d.rotation==2){k.drawImage(d.Canvas.canvas,-d.Canvas.canvas.width,-d.Canvas.canvas.height)}if(d.rotation==3){k.drawImage(d.Canvas.canvas,0,-d.Canvas.canvas.height)}if(d.rotation==0||d.rotation==2){d.Canvas.canvas.height=j;d.Canvas.canvas.width=h}if(d.rotation==1||d.rotation==3){d.Canvas.canvas.height=h;d.Canvas.canvas.width=j}d.Canvas.setTransform(1,0,0,1,0,0);d.Canvas.rotate((g*90)*Math.PI/180);d.rotation=g;d.Canvas.drawImage(d.tcanvas,d.rotX(0,0),d.rotY(0,0));d.ScreenWidth=d.Canvas.canvas.width;d.ScreenHeight=d.Canvas.canvas.height;if(d.onScreenSizeChange!=null){d.onScreenSizeChange(d,d.ScreenWidth,d.ScreenHeight,d.CanvasId)}return true};d.MuchTheSame=function(g,h){return(Math.abs(g-h)<4)};d.Debug=function(g){console.log(g)};d.getIEVersion=function(){var g=-1;if(navigator.appName=="Microsoft Internet Explorer"){var j=navigator.userAgent;var h=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");if(h.exec(j)!=null){g=parseFloat(RegExp.$1)}}return g};d.haltEvent=function(g){if(g.preventDefault){g.preventDefault()}if(g.stopPropagation){g.stopPropagation()}return false};return d};var QRCode;!function(){function t(c){this.mode=v.MODE_8BIT_BYTE,this.data=c,this.parsedData=[];for(var g=[],h=0,j=this.data.length;j>h;h++){var k=this.data.charCodeAt(h);k>65536?(g[0]=240|(1835008&k)>>>18,g[1]=128|(258048&k)>>>12,g[2]=128|(4032&k)>>>6,g[3]=128|63&k):k>2048?(g[0]=224|(61440&k)>>>12,g[1]=128|(4032&k)>>>6,g[2]=128|63&k):k>128?(g[0]=192|(1984&k)>>>6,g[1]=128|63&k):g[0]=k,this.parsedData=this.parsedData.concat(g)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function u(c,d){this.typeNumber=c,this.errorCorrectLevel=d,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function B(e,g){if(void 0==e.length){throw new Error(e.length+"/"+g)}for(var h=0;h<e.length&&0==e[h];){h++}this.num=new Array(e.length-h+g);for(var j=0;j<e.length-h;j++){this.num[j]=e[j+h]}}function C(c,d){this.totalCount=c,this.dataCount=d}function D(){this.buffer=[],this.length=0}function F(){return"undefined"!=typeof CanvasRenderingContext2D}function G(){var c=!1,d=navigator.userAgent;return/android/i.test(d)&&(c=!0,aMat=d.toString().match(/android ([0-9]\.[0-9])/i),aMat&&aMat[1]&&(c=parseFloat(aMat[1]))),c}function K(d,j){for(var k=1,l=L(d),m=0,n=E.length;n>=m;m++){var o=0;switch(j){case w.L:o=E[m][0];break;case w.M:o=E[m][1];break;case w.Q:o=E[m][2];break;case w.H:o=E[m][3]}if(o>=l){break}k++}if(k>E.length){throw new Error("Too long data")}return k}function L(c){var d=encodeURI(c).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return d.length+(d.length!=c?3:0)}t.prototype={getLength:function(){return this.parsedData.length},write:function(d){for(var e=0,g=this.parsedData.length;g>e;e++){d.put(this.parsedData[e],8)}}},u.prototype={addData:function(a){var d=new t(a);this.dataList.push(d),this.dataCache=null},isDark:function(c,d){if(0>c||this.moduleCount<=c||0>d||this.moduleCount<=d){throw new Error(c+","+d)}return this.modules[c][d]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(b,g){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var h=0;h<this.moduleCount;h++){this.modules[h]=new Array(this.moduleCount);for(var j=0;j<this.moduleCount;j++){this.modules[h][j]=null}}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(b,g),this.typeNumber>=7&&this.setupTypeNumber(b),null==this.dataCache&&(this.dataCache=u.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,g)},setupPositionProbePattern:function(e,g){for(var h=-1;7>=h;h++){if(!(-1>=e+h||this.moduleCount<=e+h)){for(var j=-1;7>=j;j++){-1>=g+j||this.moduleCount<=g+j||(this.modules[e+h][g+j]=h>=0&&6>=h&&(0==j||6==j)||j>=0&&6>=j&&(0==h||6==h)||h>=2&&4>=h&&j>=2&&4>=j?!0:!1)}}}},getBestMaskPattern:function(){for(var e=0,g=0,h=0;8>h;h++){this.makeImpl(!0,h);var j=y.getLostPoint(this);(0==h||e>j)&&(e=j,g=h)}return g},createMovieClip:function(k,l,m){var n=k.createEmptyMovieClip(l,m),o=1;this.make();for(var p=0;p<this.modules.length;p++){for(var q=p*o,r=0;r<this.modules[p].length;r++){var s=r*o,M=this.modules[p][r];M&&(n.beginFill(0,100),n.moveTo(s,q),n.lineTo(s+o,q),n.lineTo(s+o,q+o),n.lineTo(s,q+o),n.endFill())}}return n},setupTimingPattern:function(){for(var c=8;c<this.moduleCount-8;c++){null==this.modules[c][6]&&(this.modules[c][6]=0==c%2)}for(var d=8;d<this.moduleCount-8;d++){null==this.modules[6][d]&&(this.modules[6][d]=0==d%2)}},setupPositionAdjustPattern:function(){for(var j=y.getPatternPosition(this.typeNumber),k=0;k<j.length;k++){for(var l=0;l<j.length;l++){var m=j[k],n=j[l];if(null==this.modules[m][n]){for(var o=-2;2>=o;o++){for(var p=-2;2>=p;p++){this.modules[m+o][n+p]=-2==o||2==o||-2==p||2==p||0==o&&0==p?!0:!1}}}}}},setupTypeNumber:function(e){for(var g=y.getBCHTypeNumber(this.typeNumber),h=0;18>h;h++){var j=!e&&1==(1&g>>h);this.modules[Math.floor(h/3)][h%3+this.moduleCount-8-3]=j}for(var h=0;18>h;h++){var j=!e&&1==(1&g>>h);this.modules[h%3+this.moduleCount-8-3][Math.floor(h/3)]=j}},setupTypeInfo:function(h,j){for(var k=this.errorCorrectLevel<<3|j,l=y.getBCHTypeInfo(k),m=0;15>m;m++){var n=!h&&1==(1&l>>m);6>m?this.modules[m][8]=n:8>m?this.modules[m+1][8]=n:this.modules[this.moduleCount-15+m][8]=n}for(var m=0;15>m;m++){var n=!h&&1==(1&l>>m);8>m?this.modules[8][this.moduleCount-m-1]=n:9>m?this.modules[8][15-m-1+1]=n:this.modules[8][15-m-1]=n}this.modules[this.moduleCount-8][8]=!h},mapData:function(l,m){for(var n=-1,o=this.moduleCount-1,p=7,q=0,r=this.moduleCount-1;r>0;r-=2){for(6==r&&r--;;){for(var s=0;2>s;s++){if(null==this.modules[o][r-s]){var M=!1;q<l.length&&(M=1==(1&l[q]>>>p));var N=y.getMask(m,o,r-s);N&&(M=!M),this.modules[o][r-s]=M,p--,-1==p&&(q++,p=7)}}if(o+=n,0>o||this.moduleCount<=o){o-=n,n=-n;break}}}}},u.PAD0=236,u.PAD1=17,u.createData=function(b,j,k){for(var m=C.getRSBlocks(b,j),n=new D,o=0;o<k.length;o++){var p=k[o];n.put(p.mode,4),n.put(p.getLength(),y.getLengthInBits(p.mode,b)),p.write(n)}for(var q=0,o=0;o<m.length;o++){q+=m[o].dataCount}if(n.getLengthInBits()>8*q){throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*q+")")}for(n.getLengthInBits()+4<=8*q&&n.put(0,4);0!=n.getLengthInBits()%8;){n.putBit(!1)}for(;;){if(n.getLengthInBits()>=8*q){break}if(n.put(u.PAD0,8),n.getLengthInBits()>=8*q){break}n.put(u.PAD1,8)}return u.createBytes(n,m)},u.createBytes=function(M,N){for(var O=0,P=0,R=0,S=new Array(N.length),T=new Array(N.length),U=0;U<N.length;U++){var V=N[U].dataCount,W=N[U].totalCount-V;P=Math.max(P,V),R=Math.max(R,W),S[U]=new Array(V);for(var X=0;X<S[U].length;X++){S[U][X]=255&M.buffer[X+O]}O+=V;var Y=y.getErrorCorrectPolynomial(W),Z=new B(S[U],Y.getLength()-1),aa=Z.mod(Y);T[U]=new Array(Y.getLength()-1);for(var X=0;X<T[U].length;X++){var ab=X+aa.getLength()-T[U].length;T[U][X]=ab>=0?aa.get(ab):0}}for(var ac=0,X=0;X<N.length;X++){ac+=N[X].totalCount}for(var ad=new Array(ac),ae=0,X=0;P>X;X++){for(var U=0;U<N.length;U++){X<S[U].length&&(ad[ae++]=S[U][X])}}for(var X=0;R>X;X++){for(var U=0;U<N.length;U++){X<T[U].length&&(ad[ae++]=T[U][X])}}return ad};for(var v={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},w={L:1,M:0,Q:3,H:2},x={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},y={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(c){for(var d=c<<10;y.getBCHDigit(d)-y.getBCHDigit(y.G15)>=0;){d^=y.G15<<y.getBCHDigit(d)-y.getBCHDigit(y.G15)}return(c<<10|d)^y.G15_MASK},getBCHTypeNumber:function(c){for(var d=c<<12;y.getBCHDigit(d)-y.getBCHDigit(y.G18)>=0;){d^=y.G18<<y.getBCHDigit(d)-y.getBCHDigit(y.G18)}return c<<12|d},getBCHDigit:function(c){for(var d=0;0!=c;){d++,c>>>=1}return d},getPatternPosition:function(b){return y.PATTERN_POSITION_TABLE[b-1]},getMask:function(d,e,g){switch(d){case x.PATTERN000:return 0==(e+g)%2;case x.PATTERN001:return 0==e%2;case x.PATTERN010:return 0==g%3;case x.PATTERN011:return 0==(e+g)%3;case x.PATTERN100:return 0==(Math.floor(e/2)+Math.floor(g/3))%2;case x.PATTERN101:return 0==e*g%2+e*g%3;case x.PATTERN110:return 0==(e*g%2+e*g%3)%2;case x.PATTERN111:return 0==(e*g%3+(e+g)%2)%2;default:throw new Error("bad maskPattern:"+d)}},getErrorCorrectPolynomial:function(d){for(var e=new B([1],0),g=0;d>g;g++){e=e.multiply(new B([1,z.gexp(g)],0))}return e},getLengthInBits:function(c,d){if(d>=1&&10>d){switch(c){case v.MODE_NUMBER:return 10;case v.MODE_ALPHA_NUM:return 9;case v.MODE_8BIT_BYTE:return 8;case v.MODE_KANJI:return 8;default:throw new Error("mode:"+c)}}else{if(27>d){switch(c){case v.MODE_NUMBER:return 12;case v.MODE_ALPHA_NUM:return 11;case v.MODE_8BIT_BYTE:return 16;case v.MODE_KANJI:return 10;default:throw new Error("mode:"+c)}}else{if(!(41>d)){throw new Error("type:"+d)}switch(c){case v.MODE_NUMBER:return 14;case v.MODE_ALPHA_NUM:return 13;case v.MODE_8BIT_BYTE:return 16;case v.MODE_KANJI:return 12;default:throw new Error("mode:"+c)}}}},getLostPoint:function(m){for(var n=m.getModuleCount(),o=0,p=0;n>p;p++){for(var q=0;n>q;q++){for(var r=0,s=m.isDark(p,q),M=-1;1>=M;M++){if(!(0>p+M||p+M>=n)){for(var N=-1;1>=N;N++){0>q+N||q+N>=n||(0!=M||0!=N)&&s==m.isDark(p+M,q+N)&&r++}}}r>5&&(o+=3+r-5)}}for(var p=0;n-1>p;p++){for(var q=0;n-1>q;q++){var O=0;m.isDark(p,q)&&O++,m.isDark(p+1,q)&&O++,m.isDark(p,q+1)&&O++,m.isDark(p+1,q+1)&&O++,(0==O||4==O)&&(o+=3)}}for(var p=0;n>p;p++){for(var q=0;n-6>q;q++){m.isDark(p,q)&&!m.isDark(p,q+1)&&m.isDark(p,q+2)&&m.isDark(p,q+3)&&m.isDark(p,q+4)&&!m.isDark(p,q+5)&&m.isDark(p,q+6)&&(o+=40)}}for(var q=0;n>q;q++){for(var p=0;n-6>p;p++){m.isDark(p,q)&&!m.isDark(p+1,q)&&m.isDark(p+2,q)&&m.isDark(p+3,q)&&m.isDark(p+4,q)&&!m.isDark(p+5,q)&&m.isDark(p+6,q)&&(o+=40)}}for(var P=0,q=0;n>q;q++){for(var p=0;n>p;p++){m.isDark(p,q)&&P++}}var R=Math.abs(100*P/n/n-50)/5;return o+=10*R}},z={glog:function(b){if(1>b){throw new Error("glog("+b+")")}return z.LOG_TABLE[b]},gexp:function(b){for(;0>b;){b+=255}for(;b>=256;){b-=255}return z.EXP_TABLE[b]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},A=0;8>A;A++){z.EXP_TABLE[A]=1<<A}for(var A=8;256>A;A++){z.EXP_TABLE[A]=z.EXP_TABLE[A-4]^z.EXP_TABLE[A-5]^z.EXP_TABLE[A-6]^z.EXP_TABLE[A-8]}for(var A=0;255>A;A++){z.LOG_TABLE[z.EXP_TABLE[A]]=A}B.prototype={get:function(b){return this.num[b]},getLength:function(){return this.num.length},multiply:function(e){for(var g=new Array(this.getLength()+e.getLength()-1),h=0;h<this.getLength();h++){for(var j=0;j<e.getLength();j++){g[h+j]^=z.gexp(z.glog(this.get(h))+z.glog(e.get(j)))}}return new B(g,0)},mod:function(e){if(this.getLength()-e.getLength()<0){return this}for(var g=z.glog(this.get(0))-z.glog(e.get(0)),h=new Array(this.getLength()),j=0;j<this.getLength();j++){h[j]=this.get(j)}for(var j=0;j<e.getLength();j++){h[j]^=z.gexp(z.glog(e.get(j))+g)}return new B(h,0).mod(e)}},C.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],C.getRSBlocks=function(j,l){var m=C.getRsBlockTable(j,l);if(void 0==m){throw new Error("bad rs block @ typeNumber:"+j+"/errorCorrectLevel:"+l)}for(var n=m.length/3,o=[],p=0;n>p;p++){for(var q=m[3*p+0],r=m[3*p+1],s=m[3*p+2],M=0;q>M;M++){o.push(new C(r,s))}}return o},C.getRsBlockTable=function(c,d){switch(d){case w.L:return C.RS_BLOCK_TABLE[4*(c-1)+0];case w.M:return C.RS_BLOCK_TABLE[4*(c-1)+1];case w.Q:return C.RS_BLOCK_TABLE[4*(c-1)+2];case w.H:return C.RS_BLOCK_TABLE[4*(c-1)+3];default:return void 0}},D.prototype={get:function(c){var d=Math.floor(c/8);return 1==(1&this.buffer[d]>>>7-c%8)},put:function(d,e){for(var g=0;e>g;g++){this.putBit(1==(1&d>>>e-g-1))}},getLengthInBits:function(){return this.length},putBit:function(c){var d=Math.floor(this.length/8);this.buffer.length<=d&&this.buffer.push(0),c&&(this.buffer[d]|=128>>>this.length%8),this.length++}};var E=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],H=function(){var b=function(c,d){this._el=c,this._htOption=d};return b.prototype.draw=function(e){function o(g,h){var j=document.createElementNS("http://www.w3.org/2000/svg",g);for(var k in h){h.hasOwnProperty(k)&&j.setAttribute(k,h[k])}return j}var l=this._htOption,m=this._el,n=e.getModuleCount();Math.floor(l.width/n),Math.floor(l.height/n),this.clear();var p=o("svg",{viewBox:"0 0 "+String(n)+" "+String(n),width:"100%",height:"100%",fill:l.colorLight});p.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),m.appendChild(p),p.appendChild(o("rect",{fill:l.colorDark,width:"1",height:"1",id:"template"}));for(var q=0;n>q;q++){for(var r=0;n>r;r++){if(e.isDark(q,r)){var s=o("use",{x:String(q),y:String(r)});s.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),p.appendChild(s)}}}},b.prototype.clear=function(){for(;this._el.hasChildNodes();){this._el.removeChild(this._el.lastChild)}},b}(),I="svg"===document.documentElement.tagName.toLowerCase(),J=I?H:F()?function(){function g(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function k(m,n){var o=this;if(o._fFail=n,o._fSuccess=m,null===o._bSupportDataURI){var p=document.createElement("img"),q=function(){o._bSupportDataURI=!1,o._fFail&&_fFail.call(o)},r=function(){o._bSupportDataURI=!0,o._fSuccess&&o._fSuccess.call(o)};return p.onabort=q,p.onerror=q,p.onload=r,p.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}o._bSupportDataURI===!0&&o._fSuccess?o._fSuccess.call(o):o._bSupportDataURI===!1&&o._fFail&&o._fFail.call(o)}if(this._android&&this._android<=2.1){var h=1/window.devicePixelRatio,j=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(b,c,m,n,o,p,q,r){if("nodeName" in b&&/img/i.test(b.nodeName)){for(var s=arguments.length-1;s>=1;s--){arguments[s]=arguments[s]*h}}else{"undefined"==typeof r&&(arguments[1]*=h,arguments[2]*=h,arguments[3]*=h,arguments[4]*=h)}j.apply(this,arguments)}}var l=function(c,d){this._bIsPainted=!1,this._android=G(),this._htOption=d,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=d.width,this._elCanvas.height=d.height,c.appendChild(this._elCanvas),this._el=c,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return l.prototype.draw=function(o){var p=this._elImage,q=this._oContext,r=this._htOption,s=o.getModuleCount(),M=r.width/s,N=r.height/s,O=Math.round(M),P=Math.round(N);p.style.display="none",this.clear();for(var R=0;s>R;R++){for(var S=0;s>S;S++){var T=o.isDark(R,S),U=S*M,V=R*N;q.strokeStyle=T?r.colorDark:r.colorLight,q.lineWidth=1,q.fillStyle=T?r.colorDark:r.colorLight,q.fillRect(U,V,M,N),q.strokeRect(Math.floor(U)+0.5,Math.floor(V)+0.5,O,P),q.strokeRect(Math.ceil(U)-0.5,Math.ceil(V)-0.5,O,P)}}this._bIsPainted=!0},l.prototype.makeImage=function(){this._bIsPainted&&k.call(this,g)},l.prototype.isPainted=function(){return this._bIsPainted},l.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},l.prototype.round=function(b){return b?Math.floor(1000*b)/1000:b},l}():function(){var b=function(c,d){this._el=c,this._htOption=d};return b.prototype.draw=function(m){for(var n=this._htOption,o=this._el,p=m.getModuleCount(),q=Math.floor(n.width/p),r=Math.floor(n.height/p),s=['<table style="border:0;border-collapse:collapse;">'],M=0;p>M;M++){s.push("<tr>");for(var N=0;p>N;N++){s.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'+q+"px;height:"+r+"px;background-color:"+(m.isDark(M,N)?n.colorDark:n.colorLight)+';"></td>')}s.push("</tr>")}s.push("</table>"),o.innerHTML=s.join("");var O=o.childNodes[0],P=(n.width-O.offsetWidth)/2,R=(n.height-O.offsetHeight)/2;P>0&&R>0&&(O.style.margin=R+"px "+P+"px")},b.prototype.clear=function(){this._el.innerHTML=""},b}();QRCode=function(d,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:w.H},"string"==typeof e&&(e={text:e}),e){for(var g in e){this._htOption[g]=e[g]}}"string"==typeof d&&(d=document.getElementById(d)),this._android=G(),this._el=d,this._oQRCode=null,this._oDrawing=new J(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(b){this._oQRCode=new u(K(b,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(b),this._oQRCode.make(),this._el.title=b,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=w}();"use strict";if(!window.u2f){var u2f=u2f||{};var js_api_version;u2f.EXTENSION_ID="kmendfapggjehodndflmmgagdbamhnfd";u2f.MessageTypes={U2F_REGISTER_REQUEST:"u2f_register_request",U2F_REGISTER_RESPONSE:"u2f_register_response",U2F_SIGN_REQUEST:"u2f_sign_request",U2F_SIGN_RESPONSE:"u2f_sign_response",U2F_GET_API_VERSION_REQUEST:"u2f_get_api_version_request",U2F_GET_API_VERSION_RESPONSE:"u2f_get_api_version_response"};u2f.ErrorCodes={OK:0,OTHER_ERROR:1,BAD_REQUEST:2,CONFIGURATION_UNSUPPORTED:3,DEVICE_INELIGIBLE:4,TIMEOUT:5};u2f.U2fRequest;u2f.U2fResponse;u2f.Error;u2f.Transport;u2f.Transports;u2f.SignRequest;u2f.SignResponse;u2f.RegisterRequest;u2f.RegisterResponse;u2f.RegisteredKey;u2f.GetJsApiVersionResponse;u2f.getMessagePort=function(a){if(typeof chrome!="undefined"&&chrome.runtime){var b={type:u2f.MessageTypes.U2F_SIGN_REQUEST,signRequests:[]};chrome.runtime.sendMessage(u2f.EXTENSION_ID,b,function(){if(!chrome.runtime.lastError){u2f.getChromeRuntimePort_(a)}else{u2f.getIframePort_(a)}})}else{if(u2f.isAndroidChrome_()){u2f.getAuthenticatorPort_(a)}else{if(u2f.isIosChrome_()){u2f.getIosPort_(a)}else{u2f.getIframePort_(a)}}}};u2f.isAndroidChrome_=function(){var a=navigator.userAgent;return a.indexOf("Chrome")!=-1&&a.indexOf("Android")!=-1};u2f.isIosChrome_=function(){var b=["iPhone","iPad","iPod"];for(var a in b){if(navigator.platform==b[a]){return true}}return false};u2f.getChromeRuntimePort_=function(a){var b=chrome.runtime.connect(u2f.EXTENSION_ID,{includeTlsChannelId:true});setTimeout(function(){a(new u2f.WrappedChromeRuntimePort_(b))},0)};u2f.getAuthenticatorPort_=function(a){setTimeout(function(){a(new u2f.WrappedAuthenticatorPort_())},0)};u2f.getIosPort_=function(a){setTimeout(function(){a(new u2f.WrappedIosPort_())},0)};u2f.WrappedChromeRuntimePort_=function(a){this.port_=a};u2f.formatSignRequest_=function(a,b,d,h,e){if(js_api_version===undefined||js_api_version<1.1){var g=[];for(var c=0;c<d.length;c++){g[c]={version:d[c].version,challenge:b,keyHandle:d[c].keyHandle,appId:a}}return{type:u2f.MessageTypes.U2F_SIGN_REQUEST,signRequests:g,timeoutSeconds:h,requestId:e}}return{type:u2f.MessageTypes.U2F_SIGN_REQUEST,appId:a,challenge:b,registeredKeys:d,timeoutSeconds:h,requestId:e}};u2f.formatRegisterRequest_=function(a,c,d,h,e){if(js_api_version===undefined||js_api_version<1.1){for(var b=0;b<d.length;b++){d[b].appId=a}var g=[];for(var b=0;b<c.length;b++){g[b]={version:c[b].version,challenge:d[0],keyHandle:c[b].keyHandle,appId:a}}return{type:u2f.MessageTypes.U2F_REGISTER_REQUEST,signRequests:g,registerRequests:d,timeoutSeconds:h,requestId:e}}return{type:u2f.MessageTypes.U2F_REGISTER_REQUEST,appId:a,registerRequests:d,registeredKeys:c,timeoutSeconds:h,requestId:e}};u2f.WrappedChromeRuntimePort_.prototype.postMessage=function(a){this.port_.postMessage(a)};u2f.WrappedChromeRuntimePort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c=="message"||c=="onmessage"){this.port_.onMessage.addListener(function(d){b({data:d})})}else{console.error("WrappedChromeRuntimePort only supports onMessage")}};u2f.WrappedAuthenticatorPort_=function(){this.requestId_=-1;this.requestObject_=null};u2f.WrappedAuthenticatorPort_.prototype.postMessage=function(b){var a=u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_+";S.request="+encodeURIComponent(JSON.stringify(b))+";end";document.location=a};u2f.WrappedAuthenticatorPort_.prototype.getPortType=function(){return"WrappedAuthenticatorPort_"};u2f.WrappedAuthenticatorPort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c=="message"){var d=this;window.addEventListener("message",d.onRequestUpdate_.bind(d,b),false)}else{console.error("WrappedAuthenticatorPort only supports message")}};u2f.WrappedAuthenticatorPort_.prototype.onRequestUpdate_=function(a,d){var e=JSON.parse(d.data);var c=e.intentURL;var b=e.errorCode;var g=null;if(e.hasOwnProperty("data")){g=(JSON.parse(e.data))}a({data:g})};u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_="intent:#Intent;action=com.google.android.apps.authenticator.AUTHENTICATE";u2f.WrappedIosPort_=function(){};u2f.WrappedIosPort_.prototype.postMessage=function(a){var b=JSON.stringify(a);var c="u2f://auth?"+encodeURI(b);location.replace(c)};u2f.WrappedIosPort_.prototype.getPortType=function(){return"WrappedIosPort_"};u2f.WrappedIosPort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c!=="message"){console.error("WrappedIosPort only supports message")}};u2f.getIframePort_=function(a){var d="chrome-extension://"+u2f.EXTENSION_ID;var c=document.createElement("iframe");c.src=d+"/u2f-comms.html";c.setAttribute("style","display:none");document.body.appendChild(c);var b=new MessageChannel();var e=function(g){if(g.data=="ready"){b.port1.removeEventListener("message",e);a(b.port1)}else{console.error('First event on iframe port was not "ready"')}};b.port1.addEventListener("message",e);b.port1.start();c.addEventListener("load",function(){c.contentWindow.postMessage("init",d,[b.port2])})};u2f.EXTENSION_TIMEOUT_SEC=30;u2f.port_=null;u2f.waitingForPort_=[];u2f.reqCounter_=0;u2f.callbackMap_={};u2f.getPortSingleton_=function(a){if(u2f.port_){a(u2f.port_)}else{if(u2f.waitingForPort_.length==0){u2f.getMessagePort(function(b){u2f.port_=b;u2f.port_.addEventListener("message",(u2f.responseHandler_));while(u2f.waitingForPort_.length){u2f.waitingForPort_.shift()(u2f.port_)}})}u2f.waitingForPort_.push(a)}};u2f.responseHandler_=function(b){var d=b.data;var c=d.requestId;if(!c||!u2f.callbackMap_[c]){console.error("Unknown or missing requestId in response.");return}var a=u2f.callbackMap_[c];delete u2f.callbackMap_[c];a(d.responseData)};u2f.sign=function(a,c,e,b,d){if(js_api_version===undefined){u2f.getApiVersion(function(g){js_api_version=g.js_api_version===undefined?0:g.js_api_version;u2f.sendSignRequest(a,c,e,b,d)})}else{u2f.sendSignRequest(a,c,e,b,d)}};u2f.sendSignRequest=function(a,c,e,b,d){u2f.getPortSingleton_(function(g){var j=++u2f.reqCounter_;u2f.callbackMap_[j]=b;var k=(typeof d!=="undefined"?d:u2f.EXTENSION_TIMEOUT_SEC);var h=u2f.formatSignRequest_(a,c,e,k,j);g.postMessage(h)})};u2f.register=function(a,e,d,b,c){if(js_api_version===undefined){u2f.getApiVersion(function(g){js_api_version=g.js_api_version===undefined?0:g.js_api_version;u2f.sendRegisterRequest(a,e,d,b,c)})}else{u2f.sendRegisterRequest(a,e,d,b,c)}};u2f.sendRegisterRequest=function(a,e,d,b,c){u2f.getPortSingleton_(function(g){var j=++u2f.reqCounter_;u2f.callbackMap_[j]=b;var k=(typeof c!=="undefined"?c:u2f.EXTENSION_TIMEOUT_SEC);var h=u2f.formatRegisterRequest_(a,d,e,k,j);g.postMessage(h)})};u2f.getApiVersion=function(a,b){u2f.getPortSingleton_(function(d){if(d.getPortType){var c;switch(d.getPortType()){case"WrappedIosPort_":case"WrappedAuthenticatorPort_":c=1.1;break;default:c=0;break}a({js_api_version:c});return}var g=++u2f.reqCounter_;u2f.callbackMap_[g]=a;var e={type:u2f.MessageTypes.U2F_GET_API_VERSION_REQUEST,timeoutSeconds:(typeof b!=="undefined"?b:u2f.EXTENSION_TIMEOUT_SEC),requestId:g};d.postMessage(e)})}}"use strict";var args;var autoReconnect=true;var powerStatetable=["","Powered","Sleep","Sleep","Sleep","Hibernating","Power off","Present"];var StatusStrs=["Disconnected","Connecting...","Setup...","Connected","Intel&reg; AMT Connected"];var sort=0;var searchFocus=0;var mapSearchFocus=0;var userSearchFocus=0;var consoleFocus=0;var showRealNames=false;var meshserver=null;var meshes={};var meshcount=0;var nodes=null;var filetree={};var userinfo=null;var serverinfo=null;var events=[];var users=null;var wssessions=null;var nodeShortIdent=0;var desktop;var desktopsettings={encoding:2,showfocus:false,showmouse:true,showcad:true,quality:40,scaling:1024,framerate:50,localkeymap:false};var multidesktopsettings={quality:20,scaling:128,framerate:1000};var terminal;var files;var debugLevel=parseInt("{{{debuglevel}}}");var features=parseInt("{{{features}}}");var sessionTime=parseInt("{{{sessiontime}}}");var domain="{{{domain}}}";var domainUrl="{{{domainurl}}}";var authCookie="{{{authCookie}}}";var authCookieRenewTimer=null;var multiDesktop={};var multiDesktopFilter=null;var serverPublicNamePort="{{{serverDnsName}}}:{{{serverPublicPort}}}";var amtScanResults=null;var debugmode=0;var clickOnce=(((features&256)!=0)&&detectClickOnce());var attemptWebRTC=((features&128)!=0);var webPageFullScreen=getstore("webPageFullScreen",true);if(webPageFullScreen=="false"){webPageFullScreen=false}if(webPageFullScreen=="true"){webPageFullScreen=true}var passRequirements="{{{passRequirements}}}";if(passRequirements!=""){passRequirements=JSON.parse(decodeURIComponent(passRequirements))}function startup(){if((features&32)==0){var h=null;try{h=top.location.toString().toLowerCase()}catch(b){}if(top!=self&&(h==null||top.active==false)){top.location=self.location;return}}args=parseUriArgs();debugmode=args.debug;if(args.webrtc!=null){attemptWebRTC=(args.webrtc==1)}QV("p13AutoConnect",debugmode);QV("autoconnectbutton2",debugmode);QV("autoconnectbutton1",debugmode);toggleFullScreen();if(args.hide){var d=parseInt(args.hide);QV("masthead",!(d&1));QV("topbarmaster",!(d&2));QV("footer",!(d&4));QV("p10title",!(d&8));QV("p11title",!(d&8));QV("p12title",!(d&8));QV("p13title",!(d&8));QV("p14title",!(d&8));QV("p15title",!(d&8));QV("p16title",!(d&8));if(d&16){QV("page_leftbar",false);QS("page_content").left="0px"}}if("{{currentNode}}"!=""){QV("p10BackButton",false);QV("p11BackButton",false);QV("p12BackButton",false);QV("p13BackButton",false);QV("p14BackButton",false);QV("p15BackButton",false);QV("p16BackButton",false)}p1updateInfo();document.onclick=function(c){hideContextMenu()};document.onkeypress=ondockeypress;document.onkeydown=ondockeydown;document.onkeyup=ondockeyup;window.onresize=function(){masterUpdate(512)};masterUpdate(512);meshserver=MeshServerCreateControl(domainUrl,authCookie);meshserver.onStateChanged=onStateChanged;meshserver.onMessage=onMessage;meshserver.Start();Q("sortselect").selectedIndex=sort=getstore("sort",0);Q("sizeselect").selectedIndex=getstore("viewsize",1);Q("SearchInput").value=getstore("search","");showRealNames=(getstore("showRealNames",0)==1);Q("RealNameCheckBox").checked=showRealNames;Q("viewselect").value=getstore("deviceView",1);Q("DeskControl").checked=(getstore("DeskControl",1)==1);masterUpdate(3);for(var g=1;g<5;g++){Q("devViewButton"+g).classList.remove("viewSelectorSel")}Q("devViewButton"+Q("viewselect").value).classList.add("viewSelectorSel");Q("p5filetable").addEventListener("drop",p5fileDragDrop,false);Q("p5filetable").addEventListener("dragover",p5fileDragOver,false);Q("p5filetable").addEventListener("dragleave",p5fileDragLeave,false);Q("p13filetable").addEventListener("drop",p13fileDragDrop,false);Q("p13filetable").addEventListener("dragover",p13fileDragOver,false);Q("p13filetable").addEventListener("dragleave",p13fileDragLeave,false);setInterval(updateDeviceTimeline,120000);var k=localStorage.getItem("desktopsettings");if(k!=null){desktopsettings=JSON.parse(k)}k=localStorage.getItem("multidesktopsettings");if(k!=null){multidesktopsettings=JSON.parse(k)}applyDesktopSettings();var l="";for(var a=1;a<27;a++){l+="<option value='"+a+"'>Ctrl-"+String.fromCharCode(64+a)+" ("+a+")</option>"}QH("specialkeylist",l);setupServerStats()}function toggleFullScreen(b){if(b===1){webPageFullScreen=!webPageFullScreen;putstore("webPageFullScreen",webPageFullScreen)}var a=0;if(args.hide){a=parseInt(args.hide)}if(webPageFullScreen==false){QS("container").width="960px";QS("container")["border-right"]="1px solid #b7b7b7";QS("container")["border-left"]="1px solid #b7b7b7";QS("container")["min-width"]="960px";QS("container")["overflow"]="";QS("column_l").width="930px";QS("column_l").height="";QS("column_l")["margin-left"]="";QS("column_l")["overflow-y"]="";QS("column_l")["max-height"]=(xxcurrentView>=10)?"calc(100vh - 159px)":"calc(100vh - 135px)";QS("container").position="";QS("page_content").position="";QV("MainMenuSpan",true);QV("UserDummyMenuSpan",false);QV("page_leftbar",false)}else{QS("container").position="absolute";QS("container").width="100%";QS("container").top="0px";QS("container").bottom="0px";QS("container")["border-right"]="0";QS("container")["border-left"]="0";QS("container")["min-width"]="700px";QS("container")["overflow"]="hidden";QS("page_content").position="absolute";QS("page_content").top="66px";QS("page_content").left=(a&16)?"0px":"90px";QS("page_content").right="0px";QS("page_content").bottom="0px";QS("column_l").height="calc(100vh - 135px)";QS("column_l").width="calc(100% - 30px)";QS("column_l")["overflow-y"]="auto";QS("column_l")["max-height"]="calc(100vh - 135px)";QV("MainMenuSpan",false);QV("UserDummyMenuSpan",(xxcurrentView<10)&&webPageFullScreen);QV("page_leftbar",!(a&16))}masterUpdate(512);QV("body",true)}function getNodeFromId(b){if(nodes!=null){for(var a in nodes){if(nodes[a]._id==b){return nodes[a]}}}return null}function reload(){window.location.href=window.location.href}function onStateChanged(c,d,b,a){if(d==0){setDialogMode(0);go(0);powerTimeline=null;powerTimelineReq=null;powerTimelineNode=null;powerTimelineUpdate=null;deleteAllNotifications();hideContextMenu();QV("verifyEmailId2",false);QV("logoutControl",false);if(a=="noauth"){QH("p0span","Unable to perform authentication");return}if(b==2){if(autoReconnect){setTimeout(serverPoll,5000)}}else{QH("p0span","Unable to connect web socket")}if(authCookieRenewTimer!=null){clearInterval(authCookieRenewTimer);authCookieRenewTimer=null}}else{if(d==2){meshserver.send({action:"meshes"});meshserver.send({action:"nodes",id:"{{currentNode}}"});if("{{currentNode}}"==""){meshserver.send({action:"files"})}go(1);authCookieRenewTimer=setInterval(function(){meshserver.send({action:"authcookie"})},1800000)}}}function serverPoll(){var b=null;try{b=new XDomainRequest()}catch(a){}if(!b){b=new XMLHttpRequest()}b.open("HEAD",window.location.href);b.timeout=15000;b.onload=function(){reload()};b.onerror=b.ontimeout=function(){setTimeout(serverPoll,10000)};b.send()}function detectClickOnce(){for(var a in window.navigator.mimeTypes){if(window.navigator.mimeTypes[a].type=="application/x-ms-application"){return true}}var b=window.navigator.userAgent.toUpperCase();return(b.indexOf(".NET CLR 3.5")>=0)||(b.indexOf("(WINDOWS NT ")>=0)}function updateSiteAdmin(){var a="{{{noServerBackup}}}";var b=userinfo.siteadmin;if(a==1){b&=4294967290}QV("p2AccountSecurity",((features&4)==0)&&(serverinfo.domainauth==false)&&((features&4096)!=0));QV("p2AccountActions",((features&4)==0)&&(serverinfo.domainauth==false));QV("p2AccountImage",((features&4)==0)&&(serverinfo.domainauth==false));QV("p2ServerActions",b&21);QV("LeftMenuMyServer",b&21);QV("MainMenuMyServer",b&21);QV("p2ServerActionsBackup",b&1);QV("p2ServerActionsRestore",b&4);QV("p2ServerActionsVersion",b&16);QV("MainMenuMyFiles",b&8);QV("LeftMenuMyFiles",b&8);if(((b&8)==0)&&(xxcurrentView==5)){setDialogMode(0);go(1)}if(currentNode!=null){gotoDevice(currentNode._id,xxcurrentView,true)}if((userinfo.siteadmin&2)!=0){if(users==null){meshserver.send({action:"users"})}if(wssessions==null){meshserver.send({action:"wssessioncount"})}}else{users=null;wssessions=null;updateUsers();if(xxcurrentView==4||((xxcurrentView>=30)&&(xxcurrentView<40))){setDialogMode(0);go(1);currentUser=null}}meshserver.send({action:"events",limit:parseInt(p3limitdropdown.value)});QV("p2deleteall",userinfo.siteadmin==4294967295);QV("ServerConsole",userinfo.siteadmin===4294967295);if((xxcurrentView==115)&&(userinfo.siteadmin!=4294967295)){go(6)}if((xxcurrentView==6)&&((userinfo.siteadmin&21)==0)){go(1)}if((b&21)!=0){meshserver.send({action:"serverstats",interval:10000})}}var updateNaggleTimer=null;var updateNaggleFlags=0;function masterUpdate(a){updateNaggleFlags|=a;if(updateNaggleTimer==null){updateNaggleTimer=setTimeout(function(){if(updateNaggleFlags&512){center()}if(updateNaggleFlags&1){onSearchInputChanged()}if(updateNaggleFlags&2){onSortSelectChange(true)}if(updateNaggleFlags&128){updateMeshes()}if(updateNaggleFlags&4){updateDevices()}if(updateNaggleFlags&8){drawNotifications()}if(updateNaggleFlags&16){updateMapMarkers()}if(updateNaggleFlags&32){eventsUpdate()}if(updateNaggleFlags&64){refreshMap(false,true)}if(updateNaggleFlags&256){drawDeviceTimeline()}if(updateNaggleFlags&1024){deviceEventsUpdate()}if(updateNaggleFlags&2048){userEventsUpdate()}updateNaggleTimer=null;updateNaggleFlags=0},150)}}function updateSelf(){QV("verifyEmailId",(userinfo.emailVerified!==true)&&(userinfo.email!=null)&&(serverinfo.emailcheck==true));QV("verifyEmailId2",(userinfo.emailVerified!==true)&&(userinfo.email!=null)&&(serverinfo.emailcheck==true));QV("manageOtp",(userinfo.otpsecret==1)||(userinfo.otphkeys>0));QV("authAppSetupCheck",userinfo.otpsecret==1);QV("authKeySetupCheck",userinfo.otphkeys>0);QV("authCodesSetupCheck",userinfo.otpkeys>0);if(typeof userinfo.passchange=="number"){if(userinfo.passchange==-1){QH("p2nextPasswordUpdateTime"," - Reset on next login.")}else{if((passRequirements!=null)&&(typeof passRequirements.reset=="number")){var a=(userinfo.passchange)+(passRequirements.reset*86400)-Math.floor(Date.now()/1000);if(a<0){QH("p2nextPasswordUpdateTime"," - Reset on next login.")}else{if(a<3600){QH("p2nextPasswordUpdateTime"," - Reset in "+Math.floor(a/60)+" minute"+addLetterS(Math.floor(a/60))+".")}else{if(a<86400){QH("p2nextPasswordUpdateTime"," - Reset in "+Math.floor(a/3600)+" hour"+addLetterS(Math.floor(a/3600))+".")}else{QH("p2nextPasswordUpdateTime"," - Reset in "+Math.floor(a/86400)+" day"+addLetterS(Math.floor(a/86400))+".")}}}}}}}function addLetterS(a){return(a>1)?"s":""}function onMessage(D,l){switch(l.action){case"serverstats":updateServerStats(l);break;case"authcookie":authCookie=l.cookie;break;case"serverinfo":serverinfo=l.serverinfo;break;case"userinfo":userinfo=l.userinfo;updateSiteAdmin();updateSelf();break;case"users":users={};for(var k in l.users){users[l.users[k]._id]=l.users[k]}updateUsers();break;case"wssessioncount":wssessions=l.wssessions;updateUsers();break;case"meshes":meshes={};for(var k in l.meshes){meshes[l.meshes[k]._id]=l.meshes[k]}masterUpdate(4+128);break;case"files":filetree=setupBackPointers(l.filetree);updateFiles();d3updatefiles();break;case"nodes":nodes=[];for(var k in l.nodes){if(!meshes[k]){console.log("Invalid mesh (1): "+k);continue}for(var o in l.nodes[k]){if(l.nodes[k][o]._id==null){console.log("Invalid node ("+o+"): "+JSON.stringify(l.nodes));continue}l.nodes[k][o].namel=l.nodes[k][o].name.toLowerCase();if(l.nodes[k][o].rname){l.nodes[k][o].rnamel=l.nodes[k][o].rname.toLowerCase()}else{l.nodes[k][o].rnamel=l.nodes[k][o].namel}l.nodes[k][o].meshnamel=meshes[k].name.toLowerCase();l.nodes[k][o].meshid=k;l.nodes[k][o].state=(l.nodes[k][o].state)?(l.nodes[k][o].state):0;l.nodes[k][o].desc=l.nodes[k][o].desc;l.nodes[k][o].ip=l.nodes[k][o].ip;if(!l.nodes[k][o].icon){l.nodes[k][o].icon=1}l.nodes[k][o].ident=++nodeShortIdent;nodes.push(l.nodes[k][o])}}masterUpdate(1|2|4|64);if(xxcurrentView==0){if("{{viewmode}}"!=""){go(parseInt("{{viewmode}}"))}else{setDialogMode(0);go(1)}}if("{{currentNode}}"!=""){gotoDevice("{{currentNode}}",parseInt("{{viewmode}}"))}break;case"powertimeline":if(l.nodeid!=powerTimelineReq){break}powerTimelineNode=l.nodeid;powerTimeline=l.timeline;powerTimelineUpdate=Date.now()+300000;if(currentNode._id==l.nodeid){masterUpdate(256)}break;case"lastconnect":var v=getNodeFromId(l.nodeid);if(v!=null){v.lastconnect=l.time;v.lastaddr=l.addr;if((currentNode._id==v._id)&&(Q("MainComputerState").innerHTML=="")){QH("MainComputerState","<span style=font-size:12px>Last seen:<br />"+new Date(v.lastconnect).toLocaleDateString()+", "+new Date(v.lastconnect).toLocaleTimeString()+"</span>")}}break;case"msg":if(l.nodeid!=null){var e=-1;if(nodes!=null){for(var d in nodes){if(nodes[d]._id==l.nodeid){e=d;break}}}if(e!=-1){if(l.type=="console"){p15consoleReceive(nodes[e],l.value)}else{if(l.type=="notify"){var o={text:l.value};if(l.nodeid!=null){o.nodeid=l.nodeid}if(l.tag!=null){o.tag=l.tag}if(l.username!=null){o.username=l.username}addNotification(o)}else{if(l.type=="ps"){showDeskToolsProcesses(l)}else{if((l.type=="getclip")&&(xxdialogTag=="clipboard")&&(currentNode!=null)&&(currentNode._id==l.nodeid)){Q("d2clipText").value=l.data}else{if((l.type=="setclip")&&(xxdialogTag=="clipboard")&&(currentNode!=null)&&(currentNode._id==l.nodeid)){QH("dlgClipStatus",l.success?"<span style=color:green>Success</span>":"<span style=color:red>Failed</span>");setTimeout(function(){try{QH("dlgClipStatus","")}catch(j){}},2000)}}}}}}}else{if(l.type=="notify"){var o={text:l.value};if(l.tag!=null){o.tag=l.tag}if(l.username!=null){o.username=l.username}addNotification(o)}}break;case"getnetworkinfo":if((currentNode._id==l.nodeid)&&(xxdialogMode==2)&&(xxdialogTag=="if"+l.nodeid)){if(l.netif==null){QH("d2netinfo","No network interface information available for this device.")}else{var I="<div style=width:100%;max-height:260px;overflow-x:hidden;overflow-y:auto;line-height:160%>";if(currentNode.lastconnect){I+=addHtmlValue2("Last agent connection",new Date(currentNode.lastconnect).toLocaleString())}if(currentNode.lastaddr){if(isPrivateIP(currentNode.lastaddr)){I+=addHtmlValue2("Last agent address",currentNode.lastaddr.split(":")[0])}else{I+=addHtmlValue2("Last agent address",'<a href="https://iplocation.com/?ip='+currentNode.lastaddr.split(":")[0]+'" rel="noreferrer noopener" target="MeshIPLoopup">'+currentNode.lastaddr.split(":")[0]+"</a>")}}I+=addHtmlValue2("Last interfaces update",new Date(l.updateTime).toLocaleString());for(var d in l.netif){var q=l.netif[d];I+="<hr />";if(q.name){I+=addHtmlValue2("Name","<b>"+EscapeHtml(q.name)+"</b>")}if(q.desc){I+=addHtmlValue2("Description",EscapeHtml(q.desc).replace("(R)","&reg;").replace("(r)","&reg;"))}if(q.dnssuffix){I+=addHtmlValue2("DNS suffix",EscapeHtml(q.dnssuffix))}if(q.mac){I+=addHtmlValue2("MAC address",'<a href="https://dnslytics.com/mac-address-lookup/'+q.mac.substring(0,6)+'" rel="noreferrer noopener" target="MeshMACLoopup">'+EscapeHtml(q.mac.toLowerCase())+"</a>")}if(q.v4addr){I+=addHtmlValue2("IPv4 address",EscapeHtml(q.v4addr))}if(q.v4mask){I+=addHtmlValue2("IPv4 mask",EscapeHtml(q.v4mask))}if(q.v4gateway){I+=addHtmlValue2("IPv4 gateway",EscapeHtml(q.v4gateway))}if(q.gatewaymac){I+=addHtmlValue2("Gateway MAC",'<a href="https://dnslytics.com/mac-address-lookup/'+q.gatewaymac.substring(0,6)+'" rel="noreferrer noopener" target="MeshMACLoopup">'+EscapeHtml(q.gatewaymac.toLowerCase())+"</a>")}}I+="</div>";QH("d2netinfo",I)}}break;case"serverversion":if((xxdialogMode==2)&&(xxdialogTag=="MeshCentralServerUpdate")){var I="<div style=width:100%;max-height:260px;overflow-x:hidden;overflow-y:auto;line-height:160%>";if(!l.current){l.current="Unknown"}if(!l.latest){l.latest="Unknown"}I+=addHtmlValue2("Current Version","<b>"+EscapeHtml(l.current)+"</b>");I+=addHtmlValue2("Latest Version","<b>"+EscapeHtml(l.latest)+"</b>");I+="</div>";if((l.latest.indexOf(".")==-1)||(l.current==l.latest)||((features&2048)==0)){setDialogMode(2,"MeshCentral Version",1,null,I)}else{setDialogMode(2,"MeshCentral Version",3,server_showVersionDlgEx,I+"<br /><label><input id=d2updateCheck type=checkbox onclick=server_showVersionDlgUpdate() /> Check and click OK to start server self-update.</label>");server_showVersionDlgUpdate()}}break;case"servererrors":if((xxdialogMode==2)&&(xxdialogTag=="MeshCentralServerErrors")){if(l.data==null){setDialogMode(2,"MeshCentral Server Errors",1,null,"Server has no error log.")}else{var I="<div style=width:100%;max-height:260px;overflow-x:hidden;overflow:auto;line-height:160%;font-size:10px><pre>"+l.data+"<pre></div>";setDialogMode(2,"MeshCentral Server Errors",3,server_showErrorsDlgEx,I+"<br /><label><input id=d2updateCheck type=checkbox onclick=server_showVersionDlgUpdate() /> Check and click OK to clear error log.</label>");server_showVersionDlgUpdate()}}break;case"serverconsole":p15consoleReceive("serverconsole",l.value);break;case"events":if((l.nodeid!=null)&&(l.nodeid==currentNode._id)){currentDeviceEvents=l.events;masterUpdate(1024)}else{if((l.user!=null)&&(l.user==currentUser.name)){currentUserEvents=l.events;masterUpdate(2048)}else{events=l.events;masterUpdate(32)}}break;case"getcookie":if(l.tag=="clickonce"){var a="{{{serverRedirPort}}}"==""?"{{{serverPublicPort}}}":"{{{serverRedirPort}}}";var A="http://"+window.location.hostname+":"+a+"/clickonce/minirouter/MeshMiniRouter.application?WS=wss%3A%2F%2F"+window.location.hostname+"%2Fmeshrelay.ashx%3Fauth="+l.cookie+"&CH={{{webcerthash}}}&AP="+l.protocol+((debugmode==1)?"":"&HOL=1");var u=window.open(A,"_blank");u.opener=null}break;case"getNotes":var o=Q("d2devNotes");if(o&&(l.id==decodeURIComponent(o.attributes.noteid.value))){if(l.notes){QH("d2devNotes",decodeURIComponent(l.notes))}else{QH("d2devNotes","")}var B=o.attributes.ro.value=="true";if(B==false){o.removeAttribute("readonly");QE("idx_dlgOkButton",true);QV("idx_dlgOkButton",true);focusTextBox("d2devNotes")}}break;case"otpauth-request":if((xxdialogMode==2)&&(xxdialogTag=="otpauth-request")){var C=l.secret;if(C.length==52){C=C.split(/(.............)/).filter(Boolean).join(" ")}else{if(C.length==32){C=C.split(/(....)/).filter(Boolean).join(" ");C=C.substring(0,20)+"<br/>"+C.substring(20)}}QH("d2optinfo",'<table style=width:380px><tr><td style=vertical-align:top>Install <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2" rel="noreferrer noopener" target=_blank>Google Authenticator</a> or a compatible application and scan the barcode, use <a href="'+l.url+'" rel="noreferrer noopener" target=_blank> this link</a> or enter the secret. Then, enter the current 6 digit token below to activate 2-Step login.<br /><br />Secret<br /><tt id=d2optsecret secret="'+l.secret+'" style=font-size:12px>'+C+'</tt><br /><br /></td><td style=width:1px;vertical-align:top><a href="'+l.url+'" rel="noreferrer noopener" target=_blank><div id="qrcode"></div></a></td><tr><td colspan=2 style="text-align:center;border-top:1px solid black"><br />Enter the token here for 2-step login: <input type=text onkeypress="return (event.keyCode == 8) || (event.charCode >= 48 && event.charCode <= 57)" onkeyup=account_addOtpCheck(event) onkeydown=account_addOtpCheck() maxlength=6 id=d2otpauthinput type=text></td></table>');new QRCode(Q("qrcode"),{text:l.url,width:128,height:128,colorDark:"#000000",colorLight:"#EEE",correctLevel:QRCode.CorrectLevel.H});QV("idx_dlgOkButton",true);QE("idx_dlgOkButton",false);Q("d2otpauthinput").focus()}break;case"otpauth-setup":if(xxdialogMode){return}setDialogMode(2,"Authenticator App",1,null,l.success?"<b style=color:green>Authenticator app activation successful</b>. You will now need a valid token to login again.":"<b style=color:red>2-step login activation failed</b>. Clear the secret from the application and try again. You only have a few minutes to enter the proper code.");break;case"otpauth-clear":if(xxdialogMode){return}setDialogMode(2,"Authenticator App",1,null,l.success?"<b>Authenticator application removed</b>. You can reactivate this feature at any time.":"<b style=color:red>2-step login activation removal failed</b>. Try again.");break;case"otpauth-getpasswords":if(xxdialogMode){return}var I="One time tokens can be used as secondary authentication. Generate a set, print them and keep them in a safe place.";I+="<div style='border-radius:6px;border: 2px dashed #888;width:100%;margin-top:8px'><div style='padding:8px;font-family:Arial, Helvetica, sans-serif;font-size:20px;font-weight:bold'><table style=width:100%;text-align:center>";if(l.passwords){var g=0;for(var d in l.passwords){if(++g%2){I+="<tr>"}var y=""+l.passwords[d].p;while(y.length<8){y="0"+y}if(l.passwords[d].u===true){I+="<td>"+y.substring(0,4)+"&nbsp;"+y.substring(4)}else{I+="<td><strike style=color:#BBB>"+y.substring(0,4)+"&nbsp;"+y.substring(4);+"</strike>"}}}else{I+="<tr><td>No Active Tokens"}I+="</table></div></div><br />";I+="<div><input type=button value='Close' onclick=setDialogMode(0) style=float:right></input>";I+="<input type=button value='Generate New Tokens' onclick='account_manageOtp(1);'></input>";if(l.passwords!=null){I+="<input type=button value='Clear Tokens' onclick='account_manageOtp(2);'></input>"}I+="</div><br />";setDialogMode(2,"Manage Backup Codes",8,null,I,"otpauth-manage");break;case"otp-hkey-get":if(xxdialogMode&&(xxdialogTag!="otpauth-hardware-manage")){return}var F="<div style='border-radius:6px;border:2px solid #CCC;background-color:#BBB;width:100%;box-sizing:border-box;margin-bottom:6px'><div style='margin:3px;font-family:Arial, Helvetica, sans-serif;font-size:16px;font-weight:bold'><table style=width:100%;text-align:left>";var b="</table></div></div>";var I="<a href='https://www.yubico.com/' rel='noreferrer noopener' target='_blank'>Hardware keys</a> are used as secondary login authentication.";I+="<div style='max-height:150px;overflow-y:auto;overflow-x:hidden;margin-top:6px;margin-bottom:6px'>";if(l.keys&&l.keys.length>0){for(var d in l.keys){var h=l.keys[d],H=(h.type==1)?"U2F":"OTP";I+=F+'<tr style=margin:5px><td style=width:30px><img width=24 height=18 src="images/hardware-key-'+H+'-24.png" style=margin-top:4px><td style=width:250px>'+h.name+"<td><input type=button value='Remove' onclick=account_removehkey("+h.i+")></input>"+b}}else{I+=F+"<tr style=text-align:center><td>No Keys Configured"+b}I+="</div>";I+="<div><input type=button value='Close' onclick=setDialogMode(0) style=float:right></input>";I+="<input id=d2addkey1 type=button value='Add U2F Key' onclick='account_addhkey(1);'></input>";if((features&16384)!=0){I+="<input id=d2addkey2 type=button value='Add OTP Key' onclick='account_addhkey(2);'></input>"}I+="</div><br />";setDialogMode(2,"Manage Security Keys",8,null,I,"otpauth-hardware-manage");if(u2fSupported()==false){QE("d2addkey1",false)}break;case"otp-hkey-yubikey-add":if(l.result){meshserver.send({action:"otp-hkey-get"})}else{setDialogMode(2,"Add Security Key",1,null,"<br />Error, Unable to add key.<br /><br />")}break;case"otp-hkey-setup-request":if(xxdialogMode&&(xxdialogTag!="otpauth-hardware-manage")){return}var I="Press the key button now.<br /><br /><div style=width:100%;text-align:center><img width=120 height=117 src='images/hardware-keypress-120.png' /></div><input id=dp1keyname style=display:none value="+l.name+" />";setDialogMode(2,"Add Security Key",2,null,I);window.u2f.register(l.request.appId,l.request.registerRequests,l.request.registeredKeys,function(m){if(m.registrationData){meshserver.send({action:"otp-hkey-setup-response",response:m,name:Q("dp1keyname").value});setDialogMode(2,"Add Security Key",0,null,"<br />Checking...<br /><br /><br />","otpauth-hardware-manage")}else{var j=["","Unknown error","Bad request","Unsupported configuration","This key was already registered","Timeout"];setDialogMode(2,"Add Security Key",1,null,"<br />"+j[m.errorCode]+".<br /><br />")}},l.request.timeoutSeconds);break;case"otp-hkey-setup-response":if(xxdialogMode&&(xxdialogTag!="otpauth-hardware-manage")){return}if(l.result==true){meshserver.send({action:"otp-hkey-get"})}else{setDialogMode(2,"Add Security Key",1,null,"<br />ERROR: Unable to add key.<br /><br />","otpauth-hardware-manage")}break;case"event":if(!l.event.nolog){events.unshift(l.event);var c=parseInt(p3limitdropdown.value);while(events.length>c){events.pop()}masterUpdate(32)}switch(l.event.action){case"accountcreate":case"accountchange":if(userinfo.name==l.event.account.name){var t=l.event.account.siteadmin?l.event.account.siteadmin:0;var w=userinfo.siteadmin?userinfo.siteadmin:0;if((l.event.account.quota!=userinfo.quota)||(((userinfo.siteadmin&8)==0)&&((l.event.account.siteadmin&8)!=0))){meshserver.send({action:"files"})}userinfo=l.event.account;if(w!=t){updateSiteAdmin()}updateSelf()}if(users==null){break}users[l.event.account._id]=l.event.account;updateUsers();break;case"accountremove":if(users==null){break}delete users["user/"+domain+"/"+l.event.username.toLowerCase()];updateUsers();break;case"createmesh":if(l.event.links["user/"+domain+"/"+userinfo.name.toLowerCase()]!=null){meshes[l.event.meshid]={_id:l.event.meshid,name:l.event.name,mtype:l.event.mtype,desc:l.event.desc,links:l.event.links};masterUpdate(4+128);meshserver.send({action:"files"})}break;case"meshchange":if(meshes[l.event.meshid]==null){meshes[l.event.meshid]={_id:l.event.meshid,name:l.event.name,mtype:l.event.mtype,desc:l.event.desc,links:l.event.links};meshserver.send({action:"nodes"})}else{if(l.event.name){meshes[l.event.meshid].name=l.event.name}if(l.event.desc){meshes[l.event.meshid].desc=l.event.desc}if(l.event.flags!=null){meshes[l.event.meshid].flags=l.event.flags}if(l.event.links){meshes[l.event.meshid].links=l.event.links}if(l.event.amt){meshes[l.event.meshid].amt=l.event.amt}if(meshes[l.event.meshid].links["user/"+domain+"/"+userinfo.name.toLowerCase()]==null){if((xxcurrentView==20)&&(currentMesh==meshes[l.event.meshid])){go(2)}delete meshes[l.event.meshid];var s=[];for(var d in nodes){if(nodes[d].meshid!=l.event.meshid){s.push(nodes[d])}}nodes=s;if(xxcurrentView>=10&&xxcurrentView<20&&currentNode&&currentNode.meshid==l.event.meshid){setDialogMode(0);go(1)}}}masterUpdate(4+128);if(xxcurrentView==20&&currentMesh._id==l.event.meshid){p20updateMesh()}break;case"deletemesh":if(meshes[l.event.meshid]){delete meshes[l.event.meshid];masterUpdate(128);meshserver.send({action:"files"})}var s=[];if(nodes!=null){for(var d in nodes){if(nodes[d].meshid!=l.event.meshid){s.push(nodes[d])}}}nodes=s;masterUpdate(4);if(xxcurrentView>=20&&xxcurrentView<30&&currentMesh._id==l.event.meshid){setDialogMode(0);go(2)}if(xxcurrentView>=10&&xxcurrentView<20&&currentNode&&currentNode.meshid==l.event.meshid){setDialogMode(0);go(1)}break;case"addnode":var v=l.event.node;if(!meshes[v.meshid]){break}v.namel=v.name.toLowerCase();if(v.rname){v.rnamel=v.rname.toLowerCase()}else{v.rnamel=v.namel}v.meshnamel=meshes[v.meshid].name.toLowerCase();v.state=0;if(!v.icon){v.icon=1}v.ident=++nodeShortIdent;if(nodes==null){}nodes.push(v);masterUpdate(1|2|4|16);break;case"removenode":var e=-1;for(var d in nodes){if(nodes[d]._id==l.event.nodeid){e=d;break}}if(e!=-1){var v=nodes[e];if(currentNode==v){if(xxcurrentView>=10&&xxcurrentView<20){setDialogMode(0);go(1)}currentNode=null}nodes.splice(e,1);masterUpdate(4|16)}break;case"changenode":var e=-1;for(var d in nodes){if(nodes[d]._id==l.event.nodeid){e=d;break}}if(e!=-1){var v=nodes[e];v.name=l.event.node.name;v.rname=l.event.node.rname;v.users=l.event.node.users;v.host=l.event.node.host;v.desc=l.event.node.desc;v.ip=l.event.node.ip;v.osdesc=l.event.node.osdesc;v.publicip=l.event.node.publicip;v.iploc=l.event.node.iploc;v.wifiloc=l.event.node.wifiloc;v.gpsloc=l.event.node.gpsloc;v.tags=l.event.node.tags;v.userloc=l.event.node.userloc;if(l.event.node.agent!=null){if(v.agent==null){v.agent={}}if(l.event.node.agent.ver!=null){v.agent.ver=l.event.node.agent.ver}if(l.event.node.agent.id!=null){v.agent.id=l.event.node.agent.id}if(l.event.node.agent.caps!=null){v.agent.caps=l.event.node.agent.caps}if(l.event.node.agent.core!=null){v.agent.core=l.event.node.agent.core}else{if(v.agent.core){delete v.agent.core}}v.agent.tag=l.event.node.agent.tag}if(l.event.node.intelamt!=null){if(v.intelamt==null){v.intelamt={}}if(l.event.node.intelamt.host!=null){v.intelamt.user=l.event.node.intelamt.host}if(l.event.node.intelamt.user!=null){v.intelamt.user=l.event.node.intelamt.user}if(l.event.node.intelamt.tls!=null){v.intelamt.tls=l.event.node.intelamt.tls}if(l.event.node.intelamt.ver!=null){v.intelamt.ver=l.event.node.intelamt.ver}if(l.event.node.intelamt.state!=null){v.intelamt.state=l.event.node.intelamt.state}}v.namel=v.name.toLowerCase();if(v.rname){v.rnamel=v.rname.toLowerCase()}else{v.rnamel=v.namel}if(l.event.node.icon){v.icon=l.event.node.icon}masterUpdate(2|4|8|16);refreshDevice(v._id);if((currentNode==v)&&(xxdialogMode!=null)&&(xxdialogTag=="@xxmap")){p10showNodeLocationDialog()}}break;case"nodemeshchange":var e=-1;for(var d in nodes){if(nodes[d]._id==l.event.nodeid){e=d;break}}if(e!=-1){var v=nodes[e];if(meshes[l.event.newMeshId]==null){if(currentNode==v){if(xxcurrentView>=10&&xxcurrentView<20){setDialogMode(0);go(1)}currentNode=null}nodes.splice(e,1);masterUpdate(4|16)}else{v.meshid=l.event.newMeshId;v.meshnamel=meshes[l.event.newMeshId].name.toLowerCase();masterUpdate(1|2|4)}refreshDevice(l.event.nodeid)}else{var v=l.event.node;if(!meshes[v.meshid]){break}v.namel=v.name.toLowerCase();if(v.rname){v.rnamel=v.rname.toLowerCase()}else{v.rnamel=v.namel}v.meshnamel=meshes[v.meshid].name.toLowerCase();v.state=0;if(!v.icon){v.icon=1}v.ident=++nodeShortIdent;if(nodes==null){}nodes.push(v);masterUpdate(1|2|4|16)}break;case"nodeconnect":var e=-1;for(var d in nodes){if(nodes[d]._id==l.event.nodeid){e=d;break}}if(e!=-1){var v=nodes[e];v.conn=l.event.conn;v.pwr=l.event.pwr;masterUpdate(4|16);refreshDevice(v._id)}break;case"wssessioncount":if(wssessions!=null){if(l.event.count==0&&wssessions["user/"+domain+"/"+l.event.username.toLowerCase()]){delete wssessions["user/"+domain+"/"+l.event.username.toLowerCase()]}else{wssessions["user/"+domain+"/"+l.event.username.toLowerCase()]=l.event.count}updateUsers()}break;case"clearevents":events=[];masterUpdate(32);break;case"login":if(users!=null&&users["user/"+domain+"/"+l.event.username.toLowerCase()]){users["user/"+domain+"/"+l.event.username.toLowerCase()].login=Math.floor(new Date(l.event.time).getTime()/1000)}break;case"scanamtdevice":if((xxdialogMode==null)||(!Q("dp1range"))||(Q("dp1range").value!=l.event.range)){return}var I="";if(l.event.results==null){I="<div style=width:100%;text-align:center;margin-top:12px>Unable to scan this address range.</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.1.0/24<br />192.167.0.1-192.168.0.100</div>"}else{amtScanResults=l.event.results;for(var d in l.event.results){var z=l.event.results[d],E=z.hostname;if(E.length>20){E=E.substring(0,20)+"..."}var G='<b title="'+EscapeHtml(z.hostname)+'">'+EscapeHtml(E)+"</b> - v"+z.ver;if(z.state==2){if(z.tls==1){G+=" with TLS."}else{G+=" without TLS."}}else{G+=" not activated."}I+='<div style=width:100%;margin-bottom:2px;background-color:lightgray><div style=padding:4px><div style=display:inline-block;margin-right:5px><input class=DevScanCheckbox name=dp1checkbox tag="'+EscapeHtml(d)+'" type=checkbox onclick=addAmtScanToMeshCheckbox() /></div><div class=j1 style=display:inline-block></div><div style=display:inline-block;margin-left:5px;overflow-x:auto;white-space:nowrap>'+G+"</div></div></div>"}if(I==""){I="<div style=width:100%;text-align:center;margin-top:12px>Scan returned no results.</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.1.0/24<br />192.167.0.1-192.168.0.100</div>"}}QH("dp1results",I);QE("dp1range",true);QE("dp1rangebutton",true);break;case"notify":var o={text:l.event.value};if(l.event.tag!=null){o.tag=l.event.tag}addNotification(o);break;case"stopped":break;default:break}break;case"stopped":autoReconnect=false;QH("p0span",l.msg);break;default:console.log("Unknown message.action",l.action);break}}function onRealNameCheckBox(){showRealNames=Q("RealNameCheckBox").checked;putstore("showRealNames",showRealNames?1:0);masterUpdate(6);return}function onDeviceViewChange(a){if(a!=null){Q("viewselect").value=a}for(var b=1;b<5;b++){Q("devViewButton"+b).classList.remove("viewSelectorSel")}Q("devViewButton"+Q("viewselect").value).classList.add("viewSelectorSel");putstore("deviceView",Q("viewselect").value);putstore("viewsize",Q("sizeselect").value);masterUpdate(4)}function ondockeypress(a){if(!xxdialogMode&&xxcurrentView==11&&desktop&&Q("DeskControl").checked){if(currentNode!=null){var d=meshes[currentNode.meshid];var g=d.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;var b=((g==4294967295)||(((g&8)!=0)&&((g&256)==0)));if(b==false){return false}var c=((g!=4294967295)||(((g&8)!=0)&&((g&256)==0)&&((g&4096)!=0)));if(c==true){if((a.altKey==true)||(a.ctrlKey==true)||(a.keyCode<32)||(a.keyCode>90)){return false}}}return desktop.m.handleKeys(a)}if(!xxdialogMode&&xxcurrentView==12&&terminal&&terminal.State==3){return terminal.m.TermHandleKeys(a)}if(!xxdialogMode&&((xxcurrentView==15)||(xxcurrentView==115))){return agentConsoleHandleKeys(a)}if(!xxdialogMode&&xxcurrentView==4){if(a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}var h=0;if(a.key){if(a.key.length===1&&userSearchFocus==0){Q("UserSearchInput").value=((Q("UserSearchInput").value+a.key));h=1}if(a.keyCode==8&&userSearchFocus==0){var j=Q("UserSearchInput").value;Q("UserSearchInput").value=j.substring(0,j.length-1);h=1}if(a.keyCode==27){Q("UserSearchInput").value="";h=1}}else{if(a.charCode!=0&&userSearchFocus==0){Q("UserSearchInput").value=((Q("UserSearchInput").value+String.fromCharCode(a.charCode)));h=1}}if(h>0){if(h==1){onUserSearchInputChanged()}return haltEvent(a)}}if(xxdialogMode||xxcurrentView!=1){return}if(a.ctrlKey==true&&a.charCode==96){showRealNames=!showRealNames;Q("RealNameCheckBox").value=showRealNames;putstore("showRealNames",showRealNames?1:0);masterUpdate(6);return}if(a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}if(Q("viewselect").value<3){var h=0;if(a.key){if(a.key.length===1&&searchFocus==0){Q("SearchInput").value=((Q("SearchInput").value+a.key));h=1}if(a.keyCode==8&&searchFocus==0){var j=Q("SearchInput").value;Q("SearchInput").value=j.substring(0,j.length-1);h=1}if(a.keyCode==27){Q("SearchInput").value="";h=1}}else{if(a.charCode!=0&&searchFocus==0){Q("SearchInput").value=((Q("SearchInput").value+String.fromCharCode(a.charCode)));h=1}}if(h>0){if(h==1){masterUpdate(5)}return haltEvent(a)}}if(Q("viewselect").value==3){if(a.key){if(a.key.length===1&&mapSearchFocus==0){Q("mapSearchLocation").value=((Q("mapSearchLocation").value+a.key));h=1}if(a.keyCode==27){Q("mapSearchLocation").value="";mapCloseSearchWindow();h=1}if(a.keyCode==13){getSearchLocation()}}else{if(a.charCode!=0&&mapSearchFocus==0){Q("mapSearchLocation").value=((Q("mapSearchLocation").value+String.fromCharCode(a.charCode)));h=1}}}}function ondockeydown(a){if(!xxdialogMode&&xxcurrentView==11&&desktop&&Q("DeskControl").checked){if(currentNode!=null){var d=meshes[currentNode.meshid];var g=d.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;var b=((g==4294967295)||(((g&8)!=0)&&((g&256)==0)));if(b==false){return false}var c=((g!=4294967295)||(((g&8)!=0)&&((g&256)==0)&&((g&4096)!=0)));if(c==true){if((a.altKey==true)||(a.ctrlKey==true)||(a.keyCode<32)||(a.keyCode>90)){return false}}}return desktop.m.handleKeyDown(a)}if(!xxdialogMode&&xxcurrentView==12&&terminal&&terminal.State==3){return terminal.m.TermHandleKeyDown(a)}if(!xxdialogMode&&xxcurrentView==13&&a.keyCode==116&&p13filetree!=null){haltEvent(a);return false}if(!xxdialogMode&&((xxcurrentView==15)||(xxcurrentView==115))){return agentConsoleHandleKeys(a)}if(!xxdialogMode&&xxcurrentView==4){if(a.keyCode===8&&userSearchFocus==0){var j=Q("UserSearchInput").value;Q("UserSearchInput").value=(j.substring(0,j.length-1));h=1}if(a.keyCode===27){Q("UserSearchInput").value="";h=1}if(h>0){if(h==1){masterUpdate(5)}return haltEvent(a)}}if(xxdialogMode||xxcurrentView!=1||a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}var h=0;if(Q("viewselect").value<3){if(a.keyCode===8&&searchFocus==0){var j=Q("SearchInput").value;Q("SearchInput").value=(j.substring(0,j.length-1));h=1}if(a.keyCode===27){Q("SearchInput").value="";h=1}if(h>0){if(h==1){masterUpdate(5)}return haltEvent(a)}}if(Q("viewselect").value==3){if(a.keyCode===8&&mapSearchFocus==0){var j=Q("mapSearchLocation").value;Q("mapSearchLocation").value=(j.substring(0,j.length-1));h=1}if(a.keyCode===27){Q("mapSearchLocation").value="";mapCloseSearchWindow();h=1}}}function ondockeyup(a){if(!xxdialogMode&&xxcurrentView==11&&desktop&&Q("DeskControl").checked){if(currentNode!=null){var d=meshes[currentNode.meshid];var g=d.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;var b=((g==4294967295)||(((g&8)!=0)&&((g&256)==0)));if(b==false){return false}var c=((g!=4294967295)||(((g&8)!=0)&&((g&256)==0)&&((g&4096)!=0)));if(c==true){if((a.altKey==true)||(a.ctrlKey==true)||(a.keyCode<32)||(a.keyCode>90)){return false}}}return desktop.m.handleKeyUp(a)}if(!xxdialogMode&&xxcurrentView==12&&terminal&&terminal.State==3){return terminal.m.TermHandleKeyUp(a)}if(!xxdialogMode&&xxcurrentView==13&&a.keyCode==116&&p13filetree!=null){p13folderup(9999);haltEvent(a);return false}if(!xxdialogMode&&xxcurrentView==4){if((a.keyCode===8&&searchFocus==0)||a.keyCode===27){return haltEvent(a)}}if(xxdialogMode&&a.keyCode==27){dialogclose(0)}if(xxdialogMode||xxcurrentView!=0||a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}if(Q("viewselect").value<3){if((a.keyCode===8&&searchFocus==0)||a.keyCode===27){return haltEvent(a)}}if(Q("viewselect").value==3){if((a.keyCode===8&&mapSearchFocus==0)||a.keyCode===27){return haltEvent(a)}}}function devMouseHover(b,c){var d=Q("viewselect").value;if(d==1){var a=b.children[1].children[1];a.children[0].classList.remove("g1s");a.children[1].classList.remove("e2s");a.children[2].classList.remove("g2s");if(c==1){a.children[0].classList.add("g1s");a.children[1].classList.add("e2s");a.children[2].classList.add("g2s")}}else{if(d==2){var a=b;a.children[2].classList.remove("g1s");a.children[4].classList.remove("e2s");a.children[3].classList.remove("g2s");if(c==1){a.children[2].classList.add("g1s");a.children[4].classList.add("e2s");a.children[3].classList.add("g2s")}}}}var deviceHeaderId=0;var deviceHeaderTotal=0;var deviceHeadersTitles={};var deviceHeaderCount;var deviceHeaders={};var oldviewmode=0;function updateDevices(){if(nodes==null){return}var G="",a=0,g=null,e=0,l={},O=Q("viewselect").value,s={},p={};QV("xdevices",O<4);QV("xdevicesmap",O==4);QV("devListToolbar",O<3);QV("kvmListToolbar",O==3);QV("devMapToolbar",O==4);QV("devListToolbarSize",O==3);QV("NoMeshesPanel",meshcount==0);QV("devListToolbarViewIcons",(meshcount!=0)&&(nodes.length>0));QV("devListToolbarSort",(meshcount!=0)&&(nodes.length>0)&&(O<4));if((meshcount==0)||(nodes.length==0)){O=1;sort=0}if(O==4){setTimeout(function(){if(xxmap.map!=null){xxmap.map.updateSize()}},200)}else{deviceHeaderId=0;deviceHeaderCount={};deviceHeaderTotal=0;deviceHeaders={};deviceHeadersTitles={};var x=[];if(sort==0){nodes.sort(meshSort)}else{if(sort==1){nodes.sort(powerSort)}else{if(sort==2){if(showRealNames==true){nodes.sort(deviceHostSort)}else{nodes.sort(deviceSort)}}}}var d=[],m=document.getElementsByClassName("DeviceCheckbox"),b=0;for(var t=0;t<m.length;t++){if(m[t].checked){d.push(m[t].value)}}if((oldviewmode<3)&&(O==3)){multiDesktopFilter=d}else{if((oldviewmode==3)&&(O<3)){d=multiDesktopFilter}}var M=Q("column_l").clientWidth-60;var k=Math.floor(M/301);k=301+Math.floor((M-(k*301))/k);if(O==2){G+="<table style=width:100%;margin-top:4px cellpadding=0 cellspacing=0><th style=color:gray><th style=color:gray;width:120px>User<th style=color:gray;width:120px>Address<th style=color:gray;width:100px>Connectivity"}for(var t in nodes){var E=nodes[t];if(E.v==false){continue}var z=meshes[E.meshid],B=z.links["user/"+domain+"/"+userinfo.name.toLowerCase()];if(B==null){continue}var C=B.rights;if((O==3)&&(z.mtype==1)){continue}if(sort==0){if(E.meshid!=g){deviceHeaderSet();var o="";if(O==2){G+="<tr><td colspan=5>"}if(meshes[E.meshid].mtype==1){o="<span class=devHeaderx>, Intel&reg; AMT only</span>"}if((O==1)&&(g!=null)){if(a==2){G+="<td><div style=width:301px></div></td>"}if(G!=""){G+="</tr></table>"}}if(O==2){G+="<div>"}G+="<div class=DevSt style=width:100%;padding-top:4px><span style=float:right>";G+=getMeshActions(z,C);G+='</span><span id=MxMESH style=cursor:pointer onclick=gotoMesh("'+E.meshid+'")>'+EscapeHtml(meshes[E.meshid].name)+"</span>"+o+"<span id=DevxHeader"+deviceHeaderId+" class=devHeaderx></span></div>";if(O==2){G+="</div>"}g=E.meshid;l[g]=1;a=0}}else{if(sort==1){var F=E.pwr?E.pwr:0;if(F!==g){deviceHeaderSet();if((O==1)&&(g!==null)){if(a==2){G+="<td><div style=width:301px></div></td>"}if(G!=""){G+="</tr></table>"}}G+="<div class=DevSt style=width:100%;padding-top:4px><span>"+PowerStateStr2(E.pwr)+"</span><span id=DevxHeader"+deviceHeaderId+' class="devHeaderx"></span></div>';g=F;a=0}}else{if(sort==2){if(g==null){g="1"}}}}e++;var L=EscapeHtml(E.name);if(L.length==0){L="<i>None</i>"}if((E.rname!=null)&&(E.rname.length>0)){L+=" / "+EscapeHtml(E.rname)}var D=EscapeHtml(E.name);if(showRealNames==true&&E.rname!=null){D=EscapeHtml(E.rname)}if(D.length==0){D="<i>None</i>"}var u=E.icon;if((!E.conn)||(E.conn==0)){u+=" gray"}if(O==1){G+="<div id=devs onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=display:inline-block;width:"+k+'px;height:50px;padding-top:1px;padding-bottom:1px><div style=width:22px;height:50%;float:left;padding-top:12px><input class="'+E.meshid+' DeviceCheckbox" onclick=p1updateInfo() value=devid_'+E._id+" type=checkbox></div><div style=height:100%;cursor:pointer onclick=gotoDevice('"+E._id+"',null,null,event)><div class=\"i"+u+'" style=width:50px;float:left></div><div style=height:100%><div class=g1></div><div class=e2><div class=e1 style=width:'+(k-100)+'px title="'+L+'">'+D+"</div><div>"+NodeStateStr(E)+"</div></div><div class=g2></div></div></div></div>"}else{if(O==2){var J=[];if(E.conn){if((E.conn&1)!=0){J.push('<span title="Mesh agent is connected and ready for use.">Agent</span>')}if((E.conn&2)!=0){J.push('<span title="Intel&reg; AMT CIRA is connected and ready for use.">CIRA</span>')}else{if((E.conn&4)!=0){J.push('<span title="Intel&reg; AMT is routable.">AMT</span>')}}if((E.conn&8)!=0){J.push('<span title="Mesh agent is reachable using another agent as relay.">Relay</span>')}}G+="<tr><td><div id=devs class=bar18 onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=height:18px;width:100%;font-size:medium>";G+='<div style=width:22px;float:left;background-color:white><input class="'+E.meshid+' DeviceCheckbox" onclick=p1updateInfo() value=devid_'+E._id+" type=checkbox></div>";G+="<div style=float:left;height:18px;width:18px;background-color:white onclick=gotoDevice('"+E._id+"',null,null,event)><div class=j"+u+" style=width:16px;margin-top:1px;margin-left:2px;height:16px></div></div>";G+="<div class=g1 style=height:18px;float:left></div><div class=g2 style=height:18px;float:right></div>";G+='<div style=cursor:pointer;font-size:14px title="'+L+"\" onclick=gotoDevice('"+E._id+"',null,null,event)><span style=width:300px>"+D+"</span></div></div></td>";G+="<td style=text-align:center>"+getUserShortStr(E);G+="<td style=text-align:center>"+(E.ip!=null?E.ip:"");G+="<td style=text-align:center>"+J.join("&nbsp;+&nbsp;");G+="</tr>"}else{if((O==3)&&(E.conn&1)&&(((C&8)||(C&256))!=0)&&((E.agent.caps&1)!=0)){if((multiDesktopFilter.length==0)||(multiDesktopFilter.indexOf("devid_"+E._id)>=0)){G+="<div id=devs style=display:inline-block;margin:1px;background-color:lightgray;border-radius:5px;position:relative><div style=padding:3px;cursor:pointer onclick=gotoDevice('"+E._id+"',11,null,event)>";G+='<div class="j'+u+'" style=width:16px;float:left></div>&nbsp;'+D+"</div>";G+="<span onclick=gotoDevice('"+E._id+"',null,null,event)></span><div id=xkvmid_"+E._id.split("/")[2]+"><div id=skvmid_"+E._id.split("/")[2]+' style="position:absolute;color:white;left:5px;top:27px;text-shadow:0px 0px 5px #000;z-index:1000;cursor:default" onclick=toggleKvmDevice(\''+E._id+"')>Disconnected</div></div>";G+="</div>";x.push(E._id)}}}}if((sort==3)&&(G!="")){if(E.tags){for(var w in E.tags){var K=E.tags[w];if(s[K]==null){s[K]=G;p[K]=1}else{s[K]+=G;p[K]+=1}if(O==3){break}}}G=""}deviceHeaderTotal++;if(typeof deviceHeaderCount[E.state]=="undefined"){deviceHeaderCount[E.state]=1}else{deviceHeaderCount[E.state]++}}if(sort==3){var q=[];for(var t in s){q.push(t)}q.sort(function(c,j){return c.toLowerCase().localeCompare(j.toLowerCase())});for(var w in q){var t=q[w];G+="<div class=DevSt style=width:100%;padding-top:4px><span>"+t+'</span><span class="devHeaderx">, '+p[t]+" device"+((p[t]>1)?"s":"")+"</span></div>"+s[t]}}if((G=="")&&(meshcount>0)&&(Q("SearchInput").value!="")){if(sort==3){G='<div style="margin:30px">No devices are included in any groups, click on a device\'s "Groups" to add to a group.</div>'}else{G='<div style="margin:30px">No devices matching this search.</div>'}}if((O==1)&&(a==2)){G+="<td><div style=width:301px></div></td>"}if((sort==0)&&(Q("SearchInput").value=="")&&(O<3)){for(var t in meshes){var y=meshes[t],A=y.links["user/"+domain+"/"+userinfo.name.toLowerCase()];if(A!=null){var C=A.rights;if(l[y._id]==null){if((g!="")&&(G!="")){G+="</tr></table>"}G+="<table style=width:100%;padding-top:4px cellpadding=0 cellspacing=0><tr><td colspan=3 class=DevSt><span style=float:right>";G+=getMeshActions(y,C);G+='</span><span id=MxMESH style=cursor:pointer onclick=gotoMesh("'+y._id+'")>'+EscapeHtml(y.name)+"</span></td></tr><tr>";if(y.mtype==1){G+="<td><div style=padding:10px><i>No Intel&reg; AMT devices in this mesh";if((C&4)!=0){G+=', <a style=cursor:pointer onclick=addDeviceToMesh("'+y._id+'")>add one</a>'}}if(y.mtype==2){G+="<td><div style=padding:10px><i>No devices in this mesh";if((C&4)!=0){G+=', <a style=cursor:pointer onclick=addAgentToMesh("'+y._id+'")>add one</a>'}}G+=".</i></div></td>";g=y._id;e++}}}}G+="</tr></table><div style=height:1px></div>";G+="<div style=border-top-style:solid;border-top-width:1px;border-top-color:#DDDDDD;cursor:pointer;font-size:10px>";if((O<3)&&(sort==0)&&(meshcount>0)){G+='<a onclick=account_createMesh() title="Create a new group of devices." style=cursor:pointer>Add Device Group</a>&nbsp'}G+='<a onclick=p10showMeshCmdDialog(0) style=cursor:pointer title="Download MeshCmd, a command line tool that performs many functions.">MeshCmd</a></div>';G+="</div><br/>";QH("xdevices",G);deviceHeaderSet();var m=document.getElementsByClassName("DeviceCheckbox"),b=0;for(var t=0;t<m.length;t++){m[t].checked=(d.indexOf(m[t].value)>=0)}for(var t in deviceHeaders){QH(t,deviceHeaders[t])}for(var t in deviceHeadersTitles){Q(t).title=deviceHeadersTitles[t]}p1updateInfo();if(O==3){var P=[{x:180,y:101},{x:302,y:169},{x:454,y:255}][Q("sizeselect").selectedIndex];var H=P.x+2,N=M-5,R=Math.floor(N/H);R=H+Math.floor((N-(R*H))/R);P.y=P.y*(R/P.x);P.x=R;for(var t in multiDesktop){multiDesktop[t].xxdelete=true}for(var t in x){var v=x[t],I=v.split("/")[2],h=multiDesktop[v];if(h!=null){h.m.CanvasId.setAttribute("style","background-color:black;width:"+P.x+"px;height:"+P.y+"px");Q("xkvmid_"+I).appendChild(h.m.CanvasId);delete h.xxdelete;QH("skvmid_"+I,["Disconnected","Connecting...","Setup...","",""][((h.m.State==null)?h.m.state:h.m.State)])}else{var E=getNodeFromId(v);if((desktopNode==E)&&(desktop!=null)){var a=desktop.m.CanvasId;a.setAttribute("id","kvmid_"+I);a.setAttribute("style","background-color:black;width:"+P.x+"px;height:"+P.y+"px");a.setAttribute("onclick","toggleKvmDevice('"+v+"')");a.removeAttribute("onmousedown");a.removeAttribute("onmouseup");a.removeAttribute("onmousemove");Q("xkvmid_"+I).appendChild(a);QH("skvmid_"+I,["Disconnected","Connecting...","Setup...","",""][((desktop.m.State==null)?desktop.m.state:desktop.m.State)]);if(desktop.m.SendCompressionLevel){desktop.m.SendCompressionLevel(1,multidesktopsettings.quality,multidesktopsettings.scaling,multidesktopsettings.framerate)}desktop.shortid=I;desktop.onStateChanged=onMultiDesktopStateChange;multiDesktop[v]=desktop;desktop=desktopNode=currentNode=null;QH("DeskParent",'<canvas id="Desk" width="640" height="480" style="width:100%;-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown=dmousedown(event) onmouseup=dmouseup(event) onmousemove=dmousemove(event)></canvas>')}else{var a=document.createElement("canvas");a.setAttribute("id","kvmid_"+I);a.setAttribute("width",640);a.setAttribute("height",480);a.setAttribute("oncontextmenu","return false");a.setAttribute("style","background-color:black;width:"+P.x+"px;height:"+P.y+"px");a.setAttribute("onclick","toggleKvmDevice('"+v+"')");try{Q("xkvmid_"+I).appendChild(a)}catch(n){}if(Q("autoConnectDesktopCheckbox").checked==true){setTimeout(function(){connectMultiDesktop(E,1)},100)}}}}for(var t in multiDesktop){if(multiDesktop[t].xxdelete==true){multiDesktop[t].Stop();delete multiDesktop[t]}else{if(debugmode&&multiDesktop[t].m&&multiDesktop[t].m.onScreenSizeChange){mdeskAdjust(multiDesktop[t].m,multiDesktop[t].m.ScreenWidth,multiDesktop[t].m.ScreenHeight,multiDesktop[t].m.CanvasId)}}}deskAdjust()}else{disconnectAllKvmFunction();Q("autoConnectDesktopCheckbox").checked=false}}oldviewmode=O}function toggleKvmDevice(d){var c=getNodeFromId(d),a=meshes[c.meshid],b=a.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;if((b&8)||(b&256)){if(c.conn&1){connectMultiDesktop(c,1)}}}function getUserShortStr(b){if(b==null||b.users==null||b.users.length==0){return""}if(b.users.length>1){return'<span title="'+EscapeHtml(b.users.join(", "))+'">'+b.users.length+"&nbsp;users</span>"}var d=b.users[0],c=d,a=d.indexOf("\\");if(a>0){c=d.substring(a+1)}c=EscapeHtml(c);if(c.length>15){c=c.substring(0,14)+"&#8230;"}return'<span title="'+EscapeHtml(d)+'">'+c+"</span>"}function autoConnectDesktops(){if(Q("autoConnectDesktopCheckbox").checked==true){connectAllKvmFunction()}}function connectAllKvmFunction(){for(var a in nodes){if(multiDesktop[nodes[a]._id]==null){toggleKvmDevice(nodes[a]._id)}}}function disconnectAllKvmFunction(){for(var a in multiDesktop){multiDesktop[a].Stop()}multiDesktop={}}function onMultiDesktopStateChange(a,c){try{QH("skvmid_"+a.shortid,["Disconnected","Connecting...","Setup...","",""][c])}catch(b){}}function showMultiDesktopSettings(){QV("d7amtkvm",false);QV("d7meshkvm",true);d7bitmapquality.value=multidesktopsettings.quality;d7bitmapscaling.value=multidesktopsettings.scaling;if(multidesktopsettings.framerate){d7framelimiter.value=multidesktopsettings.framerate}else{d7framelimiter.value=1000}setDialogMode(7,"Remote Desktop Settings",3,showMultiDesktopSettingsChanged)}function showMultiDesktopSettingsChanged(){multidesktopsettings.quality=d7bitmapquality.value;multidesktopsettings.scaling=d7bitmapscaling.value;multidesktopsettings.framerate=d7framelimiter.value;localStorage.setItem("multidesktopsettings",JSON.stringify(multidesktopsettings));for(var a in multiDesktop){multiDesktop[a].m.SendCompressionLevel(1,multidesktopsettings.quality,multidesktopsettings.scaling,multidesktopsettings.framerate)}}function connectMultiDesktop(c,a){var d=c._id,e=d.split("/")[2];var b=multiDesktop[d];if(b==null){if(Q("kvmid_"+e)==null){return}if(a==2){if((c.intelamt.user==null)||(c.intelamt.user=="")){return}b=CreateAmtRedirect(CreateAmtRemoteDesktop("kvmid_"+e),authCookie);b.shortid=e;b.onStateChanged=onMultiDesktopStateChange;b.m.bpp=1;b.m.useZRLE=true;b.m.showmouse=true;b.m.onKvmData=function(g){console.log("KVM Data received in multi-desktop mode, this is not supported.")};if(debugmode>0){b.m.onScreenSizeChange=mdeskAdjust}b.Start(d,16994,"*","*",0);b.contype=2;multiDesktop[d]=b}else{if(a==1){b=CreateAgentRedirect(meshserver,CreateAgentRemoteDesktop("kvmid_"+e),serverPublicNamePort,authCookie);b.shortid=e;b.attemptWebRTC=attemptWebRTC;b.onStateChanged=onMultiDesktopStateChange;b.m.CompressionLevel=multidesktopsettings.quality;b.m.ScalingLevel=multidesktopsettings.scaling;b.m.FrameRateTimer=multidesktopsettings.framerate;if(debugmode>0){b.m.onScreenSizeChange=mdeskAdjust}b.Start(d);b.contype=1;multiDesktop[d]=b}}}else{b.Stop();delete multiDesktop[d]}}function getMeshActions(a,b){if((b&4)==0){return""}var c="";if((features&1024)==0){c+=' <a style=cursor:pointer;font-size:10px title="Add a new Intel&reg; AMT computer that is located on the internet." onclick=addCiraDeviceToMesh("'+a._id+'")>Add CIRA</a>'}if(a.mtype==1){if((features&1)==0){c+=' <a style=cursor:pointer;font-size:10px title="Add a new Intel&reg; AMT computer that is located on the local network." onclick=addDeviceToMesh("'+a._id+'")>Add Local</a>';c+=' <a style=cursor:pointer;font-size:10px title="Add a new Intel&reg; AMT computer by scanning the local network." onclick=addAmtScanToMesh("'+a._id+'")>Scan Network</a>'}}if(a.mtype==2){c+=' <a style=cursor:pointer;font-size:10px title="Add a new computer to this mesh by installing the mesh agent." onclick=addAgentToMesh("'+a._id+'")>Add Agent</a>';if(features&64){c+=' <a style=cursor:pointer;font-size:10px title="Invite someone to install the mesh agent on this mesh." onclick=inviteAgentToMesh("'+a._id+'")>Invite</a>'}}return c}function addDeviceToMesh(b){if(xxdialogMode){return}var a=meshes[b];var c='Add a new Intel&reg; AMT device to device group "'+EscapeHtml(a.name)+'".<br /><br />';c+=addHtmlValue("Device Name","<input id=dp1devicename style=width:230px maxlength=32 autocomplete=off onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />");c+=addHtmlValue("Hostname",'<input id=dp1hostname style=width:230px maxlength=32 autocomplete=off placeholder="Same as device name" onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />');c+=addHtmlValue("Username",'<input id=dp1username style=width:230px maxlength=32 autocomplete=off placeholder="admin" onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />');c+=addHtmlValue("Password","<input id=dp1password type=password style=width:230px autocomplete=off maxlength=32 onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />");c+=addHtmlValue("Security","<select id=dp1tls style=width:236px><option value=0>No TLS security</option><option value=1>TLS security required</option></select>");setDialogMode(2,"Add Intel&reg; AMT device",3,addDeviceToMeshEx,c,b);validateDeviceToMesh();Q("dp1devicename").focus()}function addAmtScanToMesh(a){if(xxdialogMode){return}var b="Enter a range of IP addresses to scan for Intel AMT devices.<br /><br />";b+=addHtmlValue("IP Range",'<input id=dp1range style=width:184px value="192.168.1.0/24" onkeyup=addAmtScanToMeshKeyUp(event) /><input id=dp1rangebutton type=button value=Scan onclick=addAmtScanToMeshButton()></input>');b+='<div id=dp1results style="width:100%;height:200px;background-color:white;border:1px gray solid;overflow-y:scroll"></div>';setDialogMode(2,"Scan for Intel&reg; AMT devices",3,addAmtScanToMeshEx,b,a);QE("idx_dlgOkButton",false);QH("dp1results","<div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.1.0/24<br />192.167.0.1-192.168.0.100</div>");focusTextBox("dp1range")}function addAmtScanToMeshKeyUp(a){if(a.keyCode==13){haltEvent(a);addAmtScanToMeshButton()}}function addAmtScanToMeshEx(b,h){var d=document.getElementsByClassName("DevScanCheckbox"),c=0;for(var e=0;e<d.length;e++){if(d[e].checked){var g=d[e].getAttribute("tag");var a=amtScanResults[g];meshserver.send({action:"addamtdevice",meshid:h,devicename:g,hostname:a.hostname,amtusername:"",amtpassword:"",amttls:a.tls})}}}function addAmtScanToMeshButton(){QE("dp1range",false);QE("dp1rangebutton",false);QH("dp1results","<div style=width:100%;text-align:center;margin-top:12px>Scanning...</div>");meshserver.send({action:"scanamtdevice",range:Q("dp1range").value})}function addAmtScanToMeshCheckbox(){var b=document.getElementsByClassName("DevScanCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked){a++}}QE("idx_dlgOkButton",a>0)}function addCiraDeviceToMesh(b){if(xxdialogMode){return}var a=meshes[b];var c=b.split("/")[2].replace(/\@/g,"X").replace(/\$/g,"X");var e="<select id=dlgAddCiraSel onclick=dlgAddCiraSelClick() style=width:230px><option value=0>MeshCommander Script</option><option value=1>Manual Username/Password</option>";if((features&16)==0){e+="<option value=2>Manual Certificate</option></select>"}var d="";d+=addHtmlValue("Setup Method",e);d+="<hr>";d+='<div id=dlgAddCira0>To add a new Intel&reg; AMT device to device group "'+EscapeHtml(a.name)+"\" with CIRA, download the following script files and use <a href='http://meshcommander.com' rel='noreferrer noopener' target='_blank'>MeshCommander</a> to run the script to configure computers.<br /><br />";d+=addHtmlValue("Setup CIRA",'<a style=cursor:pointer onclick=fileDownload("mescript.ashx?type=1&meshid='+c.substring(0,16)+'","cira_setup.mescript")>cira_setup.mescript</a>');d+=addHtmlValue("Cleanup CIRA",'<a style=cursor:pointer onclick=fileDownload("mescript.ashx?type=2","cira_clean.mescript")>cira_clean.mescript</a>');d+="</div>";d+='<div id=dlgAddCira1 style=display:none>To add a new Intel&reg; AMT device to device group "'+EscapeHtml(a.name)+'" with CIRA, load the following certificate as trusted root within Intel AMT';if(serverinfo.mpspass){d+=" and authenticate to the server using this username and password.<br /><br />"}else{d+=" and authenticate to the server using this username and any password.<br /><br />"}d+=addHtmlValue("Root Certificate",'<a style=cursor:pointer onclick=fileDownload("MeshServerRootCert.cer","MeshServerRootCert.cer")>Root Certificate File</a>');d+=addHtmlValue("Username",'<input style=width:230px readonly value="'+c.substring(0,16)+'" />');if(serverinfo.mpspass){d+=addHtmlValue("Password",'<input style=width:230px readonly value="'+EscapeHtml(serverinfo.mpspass)+'" />')}if(serverinfo!=null){d+=addHtmlValue("MPS Server",'<input style=width:230px readonly value="'+EscapeHtml(serverinfo.mpsname)+":"+serverinfo.mpsport+'" />')}d+="</div>";if((features&16)==0){d+='<div id=dlgAddCira2 style=display:none>To add a new Intel&reg; AMT device to device group "'+EscapeHtml(a.name)+'" with CIRA, load the following certificate as trusted root within Intel AMT, authenticate using a client certificate with the following common name and connect to the following server.<br /><br />';d+=addHtmlValue("Root Certificate",'<a style=cursor:pointer onclick=fileDownload("MeshServerRootCert.cer","MeshServerRootCert.cer")>Root Certificate File</a>');d+=addHtmlValue("Organization",'<input style=width:230px readonly value="'+c+'" />');if(serverinfo!=null){d+=addHtmlValue("MPS Server",'<input style=width:230px readonly value="'+EscapeHtml(serverinfo.mpsname)+":"+serverinfo.mpsport+'" />')}d+="</div>"}setDialogMode(2,"Add Intel&reg; AMT CIRA device",2,null,d,"fileDownload")}function dlgAddCiraSelClick(){var a=Q("dlgAddCiraSel").value;QV("dlgAddCira0",a==0);QV("dlgAddCira1",a==1);QV("dlgAddCira2",a==2)}function checkEmail(c){var d=c.split("@");var b=((d.length==2)&&(d[0].length>0)&&(d[1].split(".").length>1)&&(d[1].length>2));if(b==true){var e=d[1].split(".");for(var a in e){if(e[a].length==0){b=false}}}return b}function inviteAgentToMesh(b){if(xxdialogMode){return}var a=meshes[b];var c="Invite someone to install the mesh agent. An email with be sent with the link to the mesh agent installation for "+EscapeHtml(a.name)+".<br /><br />";c+=addHtmlValue("Name (optional)",'<input id=agentInviteName value="" style=width:230px maxlength=64 />');c+=addHtmlValue("Email",'<input id=agentInviteEmail style=width:230px placeholder="example@email.com" onkeyup=validateAgentInvite()></input>');c+=addHtmlValue("Operating System","<select id=agentInviteNameOs style=width:236px><option value=0>Any supported</option><option value=1>Windows only</option><option value=3>Apple OSX only</option><option value=2>Linux only</option></select>");c+=addHtmlValue("Installation Type","<select id=agentInviteType style=width:236px><option value=0>Background and interactive</option><option value=2>Background only</option><option value=1>Interactive only</option></select>");c+=addHtmlValue("Message<br />(optional)",'<textarea id=agentInviteMessage value="" style=width:230px;height:100px;resize:none maxlength=1024 /></textarea>');setDialogMode(2,"Invite",3,performAgentInvite,c,b);validateAgentInvite()}function validateAgentInvite(){QE("idx_dlgOkButton",checkEmail(Q("agentInviteEmail").value))}function performAgentInvite(a,b){meshserver.send({action:"inviteAgent",meshid:b,email:Q("agentInviteEmail").value,name:Q("agentInviteName").value,os:Q("agentInviteNameOs").value,flags:Q("agentInviteType").value,msg:Q("agentInviteMessage").value})}function addAgentToMesh(d){if(xxdialogMode){return}var b=meshes[d],j="",a=0;j+=addHtmlValue("Operating System","<select id=aginsSelect onchange=addAgentToMeshClick() style=width:236px><option value=0>Windows</option><option value=1>Linux</option><option value=2>Apple OSX</option><option value=3>Windows (UnInstall)</option><option value=4>Linux (UnInstall)</option></select>");j+="<div id=aginsTypeDiv>";j+=addHtmlValue("Installation Type","<select id=aginsType onchange=addAgentToMeshClick() style=width:236px><option value=0>Background & interactive</option><option value=2>Background only</option><option value=1>Interactive only</option></select>");j+="</div><hr>";var c=b.name;c=c.split("\\").join("").split("/").join("").split(":").join("").split("*").join("").split("?").join("").split('"').join("").split("<").join("").split(">").join("").split("|").join("").split(" ").join("").split("'").join("");j+='<div id=agins_windows>To add a new computer to device group "'+EscapeHtml(b.name)+'", download the mesh agent and install it the computer to manage. This agent has server and mesh information embedded within it.<br /><br />';j+=addHtmlValue("Mesh Agent",'<a id=aginsw32lnk style=cursor:pointer onclick=fileDownload("meshagents?id=3&meshid='+d.split("/")[2]+'&installflags=","MeshAgent-'+c+'.exe",1) title="32bit version of the MeshAgent">Windows (.exe)</a>');j+=addHtmlValue("Mesh Agent",'<a id=aginsw64lnk style=cursor:pointer onclick=fileDownload("meshagents?id=4&meshid='+d.split("/")[2]+'&installflags=","MeshAgent-'+c+'.exe",1) title="64bit version of the MeshAgent">Windows x64 (.exe)</a>');if(debugmode>0){j+=addHtmlValue("Settings File",'<a id=aginswmshlnk href="meshsettings?id='+d.split("/")[2]+'&installflags=0" rel="noreferrer noopener" target="_blank">'+EscapeHtml(b.name)+" settings (.msh)</a>")}j+="</div>";j+="<div id=agins_linux style=display:none>To add a computer to "+EscapeHtml(b.name)+" run the following command. Root credentials will be needed.<br />";j+="<textarea id=agins_linux_area rows=2 cols=20 readonly=readonly style=width:100%;resize:none;height:120px;overflow:scroll;font-size:12px readonly></textarea>";j+="</div>";j+='<div id=agins_osx style=display:none>To add a new computer to device group "'+EscapeHtml(b.name)+'", download the mesh agent and install it the computer to manage. This agent installer has server and mesh information embedded within it.<br /><br />';j+=addHtmlValue("Mesh Agent",'<a href="meshosxagent?id=16&meshid='+d.split("/")[2]+'" rel="noreferrer noopener" target="_blank" title="64bit version of OSX Mesh Agent">OSX Agent (64bit)</a>');j+="</div>";j+='<div id=agins_windows_un style=display:none>To remove a mesh agent, download the file below, run it and click "uninstall".<br /><br />';j+=addHtmlValue("Mesh Agent",'<a style=cursor:pointer onclick=fileDownload("meshagents?id=3","MeshAgent.exe") title="32bit version of the MeshAgent">Windows (.exe)</a>');j+=addHtmlValue("Mesh Agent",'<a style=cursor:pointer onclick=fileDownload("meshagents?id=4","MeshAgent.exe") title="64bit version of the MeshAgent">Windows x64 (.exe)</a>');j+="</div>";j+="<div id=agins_linux_un style=display:none>To remove a mesh agent, run the following command. Root credentials will be needed.<br />";j+="<textarea id=agins_linux_area_un rows=2 cols=20 readonly=readonly style=width:100%;resize:none;height:120px;overflow:scroll;font-size:12px readonly></textarea>";j+="</div>";setDialogMode(2,"Add Mesh Agent",2,null,j,"fileDownload");var h=serverinfo.name;if((h.indexOf(".")==-1)||((features&2)!=0)){h=window.location.hostname}var e=((features&8192)!=0)?"--no-proxy ":"";if(serverinfo.https==true){var g=(serverinfo.port==443)?"":(":"+serverinfo.port);Q("agins_linux_area").value="wget https://"+h+g+"/meshagents?script=1 "+e+"--no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh https://"+h+g+" '"+d.split("/")[2]+"'\r\n";Q("agins_linux_area_un").value="wget https://"+h+g+"/meshagents?script=1 "+e+"--no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n"}else{var g=(serverinfo.port==80)?"":(":"+serverinfo.port);Q("agins_linux_area").value="wget http://"+h+g+"/meshagents?script=1 "+e+"-O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh http://"+h+g+" '"+d.split("/")[2]+"'\r\n";Q("agins_linux_area_un").value="wget http://"+h+g+"/meshagents?script=1 "+e+"-O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n"}Q("aginsSelect").focus();addAgentToMeshClick()}function fileDownload(g,d,a){var h=null,c="";if(a==1){c=Q("aginsType").value}else{if(a==2){c=Q("aginsSelect").value;if(parseInt(c)>=5){d=d.toLowerCase()}else{d+=".exe"}}}try{h=new XDomainRequest()}catch(b){}if(!h){h=new XMLHttpRequest()}h.open("GET",window.location.href+g+c);h.timeout=15000;h.responseType="blob";h.onprogress=function(e){};h.onload=function(j){saveAs(new Blob([j.target.response],{type:"application/octet-stream"}),d);if(xxdialogTag=="fileDownload"){setDialogMode(0)}};h.onerror=function(){if(xxdialogTag=="fileDownload"){setDialogMode(0)}alert("Agent downloads timeout.")};h.ontimeout=function(){if(xxdialogTag=="fileDownload"){setDialogMode(0)}alert("Unable to download agent.")};h.send()}function addAgentToMeshClick(){var a=Q("aginsSelect").value;QV("agins_windows",a==0);QV("agins_linux",a==1);QV("agins_osx",a==2);QV("agins_windows_un",a==3);QV("agins_linux_un",a==4);QV("aginsTypeDiv",a==0);if(debugmode>0){Q("aginswmshlnk").href=(Q("aginswmshlnk").href.split("installflags=")[0])+"installflags="+Q("aginsType").value}}function validateDeviceToMesh(){QE("idx_dlgOkButton",(Q("dp1devicename").value.length>0)&&(passwordcheck(Q("dp1password").value)))}function addDeviceToMeshEx(b,d){var a=Q("dp1username").value;if(a==""){a="admin"}var c=Q("dp1hostname").value;if(c==""){c=Q("dp1devicename").value}meshserver.send({action:"addamtdevice",meshid:d,devicename:Q("dp1devicename").value,hostname:c,amtusername:a,amtpassword:Q("dp1password").value,amttls:Q("dp1tls").value})}function deviceHeaderSet(){if(deviceHeaderId==0){deviceHeaderId=1;return}deviceHeaders["DevxHeader"+deviceHeaderId]=", "+deviceHeaderTotal+((deviceHeaderTotal==1)?" node":" nodes");deviceHeaderId++;deviceHeaderCount={};deviceHeaderTotal=0}var powerStateStrings=["",'<span title="Device is powered on.">Powered</span>','<span title="Device is in sleep state (S1).">Sleeping</span>','<span title="Device is in sleep state (S2).">Sleeping</span>','<span title="Device is in deep sleep state (S3).">Deep Sleep</span>','<span title="Device is in hibernating state (S4).">Hibernating</span>','<span title="Device is in powered off state (S5).">Soft-Off</span>','<span title="Device is detected but power state could not be obtained.">Present</span>'];var powerStateStrings2=["","Device is powered","Device is in sleep state (S1)","Device is in sleep state (S2)","Device is in deep sleep state (S3)","Device is hibernating (S4)","Device is in soft-off state (S5)","Device is present, but power state cannot be determined"];var powerColorTable=["#00000000","black","blue","blue","lightblue","blueviolet","darkgreen","lightseagreen","lightseagreen"];function NodeStateStr(a){var b=[];if(a.state>0&&a.state<powerStatetable.length){state.push(powerStatetable[a.state])}if(a.conn){if((a.conn&1)!=0){b.push('<span title="Mesh agent is connected and ready for use.">Agent</span>')}if((a.conn&2)!=0){b.push('<span title="Intel&reg; AMT CIRA is connected and ready for use.">CIRA</span>')}else{if((a.conn&4)!=0){b.push('<span title="Intel&reg; AMT is routable.">Intel&reg; AMT</span>')}}if((a.conn&8)!=0){b.push('<span title="Mesh agent is reachable using another agent as relay.">Relay</span>')}}if((a.pwr!=null)&&(a.pwr!=0)){b.push(powerStateStrings[a.pwr])}return b.join(", ")}function PowerStateStr(a){if(a<powerStatetable.length){return powerStatetable[a]}return""}function PowerStateStr2(a){if((a!=0)&&(a<powerStatetable.length)){return powerStatetable[a]}return"Unknown"}function selectallButtonFunction(){var b=document.getElementsByClassName("DeviceCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked===true){a++}}for(var c=0;c<b.length;c++){b[c].checked=(a==0)}p1updateInfo()}function p1updateInfo(){var b=document.getElementsByClassName("DeviceCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked===true){a++}}if(a>0){QE("GroupActionButton",true);Q("SelectAllButton").value="Select None";QV("cxmgroupsplit",true);QV("cxmdesktop",true)}else{QE("GroupActionButton",false);Q("SelectAllButton").value="Select All";QV("cxmgroupsplit",false);QV("cxmdesktop",false)}}function groupActionFunction(){var a="Select an operation to perform on all selected devices. Actions will be performed only with proper rights.<br /><br />";a+=addHtmlValue("Operation","<select id=d2groupop style=float:right;width:250px><option value=100>Wake-up devices</option><option value=4>Sleep devices</option><option value=3>Reset devices</option><option value=2>Power off devices</option><option value=102>Move to device group</option><option value=101>Delete devices</option></select>");setDialogMode(2,"Group Action",3,groupActionFunctionEx,a)}function getCheckedDevices(){var e=[],b=document.getElementsByClassName("DeviceCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked){if(b[c].value){var d=b[c].value.substring(6);if(e.indexOf(d)==-1){e.push(d)}}}}return e}function groupActionFunctionEx(){var a=Q("d2groupop").value;if(a==100){meshserver.send({action:"wakedevices",nodeids:getCheckedDevices()})}else{if(a==101){var b="Confirm delete selected devices(s)?<br /><br />";b+="<label><input id=d2check type=checkbox onchange=d2groupActionFunctionDelEx() />Confirm</label>";setDialogMode(2,"Delete Nodes",3,groupActionFunctionDelEx,b);QE("idx_dlgOkButton",false)}else{if(a==102){p10showChangeGroupDialog(getCheckedDevices())}else{meshserver.send({action:"poweraction",nodeids:getCheckedDevices(),actiontype:a})}}}}function d2groupActionFunctionDelEx(){QE("idx_dlgOkButton",Q("d2check").checked)}function groupActionFunctionDelEx(){meshserver.send({action:"removedevices",nodeids:getCheckedDevices()})}function onSortSelectChange(a){sort=document.getElementById("sortselect").selectedIndex;if(!a){putstore("sort",sort)}}function meshSort(c,d){if(c.meshnamel>d.meshnamel){return 1}if(c.meshnamel<d.meshnamel){return -1}if(c.meshid==d.meshid){if(showRealNames==true){if(c.rnamel>d.rnamel){return 1}if(c.rnamel<d.rnamel){return -1}return 0}else{if(c.namel>d.namel){return 1}if(c.namel<d.namel){return -1}return 0}}return 0}function powerSort(c,e){var d=c.pwr?c.pwr:0;var g=e.pwr?e.pwr:0;if(d>g){return -1}if(d<g){return 1}if(d==g){if(showRealNames==true){if(c.rnamel>e.rnamel){return 1}if(c.rnamel<e.rnamel){return -1}return 0}else{if(c.namel>e.namel){return 1}if(c.namel<e.namel){return -1}return 0}}return 0}function deviceSort(c,d){if(c.namel>d.namel){return 1}if(c.namel<d.namel){return -1}return 0}function deviceHostSort(c,d){if(c.rnamel>d.rnamel){return 1}if(c.rnamel<d.rnamel){return -1}return 0}function onSearchFocus(a){searchFocus=a}function onMapSearchFocus(a){mapSearchFocus=a}function onUserSearchFocus(a){userSearchFocus=a}function onConsoleFocus(a){consoleFocus=a}function onSearchInputChanged(){var m=Q("SearchInput").value.toLowerCase().trim();putstore("search",m);var l=null,g=null,c=null;if(m.startsWith("user:")){l=m.substring(5)}else{if(m.startsWith("u:")){l=m.substring(2)}else{if(m.startsWith("ip:")){g=m.substring(3)}else{if(m.startsWith("group:")){c=m.substring(6)}else{if(m.startsWith("g:")){c=m.substring(2)}}}}}if(m==""){for(var a in nodes){nodes[a].v=true}}else{if(g!=null){for(var a in nodes){nodes[a].v=((nodes[a].ip!=null)&&(nodes[a].ip.indexOf(g)>=0))}}else{if(c!=null){for(var a in nodes){nodes[a].v=(meshes[nodes[a].meshid].name.toLowerCase().indexOf(c)>=0)}}else{if(l!=null){for(var a in nodes){nodes[a].v=false;if(nodes[a].users&&nodes[a].users.length>0){for(var e in nodes[a].users){if(nodes[a].users[e].toLowerCase().indexOf(l)>=0){nodes[a].v=true}}}}}else{try{var h=m.split(/\s+/).join("|"),j=new RegExp(h);for(var a in nodes){nodes[a].v=(j.test(nodes[a].name.toLowerCase()))||(nodes[a].rnamel!=null&&j.test(nodes[a].rnamel.toLowerCase()));if((nodes[a].v==false)&&nodes[a].tags){for(var k in nodes[a].tags){if(j.test(nodes[a].tags[k].toLowerCase())){nodes[a].v=true;break}else{nodes[a].v=false}}}}}catch(b){for(var a in nodes){nodes[a].v=true}}}}}}}var contextelement=null;function handleContextMenu(d){hideContextMenu();var m=(window.pageXOffset!==null)?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft;var n=(window.pageYOffset!==null)?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;var c=document.elementFromPoint(d.pageX-m,d.pageY-n);if(c&&c!=null&&c.id=="MxMESH"){contextelement=c;var b=document.getElementById("meshContextMenu");b.style.left=d.pageX+"px";b.style.top=d.pageY+"px";b.style.display="block"}else{while(c&&c!=null&&c.id!="devs"){c=c.parentElement}if(!c||c==null){return true}contextelement=c;var b=document.getElementById("contextMenu");b.style.left=d.pageX+"px";b.style.top=d.pageY+"px";b.style.display="block"}var l=contextelement.children[1].attributes.onclick.value;var k=getNodeFromId(l.substring(12,l.length-18));var g=meshes[k.meshid];var h=g.links["user/"+domain+"/"+userinfo.name.toLowerCase()];var j=h.rights;var a=((j&16)!=0);var o=((j==4294967295)||((j&512)==0));var e=((j==4294967295)||((j&1024)==0));QV("cxdesktop",((g.mtype==1)||(k.agent==null)||(k.agent.caps==null)||((k.agent.caps&1)!=0)||(k.intelamt&&(k.intelamt.state==2)))&&((j&8)||(j&256)));QV("cxterminal",((g.mtype==1)||(k.agent==null)||(k.agent.caps==null)||((k.agent.caps&2)!=0)||(k.intelamt&&(k.intelamt.state==2)))&&(j&8)&&o);QV("cxfiles",((g.mtype==2)&&((k.agent==null)||(k.agent.caps==null)||((k.agent.caps&4)!=0)))&&(j&8)&&e);QV("cxevents",(k.intelamt!=null)&&((k.intelamt.state==2)||(k.conn&2))&&(j&8));QV("cxconsole",(a&&(g.mtype==2)&&((k.agent==null)||(k.agent.caps==null)||((k.agent.caps&8)!=0)))&&(j&8));return haltEvent(d)}function cmaction(a,b){var c=contextelement.children[1].attributes.onclick.value;c=c.substring(12,c.length-18);if(a==7){Q("viewselect").value=3;Q("viewselect").onchange();Q("autoConnectDesktopCheckbox").checked=true;Q("autoConnectDesktopCheckbox").onclick()}if((a>0)&&(a<7)){var d=[0,10,12,11,13,16,15][a];if(b&&(b.shiftKey==true)){window.open(window.location.origin+"?node="+c.split("/")[2]+"&viewmode="+d+"&hide=16","meshcentral:"+c)}else{gotoDevice(c,d)}}}function cmmeshaction(a){var d=contextelement.attributes.onclick.value.substring(32,(32+69));var b=document.getElementsByClassName("DeviceCheckbox");if(a==1){for(var c=0;c<b.length;c++){if((b[c].attributes)&&(b[c].attributes["class"]["value"].substring(0,69)==d)){b[c].checked=true}}}if(a==2){for(var c=0;c<b.length;c++){if((b[c].attributes)&&(b[c].attributes["class"]["value"].substring(0,69)==d)){b[c].checked=false}}}p1updateInfo()}function hideContextMenu(){QV("contextMenu",false);QV("meshContextMenu",false);contextelement=null}var xxmap={map:null,contextmenu:null,activeInteractions:[],showindex:0,markersSource:null,markersLayer:null,mapLayer:null,mapView:null,};function updateMapMarkers(j){if((xxmap!=null)&&(xxmap.map==null)){try{loadmap()}catch(b){console.error("loadmap() exception",b)}}if(xxmap==null){return}var a=null;for(var d in nodes){try{var g=map_parseNodeLoc(nodes[d]),c=xxmap.markersSource.getFeatureById(nodes[d]._id);if((g!=null)&&((nodes[d].meshid==j)||(j==null))){var e=g[0],h=g[1],k=g[2];if(a==null){a=[e,h,e,h,0]}else{if(e<a[0]){a[0]=e}if(h<a[1]){a[1]=h}if(e>a[2]){a[2]=e}if(h>a[3]){a[3]=h}}if(c==null){addFeature(nodes[d]);a[4]=1}else{updateFeature(nodes[d],c);c.setStyle(markerStyle(nodes[d],g[2]))}}else{if(c){xxmap.markersSource.removeFeature(c)}}}catch(b){console.error("updateMapMarkers() exception",b,JSON.stringify(nodes[d]))}}return a}var map_cm_popup=new ol.Overlay({element:Q("xmap-info-window"),positioning:"bottom-center",stopEvent:false});var map_cm_editMarker={text:"Modify node location",callback:function(a){modifyMarkerloc(a.data)}};var map_cm_clearMarker={text:"Remove node location",callback:function(a){meshserver.send({action:"changedevice",nodeid:a.data.a,userloc:[]})}};var map_cm_saveMarker={text:"Save node location",callback:function(a){saveMarkerloc(a.data)}};var map_cm_nodemenu_items=[{text:"General information",callback:function(a){if(a.data!=null){gotoDevice(a.data,10)}}},{text:"Desktop",callback:function(a){if(a.data!=null){gotoDevice(a.data,11)}}},{text:"Terminal",callback:function(a){if(a.data!=null){gotoDevice(a.data,12)}}},{text:"Intel&reg; AMT",callback:function(a){if(a.data!=null){gotoDevice(a.data,14)}}},"-",{text:"Zoom-in to extent",callback:function(b){var a=b.data.getGeometry().getCoordinates();zoomToLocation(a,19)}},{text:"Zoom-out to extent",callback:function(b){var a=b.data.getGeometry().getCoordinates();zoomToLocation(a,2)}}];var contextmenu_items=[{text:"Refresh",callback:function(){refreshMap(true,true)}},{text:"Zoom to fit extent",callback:function(){zoomToFitExtent()}},{text:"Center map here",callback:function(a){xxmap.mapView.animate({center:a.coordinate})}},{text:"Place node here",callback:function(a){placeNode(a.coordinate)}}];function stringToIntHash(c){var a=0,b;for(b=0;b<c.length;b++){a=((a<<5)-a)+c.charCodeAt(b);a|=0}return a}function map_parseNodeLoc(b){var a=null,c=0;if(b.iploc){a=b.iploc;c=1}if(b.wifiloc){a=b.wifiloc;c=2}if(b.gpsloc){a=b.gpsloc;c=3}if(b.userloc){a=b.userloc;c=4}if((a==null)||(typeof a!="string")){return null}a=a.split(",");if(c==1){return[parseFloat(a[0])+(stringToIntHash(b._id.substring(0,20))/100000000000),parseFloat(a[1])+(stringToIntHash(b._id.substring(20))/100000000000),c]}else{return[parseFloat(a[0]),parseFloat(a[1]),c]}}function loadmap(){if(xxmap==null){return}if((features&32768)==0){QV("viewselectmapoption",false);QV("devViewButton4",false);xxmap=null;return}try{xxmap.markersSource=new ol.source.Vector();xxmap.markersLayer=new ol.layer.Vector({source:xxmap.markersSource});xxmap.mapLayer=new ol.layer.Tile({source:new ol.source.OSM()});xxmap.mapView=new ol.View({center:ol.proj.transform([0,0],"EPSG:4326","EPSG:3857"),zoom:2,minZoom:2,maxZoom:20,extent:ol.proj.transformExtent([-100000,-69.55,100000,69.55],"EPSG:4326","EPSG:3857")});xxmap.map=new ol.Map({target:"xdevicesmap",layers:[xxmap.mapLayer,xxmap.markersLayer],view:xxmap.mapView});xxmap.map.addOverlay(map_cm_popup);xxmap.map.on("click",function(c){var d=xxmap.map.forEachFeatureAtPixel(c.pixel,function(h,j){return h});if(d){var g=d.getId();if(g!=null){gotoDevice(g,10)}else{var e=getCorrespondingFeature(d);gotoDevice(e.getId(),10)}}});xxmap.map.on("pointermove",function(d){var g=xxmap.map.forEachFeatureAtPixel(d.pixel,function(j,k){return j});if(g){xxmap.map.getTargetElement().style.cursor="pointer";var c=g.getGeometry().getCoordinates();map_cm_popup.setPosition(c);var e=g.getId();if(e){QH("xmap-info-window",g.get("name"))}else{var h=getCorrespondingFeature(g);QH("xmap-info-window",h.get("name"))}}else{xxmap.map.getTargetElement().style.cursor="";QH("xmap-info-window","")}});var a=new ContextMenu({width:160,defaultItems:false,items:contextmenu_items});a.on("open",function(c){var e=xxmap.map.forEachFeatureAtPixel(c.pixel,function(h,j){return h});xxmap.contextmenu.clear();if(e){var d=e.getId();if(d){addContextMenuItems(e)}else{var g=getCorrespondingFeature(e);if(g){addContextMenuItems(g)}else{xxmap.contextmenu.extend(contextmenu_items)}}}else{xxmap.contextmenu.extend(contextmenu_items)}});if(xxmap.contextmenu==null){xxmap.contextmenu=a}xxmap.map.addControl(xxmap.contextmenu)}catch(b){console.log(b);QV("viewselectmapoption",false);QV("devViewButton4",false);xxmap=null}}function addFeature(g,c,e){var a=getModifiedFeature(g._id);if(a){xxmap.markersSource.addFeature(a)}else{if(!c&&!e){var d=map_parseNodeLoc(g);c=d[0];e=d[1]}if(e>180){e=180-e;meshserver.send({action:"changedevice",nodeid:g._id,userloc:[c,e]})}if((c<90)&&(c>-90)&&(e<180)&&(e>-180)){var b=new ol.Feature({geometry:new ol.geom.Point(ol.proj.transform([e,c],"EPSG:4326","EPSG:3857")),name:g.name,status:g.conn,lat:c,lon:e});b.setId(g._id);b.setStyle(markerStyle(g));xxmap.markersSource.addFeature(b)}}}function removeFeature(b){var a=xxmap.markersSource.getFeatureById(b._id);if(a){xxmap.markersSource.removeFeature(a)}}function updateFeature(g,a){if(g.conn!=a.get("status")){a.set("status",g.conn);a.setStyle(markerStyle(g))}var c=map_parseNodeLoc(g);if(c!=null){var b=c[0],d=c[1];if((b!=a.get("lat"))||(d!=a.get("lon"))){a.set("lat",b);a.set("lon",d);var e=ol.proj.transform([parseFloat(d),parseFloat(b)],"EPSG:4326","EPSG:3857");a.getGeometry().setCoordinates(e)}}if(g.name!=a.get("name")){a.set("name",g.name)}}function modifyMarkerloc(c){var b=c.getId();if(b){c.setStyle(markerStyle(getNodeFromId(c.a),4));if(!getActiveInteractions(c)){var a=new ol.interaction.Modify({features:new ol.Collection([c]),pixelTolerance:10});xxmap.activeInteractions.push({featureid:b,feature:c,interaction:a});xxmap.map.addInteraction(a)}}}function saveMarkerloc(d){var c=d.getId();if(c){var a=getActiveInteractions(d);if(a){xxmap.map.removeInteraction(a);removeInteraction(c);var b=d.getGeometry().getCoordinates();var e=ol.proj.transform(b,"EPSG:3857","EPSG:4326");if(e[0]>180){e[0]=180-e[0]}var g=[e[1],e[0]];meshserver.send({action:"changedevice",nodeid:c,userloc:g})}}}function markerStyle(b,d){if(d==null){d=0;if(b.iploc){d=1}if(b.wifiloc){d=2}if(b.gpsloc){d=3}if(b.userloc){d=4}}var e=["","-ip","-wifi","-gps","-user"];var a=connStateColor(b);var c=new ol.style.Style({image:new ol.style.Icon({color:a,anchor:[0.5,1],src:"images/mapmarker"+e[d]+".png"})});return[c]}function connStateColor(a){if(a.conn==1||a.conn==3||a.conn==5){return"#00ffdd"}return"#C70039"}function addContextMenuItems(a){if(getActiveInteractions(a)){map_cm_saveMarker.data=a;xxmap.contextmenu.push(map_cm_saveMarker)}else{map_cm_editMarker.data=a;xxmap.contextmenu.push(map_cm_editMarker);var b=getNodeFromId(a.a);if(b.userloc){map_cm_clearMarker.data=a;xxmap.contextmenu.push(map_cm_clearMarker)}}map_cm_nodemenu_items.forEach(function(c){if(c.text=="Zoom-in to extent"||c.text=="Zoom-out to extent"){c.data=a}else{if(c!="-"){c.data=a.getId()}}});xxmap.contextmenu.extend(map_cm_nodemenu_items)}function getActiveInteractions(b){var a=b.getId();for(var c=0;c<xxmap.activeInteractions.length;c++){if(xxmap.activeInteractions[c].featureid==a){return xxmap.activeInteractions[c].interaction}}return false}function getModifiedFeature(a){if(a){for(var b=0;b<xxmap.activeInteractions.length;b++){if(xxmap.activeInteractions[b].featureid==a){return xxmap.activeInteractions[b].feature}}}return null}function removeInteraction(a){var c=-1;for(var b=0;b<xxmap.activeInteractions.length;b++){if(xxmap.activeInteractions[b].featureid===a){c=b;break}}if(c>=0){xxmap.activeInteractions.splice(c,1)}}function getCorrespondingFeature(e){var d=e.getGeometry().getCoordinates();for(var b=0;b<xxmap.activeInteractions.length;b++){var c=xxmap.activeInteractions[b].feature;var a=c.getGeometry().getCoordinates();if(a[0].toFixed(5)==d[0].toFixed(5)&&a[1].toFixed(5)==d[1].toFixed(5)){return c}}return null}function refreshMap(k,h){if(k){xxmap.map.setTarget(null);xxmap.map=null;xxmap.markersSource=null;xxmap.mapView=null;xxmap.mapLayer=null;xxmap.activeInteractions=[]}var a=updateMapMarkers();if((a!=null)&&(h||(a[4]==1))){var b=(a[0]+a[2])/2;var c=(a[1]+a[3])/2;var d=Math.max(Math.abs(a[0]-a[2]),Math.abs(a[1]-a[3]));var l=xxmap.map.getView();l.setCenter(ol.proj.transform([c,b],"EPSG:4326","EPSG:3857"));var e=360,g=-2;while(e>d){g++;e=e/2}l.setZoom(g)}}function placeNode(a){if(xxdialogMode){return}var c='<div style=margin-bottom:6px><label for=selectnode-search>Search</label>&nbsp&nbsp<input type=text placeholder="Device name" id="selectnode-search" onchange=onPlaceNodeInputChange() onkeyup=onPlaceNodeInputChange() autocomplete=off style=width:120px></div><div id=placenode style="height:254px;overflow-y:auto;width:100%;margin:12px 1px 4px 1px;"><div id=noNodesMapPlace style=text-align:center;width:100%;display:none>No devices found.</div>';for(var b in nodes){c+="<div class=noselect id="+nodes[b]._id+"-rowid onclick=selectNodeToPlace(event,'"+nodes[b]._id+"') style=background-color:lightgray;margin-bottom:4px;border-radius:2px><input name=PlaceMapDeviceCheckbox id="+nodes[b]._id+"-checkid type=checkbox style=width:16px;display:inline />";c+="<div class=j"+nodes[b].icon+" style=width:16px;height:16px;margin-top:2px;margin-right:4px;display:inline-block></div><div style=width:16px;display:inline>"+nodes[b].name+"</div></div>"}setDialogMode(2,"Select a node to place",3,placeNodeEx,c+"</div>",a);onPlaceNodeInputChange()}function placeNodeEx(b,c){var d=document.getElementsByName("PlaceMapDeviceCheckbox");for(var g in d){if(d[g].checked){var h=getNodeFromId(d[g].id.substring(0,d[g].id.length-8));if(h){var e=xxmap.markersSource.getFeatureById(g);var j=ol.proj.transform(c,"EPSG:3857","EPSG:4326");var k=[j[1],j[0]];if(e){e.getGeometry().setCoordinates(c);var a=getActiveInteractions(e);if(a){saveMarkerloc(e)}else{meshserver.send({action:"changedevice",nodeid:h._id,userloc:k})}}else{meshserver.send({action:"changedevice",nodeid:h._id,userloc:k})}}}}}function onPlaceNodeInputChange(){updatePlaceNodeTable(Q("selectnode-search").value.trim().toLowerCase())}function updatePlaceNodeTable(d){var b=document.getElementsByName("PlaceMapDeviceCheckbox"),a=0;for(var c in nodes){var e=((nodes[c].namel.indexOf(d)>=0||d=="")||(nodes[c].rnamel!=null&&nodes[c].rnamel.indexOf(d)>=0));if(e){a++}QV(nodes[c]._id+"-rowid",e)}QV("noNodesMapPlace",a==0)}function selectNodeToPlace(b,g){if(b.target.name!="PlaceMapDeviceCheckbox"){var h=Q(g+"-checkid");h.checked=!h.checked}var c=document.getElementsByName("PlaceMapDeviceCheckbox"),a=0;for(var d in c){if(c[d].checked){a++}}QE("idx_dlgOkButton",a>0)}function addMeshOptions(a,b){}function meshOptionRmvMod(a,b){}function meshExists(){for(var a in meshes){if(meshes[a]){return true}}return false}function setMeshView(a){var c=Q("select-mesh");var b=c.selectedIndex;if(c[b].value==a){c[0].selected=true;onSelectMeshChange()}}function clearMeshOptions(){}function getSearchLocation(){try{var b=Q("mapSearchLocation").value.trim();if(b.length>0){var c=new XMLHttpRequest();c.onreadystatechange=function(){if(c.readyState==4&&c.status==200){formatSearchData(c.responseText)}};c.open("GET","https://nominatim.openstreetmap.org/search?q="+b+"&format=json",true);c.send()}}catch(a){}}function formatSearchData(c){try{QH("xmapSearchResults","");var d=JSON.parse(c),b=0,k='<div style="overflow-y:auto;width:100%;max-height:240px">';for(var j=0;j<d.length;j++){if(d[j].display_name&&d[j].boundingbox[0]&&d[j].boundingbox[1]&&d[j].boundingbox[2]&&d[j].boundingbox[3]){b++;var a=(j%2==0)?"F5F5F5":"EBEBEB";k+="<div style=cursor:pointer;padding:5px;background-color:#"+a+" onclick=mapGotoSelectedLocation(this)><div>"+d[j].display_name+"</div><div style=display:none>"+d[j].boundingbox[0]+"!#!"+d[j].boundingbox[1]+"!#!"+d[j].boundingbox[2]+"!#!"+d[j].boundingbox[3]+"</div></div>"}}k+="</div>";if(b==1){var h=[parseFloat(d[0].boundingbox[2]),parseFloat(d[0].boundingbox[0]),parseFloat(d[0].boundingbox[3]),parseFloat(d[0].boundingbox[1])];zoomToExtent(h)}else{if(b==0){k="<div style=width:200px>No location found.<div>"}QV("xmapSearchResultsDlg",true)}QH("xmapSearchResults",k)}catch(g){}}function mapGotoSelectedLocation(c){var d=c.children;var a=d[1].innerHTML.split("!#!");var b=[parseFloat(a[2]),parseFloat(a[0]),parseFloat(a[3]),parseFloat(a[1])];zoomToExtent(b);mapCloseSearchWindow()}function mapCloseSearchWindow(){QH("xmapSearchResults","");QV("xmapSearchResultsDlg",false)}function zoomToLocation(a,c){var b=xxmap.map.getView();b.setCenter(a);b.setZoom(c)}function zoomToFitExtent(){var b=xxmap.markersSource.getFeatures();if(b.length>0){var a=xxmap.markersSource.getExtent();xxmap.map.getView().fit(a,xxmap.map.getSize())}}function zoomToExtent(b){var a=ol.proj.transformExtent(b,ol.proj.get("EPSG:4326"),ol.proj.get("EPSG:3857"));xxmap.map.getView().fit(a,xxmap.map.getSize())}function refreshDevice(a){if(!currentNode||currentNode._id!=a){return}gotoDevice(a,xxcurrentView,true)}function getNodeRights(c){var b=getNodeFromId(c),a=meshes[b.meshid];return a.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights}var currentNode;var powerTimelineNode=null;var powerTimelineReq=null;var powerTimelineUpdate=null;var powerTimeline=null;function getCurrentNode(){return currentNode}function gotoDevice(r,t,w,j){if((userinfo.emailVerified!==true)&&(serverinfo.emailcheck==true)&&(userinfo.siteadmin!=4294967295)){setDialogMode(2,"New Device Group",1,null,'Unable to create a new device group until a email address is verified. This is required for password recovery. Go to the "My Account" tab to change and verify an email address.');return}if(j&&(j.shiftKey==true)){window.open(window.location.origin+"?node="+r.split("/")[2]+"&viewmode=10&hide=16","meshcentral:"+r);return}var q=getNodeFromId(r);var n=meshes[q.meshid];var o=n.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;if(!currentNode||currentNode._id!=q._id||w==true){currentNode=q;var p=EscapeHtml(q.name);if(p.length==0){p="<i>None</i>"}if((o&4)!=0){p='<span title="Click here to edit the server-side device name" onclick=showEditNodeValueDialog(0) style=cursor:pointer>'+p+' <img class=hoverButton width=10 height=10 src="images/link5.png" /></span>'}QH("p10deviceName",p);QH("p11deviceName",p);QH("p12deviceName",p);QH("p13deviceName",p);QH("p14deviceName",p);QH("p15deviceName","Console - "+p);QH("p16deviceName",p);var B="<table style=width:100%>";B+=addDeviceAttribute('<span title="The name of the device group this computer belong to.">Group</span>','<a title="The name of the device group this computer belong to" onclick=gotoMesh("'+q.meshid+'") style=cursor:pointer>'+EscapeHtml(meshes[q.meshid].name)+"</a>");if((q.rname!=null)&&(q.name!=q.rname)){B+=addDeviceAttribute('<span title="The name of this computer as set in the operating system">Name</span>','<span title="The name of this computer as set in the operating system">'+EscapeHtml(q.rname)+"</span>")}if((features&1)==0){if((o&4)!=0){if(q.host){B+=addDeviceAttribute("Hostname","<span onclick=showEditNodeValueDialog(1) style=cursor:pointer>"+EscapeHtml(q.host)+"</span>")}else{B+=addDeviceAttribute("Hostname","<span onclick=showEditNodeValueDialog(1) style=cursor:pointer><i>None</i></span>")}}else{B+=addDeviceAttribute("Hostname",EscapeHtml(q.host))}}var h=q.desc?EscapeHtml(q.desc):"<i>None</i>";if((o&4)!=0){B+=addDeviceAttribute("Description","<span onclick=showEditNodeValueDialog(2) style=cursor:pointer>"+h+' <img class=hoverButton width=10 height=10 src="images/link5.png" /></span>')}else{B+=addDeviceAttribute("Description",h)}var a=["Unknown","Windows 32bit console","Windows 64bit console","Windows 32bit service","Windows 64bit service","Linux 32bit","Linux 64bit","MIPS","XENx86","Android ARM","Linux ARM","OSX 32bit","Android x86","PogoPlug ARM","Android APK","Linux Poky x86-32bit","OSX 64bit","ChromeOS","Linux Poky x86-64bit","Linux NoKVM x86-32bit","Linux NoKVM x86-64bit","Windows MinCore console","Windows MinCore service","NodeJS","ARM-Linaro","ARMv6l / ARMv7l"];if((q.agent!=null)&&(q.agent.id!=null)&&(q.agent.ver!=null)){var y="";if(q.agent.id<=a.length){y=a[q.agent.id]}else{y=a[0]}if(q.agent.ver!=0){y+=" v"+q.agent.ver}B+=addDeviceAttribute("Mesh Agent",y)}if(q.intelamt!=null){var y="";var v={0:"Not Activated (Pre)",1:"Not Activated (In)",2:"Activated"};if(q.intelamt.ver!=null&&q.intelamt.state==null){y+="<i>Unknown State</i>, v"+q.intelamt.ver}else{if((q.intelamt.ver==null)&&(q.intelamt.state==2)){y+="<i>Activated</i>"}else{if((q.intelamt.ver==null)||(q.intelamt.state==null)){y+="<i>Unknown Version & State</i>"}else{y+=v[q.intelamt.state];if((q.intelamt.state==2)&&q.intelamt.flags){if(q.intelamt.flags&2){y+=' <span title="Intel AMT is activated in Client Control Mode">CCM</span>'}else{if(q.intelamt.flags&4){y+=' <span title="Intel AMT is activated in Admin Control Mode">ACM</span>'}}}y+=(", v"+q.intelamt.ver)}}}if(q.intelamt.tls==1){y+=', <span title="Intel AMT is setup with TLS network security">TLS</span>'}if(q.intelamt.state==2){if(q.intelamt.user==null||q.intelamt.user==""){if((o&4)!=0){y+=', <i style=color:#FF0000;cursor:pointer title="Edit Intel&reg; AMT credentials" onclick=editDeviceAmtSettings("'+q._id+'")>No Credentials</i>'}else{y+=", <i style=color:#FF0000>No Credentials</i>"}}y+=" ";if((o&4)!=0){y+='<img src=images/link4.png height=10 width=10 title="Edit Intel&reg; AMT credentials" style=cursor:pointer onclick=editDeviceAmtSettings("'+q._id+'")>'}}B+=addDeviceAttribute("Intel&reg; AMT",y)}if((q.agent!=null)&&(q.agent.tag!=null)&&(q.agent.tag!="mailto:")){var z=EscapeHtml(q.agent.tag);if(z.startsWith("mailto:")){z='<a href="'+z+'">'+z.substring(7)+"</a>"}B+=addDeviceAttribute("Agent Tag",z)}if(q.osdesc){B+=addDeviceAttribute("Operating System",q.osdesc)}if(q.users&&q.conn&&(q.users.length>0)&&(q.conn&1)){B+=addDeviceAttribute("Active User"+((q.users.length>1)?"s":""),q.users.join(", "))}var d=q.conn;if(d&&d>1){var g=[];if((q.conn&1)!=0){g.push('<span title="Mesh agent is connected and ready for use.">Mesh Agent</span>')}if((q.conn&2)!=0){g.push('<span title="Intel&reg; AMT CIRA is connected and ready for use.">Intel&reg; AMT CIRA</span>')}else{if((q.conn&4)!=0){g.push('<span title="Intel&reg; AMT is routable and ready for use.">Intel&reg; AMT</span>')}}if((q.conn&8)!=0){g.push('<span title="Mesh agent is reachable using another agent as relay.">Mesh Relay</span>')}B+=addDeviceAttribute("Connectivity",g.join(", "))}var l="<i>None</i>";if(q.tags!=null){l="";for(var m in q.tags){l+='<span style="background-color:lightgray;padding:3px;margin-right:4px;border-radius:5px">'+q.tags[m]+"</span>"}}B+=addDeviceAttribute("Tags","<span onclick=showEditNodeValueDialog(3) style=cursor:pointer>"+l+' <img class=hoverButton width=10 height=10 src="images/link5.png" /></span>');B+="</table><br />";if((o&76)!=0){B+='<input type=button value=Actions title="Perform power actions on the device" onclick=deviceActionFunction() />'}B+='<input type=button value=Notes title="View notes about this device" onclick=showNotes('+((o&128)==0)+',"'+encodeURIComponent(q._id)+'") />';QH("p10html",B);masterUpdate(256);B="<div style=float:right;font-size:x-small>";if((o&4)!=0){B+='&nbsp;<a style=cursor:pointer onclick=p10showChangeGroupDialog(["'+q._id+'"]) title="Move this device to a different device group">Change Group</a>';B+='&nbsp;<a style=cursor:pointer onclick=p10showDeleteNodeDialog("'+q._id+'") title="Remove this device">Delete Device</a>'}B+="</div><div style=font-size:x-small>";if(n.mtype==2){B+='<a style=cursor:pointer onclick=p10showNodeNetInfoDialog("'+q._id+'") title="Show device network interface information">Interfaces</a>&nbsp;'}if(xxmap!=null){B+='<a style=cursor:pointer onclick=p10showNodeLocationDialog("'+q._id+'") title="Show device locations information">Location</a>&nbsp;'}if(((o&8)!=0)&&(n.mtype==2)){B+='<a style=cursor:pointer onclick=p10showMeshCmdDialog(1,"'+q._id+'") title="Traffic router used to connect to a device thru this server.">Router</a>&nbsp;'}if(((d&1)!=0)&&(clickOnce==true)&&(n.mtype==2)&&((o&8)!=0)){if((q.agent.id>0)&&(q.agent.id<5)){B+='<a style=cursor:pointer onclick=p10clickOnce("'+q._id+'","RDP2",3389) title="Requires Microsoft ClickOnce support in your browser.">RDP</a>&nbsp;'}if(q.agent.id>4){B+='<a style=cursor:pointer onclick=p10clickOnce("'+q._id+'","PSSH",22) title="Requires Microsoft ClickOnce support in your browser.">Putty</a>&nbsp;';B+='<a style=cursor:pointer onclick=p10clickOnce("'+q._id+'","WSCP",22) title="Requires Microsoft ClickOnce support in your browser.">WinSCP</a>&nbsp;'}}B+="</div><br>";QH("p10html3",B);var u=PowerStateStr(q.state);if((d&1)!=0){if(u.length>0){u+="<br/>"}u+='<span style=font-size:12px title="Agent connected">Agent connected</span>'}if((d&2)!=0){if(u.length>0){u+="<br/>"}u+='<span style=font-size:12px title="Intel&reg; AMT connected">Intel&reg; AMT connected</span>'}else{if((d&4)!=0){if(u.length>0){u+="<br/>"}u+='<span style=font-size:12px title="Intel&reg; AMT detected">Intel&reg; AMT detected</span>'}}if((u=="")&&q.lastconnect){u="<span style=font-size:12px>Last seen:<br />"+new Date(q.lastconnect).toLocaleDateString()+", "+new Date(q.lastconnect).toLocaleTimeString()+"</span>"}QH("MainComputerState",u);Q("MainComputerImage").setAttribute("src","images/icons200-"+q.icon+"-1.jpg");Q("MainComputerImage").className=((!q.conn)||(q.conn==0)?"gray":"");var A=((o==4294967295)||((o&512)==0));var k=((o==4294967295)||((o&1024)==0));var b=((o==4294967295)||((o&2048)==0));if(A){setupTerminal()}if(k){setupFiles()}var e=((o&16)!=0);if(e){setupConsole()}else{if(t==15){t=10}}QV("MainDevDesktop",((n.mtype==1)||(q.agent==null)||(q.agent.caps==null)||((q.agent.caps&1)!=0)||(q.intelamt&&(q.intelamt.state==2)))&&((o&8)||(o&256)));QV("MainDevTerminal",((n.mtype==1)||(q.agent==null)||(q.agent.caps==null)||((q.agent.caps&2)!=0)||(q.intelamt&&(q.intelamt.state==2)))&&(o&8)&&A);QV("MainDevFiles",((n.mtype==2)&&((q.agent==null)||(q.agent.caps==null)||((q.agent.caps&4)!=0)))&&(o&8)&&k);QV("MainDevAmt",(q.intelamt!=null)&&((q.intelamt.state==2)||(q.conn&2))&&(o&8)&&b);QV("MainDevConsole",(e&&(n.mtype==2)&&((q.agent==null)||(q.agent.caps==null)||((q.agent.caps&8)!=0)))&&(o&8));QV("p15uploadCore",(q.agent!=null)&&(q.agent.caps!=null)&&((q.agent.caps&16)!=0));QH("p15coreName",((q.agent!=null)&&(q.agent.core!=null))?q.agent.core:"");var c=Q("p14iframe").contentWindow.getCurrentMeshNode();if((c!=null)&&(c._id!=currentNode._id)){Q("p14iframe").contentWindow.disconnect()}var s=((q.conn&6)!=0)?true:false;Q("p14iframe").contentWindow.setConnectionState(s);Q("p14iframe").contentWindow.setFrameHeight("650px");Q("p14iframe").contentWindow.setAuthCallback(updateAmtCredentials);QV("deskActionsBtn",(o&72)!=0);QV("termActionsBtn",(o&72)!=0);QV("filesActionsBtn",(o&72)!=0);if((powerTimelineNode!=currentNode._id)&&(powerTimelineReq!=currentNode._id)){QH("p10html2","");powerTimelineReq=currentNode._id;meshserver.send({action:"powertimeline",nodeid:currentNode._id});meshserver.send({action:"lastconnect",nodeid:currentNode._id})}QV("DeskTools",false);showDeskToolsProcesses();refreshDeviceEvents();if((currentNode)&&(xxcurrentView>=10)&&(xxcurrentView<20)){document.title="MeshCentral - "+currentNode.name}else{document.title="MeshCentral"}}setupDesktop();if(!t){t=10}go(t)}function showNotes(b,a){if(xxdialogMode){return}setDialogMode(2,"Notes",2,showNotesEx,"<textarea id=d2devNotes ro="+b+" noteid="+a+" readonly style=background-color:#fcf3cf;width:100%;height:200px;resize:none;overflow-y:scroll></textarea><span style=font-size:10px>Notes can be viewed and changed by other administrators.<span>",a);meshserver.send({action:"getNotes",id:decodeURIComponent(a)})}function showNotesEx(a,b){meshserver.send({action:"setNotes",id:decodeURIComponent(b),notes:encodeURIComponent(Q("d2devNotes").value)})}function deviceChat(){if(xxdialogMode){return}var a="/messenger?id=meshmessenger/"+encodeURIComponent(currentNode._id)+"/"+encodeURIComponent(userinfo._id)+"&title="+currentNode.name;if((authCookie!=null)&&(authCookie!="")){a+="&auth="+authCookie}window.open(a,"meshmessenger:"+currentNode._id);meshserver.send({action:"meshmessenger",nodeid:decodeURIComponent(currentNode._id)})}function deviceUrlFunction(){if(xxdialogMode){return}setDialogMode(2,"Open Page on Device",3,deviceUrlFunctionEx,'<input id=d2devurl placeholder="http://server.com" style=width:100%;overflow-y:scroll></input>')}function deviceUrlFunctionEx(){meshserver.send({action:"msg",type:"openUrl",nodeid:currentNode._id,url:Q("d2devurl").value})}function deviceToastFunction(){if(xxdialogMode){return}setDialogMode(2,"Device Notification",3,deviceToastFunctionEx,"<textarea id=d2devToast style=width:100%;height:80px;resize:none;overflow-y:scroll></textarea>")}function deviceToastFunctionEx(){meshserver.send({action:"toast",nodeids:[currentNode._id],title:"MeshCentral",msg:Q("d2devToast").value})}function deviceActionFunction(){if(xxdialogMode){return}var a=meshes[currentNode.meshid].links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;var b="Select an operation to perform on this device.<br /><br />";var c="<select id=d2deviceop style=float:right;width:250px>";if((a&64)!=0){c+="<option value=100>Wake-up</option>"}if((a&8)!=0){c+="<option value=4>Sleep</option><option value=3>Reset</option><option value=2>Power off</option>"}c+="</select>";b+=addHtmlValue("Operation",c);setDialogMode(2,"Device Action",3,deviceActionFunctionEx,b)}function deviceActionFunctionEx(){var a=Q("d2deviceop").value;if(a==100){meshserver.send({action:"wakedevices",nodeids:[currentNode._id]})}else{meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:a})}}function updateAmtCredentials(a){var b=getNodeFromId(currentNode._id);if((a==true)||(b.intelamt.user==null)||(b.intelamt.user=="")){editDeviceAmtSettings(currentNode._id,updateAmtCredentialsEx)}else{Q("p14iframe").contentWindow.connectButtonfunctionEx()}}function updateAmtCredentialsEx(a,b){Q("p14iframe").contentWindow.connectButtonfunctionEx()}function updateDeviceTimeline(){if((meshserver.State!=2)||(powerTimelineNode==null)||(powerTimelineUpdate==null)||(currentNode==null)){return}if((powerTimelineNode==powerTimelineReq)&&(currentNode._id==powerTimelineNode)&&(powerTimelineUpdate<Date.now())){powerTimelineUpdate=null;meshserver.send({action:"powertimeline",nodeid:currentNode._id});meshserver.send({action:"lastconnect",nodeid:currentNode._id})}}function drawDeviceTimeline(){if((currentNode==null)||(xxcurrentView<10)||(xxcurrentView>19)){return}var s=null,o=Date.now();if(currentNode._id==powerTimelineNode){s=powerTimeline}var e=new Date();e.setHours(0,0,0,0);e=new Date(e.getTime()-(1000*60*60*24*6));var u=e.getTime();var t=[];if(s!=null&&s.length>1){t.push([0,s[1],s[0]]);var c=s[1];for(var m=2;m<s.length;m+=2){var p=s[m],k=o;if(s.length>(m+1)){k=s[m+1]}t.push([c,c+k,p]);c=c+k}}var A="",b=1,h=new Date();var w=Q("masthead").offsetWidth-(160+9+9+14);h.setHours(0,0,0,0);for(var m=0;m<7;m++){var g="",q=h.getTime(),l=q+(1000*60*60*24);for(var n in t){var a=t[n];if(isTimeBlockInside(q,l,a[0],a[1])==true){var y=Math.max(q,a[0]);var r=Math.min(Math.min(l,a[1]),o);var z=Math.round(((r-y)*w)/86400000);if(z>0){var v=powerStateStrings2[a[2]]+" from "+new Date(y).toLocaleTimeString()+" to "+new Date(r).toLocaleTimeString()+".";g+='<div title="'+v+'" style=display:table-cell;width:'+z+"px;background-color:"+powerColor(a[2])+";height:16px></div>"}}}A+="<tr style="+(((b%2)==0)?"background-color:#DDD":"")+"><td><div>&nbsp;"+h.toLocaleDateString()+"<div></div></div></td><td><div>"+g+"</div></td></tr>";++b;h=new Date(h.getTime()-(1000*60*60*24))}QH("p10html2",'<table style="color:black;background-color:#EEE;border-color:#AAA;border-width:1px;border-style:solid;border-collapse:collapse" border=0 cellpadding=2 cellspacing=0 width=100%><tbody><tr style=background-color:#AAAAAA;font-weight:bold><th scope=col style=text-align:center;width:150px>Day</th><th scope=col style=text-align:center>7 Day Power State</th></tr>'+A+"</tbody></table>")}function powerColor(a){if(a<powerColorTable.length){return powerColorTable[a]}return"yellow"}function isTimeBlockInside(d,c,b,a){if((b<d)&&(a>c)){return true}if((b>d)&&(b<c)){return true}if((a>d)&&(a<c)){return true}return false}function addDeviceAttribute(a,b){return"<tr><td class=style7 style=width:180px>"+a+"</td><td class=style9 style=max-width:400px;overflow:hidden>"+b+"</td></tr>"}function editDeviceAmtSettings(e,b){if(xxdialogMode){return}var g="",d=getNodeFromId(e),a=3,c=getNodeRights(e);if((c&4)==0){return}g+=addHtmlValue("Username",'<input id=dp10username style=width:230px maxlength=32 autocomplete=nope placeholder="admin" onchange=validateDeviceAmtSettings() onkeyup=validateDeviceAmtSettings() />');g+=addHtmlValue("Password","<input id=dp10password type=password style=width:230px autocomplete=nope maxlength=32 onchange=validateDeviceAmtSettings() onkeyup=validateDeviceAmtSettings() />");g+=addHtmlValue("Security","<select id=dp10tls style=width:236px><option value=0>No TLS security</option><option value=1>TLS security required</option></select>");if((d.intelamt.user!=null)&&(d.intelamt.user!="")){a=7}setDialogMode(2,"Edit Intel&reg; AMT credentials",a,editDeviceAmtSettingsEx,g,{node:d,func:b});if((d.intelamt.user!=null)&&(d.intelamt.user!="")){Q("dp10username").value=d.intelamt.user}else{Q("dp10username").value="admin"}Q("dp10tls").value=d.intelamt.tls;validateDeviceAmtSettings()}function validateDeviceAmtSettings(){QE("idx_dlgOkButton",passwordcheck(Q("dp10password").value))}function editDeviceAmtSettingsEx(c,d){if(c==2){meshserver.send({action:"changedevice",nodeid:d.node._id,intelamt:{user:"",pass:""}})}else{var b=Q("dp10username").value;if(b==""){b="admin"}var a=Q("dp10password").value;if(a==""){b=""}meshserver.send({action:"changedevice",nodeid:d.node._id,intelamt:{user:b,pass:a,tls:Q("dp10tls").value}});d.node.intelamt.user=b;d.node.intelamt.tls=Q("dp10tls").value;if(d.func){setTimeout(d.func,300)}}}function p10showChangeGroupDialog(e){if(xxdialogMode){return}var g=null;if(e.length==1){try{g=meshes[getNodeFromId(e[0])]._id}catch(b){}}var j="<select id=p10newGroup style=width:236px>",a=0;for(var c in meshes){var d=meshes[c].links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;if((meshes[c]._id!=g)&&(d&4)){a++;j+="<option value='"+meshes[c]._id+"'>"+meshes[c].name+"</option>"}}j+="</select>";if(a>0){var h=(e.length==1)?"Select a new group for this device<br /><br />":"Select a new group for selected devices<br /><br />";h+=addHtmlValue("New Device Group",j);setDialogMode(2,"Change Group",3,p10showChangeGroupDialogEx,h,e)}else{setDialogMode(2,"Change Group",1,null,"No other device group of same type exists.")}}function p10showChangeGroupDialogEx(a,c){meshserver.send({action:"changeDeviceMesh",nodeids:c,meshid:Q("p10newGroup").value})}function p10showDeleteNodeDialog(a){if(xxdialogMode){return}var b='Are you sure you want to delete node "'+EscapeHtml(currentNode.name)+'"?<br /><br />';b+="<label><input id=p10check type=checkbox onchange=p10validateDeleteNodeDialog() />Confirm</label>";setDialogMode(2,"Delete Node",3,p10showDeleteNodeDialogEx,b,a);p10validateDeleteNodeDialog()}function p10validateDeleteNodeDialog(){QE("idx_dlgOkButton",Q("p10check").checked)}function p10showDeleteNodeDialogEx(a,b){meshserver.send({action:"removedevices",nodeids:[b]})}function p10clickOnce(a,c,b){meshserver.send({action:"getcookie",nodeid:a,tcpport:b,tag:"clickonce",protocol:c})}var d2map=null;function p10showNodeLocationDialog(){if((xxdialogMode!=null)&&(xxdialogTag=="@xxmap")){setDialogMode(0)}else{if(xxdialogMode){return}}var m=[],n=["iploc","wifiloc","gpsloc","userloc"],a=null;for(var k in n){if(currentNode[n[k]]!=null){var j=currentNode[n[k]].split(","),h=parseFloat(j[0]),l=parseFloat(j[1]);if((h<90)&&(h>-90)&&(l<180)&&(l>-180)){var e=new ol.Feature({geometry:new ol.geom.Point(ol.proj.fromLonLat([l,h]))});e.setStyle(markerStyle(currentNode,parseInt(k)+1));m.push(e);if(a==null){a=[h,l,h,l,0]}else{if(h<a[0]){a[0]=h}if(l<a[1]){a[1]=l}if(h>a[2]){a[2]=h}if(l>a[3]){a[3]=l}}}}}var p=new ol.source.Vector({features:m});var o=new ol.layer.Vector({source:p});var q="<div id=d2map style=width:100%;height:300px></div>";setDialogMode(2,"Device Location",1,null,q,"@xxmap");var c=0,b=0,r=8;if(a!=null){var b=(a[0]+a[2])/2;var c=(a[1]+a[3])/2;var d=Math.max(Math.abs(a[0]-a[2]),Math.abs(a[1]-a[3]));var g=360,r=-2;while(g>d){r++;g=g/2}}if(m.length==1){r=8}d2map=new ol.Map({target:"d2map",interactions:ol.interaction.defaults({dragPan:false,mouseWheelZoom:false}),layers:[new ol.layer.Tile({source:new ol.source.OSM()}),o],view:new ol.View({center:ol.proj.fromLonLat([c,b]),zoom:r})})}function p10showNodeNetInfoDialog(){if(xxdialogMode){return}setDialogMode(2,"Network Interfaces",1,null,"<div id=d2netinfo>Loading...</div>","if"+currentNode._id);meshserver.send({action:"getnetworkinfo",nodeid:currentNode._id})}function p10showMeshCmdDialog(a,b){if(xxdialogMode){return}var d="<select id=aginsSelect onclick=meshCmdOsClick() style=width:236px>";d+="<option value=3>Windows (32bit)</option>";d+="<option value=4>Windows (64bit)</option>";d+="<option value=5>Linux x86 (32bit)</option>";d+="<option value=6>Linux x86 (64bit)</option>";d+="<option value=25>Linux ARM, Raspberry Pi (32bit)</option>";d+="</select>";var c="";if(a==0){c+="<div>MeshCmd is a command line tool that performs lots of different operations. The action file can optionally be downloaded and edited to provide server information and credentials.<br /><br />"}if(a==1){c+='<div>Download "meshcmd" with an action file to route traffic thru this server to this device. Make sure to edit meshaction.txt and add your account password or make any changes needed.<br /><br />'}c+=addHtmlValue("Operating System",d);c+=addHtmlValue("MeshCmd",'<a id=meshcmddownloadid style=cursor:pointer onclick=fileDownload("meshagents?meshcmd=","MeshCmd",2)></a>');if(a==0){c+=addHtmlValue("Action File",'<a style=cursor:pointer onclick=fileDownload("meshagents?meshaction=generic","MeshAction.txt")>MeshAction (.txt)</a>')}if(a==1){c+=addHtmlValue("Action File",'<a style=cursor:pointer onclick=fileDownload("meshagents?meshaction=route&nodeid='+b+'","MeshAction.txt")>MeshAction (.txt)</a>')}c+="</div>";setDialogMode(2,["Download MeshCmd","Network Router"][a],9,null,c,"fileDownload");meshCmdOsClick()}function meshCmdOsClick(){var a=Q("aginsSelect").value,b="";if(a==3){b="MeshCmd (Win32 executable)"}if(a==4){b="MeshCmd (Win64 executable)"}if(a==5){b="MeshCmd (Linux x86, 32bit)"}if(a==6){b="MeshCmd (Linux x86, 64bit)"}if(a==25){b="MeshCmd (Linux ARM, 32bit)"}QH("meshcmddownloadid",b)}function p10showiconselector(){if(xxdialogMode){return}var a=meshes[currentNode.meshid];var b=a.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;if((b&4)==0){return}var c="<br><div style=display:inline-block;width:40px></div>";c+="<div style=display:inline-block class=i1 onclick=p10setIcon(1)></div>";c+="<div style=display:inline-block class=i2 onclick=p10setIcon(2)></div>";c+="<div style=display:inline-block class=i3 onclick=p10setIcon(3)></div>";c+="<div style=display:inline-block class=i4 onclick=p10setIcon(4)></div>";c+="<div style=display:inline-block class=i5 onclick=p10setIcon(5)></div>";c+="<div style=display:inline-block class=i6 onclick=p10setIcon(6)></div><br><br>";setDialogMode(2,"Icon Selection",0,null,c);QV("id_dialogclose",true)}function p10setIcon(a){setDialogMode(0);meshserver.send({action:"changedevice",nodeid:currentNode._id,icon:a})}var showEditNodeValueDialog_modes=["Device Name","Hostname","Description","Tags"];var showEditNodeValueDialog_modes2=["name","host","desc","tags"];var showEditNodeValueDialog_modes3=["","","","Tag1, Tag2, Tag3"];function showEditNodeValueDialog(a){if(xxdialogMode){return}var c=addHtmlValue(showEditNodeValueDialog_modes[a],'<input id=dp10devicevalue style=width:230px maxlength=64 placeholder="'+showEditNodeValueDialog_modes3[a]+'" onchange=p10editdevicevalueValidate('+a+",event) onkeyup=p10editdevicevalueValidate("+a+",event) />");setDialogMode(2,"Edit Device",3,showEditNodeValueDialogEx,c,a);var b=currentNode[showEditNodeValueDialog_modes2[a]];if(b==null){b=""}if(Array.isArray(b)){b=b.join(", ")}Q("dp10devicevalue").value=b;p10editdevicevalueValidate();Q("dp10devicevalue").focus()}function showEditNodeValueDialogEx(a,b){var c={action:"changedevice",nodeid:currentNode._id};c[showEditNodeValueDialog_modes2[b]]=Q("dp10devicevalue").value;meshserver.send(c)}function p10editdevicevalueValidate(b,a){var c=((b>1)||(Q("dp10devicevalue").value.length>0));QE("idx_dlgOkButton",c);if((a!=null)&&(c==true)&&(a.keyCode==13)){dialogclose(1)}}var desktopNode;function setupDesktop(){if((desktopNode!=currentNode)&&(desktop!=null)){desktop.Stop();desktopNode=null;desktop=null}if((desktopNode!=currentNode)||(desktop==null)){var b=multiDesktop[currentNode._id];if(b!=null){QH("DeskParent","");var a=b.m.CanvasId;a.setAttribute("id","Desk");a.setAttribute("style","width:100%;-ms-touch-action:none;margin-left:0px");a.setAttribute("onmousedown","dmousedown(event)");a.setAttribute("onmouseup","dmouseup(event)");a.setAttribute("onmousemove","dmousemove(event)");a.removeAttribute("onclick");Q("DeskParent").appendChild(a);desktop=b;if(desktop.m.SendCompressionLevel){desktop.m.SendCompressionLevel(1,desktopsettings.quality,desktopsettings.scaling,desktopsettings.framerate)}desktop.onStateChanged=onDesktopStateChange;desktopNode=currentNode;onDesktopStateChange(desktop,desktop.State);delete multiDesktop[currentNode._id]}else{QH("DeskParent",'<canvas id=Desk width=640 height=480 style="width:100%;-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown=dmousedown(event) onmouseup=dmouseup(event) onmousemove=dmousemove(event)></canvas>');desktopNode=currentNode}Q("Desk").addEventListener("DOMMouseScroll",function(c){return dmousewheel(c)});Q("Desk").addEventListener("mousewheel",function(c){return dmousewheel(c)})}desktopNode=currentNode;updateDesktopButtons();deskAdjust();if(!Q("Desk")["toBlob"]){QV("deskSaveBtn",false)}}function updateDesktopButtons(){var d=meshes[currentNode.meshid];var a=0;if(desktop!=null){a=desktop.State}var e=d.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;QV("disconnectbutton1span",(a!=0));QV("connectbutton1span",(a==0)&&((e&8)||(e&256))&&(d.mtype==2)&&(currentNode.agent.caps&1));QV("connectbutton1hspan",(a==0)&&(e&8)&&((currentNode.intelamt!=null)&&(d.mtype==1||currentNode.intelamt.state==2)&&((currentNode.intelamt.ver!=null)||(d.mtype==1))));QV("d7amtkvm",(currentNode.intelamt!=null&&((currentNode.intelamt.ver!=null)||(d.mtype==1)))&&((a==0)||(desktop.contype==2)));QV("d7meshkvm",(webRtcDesktop)||((d.mtype==2)&&(currentNode.agent.caps&1)&&((a==false)||(desktop.contype==1))));var c=(e==4294967295)||(((e&8)!=0)&&((e&256)==0)&&((e&4096)==0));var g=((currentNode.conn&1)!=0);QE("connectbutton1",g);var b=((currentNode.conn&6)!=0);QE("connectbutton1h",b);QE("deskSaveBtn",a==3);QV("deskFocusBtn",(desktop!=null)&&(desktop.contype==2)&&(a!=0)&&(desktopsettings.showfocus));QV("DeskCAD",c);QE("DeskCAD",a==3);QV("DeskClip",(currentNode.agent)&&(currentNode.agent.id!=11)&&(currentNode.agent.id!=16)&&((desktop==null)||(desktop.contype!=2)));QE("DeskClip",a==3);QV("DeskWD",(currentNode.agent)&&(currentNode.agent.id<5)&&c);QE("DeskWD",a==3);QV("deskkeys",(currentNode.agent)&&(currentNode.agent.id<5)&&c);QE("deskkeys",a==3);QV("DeskToolsButton",(c)&&(d.mtype==2)&&g);QV("DeskChatButton",(browserfullscreen==false)&&(c)&&(d.mtype==2)&&g);QV("DeskNotifyButton",(browserfullscreen==false)&&(currentNode.agent)&&(currentNode.agent.id<5)&&(c)&&(d.mtype==2)&&g);QV("DeskOpenWebButton",(browserfullscreen==false)&&(c)&&(d.mtype==2)&&g);QV("DeskControlSpan",c);QV("deskActionsBtn",(browserfullscreen==false));QV("deskActionsSettings",(browserfullscreen==false));if(e&8){Q("DeskControl").checked=(getstore("DeskControl",1)==1)}else{Q("DeskControl").checked=false}if(g==false){QV("DeskTools",false)}}var autoConnectDesktopTimer=null;function autoConnectDesktop(a){if(autoConnectDesktopTimer==null){autoConnectDesktopTimer=setInterval(connectDesktop,100)}else{clearInterval(autoConnectDesktopTimer);autoConnectDesktopTimer=null}}function connectDesktop(b,a){if(desktop==null){desktopNode=currentNode;if(a==2){if((desktopNode.intelamt.user==null)||(desktopNode.intelamt.user=="")){editDeviceAmtSettings(desktopNode._id,connectDesktop);return}desktop=CreateAmtRedirect(CreateAmtRemoteDesktop("Desk"),authCookie);desktop.debugmode=debugmode;desktop.onStateChanged=onDesktopStateChange;desktop.m.bpp=(desktopsettings.encoding==1||desktopsettings.encoding==3)?1:2;desktop.m.useZRLE=(desktopsettings.encoding<3);desktop.m.localKeyMap=desktopsettings.localkeymap;desktop.m.showmouse=desktopsettings.showmouse;desktop.m.onScreenSizeChange=deskAdjust;desktop.m.onKvmData=function(h){if(h.length==0){if(!desktop.m._sentPresence){desktop.m._sentPresence=true;desktop.m.sendKvmData(JSON.stringify({action:"present",ver:1}))}return}var d=null;try{d=JSON.parse(h)}catch(g){}if((d!=null)&&(d.action!=null)){if(d.action=="restart"){webRtcDesktopReset();desktop.m.sendKvmData(JSON.stringify({action:"present",ver:1}))}else{if((d.action=="present")&&(webRtcDesktop==null)){webRtcDesktop={platform:d.platform};var c=null;if(typeof RTCPeerConnection!=="undefined"){webRtcDesktop.webrtc=new RTCPeerConnection(c)}else{if(typeof webkitRTCPeerConnection!=="undefined"){webRtcDesktop.webrtc=new webkitRTCPeerConnection(c)}}webRtcDesktop.webchannel=webRtcDesktop.webrtc.createDataChannel("DataChannel",{});webRtcDesktop.webchannel.onopen=function(){console.log("WebRTC Data Channel Open");Q("deskstatus").textContent=StatusStrs[desktop.State]+", Soft-KVM";desktop.m.hold(true);webRtcDesktop.webRtcActive=true;webRtcDesktop.softdesktop=CreateKvmDataChannel(webRtcDesktop.webchannel,CreateAgentRemoteDesktop("Desk",Q("id_mainarea")),desktop.m);webRtcDesktop.softdesktop.m.setRotation(desktop.m.rotation);webRtcDesktop.softdesktop.m.onScreenSizeChange=deskAdjust;if(desktopsettings.quality){webRtcDesktop.softdesktop.m.CompressionLevel=desktopsettings.quality}if(desktopsettings.scaling){webRtcDesktop.softdesktop.m.ScalingLevel=desktopsettings.scaling}webRtcDesktop.softdesktop.Start()};webRtcDesktop.webchannel.onclose=function(e){console.log("WebRTC Data Channel Closed");webRtcDesktopReset()};webRtcDesktop.webrtc.onicecandidate=function(j){if(j.candidate==null){desktop.m.sendKvmData(JSON.stringify({action:"offer",ver:1,sdp:webRtcDesktop.webrtcoffer.sdp}))}else{webRtcDesktop.webrtcoffer.sdp+=("a="+j.candidate.candidate+"\r\n")}};webRtcDesktop.webrtc.oniceconnectionstatechange=function(){if((webRtcDesktop!=null)&&(webRtcDesktop.webrtc!=null)&&((webRtcDesktop.webrtc.iceConnectionState=="disconnected")||(webRtcDesktop.webrtc.iceConnectionState=="failed"))){webRtcDesktopReset()}};webRtcDesktop.webrtc.createOffer(function(e){webRtcDesktop.webrtcoffer=e;webRtcDesktop.webrtc.setLocalDescription(e,function(){},webRtcDesktopReset)},webRtcDesktopReset,{mandatory:{OfferToReceiveAudio:false,OfferToReceiveVideo:false}})}else{if((d.action=="answer")&&(webRtcDesktop!=null)){webRtcDesktop.webrtc.setRemoteDescription(new RTCSessionDescription({type:"answer",sdp:d.sdp}),function(){},webRtcDesktopReset)}}}}};desktop.Start(desktopNode._id,16994,"*","*",0);desktop.contype=2}else{desktop=CreateAgentRedirect(meshserver,CreateAgentRemoteDesktop("Desk"),serverPublicNamePort,authCookie);desktop.debugmode=debugmode;desktop.m.debugmode=debugmode;desktop.attemptWebRTC=attemptWebRTC;desktop.onStateChanged=onDesktopStateChange;desktop.m.CompressionLevel=desktopsettings.quality;desktop.m.ScalingLevel=desktopsettings.scaling;desktop.m.FrameRateTimer=desktopsettings.framerate;desktop.m.onDisplayinfo=deskDisplayInfo;desktop.m.onScreenSizeChange=deskAdjust;desktop.Start(desktopNode._id);desktop.contype=1}}else{desktop.Stop();webRtcDesktopReset();desktopNode=desktop=null}}var webRtcDesktop=null;function webRtcDesktopReset(){if(webRtcDesktop==null){return}if(webRtcDesktop.softdesktop!=null){webRtcDesktop.softdesktop.Stop();webRtcDesktop.softdesktop=null}if(webRtcDesktop.webchannel!=null){try{webRtcDesktop.webchannel.close()}catch(a){}webRtcDesktop.webchannel=null}if(webRtcDesktop.webrtc!=null){try{webRtcDesktop.webrtc.close()}catch(a){}webRtcDesktop.webrtc=null}webRtcDesktop=null;if(desktop&&desktop.m){desktop.m.hold(false);Q("deskstatus").textContent=StatusStrs[desktop.State]}}function onDesktopStateChange(c,a){var d=a;if((d==3)&&(c.contype==2)){d++}var b=StatusStrs[d];if((desktop!=null)&&(desktop.webRtcActive==true)){b+=", WebRTC"}QH("deskstatus",b);switch(a){case 0:desktop.Stop();desktopNode=desktop=null;QV("DeskFocus",false);QV("termdisplays",false);deskFocusBtn.value="All Focus";if(fullscreen==true){deskToggleFull()}webRtcDesktopReset();break;case 2:break;default:break}updateDesktopButtons();deskAdjust();setTimeout(deskAdjust,50)}function showDesktopSettings(){if(xxdialogMode){return}applyDesktopSettings();updateDesktopButtons();setDialogMode(7,"Remote Desktop Settings",3,showDesktopSettingsChanged)}function showDesktopSettingsChanged(){desktopsettings.encoding=d7desktopmode.value;desktopsettings.showfocus=d7showfocus.checked;desktopsettings.showmouse=d7showcursor.checked;desktopsettings.quality=d7bitmapquality.value;desktopsettings.scaling=d7bitmapscaling.value;desktopsettings.framerate=d7framelimiter.value;desktopsettings.localkeymap=d7localKeyMap.checked;localStorage.setItem("desktopsettings",JSON.stringify(desktopsettings));applyDesktopSettings();if(desktop){if(desktop.contype==1){if(desktop.State!=0){desktop.m.SendCompressionLevel(1,desktopsettings.quality,desktopsettings.scaling,desktopsettings.framerate)}}if(desktop.contype==2){if(desktopsettings.showfocus==false){desktop.m.focusmode=0;deskFocusBtn.value="All Focus"}if(desktop.State!=0){desktop.Stop();setTimeout(function(){connectDesktop(null,2)},50)}}}}function applyDesktopSettings(){var c="",b=(features&512)?[90,80,70,60,50,40,30,20,10,5,1]:[60,50,40,30,20,10,5,1];for(var a in b){c+="<option value="+b[a]+">"+b[a]+"%</option>"}QH("d7bitmapquality",c);d7desktopmode.value=desktopsettings.encoding;d7showfocus.checked=desktopsettings.showfocus;d7showcursor.checked=desktopsettings.showmouse;d7bitmapquality.value=40;if(b.indexOf(parseInt(desktopsettings.quality))>=0){d7bitmapquality.value=desktopsettings.quality}d7bitmapscaling.value=desktopsettings.scaling;if(desktopsettings.framerate){d7framelimiter.value=desktopsettings.framerate}if(desktopsettings.localkeymap){d7localKeyMap.checked=desktopsettings.localkeymap}QV("deskFocusBtn",(desktop!=null)&&(desktop.contype==2)&&(desktop.state!=0)&&(desktopsettings.showfocus))}function enterBrowserFullscreen(a){if(a.requestFullscreen){a.requestFullscreen()}else{if(a.msRequestFullscreen){a.msRequestFullscreen()}else{if(a.mozRequestFullScreen){a.mozRequestFullScreen()}else{if(a.webkitRequestFullscreen){a.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}}}}}function exitBrowserFullscreen(){if(document.exitFullscreen){document.exitFullscreen()}else{if(document.msExitFullscreen){document.msExitFullscreen()}else{if(document.mozCancelFullScreen){document.mozCancelFullScreen()}else{if(document.webkitExitFullscreen){document.webkitExitFullscreen()}}}}}function isBrowserFullscreen(){if(!document.fullscreenElement&&!document.mozFullScreenElement&&!document.webkitFullscreenElement&&!document.msFullscreenElement){return false}else{return true}}var fullscreen=false;var browserfullscreen=false;function deskToggleFull(a){fullscreen=!fullscreen;QV("mastheadx",!fullscreen);QV("masthead",!fullscreen);QV("topbar",!fullscreen);QV("p11deviceNameHeader",!fullscreen);QV("footer",!fullscreen);QV("column_l_bottomgap",!fullscreen);QV("idx_deskFullBtn2",fullscreen);QV("deskFullBtn",!fullscreen);QV("page_leftbar",!fullscreen);if(fullscreen){if(a.shiftKey==true){enterBrowserFullscreen(Q("deskarea0"));browserfullscreen=true}QS("column_l").width="930px";QS("column_l").height="";QS("column_l")["margin-left"]="";QS("column_l")["overflow-y"]="";QS("container").position="";QS("page_content").position="";QV("MainMenuSpan",true);QS("container").width="100%";QS("container")["border-right"]="0";QS("container")["border-left"]="0";QS("column_l").padding="0";QS("column_l").width="100%";QS("column_l")["max-height"]=""}else{exitBrowserFullscreen();browserfullscreen=false;QS("container").width="960px";QS("container")["border-right"]="1px solid #b7b7b7";QS("container")["border-left"]="1px solid #b7b7b7";QS("column_l").padding="0 15px";QS("column_l").width="930px";toggleFullScreen()}deskAdjust();deskAdjust();updateDesktopButtons()}function deskToggleFocus(){desktop.m.focusmode=(desktop.m.focusmode+64)%192;Q("deskFocusBtn").value=["All Focus","Small Focus","Large Focus"][desktop.m.focusmode/64]}function deskAdjust(){var c=(Math.max(document.documentElement.clientHeight,window.innerHeight||0)-(Q("deskarea1").clientHeight+Q("deskarea2").clientHeight+Q("Desk").clientHeight+Q("deskarea4").clientHeight+2))/2;if(fullscreen){document.documentElement.style.overflow="hidden";QS("deskarea3x").height=null;if(c<0){var a=(Math.max(document.documentElement.clientHeight,window.innerHeight||0)-(Q("deskarea1").clientHeight+Q("deskarea2").clientHeight+Q("deskarea4").clientHeight));var b=9999;if(desktop){b=(desktop.m.width/desktop.m.height)*a}if(webRtcDesktop&&webRtcDesktop.softdesktop){b=(webRtcDesktop.softdesktop.m.width/webRtcDesktop.softdesktop.m.height)*a}QS("Desk")["max-height"]=a+"px";QS("Desk")["max-width"]=b+"px";c=0}else{QS("Desk")["max-height"]=null;QS("Desk")["max-width"]=null}QS("Desk")["margin-top"]=c+"px";QS("Desk")["margin-bottom"]=c+"px"}else{var b=9999,a=(Math.max(document.documentElement.clientHeight,window.innerHeight||0)-(webPageFullScreen?276:290));if(desktop){b=(desktop.m.width/desktop.m.height)*a}if(webRtcDesktop&&webRtcDesktop.softdesktop){b=(webRtcDesktop.softdesktop.m.width/webRtcDesktop.softdesktop.m.height)*a}document.documentElement.style.overflow="auto";QS("Desk")["max-height"]=a+"px";QS("Desk")["max-width"]=b+"px";QS("Desk")["margin-top"]="0";QS("Desk")["margin-bottom"]="0"}}function mdeskAdjust(c,h,g,a){if(!c||!h||!g||!a){return}if(a.id=="Desk"){deskAdjust();return}var k=[{x:180,y:101},{x:302,y:169},{x:454,y:255}][Q("sizeselect").selectedIndex];var e=k.x+2,j=Q("xdevices").clientWidth-30,l=Math.floor(j/e);l=e+Math.floor((j-(l*e))/l);k.y=k.y*(l/k.x);k.x=l;var b=k.y,d=k.x;if(c.State!=0){b=k.y;d=(h/g)*k.y}QS(a.id)["max-height"]=b+"px";QS(a.id)["max-width"]=d+"px";QS(a.id)["margin-top"]="0";QS(a.id)["margin-bottom"]="0"}function deskSendKeys(){if(xxdialogMode||desktop==null||desktop.State!=3){return}var a=Q("deskkeys").value;if(a==0){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65364,1],[65364,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,40],[desktop.m.KeyAction.UP,40],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==1){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65362,1],[65362,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,38],[desktop.m.KeyAction.UP,38],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==2){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[108,1],[108,0],[65511,0]])}else{desktop.sendCtrlMsg('{"action":"lock"}')}}else{if(a==3){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[109,1],[109,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,77],[desktop.m.KeyAction.UP,77],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==4){if(desktop.contype==2){desktop.m.sendkey([[65505,1],[65511,1],[109,1],[109,0],[65511,0],[65505,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.DOWN,16],[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,77],[desktop.m.KeyAction.UP,77],[desktop.m.KeyAction.EXUP,91],[desktop.m.KeyAction.UP,16]])}}else{if(a==5){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==6){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[114,1],[114,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,82],[desktop.m.KeyAction.UP,82],[desktop.m.KeyAction.EXUP,91]])}}}}}}}}}function showDeskClip(){if(xxdialogMode||desktop==null||desktop.State!=3){return}Q("DeskClip").blur();var a="";a+='<input id=dlgClipGet type=button value="Get Clipboard" style=width:120px onclick=showDeskClipGet()>';a+='<input id=dlgClipSet type=button value="Set Clipboard" style=width:120px onclick=showDeskClipSet()>';a+='<div id=dlgClipStatus style="display:inline-block;margin-left:8px" ></div>';a+='<textarea id=d2clipText style="width:100%;height:184px;resize:none" maxlength=65535></textarea>';a+='<input type=button value="Close" style=width:80px;float:right onclick=dialogclose(0)><div style=height:26px;margin-top:3px><span id=linuxClipWarn style=display:none>Remote clipboard is valid for 60 seconds.</span>&nbsp;</div><div></div>';setDialogMode(2,"Remote Clipboard",8,null,a,"clipboard");Q("d2clipText").focus()}function showDeskClipGet(){if(desktop==null||desktop.State!=3){return}meshserver.send({action:"msg",type:"getclip",nodeid:currentNode._id})}function showDeskClipSet(){if(desktop==null||desktop.State!=3){return}meshserver.send({action:"msg",type:"setclip",nodeid:currentNode._id,data:Q("d2clipText").value});QV("linuxClipWarn",currentNode&&currentNode.agent&&(currentNode.agent.id>4)&&(currentNode.agent.id!=21)&&(currentNode.agent.id!=22))}function sendCAD(){if(xxdialogMode||desktop==null||desktop.State!=3){return}desktop.m.sendcad()}function toggleDeskTools(){if(xxdialogMode){return}if(QS("DeskTools").display=="none"){QV("DeskTools",true);Q("DeskTools").nodeid=currentNode._id;refreshDeskTools()}else{QV("DeskTools",false)}}function refreshDeskTools(){QV("DeskToolsRefreshButton",false);setTimeout(refreshDeskToolsEx,500);meshserver.send({action:"msg",type:"ps",nodeid:currentNode._id})}function refreshDeskToolsEx(){QV("DeskToolsRefreshButton",true)}var deskTools={sort:1,msg:null};function sortProcess(a){deskTools.sort=a;showDeskToolsProcesses(deskTools.msg)}function sortProcessPid(c,d){if(c.p>d.p){return 1}if(c.p<d.p){return(-1)}return 0}function sortProcessName(c,d){if(c.d>d.d){return 1}if(c.d<d.d){return(-1)}return 0}function showDeskToolsProcesses(c){deskTools.msg=c;if(c==null){QH("DeskToolsProcesses","");return}if(Q("DeskTools").nodeid!=c.nodeid){return}var d=[],h=null;try{h=JSON.parse(c.value)}catch(a){}if(h!=null){for(var g in h){d.push({p:parseInt(g),c:h[g].cmd,d:h[g].cmd.toLowerCase(),u:h[g].user})}if(deskTools.sort==0){d.sort(sortProcessPid)}else{if(deskTools.sort==1){d.sort(sortProcessName)}}var j="";for(var b in d){if(d[b].p!=0){j+="<div class=deskToolsBar><div style=width:50px;float:left;text-align:right;padding-right:5px>"+d[b].p+'</div><a style=float:right;padding-right:5px;cursor:pointer title="Stop process" onclick=stopProcess('+d[b].p+',"'+d[b].c+'")><img width=10 height=10 src="images/trash.png"></a><div style=float:right;padding-right:5px>'+(d[b].u?d[b].u:"")+"</div><div>"+d[b].c+"</div></div>"}}QH("DeskToolsProcesses",j)}}function toggleKvmControl(){putstore("DeskControl",(Q("DeskControl").checked?1:0))}function deskSaveImage(){if(xxdialogMode||desktop==null||desktop.State!=3){return}var a=new Date(),b="Desktop-"+currentNode.name+"-"+a.getFullYear()+"-"+("0"+(a.getMonth()+1)).slice(-2)+"-"+("0"+a.getDate()).slice(-2)+"-"+("0"+a.getHours()).slice(-2)+"-"+("0"+a.getMinutes()).slice(-2);Q("Desk")["toBlob"](function(c){saveAs(c,b+".jpg")})}function deskDisplayInfo(e,a,c,d){var g=Q("termdisplays").value;if(a.length>0){var b="";for(var h in a){b+="<option"+((g==a[h])?" selected":"")+">"+a[h]+"</option>"}QH("termdisplays",b)}QV("termdisplays",a.length>0)}function deskGetDisplayNumbers(a){desktop.m.GetDisplayNumbers()}function deskSetDisplay(b){var a=0,c=Q("termdisplays").value;if(c=="All Displays"){a=65535}else{a=parseInt(c.substring(8))}desktop.m.SetDisplay(a)}var dblClickDetectArgs={t:0,x:0,y:0};function dblClickDetect(a){if(a.buttons!=1){return}var b=Date.now();if(((b-dblClickDetectArgs.t)<250)&&(Math.abs(a.clientX-dblClickDetectArgs.x)<2)&&(Math.abs(a.clientY-dblClickDetectArgs.y)<2)){if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousedblclick(a);desktop.m.sendKeepAlive()}else{desktop.m.mousedblclick(a)}}}dblClickDetectArgs.t=b;dblClickDetectArgs.x=a.clientX;dblClickDetectArgs.y=a.clientY}function dmousedown(a){if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousedown(a);desktop.m.sendKeepAlive()}else{desktop.m.mousedown(a)}}dblClickDetect(a)}function dmouseup(a){if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mouseup(a);desktop.m.sendKeepAlive()}else{desktop.m.mouseup(a)}}}function dmousemove(a){if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousemove(a);desktop.m.sendKeepAlive()}else{desktop.m.mousemove(a)}}}function dmousewheel(a){if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousewheel(a);desktop.m.sendKeepAlive()}else{if(desktop.m.mousewheel){desktop.m.mousewheel(a)}}haltEvent(a);return true}return false}function drotate(a){if(!xxdialogMode&&desktop!=null){desktop.m.setRotation(desktop.m.rotation+a);deskAdjust();deskAdjust()}}function stopProcess(a,b){setDialogMode(2,"Process Control",3,stopProcessEx,"Stop process #"+a+' "'+b+'"?',a)}function stopProcessEx(a,b){meshserver.send({action:"msg",type:"pskill",nodeid:currentNode._id,value:b});setTimeout(refreshDeskTools,300)}var terminalNode;function setupTerminal(){if((terminalNode!=currentNode)&&(terminal!=null)){terminal.Stop();terminal=null}terminalNode=currentNode;updateTerminalButtons()}function updateTerminalButtons(){var b=meshes[terminalNode.meshid];var d=((terminal!=null)&&(terminal.state!=0));QV("disconnectbutton2span",(d==true));QV("connectbutton2span",(d==false)&&(b.mtype==2)&&(currentNode.agent.caps&2));QV("connectbutton2hspan",(d==false)&&((terminalNode.intelamt!=null)&&(b.mtype==1||terminalNode.intelamt.state==2)&&((terminalNode.intelamt.ver!=null)||(b.mtype==1))));var c=((terminalNode.conn&1)!=0);QE("connectbutton2",c);var a=((terminalNode.conn&6)!=0);QE("connectbutton2h",a);QE("ctrlcbutton",d);QE("ctrlxbutton",d);QE("escbutton",d);QE("bsbutton",d);QE("pastebutton",d);QE("specialkeylist",d);QE("specialkeylistinput",d);QV("terminalSettingsButtons",(terminal)&&(terminal.contype==2));if(terminal){Q("id_ttypebutton").value=terminalEmulations[terminal.m.terminalEmulation];Q("id_tfxkeysbutton").value=fxEmulations[terminal.m.fxEmulation];Q("id_tcrbutton").value=(terminal.m.lineFeed=="\r\n")?"CR+LF":"LF"}}function onTerminalStateChange(d,a){var c=a;if((c==3)&&(d.contype==2)){c++}var b=StatusStrs[c];if(terminal.webRtcActive==true){b+=", WebRTC"}QH("termstatus",b);switch(a){case 0:d.m.TermResetScreen();d.m.TermDraw();if(terminal!=null){terminal.Stop();terminal=null}break;case 3:break;default:break}updateTerminalButtons()}var autoConnectTerminalTimer=null;function autoConnectTerminal(a){if(autoConnectTerminalTimer==null){autoConnectTerminalTimer=setInterval(connectTerminal,100)}else{clearInterval(autoConnectTerminalTimer);autoConnectTerminalTimer=null}}function connectTerminal(b,a){if(!terminal){if(a==2){if((terminalNode.intelamt.user==null)||(terminalNode.intelamt.user=="")){editDeviceAmtSettings(terminalNode._id,connectTerminal);return}terminal=CreateAmtRedirect(CreateAmtRemoteTerminal("Term"),authCookie);terminal.debugmode=debugmode;terminal.m.debugmode=debugmode;terminal.onStateChanged=onTerminalStateChange;terminal.Start(terminalNode._id,16994,"*","*",0);terminal.contype=2;Q("id_ttypebutton").value=terminalEmulations[terminal.m.terminalEmulation]}else{terminal=CreateAgentRedirect(meshserver,CreateAmtRemoteTerminal("Term"),serverPublicNamePort,authCookie);terminal.debugmode=debugmode;terminal.m.debugmode=debugmode;terminal.m.lineFeed=([1,2,3,4,21,22].indexOf(currentNode.agent.id)>=0)?"\r\n":"\n";terminal.attemptWebRTC=attemptWebRTC;terminal.onStateChanged=onTerminalStateChange;terminal.Start(terminalNode._id);terminal.contype=1;terminal.m.terminalEmulation=0;terminal.m.fxEmulation=0;Q("id_ttypebutton").value=terminalEmulations[0]}}else{terminal.Stop();terminal=null}Q("connectbutton2").blur()}var terminalEmulations=["UTF8 Terminal","Extended ASCII","Intel ASCII"];function termToggleType(){if(!terminal||xxdialogMode){return}terminal.m.terminalEmulation=(terminal.m.terminalEmulation+1)%3;Q("id_ttypebutton").value=terminalEmulations[terminal.m.terminalEmulation];Q("id_ttypebutton").blur()}var fxEmulations=["Intel (F10 = ESC+[OM)","Alternate (F10 = ESC+0)","VT100+ (F10 = ESC+[OY)"];function termToggleFx(){if(!terminal||xxdialogMode){return}terminal.m.fxEmulation=(terminal.m.fxEmulation+1)%3;Q("id_tfxkeysbutton").value=fxEmulations[terminal.m.fxEmulation];Q("id_tfxkeysbutton").blur()}function termToggleCr(){if(!terminal||xxdialogMode){return}if(terminal.m.lineFeed=="\n"){terminal.m.lineFeed="\r\n"}else{terminal.m.lineFeed="\n"}Q("id_tcrbutton").value=(terminal.m.lineFeed=="\r\n")?"CR+LF":"LF"}function termSendKey(b,a){if(!terminal||xxdialogMode){return}terminal.m.TermSendKey(b);Q(a).blur()}function showTermPasteDialog(){if(!terminal||xxdialogMode){return}Q("pastebutton").blur();setDialogMode(2,"Paste",3,showTermPasteDialogEx,'<textarea id=d2pasteText style="width:100%;height:184px;resize:none"></textarea>');Q("d2pasteText").focus()}function showTermPasteDialogEx(){if(!terminal){return}terminal.m.TermSendKeys(Q("d2pasteText").value)}function sendSpecialKey(){terminal.m.TermSendKey(Q("specialkeylist").value);Q("specialkeylist").blur();Q("specialkeylistinput").blur()}var filesNode;function setupFiles(){var b=(filesNode==currentNode);filesNode=currentNode;var a=((filesNode.conn&1)!=0)?true:false;QE("p13Connect",a);if(((b==false)||(a==false))&&files){files.Stop();files=null}}function onFilesStateChange(c,a){p13Connect.value=(a==0)?"Connect":"Disconnect";var b=StatusStrs[a];if(files.webRtcActive==true){b+=", WebRTC"}Q("p13Status").textContent=b;switch(a){case 0:QH("p13files","");p13filetree=null;p13filetreelocation=[];QH("p13currentpath","");QE("p13FolderUp",false);p13setActions();if(files!=null){files.Stop();files=null}break;case 3:p13targetpath="";files.sendText({action:"ls",reqid:1,path:""});break;default:break}}function CreateRemoteFiles(b){var a={protocol:5};a.onFileUpdate=b;a.xxStateChange=function(c){};a.ProcessData=function(c){a.onFileUpdate(c)};return a}var autoConnectFilesTimer=null;function autoConnectFiles(a){if(autoConnectFilesTimer==null){autoConnectFilesTimer=setInterval(connectFiles,100)}else{clearInterval(autoConnectFilesTimer);autoConnectFilesTimer=null}}function connectFiles(a){if(!files){files=CreateAgentRedirect(meshserver,CreateRemoteFiles(p13gotFiles),serverPublicNamePort,authCookie);files.attemptWebRTC=attemptWebRTC;files.onStateChanged=onFilesStateChange;files.Start(filesNode._id)}else{files.Stop();files=null}p13clipboard=p13clipboardFolder=null;p13clipboardCut=0;p13updateClipview()}var p13filetree=null;var p13targetpath=null;var p13filetreelocation=[];function p13gotFiles(b){if((b.length>0)&&(b.charCodeAt(0)!=123)){p13gotDownloadBinaryData(b);return}b=JSON.parse(decode_utf8(b));if(b.action=="download"){p13gotDownloadCommand(b);return}b.path=b.path.replace(/\//g,"\\");if((p13filetree!=null)&&(b.path==p13filetree.path)){var a=p13getCheckedNames();p13filetree=b;p13updateFiles(a)}else{var c=b.path.replace(/\//g,"\\"),d=p13targetpath.replace(/\//g,"\\");while((c.length>0)&&(c[0]=="\\")){c=c.substring(1)}while((d.length>0)&&(d[0]=="\\")){d=d.substring(1)}if((c==d)||((b.path=="\\")&&(p13targetpath==""))){p13filetree=b;p13updateFiles()}}}function p13getCheckedNames(){var b=[],a=document.getElementsByName("fd");for(var c=0;c<a.length;c++){if(a[c].checked){b.push(p13filetree.dir[a[c].value].n)}}return b}function p13updateFiles(b){var n="",o="",c="<a style=cursor:pointer onclick=p13folderup(0)>Root</a>",l="Root";var w=p13filetree.path.split("\\");p13filetreelocation=[];for(var p in w){if(w[p]!=""){p13filetreelocation.push(w[p])}}for(var p in p13filetreelocation){c+=" / <a style=cursor:pointer onclick=p13folderup("+(parseInt(p)+1)+")>"+p13filetreelocation[p]+"</a>"}var s=p13filetreelocation.join("/");var j=p13sort_files(p13filetree.dir);for(var p in j){var d=j[p],r=d.n,u;u=r;if(r.length>70){u='<span title="'+EscapeHtml(r)+'">'+EscapeHtml(r.substring(0,70))+"...</span>"}else{u=EscapeHtml(r)}r=EscapeHtml(r);var g="";if(d.d!=null){var e=new Date(d.d),g=(e.getMonth()+1)+"/"+(e.getDate())+"/"+e.getFullYear()+" "+e.toLocaleTimeString()+"&nbsp;"}var k="";if(d.s!=null){k=getFileSizeStr(d.s)}var m="";if(d.t<3){var t="",v="";m="<div class=filelist file=999><input file=999 style=float:left name=fd class=fcb type=checkbox onchange=p13setActions() value='"+d.nx+"'>&nbsp;<span style=float:right title=\""+v+'">'+t+"</span><span><div class=fileIcon"+d.t+' onclick=p13folderset("'+encodeURIComponent(d.nx)+'")></div><a style=cursor:pointer onclick=p13folderset("'+encodeURIComponent(d.nx)+'")>'+u+"</a></span></div>"}else{var q=u;if(d.s>0){q='<a rel="noreferrer noopener" target="_blank" style=cursor:pointer onclick="p13downloadfile(\''+encodeURIComponent(s+"/"+r)+"','"+encodeURIComponent(r)+"',"+d.s+')">'+u+"</a>"}m="<div class=filelist file=3><input file=3 style=float:left name=fd class=fcb type=checkbox onchange=p13setActions() value='"+d.nx+"'>&nbsp;<span class=fsize>"+g+"</span><span style=float:right>"+k+"</span><span><div class=fileIcon"+d.t+"></div>"+q+"</span></div>"}if(d.t<3){n+=m}else{o+=m}}QH("p13files",n+o);QH("p13currentpath",c);QE("p13FolderUp",p13filetreelocation.length!=0);if(b!=null){var a=document.getElementsByName("fd");for(var p=0;p<a.length;p++){if(b.indexOf(p13filetree.dir[a[p].value].n)>=0){a[p].checked=true}}}p13setActions()}function p13folderset(a){p13targetpath=joinPaths(p13filetree.path,p13filetree.dir[a].n).split("\\").join("/");files.sendText({action:"ls",reqid:1,path:p13targetpath})}function p13folderup(a){if(a==null){p13filetreelocation.pop()}else{while(p13filetreelocation.length>a){p13filetreelocation.pop()}}p13targetpath=p13filetreelocation.join("/");files.sendText({action:"ls",reqid:1,path:p13targetpath})}var p13sortorder;function p13sort_filename(c,d){if(c.ln>d.ln){return(1*p13sortorder)}if(c.ln<d.ln){return(-1*p13sortorder)}return 0}function p13sort_timestamp(c,d){if(c.d>d.d){return(1*p13sortorder)}if(c.d<d.d){return(-1*p13sortorder)}return 0}function p13sort_bysize(c,d){if(c.s==d.s){return p13sort_filename(c,d)}return(((c.s-d.s))*p13sortorder)}function p13sort_files(a){var c=[],d=Q("p13sortdropdown").value;for(var b in a){a[b].nx=b;if(a[b].s==null){a[b].s=0}if(a[b].n==null){a[b].n=b}a[b].ln=a[b].n.toLowerCase();c.push(a[b])}p13sortorder=1;if(d>3){p13sortorder=-1;d-=3}if(d==1){c.sort(p13sort_filename)}else{if(d==2){c.sort(p13sort_bysize)}else{if(d==3){c.sort(p13sort_timestamp)}}}return c}function p13setActions(){if(p13filetree==null){QE("p13DeleteFileButton",false);QE("p13NewFolderButton",false);QE("p13UploadButton",false);QE("p13RenameFileButton",false);QE("p13SelectAllButton",false);Q("p13SelectAllButton").value="Select All";QE("p13RefreshButton",false);QE("p13CutButton",false);QE("p13CopyButton",false);QE("p13PasteButton",false)}else{var a=p13getFileSelCount(),c=p13getFileCount(),b=p13getFileSelCount(false);var d=((currentNode.agent.id>0)&&(currentNode.agent.id<5));QE("p13DeleteFileButton",(a>0)&&((p13filetreelocation.length>0)||(d==false)));QE("p13NewFolderButton",((p13filetreelocation.length>0)||(d==false)));QE("p13UploadButton",((p13filetreelocation.length>0)||(d==false)));QE("p13RenameFileButton",(a==1)&&((p13filetreelocation.length>0)||(d==false)));QE("p13SelectAllButton",c>0);Q("p13SelectAllButton").value=(a>0?"Select None":"Select All");QE("p13RefreshButton",true);QE("p13CutButton",(a>0)&&(a==b)&&((p13filetreelocation.length>0)||(d==false)));QE("p13CopyButton",(a>0)&&(a==b)&&((p13filetreelocation.length>0)||(d==false)));QE("p13PasteButton",((p13filetreelocation.length>0)||(d==false))&&((p13clipboard!=null)&&(p13clipboard.length>0)))}}function p13getFileSelCount(d){var a=0;var b=document.getElementsByName("fd");for(var c=0;c<b.length;c++){if((b[c].checked)&&((d!=false)||(b[c].attributes.file.value=="3"))){a++}}return a}function p13getFileSelDirCount(){var a=0,b=document.getElementsByName("fd");for(var c=0;c<b.length;c++){if((b[c].checked)&&(b[c].attributes.file.value=="999")){a++}}return a}function p13getFileCount(){var a=0;var b=document.getElementsByName("fd");return b.length}function p13selectallfile(){var c=(p13getFileSelCount()==0),a=document.getElementsByName("fd");for(var b=0;b<a.length;b++){a[b].checked=c}p13setActions()}function p13createfolder(){setDialogMode(2,"New Folder",3,p13createfolderEx,"<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% />");focusTextBox("p13renameinput");p13fileNameCheck()}function p13createfolderEx(){files.sendText({action:"mkdir",reqid:1,path:p13filetreelocation.join("/")+"/"+Q("p13renameinput").value});p13folderup(999)}function p13deletefile(){var a=p13getFileSelCount(),b=(p13getFileSelDirCount()>0)?"<br /><br /><input type=checkbox id=p13recdeleteinput>Recursive delete<br>":"<input type=checkbox id=p13recdeleteinput style='display:none'>";setDialogMode(2,"Delete",3,p13deletefileEx,(a>1)?("Delete "+a+" selected items?"+b):("Delete selected item?"+b))}function p13deletefileEx(){var b=[],a=document.getElementsByName("fd");for(var c=0;c<a.length;c++){if(a[c].checked){b.push(p13filetree.dir[a[c].value].n)}}files.sendText({action:"rm",reqid:1,path:p13filetreelocation.join("/"),delfiles:b,rec:Q("p13recdeleteinput").checked});p13folderup(999)}function p13renamefile(){var c,a=document.getElementsByName("fd");for(var b=0;b<a.length;b++){if(a[b].checked){c=p13filetree.dir[a[b].value].n}}setDialogMode(2,"Rename",3,p13renamefileEx,'<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% value="'+c+'" />',{action:"rename",path:p13filetreelocation.join("/"),oldname:c});focusTextBox("p13renameinput");p13fileNameCheck()}function p13renamefileEx(a,c){c.newname=Q("p13renameinput").value;files.sendText(c);p13folderup(999)}function p13fileNameCheck(a){var b=isFilenameValid(Q("p13renameinput").value);QE("idx_dlgOkButton",b);if((b==true)&&(a!=null)&&(a.keyCode==13)){dialogclose(1)}}function p13uploadFile(){setDialogMode(2,"Upload File",3,p13uploadFileEx,"<input type=file name=files id=p13uploadinput style=width:100% multiple=multiple onchange=\"updateUploadDialogOk('p13uploadinput')\" />");updateUploadDialogOk("p13uploadinput")}function p13uploadFileEx(){p13doUploadFiles(Q("p13uploadinput").files)}var p13clipboard=null,p13clipboardFolder=null,p13clipboardCut=0;function p13copyFile(b){var a=document.getElementsByName("fd");p13clipboard=[];p13clipboardCut=b,p13clipboardFolder=p13targetpath;for(var c=0;c<a.length;c++){if((a[c].checked)&&(a[c].attributes.file.value=="3")){p13clipboard.push(p13filetree.dir[a[c].value].n)}}p13updateClipview()}function p13pasteFile(){var a="";if((p13clipboard!=null)&&(p13clipboard.length>0)){a="Confim "+(p13clipboardCut==0?"copy":"move")+" of "+p13clipboard.length+" entrie"+((p13clipboard.length>1)?"s":"")+" to this location?"}setDialogMode(2,"Paste",3,p13pasteFileEx,a)}function p13pasteFileEx(){files.sendText({action:(p13clipboardCut==0?"copy":"move"),reqid:1,scpath:p13clipboardFolder,dspath:p13targetpath,names:p13clipboard});p13folderup(999);if(p13clipboardCut==1){p13clipboard=null,p13clipboardFolder=null,p13clipboardCut=0;p13updateClipview()}}function p13updateClipview(){var a="";if((p13clipboard!=null)&&(p13clipboard.length>0)){a="Holding "+p13clipboard.length+" entrie"+((p13clipboard.length>1)?"s":"")+" for "+(p13clipboardCut==0?"copy":"move")+", <a onclick=p13clearClip() style=cursor:pointer>Clear</a>."}QH("p13bottomstatus",a);p13setActions()}function p13clearClip(){p13clipboard=null;p13clipboardFolder=null;p13clipboardCut=0;p13updateClipview()}function p13fileDragDrop(a){haltEvent(a);QV("p13bigfail",false);QV("p13bigok",false);if(a.dataTransfer==null||a.dataTransfer.files.length==0||p13filetree==null){return}p13doUploadFiles(a.dataTransfer.files)}var p13dragtimer=null;function p13fileDragOver(b){haltEvent(b);if(p13dragtimer!=null){clearTimeout(p13dragtimer);p13dragtimer=null}var a=(p13filetree!=null);QV("p13bigok",a);QV("p13bigfail",!a)}function p13fileDragLeave(a){haltEvent(a);if(a.target.id!="p13filetable"){QV("p13bigfail",false);QV("p13bigok",false)}else{p13dragtimer=setTimeout(function(){QV("p13bigfail",false);QV("p13bigok",false);p13dragtimer=null},10)}}var downloadFile;function p13downloadfile(a,b,c){if(xxdialogMode||downloadFile||!files){return}downloadFile={path:decodeURIComponent(a),file:decodeURIComponent(b),size:c,tsize:0,data:"",state:0,id:Math.random()};files.sendText({action:"download",sub:"start",id:downloadFile.id,path:downloadFile.path});setDialogMode(2,"Download File",10,p13downloadFileCancel,"<div>"+downloadFile.file+"</div><br /><progress id=d2progressBar style=width:100% value=0 max="+c+" />")}function p13downloadFileCancel(){setDialogMode(0);files.sendText({action:"download",sub:"cancel",id:downloadFile.id});downloadFile=null}function p13gotDownloadCommand(a){if((downloadFile==null)||(a.id!=downloadFile.id)){return}if(a.sub=="start"){downloadFile.state=1;files.sendText({action:"download",sub:"startack",id:downloadFile.id})}else{if(a.sub=="cancel"){downloadFile=null;setDialogMode(0)}}}function p13gotDownloadBinaryData(a){if(!downloadFile||downloadFile.state==0){return}if(a.length>4){downloadFile.tsize+=(a.length-4);downloadFile.data+=a.substring(4);Q("d2progressBar").value=downloadFile.tsize}if((ReadInt(a,0)&1)!=0){saveAs(data2blob(downloadFile.data),downloadFile.file);downloadFile=null;setDialogMode(0)}else{files.sendText({action:"download",sub:"ack",id:downloadFile.id})}}var uploadFile;function p13doUploadFiles(a){if(xxdialogMode){return}uploadFile={};uploadFile.xpath=p13filetreelocation.join("/");uploadFile.xfiles=a;uploadFile.xfilePtr=-1;setDialogMode(2,"Upload File",10,p13uploadFileCancel,"<div id=p13dfileName>Connecting...</div><br /><progress id=d2progressBar style=width:100% value=0 max=0 />");p13uploadReconnect()}function onFileUploadStateChange(b,a){switch(a){case 0:p13folderup(9999);break;case 3:p13uploadNextFile();break;default:console.log("Unknown onFileUploadStateChange state",a);break}}function p13uploadReconnect(){uploadFile.ws=CreateAgentRedirect(meshserver,CreateRemoteFiles(p13gotUploadData),serverPublicNamePort,authCookie);uploadFile.ws.attemptWebRTC=false;uploadFile.ws.ctrlMsgAllowed=false;uploadFile.ws.onStateChanged=onFileUploadStateChange;uploadFile.ws.Start(filesNode._id)}function p13uploadNextFile(){uploadFile.xfilePtr++;if(uploadFile.xfiles.length>uploadFile.xfilePtr){uploadFile.xptr=0;var a=uploadFile.xfiles[uploadFile.xfilePtr];QH("p13dfileName",a.name);Q("d2progressBar").max=a.size;Q("d2progressBar").value=0;uploadFile.xreader=new FileReader();uploadFile.xreader.onload=function(){uploadFile.xdata=uploadFile.xreader.result;uploadFile.ws.sendText(JSON.stringify({action:"upload",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:a.name,size:uploadFile.xdata.byteLength}))};uploadFile.xreader.readAsArrayBuffer(a)}else{p13uploadFileCancel()}}function p13uploadFileCancel(a,b){if(uploadFile!=null){if(uploadFile.ws!=null){uploadFile.ws.Stop();uploadFile.ws=null}uploadFile=null}setDialogMode(0)}function p13gotUploadData(b){var a=JSON.parse(b);if((uploadFile==null)||(parseInt(uploadFile.xfilePtr)!=parseInt(a.reqid))){return}if(a.action=="uploadstart"){p13uploadNextPart(false);for(var c=0;c<8;c++){p13uploadNextPart(true)}}else{if(a.action=="uploadack"){p13uploadNextPart(false)}else{if(a.action=="uploaderror"){p13uploadFileCancel()}}}}function p13uploadNextPart(c){var a=uploadFile.xdata;var e=uploadFile.xptr;var d=uploadFile.xptr+4096;if(d>a.byteLength){if(c==true){return}d=a.byteLength}if(e==a.byteLength){if(uploadFile.ws!=null){uploadFile.ws.Stop();uploadFile.ws=null}if(uploadFile.xfiles.length>uploadFile.xfilePtr+1){p13uploadReconnect()}else{p13uploadFileCancel()}}else{var b=a.slice(e,d);uploadFile.ws.send(b);uploadFile.xptr=d;Q("d2progressBar").value=d}}var currentDeviceEvents=null;function deviceEventsUpdate(){var h="",a=null;for(var c in currentDeviceEvents){var b=currentDeviceEvents[c];var g=new Date(b.time);if(g.toLocaleDateString()!=a){if(a!=null){h+="</table>"}h+="<table style=width:100% cellpadding=0 cellspacing=0><tr><td class=DevSt colspan=4>"+g.toLocaleDateString()+"</td></tr>";a=g.toLocaleDateString()}var d="si3";if(b.etype=="user"){d="m2"}if(b.etype=="server"){d="si3"}var e=b.msg.split("(R)").join("&reg;");h+="<tr><td style=width:18px><div class="+d+"></div></td><td class=g1 style=float:none>&nbsp;</td><td style=background-color:#C9C9C9>"+g.toLocaleTimeString()+" - "+e+"</td><td class=g2 style=float:none>&nbsp;</td></tr><tr style=height:2px></tr>"}if(a!=null){h+="</table>"}if(h==""){h="<br><i>No Events Found</i><br><br>"}QH("p16events",h)}function refreshDeviceEvents(){meshserver.send({action:"events",nodeid:currentNode._id,limit:parseInt(p16limitdropdown.value)})}function agentConsoleHandleKeys(b){if((b.ctrlKey)||(b.altKey)){return true}var d=0,a=Q("p15consoleText");if(b.key){if(b.keyCode==13&&consoleFocus==0){p15consoleSend(b);d=1}else{if(b.keyCode==8&&consoleFocus==0){var g=a.value;a.value=g.substring(0,g.length-1);d=1}else{if(b.keyCode==27){a.value="";d=1}else{if((b.keyCode==38)||(b.keyCode==40)){var c=consoleHistory.indexOf(a.value);if((b.keyCode==38)&&((consoleHistory.length-1)>c)){a.value=consoleHistory[c+1]}else{if((b.keyCode==40)&&(c>0)){a.value=consoleHistory[c-1]}else{if((b.keyCode==40)&&(c==0)){a.value=""}}}d=1}else{if(b.key.length===1){insertTextAtCursor(a,b.key);d=1}}}}}}else{if(b.charCode!=0&&consoleFocus==0){a.value=((a.value+String.fromCharCode(b.charCode)));d=1}}if(d>0){return haltEvent(b)}}function insertTextAtCursor(a,d){if(document.selection){a.focus();sel=document.selection.createRange();sel.text=d}else{if(a.selectionStart||a.selectionStart=="0"){var c=a.selectionStart,b=a.selectionEnd;a.value=a.value.substring(0,c)+d+a.value.substring(b,a.value.length);a.setSelectionRange(b+1,b+1)}else{a.value+=myValue}}}var consoleNode;var consoleServerText="";function setupConsole(){if(xxcurrentView==115){var d=(consoleNode=="server");consoleNode="server";QH("p15deviceName","My Server Console");QE("p15consoleText",true);QH("p15statetext","");QH("p15coreName","");if(d==false){QH("p15agentConsoleText",consoleServerText);Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}}else{var d=(consoleNode==currentNode);consoleNode=currentNode;var a=meshes[consoleNode.meshid];var b=a.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;if((b&16)!=0){if(consoleNode.consoleText==null){consoleNode.consoleText=""}if(d==false){QH("p15agentConsoleText",consoleNode.consoleText);Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}var c=((consoleNode.conn&1)!=0)?true:false;QH("p15statetext",c?"Agent is online":"Agent is offline");QE("p15consoleText",c);QE("p15uploadCore",c)}else{QH("p15statetext","Access Denied");QE("p15consoleText",false);QE("p15uploadCore",false)}}}function p15consoleClear(){QH("p15agentConsoleText","");Q("id_p15consoleClear").blur();if(xxcurrentView==115){consoleServerText=""}else{consoleNode.consoleText=""}}var consoleHistory=[];function p15consoleSend(a){if(a&&a.keyCode!=13){return}var d=Q("p15consoleText").value,c="<div style=color:green>&gt; "+EscapeHtml(Q("p15consoleText").value)+"<br/></div>";Q("p15agentConsoleText").innerHTML+=c;Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight;Q("p15consoleText").value="";if(xxcurrentView==115){consoleServerText+=c;meshserver.send({action:"serverconsole",value:d})}else{consoleNode.consoleText+=c;meshserver.send({action:"msg",type:"console",nodeid:consoleNode._id,value:d})}if(d.length>0){var b=consoleHistory.indexOf(d);if(b>=0){consoleHistory.splice(b,1)}consoleHistory.unshift(d);consoleHistory.splice(10)}}function p15consoleReceive(b,a){a="<div>"+a+"</div>";if(b==="serverconsole"){consoleServerText+=a;if(consoleNode=="server"){Q("p15agentConsoleText").innerHTML+=a;Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}}else{if(b.consoleText==null){b.consoleText=a}else{b.consoleText+=a}if(consoleNode==b){Q("p15agentConsoleText").innerHTML+=a;Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}}}function p15uploadCore(a){if(xxdialogMode){return}if(a.shiftKey==true){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"default"})}else{if(a.altKey==true){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"clear"})}else{if(a.ctrlKey==true){p15uploadCore2()}else{setDialogMode(2,"Change Mesh Agent Core",3,p15uploadCoreEx,"<select id=d3coreMode style=float:right;width:260px><option value=1>Upload default server core</option><option value=2>Clear the core</option><option value=6>Upload recovery core</option><option value=3>Upload a core file</option><option value=4>Soft disconnect agent</option><option value=5>Hard disconnect agent</option></select><div>Change Core</div>")}}}}function p15uploadCoreEx(){if(Q("d3coreMode").value==1){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"default"})}else{if(Q("d3coreMode").value==2){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"clear"})}else{if(Q("d3coreMode").value==3){p15uploadCore2()}else{if(Q("d3coreMode").value==4){meshserver.send({action:"agentdisconnect",nodeid:consoleNode._id,disconnectMode:1})}else{if(Q("d3coreMode").value==5){meshserver.send({action:"agentdisconnect",nodeid:consoleNode._id,disconnectMode:2})}else{if(Q("d3coreMode").value==6){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"recovery"})}}}}}}}function p15uploadCore2(){if(xxdialogMode){return}Q("d3localmodeform").action="uploadmeshcorefile.ashx";Q("d3attrib").value=currentNode._id;setDialogMode(3,"Upload Mesh Agent Core",3,p15uploadCoreEx2);d3init()}function p15uploadCoreEx2(){var b=Q("d3uploadMode").value;if(b==1){Q("d3submit").click()}else{var a=d3getFileSel();if(a.length==1){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"custom",path:d3filetreelocation.join("/")+"/"+a[0]})}}}function account_manageAuthApp(){if(xxdialogMode||((features&4096)==0)){return}if(userinfo.otpsecret==1){account_removeOtp()}else{account_addOtp()}}function account_addOtp(){if(xxdialogMode||(userinfo.otpsecret==1)||((features&4096)==0)){return}setDialogMode(2,"Authenticator App",2,function(){meshserver.send({action:"otpauth-setup",secret:Q("d2optsecret").attributes.secret.value,token:Q("d2otpauthinput").value})},"<div id=d2optinfo>Loading...</div>","otpauth-request");meshserver.send({action:"otpauth-request"})}function account_addOtpCheck(a){var b=(Q("d2otpauthinput").value.length==6);QE("idx_dlgOkButton",b);if(a&&(a.keyCode==13)&&b){dialogclose(1)}}function account_removeOtp(){if(xxdialogMode||(userinfo.otpsecret!=1)||((features&4096)==0)){return}setDialogMode(2,"Authenticator App",3,function(){meshserver.send({action:"otpauth-clear"})},"Confirm removal of authenticator application 2-step login?")}function account_manageOtp(a){if((xxdialogMode==2)&&(xxdialogTag=="otpauth-manage")){dialogclose(0)}if(xxdialogMode||((features&4096)==0)){return}if((userinfo.otpsecret==1)||(userinfo.otphkeys>0)){meshserver.send({action:"otpauth-getpasswords",subaction:a})}}function account_manageHardwareOtp(){if((xxdialogMode==2)&&(xxdialogTag=="otpauth-hardware-manage")){dialogclose(0)}if(xxdialogMode||((features&4096)==0)){return}meshserver.send({action:"otp-hkey-get"})}function account_addhkey(a){if(a==1){var b="Type in the name of the key to add.<br /><br />";b+=addHtmlValue("Key Name",'<input id=dp1keyname style=width:230px maxlength=20 autocomplete=off placeholder="MyKey" onkeyup=account_addhkeyValidate(event,2) />')}else{if(a==2){var b="Type in a key name, select the OTP box and press the button on the YubiKey&trade;.<br /><br />";b+=addHtmlValue("Key Name",'<input id=dp1keyname style=width:230px maxlength=20 autocomplete=off placeholder="MyKey" onkeyup=account_addhkeyValidate(event,1) />');b+=addHtmlValue("YubiKey&trade; OTP","<input id=dp1key style=width:230px autocomplete=off onkeyup=account_addhkeyValidate(event,2) />")}}setDialogMode(2,"Add Security Key",3,account_addhkeyEx,b,a);Q("dp1keyname").focus()}function account_addhkeyValidate(b,a){if((b!=null)&&(b.keyCode==13)){if(a==2){dialogclose(1)}else{Q("dp1key").focus()}}}function account_addhkeyEx(a,c){var b=Q("dp1keyname").value;if(b==""){b="MyKey"}if(c==1){meshserver.send({action:"otp-hkey-setup-request",name:b})}else{if(c==2){meshserver.send({action:"otp-hkey-yubikey-add",name:b,otp:Q("dp1key").value});setDialogMode(2,"Add Security Key",0,null,"<br />Checking...<br /><br /><br />","otpauth-hardware-manage")}}}function account_removehkey(a){meshserver.send({action:"otp-hkey-remove",index:a});meshserver.send({action:"otp-hkey-get"})}function account_showVerifyEmail(){if(xxdialogMode||(userinfo.emailVerified==true)||(serverinfo.emailcheck!=true)){return}var a="Click ok to send a verification mail to:<br /><div style=padding:8px><b>"+EscapeHtml(userinfo.email)+"</b></div>Please wait a few minute to receive the verification.";setDialogMode(2,"Email Verification",3,account_showVerifyEmailEx,a)}function account_showVerifyEmailEx(){meshserver.send({action:"verifyemail",email:userinfo.email})}function account_showChangeEmail(){if(xxdialogMode){return}var a="Change your account email address here.<br /><br />";a+=addHtmlValue("Email","<input id=dp2email style=width:230px maxlength=256 onchange=account_validateEmail() onkeyup=account_validateEmail(event) />");setDialogMode(2,"Email Address Change",3,account_changeEmail,a);if(userinfo.email!=null){Q("dp2email").value=userinfo.email}account_validateEmail();Q("dp2email").focus()}function account_validateEmail(a,b){QE("idx_dlgOkButton",validateEmail(Q("dp2email").value)&&(Q("dp2email").value!=userinfo.email));if((a!=null)&&(a.keyCode==13)){dialogclose(1)}}function account_changeEmail(){meshserver.send({action:"changeemail",email:Q("dp2email").value})}function account_showDeleteAccount(){if(xxdialogMode){return}var a="To delete this account, type in the account password in both boxes below and hit ok.<br /><br />";a+="<form action='"+domainUrl+"deleteaccount' method=post><table style=margin-left:80px><tr>";a+="<td align=right>Password:</td><td><input id=apassword1 type=password name=apassword1 autocomplete=off onchange=account_validateDeleteAccount() onkeyup=account_validateDeleteAccount() /></td>";a+="</tr><tr><td align=right>Password:</td><td><input id=apassword2 type=password name=apassword2 autocomplete=off onchange=account_validateDeleteAccount() onkeyup=account_validateDeleteAccount() /></td>";a+="</tr></table><br /><div style=padding:10px;margin-bottom:4px>";a+="<input id=account_dlgCancelButton type=button value=Cancel style=float:right;width:80px;margin-left:5px onclick=dialogclose(0)>";a+='<input id=account_dlgOkButton type=submit value=OK style="float:right;width:80px" onclick=dialogclose(1)>';a+="</div><br /></form>";setDialogMode(2,"Delete Account",0,null,a);account_validateDeleteAccount();Q("apassword1").focus()}function account_showChangePassword(){if(xxdialogMode){return}var d="Change your account password by entering the old password and new password twice in the boxes below. Password hint can be used but is not recommanded.<br /><br />";d+="<table style=margin-left:60px>";d+="<tr><td align=right>Old password:</td><td><input id=apassword0 type=password name=apassword0 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /> <b></b></td></tr>";d+="<tr><td align=right>New password:</td><td><input id=apassword1 type=password name=apassword1 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /> <b><span id=dxPassWarn></span></b></td></tr>";d+="<tr><td align=right>New password:</td><td><input id=apassword2 type=password name=apassword2 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /></td></tr>";if(features&65536){d+="<tr><td align=right>Password hint:</td><td><input id=apasswordhint name=apasswordhint maxlength=250 type=text autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /></td></tr>"}d+="</table>";if(passRequirements){var b=[],c=0;for(var a in passRequirements){if((a!="reset")&&(a!="hint")){b.push(a+":"+passRequirements[a]);c++}}if(c>0){d+="<br /><span style=font-size:x-small>Requirements: "+b.join(", ")+".</span>"}}d+="<br />";setDialogMode(2,"Change Password",3,account_showChangePasswordEx,d);Q("apassword0").focus();account_validateNewPassword()}function account_showChangePasswordEx(){if(Q("apassword1").value==Q("apassword2").value){var a={action:"changepassword",oldpass:Q("apassword0").value,newpass:Q("apassword1").value};if(features&65536){a.hint=Q("apasswordhint").value}meshserver.send(a)}}function account_createMesh(){if(xxdialogMode){return}if((userinfo.emailVerified!==true)&&(serverinfo.emailcheck==true)&&(userinfo.siteadmin!=4294967295)){setDialogMode(2,"New Device Group",1,null,'Unable to create a new device group until a email address is verified. This is required for password recovery. Go to the "My Account" tab to change and verify an email address.');return}var a="Create a new device group using the options below.<br /><br />";a+=addHtmlValue("Name","<input id=dp2meshname style=width:230px maxlength=64 onchange=account_validateMeshCreate() onkeyup=account_validateMeshCreate() />");a+=addHtmlValue("Type","<div style=width:230px;margin:0;padding:0><select id=dp2meshtype style=width:100% onchange=account_validateMeshCreate() ><option value=2>Manage using a software agent</option><option value=1>Intel&reg; AMT only, no agent</option></select></div>");a+=addHtmlValue("Description","<div style=width:230px;margin:0;padding:0><textarea id=dp2meshdesc maxlength=1024 style=width:100%;resize:none></textarea></div>");setDialogMode(2,"New Device Group",3,account_createMeshEx,a);account_validateMeshCreate();Q("dp2meshname").focus()}function account_validateMeshCreate(){QE("idx_dlgOkButton",Q("dp2meshname").value.length>0)}function account_createMeshEx(a,b){meshserver.send({action:"createmesh",meshname:Q("dp2meshname").value,meshtype:Q("dp2meshtype").value,desc:Q("dp2meshdesc").value})}function account_validateDeleteAccount(){QE("account_dlgOkButton",(Q("apassword1").value.length>0)&&(Q("apassword1").value==Q("apassword2").value))}function account_validateNewPassword(){var d="",a=(Q("apassword0").value.length>0)&&(Q("apassword1").value.length>0)&&(Q("apassword1").value==Q("apassword2").value)&&(Q("apassword0").value!=Q("apassword1").value)&&(Q("apasswordhint").value!=Q("apassword1").value);if(Q("apassword1").value!=""){if(passRequirements==null||passRequirements==""){var c=checkPasswordStrength(Q("apassword1").value);if(c>=80){d="<span style=color:green>Strong<span>"}else{if(c>=60){d="<span style=color:blue>Good<span>"}else{d="<span style=color:red>Weak<span>"}}}else{var b=checkPasswordRequirements(Q("apassword1").value,passRequirements);if(b==false){a=false;d="<span style=color:red>Policy<span>"}}}QH("dxPassWarn",d);QE("idx_dlgOkButton",a)}function checkPasswordStrength(e){var g=0,d={},h=0,j={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)};if(!e){return 0}for(var b=0;b<e.length;b++){d[e[b]]=(d[e[b]]||0)+1;g+=5/d[e[b]]}for(var a in j){h+=(j[a]==true)?1:0}return parseInt(g+(h-1)*10)}function checkPasswordRequirements(e,g){if((g==null)||(g=="")||(typeof g!="object")){return true}if(g.min){if(e.length<g.min){return false}}if(g.max){if(e.length>g.max){return false}}var d=0,b=0,h=0,c=0;for(var a=0;a<e.length;a++){if(/\d/.test(e[a])){d++}if(/[a-z]/.test(e[a])){b++}if(/[A-Z]/.test(e[a])){h++}if(/\W/.test(e[a])){c++}}if(g.num&&(d<g.num)){return false}if(g.lower&&(b<g.lower)){return false}if(g.upper&&(h<g.upper)){return false}if(g.nonalpha&&(c<g.nonalpha)){return false}return true}function updateMeshes(){var e="";var a=0,b=0;for(i in meshes){if(a>1){e+="</tr><tr>";a=0}a++;b++;var d=0;if(meshes[i].links["user/"+domain+"/"+userinfo.name.toLowerCase()]){d=meshes[i].links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights}var g="Partial Rights";if(d==4294967295){g="Full Administrator"}else{if(d==0){g="No Rights"}}e+="<div onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=display:inline-block;width:431px;height:50px;padding-top:1px;padding-bottom:1px;float:left><div style=float:left;width:30px;height:100%></div><div style=height:100%;cursor:pointer onclick=gotoMesh('"+i+"')><div class=mi style=float:left;width:50px;height:50px></div><div style=height:100%><div class=g1></div><div class=e2 style=width:300px><div class=e1>"+EscapeHtml(meshes[i].name)+"</div><div>"+g+"</div></div><div class=g2 style=float:left></div></div></div></div>"}meshcount=b;QH("p2meshes",e);QV("p2noMeshFound",b==0)}function gotoMesh(a){currentMesh=meshes[a];p20updateMesh();go(20)}function server_showRestoreDlg(){if(xxdialogMode){return}var a="Restore the server using a backup, <span style=color:red>this will delete the existing server data</span>. Only do this if you know what you are doing.<br /><br />";a+='<form action="/restoreserver.ashx" enctype="multipart/form-data" method="post"><div>';a+='<input id=account_dlgFileInput type=file name=datafile style=width:100% accept=".zip,application/octet-stream,application/zip,application/x-zip,application/x-zip-compressed" onchange=account_validateServerRestore()>';a+="<input id=account_dlgCancelButton type=button value=Cancel style=float:right;width:80px;margin-left:5px onclick=dialogclose(0)>";a+="<input id=account_dlgOkButton type=submit value=OK style=float:right;width:80px onclick=dialogclose(1)>";a+="</div><br /><br /></form>";setDialogMode(2,"Restore Server",0,null,a);account_validateServerRestore()}function account_validateServerRestore(){QE("account_dlgOkButton",Q("account_dlgFileInput").files.length==1)}function server_showVersionDlg(){if(xxdialogMode){return}setDialogMode(2,"MeshCentral Version",1,null,"Loading...","MeshCentralServerUpdate");meshserver.send({action:"serverversion"})}function server_showVersionDlgUpdate(){QE("idx_dlgOkButton",Q("d2updateCheck").checked)}function server_showVersionDlgEx(){meshserver.send({action:"serverupdate"})}function server_showErrorsDlg(){if(xxdialogMode){return}setDialogMode(2,"MeshCentral Errors",1,null,"Loading...","MeshCentralServerErrors");meshserver.send({action:"servererrors"})}function server_showErrorsDlgUpdate(){QE("idx_dlgOkButton",Q("d2updateCheck").checked)}function server_showErrorsDlgEx(){meshserver.send({action:"serverclearerrorlog"})}var currentMesh;function p20updateMesh(){if(currentMesh==null){return}QH("p20meshName",EscapeHtml(currentMesh.name));var j="Unknown #"+currentMesh.mtype;var h=0;try{h=currentMesh.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights}catch(c){}if(currentMesh.mtype==1){j="Intel&reg; AMT only, no agent"}if(currentMesh.mtype==2){j="Managed using a software agent"}var o="";o+=addHtmlValue("Name",addLinkConditional(EscapeHtml(currentMesh.name),"p20editmesh(1)",(h&1)!=0));o+=addHtmlValue("Description",addLinkConditional(((currentMesh.desc&&currentMesh.desc!="")?EscapeHtml(currentMesh.desc):"<i>None</i>"),"p20editmesh(2)",(h&1)!=0));var g=[];if(currentMesh.flags){if(currentMesh.flags&1){g.push("Auto-Remove")}}g=g.join(", ");if(g==""){g="<i>None</i>"}o+=addHtmlValue("Features",addLinkConditional(g,"p20editmeshfeatures()",(h&1)!=0));o+=addHtmlValue("Type",j);if(currentMesh.mtype==2){var e="No Policy";if(currentMesh.amt){if(currentMesh.amt.type==1){e="Deactivate Client Control Mode (CCM)"}else{if(currentMesh.amt.type==2){e="Simple Client Control Mode (CCM)";if(currentMesh.amt.cirasetup==2){e+=" + CIRA"}}}}o+=addHtmlValue("Intel&reg; AMT",addLinkConditional(e,"p20editMeshAmt()",(h&4294967295)!=0))}if(h&1){o+='<br><input type=button value=Notes title="View notes about this device group" onclick=showNotes(false,"'+encodeURIComponent(currentMesh._id)+'") />'}o+="<br style=clear:both><br>";var b=currentMesh.links["user/"+domain+"/"+userinfo.name.toLowerCase()];if(b&&((b.rights&2)!=0)){o+="<a onclick=p20showAddMeshUserDialog() style=cursor:pointer;margin-right:10px><img src=images/icon-addnew.png border=0 height=12 width=12> Add User</a>"}if((h&4)!=0){if(currentMesh.mtype==1){o+='<a onclick=addCiraDeviceToMesh("'+currentMesh._id+'") style=cursor:pointer;margin-right:10px title="Add a new Intel&reg; AMT computer that is located on the internet."><img src=images/icon-installmesh.png border=0 height=12 width=12> Install CIRA</a>';o+='<a onclick=addDeviceToMesh("'+currentMesh._id+'") style=cursor:pointer;margin-right:10px title="Add a new Intel&reg; AMT computer that is located on the local network."><img src=images/icon-installmesh.png border=0 height=12 width=12> Install local</a>'}if(currentMesh.mtype==2){o+='<a onclick=addAgentToMesh("'+currentMesh._id+'") style=cursor:pointer;margin-right:10px title="Add a new computer to this mesh by installing the mesh agent."><img src=images/icon-addnew.png border=0 height=12 width=12> Install</a>';if(features&64){o+='<a onclick=inviteAgentToMesh("'+currentMesh._id+'") style=cursor:pointer;margin-right:10px title="Invite someone to install the mesh agent on this mesh."><img src=images/icon-addnew.png border=0 height=12 width=12> Invite</a>'}}}o+='<table style="color:black;background-color:#EEE;border-color:#AAA;border-width:1px;border-style:solid;border-collapse:collapse" border=0 cellpadding=2 cellspacing=0 width=100%><tbody><tr style=background-color:#AAAAAA;font-weight:bold><th scope=col style=text-align:left;width:430px>User Authorizations</th><th scope=col style=text-align:left></th></tr>';var a=1,m=[];for(var d in currentMesh.links){m.push({id:d,name:d.split("/")[2],rights:currentMesh.links[d].rights})}m.sort(function(p,q){if(p.name>q.name){return 1}if(p.name<q.name){return -1}return 0});for(var d in m){var n="",l="Partial Rights",k=m[d].rights;if(k==4294967295){l="Full Administrator"}else{if(k==0){l="No Rights"}}if((d!=userinfo._id)&&(h==4294967295||(((h&2)!=0)))){n='<a onclick=p20deleteUser(event,"'+encodeURIComponent(m[d].id)+'") title="Remote user rights to this mesh" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'}o+='<tr onclick=p20viewuser("'+encodeURIComponent(m[d].id)+'") style=cursor:pointer'+(((a%2)==0)?";background-color:#DDD":"")+'><td><div title="User" class=m2></div><div>&nbsp;'+EscapeHtml(decodeURIComponent(m[d].name))+"<div></div></div></td><td><div style=float:right>"+n+"</div><div>"+l+"</div></td></tr>";++a}o+="</tbody></table>";if(h==4294967295){o+="<div style=font-size:x-small;text-align:right><span><a onclick=p20showDeleteMeshDialog() style=cursor:pointer>Delete Group</a></span></div>"}QH("p20info",o)}function p20editMeshAmt(){if(xxdialogMode){return}var a="";a+=addHtmlValue("Type","<select id=dp20amtpolicy style=width:230px onchange=p20editMeshAmtChange()><option value=0>No Policy</option><option value=1>Deactivate Client Control Mode (CCM)</option><option value=2>Simple Client Control Mode (CCM)</option></select>");a+="<div id=dp20amtpolicydiv></div>";setDialogMode(2,"Intel&reg; AMT Policy",3,p20editMeshAmtEx,a);if(currentMesh.amt){Q("dp20amtpolicy").value=currentMesh.amt.type}p20editMeshAmtChange();if(currentMesh.amt&&currentMesh.amt.type==2){Q("dp20amtpolicypass").value=currentMesh.amt.password;Q("dp20amtbadpass").value=currentMesh.amt.badpass;if((features&1024)==0){Q("dp20amtcira").value=currentMesh.amt.cirasetup}}dp20amtValidatePolicy()}function p20editMeshAmtChange(){var a=Q("dp20amtpolicy").value,b="";if(a==2){b=addHtmlValue("Password*","<input id=dp20amtpolicypass style=width:230px maxlength=32 onchange=dp20amtValidatePolicy() onkeyup=dp20amtValidatePolicy() />");b+=addHtmlValue("Password mismatch","<select id=dp20amtbadpass style=width:230px><option value=0>Do nothing</option><option value=1>Reactivate Intel&reg; AMT</option></select>");if((features&1024)==0){b+=addHtmlValue('<span title="Client Initiated Remote Access">CIRA</span>',"<select id=dp20amtcira style=width:230px><option value=0>Don't configure</option><option value=1>Don't connect to server</option><option value=2>Connect to server</option></select>")}b+='<br/><span style="font-size:10px">* Recommanded, leave blank to assign a random password to each device.</span><br/>';b+='<span style="font-size:10px">This policy will not impact devices with Intel&reg; AMT in ACM mode.</span><br/>';b+='<span style="font-size:10px">This is not a secure policy as agents will be performing activation.</span>'}QH("dp20amtpolicydiv",b)}function dp20amtValidatePolicy(){var a=true,c=Q("dp20amtpolicy").value;if(c==2){var b=Q("dp20amtpolicypass").value;a=(b=="")?true:passwordcheck(b)}QE("idx_dlgOkButton",a)}function p20editMeshAmtEx(){var b=parseInt(Q("dp20amtpolicy").value),a={type:b};if(b==2){a={type:b,password:Q("dp20amtpolicypass").value,badpass:parseInt(Q("dp20amtbadpass").value)};if((features&1024)==0){a.cirasetup=parseInt(Q("dp20amtcira").value)}else{a.cirasetup=1}}meshserver.send({action:"meshamtpolicy",meshid:currentMesh._id,amtpolicy:a})}function p20showDeleteMeshDialog(){if(xxdialogMode){return}var a='Are you sure you want to delete group "'+EscapeHtml(currentMesh.name)+'"? Deleting the device group will also delete all information about devices within this group.<br /><br />';a+="<input id=p20check type=checkbox onchange=p20validateDeleteMeshDialog() />Confirm";setDialogMode(2,"Delete Group",3,p20showDeleteMeshDialogEx,a);p20validateDeleteMeshDialog()}function p20validateDeleteMeshDialog(){QE("idx_dlgOkButton",Q("p20check").checked)}function p20showDeleteMeshDialogEx(a,b){meshserver.send({action:"deletemesh",meshid:currentMesh._id,meshname:currentMesh.name})}function p20editmesh(a){if(xxdialogMode){return}var b=addHtmlValue("Name","<input id=dp20meshname style=width:230px maxlength=32 onchange=p20editmeshValidate() onkeyup=p20editmeshValidate() />");b+=addHtmlValue("Description","<div style=width:230px;margin:0;padding:0><textarea id=dp20meshdesc maxlength=1024 style=width:100%;resize:none></textarea></div>");setDialogMode(2,"Edit Device Group",3,p20editmeshEx,b);Q("dp20meshname").value=currentMesh.name;if(currentMesh.desc){Q("dp20meshdesc").value=currentMesh.desc}p20editmeshValidate();if(a==2){Q("dp20meshdesc").focus()}else{Q("dp20meshname").focus()}}function p20editmeshEx(){meshserver.send({action:"editmesh",meshid:currentMesh._id,meshname:Q("dp20meshname").value,desc:Q("dp20meshdesc").value})}function p20editmeshValidate(){QE("idx_dlgOkButton",Q("dp20meshname").value.length>0)}function p20editmeshfeatures(){if(xxdialogMode){return}var a=(currentMesh.flags)?currentMesh.flags:0;var b="<div><input type=checkbox id=d20flag1 "+((a&1)?"checked":"")+">Remove device on disconnect<br></div>";setDialogMode(2,"Edit Device Group Features",3,p20editmeshfeaturesEx,b)}function p20editmeshfeaturesEx(){var a=0;if(Q("d20flag1").checked){a+=1}meshserver.send({action:"editmesh",meshid:currentMesh._id,flags:a})}function p20showAddMeshUserDialog(){if(xxdialogMode){return}var a="Allow a user to manage this device group and devices in this group<br /><br />";a+=addHtmlValue("User Name","<input id=dp20username style=width:230px maxlength=32 onchange=p20validateAddMeshUserDialog() onkeyup=p20validateAddMeshUserDialog() />");a+='<br><div style="height:120px;overflow-y:scroll;border:1px solid gray">';a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20fulladmin>Full Administrator<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20editmesh>Edit Device Group<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20manageusers>Manage Device Group Users<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20managecomputers>Manage Device Group Computers<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remotecontrol>Remote Control<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remoteview style=margin-left:12px>Remote View Only<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remotelimitedinput style=margin-left:12px>Limited Input Only<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20noterminal style=margin-left:12px>No Terminal Access<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20nofiles style=margin-left:12px>No File Access<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20noamt style=margin-left:12px>No Intel&reg; AMT<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20meshagentconsole>Mesh Agent Console<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20meshserverfiles>Server Files<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20wakedevices>Wake Devices<br>";a+="<input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20editnotes>Edit Device Notes<br>";a+="</div>";setDialogMode(2,"Add User to Device Group",3,p20showAddMeshUserDialogEx,a);p20validateAddMeshUserDialog();Q("dp20username").focus()}function p20validateAddMeshUserDialog(){var a=currentMesh.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights;QE("idx_dlgOkButton",(Q("dp20username").value.length>0));QE("p20fulladmin",a==4294967295);QE("p20editmesh",(!Q("p20fulladmin").checked)&&(a==4294967295));QE("p20manageusers",!Q("p20fulladmin").checked);QE("p20managecomputers",!Q("p20fulladmin").checked);QE("p20remotecontrol",!Q("p20fulladmin").checked);QE("p20meshagentconsole",!Q("p20fulladmin").checked);QE("p20meshserverfiles",!Q("p20fulladmin").checked);QE("p20wakedevices",!Q("p20fulladmin").checked);QE("p20editnotes",!Q("p20fulladmin").checked);QE("p20remoteview",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked);QE("p20remotelimitedinput",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked&&!Q("p20remoteview").checked);QE("p20noterminal",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked);QE("p20nofiles",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked);QE("p20noamt",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked)}function p20showAddMeshUserDialogEx(){var a=0;if(Q("p20fulladmin").checked==true){a=4294967295}else{if(Q("p20editmesh").checked==true){a+=1}if(Q("p20manageusers").checked==true){a+=2}if(Q("p20managecomputers").checked==true){a+=4}if(Q("p20remotecontrol").checked==true){a+=8}if(Q("p20meshagentconsole").checked==true){a+=16}if(Q("p20meshserverfiles").checked==true){a+=32}if(Q("p20wakedevices").checked==true){a+=64}if(Q("p20editnotes").checked==true){a+=128}if(Q("p20remoteview").checked==true){a+=256}if(Q("p20noterminal").checked==true){a+=512}if(Q("p20nofiles").checked==true){a+=1024}if(Q("p20noamt").checked==true){a+=2048}if(Q("p20remotelimitedinput").checked==true){a+=4096}}meshserver.send({action:"addmeshuser",meshid:currentMesh._id,meshname:currentMesh.name,username:Q("dp20username").value,meshadmin:a})}function p20viewuser(e){if(xxdialogMode){return}e=decodeURIComponent(e);var d="",b=currentMesh.links["user/"+domain+"/"+userinfo.name.toLowerCase()].rights,c=currentMesh.links[e].rights;if(c==4294967295){d=", Full Administrator (all rights)"}else{if((c&1)!=0){d+=", Edit Device Group"}if((c&2)!=0){d+=", Manage Device Group Users"}if((c&4)!=0){d+=", Manage Device Group Computers"}if((c&8)!=0){d+=", Remote Control"}if((c&16)!=0){d+=", Agent Console"}if((c&32)!=0){d+=", Server Files"}if((c&64)!=0){d+=", Wake Devices"}if((c&128)!=0){d+=", Edit Notes"}if(((c&8)!=0)&&(c&256)!=0){d+=", Remote View Only"}if(((c&8)!=0)&&(c&512)!=0){d+=", No Terminal"}if(((c&8)!=0)&&(c&1024)!=0){d+=", No Files"}if(((c&8)!=0)&&(c&2048)!=0){d+=", No Intel&reg; AMT"}if(((c&8)!=0)&&((c&4096)!=0)&&((c&256)==0)){d+=", Limited Input"}}d=d.substring(2);if(d==""){d="No Rights"}var a=1,g=addHtmlValue("User Name",EscapeHtml(decodeURIComponent(e.split("/")[2])));g+=addHtmlValue("Permissions",d);if((("user/"+domain+"/"+userinfo.name.toLowerCase())!=e)&&(b==4294967295||(((b&2)!=0)&&(c!=4294967295)))){a+=4}setDialogMode(2,"Device Group User",a,p20viewuserEx,g,e)}function p20viewuserEx(a,b){if(a!=2){return}setDialogMode(2,"Remote Mesh User",3,p20viewuserEx2,"Confirm removal of user "+b.split("/")[2]+"?",b)}function p20deleteUser(a,b){haltEvent(a);p20viewuserEx(2,decodeURIComponent(b))}function p20viewuserEx2(a,b){meshserver.send({action:"removemeshuser",meshid:currentMesh._id,meshname:currentMesh.name,userid:b})}var filetreelinkpath;var filetreelocation=[];function updateFiles(){QV("MainMenuMyFiles",((features&8)==0));if((features&8)!=0){return}var q="",r="",c="<a style=cursor:pointer onclick=p5folderup(0)>Root</a>",o="Root",y,k=filetree,m=1;var j=[],v=filetreelinkpath,b=[],a=document.getElementsByName("fc");for(var s=0;s<a.length;s++){if(a[s].checked){b.push(a[s].value)}}filetreelinkpath="";for(var s in filetreelocation){if((k.f!=null)&&(k.f[filetreelocation[s]]!=null)){j.push(filetreelocation[s]);o+=" / "+filetreelocation[s];if((m==1)){var B=filetreelocation[s].split("/");y=window.location+B[0]+"files/"+B[2];filetreelinkpath+=filetreelocation[s]}else{if(filetreelinkpath!=""){filetreelinkpath+="/"+filetreelocation[s];if(m>2){y+="/"+filetreelocation[s]}}}k=k.f[filetreelocation[s]];c+=" / <a style=cursor:pointer onclick=p5folderup("+m+")>"+(k.n!=null?k.n:filetreelocation[s])+"</a>";m++}else{break}}filetreelocation=j;var w=o.toLowerCase().startsWith("root / "+userinfo._id+" / public");var l=p5sort_files(k.f);for(var s in l){var d=l[s],u=d.n,A;A=u;if(u.length>70){A='<span title="'+EscapeHtml(u)+'">'+EscapeHtml(u.substring(0,70))+"...</span>"}else{A=EscapeHtml(u)}u=EscapeHtml(u);var g="";if(d.d!=null){var e=new Date(d.d),g=(e.getMonth()+1)+"/"+(e.getDate())+"/"+e.getFullYear()+" "+e.toLocaleTimeString()+"&nbsp;"}var n="";if(d.s!=null){n=getFileSizeStr(d.s)}var p="";if(d.t<3||d.t==4){var z=(d.t==1||d.t==4)?p5getQuotabar(d):"",C="";p="<div class=filelist file=999><input file=999 style=float:left name=fc class=fcb type=checkbox onchange=p5setActions() value='"+u+"'>&nbsp;<span style=float:right title=\""+C+'">'+z+"</span><span><div class=fileIcon"+d.t+' onclick=p5folderset("'+encodeURIComponent(d.nx)+'")></div><a style=cursor:pointer onclick=p5folderset("'+encodeURIComponent(d.nx)+'")>'+A+"</a></span></div>"}else{var t=A;var x="";if(w){x=' (<a style=cursor:pointer title="Display public link" onclick=\'p5showPublicLink("'+y+"/"+d.nx+"\")'>Link</a>)"}if(d.s>0){t='<a rel="noreferrer noopener" target="_blank" href="downloadfile.ashx?link='+encodeURIComponent(filetreelinkpath+"/"+d.nx)+'">'+A+"</a>"+x}p="<div class=filelist file=3><input file=3 style=float:left name=fc class=fcb type=checkbox onchange=p5setActions() value='"+d.nx+"'>&nbsp;<span class=fsize>"+g+"</span><span style=float:right>"+n+"</span><span><div class=fileIcon"+d.t+"></div>"+t+"</span></div>"}if(d.t<3){q+=p}else{r+=p}}QH("p5rightOfButtons",p5getQuotabar(k));QH("p5files",q+r);QH("p5currentpath",c);QE("p5FolderUp",filetreelocation.length!=0);QV("p5PublicShare",w);if(v==filetreelinkpath){a=document.getElementsByName("fc");for(var s=0;s<a.length;s++){a[s].checked=(b.indexOf(a[s].value)>=0)}}p5setActions()}function getNiceSize(a){if(a<=0){return"Storage limit exceed"}if(a<2048){return a+" bytes remaining"}if(a<2097152){return Math.round(a/1024)+" kilobytes remaining"}if(a<2147483648){return Math.round(a/1024/1024)+" megabytes remaining"}return Math.round(a/1024/1024/1024)+" gigabytes remaining"}function getNiceSize2(a){if(a<=0){return"None"}if(a<2048){return a+" b"}if(a<2097152){return Math.round(a/1024)+" Kb"}if(a<2147483648){return Math.round(a/1024/1024)+" Mb"}return Math.round(a/1024/1024/1024)+" Gb"}function p5getQuotabar(a){while(a.t>1&&a.t!=4){a=a.parent}if((a.t!=1&&a.t!=4)||(a.maxbytes==null)){return""}var b=Math.floor(a.s/1024),c=(a.maxbytes-a.s);return'<span title="'+b+"k in "+a.c+" file"+(a.c>1?"s":"")+". "+(Math.floor(a.maxbytes/1024/1024))+'k maxinum">'+getNiceSize(c)+" <progress style=height:10px;width:100px value="+a.s+" max="+a.maxbytes+" /></span>"}function p5showPublicLink(a){setDialogMode(2,"Public Link",1,null,'<input type=text style=width:100% value="'+a+'" readonly />')}var sortorder;function p5sort_filename(c,d){if(c.ln>d.ln){return(1*sortorder)}if(c.ln<d.ln){return(-1*sortorder)}return 0}function p5sort_timestamp(c,d){if(c.d>d.d){return(1*sortorder)}if(c.d<d.d){return(-1*sortorder)}return 0}function p5sort_bysize(c,d){if(c.s==d.s){return p5sort_filename(c,d)}return(((c.s-d.s))*sortorder)}function p5sort_files(a){var c=[],d=Q("p5sortdropdown").value;for(var b in a){a[b].nx=b;if(a[b].n==null){a[b].n=b}a[b].ln=a[b].n.toLowerCase();c.push(a[b])}sortorder=1;if(d>3){sortorder=-1;d-=3}if(d==1){c.sort(p5sort_filename)}else{if(d==2){c.sort(p5sort_bysize)}else{if(d==3){c.sort(p5sort_timestamp)}}}return c}function p5setActions(){var a=getFileSelCount(),c=getFileCount(),b=getFileSelCount(false);QE("p5DeleteFileButton",(a>0)&&(filetreelocation.length>0));QE("p5NewFolderButton",filetreelocation.length>0);QE("p5UploadButton",filetreelocation.length>0);QE("p5RenameFileButton",(a==1)&&(filetreelocation.length>0));QE("p5SelectAllButton",c>0);Q("p5SelectAllButton").value=(a>0?"Select None":"Select All");QE("p5CutButton",(b>0)&&(a==b));QE("p5CopyButton",(b>0)&&(a==b));QE("p5PasteButton",(p5clipboard!=null)&&(p5clipboard.length>0)&&(filetreelocation.length>0))}function getFileSelCount(d){var a=0,b=document.getElementsByName("fc");for(var c=0;c<b.length;c++){if((b[c].checked)&&((d!=false)||(b[c].attributes.file.value=="3"))){a++}}return a}function getFileSelDirCount(){var a=0,b=document.getElementsByName("fc");for(var c=0;c<b.length;c++){if((b[c].checked)&&(b[c].attributes.file.value=="999")){a++}}return a}function getFileCount(){var a=0;var b=document.getElementsByName("fc");return b.length}function p5selectallfile(){var c=(getFileSelCount()==0),a=document.getElementsByName("fc");for(var b=0;b<a.length;b++){a[b].checked=c}p5setActions()}function setupBackPointers(d){if(d.f!=null){var b=0,a=0;for(var c in d.f){setupBackPointers(d.f[c]);d.f[c].parent=d;if(d.f[c].s){b+=d.f[c].s}if(d.f[c].c){a+=d.f[c].c}if(d.f[c].t==3){a++}}d.s=b;d.c=a}return d}function getFileSizeStr(a){if(a==1){return"1 byte"}return""+a+" bytes"}function p5folderup(a){if(a==null){filetreelocation.pop()}else{while(filetreelocation.length>a){filetreelocation.pop()}}updateFiles()}function p5folderset(a){filetreelocation.push(decodeURIComponent(a));updateFiles()}function p5createfolder(){setDialogMode(2,"New Folder",3,p5createfolderEx,"<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% />");focusTextBox("p5renameinput");p5fileNameCheck()}function p5createfolderEx(){meshserver.send({action:"fileoperation",fileop:"createfolder",path:filetreelocation,newfolder:Q("p5renameinput").value})}function p5deletefile(){var a=getFileSelCount(),b=(getFileSelDirCount()>0)?"<br /><br /><input type=checkbox id=p5recdeleteinput>Recursive delete<br>":"<input type=checkbox id=p5recdeleteinput style='display:none'>";setDialogMode(2,"Delete",3,p5deletefileEx,(a>1)?("Delete "+a+" selected items?"+b):("Delete selected item?"+b))}function p5deletefileEx(){var b=[],a=document.getElementsByName("fc");for(var c=0;c<a.length;c++){if(a[c].checked){b.push(a[c].value)}}meshserver.send({action:"fileoperation",fileop:"delete",path:filetreelocation,delfiles:b,rec:Q("p5recdeleteinput").checked})}function p5renamefile(){var c,a=document.getElementsByName("fc");for(var b=0;b<a.length;b++){if(a[b].checked){c=a[b].value}}setDialogMode(2,"Rename",3,p5renamefileEx,'<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% value="'+c+'" />',{action:"fileoperation",fileop:"rename",path:filetreelocation,oldname:c});focusTextBox("p5renameinput");p5fileNameCheck()}function p5renamefileEx(a,c){c.newname=Q("p5renameinput").value;meshserver.send(c)}function p5fileNameCheck(a){var b=isFilenameValid(Q("p5renameinput").value);QE("idx_dlgOkButton",b);if((b==true)&&(a&&a.keyCode==13)){dialogclose(1)}}var isFilenameValid=(function(){var b=/^[^\\/:\*\?"<>\|]+$/,c=/^\./,d=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i;return function a(e){return b.test(e)&&!c.test(e)&&!d.test(e)&&(e[0]!=".")}})();function p5uploadFile(){setDialogMode(2,"Upload File",3,p5uploadFileEx,'<form method=post enctype=multipart/form-data action=uploadfile.ashx target=fileUploadFrame><input type=text name=link style=display:none id=p5uploadpath value="'+encodeURIComponent(filetreelinkpath)+'" /><input type=file name=files id=p5uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p5uploadinput\')" /><input type=submit id=p5loginSubmit style=display:none /></form>');updateUploadDialogOk("p5uploadinput")}function p5uploadFileEx(){Q("p5loginSubmit").click()}function updateUploadDialogOk(a){QE("idx_dlgOkButton",Q(a).value!="")}var p5clipboard=null,p5clipboardFolder=null,p5clipboardCut=0;function p5copyFile(b){var a=document.getElementsByName("fc");p5clipboard=[];p5clipboardCut=b,p5clipboardFolder=Clone(filetreelocation);for(var c=0;c<a.length;c++){if((a[c].checked)&&(a[c].attributes.file.value=="3")){p5clipboard.push(a[c].value)}}p5updateClipview()}function p5pasteFile(){var a="";if((p5clipboard!=null)&&(p5clipboard.length>0)){a="Confim "+(p5clipboardCut==0?"copy":"move")+" of "+p5clipboard.length+" entrie"+((p5clipboard.length>1)?"s":"")+" to this location?"}setDialogMode(2,"Paste",3,p5pasteFileEx,a)}function p5pasteFileEx(){meshserver.send({action:"fileoperation",fileop:(p5clipboardCut==0?"copy":"move"),scpath:p5clipboardFolder,path:filetreelocation,names:p5clipboard});p5folderup(999);if(p5clipboardCut==1){p5clipboard=null,p5clipboardFolder=null,p5clipboardCut=0;p5updateClipview()}}function p5updateClipview(){var a="";if((p5clipboard!=null)&&(p5clipboard.length>0)){a="Holding "+p5clipboard.length+" entrie"+((p5clipboard.length>1)?"s":"")+" for "+(p5clipboardCut==0?"copy":"move")+", <a onclick=p5clearClip() style=cursor:pointer>Clear</a>."}QH("p5bottomstatus",a);p5setActions()}function p5clearClip(){p5clipboard=null;p5clipboardFolder=null;p5clipboardCut=0;p5updateClipview()}function p5fileDragDrop(b){if(xxdialogMode){return}haltEvent(b);QV("bigfail",false);QV("bigok",false);var c=0;p5uploadFile();try{Q("p5uploadinput").files=b.dataTransfer.files}catch(d){c=1}if(c==0){p5uploadFileEx()}setDialogMode(0);if(c==1){if(b.dataTransfer==null||b.dataTransfer.files.length==0||filetreelocation.length==0){return}var j=[],m=[],o=[],a=[],l=b.dataTransfer.files.length,n=0;for(var h=0;h<b.dataTransfer.files.length;h++){n+=b.dataTransfer.files[h].size}if(n>1300000){p5uploadFile();return}for(var h=0;h<b.dataTransfer.files.length;h++){var k=new FileReader(),g=b.dataTransfer.files[h];j.push(g.name);m.push(g.size);o.push(g.type);k.onload=function(e){a.push(e.target.result);if(--l==0){Q("p5fileDragName").value=j.join("*");Q("p5fileDragSize").value=m.join("*");Q("p5fileDragType").value=o.join("*");Q("p5fileDragData").value=a.join("*");Q("p5fileDragLink").value=encodeURIComponent(filetreelinkpath);Q("p5loginSubmit2").click()}};k.readAsDataURL(g)}}}var p5dragtimer=null;function p5fileDragOver(b){if(xxdialogMode){return}haltEvent(b);if(p5dragtimer!=null){clearTimeout(p5dragtimer);p5dragtimer=null}var a=true;if(filetreelocation.length==0){a=false}QV("bigok",a);QV("bigfail",!a)}function p5fileDragLeave(a){if(xxdialogMode){return}haltEvent(a);if(a.target.id!="p5filetable"){QV("bigfail",false);QV("bigok",false)}else{p5dragtimer=setTimeout(function(){QV("bigfail",false);QV("bigok",false);p5dragtimer=null},10)}}function eventMouseHover(a,b){a.children[1].classList.remove("g1s");a.children[2].style["background-color"]=((b==0)?"#c9c9c9":"#b9b9b9");a.children[3].classList.remove("g2s");if(b==1){a.children[1].classList.add("g1s");a.children[3].classList.add("g2s")}}function eventsUpdate(){var h="",a=null;for(var c in events){var b=events[c],g=new Date(b.time);if(g.toLocaleDateString()!=a){if(a!=null){h+="</table>"}h+="<table style=width:100% cellpadding=0 cellspacing=0><tr><td colspan=4 class=DevSt>"+g.toLocaleDateString()+"</td></tr>";a=g.toLocaleDateString()}var d="si3";if(b.etype=="user"){d="m2"}if(b.etype=="server"){d="si3"}var e=b.msg.split("(R)").join("&reg;");if(b.username&&b.username!=userinfo.name){e+=": "+b.username}h+="<tr onmouseover=eventMouseHover(this,1) onmouseout=eventMouseHover(this,0) style=cursor:pointer><td style=width:18px><div class="+d+"></div></td><td class=g1 style=float:none>&nbsp;</td><td style=background-color:#C9C9C9>"+g.toLocaleTimeString()+" - "+e+"</td><td class=g2 style=float:none>&nbsp;</td></tr><tr style=height:2px></tr>"}if(a!=null){h+="</table>"}if(h==""){h="<br><i>No Events Found</i><br><br>"}QH("p3events",h)}function showDeleteAllEventsDialog(){if(xxdialogMode){return}var a="Delete all events in the server event log?<br /><br />";a+="<input id=p3check type=checkbox onchange=validateDeleteAllEventsDialog() />Confirm";setDialogMode(2,"Delete All Events",3,showDeleteAllEventsDialogEx,a);validateDeleteAllEventsDialog()}function validateDeleteAllEventsDialog(){QE("idx_dlgOkButton",Q("p3check").checked)}function showDeleteAllEventsDialogEx(a,b){meshserver.send({action:"clearevents"})}function refreshEvents(){meshserver.send({action:"events",limit:parseInt(p3limitdropdown.value)})}function updateUsers(){QV("MainMenuMyUsers",(users!=null)&&((features&4)==0));QV("LeftMenuMyUsers",(users!=null)&&((features&4)==0));QV("UserNewAccountButton",((features&4)==0)&&(serverinfo.domainauth==false));if((users==null)||((features&4)!=0)){QH("p3users","");return}var h=[],e=100,c=0;for(var d in users){h.push(d)}h.sort();var k=Q("UserSearchInput").value.toLowerCase();var b=k;if(k.startsWith("email:")){k=null;b=b.substring(6)}else{if(k.startsWith("name:")){b=null;k=k.substring(5)}else{if(k.startsWith("e:")){k=null;b=b.substring(2)}else{if(k.startsWith("n:")){b=null;k=k.substring(2)}}}}var l="<table style=width:100% cellpadding=0 cellspacing=0>",a=true;l+="<th style=color:gray>Name<th style=color:gray;width:80px>Groups<th style=color:gray;width:120px>Last&nbsp;Access<th style=color:gray;width:120px>Permissions";for(var d in h){var j=users[h[d]],g=null;if(wssessions!=null){g=wssessions[j._id]}if((g!=null)&&((k!=null)&&((k=="")||(j.name.toLowerCase().indexOf(k)>=0))||((b!=null)&&((j.email!=null)&&(j.email.toLowerCase().indexOf(b)>=0))))){if(e>0){if(a){l+="<tr><td class=userTableHeader colspan=4>Online Users";a=false}l+=addUserHtml(j,g);e--}else{c++}}}a=true;for(var d in h){var j=users[h[d]],g=null;if(wssessions!=null){g=wssessions[j._id]}if((g==null)&&((k!=null)&&((k=="")||(j.name.toLowerCase().indexOf(k)>=0))||((b!=null)&&((j.email!=null)&&(j.email.toLowerCase().indexOf(b)>=0))))){if(e>0){if(a){l+="<tr><td class=userTableHeader colspan=4>Offline Users";a=false}l+=addUserHtml(j,g);e--}else{c++}}}l+="</table>";if(c==1){l+="<br />1 more user not shown, use search box to look for users...<br />"}else{if(c>1){l+="<br />"+c+" more users not shown, use search box to look for users...<br />"}}if(e==100){l+="<br />No users found.<br />"}QH("p3users",l);if((currentUser!=null)&&(xxcurrentView==30)){gotoUser(encodeURIComponent(currentUser._id),true)}}function addUserHtml(m,l){var o="",b=" gray",e="m2",h="",k=(m.name!=userinfo.name),g="",j="";if(l!=null){b="";if(k){h='<span style=float:right;margin-top:1px;margin-right:4px title=Chat><a onclick=userChat(event,"'+encodeURIComponent(m._id)+'","'+encodeURIComponent(m.name)+"\")><img src='images/icon-chat.png' height=16 width=16 style=padding-top:2px /></a></span>";h+='<span style=float:right;margin-top:1px;margin-left:4px;margin-right:4px title=Notify><a onclick=showUserAlertDialog(event,"'+encodeURIComponent(m._id)+"\")><img src='images/icon-notify.png' height=16 width=16 style=padding-top:2px /></a></span>"}if(l==1){g+="1&nbsp;session"}else{g+=l+"&nbsp;sessions"}}else{if(m.login){g+='<span title="Last login: '+new Date(m.login*1000).toLocaleString()+'">'+new Date(m.login*1000).toLocaleDateString()+"</span>"}}if(k){j+='<a style=cursor:pointer onclick=showUserAdminDialog(event,"'+encodeURIComponent(m._id)+'")>'}if((m.siteadmin!=null)&&((m.siteadmin&32)!=0)&&(m.siteadmin!=4294967295)){j+="Locked,&nbsp;"}j+="<span title='Server Permissions'>";if((m.siteadmin==null)||(m.siteadmin==0)||(m.siteadmin==32)){j+="User"}else{if(m.siteadmin==8){j+="User + Files"}else{if(m.siteadmin==4294967295){j+="Administrator"}else{j+="Partial"}}}j+="</span>";if(k){j+="</a>"}var c=0;if(m.links){for(var d in m.links){c++}}var n=EscapeHtml(m.name),a="";if(serverinfo.emailcheck==true){a=((m.emailVerified!=true)?' <b style=color:red title="Email is not verified">&#x1F5F4</b>':' <b style=color:green title="Email is verified">&#x1F5F8</b>')}if(m.email!=null){n+=', <a onclick=doemail(event,"'+m.email+'")>'+m.email+"</a>"+a}if((m.otpsecret>0)||(m.otphkeys>0)){n+=' <img src="images/key12.png" height=12 width=11 title="2nd factor authentication enabled" style="margin-top:2px" />'}if((m.siteadmin!=null)&&((m.siteadmin&32)!=0)&&(m.siteadmin!=4294967295)){n+=' <img src="images/padlock12.png" height=12 width=8 title="Account is locked" style="margin-top:2px" />'}o+='<tr onmouseover=userMouseHover(this,1) onmouseout=userMouseHover(this,0)><td style=cursor:pointer onclick=gotoUser("'+encodeURIComponent(m._id)+'")>';o+="<div class=bar style=height:24px;width:100%;font-size:medium>";o+='<div style=float:left;height:24px;width:24px;background-color:white><div class="'+e+b+'" style=width:16px;margin-top:4px;margin-left:2px;height:16px></div></div>';o+="<div class=g1 style=height:24px;float:left></div><div class=g2 style=height:24px;float:right></div>";o+="<div><span>"+n+"</span>"+h+"</div></div><td style=text-align:center>"+c+"<td style=text-align:center>"+g+"<td style=text-align:center>"+j;return o}function userMouseHover(b,c){var a=b.children[0].children[0];a.children[1].classList.remove("g1s");a.children[2].classList.remove("g2s");if(c==1){a.children[1].classList.add("g1s");a.children[2].classList.add("g2s")}b.children[0].children[0].style["background-color"]=((c==0)?"#c9c9c9":"#b9b9b9")}function userChat(a,d,b){haltEvent(a);var c="/messenger?id=meshmessenger/"+d+"/"+encodeURIComponent(userinfo._id)+"&title="+b;if((authCookie!=null)&&(authCookie!="")){c+="&auth="+authCookie}window.open(c,"meshmessenger:"+d);meshserver.send({action:"meshmessenger",userid:decodeURIComponent(d)});return false}function showUserAlertDialog(a,b){if(xxdialogMode){return}haltEvent(a);setDialogMode(2,"Notify "+EscapeHtml(users[decodeURIComponent(b)].name),3,showUserAlertDialogEx,'Send a text notification to this user.<textarea id=d2notifyText maxlength=2048 style="width:100%;height:184px;resize:none"></textarea>',b);Q("d2notifyText").focus();return false}function showUserAlertDialogEx(a,b){meshserver.send({action:"notifyuser",userid:decodeURIComponent(b),msg:Q("d2notifyText").value})}function doemail(b,a){if(xxdialogMode){return}haltEvent(b);window.open("mailto:"+a);return false}function showUserBroadcastDialog(){if(xxdialogMode){return}var a='Broadcast a message to all connected users.<textarea id=broadcastMessage value="" style=width:370px;height:100px;resize:none maxlength=256 /></textarea>';setDialogMode(2,"Broadcast Message",3,showUserBroadcastDialogEx,a);Q("broadcastMessage").focus()}function showUserBroadcastDialogEx(){meshserver.send({action:"userbroadcast",msg:Q("broadcastMessage").value})}function showCreateNewAccountDialog(){if(xxdialogMode){return}var d="";d+=addHtmlValue("Name","<input id=p4name style=width:230px maxlength=64 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />");d+=addHtmlValue("Email","<input id=p4email style=width:230px maxlength=256 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />");d+=addHtmlValue("Password","<input id=p4pass1 type=password style=width:230px maxlength=256 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />");d+=addHtmlValue("Password","<input id=p4pass2 type=password style=width:230px maxlength=256 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />");d+="<div><input id=p4resetNextLogin type=checkbox />Force password reset on next login.</div>";if(passRequirements){var b=[],c=0;for(var a in passRequirements){if((a!="reset")&&(a!="hint")){b.push(a+":"+passRequirements[a]);c++}}if(c>0){d+="<div style=font-size:x-small;padding:6px>Requirements: "+b.join(", ")+".</div>"}}setDialogMode(2,"Create Account",3,showCreateNewAccountDialogEx,d);showCreateNewAccountDialogValidate();Q("p4name").focus()}function showCreateNewAccountDialogValidate(b){if((b==null)&&(Q("p4email").value.length>0)&&(validateEmail(Q("p4email").value))==false){QE("idx_dlgOkButton",false);return}var a=(!Q("p4name")||((Q("p4name").value.length>0)&&(Q("p4name").value.indexOf(" ")==-1)))&&Q("p4pass1").value.length>0&&Q("p4pass1").value==Q("p4pass2").value&&checkPasswordRequirements(Q("p4pass1").value,passRequirements);if(a&&passRequirements){if(checkPasswordRequirements(Q("p4pass1").value,passRequirements)==false){a=false}}QE("idx_dlgOkButton",a)}function showCreateNewAccountDialogEx(){meshserver.send({action:"adduser",username:Q("p4name").value,email:Q("p4email").value,pass:Q("p4pass1").value,resetNextLogin:Q("p4resetNextLogin").checked})}function showUserAdminDialog(a,c){if(xxdialogMode){return}haltEvent(a);c=decodeURIComponent(c);var d="<div>";d+="<input type=checkbox onchange=showUserAdminDialogValidate() id=ua_fileaccess>Server Files, <input type=number onchange=showUserAdminDialogValidate() maxlength=10 style=width:80px;text-align:right id=ua_fileaccessquota>k max, blank for default<br><hr/>";d+="<input type=checkbox onchange=showUserAdminDialogValidate() id=ua_fulladmin>Full Administrator<br>";d+="<input type=checkbox onchange=showUserAdminDialogValidate() id=ua_serverbackup>Server Backup<br>";d+="<input type=checkbox onchange=showUserAdminDialogValidate() id=ua_serverrestore>Server Restore<br>";d+="<input type=checkbox onchange=showUserAdminDialogValidate() id=ua_serverupdate>Server Updates<br>";d+="<input type=checkbox onchange=showUserAdminDialogValidate() id=ua_manageusers>Manage Users<br>";d+="<hr/><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_lockedaccount>Lock Account<br>";d+="</div>";var b=users[c.toLowerCase()];setDialogMode(2,"Server Permissions",3,showUserAdminDialogEx,d,b);if(b.siteadmin&&b.siteadmin!=0){Q("ua_fulladmin").checked=(b.siteadmin==4294967295);Q("ua_serverbackup").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&1)!=0));Q("ua_manageusers").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&2)!=0));Q("ua_serverrestore").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&4)!=0));Q("ua_fileaccess").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&8)!=0));Q("ua_serverupdate").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&16)!=0));Q("ua_lockedaccount").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&32)!=0))}QE("ua_fulladmin",userinfo.siteadmin==4294967295);QE("ua_serverbackup",userinfo.siteadmin==4294967295);QE("ua_manageusers",userinfo.siteadmin==4294967295);QE("ua_serverrestore",userinfo.siteadmin==4294967295);QE("ua_fileaccess",userinfo.siteadmin==4294967295);QE("ua_serverupdate",userinfo.siteadmin==4294967295);Q("ua_fileaccessquota").value=(b.quota!=null)?(b.quota/1024):"";showUserAdminDialogValidate();return false}function showUserAdminDialogValidate(){if(userinfo.siteadmin==4294967295){QE("ua_serverbackup",!Q("ua_fulladmin").checked);QE("ua_manageusers",!Q("ua_fulladmin").checked);QE("ua_serverrestore",!Q("ua_fulladmin").checked);QE("ua_fileaccess",!Q("ua_fulladmin").checked);QE("ua_serverupdate",!Q("ua_fulladmin").checked);QE("ua_fileaccessquota",Q("ua_fileaccess").checked&&!Q("ua_fulladmin").checked)}}function showUserAdminDialogEx(a,d){var c=0,b=parseInt(Q("ua_fileaccessquota").value);if(Q("ua_fulladmin").checked==true){c=4294967295}else{if(Q("ua_serverbackup").checked==true){c+=1}if(Q("ua_manageusers").checked==true){c+=2}if(Q("ua_serverrestore").checked==true){c+=4}if(Q("ua_fileaccess").checked==true){c+=8}if(Q("ua_serverupdate").checked==true){c+=16}if(Q("ua_lockedaccount").checked==true){c+=32}}var e={action:"edituser",name:d.name,siteadmin:c};if(isNaN(b)==false){e.quota=(b*1024)}meshserver.send(e)}function onUserSearchInputChanged(){updateUsers()}var currentUser=null;function gotoUser(q,g){if(xxdialogMode&&!g){return}var p=currentUser=users[decodeURIComponent(q)];if(p==null){setDialogMode(0);go(4);return}QH("p30userName",p.name);QH("p31userName",p.name);var o=(p.name==userinfo.name),a=0;if(wssessions!=null&&wssessions[p._id]){a=wssessions[p._id]}Q("MainUserImage").classList.remove("gray");if(a==0){Q("MainUserImage").classList.add("gray")}var l="",n="";if((p.siteadmin!=null)&&((p.siteadmin&32)!=0)&&(p.siteadmin!=4294967295)){n='<img src="images/padlock12.png" height=12 width=8 title="Account is locked" style="margin-top:2px" /> ';l+="Locked account, "}if((p.siteadmin==null)||(p.siteadmin==0)||(p.siteadmin==32)){l+="No server rights"}else{if(p.siteadmin==8){l+="Access to server files"}else{if(p.siteadmin==4294967295){l+="Full administrator"}else{l+="Partial rights"}}}var r="<div style=min-height:80px><table style=width:100%>";var c=p.email?EscapeHtml(p.email):"<i>Not set</i>",d="";if(serverinfo.emailcheck){d=((p.emailVerified==true)?'<b style=color:green;cursor:pointer title="Email is verified">&#x1F5F8</b> ':'<b style=color:red;cursor:pointer title="Email not verified">&#x1F5F4</b> ')}r+=addDeviceAttribute("Email",d+'<a style=cursor:pointer onclick=p30showUserEmailChangeDialog(event,"'+q+'")>'+c+'</a> <a style=cursor:pointer onclick=doemail(event,"'+p.email+'")><img class=hoverButton width=10 height=10 src="images/link1.png" /></a>');r+=addDeviceAttribute("Server Rights",n+'<a style=cursor:pointer onclick=showUserAdminDialog(event,"'+q+'")>'+l+"</a>");if(p.quota){r+=addDeviceAttribute("Server Quota",EscapeHtml(parseInt(p.quota)/1024)+" k")}r+=addDeviceAttribute("Creation",new Date(p.creation*1000).toLocaleString());if(p.login){r+=addDeviceAttribute("Last Login",new Date(p.login*1000).toLocaleString())}if(p.passchange==-1){r+=addDeviceAttribute("Password","Will be changed on next login.")}else{if(p.passchange){r+=addDeviceAttribute("Password","Last changed: "+new Date(p.passchange*1000).toLocaleString())}}var j=0,k="<i>None<i>";if(p.links){for(var h in p.links){j++}if(j==1){k="1 group"}else{if(j>1){k=j+" groups"}}}r+=addDeviceAttribute("Device Groups",k);var m=0;if((p.otpsecret>0)||(p.otphkeys>0)){m=1;var e=[];if(p.otpsecret>0){e.push("Authentication App")}if(p.otphkeys>0){e.push("Security Key")}if(p.otpkeys>0){e.push("Backup Codes")}r+=addDeviceAttribute("Security",'<img src="images/key12.png" height=12 width=11 title="2nd factor authentication enabled" style="margin-top:2px" /> '+e.join(", "))}r+="</table></div><br />";r+='<input type=button value=Notes title="View notes about this user" onclick=showNotes(false,"'+q+'") />';if(!o&&(a>0)){r+='<input type=button value=Notify title="Send user notification" onclick=showUserAlertDialog(event,"'+q+'") />'}QH("p30html",r);drawUserTimeline();var b=true;if(p._id==userinfo._id){b=false}if(p.siteadmin&&p.siteadmin>0&&userinfo.siteadmin!=4294967295){b=false}r="<div style=float:right;font-size:x-small>";if(b){r+='<a style=cursor:pointer onclick=p30showDeleteUserDialog() title="Remove this user">Delete User</a>'}r+="</div><div style=font-size:x-small>";if(userinfo.siteadmin==4294967295){r+="<a style=cursor:pointer onclick=p30showUserChangePassDialog("+m+') title="Change the password for this user">Change Password</a>'}r+="</div><br>";QH("p30html3",r);r="";if(a==1){r="1 active session"}else{if(a>1){r=a+" active sessions"}}QH("MainUserState",r);go(30);QH("p31events","");refreshUsersEvents()}function p30showUserEmailChangeDialog(a){if(xxdialogMode){return}var b="";b+=addHtmlValue("Email","<input id=dp30email style=width:230px maxlength=32 onchange=p30validateEmail() onkeyup=p30validateEmail() />");if(serverinfo.emailcheck){b+=addHtmlValue("Status","<select id=dp30verified style=width:230px onchange=p30validateEmail()><option value=0>Not verified</option><option value=1>Verified</option></select>")}setDialogMode(2,"Change Email for "+EscapeHtml(currentUser.name),3,p30showUserEmailChangeDialogEx,b);Q("dp30email").focus();Q("dp30email").value=currentUser.email;if(serverinfo.emailcheck){Q("dp30verified").value=currentUser.emailVerified?1:0}p30validateEmail()}function p30validateEmail(){var a=Q("dp30email").value,b=a.split("@");b=(b.length==2)&&(b[0].length>0)&&(b[1].split(".").length>1)&&(b[1].length>2)&&(a.length<1024)&&((a!=userinfo.email)||((serverinfo.emailcheck==true)&&(Q("dp30verified").value!=(userinfo.emailVerified?1:0))));QE("idx_dlgOkButton",b)}function p30showUserEmailChangeDialogEx(){var a={action:"edituser",name:currentUser.name,email:Q("dp30email").value};if(serverinfo.emailcheck){a.emailVerified=(Q("dp30verified").value==1)}meshserver.send(a)}function p30showUserChangePassDialog(b){if(xxdialogMode){return}var e="";e+=addHtmlValue("Password","<input id=p4pass1 type=password style=width:230px maxlength=256 onchange=showCreateNewAccountDialogValidate(1) onkeyup=showCreateNewAccountDialogValidate(1)></input>");e+=addHtmlValue("Password","<input id=p4pass2 type=password style=width:230px maxlength=256 onchange=showCreateNewAccountDialogValidate(1) onkeyup=showCreateNewAccountDialogValidate(1)></input>");if(features&65536){e+=addHtmlValue("Password hint","<input id=p4hint type=text style=width:230px maxlength=256></input>")}if(passRequirements){var c=[],d=0;for(var a in passRequirements){if((a!="reset")&&(a!="hint")){c.push(a+":"+passRequirements[a]);d++}}if(d>0){e+="<div style=font-size:x-small;padding:6px>Requirements: "+c.join(", ")+".</div>"}}e+="<div><input id=p4resetNextLogin type=checkbox />Force password reset on next login.</div>";if(b==1){e+="<div><input id=p4twoFactorRemove type=checkbox />Remove all 2nd factor authentication.</div>"}setDialogMode(2,"Change Password for "+EscapeHtml(currentUser.name),3,p30showUserChangePassDialogEx,e,b);showCreateNewAccountDialogValidate(1);Q("p4pass1").focus()}function p30showUserChangePassDialogEx(a,e){var d=false;if((e==1)&&(Q("p4twoFactorRemove").checked==true)){d=true}if(Q("p4pass1").value==Q("p4pass2").value){var c={action:"changeuserpass",user:currentUser.name,pass:Q("p4pass1").value,removeMultiFactor:d,resetNextLogin:Q("p4resetNextLogin").checked};if(features&65536){c.hint=Q("p4hint").value}meshserver.send(c)}}function p30showDeleteUserDialog(){if(xxdialogMode){return}setDialogMode(2,"Delete User "+EscapeHtml(currentUser.name),3,p30showDeleteUserDialogEx,"Confirm deletion of user "+EscapeHtml(currentUser.name)+"?")}function p30showDeleteUserDialogEx(){meshserver.send({action:"deleteuser",userid:currentUser._id,username:currentUser.name})}function drawUserTimeline(){var s=null,o=Date.now();s=[];var e=new Date();e.setHours(0,0,0,0);e=new Date(e.getTime()-(1000*60*60*24*6));var u=e.getTime();var t=[];if(s!=null&&s.length>1){t.push([0,s[1],s[0]]);var c=s[1];for(var m=2;m<s.length;m+=2){var p=s[m],k=o;if(s.length>(m+1)){k=s[m+1]}t.push([c,c+k,p]);c=c+k}}var z="",b=1,h=new Date();h.setHours(0,0,0,0);for(var m=0;m<7;m++){var g="",q=h.getTime(),l=q+(1000*60*60*24);for(var n in t){var a=t[n];if(isTimeBlockInside(q,l,a[0],a[1])==true){var w=Math.max(q,a[0]);var r=Math.min(Math.min(l,a[1]),o);var y=Math.round((r-w)/112794);if(y>0){var v=powerStateStrings2[a[2]]+" from "+new Date(w).toLocaleTimeString()+" to "+new Date(r).toLocaleTimeString()+".";g+='<div title="'+v+'" style=display:table-cell;width:'+y+"px;background-color:"+powerColor(a[2])+";height:16px></div>"}}}z+="<tr style="+(((b%2)==0)?"background-color:#DDD":"")+"><td><div>&nbsp;"+h.toLocaleDateString()+"<div></div></div></td><td><div>"+g+"</div></td></tr>";++b;h=new Date(h.getTime()-(1000*60*60*24))}QH("p30html2",'<table style="color:black;background-color:#EEE;border-color:#AAA;border-width:1px;border-style:solid;border-collapse:collapse" border=0 cellpadding=2 cellspacing=0 width=100%><tbody><tr style=background-color:#AAAAAA;font-weight:bold><th scope=col style=text-align:center;width:150px>Day</th><th scope=col style=text-align:center>7 Day Login State</th></tr>'+z+"</tbody></table>")}var currentUserEvents=null;function userEventsUpdate(){var h="",a=null;for(var c in currentUserEvents){var b=currentUserEvents[c];var g=new Date(b.time);if(g.toLocaleDateString()!=a){if(a!=null){h+="</table>"}h+="<table style=width:100% cellpadding=0 cellspacing=0><tr><td class=DevSt>"+g.toLocaleDateString()+"</td></tr>";a=g.toLocaleDateString()}var d="si3";if(b.etype=="user"){d="m2"}if(b.etype=="server"){d="si3"}var e=b.msg.split("(R)").join("&reg;");if(b.username&&b.username!=userinfo.name){e+=": "+b.username}h+="<tr><td><div class=bar18 style=height:18px;width:100%;font-size:medium>";h+="<div style=float:left;height:18px;width:18px;background-color:white><div class="+d+" style=width:16px;margin-top:1px;margin-left:2px;height:16px></div></div>";h+="<div class=g1 style=height:18px;float:left></div><div class=g2 style=height:18px;float:right></div>";h+="<div style=font-size:14px><span style=width:300px>"+g.toLocaleTimeString()+" - "+e+"</span></div></div></td></tr>"}if(a!=null){h+="</table>"}if(h==""){h="<br><i>No Events Found</i><br><br>"}QH("p31events",h)}function refreshUsersEvents(){meshserver.send({action:"events",limit:parseInt(p31limitdropdown.value),user:currentUser.name})}function d3init(){Q("d3localFile").value="";d3modechange()}function d3modechange(){var a=Q("d3uploadMode").value;QV("d3localmode",a==1);QV("d3servermode",a==2);if(a==1){d3setActions()}else{d3updatefiles()}}var d3filetreelinkpath;var d3filetreelocation=[];function d3updatefiles(){if(Q("d3uploadMode").value==1){return}var m="",n="",e=filetree,j=1;var c=[],r=d3filetreelinkpath,b=[],a=document.getElementsByName("fc");for(var o=0;o<a.length;o++){if(a[o].checked){b.push(a[o].value)}}d3filetreelinkpath="";for(var o in d3filetreelocation){if((e.f!=null)&&(e.f[d3filetreelocation[o]]!=null)){c.push(d3filetreelocation[o]);if((j==1)){var t=d3filetreelocation[o].split("/");publicPath=window.location+t[0]+"files/"+t[2];if(d3filetreelocation[o]===userinfo._id){d3filetreelinkpath+="self"}else{d3filetreelinkpath+=(t[0]+"/"+t[2])}}else{if(d3filetreelinkpath!=""){d3filetreelinkpath+="/"+d3filetreelocation[o];if(j>2){publicPath+="/"+d3filetreelocation[o]}}}e=e.f[d3filetreelocation[o]];j++}else{break}}d3filetreelocation=c;var g=p5sort_files(e.f);for(var o in g){var d=g[o],q=d.n,s;s=q;if(q.length>70){s='<span title="'+EscapeHtml(q)+'">'+EscapeHtml(q.substring(0,70))+"...</span>"}else{s=EscapeHtml(q)}q=EscapeHtml(q);var k="";if(d.s!=null){k=getFileSizeStr(d.s)}var l="";if(d.t<3){var u="";l='<div class=filelist file=999><span style=float:right title="'+u+'"></span><span><div class=fileIcon'+d.t+' onclick=d3folderset("'+encodeURIComponent(d.nx)+'")></div>&nbsp;<a style=cursor:pointer onclick=d3folderset("'+encodeURIComponent(d.nx)+'")>'+s+"</a></span></div>"}else{var p=s;l="<div class=filelist file=3><input style=float:left name=fcx class=fcb type=checkbox onchange=d3setActions() value='"+d.nx+"'>&nbsp;<span style=float:right>"+k+"</span><span><div class=fileIcon"+d.t+"></div>"+p+"</span></div>"}if(d.t<3){m+=l}else{n+=l}}QH("d3serverfiles",m+n);QE("p3FolderUp",d3filetreelocation.length>0);d3setActions()}function d3folderset(a){d3filetreelocation.push(decodeURIComponent(a));d3updatefiles()}function d3folderup(a){if(a==null){d3filetreelocation.pop()}else{while(d3filetreelocation.length>a){d3filetreelocation.pop()}}d3updatefiles()}function d3getFileSel(){var a=[];var b=document.getElementsByName("fcx");for(var c=0;c<b.length;c++){if(b[c].checked){a.push(b[c].value)}}return a}function d3setActions(){var a=Q("d3uploadMode").value;if(a==1){QE("idx_dlgOkButton",Q("d3localFile").value.length>0)}else{QE("idx_dlgOkButton",d3getFileSel().length==1)}}var notifications=[];function clickNotificationIcon(a){if(a==true){QV("notifiyBox",true)}else{if(a==false){QV("notifiyBox",false)}else{QV("notifiyBox",QS("notifiyBox")["display"]=="none")}}drawNotifications()}function setNotificationCount(a){if(parseInt(Q("notificationCount").innerHTML)==a){return}QH("notificationCount",a);QS("notificationCount")["background-color"]=(a==0)?"lightblue":"orange";QV("notificationCount",a>0)}function drawNotifications(){var j="";if(notifications.length==0){j="<div style=margin:5px>There are currently no notifications</div>"}else{for(var c in notifications){var g=notifications[c];var k="";var a=new Date(g.time);var e=0;if(g.nodeid!=null){var h=getNodeFromId(g.nodeid);if(h!=null){e=h.icon;k="<b>"+h.name+"</b>: "}}j+='<div title="Occured at '+a.toLocaleString()+'" id="notifyx'+g.id+'" class=notification style="cursor:pointer;border-top:1px solid '+((j=="")?"transparent":"orange")+'"><div class=j'+e+' onclick="notificationSelected('+g.id+')" style=margin:5px;float:left></div><div onclick="notificationDelete('+g.id+')" class=unselectable title="Clear this notification" style=margin:5px;float:right;color:orange><b>X</b></div><div onclick="notificationSelected('+g.id+')" style=margin:5px>'+k+g.text+"</div></div>"}}var b="";if(notifications.length>1){b='<div id="notifyRemoveAll" onclick="deleteAllNotifications()" style="cursor:pointer;border-top:1px solid orange;margin:5px;color:orange;text-align:right;padding-right:3px">Clear all</div>'}QH("notifiyBox",'<div class=customScroll style="max-height:170px;overflow-y:auto;margin:5px">'+j+"</div>"+b)}function notificationSelected(b){var c=-1;for(var a in notifications){if(notifications[a].id==b){c=a}}if(c!=-1){var d=notifications[c];if(d.nodeid!=null){if(d.tag=="desktop"){gotoDevice(d.nodeid,12)}else{if(d.tag=="terminal"){gotoDevice(d.nodeid,11)}else{if(d.tag=="files"){gotoDevice(d.nodeid,13)}else{if(d.tag=="intelamt"){gotoDevice(d.nodeid,14)}else{if(d.tag=="console"){gotoDevice(d.nodeid,15)}else{gotoDevice(d.nodeid,10)}}}}}}else{if(d.tag.startsWith("meshmessenger/")){window.open("/messenger?id="+d.tag+"&title="+encodeURIComponent(d.username),d.tag.split("/")[2]);notificationDelete(b)}}}}function notificationDelete(c){var d=-1,a=Q("notifyx"+c);if(a!=null){for(var b in notifications){if(notifications[b].id==c){d=b}}if(d!=-1){notifications.splice(d,1);a.parentNode.removeChild(a);setNotificationCount(notifications.length);if(notifications.length==0){QV("notifiyBox",false)}if(notifications.length==1){QV("notifyRemoveAll",false)}if((notifications.length>0)&&(d==0)){var g=notifications[0];QS("notifyx"+g.id)["border-top"]="1px solid transparent"}}}}function addNotification(a){if(a.time==null){a.time=Date.now()}if(a.id==null){a.id=Math.random()}notifications.unshift(a);setNotificationCount(notifications.length);Q("chimes").play();clickNotificationIcon(true)}function deleteAllNotifications(){notifications=[];setNotificationCount(0);drawNotifications();QV("notifiyBox",false)}function setupServerStats(){window.serverStatCpu=new Chart(document.getElementById("serverCpuChart").getContext("2d"),{type:"doughnut",data:{datasets:[{data:[0,0],backgroundColor:["#AAAAAA","#00AA00"]}],labels:["Used","Free"]},options:{responsive:true,legend:{position:"none",},animation:{animateScale:true,animateRotate:true},width:"60px"}});window.serverStatMemory=new Chart(document.getElementById("serverMemoryChart").getContext("2d"),{type:"doughnut",data:{datasets:[{data:[0,0],backgroundColor:["#AAAAAA","#00AA00"]}],labels:["Used","Free"]},options:{responsive:true,legend:{position:"none",},animation:{animateScale:true,animateRotate:true},width:"60px"}})}var lastServerStats=null;function updateServerStats(d){if(d!=null){lastServerStats=d}else{d=lastServerStats}if(d==null){return}if(typeof d.cpuavg=="object"){var c=Math.min(d.cpuavg[0],1);window.serverStatCpu.config.data.datasets[0].data=[c,1-c];QH("serverCpuChartText",'<div style=margin-bottom:5px>CPU Load</div><div><b title="CPU load in the last minute">'+(Math.round(d.cpuavg[0]*100)/100)+'</b>, <b title="CPU load in the last 5 minutes">'+(Math.round(d.cpuavg[1]*100)/100)+'</b>, <b title="CPU load in the 15 minutes">'+(Math.round(d.cpuavg[2]*100)/100)+"</b></div>");QS("serverCpuChartView")["display"]="inline-block";window.serverStatCpu.update()}if((typeof d.totalmem=="number")&&(typeof d.freemem=="number")){window.serverStatMemory.config.data.datasets[0].data=[d.totalmem-d.freemem,d.freemem];QH("serverMemoryChartText","<div style=margin-bottom:5px>Memory</div><div><b>"+getNiceSize2(d.freemem)+"</b> free, <b>"+getNiceSize2(d.totalmem)+"</b> total</div>");QS("serverMemoryChartView")["display"]="inline-block";window.serverStatMemory.update()}var e="<div style=width:100% cellpadding=0 cellspacing=0>";if(typeof d.values=="object"){for(var a in d.values){e+="<div class=userTableHeader style=margin-bottom:4px;width:200px>"+a+"</div>";for(var b in d.values[a]){e+="<div style=display:inline-block><table style=width:300px;height:24px;background-color:#d3d9d6;margin-bottom:4px;vertical-align:middle;border-spacing:0><tr><td class=h1></td><td><span>"+b+"</span><span style=float:right>"+d.values[a][b]+"</span></td><td class=h2></td></tr></table></div>"}}}e+="</div>";QH("serverStatsTable",e)}var xxdialogMode;var xxdialogFunc;var xxdialogButtons;var xxdialogTag;var xxcurrentView=-1;function setDialogMode(j,k,a,e,d,h){xxdialogMode=j;xxdialogFunc=e;xxdialogButtons=a;xxdialogTag=h;QE("idx_dlgOkButton",true);QV("idx_dlgOkButton",a&1);QV("idx_dlgCancelButton",a&2);QV("id_dialogclose",(a&2)||(a&8));QV("idx_dlgDeleteButton",a&4);QV("idx_dlgButtonBar",a&7);if(k){QH("id_dialogtitle",k)}for(var g=1;g<24;g++){QV("dialog"+g,g==j)}QV("dialog",j);if(d){if(j==2){QH("id_dialogOptions",d)}else{QH("id_dialogMessage",d)}}}function dialogclose(e){var c=xxdialogFunc,a=xxdialogButtons,d=xxdialogTag;setDialogMode();if(((a&8)||e)&&c){c(e,d)}}function center(){if(xxcurrentView==11){deskAdjust()}else{if(xxcurrentView==10){masterUpdate(256)}else{if(xxcurrentView==1){masterUpdate(4)}}}}function messagebox(b,a){QH("id_dialogMessage",a);setDialogMode(1,b,1)}function statusbox(b,a){QH("id_dialogMessage",a);setDialogMode(1,b)}function goBack(){if(xxdialogMode){return}if((xxcurrentView>=10)&&(xxcurrentView<20)){go(1)}if((xxcurrentView>=20)&&(xxcurrentView<30)){go(2)}if((xxcurrentView>=30)&&(xxcurrentView<40)){go(4)}}function go(d){if(xxdialogMode||xxcurrentView==d){return}for(var a=0;a<32;a++){QV("p"+a,a==d)}xxcurrentView=d;var b=["LeftMenuMyDevices","LeftMenuMyAccount","LeftMenuMyEvents","LeftMenuMyFiles","LeftMenuMyUsers","LeftMenuMyServer"];for(var a in b){Q(b[a]).classList.remove("lbbuttonsel");Q(b[a]).classList.remove("lbbuttonsel2")}QV("topbar",d!=0);if(d>=10&&d<20){QS("MainMenuMyDevices").backgroundColor="#606060"}else{QS("MainMenuMyDevices").backgroundColor=((d==1)?"#003366":"#808080")}if(d==1||(d>=10&&d<20)){Q("LeftMenuMyDevices").classList.add("lbbuttonsel")}if(d==1){Q("LeftMenuMyDevices").classList.add("lbbuttonsel2")}if(d>=20&&d<30){QS("MainMenuMyAccount").backgroundColor="#606060"}else{QS("MainMenuMyAccount").backgroundColor=((d==2)?"#003366":"#808080")}if(d==2||(d>=20&&d<30)){Q("LeftMenuMyAccount").classList.add("lbbuttonsel")}if(d==2){Q("LeftMenuMyAccount").classList.add("lbbuttonsel2")}QS("MainMenuMyEvents").backgroundColor=((d==3)?"#003366":"#808080");if(d==3){Q("LeftMenuMyEvents").classList.add("lbbuttonsel","lbbuttonsel2")}if(d>=30&&d<40){QS("MainMenuMyUsers").backgroundColor="#606060"}else{QS("MainMenuMyUsers").backgroundColor=((d==4)?"#003366":"#808080")}if(d==4||(d>=30&&d<40)){Q("LeftMenuMyUsers").classList.add("lbbuttonsel")}if(d==4){Q("LeftMenuMyUsers").classList.add("lbbuttonsel2")}QS("MainMenuMyFiles").backgroundColor=((d==5)?"#003366":"#808080");if(d==5){Q("LeftMenuMyFiles").classList.add("lbbuttonsel","lbbuttonsel2")}QS("MainMenuMyServer").backgroundColor=(((d==6)||(d==115))?"#003366":"#808080");if(((d==6)||(d==115))){Q("LeftMenuMyServer").classList.add("lbbuttonsel","lbbuttonsel2")}if(webPageFullScreen){QS("column_l")["max-height"]="calc(100vh - 135px)"}else{QS("column_l")["max-height"]=(d>=10)?"calc(100vh - 159px)":"calc(100vh - 135px)"}if((d==0)&&(webPageFullScreen)){QS("page_content").position="";QV("page_leftbar",false);QS("column_l").height="calc(100vh - 110px)";QS("column_l")["max-height"]=""}QV("MainSubMenuSpan",d>=10&&d<20);QV("UserDummyMenuSpan",(d<10)&&(d!=6)&&webPageFullScreen);QV("MeshSubMenuSpan",d>=20&&d<30);QV("UserSubMenuSpan",d>=30&&d<40);QV("ServerSubMenuSpan",d==6||d==115);var c={10:"MainDev",11:"MainDevDesktop",12:"MainDevTerminal",13:"MainDevFiles",14:"MainDevAmt",15:"MainDevConsole",20:"MeshGeneral",30:"UserGeneral",31:"UserEvents",6:"ServerGeneral",115:"ServerConsole"};for(var a in c){Q(c[a]).classList.remove("style3x");Q(c[a]).classList.remove("style3sel");Q(c[a]).classList.add((d==a)?"style3sel":"style3x")}if(d==115){QV("p15",true)}QV("p15uploadCore",d!=115);QV("p15BackButton",d!=115);if((d==15)||(d==115)){setupConsole()}if(d==1){masterUpdate(4)}if((currentNode)&&(d>=10)&&(d<20)){document.title="MeshCentral - "+currentNode.name}else{document.title="MeshCentral"}}function joinPaths(){var c=[];for(var a in arguments){var b=arguments[a];if((b!=null)&&(b!="")){while(b.endsWith("/")||b.endsWith("\\")){b=b.substring(0,b.length-1)}while(b.startsWith("/")||b.startsWith("\\")){b=b.substring(1)}c.push(b)}}return c.join("/")}function putstore(b,c){try{if(typeof(localStorage)==="undefined"){return}localStorage.setItem(b,c)}catch(a){}}function getstore(b,d){try{if(typeof(localStorage)==="undefined"){return d}var c=localStorage.getItem(b);if((c==null)||(c==null)){return d}return c}catch(a){return d}}function addLink(b,a){return"<span style=cursor:pointer;text-decoration:none onclick='"+a+"'>"+b+" <img class=hoverButton width=10 height=10 src=images/link5.png></span>"}function addLinkConditional(d,b,a){if(a){return addLink(d,b)}return d}function haltEvent(a){if(a.preventDefault){a.preventDefault()}if(a.stopPropagation){a.stopPropagation()}return false}function addOption(c,d,a){var b=document.createElement("option");b.text=d;b.value=a;Q(c).add(b)}function passwordcheck(a){return(a.length>7)&&(/\d/.test(a))&&(/[a-z]/.test(a))&&(/[A-Z]/.test(a))&&(/\W/.test(a))}function methodcheck(a){if(a&&a!=null&&a.Body&&a.Body.ReturnValueStr!="SUCCESS"){messagebox("Call Error",a.Header.Method+": "+a.Body.ReturnValueStr.replace("_"," "));return true}return false}function TableStart(){return"<table cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=200px><p><td>"}function TableStart2(){return"<table cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td><p><td>"}function TableEntry(a,b){return"<tr><td><p>"+a+"<td>"+b}function FullTable(c,a){var b=TableStart();for(i in c){if(i&&c[i]){b+=TableEntry(i,c[i])}}return b+TableEnd(a)}function TableEnd(a){return"<tr><td colspan=2><p>"+(a?a:"")+"</table>"}function AddButton(b,a){return"<input type=button value='"+b+"' onclick='"+a+"' style=margin:4px>"}function AddButton2(b,a){return"<input type=button value='"+b+"' onclick='"+a+"'>"}function AddRefreshButton(a){return"<input type=button name=refreshbtn value=Refresh onclick='refreshButtons(false);"+a+"' style=margin:4px "+(refreshButtonsState==false?"disabled":"")+">"}function MoreStart(){return'<a style=cursor:pointer;color:blue id=morexxx1 onclick=QV("morexxx1",false);QV("morexxx2",true)>&#x25BC; More</a><div id=morexxx2 style=display:none><br><hr>'}function MoreEnd(){return'<a style=cursor:pointer;color:blue onclick=QV("morexxx2",false);QV("morexxx1",true)>&#x25B2; Less</a></div>'}function getSelectedOptions(e){var d=[],c;for(var a=0,b=e.options.length;a<b;a++){c=e.options[a];if(c.selected){d.push(c.value)}}return d}function getInstance(b,c){for(var a in b){if(b[a]["InstanceID"]==c){return b[a]}}return null}function getItem(b,c,d){for(var a in b){if(b[a][c]==d){return b[a]}}return null}function guidToStr(a){return a.substring(6,8)+a.substring(4,6)+a.substring(2,4)+a.substring(0,2)+"-"+a.substring(10,12)+a.substring(8,10)+"-"+a.substring(14,16)+a.substring(12,14)+"-"+a.substring(16,20)+"-"+a.substring(20)}function getUrlVars(){var d,a,e=[],b=window.location.href.slice(window.location.href.indexOf("?")+1).split("&");for(var c=0;c<b.length;c++){d=b[c].indexOf("=");if(d>0){e[b[c].substring(0,d)]=b[c].substring(d+1,b[c].length)}}return e}function addHtmlValue(a,b){return"<table><td style=width:120px>"+a+"<td><b>"+b+"</b></table>"}function addHtmlValue2(a,b){return"<div><div style=display:inline-block;float:right>"+b+"</div><div style=display:inline-block>"+a+"</div></div>"}function parseUriArgs(){var a,c={},b=window.document.location.href.split(/[\?&|\=]/);b.splice(0,1);for(d in b){switch(d%2){case 0:a=decodeURIComponent(b[d]);break;case 1:c[a]=decodeURIComponent(b[d]);var d=parseInt(c[a]);if(d==c[a]){c[a]=d}break;default:break}}return c}function focusTextBox(a){setTimeout(function(){Q(a).selectionStart=Q(a).selectionEnd=65535;Q(a).focus()},0)}function validateEmail(b){var a=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return a.test(b)}function isPrivateIP(b){return(b.startsWith("10.")||b.startsWith("172.16.")||b.startsWith("192.168."))}function u2fSupported(){return(window.u2f&&((navigator.userAgent.indexOf("Chrome/")>0)||(navigator.userAgent.indexOf("Firefox/")>0)||(navigator.userAgent.indexOf("Opera/")>0)||(navigator.userAgent.indexOf("Safari/")>0)))};</script></body></html>
\ No newline at end of file
1 +<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <style>body{margin:0;padding:0;border:0;color:black;font-size:13px;font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;background-color:#d3d9d6;}#container{background-color:#fff;width:960px;min-width:960px;margin:0 auto;border-top:0;border-right:1px solid #b7b7b7;border-bottom:0;border-left:1px solid #b7b7b7;padding:0;}#masthead{width:auto;margin:0;padding:0;overflow:auto;text-align:right;background-color:#036;width:960px;}#column_l{position:relative;float:left;width:930px;margin:0;padding:0 15px;background-color:#fff;}#footer{clear:both;overflow:auto;width:100%;text-align:center;background-color:#113962;padding-top:5px;padding-bottom:5px;}#masthead img{float:left;}#masthead p{font-size:11px;color:#fff;margin:10px 10px 0;}#footer a{color:#fff;text-decoration:underline;}#footer a:hover{color:#fff;text-decoration:none;}a{color:#036;text-decoration:underline;}.i1{background:url(../images/icons50.png) 0px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i2{background:url(../images/icons50.png) -50px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i3{background:url(../images/icons50.png) -100px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i4{background:url(../images/icons50.png) -150px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i5{background:url(../images/icons50.png) -200px 0px;height:50px;width:50px;cursor:pointer;border:none;}.i6{background:url(../images/icons50.png) -250px 0px;height:50px;width:50px;cursor:pointer;border:none;}.j1{background:url(../images/icons16.png) 0px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j2{background:url(../images/icons16.png) -16px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j3{background:url(../images/icons16.png) -32px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j4{background:url(../images/icons16.png) -48px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j5{background:url(../images/icons16.png) -64px 0px;height:16px;width:16px;cursor:pointer;border:none;}.j6{background:url(../images/icons16.png) -80px 0px;height:16px;width:16px;cursor:pointer;border:none;}.lbbutton{width:74px;height:74px;border-radius:5px;background-color:white;margin-left:8px;margin-top:8px;position:relative;cursor:pointer;opacity:0.5;}.lbbutton:hover{opacity:1;}.lbbuttonsel{opacity:0.9;}.lbbuttonsel2{width:82px;border-radius:5px 0px 0px 5px;opacity:1;}.lb1{background:url(../images/leftbar-62.jpg) -0px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb2{background:url(../images/leftbar-62.jpg) -75px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb3{background:url(../images/leftbar-62.jpg) -150px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb4{background:url(../images/leftbar-62.jpg) -225px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb5{background:url(../images/leftbar-62.jpg) -294px 0px;height:62px;width:62px;cursor:pointer;border:none;}.lb6{background:url(../images/leftbar-62.jpg) -360px 0px;height:62px;width:62px;cursor:pointer;border:none;}.m0{background :url(../images/images16.png) -32px 0px;height :16px;width :16px;border:none;float:left }.m1{background :url(../images/images16.png) -16px 0px;height :16px;width :16px;border:none;float:left }.m2{background :url(../images/images16.png) -96px 0px;height :16px;width :16px;border:none;float:left }.m3{background :url(../images/images16.png) -112px 0px;height :16px;width :16px;border:none;float:left }.si0{background :url(../images/icons16.png) 0px 0px;height :16px;width :16px;border:none;float:left }.si1{background :url(../images/icons16.png) -16px 0px;height :16px;width :16px;border:none;float:left }.si2{background :url(../images/icons16.png) -32px 0px;height :16px;width :16px;border:none;float:left }.si3{background :url(../images/icons16.png) -48px 0px;height :16px;width :16px;border:none;float:left }.si4{background :url(../images/icons16.png) -64px 0px;height :16px;width :16px;border:none;float:left }.mi{background :url(../images/meshicon50.png) 0px 0px;height:50px;width:50px;cursor:pointer;border:none }#floatframe{position:fixed;top:200px;height:300px;z-index:200;display:none;}.style1{text-align:center;}.style2{text-align:center;background-color:#808080;font-weight:bold;}.style3{text-align:center;color:white;background-color:#808080;font-weight:bold;}.style3x{text-align:center;color:white;background-color:#808080;font-weight:bold;}.style3x:hover{background-color:#606060;}.style3sel{text-align:center;color:white;background-color:#003366;font-weight:bold;}.style4{color:white;text-decoration:none;}.style5{text-align:center;background-color:#808080;font-weight:normal;}.style6{text-align:center;background-color:#D3D9D6;}.style7{font-size:large;background-color:#FFFFFF;}.style10{background-color:#C9C9C9;}.style11{font-size:large;background-color:#C9C9C9;}.style14{text-align:left;background-color:#D3D9D6;}.auto-style1{text-align:right;background-color:#D3D9D6;}.fileIcon1{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb49Y2Sj9LT2f///yH5BAEAAAMALAAAAAAQABAAAAImnI+py+1vhJwyUYAzHTL4D3qdlJWaIFJqmKod607sDKIiDUP63hQAOw==);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.fileIcon2{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAM2xV/Xur+XPgP///yH5BAEAAAMALAAAAAAQABAAAAJD3ISZIGHWUGihznesYDYATFVM+D2hJ4lgN1olxALAtAlmPCJvuMmJd6PJckDYwicrHhTD5o7plJmg0Uc0asNMkphHAQA7);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.fileIcon3{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb19IGBgbq6uv///yH5BAEAAAMALAAAAAAQABAAAAIy3ISpxgcPH2ouQgFEw1YmxnUXKEaaEZZnVWZk66JwzKpvuwZzwOgwb/C1gIOA8Yg8DgoAOw==);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.fileIcon4{background:url(../images/meshicon16.png);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px;}.filelist{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;cursor:default;-khtml-user-drag:element;background-color:white;clear:both;}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.fsize{float:right;text-align:right;width:180px;}.g1{background-position:0% 0%;width:14px;height:100%;float:left; background-image:linear-gradient(to right, #ffffff 0%, #c9c9c9 100%);background-color:#c9c9c9;background-repeat:repeat;background-attachment:scroll;}.g1s{background-image:linear-gradient(to right, #ffffff 0%, #b9b9b9 100%);}.g2{background-position:0% 0%;width:14px;height:100%;float:right; background-image:linear-gradient(to right, #c9c9c9 0%, #ffffff 100%);background-color:#c9c9c9;background-repeat:repeat;background-attachment:scroll;}.g2s{background-image:linear-gradient(to right, #b9b9b9 0%, #ffffff 100%);}.h1{background-position:0% 0%;width:14px;height:100%; background-image:linear-gradient(to right, #ffffff 0%, #d3d9d6 100%);background-color:#d3d9d6;background-repeat:repeat;background-attachment:scroll;}.h2{background-position:0% 0%;width:14px;height:100%; background-image:linear-gradient(to right, #d3d9d6 0%, #ffffff 100%);background-color:#d3d9d6;background-repeat:repeat;background-attachment:scroll;}.e1{font-size:large;margin-top:4px;margin-bottom:3px;overflow:hidden;word-wrap:hyphenate;white-space:nowrap;text-overflow:ellipsis;}.e2{float:left;height:100%;background-color:#c9c9c9;}.e2s{background-color:#b9b9b9;}.bar{font-size:large;background-color:#C9C9C9;height:24px;float:left;margin-bottom:2px;}.bar2{font-size:large;height:24px;float:left;margin-bottom:2px;}.bar18{font-size:large;background-color:#C9C9C9;height:18px;float:left;margin-bottom:2px;}.bar182{font-size:large;height:18px;float:left;margin-bottom:2px;}.devHeaderx{color:lightgray;}.DevSt{border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#DDDDDD;}.contextMenu{background:#F9F9F9;box-shadow:0 0 12px rgba( 0, 0, 0, .3 );border:1px solid #ccc; display:none;position:absolute;top:0;left:0;list-style:none;margin:0;padding:5px;min-width:100px;max-width:150px;z-index:500;}.cmtext{color:#444;display:inline-block;padding-left:8px;padding-right:8px;padding-top:5px;padding-bottom:5px;text-decoration:none;width:85%;cursor:default;overflow:hidden;position:relative;}.cmtext:hover{color:#f9f9f9;background:#444;}.gray{ filter:gray; -webkit-filter:grayscale(100%) opacity(60%); }.unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.notifiyBox{position:absolute;z-index:1000;top:50px;right:26px;width:300px;text-align:left;background-color:#F0ECCD;border:4px solid #666;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;-webkit-box-shadow:2px 2px 4px #888;-moz-box-shadow:2px 2px 4px #888;box-shadow:2px 2px 4px #888;max-height:200px;}.notifiyBox:before{content:' ';position:absolute;width:0;height:0;right:5px;top:-30px;border:15px solid;border-color:transparent #666 #666 transparent;}.notifiyBox:after{content:' ';position:absolute;width:0;height:0;right:7px;top:-24px;border:12px solid;border-color:transparent #F0ECCD #F0ECCD transparent;}.notification{width:100%;min-height:30px;}.notification:hover{background-color:#EFE8B6;}.deskToolsBar{padding:3px;}.deskToolsBar:hover{background-color:#EFE8B6;}.userTableHeader{border-bottom:1pt solid lightgray;padding-top:4px;padding-bottom:4px;}.viewSelector{width:32px;height:32px;background-color:#DDD;border-radius:3px;float:left;margin-left:5px;cursor:pointer;opacity:0.3;}.viewSelectorSel{background-color:#BBB;opacity:0.8;}.viewSelector:hover{opacity:0.5;background-color:#AAA;}.viewSelector1{margin-left:2px;margin-top:2px;background:url(../images/views.png) -0px 0px;height:28px;width:28px;}.viewSelector2{margin-left:2px;margin-top:2px;background:url(../images/views.png) -28px 0px;height:28px;width:28px;}.viewSelector3{margin-left:2px;margin-top:2px;background:url(../images/views.png) -56px 0px;height:28px;width:28px;}.viewSelector4{margin-left:2px;margin-top:2px;background:url(../images/views.png) -84px 0px;height:28px;width:28px;}.viewSelector5{margin-left:2px;margin-top:2px;background:url(../images/views.png) -112px 0px;height:28px;width:28px;}.backButtonEx{margin-left:2px;margin-top:2px;background:url(../images/views.png) -140px 0px;height:28px;width:28px;}.backButton{width:32px;height:32px;background-color:#DDD;border-radius:3px;float:left;margin-right:5px;cursor:pointer;opacity:0.3;}.backButton:hover{opacity:0.5;background-color:#AAA;}.hoverButton{opacity:0.5;}.hoverButton:hover{opacity:1;}</style> <style>.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f;}.ol-mouse-position{top:8px;right:8px;position:absolute;}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute;}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width;}.ol-overlay-container{will-change:left,right,top,bottom;}.ol-unsupported{display:none;}.ol-unselectable, .ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing;}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px;}.ol-control:hover{background-color:rgba(255,255,255,.6);}.ol-zoom{top:.5em;right:.5em;}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear;}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s;}.ol-zoom-extent{top:4.643em;left:.5em;}.ol-full-screen{right:.5em;top:.5em;}@media print{.ol-control{display:none;}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px;}.ol-control button::-moz-focus-inner{border:none;padding:0;}.ol-zoom-extent button{line-height:1.4em;}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform;}.ol-touch .ol-control button{font-size:1.5em;}.ol-touch .ol-zoom-extent{top:5.5em;}.ol-control button:focus, .ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7);}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0;}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px;}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff;}.ol-attribution li{display:inline;list-style:none;line-height:inherit;}.ol-attribution li:not(:last-child):after{content:" ";}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle;}.ol-attribution button, .ol-attribution ul{display:inline-block;}.ol-attribution.ol-collapsed ul{display:none;}.ol-attribution.ol-logo-only ul{display:block;}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em;}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em;}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em;}.ol-attribution.ol-logo-only button, .ol-attribution.ol-uncollapsible button{display:none;}.ol-zoomslider{top:4.5em;left:.5em;height:200px;}.ol-zoomslider button{position:relative;height:10px;}.ol-touch .ol-zoomslider{top:5.5em;}.ol-overviewmap{left:.5em;bottom:.5em;}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0;}.ol-overviewmap .ol-overviewmap-map, .ol-overviewmap button{display:inline-block;}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px;}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute;}.ol-overviewmap.ol-collapsed .ol-overviewmap-map, .ol-overviewmap.ol-uncollapsible button{display:none;}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7);}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move;}</style> <style> .ol-ctx-menu-container{position:absolute;padding:8px;background:#fff;color:#222;font-size:13px;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,.2);box-sizing:border-box}.ol-ctx-menu-container a,.ol-ctx-menu-container div,.ol-ctx-menu-container img,.ol-ctx-menu-container li,.ol-ctx-menu-container span,.ol-ctx-menu-container ul{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}.ol-ctx-menu-container a img{border:none}.ol-ctx-menu-container *,.ol-ctx-menu-container :after,.ol-ctx-menu-container :before{box-sizing:inherit}.ol-ctx-menu-container.ol-ctx-menu-hidden{opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container ul{list-style:none}.ol-ctx-menu-container li{position:relative;line-height:20px;padding:2px 5px}.ol-ctx-menu-container li:not(.ol-ctx-menu-separator):hover{cursor:pointer;background-color:#333;color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-submenu .ol-ctx-menu-container{border:1px solid #eee;padding:8px;top:0;opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover .ol-ctx-menu-container{opacity:1;visibility:visible;-webkit-transition-delay:0s;transition-delay:0s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:after{position:absolute;top:7px;right:10px;content:"";display:inline-block;width:.6em;height:.6em;border-right:.3em solid #222;border-top:.3em solid #222;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover:after{border-color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-separator{padding:0}.ol-ctx-menu-container li.ol-ctx-menu-separator hr{border:0;height:1px;background-image:-webkit-linear-gradient(right,transparent,rgba(0,0,0,.75),transparent);background-image:linear-gradient(270deg,transparent,rgba(0,0,0,.75),transparent)}.ol-ctx-menu-icon{text-indent:20px;background-size:20px auto;background-repeat:no-repeat;background-position:0}.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABaUlEQVQ4T72U7VHCQBCGn90GtAMuNGCswFiBWIFQgWMFxg6wArECsQKhArEBiB1Qwa1zgQn5IAYcxv13k71n3919L8KJQ07M47+BzgG9TRfZ/JBuWhS6BJFHRJICYrZGZIz3z5Ct2+B7gG6I6kt+wewdkQVwjtkAkR5mC8yu26A1oItR/cTsOweQBdgutD8G7jGm2PJ2n8oqUKIpIjd4HxTM8gvaT/F+AlmWnyWaIXKF95eNguFzTYFhNsdWu9kFgFlaFMANUH3D8wDLoLgSTSD2il8NCe2ZXQBxWDGwxmyUzzOMBZ7wy7Qb2K0wQfXjMOBuhlFpZtNty5sFaTQBuTusZdymeqs1SpYKcO9HkE3KbTd9WFijMHJQ5hBNEAYNq5Qd0dhyke0GiE4QzjqfW23mHT8Hl4DG4Lce3FPE7AtbBSdsbNqpoJLgYkRnNeUV+xwJDHTnUEkxHGbhBXUs5TjJjew/KPy94g+NRaIVRYmMXwAAAABJRU5ErkJggg==")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABc0lEQVQ4T71U21ECQRDsJgGdvQDECMQIxAjECMQILCPwzAAjECIQI0AiEDPQAPaWCBhrcKHuCUcV5f7dY3v6tUscefHIePhfwBBCF8CZqRCReRs1tQxDCH1VfQLQz4EsSY4AvIjIsgm8AhhCGKrqa9zwrqoLAKckB5HtguR1E2gBMITQU9VPAD8GICIGtl3e+xHJBwBT59xtHcsCYJZlUwA3kcGHbfDep51OZywi3/acZZm9vyJ5WR5o38uACmDunNt6ZwAkUxFZDwghDFT1jeSjiJinhVUBVNVJkiTDKO8CQA+AsbNQ7s1Ps0VVn5MkSfcCtmBoDZi1Bdx4eJ7zbBolrwPy3o9J3rWSHPs3A1BbjVKlYBaIyDgvu9LDXDU2RTZmXVW1oKyLxRD+OrkOrJLy5mVM0iaftDhuhVbsvBzMglzKUNW6IV/OOWtCM8MmVvEkmbwt83LaB19fdgOtVquUZJeknaDdobTwbOcvBzPcN/AXH1DFFWP7u9oAAAAASUVORK5CYII=")}.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABU0lEQVQ4T72U7VECMRRFz3sNaAdkacC1AtcKxApcKnCsQOwAK3CtQKxAqEBsANYOqCDPyTIC+8WCw5jfybn33dxEOPGSE/P4b6BzQG89RT47ZJoWhy5B5BGRZAMxWyEyxvtnyFdt8AagS1F9KQ6YvSMyB84xGyDSw2yO2XUbtAJ0MaqfmH0XAPIA2y7tj4F7jAm2uG1yWQZKNEHkBu+Dg2njWBJNEbnC+8uaIFRuWfuG2QxbbrOrUd0A1Tc8D7AIjkur7DAAsVf8MiWMZ3ZR2m02LPIMscATfjHqBnY7TFD9OAy4zTCCPG/MUKMM5O6wkXFr9dZq7FQqqHk/hDzbFa73cFONTZFDdRyiCcKg5rrSiLaXkiI6RjjrfG6VzDs+B5eAxuDXeYpmNRGzL2wZ/wof+du4GNFpBVqqz5HA4MM5VEYYDrOs+1I6Q9u/4Q8O9wN/AGgWjBVqQjjgAAAAAElFTkSuQmCC")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABYklEQVQ4T72U4VHCQBCF36tA91KAWIFYgViBWIFYgWMFYgdYgVCBWAFSgdiBFpAsFWSdxcDkQoBkhnF/ZjbfvX377ogjF4/Mw/8CVbUD4MynEJF5k2lqFapqz8yeAPRKkCXJEYAXEVnugm8BVXVgZq/FD+9mtgBwSrJfqF2QvN4FjYCq2jWzTwA/DhARh20qTdMRyQcA0xDCbZ3KCJhl2RTATaHgo+6HLMv8+xXJy+qB3l8FGoB5CKHsXcRV1b6ZvZF8FBH3NKotoJlNkiQZFONdlLtJ3rufbouZPSdJMjwIbKDQEzBrClx7eC4i33Uepmk6JnnXaOQifzMAtdGoRApugYiMI1uqKkrRWAfZo9MxM1+UZzFewl8mN4nYdVM83L7BkwbXLUrF3sfBLQDQBbDy08x8vOohXyEE71lVq9emuEk+3gZa3XYroCvwFyjP8yHJDsnxwaU08GxvS2uFhw78BbzWrxXgMbsHAAAAAElFTkSuQmCC")}</style> <script type="text/javascript" src="scripts/charts.js"></script> <script type="text/javascript" src="scripts/filesaver.1.1.20151003.js"></script> <script type="text/javascript" src="scripts/ol.js"></script> <script type="text/javascript" src="scripts/ol3-contextmenu.js"></script> <title>MeshCentral</title> </head> <body id="body" onload="if (typeof(startup) !== 'undefined') startup();" oncontextmenu="handleContextMenu(event)" style="display:none"> <div id="contextMenu" class="contextMenu noselect" style="display:none"> <div id="cxinfo" class="cmtext" onclick="cmaction(1,event)"><b>Information</b></div> <div id="cxdesktop" class="cmtext" onclick="cmaction(3,event)">Desktop</div> <div id="cxterminal" class="cmtext" onclick="cmaction(2,event)">Terminal</div> <div id="cxfiles" class="cmtext" onclick="cmaction(4,event)">Files</div> <div id="cxevents" class="cmtext" onclick="cmaction(5,event)">Events</div> <div id="cxconsole" class="cmtext" onclick="cmaction(6,event)">Console</div> <hr id="cxmgroupsplit"> <div id="cxmdesktop" class="cmtext" onclick="cmaction(7,event)" style="display:none">Multi-Desktop</div> </div> <div id="meshContextMenu" class="contextMenu,noselect" style="display:none;min-width:0px"> <div id="cxselectall" class="cmtext" onclick="cmmeshaction(1,event)">Select All</div> <div id="cxselectnone" class="cmtext" onclick="cmmeshaction(2,event)">Select None</div> <hr id="cxmgroupsplit2" style="display:none"> <div id="cxmmdesktop" class="cmtext" style="display:none" onclick="cmmeshaction(3,event)">Multi-Desktop</div> </div> <div id="container" style="max-height:100vh;position:relative"> <div id="notifiyBox" class="notifiyBox" style="display:none"></div> <div id="mastheadx"></div> <div id="masthead" class="noselect" style="background:url(logo.png) 0px 0px;background-color:#036;background-repeat:no-repeat;height:66px;width:100%;overflow:hidden"> <div style="float:left;height:66px;color:#c8c8c8;padding-left:20px;padding-top:8px"> <strong><font style="font-size:46px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong> </div> <div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:14px"> <strong><font style="font-size:14px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong> </div> <div style="float:right"> <div id="notificationCount" onclick="clickNotificationIcon()" class="unselectable" style="display:none;min-width:28px;font-size:20px;border-radius:5px;background-color:lightblue;text-align:center;margin:8px;cursor:pointer;padding:4px" title="Click to view current notifications">0</div> </div> <p id="logoutControl">{{{logoutControl}}}</p> </div> <div id="page_leftbar" style="height:calc(100vh - 66px);width:90px;position:absolute;z-index:1000;background:#113962;background:linear-gradient(to bottom, #104893 0%,#113962 100%);color:white;display:none"> <div style="height:16px"></div> <div id="LeftMenuMyDevices" class="lbbutton lbbuttonsel" title="My Devices" onclick="go(1)"> <div class="lb2" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyAccount" class="lbbutton" title="My Account" onclick="go(2)"> <div class="lb1" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyEvents" class="lbbutton" title="My Events" onclick="go(3)"> <div class="lb3" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyFiles" class="lbbutton" title="My Files" onclick="go(5)"> <div class="lb4" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyUsers" class="lbbutton" title="My Users" onclick="go(4)"> <div class="lb5" style="position:absolute;top:6px;left:6px"></div> </div> <div id="LeftMenuMyServer" class="lbbutton" title="My Server" onclick="go(6)" style="display:none"> <div class="lb6" style="position:absolute;top:6px;left:6px"></div> </div> </div> <div id="page_content" style="max-height:calc(100vh - 130px)"> <div id="topbarmaster"> <div id="topbar" class="noselect"> <div> <div style="position:relative"> <div style="position:absolute;top:3px;right:6px"> <span title="Toggle full width" style="cursor:pointer;color:white" onclick="toggleFullScreen(1)">&harr;</span> </div> <table id="MainMenuSpan" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="MainMenuMyDevices" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(1)">My Devices</td> <td id="MainMenuMyAccount" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(2)">My Account</td> <td id="MainMenuMyEvents" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(3)">My Events</td> <td id="MainMenuMyFiles" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(5)">My Files</td> <td id="MainMenuMyUsers" style="width:100px;height:24px;cursor:pointer;display:none" class="style3x" onclick="go(4)">My Users</td> <td id="MainMenuMyServer" style="width:100px;height:24px;cursor:pointer;display:none" class="style3x" onclick="go(6)">My Server</td> <td class="style3" style="text-align:right;height:24px">&nbsp;</td> </tr> </table> <div id="MainSubMenuSpan" style="display:none"> <table id="MainSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="MainDev" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(10)">General</td> <td id="MainDevDesktop" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(11)">Desktop</td> <td id="MainDevTerminal" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(12)">Terminal</td> <td id="MainDevFiles" style="width:100px;height:24px;cursor:pointer;display:none" class="style3x" onclick="go(13)">Files</td> <td id="MainDevEvents" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(16)">Events</td> <td id="MainDevAmt" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(14)">Intel&reg; AMT</td> <td id="MainDevConsole" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(15)">Console</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="MeshSubMenuSpan" style="display:none"> <table id="MeshSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="MeshGeneral" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(20)">General</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="UserSubMenuSpan" style="display:none"> <table id="UserSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="UserGeneral" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(30)">General</td> <td id="UserEvents" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(31)">Events</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="ServerSubMenuSpan" style="display:none"> <table id="ServerSubMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr> <td id="ServerGeneral" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(6)">General</td> <td id="ServerConsole" style="width:100px;height:24px;cursor:pointer" class="style3x" onclick="go(115)">Console</td> <td class="style3" style="height:24px">&nbsp;</td> </tr> </table> </div> <div id="UserDummyMenuSpan"> <table id="UserDummyMenu" style="width:100%;height:22px" cellpadding="0" cellspacing="0" class="style1"> <tr><td class="style3" style="text-align:right;height:24px">&nbsp;</td></tr> </table> </div> </div> </div> </div> </div> <div id="column_l"> <div id="p0" style="display:none"> <div id="p0message" style="margin:50px;text-align:center"><span id="p0span">Server disconnected</span>, <href onclick="reload()" style="cursor:pointer"><u>click to reconnect</u></href>.</div> </div> <div id="p1" style="display:none"> <div style="float:right;display:none" id="devListToolbarViewIcons"> <div id="devViewButton1" class="viewSelector" onclick="onDeviceViewChange(1)" title="Columns"><div class="viewSelector2"></div></div> <div id="devViewButton2" class="viewSelector" onclick="onDeviceViewChange(2)" title="List"><div class="viewSelector1"></div></div> <div id="devViewButton3" class="viewSelector" onclick="onDeviceViewChange(3)" title="Desktops"><div class="viewSelector3"></div></div> <div id="devViewButton4" class="viewSelector" onclick="onDeviceViewChange(4)" title="Map"><div class="viewSelector4"></div></div> </div><div><h1>My Devices</h1></div> <table class="noselect" style="width:100%;height:24px;background-color:#d3d9d6;vertical-align:middle;border-spacing:0"> <tr> <td class="h1"></td> <td id="devListToolbar" class="style14" style="display:none"> &nbsp;&nbsp;<input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All">&nbsp; <input type="button" id="GroupActionButton" disabled="disabled" value="Group Action" onclick="groupActionFunction()">&nbsp; <input id="SearchInput" type="text" style="width:120px" placeholder="Filter" onchange="masterUpdate(5)" onkeyup="masterUpdate(5)" autocomplete="off" onfocus="onSearchFocus(1)" onblur="onSearchFocus(0)">&nbsp; <label><input type="checkbox" id="RealNameCheckBox" onclick="onRealNameCheckBox()"><span title="Show devices operating system name">OS Name</span></label> </td> <td id="kvmListToolbar" class="style14" style="height:100%;display:none"> &nbsp;&nbsp;<input type="button" onclick="connectAllKvmFunction()" value="Connect All">&nbsp; <input type="button" onclick="disconnectAllKvmFunction()" value="Disconnect All">&nbsp; <label><input type="checkbox" id="autoConnectDesktopCheckbox" onclick="autoConnectDesktops(event)" title="Automatic connect">Auto&nbsp;</label> <input type="button" onclick="showMultiDesktopSettings()" value="Settings">&nbsp; </td> <td id="devMapToolbar" class="style14" style="height:100%;display:none"> &nbsp;&nbsp;<input type="text" id="mapSearchLocation" placeholder="Search Location" onfocus="onMapSearchFocus(1)" onblur="onMapSearchFocus(0)"> <input type="button" value="Search" title="Search for location" onclick="getSearchLocation()"> <input type="button" id="refreshmap" title="Reset map view" value="Reset" style="margin-left:5px" onclick="refreshMap(false,true)"> </td> <td class="auto-style1" style="height:100%"> <div style="float:right;display:none" id="devListToolbarView"> View <select id="viewselect" onchange="onDeviceViewChange()"> <option value="1">Columns <option value="2">List <option value="3">Desktops <option id="viewselectmapoption" value="4">Map </select> </div> <div style="float:right;display:none" id="devListToolbarSort"> Sort <select id="sortselect" onchange="masterUpdate(6)"> <option>Group <option>Power <option>Device <option>Tags </select> &nbsp; </div> <div style="float:right;display:none" id="devListToolbarSize"> Size <select id="sizeselect" onchange="onDeviceViewChange()"> <option value="0">Small <option value="1">Medium <option value="2">Large </select> &nbsp; </div> </td> <td class="h2"></td> </tr> </table> <div id="NoMeshesPanel" style="display:none"> <table style="width:100%;padding:20px"> <tr> <td valign="top" style="width:50px"> <img src="images/info.png" height="48" width="47"> </td> <td> To get started, <a onclick="account_createMesh()" style="cursor:pointer"><strong>click here to create a device group</strong></a>. </td> </tr> </table> </div> <div id="xdevices" class="noselect" style="max-height:calc(100vh - 239px);overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;display:none"></div> <div id="xdevicesmap" style="height:calc(100vh - 239px);width:100%;overflow:hidden;position:relative;display:none"> <div id="xmapSearchResultsDlg" style="position:absolute;display:none;max-height:280px;left:5px;top:5px;max-width:250px;z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="xmapSearchClose" style="float:right;padding:5px;cursor:pointer" onclick="mapCloseSearchWindow()"><b>X</b></div> <div style="padding:5px">Location Results</div> <div style="width:100%;margin:6px"></div> </div> <div id="xmapSearchResults" style="margin:6px"></div> </div> </div> <div id="xmap-info-window" style="text-shadow:0px 0px 15px #FFF"></div> </div> <div id="p2" style="display:none"> <h1>My Account</h1> <img id="p2AccountImage" alt="" width="150" height="103" src="images/mainaccount.jpg" style="margin-bottom:10px;margin-right:20px;float:right"> <div id="p2AccountSecurity" style="display:none"> <p><strong>Account security</strong></p> <div style="margin-left:25px"> <div id="manageAuthApp"><div style="width:15px;display:inline-block"><span id="authAppSetupCheck" style="color:green;font-size:10px"><strong>&#x2713;</strong></span></div><span><a onclick="account_manageAuthApp()" style="cursor:pointer">Manage authenticator app</a><br></span></div> <div id="manageHardwareOtp"><div style="width:15px;display:inline-block"><span id="authKeySetupCheck" style="color:green;font-size:10px"><strong>&#x2713;</strong></span></div><span><a onclick="account_manageHardwareOtp(0)" style="cursor:pointer">Manage security keys</a><br></span></div> <div id="manageOtp"><div style="width:15px;display:inline-block"><span id="authCodesSetupCheck" style="color:green;font-size:10px"><strong>&#x2713;</strong></span></div><span><a onclick="account_manageOtp(0)" style="cursor:pointer">Manage backup codes</a><br></span></div> </div> </div> <div id="p2AccountActions"> <p><strong>Account actions</strong></p> <p style="margin-left:40px"> <span id="verifyEmailId" style="display:none"><a onclick="account_showVerifyEmail()" style="cursor:pointer">Verify email</a><br></span> <a onclick="account_showChangeEmail()" style="cursor:pointer">Change email address</a><br> <a onclick="account_showChangePassword()" style="cursor:pointer">Change password</a><span id="p2nextPasswordUpdateTime"></span><br> <a onclick="account_showDeleteAccount()" style="cursor:pointer">Delete account</a><br> </p> <br style="clear:both"> </div> <strong>Device Groups</strong> ( <a onclick="account_createMesh()" style="cursor:pointer"><img height="12" src="images/icon-addnew.png" width="12" border="0"> New</a> ) <br><br> <div id="p2meshes"></div> <div id="p2noMeshFound" style="margin-left:40px;display:none">No device groups. <a onclick="account_createMesh()" style="cursor:pointer"><strong>Get started here!</strong></a></div> <br style="clear:both"> </div> <div id="p3" style="display:none"> <h1>My Events</h1> <table style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px;vertical-align:middle;border-spacing:0"> <tr> <td class="h1"></td> <td>&nbsp;<input id="p2deleteall" type="button" onclick="showDeleteAllEventsDialog()" style="display:none" value="Delete All..."></td> <td class="auto-style1"> Show <select id="p3limitdropdown" onchange="refreshEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> </td> <td class="h2"></td> </tr> </table> <div id="p3events" style="height:calc(100vh - 243px);overflow-y:scroll"></div> </div> <div id="p4" style="display:none"> <h1>My Users</h1> <table style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px;vertical-align:middle;border-spacing:0"> <tr> <td class="h1"></td> <td class="style14"> <div style="float:right"> <input type="button" onclick="showUserBroadcastDialog()" style="margin-right:6px" value="Broadcast"> </div> <div> <input id="UserNewAccountButton" type="button" style="margin-left:6px" onclick="showCreateNewAccountDialog()" value="New Account..."> <input id="UserSearchInput" type="text" style="width:120px;margin-left:6px" placeholder="Filter" onchange="onUserSearchInputChanged()" onkeyup="onUserSearchInputChanged()" autocomplete="off" onfocus="onUserSearchFocus(1)" onblur="onUserSearchFocus(0)"> </div> </td> <td class="h2"></td> </tr> </table> <div id="p3users" style="max-height:calc(100vh - 243px);overflow-y:auto"></div> </div> <div id="p5" style="display:none"> <h1>My Files</h1> <table id="p5toolbar" style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:100%;background-color:#d3d9d6;text-align:left;padding:4px" valign="bottom"> <div id="p5rightOfButtons" style="float:right;margin-top:3px"></div> <div> <input type="button" id="p5FolderUp" disabled="disabled" onclick="p5folderup();" value="Up">&nbsp; <input type="button" id="p5SelectAllButton" disabled="disabled" onclick="p5selectallfile();" value="Select All" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5RenameFileButton" disabled="disabled" value="Rename" onclick="p5renamefile();" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5DeleteFileButton" disabled="disabled" value="Delete" onclick="p5deletefile();" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5NewFolderButton" disabled="disabled" value="New Folder" onclick="p5createfolder();" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5UploadButton" disabled="disabled" value="Upload" onclick="p5uploadFile()" onkeypress="return false;" onkeydown="return false;">&nbsp; <input type="button" id="p5CutButton" disabled="disabled" value="Cut" onclick="p5copyFile(1)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p5CopyButton" disabled="disabled" value="Copy" onclick="p5copyFile(0)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p5PasteButton" disabled="disabled" value="Paste" onclick="p5pasteFile()" onkeypress="return false" onkeydown="return false">&nbsp; </div> </td> </tr> <tr> <td style="background-color:#E4E9E7;height:28px"> <div style="float:right"> <select id="p5sortdropdown" onchange="updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div>&nbsp;&nbsp;<span id="p5currentpath"></span></div> </td> </tr> </table> <div id="p5filetable" style="width:100%;height:calc(100vh - 294px);overflow:auto;-webkit-user-select:none;position:relative"> <div id="p5PublicShare" style="display:none;width:100%;overflow:auto;-webkit-user-select:none;background-color:lightsteelblue"><div style="padding:4px">These files are shared publicly, click "link" to get public url.</div></div> <div id="bigok" style="width:256px;overflow:hidden;position:absolute;left:337px;top:20px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&checkmark;</b></div> <div id="bigfail" style="width:256px;overflow:hidden;position:absolute;left:337px;top:20px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&#10007;</b></div> <span id="p5files"></span> </div> <table id="p5toolbarBottom" style="width:100%" cellpadding="0" cellspacing="0"> <tr><td class="style6" style="text-align:left;padding:3px">&nbsp;<span id="p5bottomstatus"></span></td></tr> </table> </div> <div id="p6" style="display:none"> <img id="MainMeshImage" src="serverpic.ashx" style="border-width:0px;height:200px;width:200px;float:right"> <h1>My Server</h1> <p id="p2ServerActions"><strong>Server actions</strong></p> <p style="margin-left:40px"> <div id="p2ServerActionsBackup" style="margin-left:40px"><a href="/backup.zip" rel="noreferrer noopener" target="_blank" style="cursor:pointer">Download server backup</a></div> <div id="p2ServerActionsRestore" style="margin-left:40px"><a onclick="server_showRestoreDlg()" style="cursor:pointer">Restore server with backup</a></div> <div id="p2ServerActionsVersion" style="margin-left:40px"><a onclick="server_showVersionDlg()" style="cursor:pointer">Check server version</a></div> <div id="p2ServerActionsErrors" style="margin-left:40px"><a onclick="server_showErrorsDlg()" style="cursor:pointer">Show server error log</a></div> </p> <br><strong>Server Statistics</strong><br><br> <div id="serverStats" style="margin-left:40px"> <div id="serverCpuChartView" style="display:none"> <div style="width:60px;display:inline-block"><canvas id="serverCpuChart" style="width:60px;height:60px"></canvas></div> <div style="width:160px;display:inline-block" id="serverCpuChartText"></div> </div> <div id="serverMemoryChartView" style="display:none"> <div style="width:60px;display:inline-block"><canvas id="serverMemoryChart" style="width:60px;height:60px"></canvas></div> <div style="width:160px;display:inline-block" id="serverMemoryChartText"></div> </div><br><br> <div id="serverStatsTable"></div> </div> </div> <div id="p10" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p10title"> <div id="p10BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p10deviceName"></span></h1> </div> <div id="p10html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <a style="cursor:pointer" onclick="p10showiconselector()"><img id="MainComputerImage" style="border-width:0px;height:200px;width:200px"></a> <div style="width:100%;text-align:center"><strong><span id="MainComputerState"></span></strong></div> </td> </tr> </table><br> <div id="p10html2"></div> <div id="p10html3"></div> </div> <div id="p11" class="noselect" style="display:none"> <div id="p11title"> <div id="p11deviceNameHeader"> <div id="p11BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <div style="float:right" id="devListToolbarViewIcons"><div class="viewSelector" onclick="deskToggleFull(event)" title="Full Screen. Hold shift to browser full screen."><div class="viewSelector5"></div></div></div> <h1>Desktop - <span id="p11deviceName"></span></h1> </div> </div> <div id="p14warning" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showFeaturesDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Intel&reg; AMT Redirection port or KVM feature is disabled<span id="p14warninga">, click here to enable it.</span></div> </div> <div id="p14warning2" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showPowerActionDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Remote computer is not powered on, click here to issue a power command.</div> </div> <table id="deskarea0" cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px"> <tr id="deskarea1"> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <span id="p14power"></span>&nbsp; <div style='cursor:pointer;border:none;float:right;font-size:130%;margin-right:4px' title="Rotate Left" onclick="drotate(-1)">&olarr;</div> <div style='cursor:pointer;border:none;float:right;font-size:130%;margin-right:4px' title="Rotate Right" onclick="drotate(1)">&orarr;</div> <input id="deskFocusBtn" type="button" title="Toggle focus mode, when active only the region around the mouse is updated" onkeypress="return false" onkeydown="return false" value="Focus All" onclick="deskToggleFocus()" style="margin-right:3px;display:none"> <input id="deskSaveBtn" type="button" title="Save a screenshot of the remote desktop" onkeypress="return false" onkeydown="return false" value="Save..." onclick="deskSaveImage()" style="margin-right:3px"> <input id="deskActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" style="margin-right:3px"> <input id="deskActionsSettings" type="button" value="Settings..." title="Edit remote desktop settings" onkeypress="return false" onkeydown="return false" onclick="showDesktopSettings()" style="margin-right:3px"> <input type="button" title="Change the power state of the remote machine" onkeypress="return false" onkeydown="return false" value="Power Actions..." onclick="showPowerActionDlg()" style="margin-right:3px;display:none"> </div> <div> <div id="idx_deskFullBtn2" onclick="deskToggleFull(event)" style="float:left;font-size:large;cursor:pointer;display:none">&nbsp;&#x2716;</div> <input type="button" id="autoconnectbutton1" value="AutoConnect" onclick="autoConnectDesktop(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton1span">&nbsp;<input type="button" id="connectbutton1" value="Connect" onclick="connectDesktop(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton1hspan">&nbsp;<input type="button" id="connectbutton1h" value="HW Connect" onclick="connectDesktop(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton1span">&nbsp;<input type="button" id="disconnectbutton1" value="Disconnect" onclick="connectDesktop(event,0)" onkeypress="return false" onkeydown="return false"></span> &nbsp;<span id="deskstatus">Disconnected</span> </div> </td> </tr> <tr id="deskarea2"> <td> <div style="background-color:gray"><div id="progressbar" style="height:2px;width:0%;background-color:red"></div></div> </td> </tr> <tr id="deskarea3"> <td id="deskarea3x" style="background:black;text-align:center;position:relative;overflow:hidden"> <div id="DeskFocus" style="overflow:hidden;color:transparent;border:3px dotted rgba(255,0,0,.2);position:absolute;border-radius:5px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)"></div> <div id="DeskParent" style="overflow:hidden"> <canvas id="Desk" width="640" height="480" style="overflow:hidden;width:100%;-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" onmousewheel="dmousewheel(event)"></canvas> </div> <div id="DeskTools" style="position:absolute;width:400px;height:100%;background-color:gray;top:0;right:0;border-left:2px solid lightgray;display:none"> <a id="DeskToolsRefreshButton" style="float:right;padding:3px;cursor:pointer" onclick="refreshDeskTools()">Refresh</a> <div id="DeskToolsBar" style="position:absolute;padding:3px;border-radius:3px 3px 0px 0px;top:5px;left:4px;bottom:26px;background-color:lightgray;cursor:pointer">Processes</div> <div style="position:absolute;top:26px;left:4px;right:4px;bottom:4px;background-color:lightgray;text-align:left"> <div style="border-bottom:1px solid darkgray;padding:3px"><a style="width:50px;padding-right:5px;float:left;cursor:pointer" title="Sort by process id" onclick="sortProcess(0)">PID</a><a style="cursor:pointer" title="Sort by name" onclick="sortProcess(1)">Name</a></div> <div id="DeskToolsProcesses" style="overflow-y:scroll;position:absolute;top:24px;bottom:0px;width:100%"></div> </div> </div> </td> </tr> <tr id="deskarea4"> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <select id="termdisplays" style="display:none" onchange="deskSetDisplay(event)" onclick="deskGetDisplayNumbers(event)"></select>&nbsp; <input id="DeskToolsButton" type="button" value="Tools" title="Toggle tools view" onkeypress="return false" onkeydown="return false" onclick="toggleDeskTools()">&nbsp; <span id="DeskChatButton" style="float:right;margin-top:1px;margin-right:4px;cursor:pointer" title="Open chat window to this computer"><img src='images/icon-chat.png' onclick="deviceChat()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskNotifyButton" style="float:right;margin-top:1px;margin-right:4px;cursor:pointer" title="Display a notification on the remote computer"><img src='images/icon-notify.png' onclick="deviceToastFunction()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskOpenWebButton" style="float:right;margin-top:1px;margin-right:4px;cursor:pointer" title="Open a web address on remote computer"><img src='images/icon-url2.png' onclick="deviceUrlFunction()" height="16" width="16" style="padding-top:2px"></span> </div> <div> <select style="margin-left:6px" id="deskkeys"> <option value="5">Win <option value="0">Win+Down <option value="1">Win+Up <option value="2">Win+L <option value="3">Win+M <option value="4">Shift+Win+M <option value="6">Win+R </select> <input id="DeskWD" type="button" value="Send" onkeypress="return false" onkeydown="return false" onclick="deskSendKeys()"> <input id="DeskClip" style="margin-left:6px;display:none" type="button" value="Clipboard" onkeypress="return false" onkeydown="return false" onclick="showDeskClip()"> <input id="DeskCAD" type="button" value="Ctrl-Alt-Del" onkeypress="return false" onkeydown="return false" onclick="sendCAD()"> <label><span id="DeskControlSpan" style="margin-left:6px" title="Toggle mouse and keyboard input"><input id="DeskControl" type="checkbox" onkeypress="return false" onkeydown="return false" onclick="toggleKvmControl()">Input</span></label>&nbsp; </div> </td> </tr> </table> </div> <div id="p12" style="display:none"> <div id="p12title"> <div id="p12BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Terminal - <span id="p12deviceName"></span></h1> </div> <div id="p12warning" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showFeaturesDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Intel&reg; AMT Redirection port or KVM feature is disabled<span id="p14warninga">, click here to enable it.</span></div> </div> <div id="p12warning2" style='max-width:100%;display:none;cursor:pointer;margin-bottom:5px' onclick="showPowerActionDlg()"> <div class="icon2" style="float:left;margin:7px"></div> <div style='width:auto;border-radius:8px;padding:8px;background-color:lightsalmon'>Remote computer is not powered on, click here to issue a power command.</div> </div> <table cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px"> <tr> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <input id="termActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" style="margin-right:3px"> </div> <div> <input type="button" id="autoconnectbutton2" value="AutoConnect" onclick="autoConnectTerminal(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton2span">&nbsp;<input type="button" id="connectbutton2" value="Connect" onclick="connectTerminal(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton2hspan">&nbsp;<input type="button" id="connectbutton2h" value="HW Connect" onclick="connectTerminal(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton2span">&nbsp;<input type="button" id="disconnectbutton2" value="Disconnect" onclick="connectTerminal(event,0)" onkeypress="return false" onkeydown="return false"></span> &nbsp;<span id="termstatus">Disconnected</span> </div> </td> </tr> <tr> <td> <div style="background-color:gray"><div id="termprogressbar" style="height:2px;width:0%;background-color:red"></div></div> </td> </tr> <tr> <td style="background:black;text-align:center;height:500px;position:relative"> <pre id="Term" style="background:black;margin:0;padding:0"></pre> </td> </tr> <tr> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <div style="float:right;text-align:right"> <span id="terminalSettingsButtons" style="display:none"> <input id="id_tcrbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="CR+LF" title="Toggle what the return key will send" onclick="termToggleCr()"> <input id="id_tfxkeysbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Intel (F10 = ESC+[OM)" title="Toggle F1 to F10 keys emulation type" onclick="termToggleFx()"> <input id="id_ttypebutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Extended Ascii" title="Toggle terminal emulation type" onclick="termToggleType()"> </span> <select id="specialkeylist" onkeypress="return false" style="margin-left:5px"></select> <input id="specialkeylistinput" type="button" onkeypress="return false" class="bottombutton" value="Send" title="Send the selected special key" onclick="sendSpecialKey()"> </div> <div> &nbsp; <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlcbutton" value="Ctl-C" onclick="termSendKey(3,'ctrlcbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlxbutton" value="Ctl-X" onclick="termSendKey(24,'ctrlxbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="escbutton" value="ESC" onclick="termSendKey(27,'escbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="bsbutton" value="Backspace" onclick="termSendKey(8,'bsbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="pastebutton" value="Paste" title="Paste text into the terminal" onclick="showTermPasteDialog()"> </div> </td> </tr> </table> </div> <div id="p13" style="display:none"> <div id="p13title"> <div id="p13BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Files - <span id="p13deviceName"></span></h1> </div> <table id="p13toolbar" style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="background-color:#C0C0C0;border-bottom:2px solid black;padding:2px"> <div style="float:right;text-align:right"> <input id="filesActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" style="margin-right:3px"> </div> <div> <input id="p13AutoConnect" value="AutoConnect" onclick="autoConnectFiles(event)" onkeypress="return false" onkeydown="return false" type="button" style="display:none"> <input id="p13Connect" value="Connect" onclick="connectFiles(event)" onkeypress="return false" onkeydown="return false" type="button"> <span id="p13Status">Disconnected</span> </div> </td> </tr> <tr> <td style="width:100%;background-color:#d3d9d6;text-align:left;padding:4px" valign="bottom"> <div id="p13rightOfButtons" style="float:right;margin-top:3px"></div> <div> <input type="button" id="p13FolderUp" disabled="disabled" onclick="p13folderup()" value="Up">&nbsp; <input type="button" id="p13SelectAllButton" disabled="disabled" onclick="p13selectallfile()" value="Select All" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13RenameFileButton" disabled="disabled" value="Rename" onclick="p13renamefile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13DeleteFileButton" disabled="disabled" value="Delete" onclick="p13deletefile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13NewFolderButton" disabled="disabled" value="New Folder" onclick="p13createfolder()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13UploadButton" disabled="disabled" value="Upload" onclick="p13uploadFile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13CutButton" disabled="disabled" value="Cut" onclick="p13copyFile(1)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13CopyButton" disabled="disabled" value="Copy" onclick="p13copyFile(0)" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13PasteButton" disabled="disabled" value="Paste" onclick="p13pasteFile()" onkeypress="return false" onkeydown="return false">&nbsp; <input type="button" id="p13RefreshButton" disabled="disabled" value="Refresh" onclick="p13folderup(9999)" onkeypress="return false" onkeydown="return false">&nbsp; </div> </td> </tr> <tr> <td style="background-color:#E4E9E7;height:28px"> <div style="float:right"> <select id="p13sortdropdown" onchange="p13updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div>&nbsp;&nbsp;<span id="p13currentpath"></span></div> </td> </tr> </table> <div id="p13filetable" style="width:100%;height:calc(100vh - 346px);overflow:auto;-webkit-user-select:none"> <div id="p13bigok" style="width:256px;overflow:hidden;position:absolute;left:337px;top:200px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&checkmark;</b></div> <div id="p13bigfail" style="width:256px;overflow:hidden;position:absolute;left:337px;top:200px;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>&#10007;</b></div> <span id="p13files"></span> </div> <table id="p13toolbarBottom" style="width:100%" cellpadding="0" cellspacing="0"> <tr><td class="style6" style="text-align:left;padding:3px">&nbsp;<span id="p13bottomstatus"></span></td></tr> </table> </div> <div id="p14" style="display:none"> <div id="p14title"> <div id="p14BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Intel&reg; AMT - <span id="p14deviceName"></span></h1> </div> <iframe id="p14iframe" style="width:100%;height:calc(100vh - 242px);border:0;overflow:hidden" src="/commander.htm"></iframe> </div> <div id="p15" style="display:none"> <div id="p15title"> <div id="p15BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1><span id="p15deviceName"></span></h1> </div> <table cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px"> <tr> <td style="background:#C0C0C0"> <div style="float:right;padding-right:4px"> <div style="padding:4px;display:inline-block" id="p15coreName" title="Information about current core running on this agent"></div> <input type="button" id="p15uploadCore" value="Agent Action" onclick="p15uploadCore(event)" title="Change the agent Java Script code module"> </div> <div id="p15statetext" style="padding:4px"></div> </td> </tr> <tr> <td> <div style="background-color:gray"><div id="consoleprogressbar" style="height:2px;width:0%;background-color:red"></div></div> </td> </tr> <tr> <td id="p15agentConsole" style="background:black;margin:0;padding:0;color:lightgray;width:100%;height:calc(100vh - 296px);max-height:500px;position:relative"> <pre id="p15agentConsoleText" style="position:absolute;margin:0;padding:0;top:0;bottom:0;left:0;right:0;overflow-y:scroll;overflow-x:auto"></pre> </td> </tr> <tr> <td style="padding-top:2px;padding-bottom:2px;background:#C0C0C0"> <table style="width:100%"> <tr> <td style="width:99%"> <input id="p15consoleText" style="width:100%" onkeyup="p15consoleSend(event)" onfocus="onConsoleFocus(1)" onblur="onConsoleFocus(0)"> </td> <td>&nbsp;</td> <td style="width:1%"><input id="id_p15consoleClear" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Clear" onclick="p15consoleClear()"></td> </tr> </table> </td> </tr> </table> </div> <div id="p16" style="display:none"> <div id="p16title"> <div id="p16BackButton" style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p16deviceName"></span></h1> </div> <div style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px"> <div class="style7" style="width:16px;height:100%;float:left">&nbsp;</div> <div class="h1" style="height:100%;float:left">&nbsp;</div> <div class="style14" style="height:100%;float:left">&nbsp;&nbsp;<input type="button" value="Refresh" onclick="refreshDeviceEvents()">&nbsp;</div> <div class="auto-style1" style="height:100%;float:right"> Show <select id="p16limitdropdown" onchange="refreshDeviceEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <div style="height:100%;width:20px;float:right;background-color:#ffffff"></div> <div class="h2" style="height:100%;float:right">&nbsp;</div> </div> </div> <div id="p16events" style="max-height:calc(100vh - 267px);overflow-y:auto"></div> </div> <div id="p20" style="display:none"> <picture id="MainMeshImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/mesh-200.webp"> <img alt="" width="200" height="200" src="images/mesh-200.jpg"> </source></picture> <div style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p20meshName"></span></h1> <p id="p20info"> </div> <div id="p30" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p30title"> <div style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p30userName"></span></h1> </div> <div id="p30html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <picture id="MainUserImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/user-200.webp"> <img alt="" width="200" height="200" src="images/user-200.jpg"> </source></picture> <div style="width:100%;text-align:center"><strong><span id="MainUserState"></span></strong></div> </td> </tr> </table><br> <div id="p30html2"></div> <div id="p30html3"></div> </div> <div id="p31" style="display:none"> <div style="float:left"><div class="backButton" onclick="goBack()" title="Back"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p31userName"></span></h1> <div style="width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px"> <div class="style7" style="width:16px;height:100%;float:left">&nbsp;</div> <div class="h1" style="height:100%;float:left">&nbsp;</div> <div class="style14" style="height:100%;float:left">&nbsp;&nbsp;<input type="button" value="Refresh" onclick="refreshUsersEvents()">&nbsp;</div> <div class="auto-style1" style="height:100%;float:right"> Show <select id="p31limitdropdown" onchange="refreshUsersEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <div style="height:100%;width:20px;float:right;background-color:#ffffff"></div> <div class="h2" style="height:100%;float:right;">&nbsp;</div> </div> </div> <div id="p31events" style="max-height:calc(100vh - 267px);overflow-y:scroll"></div> </div> <br id="column_l_bottomgap"> </div> <div id="footer" class="noselect"> <table cellpadding="0" cellspacing="10" style="width:100%"> <tr> <td style="text-align:left;color:white"> {{{footer}}} </td> <td style="text-align:right"> <a id="verifyEmailId2" style="color:yellow;margin-left:3px;cursor:pointer;display:none" onclick="account_showVerifyEmail()">Verify Email</a> <a style="margin-left:3px" href="terms">Terms &amp; Privacy</a> </td> </tr> </table> </div> <div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:160px;width:400px;left:calc((100% / 2) - 200px);display:none"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="id_dialogclose" style="float:right;padding:3px;margin-right:3px;cursor:pointer" onclick="setDialogMode()">&#x2716;</div> <div id="id_dialogtitle" style="padding:5px"></div> <div style="width:100%;margin:6px"></div> </div> <div style="margin-right:16px;margin-left:8px"> <div id="dialog1" style="margin:auto;text-align:center;margin:3px"> <div id="id_dialogMessage" style="padding:10px"></div> </div> <div id="dialog2" style="margin:auto;margin:3px"> <div id="id_dialogOptions"></div> </div> <div id="dialog3" style="margin:auto;margin:3px"> <div style="height:26px"> <select id="d3uploadMode" style="float:right;width:260px" onchange="d3modechange()"> <option value="1">Local file upload <option value="2">Server file selection </select> <div>File Selection</div> </div> <div id="d3localmode" style="height:26px;display:none"> <form id="d3localmodeform" method="post" enctype="multipart/form-data" action="uploadfile.ashx" target="fileUploadFrame"> <input type="text" id="d3attrib" name="attrib" style="display:none"> <input type="file" id="d3localFile" name="files" style="float:right;width:260px" onchange="d3setActions()"> <input type="submit" id="d3submit" style="display:none"> </form> <div>Upload File</div> </div> <div id="d3servermode"> <div style="width:100%;background-color:#d3d9d6;text-align:left;padding:3px" valign="bottom"> <input type="button" id="p3FolderUp" disabled="disabled" onclick="d3folderup()" value="Up">&nbsp; </div> <div id="d3serverfiles" style="width:100%;height:150px;background-color:white;padding:2px;border:1px solid gray;overflow-y:scroll"></div> </div> </div> <div id="dialog7" style="margin:auto;margin:3px"> <div id="d7meshkvm"> <h4 style="width:100%;border-bottom:1px solid gray">Agent Remote Desktop</h4> <div style="margin:3px 0 3px 0"> <select id="d7bitmapquality" style="float:right;width:200px;height:20px" dir="rtl"></select> <div style="height:20px">Quality</div> </div> <div style="margin:3px 0 3px 0"> <select id="d7bitmapscaling" style="float:right;width:200px;height:20px" dir="rtl"> <option selected="selected" value="1024">100% <option value="896">87.5% <option value="768">75% <option value="640">62.5% <option value="512">50% <option value="384">37.5% <option value="256">25% <option value="128">12.5% </select> <div style="height:20px">Scaling</div> </div> <div style="margin:3px 0 3px 0"> <select id="d7framelimiter" style="float:right;width:200px;height:20px" dir="rtl"> <option selected="selected" value="50">Fast <option value="100">Medium <option value="400">Slow <option value="1000">Very slow </select> <div style="height:20px">Frame rate</div> </div> </div> <div id="d7amtkvm"> <h4 style="width:100%;border-bottom:1px solid gray">Intel&reg; AMT Hardware KVM</h4> <div style='height:26px'> <select id="d7desktopmode" style="float:right;width:200px"> <option value="1">RLE8, Fastest <option value="2">RLE16, Recommended <option value="3">RAW8, Slow <option value="4">RAW16, Very Slow </select> <div>Image Encoding</div> </div> <div style="height:60px"> <div style="float:right;border:1px solid #666;width:200px;height:60px;overflow-y:scroll;background-color:white"> <label><input type="checkbox" id='d7showfocus'>Show Focus Tool<br></label> <label><input type="checkbox" id='d7showcursor'>Show Local Mouse Cursor<br></label> <label><input type="checkbox" id='d7localKeyMap'>Local Keyboard Map<br></label> </div> <div>Other Settings</div> </div> </div> </div> </div> <div id="idx_dlgButtonBar" style="padding:10px;margin-bottom:4px"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="float:right;width:80px" onclick="dialogclose(1)"> <div style="height:25px"><input id="idx_dlgDeleteButton" type="button" value="Delete" style="width:80px;display:none" onclick="dialogclose(2)"></div> </div> </div> <iframe name="fileUploadFrame" style="display:none"></iframe> <form style="display:none" method="post" action="uploadfile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p5fileDragName" name="name"><input id="p5fileDragSize" name="size"><input id="p5fileDragType" name="type"><input id="p5fileDragData" name="data"><input id="p5fileDragLink" name="link"><input type="submit" id="p5loginSubmit2" style="display:none"></form> <form style="display:none" method="post" action="uploadnodefile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p13fileDragName" name="name"><input id="p13fileDragSize" name="size"><input id="p13fileDragType" name="type"><input id="p13fileDragData" name="data"><input id="p13fileDragLink" name="link"><input type="submit" id="p13loginSubmit2" style="display:none"></form> <audio id="chimes"><source src="sounds/chimes.mp3" type="audio/mp3"></source></audio> </div> </div> <script>/**
2 +* @description Set of short commonly used methods for handling HTML elements
3 +* @author Ylian Saint-Hilaire
4 +* @version v0.0.1b
5 +*/
6 +
7 +// Add startsWith for IE browser
8 +if (!String.prototype.startsWith) { String.prototype.startsWith = function (str) { return this.lastIndexOf(str, 0) === 0; }; }
9 +if (!String.prototype.endsWith) { String.prototype.endsWith = function (str) { return this.indexOf(str, this.length - str.length) !== -1; }; }
10 +
11 +// Quick UI functions, a bit of a replacement for jQuery
12 +//function Q(x) { if (document.getElementById(x) == null) { console.log('Invalid element: ' + x); } return document.getElementById(x); } // "Q"
13 +function Q(x) { return document.getElementById(x); } // "Q"
14 +function QS(x) { try { return Q(x).style; } catch (x) { } } // "Q" style
15 +function QE(x, y) { try { Q(x).disabled = !y; } catch (x) { } } // "Q" enable
16 +function QV(x, y) { try { QS(x).display = (y ? '' : 'none'); } catch (x) { } } // "Q" visible
17 +function QA(x, y) { Q(x).innerHTML += y; } // "Q" append
18 +function QH(x, y) { Q(x).innerHTML = y; } // "Q" html
19 +
20 +// Move cursor to end of input box
21 +function inputBoxFocus(x) { Q(x).focus(); var v = Q(x).value; Q(x).value = ''; Q(x).value = v; }
22 +
23 +// Binary encoding and decoding functions
24 +function ReadShort(v, p) { return (v.charCodeAt(p) << 8) + v.charCodeAt(p + 1); }
25 +function ReadShortX(v, p) { return (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
26 +function ReadInt(v, p) { return (v.charCodeAt(p) * 0x1000000) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); } // We use "*0x1000000" instead of "<<24" because the shift converts the number to signed int32.
27 +function ReadSInt(v, p) { return (v.charCodeAt(p) << 24) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); }
28 +function ReadIntX(v, p) { return (v.charCodeAt(p + 3) * 0x1000000) + (v.charCodeAt(p + 2) << 16) + (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
29 +function ShortToStr(v) { return String.fromCharCode((v >> 8) & 0xFF, v & 0xFF); }
30 +function ShortToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF); }
31 +function IntToStr(v) { return String.fromCharCode((v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); }
32 +function IntToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF, (v >> 24) & 0xFF); }
33 +function MakeToArray(v) { if (!v || v == null || typeof v == 'object') return v; return [v]; }
34 +function SplitArray(v) { return v.split(','); }
35 +function Clone(v) { return JSON.parse(JSON.stringify(v)); }
36 +function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
37 +function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, '&nbsp;&nbsp;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
38 +
39 +// Move an element from one position in an array to a new position
40 +function ArrayElementMove(arr, from, to) { arr.splice(to, 0, arr.splice(from, 1)[0]); };
41 +
42 +// Print object for HTML
43 +function ObjectToStringEx(x, c) {
44 + var r = "";
45 + if (x != 0 && (!x || x == null)) return "(Null)";
46 + if (x instanceof Array) { for (var i in x) { r += '<br />' + gap(c) + "Item #" + i + ": " + ObjectToStringEx(x[i], c + 1); } }
47 + else if (x instanceof Object) { for (var i in x) { r += '<br />' + gap(c) + i + " = " + ObjectToStringEx(x[i], c + 1); } }
48 + else { r += EscapeHtml(x); }
49 + return r;
50 +}
51 +
52 +// Print object for console
53 +function ObjectToStringEx2(x, c) {
54 + var r = "";
55 + if (x != 0 && (!x || x == null)) return "(Null)";
56 + if (x instanceof Array) { for (var i in x) { r += '\r\n' + gap2(c) + "Item #" + i + ": " + ObjectToStringEx2(x[i], c + 1); } }
57 + else if (x instanceof Object) { for (var i in x) { r += '\r\n' + gap2(c) + i + " = " + ObjectToStringEx2(x[i], c + 1); } }
58 + else { r += EscapeHtml(x); }
59 + return r;
60 +}
61 +
62 +// Create an ident gap
63 +function gap(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += '&nbsp;'; } return x; }
64 +function gap2(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += ' '; } return x; }
65 +
66 +// Print an object in html
67 +function ObjectToString(x) { return ObjectToStringEx(x, 0); }
68 +function ObjectToString2(x) { return ObjectToStringEx2(x, 0); }
69 +
70 +// Convert a hex string to a raw string
71 +function hex2rstr(d) {
72 + if (typeof d != "string" || d.length == 0) return '';
73 + var r = '', m = ('' + d).match(/../g), t;
74 + while (t = m.shift()) r += String.fromCharCode('0x' + t);
75 + return r
76 +}
77 +
78 +// Convert decimal to hex
79 +function char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }
80 +
81 +// Convert a raw string to a hex string
82 +function rstr2hex(input) { var r = '', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }
83 +
84 +// UTF-8 encoding & decoding functions
85 +function encode_utf8(s) { return unescape(encodeURIComponent(s)); }
86 +function decode_utf8(s) { return decodeURIComponent(escape(s)); }
87 +
88 +// Convert a string into a blob
89 +function data2blob(data) {
90 + var bytes = new Array(data.length);
91 + for (var i = 0; i < data.length; i++) bytes[i] = data.charCodeAt(i);
92 + var blob = new Blob([new Uint8Array(bytes)]);
93 + return blob;
94 +}
95 +
96 +// Generate random numbers
97 +function random(max) { return Math.floor(Math.random() * max); }
98 +
99 +// Trademarks
100 +function trademarks(x) { return x.replace(/\(R\)/g, '&reg;').replace(/\(TM\)/g, '&trade;'); }
101 +/**
102 +* @fileoverview Meshcentral.js
103 +* @author Ylian Saint-Hilaire
104 +* @version v0.0.1
105 +*/
106 +
107 +var MeshServerCreateControl = function (domain, authCookie) {
108 + var obj = {};
109 + obj.State = 0;
110 + obj.connectstate = 0;
111 + obj.pingTimer = null;
112 + obj.authCookie = authCookie;
113 +
114 + obj.xxStateChange = function (newstate, errCode) {
115 + if (obj.State == newstate) return;
116 + var previousState = obj.State;
117 + obj.State = newstate;
118 + if (obj.onStateChanged) obj.onStateChanged(obj, obj.State, previousState, errCode);
119 + }
120 +
121 + obj.Start = function () {
122 + if (obj.connectstate != 0) return;
123 + obj.connectstate = 0;
124 + var url = window.location.protocol.replace("http", "ws") + "//" + window.location.host + domain + "control.ashx";
125 + if (obj.authCookie && (obj.authCookie != '')) { url += '?auth=' + obj.authCookie; }
126 + obj.socket = new WebSocket(url);
127 + obj.socket.onopen = function (e) { obj.connectstate = 1; }
128 + obj.socket.onmessage = obj.xxOnMessage;
129 + obj.socket.onclose = function(e) { obj.Stop(e.code); }
130 + obj.xxStateChange(1, 0);
131 + if (obj.pingTimer != null) { clearInterval(obj.pingTimer); }
132 + obj.pingTimer = setInterval(function () { obj.send({ action: 'ping' }); }, 29000); // Ping the server every 29 seconds, stops corporate proxies from disconnecting.
133 + }
134 +
135 + obj.Stop = function (errCode) {
136 + obj.connectstate = 0;
137 + if (obj.socket) { obj.socket.close(); delete obj.socket; }
138 + if (obj.pingTimer != null) { clearInterval(obj.pingTimer); obj.pingTimer = null; }
139 + obj.xxStateChange(0, errCode);
140 + }
141 +
142 + obj.xxOnMessage = function (e) {
143 + if (obj.State == 1) { obj.xxStateChange(2); }
144 + //console.log('xxOnMessage', e.data);
145 + var message;
146 + try { message = JSON.parse(e.data); } catch (e) { return; }
147 + if ((typeof message != 'object') || (message.action == 'pong')) { return; }
148 + if (message.action == 'close') { if (message.msg) { console.log(message.msg); } obj.Stop(message.cause); return; }
149 + if (obj.onMessage) obj.onMessage(obj, message);
150 + };
151 +
152 + obj.send = function (x) { if (obj.socket != null && obj.connectstate == 1) { obj.socket.send(JSON.stringify(x)); } }
153 +
154 + return obj;
155 +}
156 +/**
157 +* @fileoverview Intel(r) AMT Communication Stack
158 +* @author Ylian Saint-Hilaire
159 +* @version v0.2.0b
160 +*/
161 +
162 +/**
163 + * Construct a AmtStackCreateService object, this ia the main Intel AMT communication stack.
164 + * @constructor
165 + */
166 +function AmtStackCreateService(wsmanStack) {
167 + var obj = new Object();
168 + obj.wsman = wsmanStack;
169 + obj.pfx = ["http://intel.com/wbem/wscim/1/amt-schema/1/", "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/", "http://intel.com/wbem/wscim/1/ips-schema/1/"];
170 + obj.PendingEnums = [];
171 + obj.PendingBatchOperations = 0;
172 + obj.ActiveEnumsCount = 0;
173 + obj.MaxActiveEnumsCount = 1; // Maximum number of enumerations that can be done at the same time.
174 + obj.onProcessChanged = null;
175 + var _MaxProcess = 0;
176 + var _LastProcess = 0;
177 +
178 + // Return the number of pending actions
179 + obj.GetPendingActions = function () { return (obj.PendingEnums.length * 2) + (obj.ActiveEnumsCount) + obj.wsman.comm.PendingAjax.length + obj.wsman.comm.ActiveAjaxCount + obj.PendingBatchOperations; }
180 +
181 + // Private Method, Update the current processing status, this gives the application an idea of what progress is being done by the WSMAN stack
182 + function _up() {
183 + var x = obj.GetPendingActions();
184 + if (_MaxProcess < x) _MaxProcess = x;
185 + if (obj.onProcessChanged != null && _LastProcess != x) {
186 + //console.log("Process Old=" + _LastProcess + ", New=" + x + ", PEnums=" + obj.PendingEnums.length + ", AEnums=" + obj.ActiveEnumsCount + ", PAjax=" + obj.wsman.comm.PendingAjax.length + ", AAjax=" + obj.wsman.comm.ActiveAjaxCount + ", PBatch=" + obj.PendingBatchOperations);
187 + _LastProcess = x;
188 + obj.onProcessChanged(x, _MaxProcess);
189 + }
190 + if (x == 0) _MaxProcess = 0;
191 + }
192 +
193 + // Perform a WSMAN "SUBSCRIBE" operation.
194 + obj.Subscribe = function (name, delivery, url, callback, tag, pri, selectors, opaque, user, pass) { obj.wsman.ExecSubscribe(obj.CompleteName(name), delivery, url, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri, selectors, opaque, user, pass); _up(); }
195 +
196 + // Perform a WSMAN "UNSUBSCRIBE" operation.
197 + obj.UnSubscribe = function (name, callback, tag, pri, selectors) { obj.wsman.ExecUnSubscribe(obj.CompleteName(name), function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri, selectors); _up(); }
198 +
199 + // Perform a WSMAN "GET" operation.
200 + obj.Get = function (name, callback, tag, pri) { obj.wsman.ExecGet(obj.CompleteName(name), function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri); _up(); }
201 +
202 + // Perform a WSMAN "PUT" operation.
203 + obj.Put = function (name, putobj, callback, tag, pri, selectors) { obj.wsman.ExecPut(obj.CompleteName(name), putobj, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri, selectors); _up(); }
204 +
205 + // Perform a WSMAN "CREATE" operation.
206 + obj.Create = function (name, putobj, callback, tag, pri) { obj.wsman.ExecCreate(obj.CompleteName(name), putobj, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri); _up(); }
207 +
208 + // Perform a WSMAN "DELETE" operation.
209 + obj.Delete = function (name, putobj, callback, tag, pri) { obj.wsman.ExecDelete(obj.CompleteName(name), putobj, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri); _up(); }
210 +
211 + // Perform a WSMAN method call operation.
212 + obj.Exec = function (name, method, args, callback, tag, pri, selectors) { obj.wsman.ExecMethod(obj.CompleteName(name), method, args, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, obj.CompleteExecResponse(response), xstatus, tag); }, 0, pri, selectors); _up(); }
213 +
214 + // Perform a WSMAN method call operation.
215 + obj.ExecWithXml = function (name, method, args, callback, tag, pri, selectors) { obj.wsman.ExecMethodXml(obj.CompleteName(name), method, execArgumentsToXml(args), function (ws, resuri, response, xstatus) { _up(); callback(obj, name, obj.CompleteExecResponse(response), xstatus, tag); }, 0, pri, selectors); _up(); }
216 +
217 + // Perform a WSMAN "ENUMERATE" operation.
218 + obj.Enum = function (name, callback, tag, pri) {
219 + if (obj.ActiveEnumsCount < obj.MaxActiveEnumsCount) {
220 + obj.ActiveEnumsCount++; obj.wsman.ExecEnum(obj.CompleteName(name), function (ws, resuri, response, xstatus, tag0) { _up(); _EnumStartSink(name, response, callback, resuri, xstatus, tag0); }, tag, pri);
221 + } else {
222 + obj.PendingEnums.push([name, callback, tag, pri]);
223 + }
224 + _up();
225 + }
226 +
227 + // Private method
228 + function _EnumStartSink(name, response, callback, resuri, status, tag, pri) {
229 + if (status != 200) { callback(obj, name, null, status, tag); _EnumDoNext(1); return; }
230 + if (response == null || response.Header["Method"] != "EnumerateResponse" || !response.Body["EnumerationContext"]) { callback(obj, name, null, 603, tag); _EnumDoNext(1); return; }
231 + var enumctx = response.Body["EnumerationContext"];
232 + obj.wsman.ExecPull(resuri, enumctx, function (ws, resuri, response, xstatus) { _EnumContinueSink(name, response, callback, resuri, [], xstatus, tag, pri); });
233 + }
234 +
235 + // Private method
236 + function _EnumContinueSink(name, response, callback, resuri, items, status, tag, pri) {
237 + if (status != 200) { callback(obj, name, null, status, tag); _EnumDoNext(1); return; }
238 + if (response == null || response.Header["Method"] != "PullResponse") { callback(obj, name, null, 604, tag); _EnumDoNext(1); return; }
239 + for (var i in response.Body["Items"]) {
240 + if (response.Body["Items"][i] instanceof Array) {
241 + for (var j in response.Body["Items"][i]) { items.push(response.Body["Items"][i][j]); }
242 + } else {
243 + items.push(response.Body["Items"][i]);
244 + }
245 + }
246 + if (response.Body["EnumerationContext"]) {
247 + var enumctx = response.Body["EnumerationContext"];
248 + obj.wsman.ExecPull(resuri, enumctx, function (ws, resuri, response, xstatus) { _EnumContinueSink(name, response, callback, resuri, items, xstatus, tag, 1); });
249 + } else {
250 + _EnumDoNext(1);
251 + callback(obj, name, items, status, tag);
252 + _up();
253 + }
254 + }
255 +
256 + // Private method
257 + function _EnumDoNext(dec) {
258 + obj.ActiveEnumsCount -= dec;
259 + if (obj.ActiveEnumsCount >= obj.MaxActiveEnumsCount || obj.PendingEnums.length == 0) return;
260 + var x = obj.PendingEnums.shift();
261 + obj.Enum(x[0], x[1], x[2]);
262 + _EnumDoNext(0);
263 + }
264 +
265 + // Perform a batch of WSMAN "ENUM" operations.
266 + obj.BatchEnum = function (batchname, names, callback, tag, continueOnError, pri) {
267 + obj.PendingBatchOperations += (names.length * 2);
268 + _BatchNextEnum(batchname, Clone(names), callback, tag, {}, continueOnError, pri); _up();
269 + }
270 +
271 + // Request each enum in the batch, stopping if something does not return status 200
272 + function _BatchNextEnum(batchname, names, callback, tag, results, continueOnError, pri) {
273 + obj.PendingBatchOperations -= 2;
274 + var n = names.shift(), f = obj.Enum;
275 + if (n[0] == '*') { f = obj.Get; n = n.substring(1); } // If the name starts with a star, do a GET instead of an ENUM. This will reduce round trips.
276 + //console.log((f == obj.Get?'Get ':'Enum ') + n);
277 + // Perform a GET/ENUM action
278 + f(n, function (stack, name, responses, status, tag0) {
279 + tag0[2][name] = { response: (responses==null?null:responses.Body), responses: responses, status: status };
280 + if (tag0[1].length == 0 || status == 401 || (continueOnError != true && status != 200 && status != 400)) { obj.PendingBatchOperations -= (names.length * 2); _up(); callback(obj, batchname, tag0[2], status, tag); }
281 + else { _up(); _BatchNextEnum(batchname, names, callback, tag, tag0[2], pri); }
282 + }, [batchname, names, results], pri);
283 + _up();
284 + }
285 +
286 + // Perform a batch of WSMAN "GET" operations.
287 + obj.BatchGet = function (batchname, names, callback, tag, pri) {
288 + _FetchNext({ name: batchname, names: names, callback: callback, current: 0, responses: {}, tag: tag, pri: pri }); _up();
289 + }
290 +
291 + // Private method
292 + function _FetchNext(batch) {
293 + if (batch.names.length <= batch.current) {
294 + batch.callback(obj, batch.name, batch.responses, 200, batch.tag);
295 + } else {
296 + obj.wsman.ExecGet(obj.CompleteName(batch.names[batch.current]), function (ws, resuri, response, xstatus) { _Fetched(batch, response, xstatus); }, batch.pri);
297 + batch.current++;
298 + }
299 + _up();
300 + }
301 +
302 + // Private method
303 + function _Fetched(batch, response, status) {
304 + if (response == null || status != 200) {
305 + batch.callback(obj, batch.name, null, status, batch.tag);
306 + } else {
307 + batch.responses[response.Header["Method"]] = response;
308 + _FetchNext(batch);
309 + }
310 + }
311 +
312 + // Private method
313 + obj.CompleteName = function(name) {
314 + if (name.indexOf("AMT_") == 0) return obj.pfx[0] + name;
315 + if (name.indexOf("CIM_") == 0) return obj.pfx[1] + name;
316 + if (name.indexOf("IPS_") == 0) return obj.pfx[2] + name;
317 + }
318 +
319 + obj.CompleteExecResponse = function (resp) {
320 + if (resp && resp != null && resp.Body && resp.Body["ReturnValue"]) resp.Body.ReturnValueStr = obj.AmtStatusToStr(resp.Body["ReturnValue"]);
321 + return resp;
322 + }
323 +
324 + obj.RequestPowerStateChange = function (PowerState, callback_func) {
325 + obj.CIM_PowerManagementService_RequestPowerStateChange(PowerState, "<Address xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\"><ResourceURI xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystem</ResourceURI><SelectorSet xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\"><Selector Name=\"CreationClassName\">CIM_ComputerSystem</Selector><Selector Name=\"Name\">ManagedSystem</Selector></SelectorSet></ReferenceParameters>", null, null, callback_func);
326 + }
327 +
328 + obj.SetBootConfigRole = function (Role, callback_func) {
329 + obj.CIM_BootService_SetBootConfigRole("<Address xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\"><ResourceURI xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootConfigSetting</ResourceURI><SelectorSet xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\"><Selector Name=\"InstanceID\">Intel(r) AMT: Boot Configuration 0</Selector></SelectorSet></ReferenceParameters>", Role, callback_func);
330 + }
331 +
332 + // Cancel all pending queries with given status
333 + obj.CancelAllQueries = function (s) {
334 + obj.wsman.CancelAllQueries(s);
335 + }
336 +
337 + // Auto generated methods
338 + obj.AMT_AgentPresenceWatchdog_RegisterAgent = function (callback_func) { obj.Exec("AMT_AgentPresenceWatchdog", "RegisterAgent", {}, callback_func); }
339 + obj.AMT_AgentPresenceWatchdog_AssertPresence = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdog", "AssertPresence", { "SequenceNumber": SequenceNumber }, callback_func); }
340 + obj.AMT_AgentPresenceWatchdog_AssertShutdown = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdog", "AssertShutdown", { "SequenceNumber": SequenceNumber }, callback_func); }
341 + obj.AMT_AgentPresenceWatchdog_AddAction = function (OldState, NewState, EventOnTransition, ActionSd, ActionEac, callback_func, tag, pri, selectors) { obj.Exec("AMT_AgentPresenceWatchdog", "AddAction", { "OldState": OldState, "NewState": NewState, "EventOnTransition": EventOnTransition, "ActionSd": ActionSd, "ActionEac": ActionEac }, callback_func, tag, pri, selectors); }
342 + obj.AMT_AgentPresenceWatchdog_DeleteAllActions = function (callback_func, tag, pri, selectors) { obj.Exec("AMT_AgentPresenceWatchdog", "DeleteAllActions", {}, callback_func, tag, pri, selectors); }
343 + obj.AMT_AgentPresenceWatchdogAction_GetActionEac = function (callback_func) { obj.Exec("AMT_AgentPresenceWatchdogAction", "GetActionEac", {}, callback_func); }
344 + obj.AMT_AgentPresenceWatchdogVA_RegisterAgent = function (callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "RegisterAgent", {}, callback_func); }
345 + obj.AMT_AgentPresenceWatchdogVA_AssertPresence = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "AssertPresence", { "SequenceNumber": SequenceNumber }, callback_func); }
346 + obj.AMT_AgentPresenceWatchdogVA_AssertShutdown = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "AssertShutdown", { "SequenceNumber": SequenceNumber }, callback_func); }
347 + obj.AMT_AgentPresenceWatchdogVA_AddAction = function (OldState, NewState, EventOnTransition, ActionSd, ActionEac, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "AddAction", { "OldState": OldState, "NewState": NewState, "EventOnTransition": EventOnTransition, "ActionSd": ActionSd, "ActionEac": ActionEac }, callback_func); }
348 + obj.AMT_AgentPresenceWatchdogVA_DeleteAllActions = function (_method_dummy, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "DeleteAllActions", { "_method_dummy": _method_dummy }, callback_func); }
349 + obj.AMT_AuditLog_ClearLog = function (callback_func) { obj.Exec("AMT_AuditLog", "ClearLog", {}, callback_func); }
350 + obj.AMT_AuditLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_AuditLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
351 + obj.AMT_AuditLog_ReadRecords = function (StartIndex, callback_func, tag) { obj.Exec("AMT_AuditLog", "ReadRecords", { "StartIndex": StartIndex }, callback_func, tag); }
352 + obj.AMT_AuditLog_SetAuditLock = function (LockTimeoutInSeconds, Flag, Handle, callback_func) { obj.Exec("AMT_AuditLog", "SetAuditLock", { "LockTimeoutInSeconds": LockTimeoutInSeconds, "Flag": Flag, "Handle": Handle }, callback_func); }
353 + obj.AMT_AuditLog_ExportAuditLogSignature = function (SigningMechanism, callback_func) { obj.Exec("AMT_AuditLog", "ExportAuditLogSignature", { "SigningMechanism": SigningMechanism }, callback_func); }
354 + obj.AMT_AuditLog_SetSigningKeyMaterial = function (SigningMechanismType, SigningKey, LengthOfCertificates, Certificates, callback_func) { obj.Exec("AMT_AuditLog", "SetSigningKeyMaterial", { "SigningMechanismType": SigningMechanismType, "SigningKey": SigningKey, "LengthOfCertificates": LengthOfCertificates, "Certificates": Certificates }, callback_func); }
355 + obj.AMT_AuditPolicyRule_SetAuditPolicy = function (Enable, AuditedAppID, EventID, PolicyType, callback_func) { obj.Exec("AMT_AuditPolicyRule", "SetAuditPolicy", { "Enable": Enable, "AuditedAppID": AuditedAppID, "EventID": EventID, "PolicyType": PolicyType }, callback_func); }
356 + obj.AMT_AuditPolicyRule_SetAuditPolicyBulk = function (Enable, AuditedAppID, EventID, PolicyType, callback_func) { obj.Exec("AMT_AuditPolicyRule", "SetAuditPolicyBulk", { "Enable": Enable, "AuditedAppID": AuditedAppID, "EventID": EventID, "PolicyType": PolicyType }, callback_func); }
357 + obj.AMT_AuthorizationService_AddUserAclEntryEx = function (DigestUsername, DigestPassword, KerberosUserSid, AccessPermission, Realms, callback_func) { obj.Exec("AMT_AuthorizationService", "AddUserAclEntryEx", { "DigestUsername": DigestUsername, "DigestPassword": DigestPassword, "KerberosUserSid": KerberosUserSid, "AccessPermission": AccessPermission, "Realms": Realms }, callback_func); }
358 + obj.AMT_AuthorizationService_EnumerateUserAclEntries = function (StartIndex, callback_func) { obj.Exec("AMT_AuthorizationService", "EnumerateUserAclEntries", { "StartIndex": StartIndex }, callback_func); }
359 + obj.AMT_AuthorizationService_GetUserAclEntryEx = function (Handle, callback_func, tag) { obj.Exec("AMT_AuthorizationService", "GetUserAclEntryEx", { "Handle": Handle }, callback_func, tag); }
360 + obj.AMT_AuthorizationService_UpdateUserAclEntryEx = function (Handle, DigestUsername, DigestPassword, KerberosUserSid, AccessPermission, Realms, callback_func) { obj.Exec("AMT_AuthorizationService", "UpdateUserAclEntryEx", { "Handle": Handle, "DigestUsername": DigestUsername, "DigestPassword": DigestPassword, "KerberosUserSid": KerberosUserSid, "AccessPermission": AccessPermission, "Realms": Realms }, callback_func); }
361 + obj.AMT_AuthorizationService_RemoveUserAclEntry = function (Handle, callback_func) { obj.Exec("AMT_AuthorizationService", "RemoveUserAclEntry", { "Handle": Handle }, callback_func); }
362 + obj.AMT_AuthorizationService_SetAdminAclEntryEx = function (Username, DigestPassword, callback_func) { obj.Exec("AMT_AuthorizationService", "SetAdminAclEntryEx", { "Username": Username, "DigestPassword": DigestPassword }, callback_func); }
363 + obj.AMT_AuthorizationService_GetAdminAclEntry = function (callback_func) { obj.Exec("AMT_AuthorizationService", "GetAdminAclEntry", {}, callback_func); }
364 + obj.AMT_AuthorizationService_GetAdminAclEntryStatus = function (callback_func) { obj.Exec("AMT_AuthorizationService", "GetAdminAclEntryStatus", {}, callback_func); }
365 + obj.AMT_AuthorizationService_GetAdminNetAclEntryStatus = function (callback_func) { obj.Exec("AMT_AuthorizationService", "GetAdminNetAclEntryStatus", {}, callback_func); }
366 + obj.AMT_AuthorizationService_SetAclEnabledState = function (Handle, Enabled, callback_func, tag) { obj.Exec("AMT_AuthorizationService", "SetAclEnabledState", { "Handle": Handle, "Enabled": Enabled }, callback_func, tag); }
367 + obj.AMT_AuthorizationService_GetAclEnabledState = function (Handle, callback_func, tag) { obj.Exec("AMT_AuthorizationService", "GetAclEnabledState", { "Handle": Handle }, callback_func, tag); }
368 + obj.AMT_EndpointAccessControlService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
369 + obj.AMT_EndpointAccessControlService_GetPosture = function (PostureType, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "GetPosture", { "PostureType": PostureType }, callback_func); }
370 + obj.AMT_EndpointAccessControlService_GetPostureHash = function (PostureType, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "GetPostureHash", { "PostureType": PostureType }, callback_func); }
371 + obj.AMT_EndpointAccessControlService_UpdatePostureState = function (UpdateType, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "UpdatePostureState", { "UpdateType": UpdateType }, callback_func); }
372 + obj.AMT_EndpointAccessControlService_GetEacOptions = function (callback_func) { obj.Exec("AMT_EndpointAccessControlService", "GetEacOptions", {}, callback_func); }
373 + obj.AMT_EndpointAccessControlService_SetEacOptions = function (EacVendors, PostureHashAlgorithm, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "SetEacOptions", { "EacVendors": EacVendors, "PostureHashAlgorithm": PostureHashAlgorithm }, callback_func); }
374 + obj.AMT_EnvironmentDetectionSettingData_SetSystemDefensePolicy = function (Policy, callback_func) { obj.Exec("AMT_EnvironmentDetectionSettingData", "SetSystemDefensePolicy", { "Policy": Policy }, callback_func); }
375 + obj.AMT_EnvironmentDetectionSettingData_EnableVpnRouting = function (Enable, callback_func) { obj.Exec("AMT_EnvironmentDetectionSettingData", "EnableVpnRouting", { "Enable": Enable }, callback_func); }
376 + obj.AMT_EthernetPortSettings_SetLinkPreference = function (LinkPreference, Timeout, callback_func) { obj.Exec("AMT_EthernetPortSettings", "SetLinkPreference", { "LinkPreference": LinkPreference, "Timeout": Timeout }, callback_func); }
377 + obj.AMT_HeuristicPacketFilterStatistics_ResetSelectedStats = function (SelectedStatistics, callback_func) { obj.Exec("AMT_HeuristicPacketFilterStatistics", "ResetSelectedStats", { "SelectedStatistics": SelectedStatistics }, callback_func); }
378 + obj.AMT_KerberosSettingData_GetCredentialCacheState = function (callback_func) { obj.Exec("AMT_KerberosSettingData", "GetCredentialCacheState", {}, callback_func); }
379 + obj.AMT_KerberosSettingData_SetCredentialCacheState = function (Enable, callback_func) { obj.Exec("AMT_KerberosSettingData", "SetCredentialCacheState", { "Enable": Enable }, callback_func); }
380 + obj.AMT_MessageLog_CancelIteration = function (IterationIdentifier, callback_func) { obj.Exec("AMT_MessageLog", "CancelIteration", { "IterationIdentifier": IterationIdentifier }, callback_func); }
381 + obj.AMT_MessageLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_MessageLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
382 + obj.AMT_MessageLog_ClearLog = function (callback_func) { obj.Exec("AMT_MessageLog", "ClearLog", { }, callback_func); }
383 + obj.AMT_MessageLog_GetRecords = function (IterationIdentifier, MaxReadRecords, callback_func, tag) { obj.Exec("AMT_MessageLog", "GetRecords", { "IterationIdentifier": IterationIdentifier, "MaxReadRecords": MaxReadRecords }, callback_func, tag); }
384 + obj.AMT_MessageLog_GetRecord = function (IterationIdentifier, PositionToNext, callback_func) { obj.Exec("AMT_MessageLog", "GetRecord", { "IterationIdentifier": IterationIdentifier, "PositionToNext": PositionToNext }, callback_func); }
385 + obj.AMT_MessageLog_PositionAtRecord = function (IterationIdentifier, MoveAbsolute, RecordNumber, callback_func) { obj.Exec("AMT_MessageLog", "PositionAtRecord", { "IterationIdentifier": IterationIdentifier, "MoveAbsolute": MoveAbsolute, "RecordNumber": RecordNumber }, callback_func); }
386 + obj.AMT_MessageLog_PositionToFirstRecord = function (callback_func, tag) { obj.Exec("AMT_MessageLog", "PositionToFirstRecord", {}, callback_func, tag); }
387 + obj.AMT_MessageLog_FreezeLog = function (Freeze, callback_func) { obj.Exec("AMT_MessageLog", "FreezeLog", { "Freeze": Freeze }, callback_func); }
388 + obj.AMT_PublicKeyManagementService_AddCRL = function (Url, SerialNumbers, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddCRL", { "Url": Url, "SerialNumbers": SerialNumbers }, callback_func); }
389 + obj.AMT_PublicKeyManagementService_ResetCRLList = function (_method_dummy, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "ResetCRLList", { "_method_dummy": _method_dummy }, callback_func); }
390 + obj.AMT_PublicKeyManagementService_AddCertificate = function (CertificateBlob, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddCertificate", { "CertificateBlob": CertificateBlob }, callback_func); }
391 + obj.AMT_PublicKeyManagementService_AddTrustedRootCertificate = function (CertificateBlob, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddTrustedRootCertificate", { "CertificateBlob": CertificateBlob }, callback_func); }
392 + obj.AMT_PublicKeyManagementService_AddKey = function (KeyBlob, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddKey", { "KeyBlob": KeyBlob }, callback_func); }
393 + obj.AMT_PublicKeyManagementService_GeneratePKCS10Request = function (KeyPair, DNName, Usage, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "GeneratePKCS10Request", { "KeyPair": KeyPair, "DNName": DNName, "Usage": Usage }, callback_func); }
394 + obj.AMT_PublicKeyManagementService_GeneratePKCS10RequestEx = function (KeyPair, SigningAlgorithm, NullSignedCertificateRequest, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "GeneratePKCS10RequestEx", { "KeyPair": KeyPair, "SigningAlgorithm": SigningAlgorithm, "NullSignedCertificateRequest": NullSignedCertificateRequest }, callback_func); }
395 + obj.AMT_PublicKeyManagementService_GenerateKeyPair = function (KeyAlgorithm, KeyLength, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "GenerateKeyPair", { "KeyAlgorithm": KeyAlgorithm, "KeyLength": KeyLength }, callback_func); }
396 + obj.AMT_RedirectionService_RequestStateChange = function (RequestedState, callback_func) { obj.Exec("AMT_RedirectionService", "RequestStateChange", { "RequestedState": RequestedState }, callback_func); }
397 + obj.AMT_RedirectionService_TerminateSession = function (SessionType, callback_func) { obj.Exec("AMT_RedirectionService", "TerminateSession", { "SessionType": SessionType }, callback_func); }
398 + obj.AMT_RemoteAccessService_AddMpServer = function (AccessInfo, InfoFormat, Port, AuthMethod, Certificate, Username, Password, CN, callback_func) { obj.Exec("AMT_RemoteAccessService", "AddMpServer", { "AccessInfo": AccessInfo, "InfoFormat": InfoFormat, "Port": Port, "AuthMethod": AuthMethod, "Certificate": Certificate, "Username": Username, "Password": Password, "CN": CN }, callback_func); }
399 + obj.AMT_RemoteAccessService_AddRemoteAccessPolicyRule = function (Trigger, TunnelLifeTime, ExtendedData, MpServer, callback_func) { obj.Exec("AMT_RemoteAccessService", "AddRemoteAccessPolicyRule", { "Trigger": Trigger, "TunnelLifeTime": TunnelLifeTime, "ExtendedData": ExtendedData, "MpServer": MpServer }, callback_func); }
400 + obj.AMT_RemoteAccessService_CloseRemoteAccessConnection = function (_method_dummy, callback_func) { obj.Exec("AMT_RemoteAccessService", "CloseRemoteAccessConnection", { "_method_dummy": _method_dummy }, callback_func); }
401 + obj.AMT_SetupAndConfigurationService_CommitChanges = function (_method_dummy, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "CommitChanges", { "_method_dummy": _method_dummy }, callback_func); }
402 + obj.AMT_SetupAndConfigurationService_Unprovision = function (ProvisioningMode, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "Unprovision", { "ProvisioningMode": ProvisioningMode }, callback_func); }
403 + obj.AMT_SetupAndConfigurationService_PartialUnprovision = function (_method_dummy, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "PartialUnprovision", { "_method_dummy": _method_dummy }, callback_func); }
404 + obj.AMT_SetupAndConfigurationService_ResetFlashWearOutProtection = function (_method_dummy, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "ResetFlashWearOutProtection", { "_method_dummy": _method_dummy }, callback_func); }
405 + obj.AMT_SetupAndConfigurationService_ExtendProvisioningPeriod = function (Duration, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "ExtendProvisioningPeriod", { "Duration": Duration }, callback_func); }
406 + obj.AMT_SetupAndConfigurationService_SetMEBxPassword = function (Password, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "SetMEBxPassword", { "Password": Password }, callback_func); }
407 + obj.AMT_SetupAndConfigurationService_SetTLSPSK = function (PID, PPS, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "SetTLSPSK", { "PID": PID, "PPS": PPS }, callback_func); }
408 + obj.AMT_SetupAndConfigurationService_GetProvisioningAuditRecord = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetProvisioningAuditRecord", {}, callback_func); }
409 + obj.AMT_SetupAndConfigurationService_GetUuid = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetUuid", {}, callback_func); }
410 + obj.AMT_SetupAndConfigurationService_GetUnprovisionBlockingComponents = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetUnprovisionBlockingComponents", {}, callback_func); }
411 + obj.AMT_SetupAndConfigurationService_GetProvisioningAuditRecordV2 = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetProvisioningAuditRecordV2", {}, callback_func); }
412 + obj.AMT_SystemDefensePolicy_GetTimeout = function (callback_func) { obj.Exec("AMT_SystemDefensePolicy", "GetTimeout", {}, callback_func); }
413 + obj.AMT_SystemDefensePolicy_SetTimeout = function (Timeout, callback_func) { obj.Exec("AMT_SystemDefensePolicy", "SetTimeout", { "Timeout": Timeout }, callback_func); }
414 + obj.AMT_SystemDefensePolicy_UpdateStatistics = function (NetworkInterface, ResetOnRead, callback_func, tag, pri, selectors) { obj.Exec("AMT_SystemDefensePolicy", "UpdateStatistics", { "NetworkInterface": NetworkInterface, "ResetOnRead": ResetOnRead }, callback_func, tag, pri, selectors); }
415 + obj.AMT_SystemPowerScheme_SetPowerScheme = function (callback_func, schemeInstanceId, tag) { obj.Exec("AMT_SystemPowerScheme", "SetPowerScheme", {}, callback_func, tag, 0, { "InstanceID": schemeInstanceId }); }
416 + obj.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch = function (callback_func, tag) { obj.Exec("AMT_TimeSynchronizationService", "GetLowAccuracyTimeSynch", {}, callback_func, tag); }
417 + obj.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch = function (Ta0, Tm1, Tm2, callback_func, tag) { obj.Exec("AMT_TimeSynchronizationService", "SetHighAccuracyTimeSynch", { "Ta0": Ta0, "Tm1": Tm1, "Tm2": Tm2 }, callback_func, tag); }
418 + obj.AMT_UserInitiatedConnectionService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_UserInitiatedConnectionService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
419 + obj.AMT_WebUIService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_WebUIService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
420 + obj.AMT_WiFiPortConfigurationService_AddWiFiSettings = function (WiFiEndpoint, WiFiEndpointSettingsInput, IEEE8021xSettingsInput, ClientCredential, CACredential, callback_func) { obj.ExecWithXml("AMT_WiFiPortConfigurationService", "AddWiFiSettings", { "WiFiEndpoint": WiFiEndpoint, "WiFiEndpointSettingsInput": WiFiEndpointSettingsInput, "IEEE8021xSettingsInput": IEEE8021xSettingsInput, "ClientCredential": ClientCredential, "CACredential": CACredential }, callback_func); }
421 + obj.AMT_WiFiPortConfigurationService_UpdateWiFiSettings = function (WiFiEndpointSettings, WiFiEndpointSettingsInput, IEEE8021xSettingsInput, ClientCredential, CACredential, callback_func) { obj.ExecWithXml("AMT_WiFiPortConfigurationService", "UpdateWiFiSettings", { "WiFiEndpointSettings": WiFiEndpointSettings, "WiFiEndpointSettingsInput": WiFiEndpointSettingsInput, "IEEE8021xSettingsInput": IEEE8021xSettingsInput, "ClientCredential": ClientCredential, "CACredential": CACredential }, callback_func); }
422 + obj.AMT_WiFiPortConfigurationService_DeleteAllITProfiles = function (_method_dummy, callback_func) { obj.Exec("AMT_WiFiPortConfigurationService", "DeleteAllITProfiles", { "_method_dummy": _method_dummy }, callback_func); }
423 + obj.AMT_WiFiPortConfigurationService_DeleteAllUserProfiles = function (_method_dummy, callback_func) { obj.Exec("AMT_WiFiPortConfigurationService", "DeleteAllUserProfiles", { "_method_dummy": _method_dummy }, callback_func); }
424 + obj.CIM_Account_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Account", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
425 + obj.CIM_AccountManagementService_CreateAccount = function (System, AccountTemplate, callback_func) { obj.Exec("CIM_AccountManagementService", "CreateAccount", { "System": System, "AccountTemplate": AccountTemplate }, callback_func); }
426 + obj.CIM_BootConfigSetting_ChangeBootOrder = function (Source, callback_func) { obj.Exec("CIM_BootConfigSetting", "ChangeBootOrder", { "Source": Source }, callback_func); }
427 + obj.CIM_BootService_SetBootConfigRole = function (BootConfigSetting, Role, callback_func) { obj.Exec("CIM_BootService", "SetBootConfigRole", { "BootConfigSetting": BootConfigSetting, "Role": Role }, callback_func, 0, 1); }
428 + obj.CIM_Card_ConnectorPower = function (Connector, PoweredOn, callback_func) { obj.Exec("CIM_Card", "ConnectorPower", { "Connector": Connector, "PoweredOn": PoweredOn }, callback_func); }
429 + obj.CIM_Card_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_Card", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
430 + obj.CIM_Chassis_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_Chassis", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
431 + obj.CIM_Fan_SetSpeed = function (DesiredSpeed, callback_func) { obj.Exec("CIM_Fan", "SetSpeed", { "DesiredSpeed": DesiredSpeed }, callback_func); }
432 + obj.CIM_KVMRedirectionSAP_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_KVMRedirectionSAP", "RequestStateChange", { "RequestedState": RequestedState/*, "TimeoutPeriod": TimeoutPeriod */}, callback_func); }
433 + obj.CIM_MediaAccessDevice_LockMedia = function (Lock, callback_func) { obj.Exec("CIM_MediaAccessDevice", "LockMedia", { "Lock": Lock }, callback_func); }
434 + obj.CIM_MediaAccessDevice_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_MediaAccessDevice", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
435 + obj.CIM_MediaAccessDevice_Reset = function (callback_func) { obj.Exec("CIM_MediaAccessDevice", "Reset", {}, callback_func); }
436 + obj.CIM_MediaAccessDevice_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_MediaAccessDevice", "EnableDevice", { "Enabled": Enabled }, callback_func); }
437 + obj.CIM_MediaAccessDevice_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_MediaAccessDevice", "OnlineDevice", { "Online": Online }, callback_func); }
438 + obj.CIM_MediaAccessDevice_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_MediaAccessDevice", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
439 + obj.CIM_MediaAccessDevice_SaveProperties = function (callback_func) { obj.Exec("CIM_MediaAccessDevice", "SaveProperties", {}, callback_func); }
440 + obj.CIM_MediaAccessDevice_RestoreProperties = function (callback_func) { obj.Exec("CIM_MediaAccessDevice", "RestoreProperties", {}, callback_func); }
441 + obj.CIM_MediaAccessDevice_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_MediaAccessDevice", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
442 + obj.CIM_PhysicalFrame_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_PhysicalFrame", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
443 + obj.CIM_PhysicalPackage_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_PhysicalPackage", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
444 + obj.CIM_PowerManagementService_RequestPowerStateChange = function (PowerState, ManagedElement, Time, TimeoutPeriod, callback_func) { obj.Exec("CIM_PowerManagementService", "RequestPowerStateChange", { "PowerState": PowerState, "ManagedElement": ManagedElement, "Time": Time, "TimeoutPeriod": TimeoutPeriod }, callback_func, 0, 1); }
445 + obj.CIM_PowerSupply_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_PowerSupply", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
446 + obj.CIM_PowerSupply_Reset = function (callback_func) { obj.Exec("CIM_PowerSupply", "Reset", {}, callback_func); }
447 + obj.CIM_PowerSupply_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_PowerSupply", "EnableDevice", { "Enabled": Enabled }, callback_func); }
448 + obj.CIM_PowerSupply_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_PowerSupply", "OnlineDevice", { "Online": Online }, callback_func); }
449 + obj.CIM_PowerSupply_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_PowerSupply", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
450 + obj.CIM_PowerSupply_SaveProperties = function (callback_func) { obj.Exec("CIM_PowerSupply", "SaveProperties", {}, callback_func); }
451 + obj.CIM_PowerSupply_RestoreProperties = function (callback_func) { obj.Exec("CIM_PowerSupply", "RestoreProperties", {}, callback_func); }
452 + obj.CIM_PowerSupply_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_PowerSupply", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
453 + obj.CIM_Processor_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_Processor", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
454 + obj.CIM_Processor_Reset = function (callback_func) { obj.Exec("CIM_Processor", "Reset", {}, callback_func); }
455 + obj.CIM_Processor_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_Processor", "EnableDevice", { "Enabled": Enabled }, callback_func); }
456 + obj.CIM_Processor_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_Processor", "OnlineDevice", { "Online": Online }, callback_func); }
457 + obj.CIM_Processor_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_Processor", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
458 + obj.CIM_Processor_SaveProperties = function (callback_func) { obj.Exec("CIM_Processor", "SaveProperties", {}, callback_func); }
459 + obj.CIM_Processor_RestoreProperties = function (callback_func) { obj.Exec("CIM_Processor", "RestoreProperties", {}, callback_func); }
460 + obj.CIM_Processor_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Processor", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
461 + obj.CIM_RecordLog_ClearLog = function (callback_func) { obj.Exec("CIM_RecordLog", "ClearLog", {}, callback_func); }
462 + obj.CIM_RecordLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_RecordLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
463 + obj.CIM_RedirectionService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_RedirectionService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
464 + obj.CIM_Sensor_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_Sensor", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
465 + obj.CIM_Sensor_Reset = function (callback_func) { obj.Exec("CIM_Sensor", "Reset", {}, callback_func); }
466 + obj.CIM_Sensor_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_Sensor", "EnableDevice", { "Enabled": Enabled }, callback_func); }
467 + obj.CIM_Sensor_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_Sensor", "OnlineDevice", { "Online": Online }, callback_func); }
468 + obj.CIM_Sensor_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_Sensor", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
469 + obj.CIM_Sensor_SaveProperties = function (callback_func) { obj.Exec("CIM_Sensor", "SaveProperties", {}, callback_func); }
470 + obj.CIM_Sensor_RestoreProperties = function (callback_func) { obj.Exec("CIM_Sensor", "RestoreProperties", {}, callback_func); }
471 + obj.CIM_Sensor_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Sensor", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
472 + obj.CIM_StatisticalData_ResetSelectedStats = function (SelectedStatistics, callback_func) { obj.Exec("CIM_StatisticalData", "ResetSelectedStats", { "SelectedStatistics": SelectedStatistics }, callback_func); }
473 + obj.CIM_Watchdog_KeepAlive = function (callback_func) { obj.Exec("CIM_Watchdog", "KeepAlive", {}, callback_func); }
474 + obj.CIM_Watchdog_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_Watchdog", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
475 + obj.CIM_Watchdog_Reset = function (callback_func) { obj.Exec("CIM_Watchdog", "Reset", {}, callback_func); }
476 + obj.CIM_Watchdog_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_Watchdog", "EnableDevice", { "Enabled": Enabled }, callback_func); }
477 + obj.CIM_Watchdog_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_Watchdog", "OnlineDevice", { "Online": Online }, callback_func); }
478 + obj.CIM_Watchdog_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_Watchdog", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
479 + obj.CIM_Watchdog_SaveProperties = function (callback_func) { obj.Exec("CIM_Watchdog", "SaveProperties", {}, callback_func); }
480 + obj.CIM_Watchdog_RestoreProperties = function (callback_func) { obj.Exec("CIM_Watchdog", "RestoreProperties", {}, callback_func); }
481 + obj.CIM_Watchdog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Watchdog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
482 + obj.CIM_WiFiPort_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_WiFiPort", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
483 + obj.CIM_WiFiPort_Reset = function (callback_func) { obj.Exec("CIM_WiFiPort", "Reset", {}, callback_func); }
484 + obj.CIM_WiFiPort_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_WiFiPort", "EnableDevice", { "Enabled": Enabled }, callback_func); }
485 + obj.CIM_WiFiPort_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_WiFiPort", "OnlineDevice", { "Online": Online }, callback_func); }
486 + obj.CIM_WiFiPort_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_WiFiPort", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
487 + obj.CIM_WiFiPort_SaveProperties = function (callback_func) { obj.Exec("CIM_WiFiPort", "SaveProperties", {}, callback_func); }
488 + obj.CIM_WiFiPort_RestoreProperties = function (callback_func) { obj.Exec("CIM_WiFiPort", "RestoreProperties", {}, callback_func); }
489 + obj.CIM_WiFiPort_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_WiFiPort", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
490 + obj.IPS_HostBasedSetupService_Setup = function (NetAdminPassEncryptionType, NetworkAdminPassword, McNonce, Certificate, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "Setup", { "NetAdminPassEncryptionType": NetAdminPassEncryptionType, "NetworkAdminPassword": NetworkAdminPassword, "McNonce": McNonce, "Certificate": Certificate, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
491 + obj.IPS_HostBasedSetupService_AddNextCertInChain = function (NextCertificate, IsLeafCertificate, IsRootCertificate, callback_func) { obj.Exec("IPS_HostBasedSetupService", "AddNextCertInChain", { "NextCertificate": NextCertificate, "IsLeafCertificate": IsLeafCertificate, "IsRootCertificate": IsRootCertificate }, callback_func); }
492 + obj.IPS_HostBasedSetupService_AdminSetup = function (NetAdminPassEncryptionType, NetworkAdminPassword, McNonce, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "AdminSetup", { "NetAdminPassEncryptionType": NetAdminPassEncryptionType, "NetworkAdminPassword": NetworkAdminPassword, "McNonce": McNonce, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
493 + obj.IPS_HostBasedSetupService_UpgradeClientToAdmin = function (McNonce, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "UpgradeClientToAdmin", { "McNonce": McNonce, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
494 + obj.IPS_HostBasedSetupService_DisableClientControlMode = function (_method_dummy, callback_func) { obj.Exec("IPS_HostBasedSetupService", "DisableClientControlMode", { "_method_dummy": _method_dummy }, callback_func); }
495 + obj.IPS_KVMRedirectionSettingData_TerminateSession = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "TerminateSession", {}, callback_func); }
496 + obj.IPS_OptInService_StartOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "StartOptIn", {}, callback_func); }
497 + obj.IPS_OptInService_CancelOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "CancelOptIn", {}, callback_func); }
498 + obj.IPS_OptInService_SendOptInCode = function (OptInCode, callback_func) { obj.Exec("IPS_OptInService", "SendOptInCode", { "OptInCode": OptInCode }, callback_func); }
499 + obj.IPS_OptInService_StartService = function (callback_func) { obj.Exec("IPS_OptInService", "StartService", {}, callback_func); }
500 + obj.IPS_OptInService_StopService = function (callback_func) { obj.Exec("IPS_OptInService", "StopService", {}, callback_func); }
501 + obj.IPS_OptInService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("IPS_OptInService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
502 + obj.IPS_ProvisioningRecordLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("IPS_ProvisioningRecordLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
503 + obj.IPS_ProvisioningRecordLog_ClearLog = function (_method_dummy, callback_func) { obj.Exec("IPS_ProvisioningRecordLog", "ClearLog", { "_method_dummy": _method_dummy }, callback_func); }
504 + obj.IPS_SecIOService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("IPS_SecIOService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
505 +
506 + obj.AmtStatusToStr = function (code) { if (obj.AmtStatusCodes[code]) return obj.AmtStatusCodes[code]; else return "UNKNOWN_ERROR" }
507 + obj.AmtStatusCodes = {
508 + 0x0000: "SUCCESS",
509 + 0x0001: "INTERNAL_ERROR",
510 + 0x0002: "NOT_READY",
511 + 0x0003: "INVALID_PT_MODE",
512 + 0x0004: "INVALID_MESSAGE_LENGTH",
513 + 0x0005: "TABLE_FINGERPRINT_NOT_AVAILABLE",
514 + 0x0006: "INTEGRITY_CHECK_FAILED",
515 + 0x0007: "UNSUPPORTED_ISVS_VERSION",
516 + 0x0008: "APPLICATION_NOT_REGISTERED",
517 + 0x0009: "INVALID_REGISTRATION_DATA",
518 + 0x000A: "APPLICATION_DOES_NOT_EXIST",
519 + 0x000B: "NOT_ENOUGH_STORAGE",
520 + 0x000C: "INVALID_NAME",
521 + 0x000D: "BLOCK_DOES_NOT_EXIST",
522 + 0x000E: "INVALID_BYTE_OFFSET",
523 + 0x000F: "INVALID_BYTE_COUNT",
524 + 0x0010: "NOT_PERMITTED",
525 + 0x0011: "NOT_OWNER",
526 + 0x0012: "BLOCK_LOCKED_BY_OTHER",
527 + 0x0013: "BLOCK_NOT_LOCKED",
528 + 0x0014: "INVALID_GROUP_PERMISSIONS",
529 + 0x0015: "GROUP_DOES_NOT_EXIST",
530 + 0x0016: "INVALID_MEMBER_COUNT",
531 + 0x0017: "MAX_LIMIT_REACHED",
532 + 0x0018: "INVALID_AUTH_TYPE",
533 + 0x0019: "AUTHENTICATION_FAILED",
534 + 0x001A: "INVALID_DHCP_MODE",
535 + 0x001B: "INVALID_IP_ADDRESS",
536 + 0x001C: "INVALID_DOMAIN_NAME",
537 + 0x001D: "UNSUPPORTED_VERSION",
538 + 0x001E: "REQUEST_UNEXPECTED",
539 + 0x001F: "INVALID_TABLE_TYPE",
540 + 0x0020: "INVALID_PROVISIONING_STATE",
541 + 0x0021: "UNSUPPORTED_OBJECT",
542 + 0x0022: "INVALID_TIME",
543 + 0x0023: "INVALID_INDEX",
544 + 0x0024: "INVALID_PARAMETER",
545 + 0x0025: "INVALID_NETMASK",
546 + 0x0026: "FLASH_WRITE_LIMIT_EXCEEDED",
547 + 0x0027: "INVALID_IMAGE_LENGTH",
548 + 0x0028: "INVALID_IMAGE_SIGNATURE",
549 + 0x0029: "PROPOSE_ANOTHER_VERSION",
550 + 0x002A: "INVALID_PID_FORMAT",
551 + 0x002B: "INVALID_PPS_FORMAT",
552 + 0x002C: "BIST_COMMAND_BLOCKED",
553 + 0x002D: "CONNECTION_FAILED",
554 + 0x002E: "CONNECTION_TOO_MANY",
555 + 0x002F: "RNG_GENERATION_IN_PROGRESS",
556 + 0x0030: "RNG_NOT_READY",
557 + 0x0031: "CERTIFICATE_NOT_READY",
558 + 0x0400: "DISABLED_BY_POLICY",
559 + 0x0800: "NETWORK_IF_ERROR_BASE",
560 + 0x0801: "UNSUPPORTED_OEM_NUMBER",
561 + 0x0802: "UNSUPPORTED_BOOT_OPTION",
562 + 0x0803: "INVALID_COMMAND",
563 + 0x0804: "INVALID_SPECIAL_COMMAND",
564 + 0x0805: "INVALID_HANDLE",
565 + 0x0806: "INVALID_PASSWORD",
566 + 0x0807: "INVALID_REALM",
567 + 0x0808: "STORAGE_ACL_ENTRY_IN_USE",
568 + 0x0809: "DATA_MISSING",
569 + 0x080A: "DUPLICATE",
570 + 0x080B: "EVENTLOG_FROZEN",
571 + 0x080C: "PKI_MISSING_KEYS",
572 + 0x080D: "PKI_GENERATING_KEYS",
573 + 0x080E: "INVALID_KEY",
574 + 0x080F: "INVALID_CERT",
575 + 0x0810: "CERT_KEY_NOT_MATCH",
576 + 0x0811: "MAX_KERB_DOMAIN_REACHED",
577 + 0x0812: "UNSUPPORTED",
578 + 0x0813: "INVALID_PRIORITY",
579 + 0x0814: "NOT_FOUND",
580 + 0x0815: "INVALID_CREDENTIALS",
581 + 0x0816: "INVALID_PASSPHRASE",
582 + 0x0818: "NO_ASSOCIATION",
583 + 0x081B: "AUDIT_FAIL",
584 + 0x081C: "BLOCKING_COMPONENT",
585 + 0x0821: "USER_CONSENT_REQUIRED",
586 + 0x1000: "APP_INTERNAL_ERROR",
587 + 0x1001: "NOT_INITIALIZED",
588 + 0x1002: "LIB_VERSION_UNSUPPORTED",
589 + 0x1003: "INVALID_PARAM",
590 + 0x1004: "RESOURCES",
591 + 0x1005: "HARDWARE_ACCESS_ERROR",
592 + 0x1006: "REQUESTOR_NOT_REGISTERED",
593 + 0x1007: "NETWORK_ERROR",
594 + 0x1008: "PARAM_BUFFER_TOO_SHORT",
595 + 0x1009: "COM_NOT_INITIALIZED_IN_THREAD",
596 + 0x100A: "URL_REQUIRED"
597 + }
598 +
599 + //
600 + // Methods used for getting the event log
601 + //
602 +
603 + obj.GetMessageLog = function (func, tag) {
604 + obj.AMT_MessageLog_PositionToFirstRecord(_GetMessageLog0, [func, tag, []]);
605 + }
606 + function _GetMessageLog0(stack, name, responses, status, tag) {
607 + if (status != 200 || responses.Body["ReturnValue"] != '0') { tag[0](obj, null, tag[2]); return; }
608 + obj.AMT_MessageLog_GetRecords(responses.Body["IterationIdentifier"], 390, _GetMessageLog1, tag);
609 + }
610 + function _GetMessageLog1(stack, name, responses, status, tag) {
611 + if (status != 200 || responses.Body["ReturnValue"] != '0') { tag[0](obj, null, tag[2]); return; }
612 + var i, j, x, e, AmtMessages = tag[2], t = new Date(), TimeStamp, ra = responses.Body["RecordArray"];
613 + if (typeof ra === 'string') { responses.Body["RecordArray"] = [responses.Body["RecordArray"]]; }
614 +
615 + for (i in ra) {
616 + e = null;
617 + try { e = window.atob(ra[i]); } catch (ex) { }
618 + if (e != null) {
619 + TimeStamp = ReadIntX(e, 0);
620 + if ((TimeStamp > 0) && (TimeStamp < 0xFFFFFFFF)) {
621 + x = { 'DeviceAddress': e.charCodeAt(4), 'EventSensorType': e.charCodeAt(5), 'EventType': e.charCodeAt(6), 'EventOffset': e.charCodeAt(7), 'EventSourceType': e.charCodeAt(8), 'EventSeverity': e.charCodeAt(9), 'SensorNumber': e.charCodeAt(10), 'Entity': e.charCodeAt(11), 'EntityInstance': e.charCodeAt(12), 'EventData': [], 'Time': new Date((TimeStamp + (t.getTimezoneOffset() * 60)) * 1000) };
622 + for (j = 13; j < 21; j++) { x['EventData'].push(e.charCodeAt(j)); }
623 + x['EntityStr'] = _SystemEntityTypes[x['Entity']];
624 + x['Desc'] = _GetEventDetailStr(x['EventSensorType'], x['EventOffset'], x['EventData'], x['Entity']);
625 + if (!x['EntityStr']) x['EntityStr'] = "Unknown";
626 + AmtMessages.push(x);
627 + }
628 + }
629 + }
630 +
631 + if (responses.Body["NoMoreRecords"] != true) { obj.AMT_MessageLog_GetRecords(responses.Body["IterationIdentifier"], 390, _GetMessageLog1, [tag[0], AmtMessages, tag[2]]); } else { tag[0](obj, AmtMessages, tag[2]); }
632 + }
633 +
634 + var _EventTrapSourceTypes = "Platform firmware (e.g. BIOS)|SMI handler|ISV system management software|Alert ASIC|IPMI|BIOS vendor|System board set vendor|System integrator|Third party add-in|OSV|NIC|System management card".split('|');
635 + var _SystemFirmwareError = "Unspecified.|No system memory is physically installed in the system.|No usable system memory, all installed memory has experienced an unrecoverable failure.|Unrecoverable hard-disk/ATAPI/IDE device failure.|Unrecoverable system-board failure.|Unrecoverable diskette subsystem failure.|Unrecoverable hard-disk controller failure.|Unrecoverable PS/2 or USB keyboard failure.|Removable boot media not found.|Unrecoverable video controller failure.|No video device detected.|Firmware (BIOS) ROM corruption detected.|CPU voltage mismatch (processors that share same supply have mismatched voltage requirements)|CPU speed matching failure".split('|');
636 + var _SystemFirmwareProgress = "Unspecified.|Memory initialization.|Starting hard-disk initialization and test|Secondary processor(s) initialization|User authentication|User-initiated system setup|USB resource configuration|PCI resource configuration|Option ROM initialization|Video initialization|Cache initialization|SM Bus initialization|Keyboard controller initialization|Embedded controller/management controller initialization|Docking station attachment|Enabling docking station|Docking station ejection|Disabling docking station|Calling operating system wake-up vector|Starting operating system boot process|Baseboard or motherboard initialization|reserved|Floppy initialization|Keyboard test|Pointing device test|Primary processor initialization".split('|');
637 + var _SystemEntityTypes = "Unspecified|Other|Unknown|Processor|Disk|Peripheral|System management module|System board|Memory module|Processor module|Power supply|Add in card|Front panel board|Back panel board|Power system board|Drive backplane|System internal expansion board|Other system board|Processor board|Power unit|Power module|Power management board|Chassis back panel board|System chassis|Sub chassis|Other chassis board|Disk drive bay|Peripheral bay|Device bay|Fan cooling|Cooling unit|Cable interconnect|Memory device|System management software|BIOS|Intel(r) ME|System bus|Group|Intel(r) ME|External environment|Battery|Processing blade|Connectivity switch|Processor/memory module|I/O module|Processor I/O module|Management controller firmware|IPMI channel|PCI bus|PCI express bus|SCSI bus|SATA/SAS bus|Processor front side bus".split('|');
638 + obj.RealmNames = "||Redirection|PT Administration|Hardware Asset|Remote Control|Storage|Event Manager|Storage Admin|Agent Presence Local|Agent Presence Remote|Circuit Breaker|Network Time|General Information|Firmware Update|EIT|LocalUN|Endpoint Access Control|Endpoint Access Control Admin|Event Log Reader|Audit Log|ACL Realm|||Local System".split('|');
639 + obj.WatchdogCurrentStates = { 1: 'Not Started', 2: 'Stopped', 4: 'Running', 8: 'Expired', 16: 'Suspended' };
640 +
641 + function _GetEventDetailStr(eventSensorType, eventOffset, eventDataField, entity) {
642 +
643 + if (eventSensorType == 15)
644 + {
645 + if (eventDataField[0] == 235) return "Invalid Data";
646 + if (eventOffset == 0) return _SystemFirmwareError[eventDataField[1]];
647 + return _SystemFirmwareProgress[eventDataField[1]];
648 + }
649 +
650 + if (eventSensorType == 18 && eventDataField[0] == 170) // System watchdog event
651 + {
652 + return "Agent watchdog " + char2hex(eventDataField[4]) + char2hex(eventDataField[3]) + char2hex(eventDataField[2]) + char2hex(eventDataField[1]) + "-" + char2hex(eventDataField[6]) + char2hex(eventDataField[5]) + "-... changed to " + obj.WatchdogCurrentStates[eventDataField[7]];
653 + }
654 +
655 + /*
656 + if (eventSensorType == 5 && eventOffset == 0) // System chassis
657 + {
658 + return "Case intrusion";
659 + }
660 +
661 + if (eventSensorType == 192 && eventOffset == 0 && eventDataField[0] == 170 && eventDataField[1] == 48)
662 + {
663 + if (eventDataField[2] == 0) return "A remote Serial Over LAN session was established.";
664 + if (eventDataField[2] == 1) return "Remote Serial Over LAN session finished. User control was restored.";
665 + if (eventDataField[2] == 2) return "A remote IDE-Redirection session was established.";
666 + if (eventDataField[2] == 3) return "Remote IDE-Redirection session finished. User control was restored.";
667 + }
668 +
669 + if (eventSensorType == 36)
670 + {
671 + long handle = ((long)(eventDataField[1]) << 24) + ((long)(eventDataField[2]) << 16) + ((long)(eventDataField[3]) << 8) + (long)(eventDataField[4]);
672 + string nic = string.Format("#{0}", eventDataField[0]);
673 + if (eventDataField[0] == 0xAA) nic = "wired"; // TODO: Add wireless *****
674 + //if (eventDataField[0] == 0xAA) nic = "wireless";
675 +
676 + if (handle == 4294967293) { return string.Format("All received packet filter was matched on {0} interface.", nic); }
677 + if (handle == 4294967292) { return string.Format("All outbound packet filter was matched on {0} interface.", nic); }
678 + if (handle == 4294967290) { return string.Format("Spoofed packet filter was matched on {0} interface.", nic); }
679 + return string.Format("Filter {0} was matched on {1} interface.", handle, nic);
680 + }
681 +
682 + if (eventSensorType == 192)
683 + {
684 + if (eventDataField[2] == 0) return "Security policy invoked. Some or all network traffic (TX) was stopped.";
685 + if (eventDataField[2] == 2) return "Security policy invoked. Some or all network traffic (RX) was stopped.";
686 + return "Security policy invoked.";
687 + }
688 +
689 + if (eventSensorType == 193)
690 + {
691 + if (eventDataField[0] == 0xAA && eventDataField[1] == 0x30 && eventDataField[2] == 0x00 && eventDataField[3] == 0x00) { return "User request for remote connection."; }
692 + if (eventDataField[0] == 0xAA && eventDataField[1] == 0x20 && eventDataField[2] == 0x03 && eventDataField[3] == 0x01) { return "EAC error: attempt to get posture while NAC in Intel� AMT is disabled."; // eventDataField = 0xAA20030100000000 }
693 + if (eventDataField[0] == 0xAA && eventDataField[1] == 0x20 && eventDataField[2] == 0x04 && eventDataField[3] == 0x00) { return "Certificate revoked. "; }
694 + }
695 + */
696 +
697 + if (eventSensorType == 6) return "Authentication failed " + (eventDataField[1] + (eventDataField[2] << 8)) + " times. The system may be under attack.";
698 + if (eventSensorType == 30) return "No bootable media";
699 + if (eventSensorType == 32) return "Operating system lockup or power interrupt";
700 + if (eventSensorType == 35) return "System boot failure";
701 + if (eventSensorType == 37) return "System firmware started (at least one CPU is properly executing).";
702 + return "Unknown Sensor Type #" + eventSensorType;
703 + }
704 +
705 +
706 + return obj;
707 +}
708 +
709 +
710 +
711 +
712 +
713 +// TinyMD5 from https://github.com/jbt/js-crypto
714 +
715 +// Perform MD5 setup
716 +var md5_k = [];
717 +for (var i = 0; i < 64;) { md5_k[i] = 0 | (Math.abs(Math.sin(++i)) * 4294967296); }
718 +
719 +// Perform MD5 on raw string and return hex
720 +function hex_md5(str) {
721 + var b, c, d, j,
722 + x = [],
723 + str2 = unescape(encodeURI(str)),
724 + a = str2.length,
725 + h = [b = 1732584193, c = -271733879, ~b, ~c],
726 + i = 0;
727 +
728 + for (; i <= a;) x[i >> 2] |= (str2.charCodeAt(i) || 128) << 8 * (i++ % 4);
729 +
730 + x[str = (a + 8 >> 6) * 16 + 14] = a * 8;
731 + i = 0;
732 +
733 + for (; i < str; i += 16) {
734 + a = h; j = 0;
735 + for (; j < 64;) {
736 + a = [
737 + d = a[3],
738 + ((b = a[1] | 0) +
739 + ((d = (
740 + (a[0] +
741 + [
742 + b & (c = a[2]) | ~b & d,
743 + d & b | ~d & c,
744 + b ^ c ^ d,
745 + c ^ (b | ~d)
746 + ][a = j >> 4]
747 + ) +
748 + (md5_k[j] +
749 + (x[[
750 + j,
751 + 5 * j + 1,
752 + 3 * j + 5,
753 + 7 * j
754 + ][a] % 16 + i] | 0)
755 + )
756 + )) << (a = [
757 + 7, 12, 17, 22,
758 + 5, 9, 14, 20,
759 + 4, 11, 16, 23,
760 + 6, 10, 15, 21
761 + ][4 * a + j++ % 4]) | d >>> 32 - a)
762 + ),
763 + b,
764 + c
765 + ];
766 + }
767 + for (j = 4; j;) h[--j] = h[j] + a[j];
768 + }
769 +
770 + str = '';
771 + for (; j < 32;) str += ((h[j >> 3] >> ((1 ^ j++ & 7) * 4)) & 15).toString(16);
772 + return str;
773 +}
774 +
775 +
776 +// Perform MD5 on raw string and return raw string result
777 +function rstr_md5(str) { return hex2rstr(hex_md5(str)); }
778 +
779 +/*
780 +Convert arguments into selector set and body XML. Used by AMT_WiFiPortConfigurationService_UpdateWiFiSettings.
781 +args = {
782 + "WiFiEndpoint": {
783 + __parameterType: 'reference',
784 + __resourceUri: 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpoint',
785 + Name: 'WiFi Endpoint 0'
786 + },
787 + "WiFiEndpointSettingsInput":
788 + {
789 + __parameterType: 'instance',
790 + __namespace: 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpointSettings',
791 + ElementName: document.querySelector('#editProfile-profileName').value,
792 + InstanceID: 'Intel(r) AMT:WiFi Endpoint Settings ' + document.querySelector('#editProfile-profileName').value,
793 + AuthenticationMethod: document.querySelector('#editProfile-networkAuthentication').value,
794 + //BSSType: 3, // Intel(r) AMT supports only infrastructure networks
795 + EncryptionMethod: document.querySelector('#editProfile-encryption').value,
796 + SSID: document.querySelector('#editProfile-networkName').value,
797 + Priority: 100,
798 + PSKPassPhrase: document.querySelector('#editProfile-passPhrase').value
799 + },
800 + "IEEE8021xSettingsInput": null,
801 + "ClientCredential": null,
802 + "CACredential": null
803 +},
804 +*/
805 +function execArgumentsToXml(args) {
806 + if(args === undefined || args === null) return null;
807 +
808 + var result = '';
809 + for(var argName in args) {
810 + var arg = args[argName];
811 + if(!arg) continue;
812 + if(arg['__parameterType'] === 'reference') result += referenceToXml(argName, arg);
813 + else result += instanceToXml(argName, arg);
814 + //if(arg['__isInstance']) result += instanceToXml(argName, arg);
815 + }
816 + return result;
817 +}
818 +
819 +/**
820 + * Convert JavaScript object into XML
821 +
822 + <r:WiFiEndpointSettingsInput xmlns:q="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpointSettings">
823 + <q:ElementName>Wireless-Profile-Admin</q:ElementName>
824 + <q:InstanceID>Intel(r) AMT:WiFi Endpoint Settings Wireless-Profile-Admin</q:InstanceID>
825 + <q:AuthenticationMethod>6</q:AuthenticationMethod>
826 + <q:EncryptionMethod>4</q:EncryptionMethod>
827 + <q:Priority>100</q:Priority>
828 + <q:PSKPassPhrase>P@ssw0rd</q:PSKPassPhrase>
829 + </r:WiFiEndpointSettingsInput>
830 + */
831 +function instanceToXml(instanceName, inInstance) {
832 + if(inInstance === undefined || inInstance === null) return null;
833 +
834 + var hasNamespace = !!inInstance['__namespace'];
835 + var startTag = hasNamespace ? '<q:' : '<';
836 + var endTag = hasNamespace ? '</q:' : '</';
837 + var namespaceDef = hasNamespace ? (' xmlns:q="' + inInstance['__namespace'] + '"' ): '';
838 + var result = '<r:' + instanceName + namespaceDef + '>';
839 + for(var prop in inInstance) {
840 + if (!inInstance.hasOwnProperty(prop) || prop.indexOf('__') === 0) continue;
841 +
842 + if (typeof inInstance[prop] === 'function' || Array.isArray(inInstance[prop]) ) continue;
843 +
844 + if (typeof inInstance[prop] === 'object') {
845 + //result += startTag + prop +'>' + instanceToXml('prop', inInstance[prop]) + endTag + prop +'>';
846 + console.error('only convert one level down...');
847 + }
848 + else {
849 + result += startTag + prop +'>' + inInstance[prop].toString() + endTag + prop +'>';
850 + }
851 + }
852 + result += '</r:' + instanceName + '>';
853 + return result;
854 +}
855 +
856 +
857 +/**
858 + * Convert a selector set into XML. Expect no nesting.
859 + * {
860 + * selectorName : selectorValue,
861 + * selectorName : selectorValue,
862 + * ... ...
863 + * }
864 +
865 + <r:WiFiEndpoint>
866 + <a:Address>http://192.168.1.103:16992/wsman</a:Address>
867 + <a:ReferenceParameters>
868 + <w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpoint</w:ResourceURI>
869 + <w:SelectorSet>
870 + <w:Selector Name="Name">WiFi Endpoint 0</w:Selector>
871 + </w:SelectorSet>
872 + </a:ReferenceParameters>
873 + </r:WiFiEndpoint>
874 +
875 + */
876 +function referenceToXml(referenceName, inReference) {
877 + if(inReference === undefined || inReference === null ) return null;
878 +
879 + var result = '<r:' + referenceName + '><a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>'+ inReference['__resourceUri']+'</w:ResourceURI><w:SelectorSet>';
880 + for(var selectorName in inReference) {
881 + if (!inReference.hasOwnProperty(selectorName) || selectorName.indexOf('__') === 0) continue;
882 +
883 + if (typeof inReference[selectorName] === 'function' ||
884 + typeof inReference[selectorName] === 'object' ||
885 + Array.isArray(inReference[selectorName]) )
886 + continue;
887 +
888 + result += '<w:Selector Name="' + selectorName +'">' + inReference[selectorName].toString() + '</w:Selector>';
889 + }
890 +
891 + result += '</w:SelectorSet></a:ReferenceParameters></r:' + referenceName + '>';
892 + return result;
893 +}
894 +
895 +// Convert a byte array of SID into string
896 +function GetSidString(sid) {
897 + var r = "S-" + sid.charCodeAt(0) + "-" + sid.charCodeAt(7);
898 + for (var i = 2; i < (sid.length / 4) ; i++) r += "-" + ReadIntX(sid, i * 4);
899 + return r;
900 +}
901 +
902 +// Convert a SID readable string into bytes
903 +function GetSidByteArray(sidString) {
904 + if (!sidString || sidString == null) return null;
905 + var sidParts = sidString.split('-');
906 +
907 + // Make sure the SID has at least 4 parts and starts with 'S'
908 + if (sidParts.length < 4 || (sidParts[0] != 's' && sidParts[0] != 'S')) return null;
909 +
910 + // Check that each part of the SID is really an integer
911 + for (var i = 1; i < sidParts.length; i++) { var y = parseInt(sidParts[i]); if (y != sidParts[i]) return null; sidParts[i] = y; }
912 +
913 + // Version (8 bit) + Id count (8 bit) + 48 bit in big endian -- DO NOT use bitwise right shift operator. JavaScript converts the number into a 32 bit integer before shifting. In real world, it's highly likely this part is always 0.
914 + var r = String.fromCharCode(sidParts[1]) + String.fromCharCode(sidParts.length - 3) + ShortToStr(Math.floor(sidParts[2] / Math.pow(2, 32))) + IntToStr((sidParts[2]) & 0xFFFF);
915 +
916 + // the rest are in 32 bit in little endian
917 + for (var i = 3; i < sidParts.length; i++) r += IntToStrX(sidParts[i]);
918 + return r;
919 +}
920 +/**
921 +* @description Intel(r) AMT WSMAN Stack
922 +* @author Ylian Saint-Hilaire
923 +* @version v0.2.0
924 +*/
925 +
926 +// Construct a MeshServer object
927 +var WsmanStackCreateService = function (host, port, user, pass, tls, extra) {
928 + var obj = {};
929 + //obj.onDebugMessage = null; // Set to a function if you want to get debug messages.
930 + obj.NextMessageId = 1; // Next message number, used to label WSMAN calls.
931 + obj.Address = '/wsman';
932 + obj.comm = CreateWsmanComm(host, port, user, pass, tls, extra);
933 +
934 + obj.PerformAjax = function (postdata, callback, tag, pri, namespaces) {
935 + if (namespaces == undefined) namespaces = '';
936 + 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) {
937 + if (status != 200) { callback(obj, null, { Header: { HttpError: status } }, status, tag); return; }
938 + var wsresponse = obj.ParseWsman(data);
939 + if (!wsresponse || wsresponse == null) { callback(obj, null, { Header: { HttpError: status } }, 601, tag); } else { callback(obj, wsresponse.Header["ResourceURI"], wsresponse, 200, tag); }
940 + }, tag, pri);
941 + }
942 +
943 + // Private method
944 + //obj.Debug = function (msg) { /*console.log(msg);*/ }
945 +
946 + // Cancel all pending queries with given status
947 + obj.CancelAllQueries = function (s) { obj.comm.CancelAllQueries(s); }
948 +
949 + // Get the last element of a URI string
950 + obj.GetNameFromUrl = function (resuri) {
951 + var x = resuri.lastIndexOf("/");
952 + return (x == -1)?resuri:resuri.substring(x + 1);
953 + }
954 +
955 + // Perform a WSMAN Subscribe operation
956 + obj.ExecSubscribe = function (resuri, delivery, url, callback, tag, pri, selectors, opaque, user, pass) {
957 + var digest = "", digest2 = "";
958 + if (user != undefined && pass != undefined) { digest = '<t:IssuedTokens><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 = '<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'; }
959 + if (opaque != undefined && opaque != null) { opaque = '<a:ReferenceParameters>' + opaque + '</a:ReferenceParameters>'; } else { opaque = ""; }
960 + 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.dmtf.org/wbem/wsman/1/wsman/' + delivery + '"><e:NotifyTo><a:Address>' + url + '</a:Address></e:NotifyTo>' + digest2 + '</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>';
961 + obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" 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" xmlns:m="http://x.com"');
962 + }
963 +
964 + // Perform a WSMAN UnSubscribe operation
965 + obj.ExecUnSubscribe = function (resuri, callback, tag, pri, selectors) {
966 + 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/>';
967 + obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"');
968 + }
969 +
970 + // Perform a WSMAN PUT operation
971 + obj.ExecPut = function (resuri, putobj, callback, tag, pri, selectors) {
972 + 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);
973 + obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri);
974 + }
975 +
976 + // Perform a WSMAN CREATE operation
977 + obj.ExecCreate = function (resuri, putobj, callback, tag, pri, selectors) {
978 + var objname = obj.GetNameFromUrl(resuri);
979 + 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 + "\">";
980 + for (var n in putobj) { data += "<g:" + n + ">" + putobj[n] + "</g:" + n + ">" }
981 + obj.PerformAjax(data + "</g:" + objname + "></Body></Envelope>", callback, tag, pri);
982 + }
983 +
984 + // Perform a WSMAN CREATE operation
985 + obj.ExecCreateXml = function (resuri, argsxml, callback, tag, pri) {
986 + var objname = obj.GetNameFromUrl(resuri), selector = "";
987 + obj.PerformAjax("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>PT60.000S</w:OperationTimeout></Header><Body><r:" + objname + " xmlns:r=\"" + resuri + "\">" + argsxml + "</r:" + objname + "></Body></Envelope>", callback, tag, pri);
988 + }
989 +
990 + // Perform a WSMAN DELETE operation
991 + obj.ExecDelete = function (resuri, putobj, callback, tag, pri) {
992 + 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>";
993 + obj.PerformAjax(data, callback, tag, pri);
994 + }
995 +
996 + // Perform a WSMAN GET operation
997 + obj.ExecGet = function (resuri, callback, tag, pri) {
998 + 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);
999 + }
1000 +
1001 + // Perform a WSMAN method call operation
1002 + obj.ExecMethod = function (resuri, method, args, callback, tag, pri, selectors) {
1003 + var argsxml = "";
1004 + 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 + ">"; } } }
1005 + obj.ExecMethodXml(resuri, method, argsxml, callback, tag, pri, selectors);
1006 + }
1007 +
1008 + // Perform a WSMAN method call operation. The arguments are already formatted in XML.
1009 + obj.ExecMethodXml = function (resuri, method, argsxml, callback, tag, pri, selectors) {
1010 + 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);
1011 + }
1012 +
1013 + // Perform a WSMAN ENUM operation
1014 + obj.ExecEnum = function (resuri, callback, tag, pri) {
1015 + 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);
1016 + }
1017 +
1018 + // Perform a WSMAN PULL operation
1019 + obj.ExecPull = function (resuri, enumctx, callback, tag, pri) {
1020 + 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);
1021 + }
1022 +
1023 + // Private method
1024 + obj.ParseWsman = function (xml) {
1025 + try {
1026 + if (!xml.childNodes) xml = _turnToXml(xml);
1027 + var r = { Header:{} }, header = xml.getElementsByTagName("Header")[0], t;
1028 + if (!header) header = xml.getElementsByTagName("a:Header")[0];
1029 + if (!header) return null;
1030 + for (var i = 0; i < header.childNodes.length; i++) {
1031 + var child = header.childNodes[i];
1032 + r.Header[child.localName] = child.textContent;
1033 + }
1034 + var body = xml.getElementsByTagName("Body")[0];
1035 + if (!body) body = xml.getElementsByTagName("a:Body")[0];
1036 + if (!body) return null;
1037 + if (body.childNodes.length > 0) {
1038 + t = body.childNodes[0].localName;
1039 + if (t.indexOf("_OUTPUT") == t.length - 7) { t = t.substring(0, t.length - 7); }
1040 + r.Header['Method'] = t;
1041 + r.Body = _ParseWsmanRec(body.childNodes[0]);
1042 + }
1043 + return r;
1044 + } catch (e) {
1045 + console.log("Unable to parse XML: " + xml);
1046 + return null;
1047 + }
1048 + }
1049 +
1050 + // Private method
1051 + function _ParseWsmanRec(node) {
1052 + var data, r = {};
1053 + for (var i = 0; i < node.childNodes.length; i++) {
1054 + var child = node.childNodes[i];
1055 + if (child.childElementCount == 0) { data = child.textContent; } else { data = _ParseWsmanRec(child); }
1056 + if (data == 'true') data = true; // Convert 'true' into true
1057 + if (data == 'false') data = false; // Convert 'false' into false
1058 +
1059 + var childObj = data;
1060 + if (child.attributes.length > 0) {
1061 + childObj = {'Value': data };
1062 + for(var j = 0; j < child.attributes.length; j++) {
1063 + childObj['@' + child.attributes[j].name] = child.attributes[j].value;
1064 + }
1065 + }
1066 +
1067 + if (r[child.localName] instanceof Array) { r[child.localName].push(childObj); }
1068 + else if (r[child.localName] == undefined) { r[child.localName] = childObj; }
1069 + else { r[child.localName] = [r[child.localName], childObj]; }
1070 + }
1071 + return r;
1072 + }
1073 +
1074 + function _PutObjToBodyXml(resuri, putObj) {
1075 + if(!resuri || putObj === undefined || putObj === null) return '';
1076 + var objname = obj.GetNameFromUrl(resuri);
1077 + var result = '<r:' + objname + ' xmlns:r="' + resuri + '">';
1078 +
1079 + for (var prop in putObj) {
1080 + if (!putObj.hasOwnProperty(prop) || prop.indexOf('__') === 0 || prop.indexOf('@') === 0) continue;
1081 + if (putObj[prop] === undefined || putObj[prop] === null || typeof putObj[prop] === 'function') continue;
1082 + if (typeof putObj[prop] === 'object' && putObj[prop]['ReferenceParameters']) {
1083 + result += '<r:' + prop + '><a:Address>' + putObj[prop].Address + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + putObj[prop]['ReferenceParameters']["ResourceURI"] + '</w:ResourceURI><w:SelectorSet>';
1084 + var selectorArray = putObj[prop]['ReferenceParameters']['SelectorSet']['Selector'];
1085 + if (Array.isArray(selectorArray)) {
1086 + for (var i=0; i< selectorArray.length; i++) {
1087 + result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
1088 + }
1089 + }
1090 + else {
1091 + result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
1092 + }
1093 + result += '</w:SelectorSet></a:ReferenceParameters></r:' + prop + '>';
1094 + }
1095 + else {
1096 + if (Array.isArray(putObj[prop])) {
1097 + for (var i = 0; i < putObj[prop].length; i++) {
1098 + result += '<r:' + prop + '>' + putObj[prop][i].toString() + '</r:' + prop + '>';
1099 + }
1100 + } else {
1101 + result += '<r:' + prop + '>' + putObj[prop].toString() + '</r:' + prop + '>';
1102 + }
1103 + }
1104 + }
1105 +
1106 + result += '</r:' + objname + '>';
1107 + return result;
1108 + }
1109 +
1110 + /*
1111 + convert
1112 + { @Name: 'InstanceID', @AttrName: 'Attribute Value'}
1113 + into
1114 + ' Name="InstanceID" AttrName="Attribute Value" '
1115 + */
1116 + function _ObjectToXmlAttributes(objWithAttributes) {
1117 + if(!objWithAttributes) return '';
1118 + var result = ' ';
1119 + for (var propName in objWithAttributes) {
1120 + if (!objWithAttributes.hasOwnProperty(propName) || propName.indexOf('@') !== 0) continue;
1121 + result += propName.substring(1) + '="' + objWithAttributes[propName] + '" ';
1122 + }
1123 + return result;
1124 + }
1125 +
1126 + function _PutObjToSelectorsXml(selectorSet) {
1127 + if (!selectorSet) return '';
1128 + if (typeof selectorSet == 'string') return selectorSet;
1129 + if (selectorSet['InstanceID']) return "<w:SelectorSet><w:Selector Name=\"InstanceID\">" + selectorSet['InstanceID'] + "</w:Selector></w:SelectorSet>";
1130 + var result = '<w:SelectorSet>';
1131 + for(var propName in selectorSet) {
1132 + if (!selectorSet.hasOwnProperty(propName)) continue;
1133 + result += '<w:Selector Name="' + propName + '">';
1134 + if (selectorSet[propName]['ReferenceParameters']) {
1135 + result += '<a:EndpointReference>';
1136 + result += '<a:Address>' + selectorSet[propName]['Address'] + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + selectorSet[propName]['ReferenceParameters']['ResourceURI'] + '</w:ResourceURI><w:SelectorSet>';
1137 + var selectorArray = selectorSet[propName]['ReferenceParameters']['SelectorSet']['Selector'];
1138 + if (Array.isArray(selectorArray)) {
1139 + for (var i = 0; i < selectorArray.length; i++) {
1140 + result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
1141 + }
1142 + }
1143 + else {
1144 + result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
1145 + }
1146 + result += '</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>';
1147 + } else {
1148 + result += selectorSet[propName];
1149 + }
1150 + result += '</w:Selector>';
1151 + }
1152 + result += '</w:SelectorSet>';
1153 + return result;
1154 + }
1155 +
1156 + function _turnToXml(text) {
1157 + if (window.DOMParser) {
1158 + return new DOMParser().parseFromString(text, "text/xml");
1159 + }
1160 + else // Internet Explorer
1161 + {
1162 + var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
1163 + xmlDoc.async = false;
1164 + xmlDoc.loadXML(text);
1165 + return xmlDoc;
1166 + }
1167 + }
1168 +
1169 + return obj;
1170 +}
1171 +/**
1172 +* @description Remote Desktop
1173 +* @author Ylian Saint-Hilaire
1174 +* @version v0.0.2g
1175 +*/
1176 +
1177 +// Construct a MeshServer object
1178 +var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
1179 + var obj = {};
1180 + obj.canvasid = divid;
1181 + obj.CanvasId = Q(divid);
1182 + obj.scrolldiv = scrolldiv;
1183 + obj.canvas = Q(divid).getContext("2d");
1184 + obj.protocol = 2; // KVM
1185 + obj.state = 0;
1186 + obj.acc = "";
1187 + obj.ScreenWidth = 960;
1188 + obj.ScreenHeight = 700;
1189 + obj.width = 0;
1190 + obj.height = 0;
1191 + obj.rwidth = 0;
1192 + obj.rheight = 0;
1193 + obj.bpp = 2; // Bytes per pixel (1 or 2 supported)
1194 + obj.useZRLE = true;
1195 + obj.showmouse = true;
1196 + obj.buttonmask = 0;
1197 + obj.localKeyMap = true;
1198 + //obj.inbytes = 0;
1199 + //obj.outbytes = 0;
1200 + obj.spare = null;
1201 + obj.sparew = 0;
1202 + obj.spareh = 0;
1203 + obj.sparew2 = 0;
1204 + obj.spareh2 = 0;
1205 + obj.sparecache = {};
1206 + obj.ZRLEfirst = 1;
1207 + obj.onScreenSizeChange = null;
1208 + obj.frameRateDelay = 0;
1209 + // ###BEGIN###{DesktopInband}
1210 + obj.kvmDataSupported = false;
1211 + obj.onKvmData = null;
1212 + obj.onKvmDataPending = [];
1213 + obj.onKvmDataAck = -1;
1214 + obj.holding = false;
1215 + obj.lastKeepAlive = Date.now();
1216 + // ###END###{DesktopInband}
1217 +
1218 +
1219 + // Private method
1220 + obj.Debug = function (msg) { console.log(msg); }
1221 +
1222 + obj.xxStateChange = function (newstate) {
1223 + if (newstate == 0) {
1224 + obj.canvas.fillStyle = '#000000';
1225 + obj.canvas.fillRect(0, 0, obj.width, obj.height);
1226 + obj.canvas.canvas.width = obj.rwidth = obj.width = 640;
1227 + obj.canvas.canvas.height = obj.rheight = obj.height = 400;
1228 + QS(obj.canvasid).cursor = 'default';
1229 + } else {
1230 + QS(obj.canvasid).cursor = obj.showmouse ?'default':'none';
1231 + }
1232 + }
1233 +
1234 + obj.ProcessData = function (data) {
1235 + if (!data) return;
1236 + // obj.Debug("KRecv(" + data.length + "): " + rstr2hex(data));
1237 + //obj.inbytes += data.length;
1238 + //obj.Debug("KRecv(" + obj.inbytes + ")");
1239 + obj.acc += data;
1240 + while (obj.acc.length > 0) {
1241 + //obj.Debug("KAcc(" + obj.acc.length + "): " + rstr2hex(obj.acc));
1242 + var cmdsize = 0;
1243 + if (obj.state == 0 && obj.acc.length >= 12) {
1244 + // Getting handshake & version
1245 + cmdsize = 12;
1246 + //if (obj.acc.substring(0, 4) != "RFB ") { return obj.Stop(); }
1247 + //var version = parseFloat(obj.acc.substring(4, 11));
1248 + //obj.Debug("KVersion: " + version);
1249 + obj.state = 1;
1250 + obj.send("RFB 003.008\n");
1251 + }
1252 + else if (obj.state == 1 && obj.acc.length >= 1) {
1253 + // Getting security options
1254 + cmdsize = obj.acc.charCodeAt(0) + 1;
1255 + obj.send(String.fromCharCode(1)); // Send the "None" security type. Since we already authenticated using redirection digest auth, we don't need to do this again.
1256 + obj.state = 2;
1257 + }
1258 + else if (obj.state == 2 && obj.acc.length >= 4) {
1259 + // Getting security response
1260 + cmdsize = 4;
1261 + if (ReadInt(obj.acc, 0) != 0) { return obj.Stop(); }
1262 + obj.send(String.fromCharCode(1)); // Send share desktop flag
1263 + obj.state = 3;
1264 + }
1265 + else if (obj.state == 3 && obj.acc.length >= 24) {
1266 + // Getting server init
1267 + var namelen = ReadInt(obj.acc, 20);
1268 + if (obj.acc.length < 24 + namelen) return;
1269 + cmdsize = 24 + namelen;
1270 + obj.canvas.canvas.width = obj.rwidth = obj.width = obj.ScreenWidth = ReadShort(obj.acc, 0);
1271 + obj.canvas.canvas.height = obj.rheight = obj.height = obj.ScreenHeight = ReadShort(obj.acc, 2);
1272 +
1273 + // These are all values we don't really need, we are going to only run in RGB565 or RGB332 and not use the flexibility provided by these settings.
1274 + // Makes the javascript code smaller and maybe a bit faster.
1275 + /*
1276 + obj.xbpp = obj.acc.charCodeAt(4);
1277 + obj.depth = obj.acc.charCodeAt(5);
1278 + obj.bigend = obj.acc.charCodeAt(6);
1279 + obj.truecolor = obj.acc.charCodeAt(7);
1280 + obj.rmax = ReadShort(obj.acc, 8);
1281 + obj.gmax = ReadShort(obj.acc, 10);
1282 + obj.bmax = ReadShort(obj.acc, 12);
1283 + obj.rsh = obj.acc.charCodeAt(14);
1284 + obj.gsh = obj.acc.charCodeAt(15);
1285 + obj.bsh = obj.acc.charCodeAt(16);
1286 + var name = obj.acc.substring(24, 24 + namelen);
1287 + obj.Debug("name: " + name);
1288 + obj.Debug("width: " + obj.width + ", height: " + obj.height);
1289 + obj.Debug("bits-per-pixel: " + obj.xbpp);
1290 + obj.Debug("depth: " + obj.depth);
1291 + obj.Debug("big-endian-flag: " + obj.bigend);
1292 + obj.Debug("true-colour-flag: " + obj.truecolor);
1293 + obj.Debug("rgb max: " + obj.rmax + "," + obj.gmax + "," + obj.bmax);
1294 + obj.Debug("rgb shift: " + obj.rsh + "," + obj.gsh + "," + obj.bsh);
1295 + */
1296 +
1297 + // SetEncodings, with AMT we can't omit RAW, must be specified.
1298 + // Intel AMT supports encodings: RAW (0), ZRLE (16), Desktop Size (0xFFFFFF21, -223)
1299 +
1300 + var supportedEncodings = '';
1301 + if (obj.useZRLE) supportedEncodings += IntToStr(16);
1302 + supportedEncodings += IntToStr(0);
1303 + // ###BEGIN###{DesktopInband}
1304 + supportedEncodings += IntToStr(1092);
1305 + // ###END###{DesktopInband}
1306 +
1307 + obj.send(String.fromCharCode(2, 0) + ShortToStr((supportedEncodings.length / 4) + 1) + supportedEncodings + IntToStr(-223)); // Supported Encodings + Desktop Size
1308 +
1309 + // Set the pixel encoding to something much smaller
1310 + // obj.send(String.fromCharCode(0, 0, 0, 0, 16, 16, 0, 1) + ShortToStr(31) + ShortToStr(63) + ShortToStr(31) + String.fromCharCode(11, 5, 0, 0, 0, 0)); // Setup 16 bit color RGB565 (This is the default, so we don't need to set it)
1311 + if (obj.bpp == 1) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(7) + ShortToStr(7) + ShortToStr(3) + String.fromCharCode(5, 2, 0, 0, 0, 0)); // Setup 8 bit color RGB332
1312 +
1313 + obj.state = 4;
1314 + obj.parent.xxStateChange(3);
1315 + _SendRefresh();
1316 + //obj.timer = setInterval(obj.xxOnTimer, 50);
1317 +
1318 +
1319 + if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
1320 + }
1321 + else if (obj.state == 4) {
1322 + switch (obj.acc.charCodeAt(0)) {
1323 + case 0: // FramebufferUpdate
1324 + if (obj.acc.length < 4) return;
1325 + obj.state = 100 + ReadShort(obj.acc, 2); // Read the number of tiles that are going to be sent, add 100 and use that as our protocol state.
1326 + cmdsize = 4;
1327 + break;
1328 + case 2: // This is the bell, do nothing.
1329 + cmdsize = 1;
1330 + break;
1331 + case 3: // This is ServerCutText
1332 + if (obj.acc.length < 8) return;
1333 + var len = ReadInt(obj.acc, 4) + 8;
1334 + if (obj.acc.length < len) return;
1335 + cmdsize = handleServerCutText(obj.acc);
1336 + break;
1337 + }
1338 + }
1339 + else if (obj.state > 100 && obj.acc.length >= 12) {
1340 + var x = ReadShort(obj.acc, 0),
1341 + y = ReadShort(obj.acc, 2),
1342 + width = ReadShort(obj.acc, 4),
1343 + height = ReadShort(obj.acc, 6),
1344 + s = width * height,
1345 + encoding = ReadInt(obj.acc, 8);
1346 +
1347 + if (encoding < 17) {
1348 + if (width < 1 || width > 64 || height < 1 || height > 64) { console.log("Invalid tile size (" + width + "," + height + "), disconnecting."); return obj.Stop(); }
1349 +
1350 + // Set the spare bitmap to the rigth size if it's not already. This allows us to recycle the spare most if not all the time.
1351 + if (obj.sparew != width || obj.spareh != height) {
1352 + obj.sparew = obj.sparew2 = width;
1353 + obj.spareh = obj.spareh2 = height;
1354 + var xspacecachename = obj.sparew2 + 'x' + obj.spareh2;
1355 + obj.spare = obj.sparecache[xspacecachename];
1356 + if (!obj.spare) { obj.sparecache[xspacecachename] = obj.spare = obj.canvas.createImageData(obj.sparew2, obj.spareh2); }
1357 + }
1358 +
1359 + }
1360 +
1361 + if (encoding == 0xFFFFFF21) {
1362 + // Desktop Size (0xFFFFFF21, -223)
1363 + obj.canvas.canvas.width = obj.rwidth = obj.width = width;
1364 + obj.canvas.canvas.height = obj.rheight = obj.height = height;
1365 + obj.send(String.fromCharCode(3, 0, 0, 0, 0, 0) + ShortToStr(obj.width) + ShortToStr(obj.height)); // FramebufferUpdateRequest
1366 + cmdsize = 12;
1367 + if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
1368 + // obj.Debug("New desktop width: " + obj.width + ", height: " + obj.height);
1369 + }
1370 + else if (encoding == 0) {
1371 + // RAW encoding
1372 + var ptr = 12, cs = 12 + (s * obj.bpp);
1373 + if (obj.acc.length < cs) return; // Check we have all the data needed and we can only draw 64x64 tiles.
1374 + cmdsize = cs;
1375 +
1376 + // CRITICAL LOOP, optimize this as much as possible
1377 + for (var i = 0; i < s; i++) { _setPixel(obj.acc.charCodeAt(ptr++) + ((obj.bpp == 2) ? (obj.acc.charCodeAt(ptr++) << 8) : 0), i); }
1378 + _putImage(obj.spare, x, y);
1379 + }
1380 + else if (encoding == 16) {
1381 + // ZRLE encoding
1382 + if (obj.acc.length < 16) return;
1383 + var datalen = ReadInt(obj.acc, 12);
1384 + if (obj.acc.length < (16 + datalen)) return;
1385 + //obj.Debug("RECT ZRLE (" + x + "," + y + "," + width + "," + height + ") LEN = " + datalen);
1386 + //obj.Debug("RECT ZRLE LEN: " + ReadShortX(obj.acc, 17) + ", DATA: " + rstr2hex(obj.acc.substring(16)));
1387 +
1388 + // Process the ZLib header if this is the first block
1389 + var ptr = 16, delta = 5, dx = 0;
1390 +
1391 + if (datalen > 5 && obj.acc.charCodeAt(ptr) == 0 && ReadShortX(obj.acc, ptr + 1) == (datalen - delta)) {
1392 + // This is an uncompressed ZLib data block
1393 + _decodeLRE(obj.acc, ptr + 5, x, y, width, height, s, datalen);
1394 + }
1395 +
1396 + cmdsize = 16 + datalen;
1397 + }
1398 + else {
1399 + obj.Debug("Unknown Encoding: " + encoding);
1400 + return obj.Stop();
1401 + }
1402 + if (--obj.state == 100) {
1403 + obj.state = 4;
1404 + if (obj.frameRateDelay == 0) {
1405 + _SendRefresh(); // Ask for new frame
1406 + } else {
1407 + setTimeout(_SendRefresh, obj.frameRateDelay); // Hold x miliseconds before asking for a new frame
1408 + }
1409 + }
1410 + }
1411 +
1412 + if (cmdsize == 0) return;
1413 + obj.acc = obj.acc.substring(cmdsize);
1414 + }
1415 + }
1416 +
1417 + function _decodeLRE(data, ptr, x, y, width, height, s, datalen) {
1418 + var subencoding = data.charCodeAt(ptr++), index, v, runlengthdecode, palette = {}, rlecount = 0, runlength = 0, i;
1419 + // obj.Debug("RECT RLE (" + (datalen - 5) + ", " + subencoding + "):" + rstr2hex(data.substring(21, 21 + (datalen - 5))));
1420 + if (subencoding == 0) {
1421 + // RAW encoding
1422 + for (i = 0; i < s; i++) { _setPixel(data.charCodeAt(ptr++) + ((obj.bpp == 2) ? (data.charCodeAt(ptr++) << 8) : 0), i); }
1423 + _putImage(obj.spare, x, y);
1424 + }
1425 + else if (subencoding == 1) {
1426 + // Solid color tile
1427 + v = data.charCodeAt(ptr++) + ((obj.bpp == 2) ? (data.charCodeAt(ptr++) << 8) : 0);
1428 + obj.canvas.fillStyle = 'rgb(' + ((obj.bpp == 1) ? ((v & 224) + ',' + ((v & 28) << 3) + ',' + _fixColor((v & 3) << 6)) : (((v >> 8) & 248) + ',' + ((v >> 3) & 252) + ',' + ((v & 31) << 3))) + ')';
1429 +
1430 +
1431 + obj.canvas.fillRect(x, y, width, height);
1432 + }
1433 + else if (subencoding > 1 && subencoding < 17) { // Packed palette encoded tile
1434 + // Read the palette
1435 + var br = 4, bm = 15; // br is BitRead and bm is BitMask. By adjusting these two we can support all the variations in this encoding.
1436 + for (i = 0; i < subencoding; i++) { palette[i] = data.charCodeAt(ptr++) + ((obj.bpp == 2) ? (data.charCodeAt(ptr++) << 8) : 0); }
1437 +
1438 + // Compute bits to read & bit mark
1439 + if (subencoding == 2) { br = 1; bm = 1; } else if (subencoding <= 4) { br = 2; bm = 3; }
1440 +
1441 + // Display all the bits
1442 + while (rlecount < s && ptr < data.length) { v = data.charCodeAt(ptr++); for (i = (8 - br) ; i >= 0; i -= br) { _setPixel(palette[(v >> i) & bm], rlecount++); } }
1443 + _putImage(obj.spare, x, y);
1444 + }
1445 + else if (subencoding == 128) { // RLE encoded tile
1446 + while (rlecount < s && ptr < data.length) {
1447 + // Get the run color
1448 + v = data.charCodeAt(ptr++) + ((obj.bpp == 2) ? (data.charCodeAt(ptr++) << 8) : 0);
1449 +
1450 + // Decode the run length. This is the fastest and most compact way I found to do this.
1451 + runlength = 1; do { runlength += (runlengthdecode = data.charCodeAt(ptr++)); } while (runlengthdecode == 255);
1452 +
1453 + // Draw a run
1454 + while (--runlength >= 0) { _setPixel(v, rlecount++); }
1455 + }
1456 + _putImage(obj.spare, x, y);
1457 + }
1458 + else if (subencoding > 129) { // Palette RLE encoded tile
1459 + // Read the palette
1460 + for (i = 0; i < (subencoding - 128) ; i++) { palette[i] = data.charCodeAt(ptr++) + ((obj.bpp == 2) ? (data.charCodeAt(ptr++) << 8) : 0); }
1461 +
1462 + // Decode RLE on palette
1463 + while (rlecount < s && ptr < data.length) {
1464 + // Setup the run, get the color index and get the color from the palette.
1465 + runlength = 1; index = data.charCodeAt(ptr++); v = palette[index % 128];
1466 +
1467 + // If the index starts with high order bit 1, this is a run and decode the run length.
1468 + if (index > 127) { do { runlength += (runlengthdecode = data.charCodeAt(ptr++)); } while (runlengthdecode == 255); }
1469 +
1470 + // Draw a run
1471 + while (--runlength >= 0) { _setPixel(v, rlecount++); }
1472 + }
1473 + _putImage(obj.spare, x, y);
1474 + }
1475 + }
1476 +
1477 + // ###BEGIN###{DesktopInband}
1478 + obj.hold = function (holding) {
1479 + if (obj.holding == holding) return;
1480 + obj.holding = holding;
1481 + obj.canvas.fillStyle = '#000000';
1482 + obj.canvas.fillRect(0, 0, obj.width, obj.height); // Paint black
1483 + if (obj.holding == false) {
1484 + // Go back to normal operations
1485 + // Set canvas size and ask for full screen refresh
1486 + if ((obj.canvas.canvas.width != obj.width) || (obj.canvas.canvas.height != obj.height)) {
1487 + obj.canvas.canvas.width = obj.width; obj.canvas.canvas.height = obj.height;
1488 + if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); } // ???
1489 + }
1490 + obj.Send(String.fromCharCode(3, 0, 0, 0, 0, 0) + ShortToStr(obj.width) + ShortToStr(obj.height)); // FramebufferUpdateRequest
1491 + } else {
1492 + obj.UnGrabMouseInput();
1493 + obj.UnGrabKeyInput();
1494 + }
1495 + }
1496 + // ###END###{DesktopInband}
1497 +
1498 + function _putImage(i, x, y) {
1499 + // ###BEGIN###{DesktopInband}
1500 + if (obj.holding == true) return;
1501 + // ###END###{DesktopInband}
1502 + obj.canvas.putImageData(i, x, y);
1503 + }
1504 +
1505 + function _setPixel(v, p) {
1506 + var pp = p * 4;
1507 +
1508 +
1509 + if (obj.bpp == 1) {
1510 + // Set 8bit color RGB332
1511 + obj.spare.data[pp++] = v & 224;
1512 + obj.spare.data[pp++] = (v & 28) << 3;
1513 + obj.spare.data[pp++] = _fixColor((v & 3) << 6);
1514 + } else {
1515 + // Set 16bit color RGB565
1516 + obj.spare.data[pp++] = (v >> 8) & 248;
1517 + obj.spare.data[pp++] = (v >> 3) & 252;
1518 + obj.spare.data[pp++] = (v & 31) << 3;
1519 + }
1520 + obj.spare.data[pp] = 0xFF; // Set alpha channel to opaque.
1521 + }
1522 +
1523 +
1524 + function _fixColor(c) { return (c > 127) ? (c + 32) : c; }
1525 +
1526 + function _SendRefresh() {
1527 + // ###BEGIN###{DesktopInband}
1528 + if (obj.holding == true) return;
1529 + // ###END###{DesktopInband}
1530 + // Request the entire screen
1531 + obj.send(String.fromCharCode(3, 1, 0, 0, 0, 0) + ShortToStr(obj.rwidth) + ShortToStr(obj.rheight)); // FramebufferUpdateRequest
1532 + }
1533 +
1534 + obj.Start = function () {
1535 + //obj.Debug("KVM-Start");
1536 + obj.state = 0;
1537 + obj.acc = "";
1538 + obj.ZRLEfirst = 1;
1539 + //obj.inbytes = 0;
1540 + //obj.outbytes = 0;
1541 + // ###BEGIN###{DesktopInband}
1542 + obj.onKvmDataPending = [];
1543 + obj.onKvmDataAck = -1;
1544 + obj.kvmDataSupported = false;
1545 + // ###END###{DesktopInband}
1546 + for (var i in obj.sparecache) { delete obj.sparecache[i]; }
1547 + }
1548 +
1549 + obj.Stop = function () {
1550 + obj.UnGrabMouseInput();
1551 + obj.UnGrabKeyInput();
1552 + obj.parent.Stop();
1553 + }
1554 +
1555 + obj.send = function (x) {
1556 + //obj.Debug("KSend(" + x.length + "): " + rstr2hex(x));
1557 + //obj.outbytes += x.length;
1558 + obj.parent.send(x);
1559 + }
1560 +
1561 + var convertAmtKeyCodeTable = {
1562 + "Pause": 19,
1563 + "CapsLock": 20,
1564 + "Space": 32,
1565 + "Quote": 39,
1566 + "Minus": 45,
1567 + "NumpadMultiply": 42,
1568 + "NumpadAdd": 43,
1569 + "PrintScreen": 44,
1570 + "Comma": 44,
1571 + "NumpadSubtract": 45,
1572 + "NumpadDecimal": 46,
1573 + "Period": 46,
1574 + "Slash": 47,
1575 + "NumpadDivide": 47,
1576 + "Semicolon": 59,
1577 + "Equal": 61,
1578 + "OSLeft": 91,
1579 + "BracketLeft": 91,
1580 + "OSRight": 91,
1581 + "Backslash": 92,
1582 + "BracketRight": 93,
1583 + "ContextMenu": 93,
1584 + "Backquote": 96,
1585 + "NumLock": 144,
1586 + "ScrollLock": 145,
1587 + "Backspace": 0xff08,
1588 + "Tab": 0xff09,
1589 + "Enter": 0xff0d,
1590 + "NumpadEnter": 0xff0d,
1591 + "Escape": 0xff1b,
1592 + "Delete": 0xffff,
1593 + "Home": 0xff50,
1594 + "PageUp": 0xff55,
1595 + "PageDown": 0xff56,
1596 + "ArrowLeft": 0xff51,
1597 + "ArrowUp": 0xff52,
1598 + "ArrowRight": 0xff53,
1599 + "ArrowDown": 0xff54,
1600 + "End": 0xff57,
1601 + "Insert": 0xff63,
1602 + "F1": 0xffbe,
1603 + "F2": 0xffbf,
1604 + "F3": 0xffc0,
1605 + "F4": 0xffc1,
1606 + "F5": 0xffc2,
1607 + "F6": 0xffc3,
1608 + "F7": 0xffc4,
1609 + "F8": 0xffc5,
1610 + "F9": 0xffc6,
1611 + "F10": 0xffc7,
1612 + "F11": 0xffc8,
1613 + "F12": 0xffc9,
1614 + "ShiftLeft": 0xffe1,
1615 + "ShiftRight": 0xffe2,
1616 + "ControlLeft": 0xffe3,
1617 + "ControlRight": 0xffe4,
1618 + "AltLeft": 0xffe9,
1619 + "AltRight": 0xffea,
1620 + "MetaLeft": 0xffe7,
1621 + "MetaRight": 0xffe8
1622 + }
1623 + function convertAmtKeyCode(e) {
1624 + if (e.code.startsWith('Key') && e.code.length == 4) { return e.code.charCodeAt(3) + ((e.shiftKey == false) ? 32 : 0); }
1625 + if (e.code.startsWith('Digit') && e.code.length == 6) { return e.code.charCodeAt(5); }
1626 + if (e.code.startsWith('Numpad') && e.code.length == 7) { return e.code.charCodeAt(6); }
1627 + return convertAmtKeyCodeTable[e.code];
1628 + }
1629 +
1630 + /*
1631 + Intel AMT only recognizes a small subset of keysym characters defined in the keysymdef.h so you don�t need to
1632 + implement all the languages (this is taken care by the USB Scancode Extension in RFB4.0 protocol).
1633 + The only subset recognized by the FW is the defined by the following sets : XK_LATIN1 , XK_MISCELLANY, XK_3270, XK_XKB_KEYS, XK_KATAKANA.
1634 + In addition to keysymdef.h symbols there are 6 japanese extra keys that we do support:
1635 +
1636 + #define XK_Intel_EU_102kbd_backslash_pipe_45 0x17170056 // European 102-key: 45 (backslash/pipe), usb Usage: 0x64
1637 + #define XK_Intel_JP_106kbd_yen_pipe 0x1717007d // Japanese 106-key: 14 (Yen/pipe), usb Usage: 0x89
1638 + #define XK_Intel_JP_106kbd_backslash_underbar 0x17170073 // Japanese 106-key: 56 (backslash/underbar), usb Usage: 0x87
1639 + #define XK_Intel_JP_106kbd_NoConvert 0x1717007b // Japanese 106-key: 131 (NoConvert), usb Usage: 0x8b
1640 + #define XK_Intel_JP_106kbd_Convert 0x17170079 // Japanese 106-key: 132 (Convert), usb Usage: 0x8a
1641 + #define XK_Intel_JP_106kbd_Hirigana_Katakana 0x17170070 // Japanese 106-key: 133 (Hirigana/Katakana), usb Usage: 0x88
1642 + */
1643 +
1644 + function _keyevent(d, e) {
1645 + if (!e) { e = window.event; }
1646 +
1647 + if (e.code && (obj.localKeyMap == false)) {
1648 + // For new browsers, this mapping is keyboard language independent
1649 + var k = convertAmtKeyCode(e);
1650 + if (k != null) { obj.sendkey(k, d); }
1651 + } else {
1652 + // For older browsers, this mapping works best for EN-US keyboard
1653 + var k = e.keyCode, kk = k;
1654 + if (e.shiftKey == false && k >= 65 && k <= 90) kk = k + 32;
1655 + if (k >= 112 && k <= 124) kk = k + 0xFF4E;
1656 + if (k == 8) kk = 0xff08; // Backspace
1657 + if (k == 9) kk = 0xff09; // Tab
1658 + if (k == 13) kk = 0xff0d; // Return
1659 + if (k == 16) kk = 0xffe1; // Shift (Left)
1660 + if (k == 17) kk = 0xffe3; // Ctrl (Left)
1661 + if (k == 18) kk = 0xffe9; // Alt (Left)
1662 + if (k == 27) kk = 0xff1b; // ESC
1663 + if (k == 33) kk = 0xff55; // PageUp
1664 + if (k == 34) kk = 0xff56; // PageDown
1665 + if (k == 35) kk = 0xff57; // End
1666 + if (k == 36) kk = 0xff50; // Home
1667 + if (k == 37) kk = 0xff51; // Left
1668 + if (k == 38) kk = 0xff52; // Up
1669 + if (k == 39) kk = 0xff53; // Right
1670 + if (k == 40) kk = 0xff54; // Down
1671 + if (k == 45) kk = 0xff63; // Insert
1672 + if (k == 46) kk = 0xffff; // Delete
1673 + if (k >= 96 && k <= 105) kk = k - 48; // Key pad numbers
1674 + if (k == 106) kk = 42; // Pad *
1675 + if (k == 107) kk = 43; // Pad +
1676 + if (k == 109) kk = 45; // Pad -
1677 + if (k == 110) kk = 46; // Pad .
1678 + if (k == 111) kk = 47; // Pad /
1679 + if (k == 186) kk = 59; // ;
1680 + if (k == 187) kk = 61; // =
1681 + if (k == 188) kk = 44; // ,
1682 + if (k == 189) kk = 45; // -
1683 + if (k == 190) kk = 46; // .
1684 + if (k == 191) kk = 47; // /
1685 + if (k == 192) kk = 96; // `
1686 + if (k == 219) kk = 91; // [
1687 + if (k == 220) kk = 92; // \
1688 + if (k == 221) kk = 93; // ]t
1689 + if (k == 222) kk = 39; // '
1690 + //console.log('Key' + d + ": " + k + " = " + kk);
1691 + obj.sendkey(kk, d);
1692 + }
1693 + return obj.haltEvent(e);
1694 + }
1695 +
1696 + obj.sendkey = function (k, d) {
1697 + if (typeof k == 'object') { for (var i in k) { obj.sendkey(k[i][0], k[i][1]); } }
1698 + else { obj.send(String.fromCharCode(4, d, 0, 0) + IntToStr(k)); }
1699 + }
1700 +
1701 + function handleServerCutText(acc) {
1702 + if (acc.length < 8) return 0;
1703 + var len = ReadInt(obj.acc, 4) + 8;
1704 + if (acc.length < len) return 0;
1705 + // ###BEGIN###{DesktopInband}
1706 + if (obj.onKvmData != null) {
1707 + var d = acc.substring(8, len);
1708 + if ((d.length >= 16) && (d.substring(0, 15) == '\0KvmDataChannel')) {
1709 + if (obj.kvmDataSupported == false) { obj.kvmDataSupported = true; console.log('KVM Data Channel Supported.'); }
1710 + if (((obj.onKvmDataAck == -1) && (d.length == 16)) || (d.charCodeAt(15) != 0)) { obj.onKvmDataAck = true; }
1711 + //if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-Recv(' + (d.length - 16) + '): ' + d.substring(16)); }
1712 + if (d.length >= 16) { obj.onKvmData(d.substring(16)); } // Event the data and ack
1713 + if ((obj.onKvmDataAck == true) && (obj.onKvmDataPending.length > 0)) { obj.sendKvmData(obj.onKvmDataPending.shift()); } // Send pending data
1714 + }
1715 + }
1716 + // ###END###{DesktopInband}
1717 + return len;
1718 + }
1719 +
1720 + // ###BEGIN###{DesktopInband}
1721 + obj.sendKvmData = function (x) {
1722 + if (obj.onKvmDataAck !== true) {
1723 + obj.onKvmDataPending.push(x);
1724 + } else {
1725 + //if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-Send(' + x.length + '): ' + x); }
1726 + x = '\0KvmDataChannel\0' + x;
1727 + obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(x.length) + x);
1728 + obj.onKvmDataAck = false;
1729 + }
1730 + }
1731 +
1732 + // Send a HWKVM keep alive if it's not been sent in the last 5 seconds.
1733 + obj.sendKeepAlive = function () {
1734 + if (obj.lastKeepAlive < Date.now() - 5000) { obj.lastKeepAlive = Date.now(); obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(16) + '\0KvmDataChannel\0'); }
1735 + }
1736 + // ###END###{DesktopInband}
1737 +
1738 + obj.SendCtrlAltDelMsg = function () { obj.sendcad(); }
1739 + obj.sendcad = function () { obj.sendkey([[0xFFE3, 1], [0xFFE9, 1], [0xFFFF, 1], [0xFFFF, 0], [0xFFE9, 0], [0xFFE3, 0]]); } // Control down, Alt down, Delete down, Delete up , Alt up , Control up
1740 +
1741 + var _MouseInputGrab = false;
1742 + var _KeyInputGrab = false;
1743 +
1744 + obj.GrabMouseInput = function () {
1745 + if (_MouseInputGrab == true) return;
1746 + var c = obj.canvas.canvas;
1747 + c.onmouseup = obj.mouseup;
1748 + c.onmousedown = obj.mousedown;
1749 + c.onmousemove = obj.mousemove;
1750 + //if (navigator.userAgent.match(/mozilla/i)) c.DOMMouseScroll = obj.xxDOMMouseScroll; else c.onmousewheel = obj.xxMouseWheel;
1751 + _MouseInputGrab = true;
1752 + }
1753 +
1754 + obj.UnGrabMouseInput = function () {
1755 + if (_MouseInputGrab == false) return;
1756 + var c = obj.canvas.canvas;
1757 + c.onmousemove = null;
1758 + c.onmouseup = null;
1759 + c.onmousedown = null;
1760 + //if (navigator.userAgent.match(/mozilla/i)) c.DOMMouseScroll = null; else c.onmousewheel = null;
1761 + _MouseInputGrab = false;
1762 + }
1763 +
1764 + obj.GrabKeyInput = function () {
1765 + if (_KeyInputGrab == true) return;
1766 + document.onkeyup = obj.handleKeyUp;
1767 + document.onkeydown = obj.handleKeyDown;
1768 + document.onkeypress = obj.handleKeys;
1769 + _KeyInputGrab = true;
1770 + }
1771 +
1772 + obj.UnGrabKeyInput = function () {
1773 + if (_KeyInputGrab == false) return;
1774 + document.onkeyup = null;
1775 + document.onkeydown = null;
1776 + document.onkeypress = null;
1777 + _KeyInputGrab = false;
1778 + }
1779 +
1780 + obj.handleKeys = function (e) { return obj.haltEvent(e); }
1781 + obj.handleKeyUp = function (e) { return _keyevent(0, e); }
1782 + obj.handleKeyDown = function (e) { return _keyevent(1, e); }
1783 + obj.haltEvent = function (e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
1784 +
1785 + // RFB "PointerEvent" and mouse handlers
1786 + obj.mousedblclick = function (e) { }
1787 + obj.mousedown = function (e) { obj.buttonmask |= (1 << e.button); return obj.mousemove(e); }
1788 + obj.mouseup = function (e) { obj.buttonmask &= (0xFFFF - (1 << e.button)); return obj.mousemove(e); }
1789 + obj.mousemove = function (e) {
1790 + if (obj.state != 4) return true;
1791 + var pos = obj.getPositionOfControl(Q(obj.canvasid));
1792 + obj.mx = (e.pageX - pos[0]) * (obj.canvas.canvas.height / Q(obj.canvasid).offsetHeight);
1793 + obj.my = ((e.pageY - pos[1] + (scrolldiv ? scrolldiv.scrollTop : 0)) * (obj.canvas.canvas.width / Q(obj.canvasid).offsetWidth));
1794 +
1795 +
1796 + obj.send(String.fromCharCode(5, obj.buttonmask) + ShortToStr(obj.mx) + ShortToStr(obj.my));
1797 +
1798 +
1799 + return obj.haltEvent(e);
1800 + }
1801 +
1802 + obj.getPositionOfControl = function (Control) {
1803 + var Position = Array(2);
1804 + Position[0] = Position[1] = 0;
1805 + while (Control) {
1806 + Position[0] += Control.offsetLeft;
1807 + Position[1] += Control.offsetTop;
1808 + Control = Control.offsetParent;
1809 + }
1810 + return Position;
1811 + }
1812 +
1813 + return obj;
1814 +}
1815 +/**
1816 +* @description Remote Terminal
1817 +* @author Ylian Saint-Hilaire
1818 +* @version v0.0.2c
1819 +*/
1820 +
1821 +// Construct a MeshServer object
1822 +var CreateAmtRemoteTerminal = function (divid) {
1823 + var obj = {};
1824 + obj.DivId = divid;
1825 + obj.DivElement = document.getElementById(divid);
1826 + obj.protocol = 1; // SOL
1827 + obj.fxEmulation = 0;
1828 + obj.lineFeed = '\r\n';
1829 + obj.debugmode = 0;
1830 +
1831 + obj.width = 80; // 80 or 100
1832 + obj.height = 25; // 25 or 30
1833 +
1834 + var _Terminal_CellHeight = 21;
1835 + var _Terminal_CellWidth = 13;
1836 + var _TermColors = ['000000', 'BB0000', '00BB00', 'BBBB00', '0000BB', 'BB00BB', '00BBBB', 'BBBBBB', '555555', 'FF5555', '55FF55', 'FFFF55', '5555FF', 'FF55FF', '55FFFF', 'FFFFFF'];
1837 + var _TermCurrentReverse = 0;
1838 + var _TermCurrentFColor = 7;
1839 + var _TermCurrentBColor = 0;
1840 + var _TermLineWrap = true;
1841 + var _termx = 0;
1842 + var _termy = 0;
1843 + var _termstate = 0;
1844 + var _escNumber = [];
1845 + var _escNumberPtr = 0;
1846 + var _scratt = [];
1847 + var _tscreen = [];
1848 + var _VTUNDERLINE = 1;
1849 + var _VTREVERSE = 2;
1850 +
1851 + obj.Start = function () { }
1852 +
1853 + obj.Init = function (width, height) {
1854 + obj.width = width ? width : 80;
1855 + obj.height = height ? height : 25;
1856 + for (var y = 0; y < obj.height; y++) {
1857 + _tscreen[y] = [];
1858 + _scratt[y] = [];
1859 + for (var x = 0; x < obj.width; x++) { _tscreen[y][x] = ' '; _scratt[y][x] = (7 << 6); }
1860 + }
1861 + obj.TermInit();
1862 + obj.TermDraw();
1863 + }
1864 +
1865 + obj.xxStateChange = function(newstate) { }
1866 +
1867 + obj.ProcessData = function (str) {
1868 + if (obj.debugmode == 2) { console.log("TRecv(" + str.length + "): " + rstr2hex(str)); }
1869 + if (obj.capture != null) obj.capture += str; _ProcessVt100EscString(str); obj.TermDraw();
1870 + }
1871 +
1872 + function _ProcessVt100EscString(str) { for (var i = 0; i < str.length; i++) _ProcessVt100EscChar(String.fromCharCode(str.charCodeAt(i)), str.charCodeAt(i)); }
1873 +
1874 + function _ProcessVt100EscChar(b, c) {
1875 + switch (_termstate) {
1876 + case 0: // Normal Term State
1877 + switch (c) {
1878 + case 27: // ESC
1879 + _termstate = 1;
1880 + break;
1881 + default:
1882 + // Process a single char
1883 + _ProcessVt100Char(b);
1884 + break;
1885 + }
1886 + break;
1887 + case 1:
1888 + switch (b) {
1889 + case '[':
1890 + _escNumberPtr = 0;
1891 + _escNumber = [];
1892 + _termstate = 2;
1893 + break;
1894 + case '(':
1895 + _termstate = 4;
1896 + break;
1897 + case ')':
1898 + _termstate = 5;
1899 + break;
1900 + default:
1901 + _termstate = 0;
1902 + break;
1903 + }
1904 + break;
1905 + case 2:
1906 + if (b >= '0' && b <= '9') {
1907 + // This is a number
1908 + if (!_escNumber[_escNumberPtr]) {
1909 + _escNumber[_escNumberPtr] = (b - '0');
1910 + }
1911 + else {
1912 + _escNumber[_escNumberPtr] = ((_escNumber[_escNumberPtr] * 10) + (b - '0'));
1913 + }
1914 + break;
1915 + }
1916 + else if (b == ';') {
1917 + // New number
1918 + _escNumberPtr++;
1919 + break;
1920 + }
1921 + else {
1922 + // Process Escape Sequence
1923 + if (!_escNumber[0]) _escNumber[0] = 0;
1924 + _ProcessEscapeHandler(b, _escNumber, _escNumberPtr + 1);
1925 + _termstate = 0;
1926 + }
1927 + break;
1928 + case 4: // '(' Code
1929 + _termstate = 0;
1930 + break;
1931 + case 5: // ')' Code
1932 + _termstate = 0;
1933 + break;
1934 + }
1935 + }
1936 +
1937 + function _ProcessEscapeHandler(code, args, argslen) {
1938 + var i;
1939 + switch (code) {
1940 + case 'c': // ResetDevice
1941 + // Reset
1942 + obj.TermResetScreen();
1943 + break;
1944 + case 'A': // Move cursor up n lines
1945 + if (argslen == 1) {
1946 + _termy -= args[0];
1947 + if (_termy < 0) _termy = 0;
1948 + }
1949 + break;
1950 + case 'B': // Move cursor down n lines
1951 + if (argslen == 1) {
1952 + _termy += args[0];
1953 + if (_termy > obj.height) _termy = obj.height;
1954 + }
1955 + break;
1956 + case 'C': // Move cursor right n lines
1957 + if (argslen == 1) {
1958 + _termx += args[0];
1959 + if (_termx > obj.width) _termx = obj.width;
1960 + }
1961 + break;
1962 + case 'D': // Move cursor left n lines
1963 + if (argslen == 1) {
1964 + _termx -= args[0];
1965 + if (_termx < 0) _termx = 0;
1966 + }
1967 + break;
1968 + case 'd': // Set cursor to line n
1969 + if (argslen == 1) {
1970 + _termy = args[0] - 1;
1971 + if (_termy > obj.height) _termy = obj.height;
1972 + if (_termy < 0) _termy = 0;
1973 + }
1974 + break;
1975 + case 'G': // Set cursor to col n
1976 + if (argslen == 1) {
1977 + _termx = args[0] - 1;
1978 + if (_termx < 0) _termx = 0;
1979 + if (_termx > 79) _termx = 79;
1980 + }
1981 + break;
1982 + case 'J': // ClearScreen:
1983 + if (argslen == 1 && args[0] == 2) {
1984 + obj.TermClear((_TermCurrentBColor << 12) + (_TermCurrentFColor << 6)); // Erase entire screen
1985 + _termx = 0;
1986 + _termy = 0;
1987 + }
1988 + else if (argslen == 0 || argslen == 1 && args[0] == 0) // Erase cursor down
1989 + {
1990 + _EraseCursorToEol();
1991 + for (i = _termy + 1; i < obj.height; i++) _EraseLine(i);
1992 + }
1993 + else if (argslen == 1 && args[0] == 1) // Erase cursor up
1994 + {
1995 + _EraseCursorToEol();
1996 + for (i = 0; i < _termy - 1; i++) _EraseLine(i);
1997 + }
1998 + break;
1999 + case 'H': // MoveCursor:
2000 + if (argslen == 2) {
2001 + if (args[0] < 1) args[0] = 1;
2002 + if (args[1] < 1) args[1] = 1;
2003 + if (args[0] > obj.height) args[0] = obj.height;
2004 + if (args[1] > obj.width) args[1] = obj.width;
2005 + _termy = args[0] - 1;
2006 + _termx = args[1] - 1;
2007 + }
2008 + else {
2009 + _termy = 0;
2010 + _termx = 0;
2011 + }
2012 + break;
2013 + case 'm': // ScreenAttribs:
2014 + // Change attributes
2015 + for (i = 0; i < argslen; i++) {
2016 + if (!args[i] || args[i] == 0) {
2017 + // Reset Attributes
2018 + _TermCurrentBColor = 0;
2019 + _TermCurrentFColor = 7;
2020 + _TermCurrentReverse = 0;
2021 + }
2022 + else if (args[i] == 1) {
2023 + // Bright
2024 + if (_TermCurrentFColor < 8) _TermCurrentFColor += 8;
2025 + }
2026 + else if (args[i] == 2 || args[i] == 22) {
2027 + // Dim
2028 + if (_TermCurrentFColor >= 8) _TermCurrentFColor -= 8;
2029 + }
2030 + else if (args[i] == 7) {
2031 + // Set Reverse attribute true
2032 + _TermCurrentReverse = 2;
2033 + }
2034 + else if (args[i] == 27) {
2035 + // Set Reverse attribute false
2036 + _TermCurrentReverse = 0;
2037 + }
2038 + else if (args[i] >= 30 && args[i] <= 37) {
2039 + // Set Foreground Color
2040 + var bright = (_TermCurrentFColor >= 8);
2041 + _TermCurrentFColor = (args[i] - 30);
2042 + if (bright && _TermCurrentFColor <= 8) _TermCurrentFColor += 8;
2043 + }
2044 + else if (args[i] >= 40 && args[i] <= 47) {
2045 + // Set Background Color
2046 + _TermCurrentBColor = (args[i] - 40);
2047 + }
2048 + else if (args[i] >= 90 && args[i] <= 99) {
2049 + // Set Bright Foreground Color
2050 + _TermCurrentFColor = (args[i] - 82);
2051 + }
2052 + else if (args[i] >= 100 && args[i] <= 109) {
2053 + // Set Bright Background Color
2054 + _TermCurrentBColor = (args[i] - 92);
2055 + }
2056 + }
2057 + break;
2058 + case 'K': // EraseLine:
2059 + if (argslen == 0 || (argslen == 1 && (!args[0] || args[0] == 0))) {
2060 + _EraseCursorToEol(); // Erase from the cursor to the end of the line
2061 + }
2062 + else if (argslen == 1) {
2063 + if (args[0] == 1) // Erase from the beginning of the line to the cursor
2064 + {
2065 + _EraseBolToCursor();
2066 + }
2067 + else if (args[0] == 2) // Erase the line with the cursor
2068 + {
2069 + _EraseLine(_termy);
2070 + }
2071 + }
2072 + break;
2073 + case 'h': // EnableLineWrap:
2074 + _TermLineWrap = true;
2075 + break;
2076 + case 'l': // DisableLineWrap:
2077 + _TermLineWrap = false;
2078 + break;
2079 + default:
2080 + //if (code != '@') alert(code);
2081 + break;
2082 + }
2083 + }
2084 +
2085 + obj.ProcessVt100String = function (str) {
2086 + for (var i = 0; i < str.length; i++) _ProcessVt100Char(String.fromCharCode(str.charCodeAt(i)));
2087 + }
2088 +
2089 +
2090 +
2091 +
2092 + function _ProcessVt100Char(c) {
2093 + if (c == '\0' || c.charCodeAt() == 7) return; // Ignore null & bell
2094 + var ch = c.charCodeAt();
2095 +
2096 +
2097 +
2098 +
2099 + //if (ch < 32 && ch != 10 && ch != 13) alert(ch);
2100 + switch (ch) {
2101 + case 16: { c = ' '; break; } // This is an odd char that show up on Intel BIOS's.
2102 + case 24: { c = '↑'; break; }
2103 + case 25: { c = '↓'; break; }
2104 + }
2105 +
2106 + if (_termx > obj.width) _termx = obj.width;
2107 + if (_termy > (obj.height - 1)) _termy = (obj.height - 1);
2108 +
2109 + switch (c) {
2110 + case '\b': // Backspace
2111 + if (_termx > 0) {
2112 + _termx = _termx - 1;
2113 + _TermDrawChar(' ');
2114 + }
2115 + break;
2116 + case '\t': // tab
2117 + var tab = 8 - (_termx % 8)
2118 + for (var x = 0; x < tab; x++) _ProcessVt100Char(" ");
2119 + break;
2120 + case '\n': // Linefeed
2121 + _termy++;
2122 + if (_termy > (obj.height - 1)) {
2123 + // Move everything up one line
2124 + _TermMoveUp(1);
2125 + _termy = (obj.height - 1);
2126 + }
2127 + if (obj.lineFeed = '\n') { _termx = 0; } // *** If we are in Linux mode, \n will also return the cursor to the first col
2128 + break;
2129 + case '\r': // Carriage Return
2130 + _termx = 0;
2131 + break;
2132 + default:
2133 + if (_termx >= obj.width) {
2134 + _termx = 0;
2135 + if (_TermLineWrap) { _termy++; }
2136 + if (_termy >= (obj.height - 1)) { _TermMoveUp(1); _termy = (obj.height - 1); }
2137 + }
2138 + _TermDrawChar(c);
2139 + _termx++;
2140 + break;
2141 + }
2142 +
2143 + }
2144 +
2145 + function _TermDrawChar(c) {
2146 + _tscreen[_termy][_termx] = c;
2147 + _scratt[_termy][_termx] = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
2148 + }
2149 +
2150 + obj.TermClear = function(TermColor) {
2151 + for (var y = 0; y < obj.height; y++) {
2152 + for (var x = 0; x < obj.width; x++) {
2153 + _tscreen[y][x] = ' ';
2154 + _scratt[y][x] = TermColor;
2155 + }
2156 + }
2157 + }
2158 +
2159 + obj.TermResetScreen = function () {
2160 + _TermCurrentReverse = 0;
2161 + _TermCurrentFColor = 7;
2162 + _TermCurrentBColor = 0;
2163 + _TermLineWrap = true;
2164 + _termx = 0;
2165 + _termy = 0;
2166 + obj.TermClear(7 << 6);
2167 + }
2168 +
2169 + function _EraseCursorToEol() {
2170 + var t = (_TermCurrentBColor << 12);
2171 + for (var x = _termx; x < obj.width; x++) {
2172 + _tscreen[_termy][x] = ' ';
2173 + _scratt[_termy][x] = t;
2174 + }
2175 + }
2176 +
2177 + function _EraseBolToCursor() {
2178 + var t = (_TermCurrentBColor << 12);
2179 + for (var x = 0; x < _termx; x++) {
2180 + _tscreen[_termy][x] = ' ';
2181 + _scratt[_termy][x] = t;
2182 + }
2183 + }
2184 +
2185 + function _EraseLine(line) {
2186 + var t = (_TermCurrentBColor << 12);
2187 + for (var x = 0; x < obj.width; x++) {
2188 + _tscreen[line][x] = ' ';
2189 + _scratt[line][x] = t;
2190 + }
2191 + }
2192 +
2193 + obj.TermSendKeys = function (keys) { if (obj.debugmode == 2) { if (obj.debugmode == 2) { console.log("TSend(" + keys.length + "): " + rstr2hex(keys)); } } obj.parent.send(keys); }
2194 + obj.TermSendKey = function (key) { if (obj.debugmode == 2) { if (obj.debugmode == 2) { console.log("TSend(1): " + rstr2hex(String.fromCharCode(key))); } } obj.parent.send(String.fromCharCode(key)); }
2195 +
2196 + function _TermMoveUp(linecount) {
2197 + var x, y;
2198 + for (y = 0; y < obj.height - linecount; y++) {
2199 + _tscreen[y] = _tscreen[y + linecount];
2200 + _scratt[y] = _scratt[y + linecount];
2201 + }
2202 + for (y = obj.height - linecount; y < obj.height; y++) {
2203 + _tscreen[y] = [];
2204 + _scratt[y] = [];
2205 + for (x = 0; x < obj.width; x++) {
2206 + _tscreen[y][x] = ' ';
2207 + _scratt[y][x] = (7 << 6);
2208 + }
2209 + }
2210 + }
2211 +
2212 + obj.TermHandleKeys = function (e) {
2213 + if (!e.ctrlKey) {
2214 + if (e.which == 127) obj.TermSendKey(8);
2215 + else if (e.which == 13) obj.TermSendKeys(obj.lineFeed);
2216 + else if (e.which != 0) obj.TermSendKey(e.which);
2217 + return false;
2218 + }
2219 + if (e.preventDefault) e.preventDefault();
2220 + if (e.stopPropagation) e.stopPropagation();
2221 + }
2222 +
2223 + obj.TermHandleKeyUp = function (e) {
2224 + if ((e.which != 8) && (e.which != 32) && (e.which != 9)) return true;
2225 + if (e.preventDefault) e.preventDefault();
2226 + if (e.stopPropagation) e.stopPropagation();
2227 + return false;
2228 + }
2229 +
2230 + obj.TermHandleKeyDown = function (e) {
2231 + if ((e.which >= 65) && (e.which <= 90) && (e.ctrlKey == true)) {
2232 + obj.TermSendKey(e.which - 64);
2233 + if (e.preventDefault) e.preventDefault();
2234 + if (e.stopPropagation) e.stopPropagation();
2235 + return;
2236 + }
2237 + if (e.which == 27) { obj.TermSendKeys(String.fromCharCode(27)); return true; }; // ESC
2238 + if (e.which == 37) { obj.TermSendKeys(String.fromCharCode(27, 91, 68)); return true; }; // Left
2239 + if (e.which == 38) { obj.TermSendKeys(String.fromCharCode(27, 91, 65)); return true; }; // Up
2240 + if (e.which == 39) { obj.TermSendKeys(String.fromCharCode(27, 91, 67)); return true; }; // Right
2241 + if (e.which == 40) { obj.TermSendKeys(String.fromCharCode(27, 91, 66)); return true; }; // Down
2242 + if (e.which == 9) { obj.TermSendKeys("\t"); if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return true; }; // TAB
2243 +
2244 + // F1 to F12 keys
2245 +
2246 + if (e.which != 8 && e.which != 32 && e.which != 9) return true;
2247 + obj.TermSendKey(e.which);
2248 + if (e.preventDefault) e.preventDefault();
2249 + if (e.stopPropagation) e.stopPropagation();
2250 + return false;
2251 + }
2252 +
2253 + obj.TermDraw = function() {
2254 + var c, buf = '', closetag = '', newat, oldat = 1, x1, x2;
2255 + for (var y = 0; y < obj.height; ++y) {
2256 + for (var x = 0; x < obj.width; ++x) {
2257 + newat = _scratt[y][x];
2258 + if (_termx == x && _termy == y) { newat |= _VTREVERSE; } // If this is the cursor location, reverse the color.
2259 + if (newat != oldat) {
2260 + buf += closetag;
2261 + closetag = '';
2262 + x1 = 6; x2 = 12;
2263 + if (newat & _VTREVERSE) { x1 = 12; x2 = 6;}
2264 + buf += '<span style="color:#' + _TermColors[(newat >> x1) & 0x3F] + ';background-color:#' + _TermColors[(newat >> x2) & 0x3F];
2265 + if (newat & _VTUNDERLINE) buf += ';text-decoration:underline';
2266 + buf += ';">';
2267 + closetag = "</span>" + closetag;
2268 + oldat = newat;
2269 + }
2270 +
2271 + c = _tscreen[y][x];
2272 + switch (c) {
2273 + case '&':
2274 + buf += '&amp;'; break;
2275 + case '<':
2276 + buf += '&lt;'; break;
2277 + case '>':
2278 + buf += '&gt;'; break;
2279 + case ' ':
2280 + buf += '&nbsp;'; break;
2281 + default:
2282 + buf += c;
2283 + break;
2284 + }
2285 + }
2286 + if (y != (obj.height - 1)) buf += '<br>';
2287 + }
2288 + obj.DivElement.innerHTML = "<font size='4'><b>" + buf + closetag + "</b></font>";
2289 + }
2290 +
2291 + obj.TermInit = function () { obj.TermResetScreen(); }
2292 +
2293 + obj.Init();
2294 + return obj;
2295 +}/* zlib.js -- JavaScript implementation for the zlib.
2296 + Version: 0.2.0
2297 + LastModified: Apr 12 2012
2298 + Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
2299 +
2300 + The original copyright notice (zlib 1.2.6):
2301 +
2302 + Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
2303 +
2304 + This software is provided 'as-is', without any express or implied
2305 + warranty. In no event will the authors be held liable for any damages
2306 + arising from the use of this software.
2307 +
2308 + Permission is granted to anyone to use this software for any purpose,
2309 + including commercial applications, and to alter it and redistribute it
2310 + freely, subject to the following restrictions:
2311 +
2312 + 1. The origin of this software must not be misrepresented; you must not
2313 + claim that you wrote the original software. If you use this software
2314 + in a product, an acknowledgment in the product documentation would be
2315 + appreciated but is not required.
2316 + 2. Altered source versions must be plainly marked as such, and must not be
2317 + misrepresented as being the original software.
2318 + 3. This notice may not be removed or altered from any source distribution.
2319 +
2320 + Jean-loup Gailly Mark Adler
2321 + jloup@gzip.org madler@alumni.caltech.edu
2322 +
2323 +
2324 + The data format used by the zlib library is described by RFCs (Request for
2325 + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
2326 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
2327 +*/
2328 +
2329 +var ZLIB = ( ZLIB || {} ); // ZLIB namespace initialization
2330 +
2331 +// common definitions
2332 +if(typeof ZLIB.common_initialized === 'undefined') {
2333 + ZLIB.Z_NO_FLUSH = 0;
2334 + ZLIB.Z_PARTIAL_FLUSH = 1;
2335 + ZLIB.Z_SYNC_FLUSH = 2;
2336 + ZLIB.Z_FULL_FLUSH = 3;
2337 + ZLIB.Z_FINISH = 4;
2338 + ZLIB.Z_BLOCK = 5;
2339 + ZLIB.Z_TREES = 6;
2340 + /* Allowed flush values; see deflate() and inflate() below for details */
2341 +
2342 + ZLIB.Z_OK = 0;
2343 + ZLIB.Z_STREAM_END = 1;
2344 + ZLIB.Z_NEED_DICT = 2;
2345 + ZLIB.Z_ERRNO = (-1);
2346 + ZLIB.Z_STREAM_ERROR = (-2);
2347 + ZLIB.Z_DATA_ERROR = (-3);
2348 + ZLIB.Z_MEM_ERROR = (-4);
2349 + ZLIB.Z_BUF_ERROR = (-5);
2350 + ZLIB.Z_VERSION_ERROR = (-6);
2351 + /* Return codes for the compression/decompression functions. Negative values
2352 + * are errors, positive values are used for special but normal events.
2353 + */
2354 +
2355 + ZLIB.Z_DEFLATED = 8; /* The deflate compression method (the only one supported in this version) */
2356 +
2357 + /**
2358 + * z_stream constructor
2359 + * @constructor
2360 + */
2361 + ZLIB.z_stream = function() {
2362 + this.next_in = 0; /* next input byte */
2363 + this.avail_in = 0; /* number of bytes available in input_data */
2364 + this.total_in = 0; /* total number of input bytes read so far */
2365 +
2366 + this.next_out = 0; /* next output byte */
2367 + this.avail_out = 0; /* remaining free space at next_out */
2368 + this.total_out = 0; /* total number of bytes output so far */
2369 +
2370 + this.msg = null; /* last error message, null if no error */
2371 + this.state = null; /* not visible by applications */
2372 +
2373 + this.data_type = 0; /* best guess about the data type: binary or text */
2374 + this.adler = 0; /* TODO: adler32 value of the uncompressed data */
2375 +
2376 + // zlib.js
2377 + this.input_data = ''; /* input data */
2378 + this.output_data = ''; /* output data */
2379 + this.error = 0; /* error code */
2380 + this.checksum_function = null; /* crc32(for gzip) or adler32(for zlib) */
2381 + };
2382 +
2383 + /**
2384 + * TODO
2385 + * @constructor
2386 + */
2387 + ZLIB.gz_header = function() {
2388 + this.text = 0; /* true if compressed data believed to be text */
2389 + this.time = 0; /* modification time */
2390 + this.xflags = 0; /* extra flags (not used when writing a gzip file) */
2391 + this.os = 0xff; /* operating system */
2392 + this.extra = null; /* extra field string or null if none */
2393 + this.extra_len = 0; /* this.extra.length (only when reading header) */
2394 + this.extra_max = 0; /* space at extra (only when reading header) */
2395 + this.name = null; /* file name string or null if none */
2396 + this.name_max = 0; /* space at name (only when reading header) */
2397 + this.comment = null; /* comment string or null if none */
2398 + this.comm_max = 0; /* space at comment (only when reading header) */
2399 + this.hcrc = 0; /* true if there was or will be a header crc */
2400 + this.done = 0; /* true when done reading gzip header (not used
2401 + when writing a gzip file) */
2402 + };
2403 +
2404 + ZLIB.common_initialized = true;
2405 +} // common definitions
2406 +/* zlib-inflate.js -- JavaScript implementation for the zlib inflate.
2407 + Version: 0.2.0
2408 + LastModified: Apr 12 2012
2409 + Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
2410 +
2411 + This library is one of the JavaScript zlib implementation.
2412 + Some API's are modified from the original.
2413 + Only inflate API is implemented.
2414 +
2415 + The original copyright notice (zlib 1.2.6):
2416 +
2417 + Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
2418 +
2419 + This software is provided 'as-is', without any express or implied
2420 + warranty. In no event will the authors be held liable for any damages
2421 + arising from the use of this software.
2422 +
2423 + Permission is granted to anyone to use this software for any purpose,
2424 + including commercial applications, and to alter it and redistribute it
2425 + freely, subject to the following restrictions:
2426 +
2427 + 1. The origin of this software must not be misrepresented; you must not
2428 + claim that you wrote the original software. If you use this software
2429 + in a product, an acknowledgment in the product documentation would be
2430 + appreciated but is not required.
2431 + 2. Altered source versions must be plainly marked as such, and must not be
2432 + misrepresented as being the original software.
2433 + 3. This notice may not be removed or altered from any source distribution.
2434 +
2435 + Jean-loup Gailly Mark Adler
2436 + jloup@gzip.org madler@alumni.caltech.edu
2437 +
2438 +
2439 + The data format used by the zlib library is described by RFCs (Request for
2440 + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
2441 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
2442 +*/
2443 +
2444 +/*
2445 + API documentation
2446 +==============================================================================
2447 +Usage: z_stream = ZLIB.inflateInit([windowBits]);
2448 +
2449 + Create the stream object for decompression.
2450 + See zlib.h for windowBits information.
2451 +
2452 +==============================================================================
2453 +Usage: decoded_string = z_stream.inflate(encoded_string [, {OPTIONS...}]);
2454 +
2455 +OPTIONS:
2456 + next_in: decode start offset for encoded_string.
2457 +
2458 + avail_in: // TODO document. See zlib.h for the information.
2459 +
2460 + avail_out: // TODO document. See zlib.h for the information.
2461 +
2462 + flush: // TODO document. See zlib.h for the information.
2463 +
2464 +Ex: decoded_string = z_stream.inflate(encoded_string);
2465 + decoded_string = z_stream.inflate(encoded_string,
2466 + {next_in: 0,
2467 + avail_in: encoded_string.length,
2468 + avail_out: 1024,
2469 + flush: ZLIB.Z_NO_FLUSH});
2470 +
2471 + See zlib.h for more information.
2472 +
2473 +==============================================================================
2474 +Usage: z_stream.inflateReset();
2475 + TODO document
2476 +
2477 +*/
2478 +
2479 +if( typeof ZLIB === 'undefined' ) {
2480 + alert('ZLIB is not defined. SRC zlib.js before zlib-inflate.js')
2481 +}
2482 +
2483 +(function() {
2484 +
2485 +/* inflate.c -- zlib decompression
2486 + * Copyright (C) 1995-2011 Mark Adler
2487 + * For conditions of distribution and use, see copyright notice in zlib.h
2488 + */
2489 +
2490 +var DEF_WBITS = 15;
2491 +
2492 +// inflate_mode
2493 +var HEAD = 0; /* i: waiting for magic header */
2494 +var FLAGS = 1; /* i: waiting for method and flags (gzip) */
2495 +var TIME = 2; /* i: waiting for modification time (gzip) */
2496 +var OS = 3; /* i: waiting for extra flags and operating system (gzip) */
2497 +var EXLEN = 4; /* i: waiting for extra length (gzip) */
2498 +var EXTRA = 5; /* i: waiting for extra bytes (gzip) */
2499 +var NAME = 6; /* i: waiting for end of file name (gzip) */
2500 +var COMMENT = 7; /* i: waiting for end of comment (gzip) */
2501 +var HCRC = 8; /* i: waiting for header crc (gzip) */
2502 +var DICTID = 9; /* i: waiting for dictionary check value */
2503 +var DICT = 10; /* waiting for inflateSetDictionary() call */
2504 +var TYPE = 11; /* i: waiting for type bits, including last-flag bit */
2505 +var TYPEDO = 12; /* i: same, but skip check to exit inflate on new block */
2506 +var STORED = 13; /* i: waiting for stored size (length and complement) */
2507 +var COPY_ = 14; /* i/o: same as COPY below, but only first time in */
2508 +var COPY = 15; /* i/o: waiting for input or output to copy stored block */
2509 +var TABLE = 16; /* i: waiting for dynamic block table lengths */
2510 +var LENLENS = 17; /* i: waiting for code length code lengths */
2511 +var CODELENS = 18; /* i: waiting for length/lit and distance code lengths */
2512 +var LEN_ = 19; /* i: same as LEN below, but only first time in */
2513 +var LEN = 20; /* i: waiting for length/lit/eob code */
2514 +var LENEXT = 21; /* i: waiting for length extra bits */
2515 +var DIST = 22; /* i: waiting for distance code */
2516 +var DISTEXT = 23; /* i: waiting for distance extra bits */
2517 +var MATCH = 24; /* o: waiting for output space to copy string */
2518 +var LIT = 25; /* o: waiting for output space to write literal */
2519 +var CHECK = 26; /* i: waiting for 32-bit check value */
2520 +var LENGTH = 27; /* i: waiting for 32-bit length (gzip) */
2521 +var DONE = 28; /* finished check, done -- remain here until reset */
2522 +var BAD = 29; /* got a data error -- remain here until reset */
2523 +var MEM = 30; /* got an inflate() memory error -- remain here until reset */
2524 +var SYNC = 31; /* looking for synchronization bytes to restart inflate() */
2525 +
2526 +/* Maximum size of the dynamic table. The maximum number of code structures is
2527 + 1444, which is the sum of 852 for literal/length codes and 592 for distance
2528 + codes. These values were found by exhaustive searches using the program
2529 + examples/enough.c found in the zlib distribtution. The arguments to that
2530 + program are the number of symbols, the initial root table size, and the
2531 + maximum bit length of a code. "enough 286 9 15" for literal/length codes
2532 + returns returns 852, and "enough 30 6 15" for distance codes returns 592.
2533 + The initial root table size (9 or 6) is found in the fifth argument of the
2534 + inflate_table() calls in inflate.c and infback.c. If the root table size is
2535 + changed, then these maximum sizes would be need to be recalculated and
2536 + updated. */
2537 +var ENOUGH_LENS = 852;
2538 +var ENOUGH_DISTS = 592;
2539 +var ENOUGH = (ENOUGH_LENS + ENOUGH_DISTS);
2540 +
2541 +/* Type of code to build for inflate_table() */
2542 +var CODES = 0;
2543 +var LENS = 1;
2544 +var DISTS = 2;
2545 +
2546 +
2547 +
2548 +var inflate_table_lbase = [ /* Length codes 257..285 base */
2549 + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
2550 + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0];
2551 +var inflate_table_lext = [ /* Length codes 257..285 extra */
2552 + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
2553 + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 69];
2554 +var inflate_table_dbase = [ /* Distance codes 0..29 base */
2555 + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
2556 + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
2557 + 8193, 12289, 16385, 24577, 0, 0];
2558 +var inflate_table_dext = [ /* Distance codes 0..29 extra */
2559 + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
2560 + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
2561 + 28, 28, 29, 29, 64, 64];
2562 +
2563 +/* inftrees.c -- generate Huffman trees for efficient decoding
2564 + * Copyright (C) 1995-2012 Mark Adler
2565 + * For conditions of distribution and use, see copyright notice in zlib.h
2566 + */
2567 +
2568 +ZLIB.inflate_copyright =
2569 + ' inflate 1.2.6 Copyright 1995-2012 Mark Adler ';
2570 +/*
2571 + If you use the zlib library in a product, an acknowledgment is welcome
2572 + in the documentation of your product. If for some reason you cannot
2573 + include such an acknowledgment, I would appreciate that you keep this
2574 + copyright string in the executable of your product.
2575 + */
2576 +
2577 +/*
2578 + Build a set of tables to decode the provided canonical Huffman code.
2579 + The code lengths are lens[0..codes-1]. The result starts at *table,
2580 + whose indices are 0..2^bits-1. work is a writable array of at least
2581 + lens shorts, which is used as a work area. type is the type of code
2582 + to be generated, CODES, LENS, or DISTS. On return, zero is success,
2583 + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
2584 + on return points to the next available entry's address. bits is the
2585 + requested root table index bits, and on return it is the actual root
2586 + table index bits. It will differ if the request is greater than the
2587 + longest code or if it is less than the shortest code.
2588 +*/
2589 +function inflate_table(state, type)
2590 +{
2591 + var MAXBITS = 15;
2592 + var table = state.next;
2593 + var bits = (type == DISTS ? state.distbits : state.lenbits);
2594 + var work = state.work;
2595 + var lens = state.lens;
2596 + var lens_offset = (type == DISTS ? state.nlen : 0);
2597 + var state_codes = state.codes;
2598 + var codes;
2599 + if(type == LENS)
2600 + codes = state.nlen;
2601 + else if(type == DISTS)
2602 + codes = state.ndist;
2603 + else // CODES
2604 + codes = 19;
2605 +
2606 + var len; /* a code's length in bits */
2607 + var sym; /* index of code symbols */
2608 + var min, max; /* minimum and maximum code lengths */
2609 + var root; /* number of index bits for root table */
2610 + var curr; /* number of index bits for current table */
2611 + var drop; /* code bits to drop for sub-table */
2612 + var left; /* number of prefix codes available */
2613 + var used; /* code entries in table used */
2614 + var huff; /* Huffman code */
2615 + var incr; /* for incrementing code, index */
2616 + var fill; /* index for replicating entries */
2617 + var low; /* low bits for current root entry */
2618 + var mask; /* mask for low root bits */
2619 + var here; /* table entry for duplication */
2620 + var next; /* next available space in table */
2621 + var base; /* base value table to use */
2622 + var base_offset;
2623 + var extra; /* extra bits table to use */
2624 + var extra_offset;
2625 + var end; /* use base and extra for symbol > end */
2626 + var count = new Array(MAXBITS+1); /* number of codes of each length */
2627 + var offs = new Array(MAXBITS+1); /* offsets in table for each length */
2628 +
2629 + /*
2630 + Process a set of code lengths to create a canonical Huffman code. The
2631 + code lengths are lens[0..codes-1]. Each length corresponds to the
2632 + symbols 0..codes-1. The Huffman code is generated by first sorting the
2633 + symbols by length from short to long, and retaining the symbol order
2634 + for codes with equal lengths. Then the code starts with all zero bits
2635 + for the first code of the shortest length, and the codes are integer
2636 + increments for the same length, and zeros are appended as the length
2637 + increases. For the deflate format, these bits are stored backwards
2638 + from their more natural integer increment ordering, and so when the
2639 + decoding tables are built in the large loop below, the integer codes
2640 + are incremented backwards.
2641 +
2642 + This routine assumes, but does not check, that all of the entries in
2643 + lens[] are in the range 0..MAXBITS. The caller must assure this.
2644 + 1..MAXBITS is interpreted as that code length. zero means that that
2645 + symbol does not occur in this code.
2646 +
2647 + The codes are sorted by computing a count of codes for each length,
2648 + creating from that a table of starting indices for each length in the
2649 + sorted table, and then entering the symbols in order in the sorted
2650 + table. The sorted table is work[], with that space being provided by
2651 + the caller.
2652 +
2653 + The length counts are used for other purposes as well, i.e. finding
2654 + the minimum and maximum length codes, determining if there are any
2655 + codes at all, checking for a valid set of lengths, and looking ahead
2656 + at length counts to determine sub-table sizes when building the
2657 + decoding tables.
2658 + */
2659 +
2660 + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
2661 + for (len = 0; len <= MAXBITS; len++)
2662 + count[len] = 0;
2663 + for (sym = 0; sym < codes; sym++)
2664 + count[lens[lens_offset + sym]]++;
2665 +
2666 + /* bound code lengths, force root to be within code lengths */
2667 + root = bits;
2668 +
2669 + for (max = MAXBITS; max >= 1; max--)
2670 + if (count[max] != 0) break;
2671 + if (root > max) root = max;
2672 + if (max == 0) {
2673 + /* no symbols to code at all */
2674 + /* invalid code marker */
2675 + here = {op:64, bits:1, val:0};
2676 + state_codes[table++] = here; /* make a table to force an error */
2677 + state_codes[table++] = here;
2678 + if(type == DISTS) state.distbits = 1; else state.lenbits = 1; // *bits = 1;
2679 + state.next = table;
2680 + return 0; /* no symbols, but wait for decoding to report error */
2681 + }
2682 + for (min = 1; min < max; min++)
2683 + if (count[min] != 0) break;
2684 + if (root < min) root = min;
2685 +
2686 + /* check for an over-subscribed or incomplete set of lengths */
2687 + left = 1;
2688 + for (len = 1; len <= MAXBITS; len++) {
2689 + left <<= 1;
2690 + left -= count[len];
2691 + if (left < 0) return -1; /* over-subscribed */
2692 + }
2693 + if (left > 0 && (type == CODES || max != 1)) {
2694 + state.next = table;
2695 + return -1; /* incomplete set */
2696 + }
2697 +
2698 + /* generate offsets into symbol table for each length for sorting */
2699 + offs[1] = 0;
2700 + for (len = 1; len < MAXBITS; len++)
2701 + offs[len + 1] = offs[len] + count[len];
2702 +
2703 + /* sort symbols by length, by symbol order within each length */
2704 + for (sym = 0; sym < codes; sym++)
2705 + if (lens[lens_offset + sym] != 0) work[offs[lens[lens_offset + sym]]++] = sym;
2706 +
2707 + /*
2708 + Create and fill in decoding tables. In this loop, the table being
2709 + filled is at next and has curr index bits. The code being used is huff
2710 + with length len. That code is converted to an index by dropping drop
2711 + bits off of the bottom. For codes where len is less than drop + curr,
2712 + those top drop + curr - len bits are incremented through all values to
2713 + fill the table with replicated entries.
2714 +
2715 + root is the number of index bits for the root table. When len exceeds
2716 + root, sub-tables are created pointed to by the root entry with an index
2717 + of the low root bits of huff. This is saved in low to check for when a
2718 + new sub-table should be started. drop is zero when the root table is
2719 + being filled, and drop is root when sub-tables are being filled.
2720 +
2721 + When a new sub-table is needed, it is necessary to look ahead in the
2722 + code lengths to determine what size sub-table is needed. The length
2723 + counts are used for this, and so count[] is decremented as codes are
2724 + entered in the tables.
2725 +
2726 + used keeps track of how many table entries have been allocated from the
2727 + provided *table space. It is checked for LENS and DIST tables against
2728 + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
2729 + the initial root table size constants. See the comments in inftrees.h
2730 + for more information.
2731 +
2732 + sym increments through all symbols, and the loop terminates when
2733 + all codes of length max, i.e. all codes, have been processed. This
2734 + routine permits incomplete codes, so another loop after this one fills
2735 + in the rest of the decoding tables with invalid code markers.
2736 + */
2737 +
2738 + /* set up for code type */
2739 + switch (type) {
2740 + case CODES:
2741 + base = extra = work; /* dummy value--not used */
2742 + base_offset = 0;
2743 + extra_offset = 0;
2744 + end = 19;
2745 + break;
2746 + case LENS:
2747 + base = inflate_table_lbase;
2748 + base_offset = -257; // base -= 257;
2749 + extra = inflate_table_lext;
2750 + extra_offset = -257; // extra -= 257;
2751 + end = 256;
2752 + break;
2753 + default: /* DISTS */
2754 + base = inflate_table_dbase;
2755 + extra = inflate_table_dext;
2756 + base_offset = 0;
2757 + extra_offset = 0;
2758 + end = -1;
2759 + }
2760 +
2761 + /* initialize state for loop */
2762 + huff = 0; /* starting code */
2763 + sym = 0; /* starting code symbol */
2764 + len = min; /* starting code length */
2765 + next = table; /* current table to fill in */
2766 + curr = root; /* current table index bits */
2767 + drop = 0; /* current bits to drop from code for index */
2768 + low = -1; /* trigger new sub-table when len > root */
2769 + used = 1 << root; /* use root table entries */
2770 + mask = used - 1; /* mask for comparing low */
2771 +
2772 + /* check available table space */
2773 + if ((type == LENS && used >= ENOUGH_LENS) ||
2774 + (type == DISTS && used >= ENOUGH_DISTS)) {
2775 + state.next = table;
2776 + return 1;
2777 + }
2778 +
2779 + /* process all codes and make table entries */
2780 + for (;;) {
2781 + /* create table entry */
2782 + here = {op:0, bits:len - drop, val:0};
2783 + if (work[sym] < end) {
2784 + here.val = work[sym];
2785 + }
2786 + else if (work[sym] > end) {
2787 + here.op = extra[extra_offset + work[sym]];
2788 + here.val = base[base_offset + work[sym]];
2789 + }
2790 + else {
2791 + here.op = 32 + 64; /* end of block */
2792 + }
2793 +
2794 + /* replicate for those indices with low len bits equal to huff */
2795 + incr = 1 << (len - drop);
2796 + fill = 1 << curr;
2797 + min = fill; /* save offset to next table */
2798 + do {
2799 + fill -= incr;
2800 + state_codes[next + (huff >>> drop) + fill] = here;
2801 + } while (fill != 0);
2802 +
2803 + /* backwards increment the len-bit code huff */
2804 + incr = 1 << (len - 1);
2805 + while (huff & incr)
2806 + incr >>>= 1;
2807 + if (incr != 0) {
2808 + huff &= incr - 1;
2809 + huff += incr;
2810 + }
2811 + else
2812 + huff = 0;
2813 +
2814 + /* go to next symbol, update count, len */
2815 + sym++;
2816 + if (--(count[len]) == 0) {
2817 + if (len == max) break;
2818 + len = lens[lens_offset + work[sym]];
2819 + }
2820 +
2821 + /* create new sub-table if needed */
2822 + if (len > root && (huff & mask) != low) {
2823 + /* if first time, transition to sub-tables */
2824 + if (drop == 0)
2825 + drop = root;
2826 +
2827 + /* increment past last table */
2828 + next += min; /* here min is 1 << curr */
2829 +
2830 + /* determine length of next table */
2831 + curr = len - drop;
2832 + left = (1 << curr);
2833 + while (curr + drop < max) {
2834 + left -= count[curr + drop];
2835 + if (left <= 0) break;
2836 + curr++;
2837 + left <<= 1;
2838 + }
2839 +
2840 + /* check for enough space */
2841 + used += 1 << curr;
2842 + if ((type == LENS && used >= ENOUGH_LENS) ||
2843 + (type == DISTS && used >= ENOUGH_DISTS)) {
2844 + state.next = table;
2845 + return 1;
2846 + }
2847 +
2848 + /* point entry in root table to sub-table */
2849 + low = huff & mask;
2850 + state_codes[table + low] = {op:curr, bits:root, val:next - table};
2851 + }
2852 + }
2853 +
2854 + /* fill in remaining table entry if code is incomplete (guaranteed to have
2855 + at most one remaining entry, since if the code is incomplete, the
2856 + maximum code length that was allowed to get this far is one bit) */
2857 + if (huff != 0) {
2858 + state_codes[next + huff] = {op:64, bits:len - drop, val:0};
2859 + }
2860 +
2861 + /* set return parameters */
2862 + state.next = table + used;
2863 + if(type == DISTS) state.distbits = root; else state.lenbits = root; //*bits = root;
2864 + return 0;
2865 +}
2866 +
2867 +/* inffast.c -- fast decoding
2868 + * Copyright (C) 1995-2008, 2010 Mark Adler
2869 + * For conditions of distribution and use, see copyright notice in zlib.h
2870 + */
2871 +
2872 +/*
2873 + Decode literal, length, and distance codes and write out the resulting
2874 + literal and match bytes until either not enough input or output is
2875 + available, an end-of-block is encountered, or a data error is encountered.
2876 + When large enough input and output buffers are supplied to inflate(), for
2877 + example, a 16K input buffer and a 64K output buffer, more than 95% of the
2878 + inflate execution time is spent in this routine.
2879 +
2880 + Entry assumptions:
2881 +
2882 + state->mode == LEN
2883 + strm->avail_in >= 6
2884 + strm->avail_out >= 258
2885 + start >= strm->avail_out
2886 + state->bits < 8
2887 +
2888 + On return, state->mode is one of:
2889 +
2890 + LEN -- ran out of enough output space or enough available input
2891 + TYPE -- reached end of block code, inflate() to interpret next block
2892 + BAD -- error in block data
2893 +
2894 + Notes:
2895 +
2896 + - The maximum input bits used by a length/distance pair is 15 bits for the
2897 + length code, 5 bits for the length extra, 15 bits for the distance code,
2898 + and 13 bits for the distance extra. This totals 48 bits, or six bytes.
2899 + Therefore if strm->avail_in >= 6, then there is enough input to avoid
2900 + checking for available input while decoding.
2901 +
2902 + - The maximum bytes that a single length/distance pair can output is 258
2903 + bytes, which is the maximum length that can be coded. inflate_fast()
2904 + requires strm->avail_out >= 258 for each loop to avoid checking for
2905 + output space.
2906 + */
2907 +function inflate_fast(strm,
2908 + start) /* inflate()'s starting value for strm->avail_out */
2909 +{
2910 + var state;
2911 + var input_data; /* local strm->input_data */
2912 + var next_in; /* zlib.js: index of input_data */
2913 + var last; /* while next_in < last, enough input available */
2914 + var out; /* local strm.next_out */
2915 + var beg; /* inflate()'s initial strm.next_out */
2916 + var end; /* while out < end, enough space available */
2917 +//NOSPRT #ifdef INFLATE_STRICT
2918 +// unsigned dmax; /* maximum distance from zlib header */
2919 +//#endif
2920 + var wsize; /* window size or zero if not using window */
2921 + var whave; /* valid bytes in the window */
2922 + var wnext; /* window write index */
2923 + var window; /* allocated sliding window, if wsize != 0 */
2924 + var hold; /* local strm->hold */
2925 + var bits; /* local strm->bits */
2926 + var codes; /* zlib.js: local state.codes */
2927 + var lcode; /* local strm->lencode */
2928 + var dcode; /* local strm->distcode */
2929 + var lmask; /* mask for first level of length codes */
2930 + var dmask; /* mask for first level of distance codes */
2931 + var here; /* retrieved table entry */
2932 + var op; /* code bits, operation, extra bits, or */
2933 + /* window position, window bytes to copy */
2934 + var len; /* match length, unused bytes */
2935 + var dist; /* match distance */
2936 + // var from; /* where to copy match from */
2937 + var from_window_offset = -1; /* index of window[] */
2938 + var from_out_offset = -1; /* index of next_out[] */
2939 +
2940 + /* copy state to local variables */
2941 + state = strm.state;
2942 + input_data = strm.input_data;
2943 + next_in = strm.next_in;
2944 + last = next_in + strm.avail_in - 5;
2945 + out = strm.next_out;
2946 + beg = out - (start - strm.avail_out);
2947 + end = out + (strm.avail_out - 257);
2948 +//NOSPRT #ifdef INFLATE_STRICT
2949 +// dmax = state->dmax;
2950 +//#endif
2951 + wsize = state.wsize;
2952 + whave = state.whave;
2953 + wnext = state.wnext;
2954 + window = state.window;
2955 + hold = state.hold;
2956 + bits = state.bits;
2957 + codes = state.codes;
2958 + lcode = state.lencode;
2959 + dcode = state.distcode;
2960 + lmask = (1 << state.lenbits) - 1;
2961 + dmask = (1 << state.distbits) - 1;
2962 +
2963 + /* decode literals and length/distances until end-of-block or not enough
2964 + input data or output space */
2965 +loop: do {
2966 + if (bits < 15) {
2967 + hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
2968 + bits += 8;
2969 + hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
2970 + bits += 8;
2971 + }
2972 + here = codes[lcode + (hold & lmask)];
2973 + dolen: while(true) {
2974 + op = here.bits;
2975 + hold >>>= op;
2976 + bits -= op;
2977 + op = here.op;
2978 + if (op == 0) { /* literal */
2979 +// Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
2980 +// "inflate: literal '%c'\n" :
2981 +// "inflate: literal 0x%02x\n", here.val));
2982 + strm.output_data += String.fromCharCode(here.val);
2983 + out++;
2984 + }
2985 + else if (op & 16) { /* length base */
2986 + len = here.val;
2987 + op &= 15; /* number of extra bits */
2988 + if (op) {
2989 + if (bits < op) {
2990 + hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
2991 + bits += 8;
2992 + }
2993 + len += hold & ((1 << op) - 1);
2994 + hold >>>= op;
2995 + bits -= op;
2996 + }
2997 +// Tracevv((stderr, "inflate: length %u\n", len));
2998 + if (bits < 15) {
2999 + hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3000 + bits += 8;
3001 + hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3002 + bits += 8;
3003 + }
3004 + here = codes[dcode + (hold & dmask)];
3005 + dodist: while(true) {
3006 + op = here.bits;
3007 + hold >>>= op;
3008 + bits -= op;
3009 + op = here.op;
3010 + if (op & 16) { /* distance base */
3011 + dist = here.val;
3012 + op &= 15; /* number of extra bits */
3013 + if (bits < op) {
3014 + hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3015 + bits += 8;
3016 + if (bits < op) {
3017 + hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3018 + bits += 8;
3019 + }
3020 + }
3021 + dist += hold & ((1 << op) - 1);
3022 +//NOSPRT #ifdef INFLATE_STRICT
3023 +// if (dist > dmax) {
3024 +// strm->msg = (char *)"invalid distance too far back";
3025 +// state->mode = BAD;
3026 +// break loop;
3027 +// }
3028 +//#endif
3029 + hold >>>= op;
3030 + bits -= op;
3031 +// Tracevv((stderr, "inflate: distance %u\n", dist));
3032 + op = out - beg; /* max distance in output */
3033 + if (dist > op) { /* see if copy from window */
3034 + op = dist - op; /* distance back in window */
3035 + if (op > whave) {
3036 + if (state.sane) {
3037 + strm.msg = 'invalid distance too far back';
3038 + state.mode = BAD;
3039 + break loop;
3040 + }
3041 +//NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
3042 +// if (len <= op - whave) {
3043 +// do {
3044 +// PUP(out) = 0;
3045 +// } while (--len);
3046 +// continue;
3047 +// }
3048 +// len -= op - whave;
3049 +// do {
3050 +// PUP(out) = 0;
3051 +// } while (--op > whave);
3052 +// if (op == 0) {
3053 +// from = out - dist;
3054 +// do {
3055 +// PUP(out) = PUP(from);
3056 +// } while (--len);
3057 +// continue;
3058 +// }
3059 +//#endif
3060 + } // if (op > whave)
3061 +
3062 + from_window_offset = 0;
3063 + from_out_offset = -1;
3064 + if (wnext == 0) { /* very common case */
3065 + from_window_offset += wsize - op;
3066 + if (op < len) { /* some from window */
3067 + len -= op;
3068 + strm.output_data += window.substring(from_window_offset, from_window_offset + op);
3069 + out += op;
3070 + op = 0;
3071 + from_window_offset = -1;
3072 + from_out_offset = out - dist; /* rest from output */
3073 + }
3074 + }
3075 +//NOTREACHED else if (wnext < op) { /* wrap around window */
3076 +//NOTREACHED from += wsize + wnext - op;
3077 +//NOTREACHED op -= wnext;
3078 +//NOTREACHED if (op < len) { /* some from end of window */
3079 +//NOTREACHED len -= op;
3080 +//NOTREACHED do {
3081 +//NOTREACHED PUP(out) = PUP(from);
3082 +//NOTREACHED } while (--op);
3083 +//NOTREACHED from = window - OFF;
3084 +//NOTREACHED if (wnext < len) { /* some from start of window */
3085 +//NOTREACHED op = wnext;
3086 +//NOTREACHED len -= op;
3087 +//NOTREACHED do {
3088 +//NOTREACHED PUP(out) = PUP(from);
3089 +//NOTREACHED } while (--op);
3090 +//NOTREACHED from = out - dist; /* rest from output */
3091 +//NOTREACHED }
3092 +//NOTREACHED }
3093 +//NOTREACHED }
3094 + else { /* contiguous in window */
3095 + from_window_offset += wnext - op;
3096 + if (op < len) { /* some from window */
3097 + len -= op;
3098 + strm.output_data += window.substring(from_window_offset, from_window_offset + op);
3099 + out += op;
3100 + from_window_offset = -1;
3101 + from_out_offset = out - dist; /* rest from output */
3102 + }
3103 + }
3104 + }
3105 + else {
3106 + from_window_offset = -1;
3107 + from_out_offset = out - dist; /* copy direct from output */
3108 + }
3109 +
3110 + if (from_window_offset >= 0) {
3111 + strm.output_data += window.substring(from_window_offset, from_window_offset + len);
3112 + out += len;
3113 + from_window_offset += len;
3114 + } else {
3115 + var len_inner = len;
3116 + if(len_inner > out - from_out_offset)
3117 + len_inner = out - from_out_offset;
3118 + strm.output_data += strm.output_data.substring(
3119 + from_out_offset, from_out_offset + len_inner);
3120 + out += len_inner;
3121 + len -= len_inner;
3122 + from_out_offset += len_inner;
3123 + out += len;
3124 + while (len > 2) {
3125 + strm.output_data += strm.output_data.charAt(from_out_offset++);
3126 + strm.output_data += strm.output_data.charAt(from_out_offset++);
3127 + strm.output_data += strm.output_data.charAt(from_out_offset++);
3128 + len -= 3;
3129 + }
3130 + if (len) {
3131 + strm.output_data += strm.output_data.charAt(from_out_offset++);
3132 + if (len > 1)
3133 + strm.output_data += strm.output_data.charAt(from_out_offset++);
3134 + }
3135 + }
3136 + }
3137 + else if ((op & 64) == 0) { /* 2nd level distance code */
3138 + here = codes[dcode + (here.val + (hold & ((1 << op) - 1)))];
3139 + continue dodist; // goto dodist
3140 + }
3141 + else {
3142 + strm.msg = 'invalid distance code';
3143 + state.mode = BAD;
3144 + break loop;
3145 + }
3146 + break dodist; }
3147 + }
3148 + else if ((op & 64) == 0) { /* 2nd level length code */
3149 + here = codes[lcode + (here.val + (hold & ((1 << op) - 1)))];
3150 + continue dolen; // goto dolen;
3151 + }
3152 + else if (op & 32) { /* end-of-block */
3153 + // Tracevv((stderr, "inflate: end of block\n"));
3154 + state.mode = TYPE;
3155 + break loop;
3156 + }
3157 + else {
3158 + strm.msg = 'invalid literal/length code';
3159 + state.mode = BAD;
3160 + break loop;
3161 + }
3162 + break dolen; }
3163 + } while (next_in < last && out < end);
3164 +
3165 + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
3166 + len = bits >>> 3;
3167 + next_in -= len;
3168 + bits -= len << 3;
3169 + hold &= (1 << bits) - 1;
3170 +
3171 + /* update state and return */
3172 + strm.next_in = next_in;
3173 + strm.next_out = out;
3174 + strm.avail_in = (next_in < last ? 5 + (last - next_in) : 5 - (next_in - last));
3175 + strm.avail_out = (out < end ?
3176 + 257 + (end - out) : 257 - (out - end));
3177 + state.hold = hold;
3178 + state.bits = bits;
3179 +}
3180 +
3181 +function new_array(size)
3182 +{
3183 + var i;
3184 + var ary = new Array(size);
3185 + for(i = 0; i < size; i++)
3186 + ary[i] = 0;
3187 + return ary;
3188 +}
3189 +
3190 +function getarg(opts, name, def_value)
3191 +{
3192 + return (opts && (name in opts)) ? opts[name] : def_value;
3193 +}
3194 +
3195 +function checksum_none()
3196 +{
3197 + return 0;
3198 +}
3199 +
3200 +/**
3201 + * z_stream constructor
3202 + * @constructor
3203 + */
3204 +function inflate_state()
3205 +{
3206 + var i;
3207 +
3208 + this.mode = 0; /* current inflate mode */
3209 + this.last = 0; /* true if processing last block */
3210 + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
3211 + this.havedict = 0; /* true if dictionary provided */
3212 + this.flags = 0; /* gzip header method and flags (0 if zlib) */
3213 + this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
3214 + this.check = 0; /* protected copy of check value */
3215 + this.total = 0; /* protected copy of output count */
3216 + this.head = null; /* where to save gzip header information */
3217 + /* sliding window */
3218 + this.wbits = 0; /* log base 2 of requested window size */
3219 + this.wsize = 0; /* window size or zero if not using window */
3220 + this.whave = 0; /* valid bytes in the window */
3221 + this.wnext = 0; /* window write index (TODO remove) */
3222 + this.window = null; /* allocated sliding window, if needed */
3223 + /* bit accumulator */
3224 + this.hold = 0; /* input bit accumulator */
3225 + this.bits = 0; /* number of bits in "in" */
3226 + /* for string and stored block copying */
3227 + this.length = 0; /* literal or length of data to copy */
3228 + this.offset = 0; /* distance back to copy string from */
3229 + /* for table and code decoding */
3230 + this.extra = 0; /* extra bits needed */
3231 + /* fixed and dynamic code tables */
3232 +
3233 + /* zlib.js: modified implementation: lencode, distcode, next are offset of codes[] */
3234 + this.lencode = 0; /* starting table for length/literal codes */
3235 + this.distcode = 0; /* starting table for distance codes */
3236 + this.lenbits = 0; /* index bits for lencode */
3237 + this.distbits = 0; /* index bits for distcode */
3238 + /* dynamic table building */
3239 + this.ncode = 0; /* number of code length code lengths */
3240 + this.nlen = 0; /* number of length code lengths */
3241 + this.ndist = 0; /* number of distance code lengths */
3242 + this.have = 0; /* number of code lengths in lens[] */
3243 + this.next = 0; /* next available space in codes[] */
3244 + this.lens = new_array(320); /* temporary storage for code lengths */
3245 + this.work = new_array(288); /* work area for code table building */
3246 + this.codes = new Array(ENOUGH); /* space for code tables */
3247 + var c = {op:0, bits:0, val:0};
3248 + for(i = 0; i < ENOUGH; i++)
3249 + this.codes[i] = c;
3250 + this.sane = 0; /* if false, allow invalid distance too far */
3251 + this.back = 0; /* bits back of last unprocessed length/lit */
3252 + this.was = 0; /* initial length of match */
3253 +}
3254 +
3255 +ZLIB.inflateResetKeep = function(strm)
3256 +{
3257 + var state;
3258 +
3259 + if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
3260 + state = strm.state;
3261 + strm.total_in = strm.total_out = state.total = 0;
3262 + strm.msg = null;
3263 + if (state.wrap) { /* to support ill-conceived Java test suite */
3264 + strm.adler = state.wrap & 1;
3265 + }
3266 +
3267 + state.mode = HEAD;
3268 + state.last = 0;
3269 + state.havedict = 0;
3270 + state.dmax = 32768;
3271 + state.head = null;
3272 + state.hold = 0;
3273 + state.bits = 0;
3274 + state.lencode = 0;
3275 + state.distcode = 0;
3276 + state.next = 0;
3277 + state.sane = 1;
3278 + state.back = -1;
3279 + return ZLIB.Z_OK;
3280 +};
3281 +
3282 +// Usage: strm = ZLIB.inflateReset(z_stream [, windowBits]);
3283 +ZLIB.inflateReset = function(strm, windowBits)
3284 +{
3285 + var wrap;
3286 + var state;
3287 +
3288 + /* get the state */
3289 + if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
3290 + state = strm.state;
3291 +
3292 + if(typeof windowBits === "undefined")
3293 + windowBits = DEF_WBITS;
3294 +
3295 + /* extract wrap request from windowBits parameter */
3296 + if (windowBits < 0) {
3297 + wrap = 0;
3298 + windowBits = -windowBits;
3299 + }
3300 + else {
3301 + wrap = (windowBits >>> 4) + 1;
3302 + if (windowBits < 48)
3303 + windowBits &= 15;
3304 + }
3305 +
3306 + if(wrap == 1 && (typeof ZLIB.adler32 === 'function')) {
3307 + strm.checksum_function = ZLIB.adler32;
3308 + } else if(wrap == 2 && (typeof ZLIB.crc32 === 'function')) {
3309 + strm.checksum_function = ZLIB.crc32;
3310 + } else {
3311 + strm.checksum_function = checksum_none;
3312 + }
3313 +
3314 + /* set number of window bits, free window if different */
3315 + if (windowBits && (windowBits < 8 || windowBits > 15))
3316 + return ZLIB.Z_STREAM_ERROR;
3317 + if (state.window && state.wbits != windowBits) {
3318 + state.window = null;
3319 + }
3320 +
3321 + /* update state and reset the rest of it */
3322 + state.wrap = wrap;
3323 + state.wbits = windowBits;
3324 + state.wsize = 0;
3325 + state.whave = 0;
3326 + state.wnext = 0;
3327 + return ZLIB.inflateResetKeep(strm);
3328 +};
3329 +
3330 +// Usage: strm = ZLIB.inflateInit([windowBits]);
3331 +ZLIB.inflateInit = function(windowBits)
3332 +{
3333 + var strm = new ZLIB.z_stream();
3334 + strm.state = new inflate_state();
3335 + ZLIB.inflateReset(strm, windowBits);
3336 + return strm;
3337 +};
3338 +
3339 +ZLIB.inflatePrime = function(strm, bits, value)
3340 +{
3341 + var state;
3342 +
3343 + if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
3344 + state = strm.state;
3345 + if (bits < 0) {
3346 + state.hold = 0;
3347 + state.bits = 0;
3348 + return ZLIB.Z_OK;
3349 + }
3350 + if (bits > 16 || state.bits + bits > 32) return ZLIB.Z_STREAM_ERROR;
3351 + value &= (1 << bits) - 1;
3352 + state.hold += value << state.bits;
3353 + state.bits += bits;
3354 + return ZLIB.Z_OK;
3355 +};
3356 +
3357 +var lenfix_ary = null;
3358 +var distfix_ary = null;
3359 +function fixedtables(state)
3360 +{
3361 + var i;
3362 + if (!lenfix_ary) lenfix_ary = [ { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 192 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 160 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 224 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 144 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 208 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 176 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 240 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 200 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 168 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 232 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 152 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 216 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 184 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 248 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 196 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 164 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 228 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 148 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 }, { op: 0, bits: 9, val: 212 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 180 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 }, { op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 244 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 204 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 172 }, { op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 236 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 }, { op: 0, bits: 9, val: 156 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 220 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 188 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 252 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 194 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 162 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 226 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 146 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 210 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 178 }, { op: 0, bits: 8, val: 9 }, { op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 242 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 202 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 }, { op: 0, bits: 9, val: 170 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 234 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 }, { op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 154 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 218 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 186 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 250 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 198 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 166 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 230 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 150 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 214 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 182 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 246 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 206 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 174 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 238 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 158 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 222 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 190 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 254 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 193 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 161 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 225 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 145 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 209 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 177 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 241 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 201 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 169 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 233 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 153 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 217 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 185 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 249 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 197 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 165 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 229 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 149 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 },{ op: 0, bits: 9, val: 213 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 181 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 },{ op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 245 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 },{ op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 205 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 173 },{ op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 237 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 },{ op: 0, bits: 9, val: 157 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 221 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 189 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 253 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 195 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 163 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 227 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 147 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 211 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 179 }, { op: 0, bits: 8, val: 9 },{ op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 243 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 },{ op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 203 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 },{ op: 0, bits: 9, val: 171 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 235 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 },{ op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 155 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 219 }, { op: 18, bits: 7, val: 23 },{ op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 187 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 251 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 199 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 167 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 231 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 151 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 215 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 183 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 247 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 207 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 175 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 239 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 159 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 223 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 191 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 255 } ];
3363 + if (!distfix_ary) distfix_ary = [ { op: 16, bits: 5, val: 1 }, { op: 23, bits: 5, val: 257 }, { op: 19, bits: 5, val: 17 }, { op: 27, bits: 5, val: 4097 }, { op: 17, bits: 5, val: 5 }, { op: 25, bits: 5, val: 1025 }, { op: 21, bits: 5, val: 65 }, { op: 29, bits: 5, val: 16385 }, { op: 16, bits: 5, val: 3 }, { op: 24, bits: 5, val: 513 }, { op: 20, bits: 5, val: 33 }, { op: 28, bits: 5, val: 8193 }, { op: 18, bits: 5, val: 9 }, { op: 26, bits: 5, val: 2049 }, { op: 22, bits: 5, val: 129 }, { op: 64, bits: 5, val: 0 }, { op: 16, bits: 5, val: 2 }, { op: 23, bits: 5, val: 385 }, { op: 19, bits: 5, val: 25 }, { op: 27, bits: 5, val: 6145 }, { op: 17, bits: 5, val: 7 }, { op: 25, bits: 5, val: 1537 }, { op: 21, bits: 5, val: 97 }, { op: 29, bits: 5, val: 24577 }, { op: 16, bits: 5, val: 4 }, { op: 24, bits: 5, val: 769 }, { op: 20, bits: 5, val: 49 }, { op: 28, bits: 5, val: 12289 }, { op: 18, bits: 5, val: 13 }, { op: 26, bits: 5, val: 3073 }, { op: 22, bits: 5, val: 193 }, { op: 64, bits: 5, val: 0 } ];
3364 + state.lencode = 0;
3365 + state.distcode = 512;
3366 + for (i = 0; i < 512; i++) { state.codes[i] = lenfix_ary[i]; }
3367 + for (i = 0; i < 32; i++) { state.codes[i + 512] = distfix_ary[i]; }
3368 + state.lenbits = 9;
3369 + state.distbits = 5;
3370 +}
3371 +
3372 +/*
3373 + Update the window with the last wsize (normally 32K) bytes written before
3374 + returning. If window does not exist yet, create it. This is only called
3375 + when a window is already in use, or when output has been written during this
3376 + inflate call, but the end of the deflate stream has not been reached yet.
3377 + It is also called to create a window for dictionary data when a dictionary
3378 + is loaded.
3379 +
3380 + Providing output buffers larger than 32K to inflate() should provide a speed
3381 + advantage, since only the last 32K of output is copied to the sliding window
3382 + upon return from inflate(), and since all distances after the first 32K of
3383 + output will fall in the output data, making match copies simpler and faster.
3384 + The advantage may be dependent on the size of the processor's data caches.
3385 +*/
3386 +function updatewindow(strm)
3387 +{
3388 + var state = strm.state;
3389 + var out = strm.output_data.length;
3390 +
3391 + /* if it hasn't been done already, allocate space for the window */
3392 + if (state.window === null) {
3393 + state.window = '';
3394 + }
3395 +
3396 + /* if window not in use yet, initialize */
3397 + if (state.wsize == 0) {
3398 + state.wsize = 1 << state.wbits;
3399 + }
3400 +
3401 + // zlib.js: Sliding window
3402 + if (out >= state.wsize) {
3403 + state.window = strm.output_data.substring(out - state.wsize);
3404 + } else {
3405 + if(state.whave + out < state.wsize) {
3406 + state.window += strm.output_data;
3407 + } else {
3408 + state.window = state.window.substring(state.whave - (state.wsize - out)) + strm.output_data;
3409 + }
3410 + }
3411 + state.whave = state.window.length;
3412 + if(state.whave < state.wsize) {
3413 + state.wnext = state.whave;
3414 + } else {
3415 + state.wnext = 0;
3416 + }
3417 + return 0;
3418 +}
3419 +
3420 +
3421 +// #ifdef GUNZIP
3422 +function CRC2(strm, word)
3423 +{
3424 + var hbuf = [word & 0xff, (word >>> 8) & 0xff];
3425 + strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 2);
3426 +}
3427 +
3428 +function CRC4(strm, word)
3429 +{
3430 + var hbuf = [word & 0xff,
3431 + (word >>> 8) & 0xff,
3432 + (word >>> 16) & 0xff,
3433 + (word >>> 24) & 0xff];
3434 + strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 4);
3435 +}
3436 +
3437 +/* Load registers with state in inflate() for speed */
3438 +function LOAD(strm, s)
3439 +{
3440 + s.strm = strm; /* z_stream */
3441 + s.left = strm.avail_out; /* available output */
3442 + s.next = strm.next_in; /* next input */
3443 + s.have = strm.avail_in; /* available input */
3444 + s.hold = strm.state.hold; /* bit buffer */
3445 + s.bits = strm.state.bits; /* bits in bit buffer */
3446 + return s;
3447 +}
3448 +
3449 +/* Restore state from registers in inflate() */
3450 +function RESTORE(s)
3451 +{
3452 + var strm = s.strm;
3453 + strm.next_in = s.next;
3454 + strm.avail_out = s.left;
3455 + strm.avail_in = s.have;
3456 + strm.state.hold = s.hold;
3457 + strm.state.bits = s.bits;
3458 +}
3459 +
3460 +/* Clear the input bit accumulator */
3461 +function INITBITS(s)
3462 +{
3463 + s.hold = 0;
3464 + s.bits = 0;
3465 +}
3466 +
3467 +/* Get a byte of input into the bit accumulator, or return from inflate()
3468 + if there is no input available. */
3469 +function PULLBYTE(s)
3470 +{
3471 + if (s.have == 0) return false;
3472 + s.have--;
3473 + s.hold += (s.strm.input_data.charCodeAt(s.next++) & 0xff) << s.bits;
3474 + s.bits += 8;
3475 + return true;
3476 +}
3477 +
3478 +/* Assure that there are at least n bits in the bit accumulator. If there is
3479 + not enough available input to do that, then return from inflate(). */
3480 +function NEEDBITS(s, n)
3481 +{
3482 + // if(typeof n != 'number') throw 'ERROR';
3483 + while (s.bits < n) {
3484 + if(!PULLBYTE(s))
3485 + return false;
3486 + }
3487 + return true;
3488 +}
3489 +
3490 +/* Return the low n bits of the bit accumulator (n < 16) */
3491 +function BITS(s, n)
3492 +{
3493 + return s.hold & ((1 << n) - 1);
3494 +}
3495 +
3496 +/* Remove n bits from the bit accumulator */
3497 +function DROPBITS(s, n)
3498 +{
3499 + // if(typeof n != 'number') throw 'ERROR';
3500 + s.hold >>>= n;
3501 + s.bits -= n;
3502 +}
3503 +
3504 +/* Remove zero to seven bits as needed to go to a byte boundary */
3505 +function BYTEBITS(s)
3506 +{
3507 + s.hold >>>= s.bits & 7;
3508 + s.bits -= s.bits & 7;
3509 +}
3510 +
3511 +/* Reverse the bytes in a 32-bit value */
3512 +function REVERSE(q)
3513 +{
3514 + return ((q >>> 24) & 0xff) +
3515 + ((q >>> 8) & 0xff00) +
3516 + ((q & 0xff00) << 8) +
3517 + ((q & 0xff) << 24);
3518 +}
3519 +
3520 +/*
3521 + inflate() uses a state machine to process as much input data and generate as
3522 + much output data as possible before returning. The state machine is
3523 + structured roughly as follows:
3524 +
3525 + for (;;) switch (state) {
3526 + ...
3527 + case STATEn:
3528 + if (not enough input data or output space to make progress)
3529 + return;
3530 + ... make progress ...
3531 + state = STATEm;
3532 + break;
3533 + ...
3534 + }
3535 +
3536 + so when inflate() is called again, the same case is attempted again, and
3537 + if the appropriate resources are provided, the machine proceeds to the
3538 + next state. The NEEDBITS() macro is usually the way the state evaluates
3539 + whether it can proceed or should return. NEEDBITS() does the return if
3540 + the requested bits are not available. The typical use of the BITS macros
3541 + is:
3542 +
3543 + NEEDBITS(n);
3544 + ... do something with BITS(n) ...
3545 + DROPBITS(n);
3546 +
3547 + where NEEDBITS(n) either returns from inflate() if there isn't enough
3548 + input left to load n bits into the accumulator, or it continues. BITS(n)
3549 + gives the low n bits in the accumulator. When done, DROPBITS(n) drops
3550 + the low n bits off the accumulator. INITBITS() clears the accumulator
3551 + and sets the number of available bits to zero. BYTEBITS() discards just
3552 + enough bits to put the accumulator on a byte boundary. After BYTEBITS()
3553 + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
3554 +
3555 + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
3556 + if there is no input available. The decoding of variable length codes uses
3557 + PULLBYTE() directly in order to pull just enough bytes to decode the next
3558 + code, and no more.
3559 +
3560 + Some states loop until they get enough input, making sure that enough
3561 + state information is maintained to continue the loop where it left off
3562 + if NEEDBITS() returns in the loop. For example, want, need, and keep
3563 + would all have to actually be part of the saved state in case NEEDBITS()
3564 + returns:
3565 +
3566 + case STATEw:
3567 + while (want < need) {
3568 + NEEDBITS(n);
3569 + keep[want++] = BITS(n);
3570 + DROPBITS(n);
3571 + }
3572 + state = STATEx;
3573 + case STATEx:
3574 +
3575 + As shown above, if the next state is also the next case, then the break
3576 + is omitted.
3577 +
3578 + A state may also return if there is not enough output space available to
3579 + complete that state. Those states are copying stored data, writing a
3580 + literal byte, and copying a matching string.
3581 +
3582 + When returning, a "goto inf_leave" is used to update the total counters,
3583 + update the check value, and determine whether any progress has been made
3584 + during that inflate() call in order to return the proper return code.
3585 + Progress is defined as a change in either strm->avail_in or strm->avail_out.
3586 + When there is a window, goto inf_leave will update the window with the last
3587 + output written. If a goto inf_leave occurs in the middle of decompression
3588 + and there is no window currently, goto inf_leave will create one and copy
3589 + output to the window for the next call of inflate().
3590 +
3591 + In this implementation, the flush parameter of inflate() only affects the
3592 + return code (per zlib.h). inflate() always writes as much as possible to
3593 + strm->next_out, given the space available and the provided input--the effect
3594 + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
3595 + the allocation of and copying into a sliding window until necessary, which
3596 + provides the effect documented in zlib.h for Z_FINISH when the entire input
3597 + stream available. So the only thing the flush parameter actually does is:
3598 + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
3599 + will return Z_BUF_ERROR if it has not reached the end of the stream.
3600 + */
3601 +
3602 +/* permutation of code lengths */
3603 +var inflate_order = [
3604 + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
3605 +ZLIB.inflate = function(strm, flush)
3606 +{
3607 + var state;
3608 + var s;
3609 + var _in, out; /* save starting available input and output */
3610 + var copy; /* number of stored or match bytes to copy */
3611 + var from_window_offset = -1; /* index of window[] */
3612 + var from_out_offset = -1; /* index of next_out[] */
3613 + var here; /* current decoding table entry */
3614 + var last; /* parent table entry */
3615 + var len; /* length to copy for repeats, bits to drop */
3616 + var ret; /* return code */
3617 +
3618 + if (!strm || !strm.state ||
3619 + (!strm.input_data && strm.avail_in != 0))
3620 + return ZLIB.Z_STREAM_ERROR;
3621 +
3622 + state = strm.state;
3623 + if (state.mode == TYPE) state.mode = TYPEDO; /* skip check */
3624 +
3625 + // LOAD
3626 + s = {};
3627 + LOAD(strm, s);
3628 +
3629 + _in = s.have;
3630 + out = s.left;
3631 + ret = ZLIB.Z_OK;
3632 +inf_leave: for (;;) {
3633 + switch (state.mode) {
3634 + case HEAD:
3635 + if (state.wrap == 0) {
3636 + state.mode = TYPEDO;
3637 + break;
3638 + }
3639 + if(!NEEDBITS(s, 16)) break inf_leave;
3640 +// #ifdef GUNZIP
3641 + if ((state.wrap & 2) && s.hold == 0x8b1f) { /* gzip header */
3642 + state.check = strm.checksum_function(0, null, 0, 0);
3643 + CRC2(strm, s.hold);
3644 + INITBITS(s);
3645 + state.mode = FLAGS;
3646 + break;
3647 + }
3648 + state.flags = 0; /* expect zlib header */
3649 + if (state.head !== null)
3650 + state.head.done = -1;
3651 + if (!(state.wrap & 1) || /* check if zlib header allowed */
3652 +//#else
3653 +// if (
3654 +//#endif
3655 + ((BITS(s, 8) << 8) + (s.hold >>> 8)) % 31) {
3656 + strm.msg = 'incorrect header check';
3657 + state.mode = BAD;
3658 + break;
3659 + }
3660 + if (BITS(s, 4) != ZLIB.Z_DEFLATED) {
3661 + strm.msg = 'unknown compression method';
3662 + state.mode = BAD;
3663 + break;
3664 + }
3665 +
3666 + DROPBITS(s, 4);
3667 + len = BITS(s, 4) + 8;
3668 + if (state.wbits == 0)
3669 + state.wbits = len;
3670 + else if (len > state.wbits) {
3671 + strm.msg = 'invalid window size';
3672 + state.mode = BAD;
3673 + break;
3674 + }
3675 + state.dmax = 1 << len;
3676 +// Tracev((stderr, "inflate: zlib header ok\n"));
3677 + strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
3678 + state.mode = s.hold & 0x200 ? DICTID : TYPE;
3679 + INITBITS(s);
3680 + break;
3681 +// #ifdef GUNZIP
3682 + case FLAGS:
3683 + if(!NEEDBITS(s, 16)) break inf_leave;
3684 + state.flags = s.hold;
3685 + if ((state.flags & 0xff) != ZLIB.Z_DEFLATED) {
3686 + strm.msg = "unknown compression method";
3687 + state.mode = BAD;
3688 + break;
3689 + }
3690 + if (state.flags & 0xe000) {
3691 + strm.msg = "unknown header flags set";
3692 + state.mode = BAD;
3693 + break;
3694 + }
3695 + if (state.head !== null)
3696 + state.head.text = (s.hold >>> 8) & 1;
3697 + if (state.flags & 0x0200) {
3698 + CRC2(strm, s.hold);
3699 + }
3700 + INITBITS(s);
3701 + state.mode = TIME;
3702 + case TIME:
3703 + if(!NEEDBITS(s, 32)) break inf_leave;
3704 + if (state.head !== null)
3705 + state.head.time = s.hold;
3706 + if (state.flags & 0x0200) {
3707 + CRC4(strm, s.hold);
3708 + }
3709 + INITBITS(s);
3710 + state.mode = OS;
3711 + case OS:
3712 + if(!NEEDBITS(s, 16)) break inf_leave;
3713 + if (state.head !== null) {
3714 + state.head.xflags = s.hold & 0xff;
3715 + state.head.os = s.hold >>> 8;
3716 + }
3717 + if (state.flags & 0x0200) {
3718 + CRC2(strm, s.hold);
3719 + }
3720 + INITBITS(s);
3721 + state.mode = EXLEN;
3722 + case EXLEN:
3723 + if (state.flags & 0x0400) {
3724 + if(!NEEDBITS(s, 16)) break inf_leave;
3725 + state.length = s.hold;
3726 + if (state.head !== null) {
3727 + state.head.extra_len = s.hold;
3728 + }
3729 + if (state.flags & 0x0200) {
3730 + CRC2(strm, s.hold);
3731 + }
3732 + INITBITS(s);
3733 + state.head.extra = "";
3734 + }
3735 + else if (state.head !== null) {
3736 + state.head.extra = null;
3737 + }
3738 + state.mode = EXTRA;
3739 + case EXTRA:
3740 + if (state.flags & 0x0400) {
3741 + copy = state.length;
3742 + if (copy > s.have) copy = s.have;
3743 + if (copy) {
3744 + if (state.head !== null &&
3745 + state.head.extra !== null) {
3746 + len = state.head.extra_len - state.length;
3747 +/*
3748 + zmemcpy(state->head->extra + len, next,
3749 + len + copy > state->head->extra_max ?
3750 + state->head->extra_max - len : copy);
3751 +*/
3752 + state.head.extra += strm.input_data.substring(
3753 + s.next, s.next + (len + copy > state.head.extra_max ?
3754 + state.head.extra_max - len : copy));
3755 +
3756 + }
3757 + if (state.flags & 0x0200)
3758 + state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
3759 + s.have -= copy;
3760 + s.next += copy;
3761 + state.length -= copy;
3762 + }
3763 + if (state.length) break inf_leave;
3764 + }
3765 + state.length = 0;
3766 + state.mode = NAME;
3767 + case NAME:
3768 + if (state.flags & 0x0800) {
3769 + if (s.have == 0) break inf_leave;
3770 + if (state.head !== null && state.head.name === null) {
3771 + state.head.name = "";
3772 + }
3773 + copy = 0;
3774 + // TODO end = strm.input_data.indexOf("\0", s.next);
3775 + // TODO state.length => state.head.name.length
3776 + do {
3777 + len = strm.input_data.charAt(s.next + copy); copy++;
3778 + if(len === "\0")
3779 + break;
3780 + if (state.head !== null &&
3781 + state.length < state.head.name_max) {
3782 + state.head.name += len;
3783 + state.length++;
3784 + }
3785 + } while (copy < s.have);
3786 + if (state.flags & 0x0200) {
3787 + state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
3788 + }
3789 + s.have -= copy;
3790 + s.next += copy;
3791 + if (len !== "\0") break inf_leave;
3792 + }
3793 + else if (state.head !== null)
3794 + state.head.name = null;
3795 + state.length = 0;
3796 + state.mode = COMMENT;
3797 + case COMMENT:
3798 + if (state.flags & 0x1000) {
3799 + if (s.have == 0) break inf_leave;
3800 + copy = 0;
3801 + if (state.head !== null && state.head.comment === null) {
3802 + state.head.comment = "";
3803 + }
3804 + // TODO end = strm.input_data.indexOf("\0", s.next);
3805 + // TODO state.length => state.head.comment.length
3806 + do {
3807 + len = strm.input_data.charAt(s.next + copy); copy++;
3808 + if(len === "\0")
3809 + break;
3810 + if (state.head !== null &&
3811 + state.length < state.head.comm_max) {
3812 + state.head.comment += len;
3813 + state.length++;
3814 + }
3815 + } while (copy < s.have);
3816 + if (state.flags & 0x0200)
3817 + state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
3818 + s.have -= copy;
3819 + s.next += copy;
3820 + if (len !== "\0") break inf_leave;
3821 + }
3822 + else if (state.head !== null)
3823 + state.head.comment = null;
3824 + state.mode = HCRC;
3825 + case HCRC:
3826 + if (state.flags & 0x0200) {
3827 + if(!NEEDBITS(s, 16)) break inf_leave;
3828 + if (s.hold != (state.check & 0xffff)) {
3829 + strm.msg = "header crc mismatch";
3830 + state.mode = BAD;
3831 + break;
3832 + }
3833 + INITBITS(s);
3834 + }
3835 + if (state.head !== null) {
3836 + state.head.hcrc = (state.flags >>> 9) & 1;
3837 + state.head.done = 1;
3838 + }
3839 + strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
3840 + state.mode = TYPE;
3841 + break;
3842 +//#endif
3843 + case DICTID:
3844 + if(!NEEDBITS(s, 32)) break inf_leave;
3845 + strm.adler = state.check = REVERSE(s.hold);
3846 + INITBITS(s);
3847 + state.mode = DICT;
3848 + case DICT:
3849 + if (state.havedict == 0) {
3850 + RESTORE(s);
3851 + return ZLIB.Z_NEED_DICT;
3852 + }
3853 + strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
3854 + state.mode = TYPE;
3855 + case TYPE:
3856 + if (flush == ZLIB.Z_BLOCK || flush == ZLIB.Z_TREES) break inf_leave;
3857 + case TYPEDO:
3858 + if (state.last) {
3859 + BYTEBITS(s);
3860 + state.mode = CHECK;
3861 + break;
3862 + }
3863 + if(!NEEDBITS(s, 3)) break inf_leave;
3864 + state.last = BITS(s, 1);
3865 + DROPBITS(s, 1);
3866 + switch (BITS(s, 2)) {
3867 + case 0: /* stored block */
3868 +// Tracev((stderr, "inflate: stored block%s\n",
3869 +// state->last ? " (last)" : ""));
3870 + state.mode = STORED;
3871 + break;
3872 + case 1: /* fixed block */
3873 + fixedtables(state);
3874 +// Tracev((stderr, "inflate: fixed codes block%s\n",
3875 +// state->last ? " (last)" : ""));
3876 + state.mode = LEN_; /* decode codes */
3877 + if (flush == ZLIB.Z_TREES) {
3878 + DROPBITS(s, 2);
3879 + break inf_leave;
3880 + }
3881 + break;
3882 + case 2: /* dynamic block */
3883 +// Tracev((stderr, "inflate: dynamic codes block%s\n",
3884 +// state->last ? " (last)" : ""));
3885 + state.mode = TABLE;
3886 + break;
3887 + case 3:
3888 + strm.msg = 'invalid block type';
3889 + state.mode = BAD;
3890 + }
3891 + DROPBITS(s, 2);
3892 + break;
3893 + case STORED:
3894 + BYTEBITS(s); /* go to byte boundary */
3895 + if(!NEEDBITS(s, 32)) break inf_leave;
3896 + if ((s.hold & 0xffff) != (((s.hold >>> 16) & 0xffff) ^ 0xffff)) {
3897 + strm.msg = 'invalid stored block lengths';
3898 + state.mode = BAD;
3899 + break;
3900 + }
3901 + state.length = s.hold & 0xffff;
3902 +// Tracev((stderr, "inflate: stored length %u\n",
3903 +// state->length));
3904 + INITBITS(s);
3905 + state.mode = COPY_;
3906 + if (flush == ZLIB.Z_TREES) break inf_leave;
3907 + case COPY_:
3908 + state.mode = COPY;
3909 + case COPY:
3910 + copy = state.length;
3911 + if (copy) {
3912 + if (copy > s.have) copy = s.have;
3913 + if (copy > s.left) copy = s.left;
3914 + if (copy == 0) break inf_leave;
3915 + strm.output_data += strm.input_data.substring(s.next, s.next + copy);
3916 + strm.next_out += copy;
3917 + s.have -= copy;
3918 + s.next += copy;
3919 + s.left -= copy;
3920 + state.length -= copy;
3921 + break;
3922 + }
3923 +// Tracev((stderr, "inflate: stored end\n"));
3924 + state.mode = TYPE;
3925 + break;
3926 + case TABLE:
3927 + if(!NEEDBITS(s, 14)) break inf_leave;
3928 + state.nlen = BITS(s, 5) + 257;
3929 + DROPBITS(s, 5);
3930 + state.ndist = BITS(s, 5) + 1;
3931 + DROPBITS(s, 5);
3932 + state.ncode = BITS(s, 4) + 4;
3933 + DROPBITS(s, 4);
3934 +//#ifndef PKZIP_BUG_WORKAROUND
3935 + if (state.nlen > 286 || state.ndist > 30) {
3936 + strm.msg = 'too many length or distance symbols';
3937 + state.mode = BAD;
3938 + break;
3939 + }
3940 +//#endif
3941 +// Tracev((stderr, "inflate: table sizes ok\n"));
3942 + state.have = 0;
3943 + state.mode = LENLENS;
3944 + case LENLENS:
3945 + while (state.have < state.ncode) {
3946 + if(!NEEDBITS(s, 3)) break inf_leave;
3947 + var tmp = BITS(s, 3);
3948 + state.lens[inflate_order[state.have++]] = tmp;
3949 + DROPBITS(s, 3);
3950 + }
3951 + while (state.have < 19)
3952 + state.lens[inflate_order[state.have++]] = 0;
3953 + state.next = 0;
3954 + state.lencode = 0;
3955 + state.lenbits = 7;
3956 +
3957 +// ret = inflate_table(CODES, state->lens, 19, &(state->next),
3958 +// &(state->lenbits), state->work);
3959 + ret = inflate_table(state, CODES);
3960 +
3961 + if (ret) {
3962 + strm.msg = 'invalid code lengths set';
3963 + state.mode = BAD;
3964 + break;
3965 + }
3966 +// Tracev((stderr, "inflate: code lengths ok\n"));
3967 + state.have = 0;
3968 + state.mode = CODELENS;
3969 + case CODELENS:
3970 + while (state.have < state.nlen + state.ndist) {
3971 + for (;;) {
3972 + here = state.codes[state.lencode + BITS(s, state.lenbits)];
3973 + if (here.bits <= s.bits) break;
3974 + if(!PULLBYTE(s)) break inf_leave;
3975 + }
3976 + if (here.val < 16) {
3977 + DROPBITS(s, here.bits);
3978 + state.lens[state.have++] = here.val;
3979 + }
3980 + else {
3981 + if (here.val == 16) {
3982 + if(!NEEDBITS(s, here.bits + 2)) break inf_leave;
3983 + DROPBITS(s, here.bits);
3984 + if (state.have == 0) {
3985 + strm.msg = 'invalid bit length repeat';
3986 + state.mode = BAD;
3987 + break;
3988 + }
3989 + len = state.lens[state.have - 1];
3990 + copy = 3 + BITS(s, 2);
3991 + DROPBITS(s, 2);
3992 + }
3993 + else if (here.val == 17) {
3994 + if(!NEEDBITS(s, here.bits + 3)) break inf_leave;
3995 + DROPBITS(s, here.bits);
3996 + len = 0;
3997 + copy = 3 + BITS(s, 3);
3998 + DROPBITS(s, 3);
3999 + }
4000 + else {
4001 + if(!NEEDBITS(s, here.bits + 7)) break inf_leave;
4002 + DROPBITS(s, here.bits);
4003 + len = 0;
4004 + copy = 11 + BITS(s, 7);
4005 + DROPBITS(s, 7);
4006 + }
4007 + if (state.have + copy > state.nlen + state.ndist) {
4008 + strm.msg = 'invalid bit length repeat';
4009 + state.mode = BAD;
4010 + break;
4011 + }
4012 + while (copy--)
4013 + state.lens[state.have++] = len;
4014 + }
4015 + }
4016 +
4017 + /* handle error breaks in while */
4018 + if (state.mode == BAD) break;
4019 +
4020 + /* check for end-of-block code (better have one) */
4021 + if (state.lens[256] == 0) {
4022 + strm.msg = 'invalid code -- missing end-of-block';
4023 + state.mode = BAD;
4024 + break;
4025 + }
4026 +
4027 + /* build code tables -- note: do not change the lenbits or distbits
4028 + values here (9 and 6) without reading the comments in inftrees.h
4029 + concerning the ENOUGH constants, which depend on those values */
4030 + state.next = 0;
4031 + state.lencode = state.next;
4032 + state.lenbits = 9;
4033 +// ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
4034 +// &(state->lenbits), state->work);
4035 + ret = inflate_table(state, LENS);
4036 + if (ret) {
4037 + strm.msg = 'invalid literal/lengths set';
4038 + state.mode = BAD;
4039 + break;
4040 + }
4041 + state.distcode = state.next;
4042 + state.distbits = 6;
4043 +// ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next),
4044 +// &(state->distbits), state->work);
4045 + ret = inflate_table(state, DISTS);
4046 + if (ret) {
4047 + strm.msg = 'invalid distances set';
4048 + state.mode = BAD;
4049 + break;
4050 + }
4051 +// Tracev((stderr, "inflate: codes ok\n"));
4052 + state.mode = LEN_;
4053 + if (flush == ZLIB.Z_TREES) break inf_leave;
4054 + case LEN_:
4055 + state.mode = LEN;
4056 + case LEN:
4057 + if (s.have >= 6 && s.left >= 258) {
4058 + RESTORE(s);
4059 + inflate_fast(strm, out);
4060 + LOAD(strm, s);
4061 + if (state.mode == TYPE)
4062 + state.back = -1;
4063 + break;
4064 + }
4065 + state.back = 0;
4066 + for (;;) {
4067 + here = state.codes[state.lencode + BITS(s, state.lenbits)];
4068 + if (here.bits <= s.bits) break;
4069 + if(!PULLBYTE(s)) break inf_leave;
4070 + }
4071 + if (here.op && (here.op & 0xf0) == 0) {
4072 + last = here;
4073 + for (;;) {
4074 + here = state.codes[state.lencode + last.val +
4075 + (BITS(s, last.bits + last.op) >>> last.bits)];
4076 + if (last.bits + here.bits <= s.bits) break;
4077 + if(!PULLBYTE(s)) break inf_leave;
4078 + }
4079 + DROPBITS(s, last.bits);
4080 + state.back += last.bits;
4081 + }
4082 + DROPBITS(s, here.bits);
4083 + state.back += here.bits;
4084 + state.length = here.val;
4085 + if (here.op == 0) {
4086 +// Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
4087 +// "inflate: literal '%c'\n" :
4088 +// "inflate: literal 0x%02x\n", here.val));
4089 + state.mode = LIT;
4090 + break;
4091 + }
4092 + if (here.op & 32) {
4093 +// Tracevv((stderr, "inflate: end of block\n"));
4094 + state.back = -1;
4095 + state.mode = TYPE;
4096 + break;
4097 + }
4098 + if (here.op & 64) {
4099 + strm.msg = 'invalid literal/length code';
4100 + state.mode = BAD;
4101 + break;
4102 + }
4103 + state.extra = here.op & 15;
4104 + state.mode = LENEXT;
4105 + case LENEXT:
4106 + if (state.extra) {
4107 + if(!NEEDBITS(s, state.extra)) break inf_leave;
4108 + state.length += BITS(s, state.extra);
4109 + DROPBITS(s, state.extra);
4110 + state.back += state.extra;
4111 + }
4112 + //Tracevv((stderr, "inflate: length %u\n", state->length));
4113 + state.was = state.length;
4114 + state.mode = DIST;
4115 + case DIST:
4116 + for (;;) {
4117 + here = state.codes[state.distcode + BITS(s, state.distbits)];
4118 + if (here.bits <= s.bits) break;
4119 + if(!PULLBYTE(s)) break inf_leave;
4120 + }
4121 + if ((here.op & 0xf0) == 0) {
4122 + last = here;
4123 + for (;;) {
4124 + here = state.codes[state.distcode + last.val +
4125 + (BITS(s, last.bits + last.op) >>> last.bits)];
4126 + if ((last.bits + here.bits) <= s.bits) break;
4127 + if(!PULLBYTE(s)) break inf_leave;
4128 + }
4129 + DROPBITS(s, last.bits);
4130 + state.back += last.bits;
4131 + }
4132 + DROPBITS(s, here.bits);
4133 + state.back += here.bits;
4134 + if (here.op & 64) {
4135 + strm.msg = 'invalid distance code';
4136 + state.mode = BAD;
4137 + break;
4138 + }
4139 + state.offset = here.val;
4140 + state.extra = here.op & 15;
4141 + state.mode = DISTEXT;
4142 + case DISTEXT:
4143 + if (state.extra) {
4144 + if(!NEEDBITS(s, state.extra)) break inf_leave;
4145 + state.offset += BITS(s, state.extra);
4146 + DROPBITS(s, state.extra);
4147 + state.back += state.extra;
4148 + }
4149 +//NOSPRT #ifdef INFLATE_STRICT
4150 +// if (state->offset > state->dmax) {
4151 +// strm->msg = (char *)"invalid distance too far back";
4152 +// state->mode = BAD;
4153 +// break;
4154 +// }
4155 +//#endif
4156 +// Tracevv((stderr, "inflate: distance %u\n", state->offset));
4157 + state.mode = MATCH;
4158 + case MATCH:
4159 + if (s.left == 0) break inf_leave;
4160 + copy = out - s.left;
4161 + if (state.offset > copy) { /* copy from window */
4162 + copy = state.offset - copy;
4163 + if (copy > state.whave) {
4164 + if (state.sane) {
4165 + strm.msg = 'invalid distance too far back';
4166 + state.mode = BAD;
4167 + break;
4168 + }
4169 +//NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
4170 +// Trace((stderr, "inflate.c too far\n"));
4171 +// copy -= state->whave;
4172 +// if (copy > state->length) copy = state->length;
4173 +// if (copy > left) copy = left;
4174 +// left -= copy;
4175 +// state->length -= copy;
4176 +// do {
4177 +// *put++ = 0;
4178 +// } while (--copy);
4179 +// if (state->length == 0) state->mode = LEN;
4180 +// break;
4181 +//#endif
4182 + }
4183 + if (copy > state.wnext) {
4184 + copy -= state.wnext;
4185 + // from = state->window + (state->wsize - copy);
4186 + from_window_offset = state.wsize - copy;
4187 + from_out_offset = -1;
4188 + }
4189 + else {
4190 + // from = state->window + (state->wnext - copy);
4191 + from_window_offset = state.wnext - copy;
4192 + from_out_offset = -1;
4193 + }
4194 + if (copy > state.length) copy = state.length;
4195 + }
4196 + else { /* copy from output */
4197 + // from = put - state->offset;
4198 + from_window_offset = -1;
4199 + from_out_offset = strm.next_out - state.offset;
4200 + copy = state.length;
4201 + }
4202 + if (copy > s.left) copy = s.left;
4203 + s.left -= copy;
4204 + state.length -= copy;
4205 + if( from_window_offset >= 0 ) {
4206 + strm.output_data += state.window.substring(from_window_offset, from_window_offset + copy);
4207 + strm.next_out += copy;
4208 + copy = 0;
4209 + } else {
4210 + strm.next_out += copy;
4211 + do {
4212 + strm.output_data += strm.output_data.charAt(from_out_offset++);
4213 + } while (--copy);
4214 + }
4215 + if (state.length == 0) state.mode = LEN;
4216 + break;
4217 + case LIT:
4218 + if (s.left == 0) break inf_leave;
4219 +
4220 + strm.output_data += String.fromCharCode(state.length);
4221 + strm.next_out++;
4222 + //*put++ = (unsigned char)(state->length);
4223 +
4224 + s.left--;
4225 + state.mode = LEN;
4226 + break;
4227 + case CHECK:
4228 + if (state.wrap) {
4229 + if(!NEEDBITS(s, 32)) break inf_leave;
4230 + out -= s.left;
4231 + strm.total_out += out;
4232 + state.total += out;
4233 + if (out)
4234 + strm.adler = state.check =
4235 + strm.checksum_function(state.check, strm.output_data, strm.output_data.length - out, out);
4236 + out = s.left;
4237 + if ((
4238 +// #ifdef GUNZIP
4239 + state.flags ? s.hold :
4240 +//#endif
4241 + REVERSE(s.hold)) != state.check) {
4242 + strm.msg = "incorrect data check";
4243 + state.mode = BAD;
4244 + break;
4245 + }
4246 + INITBITS(s);
4247 +//debug("## inflate: check matches trailer\n");
4248 +// Tracev((stderr, "inflate: check matches trailer\n"));
4249 + }
4250 +//#ifdef GUNZIP
4251 + state.mode = LENGTH;
4252 + case LENGTH:
4253 + if (state.wrap && state.flags) {
4254 + if(!NEEDBITS(s, 32)) break inf_leave;
4255 + if (s.hold != (state.total & 0xffffffff)) {
4256 + strm.msg = 'incorrect length check';
4257 + state.mode = BAD;
4258 + break;
4259 + }
4260 + INITBITS(s);
4261 + //Tracev((stderr, "inflate: length matches trailer\n"));
4262 + }
4263 +//#endif
4264 + state.mode = DONE;
4265 + case DONE:
4266 + ret = ZLIB.Z_STREAM_END;
4267 + break inf_leave;
4268 + case BAD:
4269 + ret = ZLIB.Z_DATA_ERROR;
4270 + break inf_leave;
4271 + case MEM:
4272 + return ZLIB.Z_MEM_ERROR;
4273 + case SYNC:
4274 + default:
4275 + return ZLIB.Z_STREAM_ERROR;
4276 + } }
4277 +
4278 + /*
4279 + Return from inflate(), updating the total counts and the check value.
4280 + If there was no progress during the inflate() call, return a buffer
4281 + error. Call updatewindow() to create and/or update the window state.
4282 + Note: a memory error from inflate() is non-recoverable.
4283 + */
4284 +inf_leave:
4285 + RESTORE(s);
4286 + if (state.wsize || (out != strm.avail_out && state.mode < BAD &&
4287 + (state.mode < CHECK || flush != ZLIB.Z_FINISH)))
4288 + if (updatewindow(strm)) {
4289 + state.mode = MEM;
4290 + return ZLIB.Z_MEM_ERROR;
4291 + }
4292 + _in -= strm.avail_in;
4293 + out -= strm.avail_out;
4294 + strm.total_in += _in;
4295 + strm.total_out += out;
4296 + state.total += out;
4297 + if (state.wrap && out)
4298 + strm.adler = state.check = strm.checksum_function(state.check, strm.output_data, 0, strm.output_data.length);
4299 + strm.data_type = state.bits + (state.last ? 64 : 0) +
4300 + (state.mode == TYPE ? 128 : 0) +
4301 + (state.mode == LEN_ || state.mode == COPY_ ? 256 : 0);
4302 + if (((_in == 0 && out == 0) || flush == ZLIB.Z_FINISH) && ret == ZLIB.Z_OK)
4303 + ret = ZLIB.Z_BUF_ERROR;
4304 + return ret;
4305 +};
4306 +
4307 +ZLIB.inflateEnd = function(strm)
4308 +{
4309 + var state;
4310 + if (!strm || !strm.state )
4311 + return ZLIB.Z_STREAM_ERROR;
4312 + state = strm.state;
4313 + state.window = null;
4314 + strm.state = null;
4315 + // Tracev((stderr, "inflate: end\n"));
4316 + return ZLIB.Z_OK;
4317 +};
4318 +
4319 +ZLIB.z_stream.prototype.inflate = function(input_string, opts)
4320 +{
4321 + var flush;
4322 + var avail_out;
4323 + var DEFAULT_BUFFER_SIZE = 16384;
4324 +
4325 + this.input_data = input_string;
4326 + this.next_in = getarg(opts, 'next_in', 0);
4327 + this.avail_in = getarg(opts, 'avail_in', input_string.length - this.next_in);
4328 +
4329 + flush = getarg(opts, 'flush', ZLIB.Z_SYNC_FLUSH);
4330 + avail_out = getarg(opts, 'avail_out', -1);
4331 +
4332 + var result = '';
4333 + do {
4334 + this.avail_out = (avail_out >= 0 ? avail_out : DEFAULT_BUFFER_SIZE);
4335 + this.output_data = '';
4336 + this.next_out = 0;
4337 + this.error = ZLIB.inflate(this, flush);
4338 + if(avail_out >= 0) {
4339 + return this.output_data;
4340 + }
4341 + result += this.output_data;
4342 + if(this.avail_out > 0) {
4343 + break;
4344 + }
4345 + } while(this.error == ZLIB.Z_OK);
4346 +
4347 + return result;
4348 +};
4349 +
4350 +ZLIB.z_stream.prototype.inflateReset = function(windowBits)
4351 +{
4352 + return ZLIB.inflateReset(this, windowBits);
4353 +};
4354 +
4355 +}());
4356 +/* zlib-adler32.js -- JavaScript implementation for the zlib adler32.
4357 + Version: 0.2.0
4358 + LastModified: Apr 12 2012
4359 + Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
4360 +
4361 + API documentation
4362 +==============================================================================
4363 +Usage: adler = ZLIB.adler32(adler, buf, offset, len);
4364 +
4365 + Update a running Adler-32 checksum with the bytes buf[offset..offset+len-1] and
4366 + return the updated checksum. If buf is null, this function returns the
4367 + required initial value for the checksum.
4368 +
4369 + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
4370 + much faster.
4371 +
4372 + Usage example:
4373 +
4374 + var adler = ZLIB.adler32(0, null, 0, 0);
4375 +
4376 + while (read_buffer(buffer, length) != EOF) {
4377 + adler = ZLIB.adler32(adler, buffer, 0, length);
4378 + }
4379 + if (adler != original_adler) error();
4380 +
4381 +==============================================================================
4382 +Usage: adler = ZLIB.adler32_combine(adler1, adler2, len2);
4383 +
4384 + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
4385 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
4386 + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
4387 + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
4388 + that the z_off_t type (like off_t) is a signed integer. If len2 is
4389 + negative, the result has no meaning or utility.
4390 +*/
4391 +
4392 +if( typeof ZLIB === 'undefined' ) {
4393 + alert('ZLIB is not defined. SRC zlib.js before zlib-adler32.js')
4394 +}
4395 +
4396 +(function() {
4397 +
4398 +/* adler32.c -- compute the Adler-32 checksum of a data stream
4399 + * Copyright (C) 1995-2011 Mark Adler
4400 + * For conditions of distribution and use, see copyright notice in zlib.h
4401 + */
4402 +
4403 +var BASE = 65521; /* largest prime smaller than 65536 */
4404 +var NMAX = 5552;
4405 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
4406 +
4407 +/* ========================================================================= */
4408 +function adler32_string(adler, buf, offset, len)
4409 +{
4410 + var sum2;
4411 + var n;
4412 +
4413 + /* split Adler-32 into component sums */
4414 + sum2 = (adler >>> 16) & 0xffff;
4415 + adler &= 0xffff;
4416 +
4417 + /* in case user likes doing a byte at a time, keep it fast */
4418 + if (len == 1) {
4419 + adler += buf.charCodeAt(offset) & 0xff;
4420 + if (adler >= BASE)
4421 + adler -= BASE;
4422 + sum2 += adler;
4423 + if (sum2 >= BASE)
4424 + sum2 -= BASE;
4425 + return adler | (sum2 << 16);
4426 + }
4427 +
4428 + /* initial Adler-32 value (deferred check for len == 1 speed) */
4429 + if (buf === null)
4430 + return 1;
4431 +
4432 + /* in case short lengths are provided, keep it somewhat fast */
4433 + if (len < 16) {
4434 + while (len--) {
4435 + adler += buf.charCodeAt(offset++) & 0xff;
4436 + sum2 += adler;
4437 + }
4438 + if (adler >= BASE)
4439 + adler -= BASE;
4440 + sum2 %= BASE; /* only added so many BASE's */
4441 + return adler | (sum2 << 16);
4442 + }
4443 +
4444 + /* do length NMAX blocks -- requires just one modulo operation */
4445 + while (len >= NMAX) {
4446 + len -= NMAX;
4447 + n = NMAX >> 4; /* NMAX is divisible by 16 */
4448 + do {
4449 + /* 16 sums unrolled */
4450 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4451 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4452 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4453 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4454 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4455 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4456 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4457 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4458 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4459 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4460 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4461 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4462 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4463 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4464 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4465 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4466 + } while (--n);
4467 + adler %= BASE;
4468 + sum2 %= BASE;
4469 + }
4470 +
4471 + /* do remaining bytes (less than NMAX, still just one modulo) */
4472 + if (len) { /* avoid modulos if none remaining */
4473 + while (len >= 16) {
4474 + len -= 16;
4475 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4476 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4477 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4478 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4479 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4480 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4481 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4482 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4483 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4484 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4485 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4486 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4487 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4488 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4489 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4490 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4491 + }
4492 + while (len--) {
4493 + adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4494 + }
4495 + adler %= BASE;
4496 + sum2 %= BASE;
4497 + }
4498 +
4499 + /* return recombined sums */
4500 + return adler | (sum2 << 16);
4501 +}
4502 +
4503 +/* ========================================================================= */
4504 +function adler32_array(adler, buf, offset, len)
4505 +{
4506 + var sum2;
4507 + var n;
4508 +
4509 + /* split Adler-32 into component sums */
4510 + sum2 = (adler >>> 16) & 0xffff;
4511 + adler &= 0xffff;
4512 +
4513 + /* in case user likes doing a byte at a time, keep it fast */
4514 + if (len == 1) {
4515 + adler += buf[offset];
4516 + if (adler >= BASE)
4517 + adler -= BASE;
4518 + sum2 += adler;
4519 + if (sum2 >= BASE)
4520 + sum2 -= BASE;
4521 + return adler | (sum2 << 16);
4522 + }
4523 +
4524 + /* initial Adler-32 value (deferred check for len == 1 speed) */
4525 + if (buf === null)
4526 + return 1;
4527 +
4528 + /* in case short lengths are provided, keep it somewhat fast */
4529 + if (len < 16) {
4530 + while (len--) {
4531 + adler += buf[offset++];
4532 + sum2 += adler;
4533 + }
4534 + if (adler >= BASE)
4535 + adler -= BASE;
4536 + sum2 %= BASE; /* only added so many BASE's */
4537 + return adler | (sum2 << 16);
4538 + }
4539 +
4540 + /* do length NMAX blocks -- requires just one modulo operation */
4541 + while (len >= NMAX) {
4542 + len -= NMAX;
4543 + n = NMAX >> 4; /* NMAX is divisible by 16 */
4544 + do {
4545 + /* 16 sums unrolled */
4546 + adler += buf[offset++]; sum2 += adler;
4547 + adler += buf[offset++]; sum2 += adler;
4548 + adler += buf[offset++]; sum2 += adler;
4549 + adler += buf[offset++]; sum2 += adler;
4550 + adler += buf[offset++]; sum2 += adler;
4551 + adler += buf[offset++]; sum2 += adler;
4552 + adler += buf[offset++]; sum2 += adler;
4553 + adler += buf[offset++]; sum2 += adler;
4554 + adler += buf[offset++]; sum2 += adler;
4555 + adler += buf[offset++]; sum2 += adler;
4556 + adler += buf[offset++]; sum2 += adler;
4557 + adler += buf[offset++]; sum2 += adler;
4558 + adler += buf[offset++]; sum2 += adler;
4559 + adler += buf[offset++]; sum2 += adler;
4560 + adler += buf[offset++]; sum2 += adler;
4561 + adler += buf[offset++]; sum2 += adler;
4562 + } while (--n);
4563 + adler %= BASE;
4564 + sum2 %= BASE;
4565 + }
4566 +
4567 + /* do remaining bytes (less than NMAX, still just one modulo) */
4568 + if (len) { /* avoid modulos if none remaining */
4569 + while (len >= 16) {
4570 + len -= 16;
4571 + adler += buf[offset++]; sum2 += adler;
4572 + adler += buf[offset++]; sum2 += adler;
4573 + adler += buf[offset++]; sum2 += adler;
4574 + adler += buf[offset++]; sum2 += adler;
4575 + adler += buf[offset++]; sum2 += adler;
4576 + adler += buf[offset++]; sum2 += adler;
4577 + adler += buf[offset++]; sum2 += adler;
4578 + adler += buf[offset++]; sum2 += adler;
4579 + adler += buf[offset++]; sum2 += adler;
4580 + adler += buf[offset++]; sum2 += adler;
4581 + adler += buf[offset++]; sum2 += adler;
4582 + adler += buf[offset++]; sum2 += adler;
4583 + adler += buf[offset++]; sum2 += adler;
4584 + adler += buf[offset++]; sum2 += adler;
4585 + adler += buf[offset++]; sum2 += adler;
4586 + adler += buf[offset++]; sum2 += adler;
4587 + }
4588 + while (len--) {
4589 + adler += buf[offset++]; sum2 += adler;
4590 + }
4591 + adler %= BASE;
4592 + sum2 %= BASE;
4593 + }
4594 +
4595 + /* return recombined sums */
4596 + return adler | (sum2 << 16);
4597 +}
4598 +
4599 +/* ========================================================================= */
4600 +ZLIB.adler32 = function(adler, buf, offset, len)
4601 +{
4602 + if(typeof buf === 'string') {
4603 + return adler32_string(adler, buf, offset, len);
4604 + } else {
4605 + return adler32_array(adler, buf, offset, len);
4606 + }
4607 +};
4608 +
4609 +ZLIB.adler32_combine = function(adler1, adler2, len2)
4610 +{
4611 + var sum1;
4612 + var sum2;
4613 + var rem;
4614 +
4615 + /* for negative len, return invalid adler32 as a clue for debugging */
4616 + if (len2 < 0)
4617 + return 0xffffffff;
4618 +
4619 + /* the derivation of this formula is left as an exercise for the reader */
4620 + len2 %= BASE; /* assumes len2 >= 0 */
4621 + rem = len2;
4622 + sum1 = adler1 & 0xffff;
4623 + sum2 = rem * sum1;
4624 + sum2 %= BASE;
4625 + sum1 += (adler2 & 0xffff) + BASE - 1;
4626 + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
4627 + if (sum1 >= BASE) sum1 -= BASE;
4628 + if (sum1 >= BASE) sum1 -= BASE;
4629 + if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
4630 + if (sum2 >= BASE) sum2 -= BASE;
4631 + return sum1 | (sum2 << 16);
4632 +}
4633 +
4634 +}());
4635 +/* zlib-adler32.js -- JavaScript implementation for the zlib crc32.
4636 + Version: 0.2.0
4637 + LastModified: Apr 12 2012
4638 + Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
4639 +
4640 + API documentation
4641 +==============================================================================
4642 +Usage: crc = ZLIB.crc32(crc, buf, offset, len);
4643 +
4644 + Update a running CRC-32 with the bytes buf[offset..offset+len-1] and return the
4645 + updated CRC-32. If buf is null, this function returns the required
4646 + initial value for the for the crc. Pre- and post-conditioning (one's
4647 + complement) is performed within this function so it shouldn't be done by the
4648 + application.
4649 +
4650 + Usage example:
4651 +
4652 + var crc = ZLIB.crc32(0, null, 0, 0);
4653 +
4654 + while (read_buffer(buffer, length) != EOF) {
4655 + crc = ZLIB.crc32(crc, buffer, 0, length);
4656 + }
4657 + if (crc != original_crc) error();
4658 +
4659 +==============================================================================
4660 +Usage: crc = crc32_combine(crc1, crc2, len2);
4661 +
4662 + Combine two CRC-32 check values into one. For two sequences of bytes,
4663 + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
4664 + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
4665 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
4666 + len2.
4667 +*/
4668 +
4669 +if( typeof ZLIB === 'undefined' ) {
4670 + alert('ZLIB is not defined. SRC zlib.js before zlib-crc32.js')
4671 +}
4672 +
4673 +(function() {
4674 +
4675 +/* crc32.c -- compute the CRC-32 of a data stream
4676 + * Copyright (C) 1995-2006, 2010, 2011 Mark Adler
4677 + * For conditions of distribution and use, see copyright notice in zlib.h
4678 + *
4679 + * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
4680 + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
4681 + * tables for updating the shift register in one step with three exclusive-ors
4682 + * instead of four steps with four exclusive-ors. This results in about a
4683 + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
4684 + */
4685 +
4686 +var crc_table = [
4687 + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
4688 + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
4689 + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
4690 + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
4691 + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
4692 + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
4693 + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
4694 + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
4695 + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
4696 + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
4697 + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
4698 + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
4699 + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
4700 + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
4701 + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
4702 + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
4703 + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
4704 + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
4705 + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
4706 + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
4707 + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
4708 + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
4709 + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
4710 + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
4711 + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
4712 + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
4713 + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
4714 + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
4715 + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
4716 + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
4717 + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
4718 + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
4719 + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
4720 + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
4721 + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
4722 + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
4723 + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
4724 + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
4725 + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
4726 + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
4727 + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
4728 + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
4729 + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
4730 + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
4731 + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
4732 + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
4733 + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
4734 + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
4735 + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
4736 + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
4737 + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
4738 + 0x2d02ef8d ];
4739 +
4740 +/* ========================================================================= */
4741 +function crc32_string(crc, buf, offset, len)
4742 +{
4743 + if (buf == null) return 0;
4744 +
4745 + crc = crc ^ 0xffffffff;
4746 + while (len >= 8) {
4747 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4748 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4749 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4750 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4751 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4752 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4753 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4754 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4755 + len -= 8;
4756 + }
4757 + if (len) do {
4758 + crc = crc_table[(crc ^ buf.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8)
4759 + } while (--len);
4760 + return crc ^ 0xffffffff;
4761 +}
4762 +
4763 +/* ========================================================================= */
4764 +function crc32_array(crc, buf, offset, len)
4765 +{
4766 + if (buf == null) return 0;
4767 +
4768 + crc = crc ^ 0xffffffff;
4769 + while (len >= 8) {
4770 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4771 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4772 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4773 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4774 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4775 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4776 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4777 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4778 + len -= 8;
4779 + }
4780 + if (len) do {
4781 + crc = crc_table[(crc ^ buf[offset++]) & 0xff] ^ (crc >>> 8)
4782 + } while (--len);
4783 + return crc ^ 0xffffffff;
4784 +}
4785 +
4786 +/* ========================================================================= */
4787 +ZLIB.crc32 = function(crc, buf, offset, len)
4788 +{
4789 + if(typeof buf === 'string') {
4790 + return crc32_string(crc, buf, offset, len);
4791 + } else {
4792 + return crc32_array(crc, buf, offset, len);
4793 + }
4794 +};
4795 +
4796 +/* ========================================================================= */
4797 +var GF2_DIM = 32; /* dimension of GF(2) vectors (length of CRC) */
4798 +
4799 +/* ========================================================================= */
4800 +function gf2_matrix_times(mat, vec)
4801 +{
4802 + var sum;
4803 + var mat_i = 0;
4804 +
4805 + sum = 0;
4806 + while (vec) {
4807 + if (vec & 1)
4808 + sum ^= mat[mat_i];
4809 + vec >>= 1;
4810 + mat_i++;
4811 + }
4812 + return sum;
4813 +}
4814 +
4815 +/* ========================================================================= */
4816 +function gf2_matrix_square(square, mat)
4817 +{
4818 + var n;
4819 +
4820 + for (n = 0; n < GF2_DIM; n++)
4821 + square[n] = gf2_matrix_times(mat, mat[n]);
4822 +}
4823 +
4824 +/* ========================================================================= */
4825 +ZLIB.crc32_combine = function(crc1, crc2, len2)
4826 +{
4827 + var n;
4828 + var row;
4829 + var even; /* even-power-of-two zeros operator */
4830 + var odd; /* odd-power-of-two zeros operator */
4831 +
4832 + /* degenerate case (also disallow negative lengths) */
4833 + if (len2 <= 0)
4834 + return crc1;
4835 +
4836 + even = new Array(GF2_DIM);
4837 + odd = new Array(GF2_DIM);
4838 +
4839 + /* put operator for one zero bit in odd */
4840 + odd[0] = 0xedb88320; /* CRC-32 polynomial */
4841 + row = 1;
4842 + for (n = 1; n < GF2_DIM; n++) {
4843 + odd[n] = row;
4844 + row <<= 1;
4845 + }
4846 +
4847 + /* put operator for two zero bits in even */
4848 + gf2_matrix_square(even, odd);
4849 +
4850 + /* put operator for four zero bits in odd */
4851 + gf2_matrix_square(odd, even);
4852 +
4853 + /* apply len2 zeros to crc1 (first square will put the operator for one
4854 + zero byte, eight zero bits, in even) */
4855 + do {
4856 + /* apply zeros operator for this bit of len2 */
4857 + gf2_matrix_square(even, odd);
4858 + if (len2 & 1)
4859 + crc1 = gf2_matrix_times(even, crc1);
4860 + len2 >>= 1;
4861 +
4862 + /* if no more bits set, then done */
4863 + if (len2 == 0)
4864 + break;
4865 +
4866 + /* another iteration of the loop with odd and even swapped */
4867 + gf2_matrix_square(odd, even);
4868 + if (len2 & 1)
4869 + crc1 = gf2_matrix_times(odd, crc1);
4870 + len2 >>= 1;
4871 +
4872 + /* if no more bits set, then done */
4873 + } while (len2 != 0);
4874 +
4875 + /* return combined crc */
4876 + crc1 ^= crc2;
4877 + return crc1;
4878 +};
4879 +
4880 +}());
4881 +/**
4882 +* @description Intel AMT Redirection Transport Module - using websocket relay
4883 +* @author Ylian Saint-Hilaire
4884 +* @version v0.0.1f
4885 +*/
4886 +
4887 +// Construct a MeshServer object
4888 +var CreateAmtRedirect = function (module, authCookie) {
4889 + var obj = {};
4890 + obj.m = module; // This is the inner module (Terminal or Desktop)
4891 + module.parent = obj;
4892 + obj.authCookie = authCookie;
4893 + obj.State = 0;
4894 + obj.socket = null;
4895 + // ###BEGIN###{!Mode-Firmware}
4896 + obj.host = null;
4897 + obj.port = 0;
4898 + obj.user = null;
4899 + obj.pass = null;
4900 + obj.authuri = "/RedirectionService";
4901 + obj.tlsv1only = 0;
4902 + obj.inDataCount = 0;
4903 + // ###END###{!Mode-Firmware}
4904 + obj.connectstate = 0;
4905 + obj.protocol = module.protocol; // 1 = SOL, 2 = KVM, 3 = IDER
4906 + obj.debugmode = 0;
4907 +
4908 + obj.amtaccumulator = "";
4909 + obj.amtsequence = 1;
4910 + obj.amtkeepalivetimer = null;
4911 +
4912 + obj.onStateChanged = null;
4913 +
4914 + // Private method
4915 + //obj.Debug = function (msg) { console.log(msg); }
4916 +
4917 + obj.Start = function (host, port, user, pass, tls) {
4918 + obj.host = host;
4919 + obj.port = port;
4920 + obj.user = user;
4921 + obj.pass = pass;
4922 + obj.connectstate = 0;
4923 + obj.inDataCount = 0;
4924 + var url = window.location.protocol.replace("http", "ws") + "//" + window.location.host + window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/')) + "/webrelay.ashx?p=2&host=" + host + "&port=" + port + "&tls=" + tls + ((user == '*') ? "&serverauth=1" : "") + ((typeof pass === "undefined") ? ("&serverauth=1&user=" + user) : ""); // The "p=2" indicates to the relay that this is a REDIRECTION session
4925 + if ((authCookie != null) && (authCookie != '')) { url += '&auth=' + authCookie; }
4926 + obj.socket = new WebSocket(url);
4927 + obj.socket.onopen = obj.xxOnSocketConnected;
4928 + obj.socket.onmessage = obj.xxOnMessage;
4929 + obj.socket.onclose = obj.xxOnSocketClosed;
4930 + obj.xxStateChange(1);
4931 + }
4932 +
4933 + obj.xxOnSocketConnected = function () {
4934 + //obj.Debug("Redir Socket Connected");
4935 + if (obj.debugmode == 1) { console.log('onSocketConnected'); }
4936 + obj.xxStateChange(2);
4937 + if (obj.protocol == 1) obj.xxSend(obj.RedirectStartSol); // TODO: Put these strings in higher level module to tighten code
4938 + if (obj.protocol == 2) obj.xxSend(obj.RedirectStartKvm); // Don't need these is the feature is not compiled-in.
4939 + if (obj.protocol == 3) obj.xxSend(obj.RedirectStartIder);
4940 + }
4941 +
4942 + // Setup the file reader
4943 + var fileReader = new FileReader();
4944 + var fileReaderInuse = false, fileReaderAcc = [];
4945 + if (fileReader.readAsBinaryString) {
4946 + // Chrome & Firefox (Draft)
4947 + fileReader.onload = function (e) { obj.xxOnSocketData(e.target.result); if (fileReaderAcc.length == 0) { fileReaderInuse = false; } else { fileReader.readAsBinaryString(new Blob([fileReaderAcc.shift()])); } }
4948 + } else if (fileReader.readAsArrayBuffer) {
4949 + // Chrome & Firefox (Spec)
4950 + fileReader.onloadend = function (e) { obj.xxOnSocketData(e.target.result); if (fileReaderAcc.length == 0) { fileReaderInuse = false; } else { fileReader.readAsArrayBuffer(fileReaderAcc.shift()); } }
4951 + }
4952 +
4953 + obj.xxOnMessage = function (e) {
4954 + //if (obj.debugmode == 1) { console.log('Recv', e.data); }
4955 + obj.inDataCount++;
4956 + if (typeof e.data == 'object') {
4957 + if (fileReaderInuse == true) { fileReaderAcc.push(e.data); return; }
4958 + if (fileReader.readAsBinaryString) {
4959 + // Chrome & Firefox (Draft)
4960 + fileReaderInuse = true;
4961 + fileReader.readAsBinaryString(new Blob([e.data]));
4962 + } else if (f.readAsArrayBuffer) {
4963 + // Chrome & Firefox (Spec)
4964 + fileReaderInuse = true;
4965 + fileReader.readAsArrayBuffer(e.data);
4966 + } else {
4967 + // IE10, readAsBinaryString does not exist, use an alternative.
4968 + var binary = "", bytes = new Uint8Array(e.data), length = bytes.byteLength;
4969 + for (var i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); }
4970 + obj.xxOnSocketData(binary);
4971 + }
4972 + } else {
4973 + // If we get a string object, it maybe the WebRTC confirm. Ignore it.
4974 + // obj.debug("MeshDataChannel - OnData - " + typeof e.data + " - " + e.data.length);
4975 + obj.xxOnSocketData(e.data);
4976 + }
4977 + };
4978 +
4979 + obj.xxOnSocketData = function (data) {
4980 + if (!data || obj.connectstate == -1) return;
4981 +
4982 + if (typeof data === 'object') {
4983 + // This is an ArrayBuffer, convert it to a string array (used in IE)
4984 + var binary = "";
4985 + var bytes = new Uint8Array(data);
4986 + var length = bytes.byteLength;
4987 + for (var i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); }
4988 + data = binary;
4989 + }
4990 + else if (typeof data !== 'string') { return; }
4991 +
4992 + if ((obj.protocol == 2 || obj.protocol == 3) && obj.connectstate == 1) { return obj.m.ProcessData(data); } // KVM traffic, forward it directly.
4993 + obj.amtaccumulator += data;
4994 + //obj.Debug("Redir Recv(" + obj.amtaccumulator.length + "): " + rstr2hex(obj.amtaccumulator));
4995 + while (obj.amtaccumulator.length >= 1) {
4996 + var cmdsize = 0;
4997 + switch (obj.amtaccumulator.charCodeAt(0)) {

This file is too large to show in full.

views/login-min.handlebars
+1287 -1
@@ -1 +1,1287 @@
1 -<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <style> body{margin:0;padding:0;border:0;color:black;font-size:13px;font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;background-color:#d3d9d6;}#container{background-color:#fff;margin:0 auto;border-top:0;border-right:1px solid #b7b7b7;border-bottom:0;border-left:1px solid #b7b7b7;padding:0;}#masthead{width:auto;margin:0;padding:0;overflow:auto;text-align:right;background-color:#036;}#column_l{position:relative;float:left;margin:0;padding:0 15px;background-color:#fff;}#footer{clear:both;overflow:auto;width:100%;text-align:center;background-color:#113962;padding-top:5px;padding-bottom:5px;}.style3{text-align:center;color:white;background-color:#808080;font-weight:bold;}#footer{clear:both;overflow:auto;width:100%;text-align:center;background-color:#113962;padding-top:5px;padding-bottom:5px;}#footer a{color:#fff;text-decoration:underline;}#footer a:hover{color:#fff;text-decoration:none;}a{color:#036;text-decoration:underline;}</style> <title>MeshCentral - Login</title> </head> <body onload="if (typeof(startup) !== 'undefined') startup();"> <div id="container" style="max-height:100vh"> <div id="mastheadx"></div> <div id="masthead" style="background:url(logo.png) 0px 0px;background-color:#036;background-repeat:no-repeat;height:66px;width:100%;overflow:hidden"> <div style="float:left;height:66px;color:#c8c8c8;padding-left:20px;padding-top:8px"> <strong><font style="font-size:46px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong> </div> <div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:14px"> <strong><font style="font-size:14px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong> </div> </div> <div id="page_content" style="max-height:calc(100vh-108px)"> <div id="topbar" class="noselect style3" style="height:24px;position:relative"> <div title="Toggle full width" style="cursor:pointer;color:white;position:absolute;top:3px;right:6px" onclick="toggleFullScreen(1)">&harr;</div> </div> <div id="column_l"> <h1>Welcome</h1> <div id="welcomeText" style="display:none">Connect to your home or office devices from anywhere in the world using <a href="http://www.meshcommander.com/meshcentral2">MeshCentral</a>, the real time, open source remote monitoring and management web site. You will need to download and install a management agent on your computers. Once installed, computers will show up in the &quot;My Devices&quot; section of this web site and you will be able to monitor them and take control of them.</div> <table id="centralTable" style="width:100%"> <tr> <td id="welcomeimage" align="right"> <picture> <img alt="" width="359" height="310" src="welcome.jpg"> </picture> </td> <td id="logincell" align="left"> <div id="loginpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="login" method="post"> <div id="message1"> {{{message}}} </div> <div> <b>Log In</b> </div> <table> <tr> <td align="right" width="100">Username:</td> <td><input id="username" type="text" maxlength="64" name="username" onchange="validateLogin(1)" onkeyup="validateLogin(1,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="password" type="password" maxlength="256" name="password" autocomplete="off" onchange="validateLogin(2)" onkeyup="validateLogin(2,event)"></td> </tr> <tr> <td><div id="showPassHintLink" style="display:none"><a onclick="showPassHint()" style="cursor:pointer">Show Hint</a></div></td> <td align="right"><input id="loginButton" type="submit" value="Log In" disabled="disabled"></td> </tr> </table> <div id="hrAccountDiv" style="display:none"><hr></div> <div id="resetAccountDiv" style="display:none;padding:2px"> Forgot username/password? <a onclick="xgo(3)" style="cursor:pointer">Reset account</a>. </div> <div id="newAccountDiv" style="display:none;padding:2px"> Don&#39;t have an account? <a onclick="xgo(2)" style="cursor:pointer">Create one</a>. </div> </form> </div> <div id="createpanel" style="position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="createaccount" method="post"> <div id="message2"> {{{message}}} </div> <div> <b>Account Creation</b> </div> <div id="passwordPolicyCallout" style="left:-10px;width:100px;display:none;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td id="nuUser" align="right" width="100">Username:</td> <td><input id="ausername" type="text" name="username" onchange="validateCreate(1)" maxlength="64" onkeydown="haltReturn(event)" onkeyup="validateCreate(1,event)"></td> </tr> <tr> <td id="nuEmail" align="right" width="100">Email:</td> <td><input id="aemail" type="text" name="email" onchange="validateCreate(2)" maxlength="256" onkeydown="haltReturn(event)" onkeyup="validateCreate(2,event)"></td> </tr> <tr> <td id="nuPass1" align="right">Password:</td> <td><input id="apassword1" type="password" name="password1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(3,event)" onkeyup="validateCreate(3,event)"></td> </tr> <tr> <td id="nuPass2" align="right">Password:</td> <td><input id="apassword2" type="password" name="password2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(4,event)" onkeyup="validateCreate(4,event)"></td> </tr> <tr id="createPanelHint" style="display:none"> <td id="nuHint" align="right">Password Hint:</td> <td><input id="apasswordhint" type="text" name="apasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(5,event)" onkeyup="validateCreate(5,event)"></td> </tr> <tr id="newAccountPass" title="Enter the account creation token"> <td id="nuToken" align="right">Creation Token:</td> <td><input id="anewaccountpass" type="password" name="anewaccountpass" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(6,event)" onkeyup="validateCreate(6,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="createButton" type="submit" value="Create Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resetpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetaccount" method="post"> <div id="message3"> {{{message}}} </div> <div> <b>Account Reset</b> </div> <table> <tr> <td align="right" width="100">Email:</td> <td><input id="remail" type="text" name="email" maxlength="256" onchange="validateReset()" onkeyup="validateReset(event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="eresetButton" type="submit" value="Reset Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="tokenpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="tokenlogin" method="post" autocomplete="off"> <div id="message4"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="tokenInput" type="text" name="token" maxlength="50" onchange="checkToken(event)" onpaste="resetCheckToken(event)" onkeyup="checkToken(event)" onkeydown="checkToken(event)"> <input id="hwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="tokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resettokenpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetaccount" method="post"> <div id="message5"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="resetTokenInput" type="text" name="token" maxlength="50" onchange="resetCheckToken(event)" onkeyup="resetCheckToken(event)" onkeydown="resetCheckToken(event)"> <input id="resetHwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetTokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resetpasswordpanel" style="position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetpassword" method="post"> <div id="message6"> {{{message}}} </div> <div id="rpasswordPolicyCallout" style="left:-10px;width:100px;display:none;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td id="rnuPass1" width="100" align="right">Password:</td> <td><input id="rapassword1" type="password" name="rpassword1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(3,event)" onkeyup="validatePassReset(3,event)"></td> </tr> <tr> <td id="rnuPass2" align="right">Password:</td> <td><input id="rapassword2" type="password" name="rpassword2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(4,event)" onkeyup="validatePassReset(4,event)"></td> </tr> <tr id="resetpasswordpanelHint" style="display:none"> <td id="rnuHint" align="right">Password Hint:</td> <td><input id="rapasswordhint" type="text" name="rpasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(5,event)" onkeyup="validatePassReset(5,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetPassButton" type="submit" value="Reset Password" disabled="disabled"></div> <div id="rpassWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> </td> </tr> </table> <br> </div> <div id="footer"> <table cellpadding="0" cellspacing="10" style="width:100%"> <tr> <td style="text-align:left;color:white"> {{{footer}}} </td> <td style="text-align:right"> {{{rootCertLink}}} &nbsp;<a href="terms">Terms &amp; Privacy</a> </td> </tr> </table> </div> </div> </div> <div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:180px;width:400px;display:none"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="id_dialogclose" style="float:right;padding:5px;cursor:pointer" onclick="setDialogMode()"><b>X</b></div> <div id="id_dialogtitle" style="padding:5px"></div> <div style="width:100%;margin:6px"></div> </div> <div style="margin-right:16px;margin-left:8px"> <div id="dialog1" style="margin:auto;text-align:center;margin:3px"> <div id="id_dialogMessage" style="padding:10px"></div> </div> <div id="dialog2" style="margin:auto;margin:3px"> <div id="id_dialogOptions"></div> </div> </div> <div id="idx_dlgButtonBar" style="padding:10px;margin-bottom:20px"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="float:right;width:80px" onclick="dialogclose(1)"> </div> </div> <script>if(!String.prototype.startsWith){String.prototype.startsWith=function(a){return this.lastIndexOf(a,0)===0}}if(!String.prototype.endsWith){String.prototype.endsWith=function(a){return this.indexOf(a,this.length-a.length)!==-1}}function Q(a){return document.getElementById(a)}function QS(a){try{return Q(a).style}catch(a){}}function QE(a,b){try{Q(a).disabled=!b}catch(a){}}function QV(a,b){try{QS(a).display=(b?"":"none")}catch(a){}}function QA(a,b){Q(a).innerHTML+=b}function QH(a,b){Q(a).innerHTML=b}function inputBoxFocus(b){Q(b).focus();var a=Q(b).value;Q(b).value="";Q(b).value=a}function ReadShort(b,a){return(b.charCodeAt(a)<<8)+b.charCodeAt(a+1)}function ReadShortX(b,a){return(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ReadInt(b,a){return(b.charCodeAt(a)*16777216)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadSInt(b,a){return(b.charCodeAt(a)<<24)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadIntX(b,a){return(b.charCodeAt(a+3)*16777216)+(b.charCodeAt(a+2)<<16)+(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ShortToStr(a){return String.fromCharCode((a>>8)&255,a&255)}function ShortToStrX(a){return String.fromCharCode(a&255,(a>>8)&255)}function IntToStr(a){return String.fromCharCode((a>>24)&255,(a>>16)&255,(a>>8)&255,a&255)}function IntToStrX(a){return String.fromCharCode(a&255,(a>>8)&255,(a>>16)&255,(a>>24)&255)}function MakeToArray(a){if(!a||a==null||typeof a=="object"){return a}return[a]}function SplitArray(a){return a.split(",")}function Clone(a){return JSON.parse(JSON.stringify(a))}function EscapeHtml(a){if(typeof a=="string"){return a.replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function EscapeHtmlBreaks(a){if(typeof a=="string"){return a.replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/\r/g,"<br />").replace(/\n/g,"").replace(/\t/g,"&nbsp;&nbsp;")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function ArrayElementMove(a,b,c){a.splice(c,0,a.splice(b,1)[0])}function ObjectToStringEx(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="<br />"+gap(a)+"Item #"+b+": "+ObjectToStringEx(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="<br />"+gap(a)+b+" = "+ObjectToStringEx(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function ObjectToStringEx2(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="\r\n"+gap2(a)+"Item #"+b+": "+ObjectToStringEx2(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="\r\n"+gap2(a)+b+" = "+ObjectToStringEx2(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function gap(a){var d="";for(var b=0;b<(a*4);b++){d+="&nbsp;"}return d}function gap2(a){var d="";for(var b=0;b<(a*4);b++){d+=" "}return d}function ObjectToString(a){return ObjectToStringEx(a,0)}function ObjectToString2(a){return ObjectToStringEx2(a,0)}function hex2rstr(a){if(typeof a!="string"||a.length==0){return""}var c="",b=(""+a).match(/../g),e;while(e=b.shift()){c+=String.fromCharCode("0x"+e)}return c}function char2hex(a){return(a+256).toString(16).substr(-2).toUpperCase()}function rstr2hex(b){var c="",a;for(a=0;a<b.length;a++){c+=char2hex(b.charCodeAt(a))}return c}function encode_utf8(a){return unescape(encodeURIComponent(a))}function decode_utf8(a){return decodeURIComponent(escape(a))}function data2blob(c){var b=new Array(c.length);for(var d=0;d<c.length;d++){b[d]=c.charCodeAt(d)}var a=new Blob([new Uint8Array(b)]);return a}function random(a){return Math.floor(Math.random()*a)}function trademarks(a){return a.replace(/\(R\)/g,"&reg;").replace(/\(TM\)/g,"&trade;")}"use strict";if(!window.u2f){var u2f=u2f||{};var js_api_version;u2f.EXTENSION_ID="kmendfapggjehodndflmmgagdbamhnfd";u2f.MessageTypes={U2F_REGISTER_REQUEST:"u2f_register_request",U2F_REGISTER_RESPONSE:"u2f_register_response",U2F_SIGN_REQUEST:"u2f_sign_request",U2F_SIGN_RESPONSE:"u2f_sign_response",U2F_GET_API_VERSION_REQUEST:"u2f_get_api_version_request",U2F_GET_API_VERSION_RESPONSE:"u2f_get_api_version_response"};u2f.ErrorCodes={OK:0,OTHER_ERROR:1,BAD_REQUEST:2,CONFIGURATION_UNSUPPORTED:3,DEVICE_INELIGIBLE:4,TIMEOUT:5};u2f.U2fRequest;u2f.U2fResponse;u2f.Error;u2f.Transport;u2f.Transports;u2f.SignRequest;u2f.SignResponse;u2f.RegisterRequest;u2f.RegisterResponse;u2f.RegisteredKey;u2f.GetJsApiVersionResponse;u2f.getMessagePort=function(a){if(typeof chrome!="undefined"&&chrome.runtime){var b={type:u2f.MessageTypes.U2F_SIGN_REQUEST,signRequests:[]};chrome.runtime.sendMessage(u2f.EXTENSION_ID,b,function(){if(!chrome.runtime.lastError){u2f.getChromeRuntimePort_(a)}else{u2f.getIframePort_(a)}})}else{if(u2f.isAndroidChrome_()){u2f.getAuthenticatorPort_(a)}else{if(u2f.isIosChrome_()){u2f.getIosPort_(a)}else{u2f.getIframePort_(a)}}}};u2f.isAndroidChrome_=function(){var a=navigator.userAgent;return a.indexOf("Chrome")!=-1&&a.indexOf("Android")!=-1};u2f.isIosChrome_=function(){var b=["iPhone","iPad","iPod"];for(var a in b){if(navigator.platform==b[a]){return true}}return false};u2f.getChromeRuntimePort_=function(a){var b=chrome.runtime.connect(u2f.EXTENSION_ID,{includeTlsChannelId:true});setTimeout(function(){a(new u2f.WrappedChromeRuntimePort_(b))},0)};u2f.getAuthenticatorPort_=function(a){setTimeout(function(){a(new u2f.WrappedAuthenticatorPort_())},0)};u2f.getIosPort_=function(a){setTimeout(function(){a(new u2f.WrappedIosPort_())},0)};u2f.WrappedChromeRuntimePort_=function(a){this.port_=a};u2f.formatSignRequest_=function(a,b,d,g,e){if(js_api_version===undefined||js_api_version<1.1){var f=[];for(var c=0;c<d.length;c++){f[c]={version:d[c].version,challenge:b,keyHandle:d[c].keyHandle,appId:a}}return{type:u2f.MessageTypes.U2F_SIGN_REQUEST,signRequests:f,timeoutSeconds:g,requestId:e}}return{type:u2f.MessageTypes.U2F_SIGN_REQUEST,appId:a,challenge:b,registeredKeys:d,timeoutSeconds:g,requestId:e}};u2f.formatRegisterRequest_=function(a,c,d,g,e){if(js_api_version===undefined||js_api_version<1.1){for(var b=0;b<d.length;b++){d[b].appId=a}var f=[];for(var b=0;b<c.length;b++){f[b]={version:c[b].version,challenge:d[0],keyHandle:c[b].keyHandle,appId:a}}return{type:u2f.MessageTypes.U2F_REGISTER_REQUEST,signRequests:f,registerRequests:d,timeoutSeconds:g,requestId:e}}return{type:u2f.MessageTypes.U2F_REGISTER_REQUEST,appId:a,registerRequests:d,registeredKeys:c,timeoutSeconds:g,requestId:e}};u2f.WrappedChromeRuntimePort_.prototype.postMessage=function(a){this.port_.postMessage(a)};u2f.WrappedChromeRuntimePort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c=="message"||c=="onmessage"){this.port_.onMessage.addListener(function(d){b({data:d})})}else{console.error("WrappedChromeRuntimePort only supports onMessage")}};u2f.WrappedAuthenticatorPort_=function(){this.requestId_=-1;this.requestObject_=null};u2f.WrappedAuthenticatorPort_.prototype.postMessage=function(b){var a=u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_+";S.request="+encodeURIComponent(JSON.stringify(b))+";end";document.location=a};u2f.WrappedAuthenticatorPort_.prototype.getPortType=function(){return"WrappedAuthenticatorPort_"};u2f.WrappedAuthenticatorPort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c=="message"){var d=this;window.addEventListener("message",d.onRequestUpdate_.bind(d,b),false)}else{console.error("WrappedAuthenticatorPort only supports message")}};u2f.WrappedAuthenticatorPort_.prototype.onRequestUpdate_=function(a,d){var e=JSON.parse(d.data);var c=e.intentURL;var b=e.errorCode;var f=null;if(e.hasOwnProperty("data")){f=(JSON.parse(e.data))}a({data:f})};u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_="intent:#Intent;action=com.google.android.apps.authenticator.AUTHENTICATE";u2f.WrappedIosPort_=function(){};u2f.WrappedIosPort_.prototype.postMessage=function(a){var b=JSON.stringify(a);var c="u2f://auth?"+encodeURI(b);location.replace(c)};u2f.WrappedIosPort_.prototype.getPortType=function(){return"WrappedIosPort_"};u2f.WrappedIosPort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c!=="message"){console.error("WrappedIosPort only supports message")}};u2f.getIframePort_=function(a){var d="chrome-extension://"+u2f.EXTENSION_ID;var c=document.createElement("iframe");c.src=d+"/u2f-comms.html";c.setAttribute("style","display:none");document.body.appendChild(c);var b=new MessageChannel();var e=function(f){if(f.data=="ready"){b.port1.removeEventListener("message",e);a(b.port1)}else{console.error('First event on iframe port was not "ready"')}};b.port1.addEventListener("message",e);b.port1.start();c.addEventListener("load",function(){c.contentWindow.postMessage("init",d,[b.port2])})};u2f.EXTENSION_TIMEOUT_SEC=30;u2f.port_=null;u2f.waitingForPort_=[];u2f.reqCounter_=0;u2f.callbackMap_={};u2f.getPortSingleton_=function(a){if(u2f.port_){a(u2f.port_)}else{if(u2f.waitingForPort_.length==0){u2f.getMessagePort(function(b){u2f.port_=b;u2f.port_.addEventListener("message",(u2f.responseHandler_));while(u2f.waitingForPort_.length){u2f.waitingForPort_.shift()(u2f.port_)}})}u2f.waitingForPort_.push(a)}};u2f.responseHandler_=function(b){var d=b.data;var c=d.requestId;if(!c||!u2f.callbackMap_[c]){console.error("Unknown or missing requestId in response.");return}var a=u2f.callbackMap_[c];delete u2f.callbackMap_[c];a(d.responseData)};u2f.sign=function(a,c,e,b,d){if(js_api_version===undefined){u2f.getApiVersion(function(f){js_api_version=f.js_api_version===undefined?0:f.js_api_version;u2f.sendSignRequest(a,c,e,b,d)})}else{u2f.sendSignRequest(a,c,e,b,d)}};u2f.sendSignRequest=function(a,c,e,b,d){u2f.getPortSingleton_(function(f){var h=++u2f.reqCounter_;u2f.callbackMap_[h]=b;var i=(typeof d!=="undefined"?d:u2f.EXTENSION_TIMEOUT_SEC);var g=u2f.formatSignRequest_(a,c,e,i,h);f.postMessage(g)})};u2f.register=function(a,e,d,b,c){if(js_api_version===undefined){u2f.getApiVersion(function(f){js_api_version=f.js_api_version===undefined?0:f.js_api_version;u2f.sendRegisterRequest(a,e,d,b,c)})}else{u2f.sendRegisterRequest(a,e,d,b,c)}};u2f.sendRegisterRequest=function(a,e,d,b,c){u2f.getPortSingleton_(function(f){var h=++u2f.reqCounter_;u2f.callbackMap_[h]=b;var i=(typeof c!=="undefined"?c:u2f.EXTENSION_TIMEOUT_SEC);var g=u2f.formatRegisterRequest_(a,d,e,i,h);f.postMessage(g)})};u2f.getApiVersion=function(a,b){u2f.getPortSingleton_(function(d){if(d.getPortType){var c;switch(d.getPortType()){case"WrappedIosPort_":case"WrappedAuthenticatorPort_":c=1.1;break;default:c=0;break}a({js_api_version:c});return}var f=++u2f.reqCounter_;u2f.callbackMap_[f]=a;var e={type:u2f.MessageTypes.U2F_GET_API_VERSION_REQUEST,timeoutSeconds:(typeof b!=="undefined"?b:u2f.EXTENSION_TIMEOUT_SEC),requestId:f};d.postMessage(e)})}}"use strict";var passhint="{{{passhint}}}";var newAccountPass=parseInt("{{{newAccountPass}}}");var emailCheck=("{{{emailcheck}}}"=="true");var passRequirements="{{{passRequirements}}}";var hardwareKeyChallenge="{{{hkey}}}";if(passRequirements!=""){passRequirements=JSON.parse(decodeURIComponent(passRequirements))}else{passRequirements={}}var passRequirementsEx=((passRequirements.min!=null)||(passRequirements.max!=null)||(passRequirements.upper!=null)||(passRequirements.lower!=null)||(passRequirements.numeric!=null)||(passRequirements.nonalpha!=null));var features=parseInt("{{{features}}}");var webPageFullScreen=getstore("webPageFullScreen",true);if(webPageFullScreen=="false"){webPageFullScreen=false}if(webPageFullScreen=="true"){webPageFullScreen=true}var welcomeText=decodeURIComponent("{{{welcometext}}}");var currentpanel=0;toggleFullScreen();function startup(){if((features&32)==0){var c=null;try{c=top.location.toString().toLowerCase()}catch(a){}if(top!=self&&(c==null||top.active==false)){top.location=self.location;return}}QV("createPanelHint",passRequirements.hint===true);QV("resetpasswordpanelHint",passRequirements.hint===true);if(welcomeText){QH("welcomeText",welcomeText)}QV("welcomeText",true);window.onresize=center;center();validateLogin();validateCreate();if("{{loginmode}}"!=""){go(parseInt("{{loginmode}}"))}else{go(1)}QV("newAccountDiv",("{{{newAccount}}}"!="0")&&("{{{newAccount}}}"!="false"));if((passhint!=null)&&(passhint.length>0)){QV("showPassHintLink",true)}QV("newAccountPass",(newAccountPass==1));QV("resetAccountDiv",(emailCheck==true));QV("hrAccountDiv",(emailCheck==true)||(newAccountPass==1));if("{{loginmode}}"=="4"){try{if(hardwareKeyChallenge.length>0){hardwareKeyChallenge=JSON.parse(hardwareKeyChallenge)}else{hardwareKeyChallenge=null}}catch(b){hardwareKeyChallenge=null}if((hardwareKeyChallenge!=null)&&u2fSupported()){window.u2f.sign(hardwareKeyChallenge.appId,hardwareKeyChallenge.challenge,hardwareKeyChallenge.registeredKeys,function(d){if((currentpanel==4)&&d.signatureData){Q("hwtokenInput").value=JSON.stringify(d);QE("tokenOkButton",true);Q("tokenOkButton").click()}},hardwareKeyChallenge.timeoutSeconds)}}if("{{loginmode}}"=="5"){try{if(hardwareKeyChallenge.length>0){hardwareKeyChallenge=JSON.parse(hardwareKeyChallenge)}else{hardwareKeyChallenge=null}}catch(b){hardwareKeyChallenge=null}if((hardwareKeyChallenge!=null)&&u2fSupported()){window.u2f.sign(hardwareKeyChallenge.appId,hardwareKeyChallenge.challenge,hardwareKeyChallenge.registeredKeys,function(d){if((currentpanel==5)&&d.signatureData){Q("resetHwtokenInput").value=JSON.stringify(d);QE("resetTokenOkButton",true);Q("resetTokenOkButton").click()}},hardwareKeyChallenge.timeoutSeconds)}}}function showPassHint(){messagebox("Password Hint",passhint)}function xgo(a){QV("message1",false);QV("message2",false);QV("message3",false);QV("message4",false);QV("message5",false);QV("message6",false);go(a)}function go(a){currentpanel=a;setDialogMode(0);QV("showPassHintLink",false);QV("loginpanel",a==1);QV("createpanel",a==2);QV("resetpanel",a==3);QV("tokenpanel",a==4);QV("resettokenpanel",a==5);QV("resetpasswordpanel",a==6);if(a==1){Q("username").focus()}if(a==2){Q("ausername").focus()}if(a==3){Q("remail").focus()}if(a==4){Q("tokenInput").focus()}if(a==5){Q("resetTokenInput").focus()}if(a==6){Q("rapassword1").focus()}}function validateLogin(a,b){var c=((Q("username").value.length>0)&&(Q("username").value.indexOf(" ")==-1)&&(Q("password").value.length>0));QE("loginButton",c);setDialogMode(0);if((b!=null)&&(b.keyCode==13)){if(a==1){Q("password").focus()}else{if(a==2){Q("loginButton").click()}}}if(b!=null){haltEvent(b)}}function validateCreate(a,b){setDialogMode(0);var k=(Q("ausername").value.length>0)&&(Q("ausername").value.indexOf(" ")==-1);var c=(validateEmail(Q("aemail").value)==true);var g=(Q("apassword1").value.length>0);var h=(Q("apassword2").value.length>0)&&(Q("apassword2").value==Q("apassword1").value);var d=(newAccountPass==0)||(Q("anewaccountpass").value.length>0);var f=(k&&c&&g&&h&&d);QS("nuUser").color=k?"black":"#7b241c";QS("nuEmail").color=c?"black":"#7b241c";QS("nuPass1").color=g?"black":"#7b241c";QS("nuPass2").color=h?"black":"#7b241c";QS("nuToken").color=d?"black":"#7b241c";if(Q("apassword1").value==""){QH("passWarning","");QV("passwordPolicyCallout",false)}else{if(!passRequirementsEx){var j=checkPasswordStrength(Q("apassword1").value);if(j>=80){QH("passWarning","<span style=color:green><b>Strong Password</b><span>")}else{if(j>=60){QH("passWarning","<span style=color:blue><b>Good Password</b><span>")}else{QH("passWarning","<span style=color:red><b>Weak Password</b><span>")}}}else{var i=checkPasswordRequirements(Q("apassword1").value,passRequirements);if(i==false){f=false;QS("nuPass1").color="#7b241c";QS("nuPass2").color="#7b241c";QH("passWarning","<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>");QV("passwordPolicyCallout",true);QH("passwordPolicyCallout",passwordPolicyText(Q("apassword1").value))}else{QH("passWarning","");QV("passwordPolicyCallout",false)}}}if((b!=null)&&(b.keyCode==13)){if(a==1){Q("aemail").focus()}if(a==2){Q("apassword1").focus()}if(a==3){Q("apassword2").focus()}if(a==4){Q("apasswordhint").focus()}if(a==5){if(newAccountPass==1){Q("anewaccountpass").focus()}else{Q("createButton").click()}}if(a==6){Q("createButton").click()}}if(b!=null){haltEvent(b)}QE("createButton",f)}function validatePassReset(a,b){setDialogMode(0);var d=(Q("rapassword1").value.length>0);var f=(Q("rapassword2").value.length>0)&&(Q("rapassword2").value==Q("rapassword1").value);var c=(d&&f);QS("rnuPass1").color=d?"black":"#7b241c";QS("rnuPass2").color=f?"black":"#7b241c";if(Q("rapassword1").value==""){QH("rpassWarning","");QV("rpasswordPolicyCallout",false)}else{if(!passRequirementsEx){var h=checkPasswordStrength(Q("rapassword1").value);if(h>=80){QH("rpassWarning","<span style=color:green><b>Strong Password</b><span>")}else{if(h>=60){QH("rpassWarning","<span style=color:blue><b>Good Password</b><span>")}else{QH("rpassWarning","<span style=color:red><b>Weak Password</b><span>")}}}else{var g=checkPasswordRequirements(Q("rapassword1").value,passRequirements);if(g==false){c=false;QS("rnuPass1").color="#7b241c";QS("rnuPass2").color="#7b241c";QH("rpassWarning","<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>");QV("rpasswordPolicyCallout",true);QH("rpasswordPolicyCallout",passwordPolicyText(Q("rapassword1").value))}else{QH("rpassWarning","");QV("rpasswordPolicyCallout",false)}}}if((b!=null)&&(b.keyCode==13)){if(a==2){Q("rapassword1").focus()}if(a==3){Q("rapassword2").focus()}if(a==4){Q("rapasswordhint").focus()}if(a==6){Q("resetPassButton").click()}}if(b!=null){haltEvent(b)}QE("resetPassButton",c)}function passwordPolicyText(b){var c="<div style=text-align:left>";var a=strCount(b);if(passRequirements.min&&((b==null)||(b.length<passRequirements.min))){c+="Minimum length of "+passRequirements.min+"<br />"}if(passRequirements.max&&((b==null)||(b.length>passRequirements.max))){c+="Maximum length of "+passRequirements.max+"<br />"}if(passRequirements.upper&&((b==null)||(a.upper<passRequirements.upper))){c+=""+passRequirements.upper+" upper case<br />"}if(passRequirements.lower&&((b==null)||(a.lower<passRequirements.lower))){c+=""+passRequirements.lower+" lower case<br />"}if(passRequirements.numeric&&((b==null)||(a.numeric<passRequirements.numeric))){c+=""+passRequirements.numeric+" numeric<br />"}if(passRequirements.nonalpha&&((b==null)||(a.nonalpha<passRequirements.nonalpha))){c+=passRequirements.nonalpha+" non-alphanumeric<br />"}c+="</div>";return c}function showPasswordPolicy(){messagebox("Password Policy",passwordPolicyText())}function validateReset(a){setDialogMode(0);var b=validateEmail(Q("remail").value);QE("eresetButton",b);if((a!=null)&&(a.keyCode==13)&&(b==true)){Q("eresetButton").click()}if(a!=null){haltEvent(a)}}function checkPasswordStrength(e){var f=0,d={},g=0,h={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)};if(!e){return 0}for(var b=0;b<e.length;b++){d[e[b]]=(d[e[b]]||0)+1;f+=5/d[e[b]]}for(var a in h){g+=(h[a]==true)?1:0}return parseInt(f+(g-1)*10)}function checkPasswordRequirements(b,c){if((c==null)||(c=="")||(typeof c!="object")){return true}if(c.min){if(b.length<c.min){return false}}if(c.max){if(b.length>c.max){return false}}var a=strCount(b);if(c.numeric&&(a.numeric<c.numeric)){return false}if(c.lower&&(a.lower<c.lower)){return false}if(c.upper&&(a.upper<c.upper)){return false}if(c.nonalpha&&(a.nonalpha<c.nonalpha)){return false}return true}function strCount(c){var a={numeric:0,lower:0,upper:0,nonalpha:0};if(typeof c!="string"){return a}for(var b=0;b<c.length;b++){if(/\d/.test(c[b])){a.numeric++}if(/[a-z]/.test(c[b])){a.lower++}if(/[A-Z]/.test(c[b])){a.upper++}if(/\W/.test(c[b])){a.nonalpha++}}return a}function checkToken(){var a=Q("tokenInput").value;var b=a.split(" ").join("");if(a!=b){Q("tokenInput").value=b}QE("tokenOkButton",(Q("tokenInput").value.length==6)||(Q("tokenInput").value.length==8)||(Q("tokenInput").value.length==44))}function resetCheckToken(){var a=Q("resetTokenInput").value;var b=a.split(" ").join("");if(a!=b){Q("resetTokenInput").value=b}QE("resetTokenOkButton",(Q("resetTokenInput").value.length==6)||(Q("resetTokenInput").value.length==8)||(Q("resetTokenInput").value.length==44))}var xxdialogMode;var xxdialogFunc;var xxdialogButtons;var xxdialogTag;var xxcurrentView=0;function setDialogMode(j,k,a,e,d,h){xxdialogMode=j;xxdialogFunc=e;xxdialogButtons=a;xxdialogTag=h;QE("idx_dlgOkButton",true);QV("idx_dlgOkButton",a&1);QV("idx_dlgCancelButton",a&2);QV("id_dialogclose",(a&2)||(a&8));QV("idx_dlgButtonBar",a&7);if(k){QH("id_dialogtitle",k)}for(var g=1;g<24;g++){QV("dialog"+g,g==j)}QV("dialog",j);if(d){if(j==2){QH("id_dialogOptions",d)}else{QH("id_dialogMessage",d)}}}function dialogclose(e){var c=xxdialogFunc;var a=xxdialogButtons;var d=xxdialogTag;setDialogMode();if(((a&8)||e)&&c){c(e,d)}}function toggleFullScreen(a){if(a===1){webPageFullScreen=!webPageFullScreen;putstore("webPageFullScreen",webPageFullScreen)}if(webPageFullScreen==false){QS("container").width="960px";QS("container")["min-width"]="960px";QS("container")["border-right"]="1px solid #b7b7b7";QS("container")["border-left"]="1px solid #b7b7b7";QS("container")["overflow"]="hidden";QS("column_l").height="";QS("column_l").width="930px";QS("column_l")["overflow-y"]="";QS("column_l")["max-height"]="calc(100vh - 111px)";QS("column_l")["min-width"]="";QS("masthead")["width"]="960px"}else{QS("container").width="100%";QS("container")["min-width"]="";QS("container")["border-right"]="0";QS("container")["border-left"]="0";QS("container")["overflow"]="hidden";QS("column_l").height="calc(100vh - 135px)";QS("column_l").width="";QS("column_l")["overflow-y"]="auto";QS("column_l")["max-height"]="calc(100vh - 111px)";QS("column_l")["min-width"]="";QS("masthead")["width"]="100%"}QV("body",true);center()}function center(){var c=getDocWidth();QS("dialog").left=((((c-400)/2))+"px");var b=(webPageFullScreen==false)||(c>800);QV("welcomeimage",b);Q("logincell").setAttribute("align",b?"left":"center");if(webPageFullScreen==false){QS("centralTable")["margin-top"]=""}else{var a=(Q("column_l").clientHeight/2)-250;if(a<0){a=0}QS("centralTable")["margin-top"]=a+"px"}}function messagebox(b,a){QH("id_dialogMessage",a);setDialogMode(1,b,1)}function statusbox(b,a){QH("id_dialogMessage",a);setDialogMode(1,b)}function getDocWidth(){if(window.innerWidth){return window.innerWidth}if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientWidth!=0){return document.documentElement.clientWidth}return document.getElementsByTagName("body")[0].clientWidth}function haltEvent(a){if(a.preventDefault){a.preventDefault()}if(a.stopPropagation){a.stopPropagation()}return false}function haltReturn(a){if(a.keyCode==13){haltEvent(a)}}function validateEmail(b){var a=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return a.test(b)}function putstore(b,c){try{if(typeof(localStorage)==="undefined"){return}localStorage.setItem(b,c)}catch(a){}}function getstore(b,d){try{if(typeof(localStorage)==="undefined"){return d}var c=localStorage.getItem(b);if((c==null)||(c==null)){return d}return c}catch(a){return d}}function u2fSupported(){return(window.u2f&&((navigator.userAgent.indexOf("Chrome/")>0)||(navigator.userAgent.indexOf("Firefox/")>0)||(navigator.userAgent.indexOf("Opera/")>0)||(navigator.userAgent.indexOf("Safari/")>0)))};</script></body></html>
\ No newline at end of file
1 +<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <style> body{margin:0;padding:0;border:0;color:black;font-size:13px;font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;background-color:#d3d9d6;}#container{background-color:#fff;margin:0 auto;border-top:0;border-right:1px solid #b7b7b7;border-bottom:0;border-left:1px solid #b7b7b7;padding:0;}#masthead{width:auto;margin:0;padding:0;overflow:auto;text-align:right;background-color:#036;}#column_l{position:relative;float:left;margin:0;padding:0 15px;background-color:#fff;}#footer{clear:both;overflow:auto;width:100%;text-align:center;background-color:#113962;padding-top:5px;padding-bottom:5px;}.style3{text-align:center;color:white;background-color:#808080;font-weight:bold;}#footer{clear:both;overflow:auto;width:100%;text-align:center;background-color:#113962;padding-top:5px;padding-bottom:5px;}#footer a{color:#fff;text-decoration:underline;}#footer a:hover{color:#fff;text-decoration:none;}a{color:#036;text-decoration:underline;}</style> <title>MeshCentral - Login</title> </head> <body onload="if (typeof(startup) !== 'undefined') startup();"> <div id="container" style="max-height:100vh"> <div id="mastheadx"></div> <div id="masthead" style="background:url(logo.png) 0px 0px;background-color:#036;background-repeat:no-repeat;height:66px;width:100%;overflow:hidden"> <div style="float:left;height:66px;color:#c8c8c8;padding-left:20px;padding-top:8px"> <strong><font style="font-size:46px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong> </div> <div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:14px"> <strong><font style="font-size:14px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong> </div> </div> <div id="page_content" style="max-height:calc(100vh-108px)"> <div id="topbar" class="noselect style3" style="height:24px;position:relative"> <div title="Toggle full width" style="cursor:pointer;color:white;position:absolute;top:3px;right:6px" onclick="toggleFullScreen(1)">&harr;</div> </div> <div id="column_l"> <h1>Welcome</h1> <div id="welcomeText" style="display:none">Connect to your home or office devices from anywhere in the world using <a href="http://www.meshcommander.com/meshcentral2">MeshCentral</a>, the real time, open source remote monitoring and management web site. You will need to download and install a management agent on your computers. Once installed, computers will show up in the &quot;My Devices&quot; section of this web site and you will be able to monitor them and take control of them.</div> <table id="centralTable" style="width:100%"> <tr> <td id="welcomeimage" align="right"> <picture> <img alt="" width="359" height="310" src="welcome.jpg"> </picture> </td> <td id="logincell" align="left"> <div id="loginpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="login" method="post"> <div id="message1"> {{{message}}} </div> <div> <b>Log In</b> </div> <table> <tr> <td align="right" width="100">Username:</td> <td><input id="username" type="text" maxlength="64" name="username" onchange="validateLogin(1)" onkeyup="validateLogin(1,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="password" type="password" maxlength="256" name="password" autocomplete="off" onchange="validateLogin(2)" onkeyup="validateLogin(2,event)"></td> </tr> <tr> <td><div id="showPassHintLink" style="display:none"><a onclick="showPassHint()" style="cursor:pointer">Show Hint</a></div></td> <td align="right"><input id="loginButton" type="submit" value="Log In" disabled="disabled"></td> </tr> </table> <div id="hrAccountDiv" style="display:none"><hr></div> <div id="resetAccountDiv" style="display:none;padding:2px"> Forgot username/password? <a onclick="xgo(3)" style="cursor:pointer">Reset account</a>. </div> <div id="newAccountDiv" style="display:none;padding:2px"> Don&#39;t have an account? <a onclick="xgo(2)" style="cursor:pointer">Create one</a>. </div> </form> </div> <div id="createpanel" style="position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="createaccount" method="post"> <div id="message2"> {{{message}}} </div> <div> <b>Account Creation</b> </div> <div id="passwordPolicyCallout" style="left:-10px;width:100px;display:none;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td id="nuUser" align="right" width="100">Username:</td> <td><input id="ausername" type="text" name="username" onchange="validateCreate(1)" maxlength="64" onkeydown="haltReturn(event)" onkeyup="validateCreate(1,event)"></td> </tr> <tr> <td id="nuEmail" align="right" width="100">Email:</td> <td><input id="aemail" type="text" name="email" onchange="validateCreate(2)" maxlength="256" onkeydown="haltReturn(event)" onkeyup="validateCreate(2,event)"></td> </tr> <tr> <td id="nuPass1" align="right">Password:</td> <td><input id="apassword1" type="password" name="password1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(3,event)" onkeyup="validateCreate(3,event)"></td> </tr> <tr> <td id="nuPass2" align="right">Password:</td> <td><input id="apassword2" type="password" name="password2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(4,event)" onkeyup="validateCreate(4,event)"></td> </tr> <tr id="createPanelHint" style="display:none"> <td id="nuHint" align="right">Password Hint:</td> <td><input id="apasswordhint" type="text" name="apasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(5,event)" onkeyup="validateCreate(5,event)"></td> </tr> <tr id="newAccountPass" title="Enter the account creation token"> <td id="nuToken" align="right">Creation Token:</td> <td><input id="anewaccountpass" type="password" name="anewaccountpass" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(6,event)" onkeyup="validateCreate(6,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="createButton" type="submit" value="Create Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resetpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetaccount" method="post"> <div id="message3"> {{{message}}} </div> <div> <b>Account Reset</b> </div> <table> <tr> <td align="right" width="100">Email:</td> <td><input id="remail" type="text" name="email" maxlength="256" onchange="validateReset()" onkeyup="validateReset(event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="eresetButton" type="submit" value="Reset Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="tokenpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="tokenlogin" method="post" autocomplete="off"> <div id="message4"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="tokenInput" type="text" name="token" maxlength="50" onchange="checkToken(event)" onpaste="resetCheckToken(event)" onkeyup="checkToken(event)" onkeydown="checkToken(event)"> <input id="hwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="tokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resettokenpanel" style="background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetaccount" method="post"> <div id="message5"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="resetTokenInput" type="text" name="token" maxlength="50" onchange="resetCheckToken(event)" onkeyup="resetCheckToken(event)" onkeydown="resetCheckToken(event)"> <input id="resetHwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetTokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resetpasswordpanel" style="position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetpassword" method="post"> <div id="message6"> {{{message}}} </div> <div id="rpasswordPolicyCallout" style="left:-10px;width:100px;display:none;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td id="rnuPass1" width="100" align="right">Password:</td> <td><input id="rapassword1" type="password" name="rpassword1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(3,event)" onkeyup="validatePassReset(3,event)"></td> </tr> <tr> <td id="rnuPass2" align="right">Password:</td> <td><input id="rapassword2" type="password" name="rpassword2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(4,event)" onkeyup="validatePassReset(4,event)"></td> </tr> <tr id="resetpasswordpanelHint" style="display:none"> <td id="rnuHint" align="right">Password Hint:</td> <td><input id="rapasswordhint" type="text" name="rpasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(5,event)" onkeyup="validatePassReset(5,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetPassButton" type="submit" value="Reset Password" disabled="disabled"></div> <div id="rpassWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> </td> </tr> </table> <br> </div> <div id="footer"> <table cellpadding="0" cellspacing="10" style="width:100%"> <tr> <td style="text-align:left;color:white"> {{{footer}}} </td> <td style="text-align:right"> {{{rootCertLink}}} &nbsp;<a href="terms">Terms &amp; Privacy</a> </td> </tr> </table> </div> </div> </div> <div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:180px;width:400px;display:none"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="id_dialogclose" style="float:right;padding:5px;cursor:pointer" onclick="setDialogMode()"><b>X</b></div> <div id="id_dialogtitle" style="padding:5px"></div> <div style="width:100%;margin:6px"></div> </div> <div style="margin-right:16px;margin-left:8px"> <div id="dialog1" style="margin:auto;text-align:center;margin:3px"> <div id="id_dialogMessage" style="padding:10px"></div> </div> <div id="dialog2" style="margin:auto;margin:3px"> <div id="id_dialogOptions"></div> </div> </div> <div id="idx_dlgButtonBar" style="padding:10px;margin-bottom:20px"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="float:right;width:80px" onclick="dialogclose(1)"> </div> </div> <script>/**
2 +* @description Set of short commonly used methods for handling HTML elements
3 +* @author Ylian Saint-Hilaire
4 +* @version v0.0.1b
5 +*/
6 +
7 +// Add startsWith for IE browser
8 +if (!String.prototype.startsWith) { String.prototype.startsWith = function (str) { return this.lastIndexOf(str, 0) === 0; }; }
9 +if (!String.prototype.endsWith) { String.prototype.endsWith = function (str) { return this.indexOf(str, this.length - str.length) !== -1; }; }
10 +
11 +// Quick UI functions, a bit of a replacement for jQuery
12 +//function Q(x) { if (document.getElementById(x) == null) { console.log('Invalid element: ' + x); } return document.getElementById(x); } // "Q"
13 +function Q(x) { return document.getElementById(x); } // "Q"
14 +function QS(x) { try { return Q(x).style; } catch (x) { } } // "Q" style
15 +function QE(x, y) { try { Q(x).disabled = !y; } catch (x) { } } // "Q" enable
16 +function QV(x, y) { try { QS(x).display = (y ? '' : 'none'); } catch (x) { } } // "Q" visible
17 +function QA(x, y) { Q(x).innerHTML += y; } // "Q" append
18 +function QH(x, y) { Q(x).innerHTML = y; } // "Q" html
19 +
20 +// Move cursor to end of input box
21 +function inputBoxFocus(x) { Q(x).focus(); var v = Q(x).value; Q(x).value = ''; Q(x).value = v; }
22 +
23 +// Binary encoding and decoding functions
24 +function ReadShort(v, p) { return (v.charCodeAt(p) << 8) + v.charCodeAt(p + 1); }
25 +function ReadShortX(v, p) { return (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
26 +function ReadInt(v, p) { return (v.charCodeAt(p) * 0x1000000) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); } // We use "*0x1000000" instead of "<<24" because the shift converts the number to signed int32.
27 +function ReadSInt(v, p) { return (v.charCodeAt(p) << 24) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); }
28 +function ReadIntX(v, p) { return (v.charCodeAt(p + 3) * 0x1000000) + (v.charCodeAt(p + 2) << 16) + (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
29 +function ShortToStr(v) { return String.fromCharCode((v >> 8) & 0xFF, v & 0xFF); }
30 +function ShortToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF); }
31 +function IntToStr(v) { return String.fromCharCode((v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); }
32 +function IntToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF, (v >> 24) & 0xFF); }
33 +function MakeToArray(v) { if (!v || v == null || typeof v == 'object') return v; return [v]; }
34 +function SplitArray(v) { return v.split(','); }
35 +function Clone(v) { return JSON.parse(JSON.stringify(v)); }
36 +function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
37 +function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, '&nbsp;&nbsp;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
38 +
39 +// Move an element from one position in an array to a new position
40 +function ArrayElementMove(arr, from, to) { arr.splice(to, 0, arr.splice(from, 1)[0]); };
41 +
42 +// Print object for HTML
43 +function ObjectToStringEx(x, c) {
44 + var r = "";
45 + if (x != 0 && (!x || x == null)) return "(Null)";
46 + if (x instanceof Array) { for (var i in x) { r += '<br />' + gap(c) + "Item #" + i + ": " + ObjectToStringEx(x[i], c + 1); } }
47 + else if (x instanceof Object) { for (var i in x) { r += '<br />' + gap(c) + i + " = " + ObjectToStringEx(x[i], c + 1); } }
48 + else { r += EscapeHtml(x); }
49 + return r;
50 +}
51 +
52 +// Print object for console
53 +function ObjectToStringEx2(x, c) {
54 + var r = "";
55 + if (x != 0 && (!x || x == null)) return "(Null)";
56 + if (x instanceof Array) { for (var i in x) { r += '\r\n' + gap2(c) + "Item #" + i + ": " + ObjectToStringEx2(x[i], c + 1); } }
57 + else if (x instanceof Object) { for (var i in x) { r += '\r\n' + gap2(c) + i + " = " + ObjectToStringEx2(x[i], c + 1); } }
58 + else { r += EscapeHtml(x); }
59 + return r;
60 +}
61 +
62 +// Create an ident gap
63 +function gap(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += '&nbsp;'; } return x; }
64 +function gap2(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += ' '; } return x; }
65 +
66 +// Print an object in html
67 +function ObjectToString(x) { return ObjectToStringEx(x, 0); }
68 +function ObjectToString2(x) { return ObjectToStringEx2(x, 0); }
69 +
70 +// Convert a hex string to a raw string
71 +function hex2rstr(d) {
72 + if (typeof d != "string" || d.length == 0) return '';
73 + var r = '', m = ('' + d).match(/../g), t;
74 + while (t = m.shift()) r += String.fromCharCode('0x' + t);
75 + return r
76 +}
77 +
78 +// Convert decimal to hex
79 +function char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }
80 +
81 +// Convert a raw string to a hex string
82 +function rstr2hex(input) { var r = '', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }
83 +
84 +// UTF-8 encoding & decoding functions
85 +function encode_utf8(s) { return unescape(encodeURIComponent(s)); }
86 +function decode_utf8(s) { return decodeURIComponent(escape(s)); }
87 +
88 +// Convert a string into a blob
89 +function data2blob(data) {
90 + var bytes = new Array(data.length);
91 + for (var i = 0; i < data.length; i++) bytes[i] = data.charCodeAt(i);
92 + var blob = new Blob([new Uint8Array(bytes)]);
93 + return blob;
94 +}
95 +
96 +// Generate random numbers
97 +function random(max) { return Math.floor(Math.random() * max); }
98 +
99 +// Trademarks
100 +function trademarks(x) { return x.replace(/\(R\)/g, '&reg;').replace(/\(TM\)/g, '&trade;'); }
101 +//Copyright 2014-2015 Google Inc. All rights reserved.
102 +
103 +//Use of this source code is governed by a BSD-style
104 +//license that can be found in the LICENSE file or at
105 +//https://developers.google.com/open-source/licenses/bsd
106 +
107 +/**
108 + * @fileoverview The U2F api.
109 + */
110 +'use strict';
111 +if (!window.u2f) {
112 +
113 + /**
114 + * Namespace for the U2F api.
115 + * @type {Object}
116 + */
117 +var u2f = u2f || {};
118 +
119 + /**
120 + * FIDO U2F Javascript API Version
121 + * @number
122 + */
123 +var js_api_version;
124 +
125 + /**
126 + * The U2F extension id
127 + * @const {string}
128 + */
129 +// The Chrome packaged app extension ID.
130 +// Uncomment this if you want to deploy a server instance that uses
131 +// the package Chrome app and does not require installing the U2F Chrome extension.
132 + u2f.EXTENSION_ID = 'kmendfapggjehodndflmmgagdbamhnfd';
133 + // The U2F Chrome extension ID.
134 + // Uncomment this if you want to deploy a server instance that uses
135 + // the U2F Chrome extension to authenticate.
136 + // u2f.EXTENSION_ID = 'pfboblefjcgdjicmnffhdgionmgcdmne';
137 +
138 +
139 + /**
140 + * Message types for messsages to/from the extension
141 + * @const
142 + * @enum {string}
143 + */
144 +u2f.MessageTypes = {
145 + 'U2F_REGISTER_REQUEST': 'u2f_register_request',
146 + 'U2F_REGISTER_RESPONSE': 'u2f_register_response',
147 + 'U2F_SIGN_REQUEST': 'u2f_sign_request',
148 + 'U2F_SIGN_RESPONSE': 'u2f_sign_response',
149 + 'U2F_GET_API_VERSION_REQUEST': 'u2f_get_api_version_request',
150 + 'U2F_GET_API_VERSION_RESPONSE': 'u2f_get_api_version_response'
151 + };
152 +
153 +
154 + /**
155 + * Response status codes
156 + * @const
157 + * @enum {number}
158 + */
159 +u2f.ErrorCodes = {
160 + 'OK': 0,
161 + 'OTHER_ERROR': 1,
162 + 'BAD_REQUEST': 2,
163 + 'CONFIGURATION_UNSUPPORTED': 3,
164 + 'DEVICE_INELIGIBLE': 4,
165 + 'TIMEOUT': 5
166 + };
167 +
168 +
169 + /**
170 + * A message for registration requests
171 + * @typedef {{
172 + * type: u2f.MessageTypes,
173 + * appId: ?string,
174 + * timeoutSeconds: ?number,
175 + * requestId: ?number
176 + * }}
177 + */
178 +u2f.U2fRequest;
179 +
180 +
181 + /**
182 + * A message for registration responses
183 + * @typedef {{
184 + * type: u2f.MessageTypes,
185 + * responseData: (u2f.Error | u2f.RegisterResponse | u2f.SignResponse),
186 + * requestId: ?number
187 + * }}
188 + */
189 +u2f.U2fResponse;
190 +
191 +
192 + /**
193 + * An error object for responses
194 + * @typedef {{
195 + * errorCode: u2f.ErrorCodes,
196 + * errorMessage: ?string
197 + * }}
198 + */
199 +u2f.Error;
200 +
201 + /**
202 + * Data object for a single sign request.
203 + * @typedef {enum {BLUETOOTH_RADIO, BLUETOOTH_LOW_ENERGY, USB, NFC}}
204 + */
205 +u2f.Transport;
206 +
207 +
208 + /**
209 + * Data object for a single sign request.
210 + * @typedef {Array<u2f.Transport>}
211 + */
212 +u2f.Transports;
213 +
214 + /**
215 + * Data object for a single sign request.
216 + * @typedef {{
217 + * version: string,
218 + * challenge: string,
219 + * keyHandle: string,
220 + * appId: string
221 + * }}
222 + */
223 +u2f.SignRequest;
224 +
225 +
226 + /**
227 + * Data object for a sign response.
228 + * @typedef {{
229 + * keyHandle: string,
230 + * signatureData: string,
231 + * clientData: string
232 + * }}
233 + */
234 +u2f.SignResponse;
235 +
236 +
237 + /**
238 + * Data object for a registration request.
239 + * @typedef {{
240 + * version: string,
241 + * challenge: string
242 + * }}
243 + */
244 +u2f.RegisterRequest;
245 +
246 +
247 + /**
248 + * Data object for a registration response.
249 + * @typedef {{
250 + * version: string,
251 + * keyHandle: string,
252 + * transports: Transports,
253 + * appId: string
254 + * }}
255 + */
256 +u2f.RegisterResponse;
257 +
258 +
259 + /**
260 + * Data object for a registered key.
261 + * @typedef {{
262 + * version: string,
263 + * keyHandle: string,
264 + * transports: ?Transports,
265 + * appId: ?string
266 + * }}
267 + */
268 +u2f.RegisteredKey;
269 +
270 +
271 + /**
272 + * Data object for a get API register response.
273 + * @typedef {{
274 + * js_api_version: number
275 + * }}
276 + */
277 +u2f.GetJsApiVersionResponse;
278 +
279 +
280 + //Low level MessagePort API support
281 +
282 + /**
283 + * Sets up a MessagePort to the U2F extension using the
284 + * available mechanisms.
285 + * @param {function((MessagePort|u2f.WrappedChromeRuntimePort_))} callback
286 + */
287 +u2f.getMessagePort = function (callback) {
288 + if (typeof chrome != 'undefined' && chrome.runtime) {
289 + // The actual message here does not matter, but we need to get a reply
290 + // for the callback to run. Thus, send an empty signature request
291 + // in order to get a failure response.
292 + var msg = {
293 + type: u2f.MessageTypes.U2F_SIGN_REQUEST,
294 + signRequests: []
295 + };
296 + chrome.runtime.sendMessage(u2f.EXTENSION_ID, msg, function () {
297 + if (!chrome.runtime.lastError) {
298 + // We are on a whitelisted origin and can talk directly
299 + // with the extension.
300 + u2f.getChromeRuntimePort_(callback);
301 + } else {
302 + // chrome.runtime was available, but we couldn't message
303 + // the extension directly, use iframe
304 + u2f.getIframePort_(callback);
305 + }
306 + });
307 + } else if (u2f.isAndroidChrome_()) {
308 + u2f.getAuthenticatorPort_(callback);
309 + } else if (u2f.isIosChrome_()) {
310 + u2f.getIosPort_(callback);
311 + } else {
312 + // chrome.runtime was not available at all, which is normal
313 + // when this origin doesn't have access to any extensions.
314 + u2f.getIframePort_(callback);
315 + }
316 + };
317 +
318 + /**
319 + * Detect chrome running on android based on the browser's useragent.
320 + * @private
321 + */
322 +u2f.isAndroidChrome_ = function () {
323 + var userAgent = navigator.userAgent;
324 + return userAgent.indexOf('Chrome') != -1 &&
325 + userAgent.indexOf('Android') != -1;
326 + };
327 +
328 + /**
329 + * Detect chrome running on iOS based on the browser's platform.
330 + * @private
331 + */
332 +u2f.isIosChrome_ = function () {
333 + var r = ["iPhone", "iPad", "iPod"];
334 + for (var i in r) { if (navigator.platform == r[i]) { return true; } }
335 + return false;
336 + //return $.inArray(navigator.platform, ["iPhone", "iPad", "iPod"]) > -1;
337 + };
338 +
339 + /**
340 + * Connects directly to the extension via chrome.runtime.connect.
341 + * @param {function(u2f.WrappedChromeRuntimePort_)} callback
342 + * @private
343 + */
344 +u2f.getChromeRuntimePort_ = function (callback) {
345 + var port = chrome.runtime.connect(u2f.EXTENSION_ID,
346 + { 'includeTlsChannelId': true });
347 + setTimeout(function () {
348 + callback(new u2f.WrappedChromeRuntimePort_(port));
349 + }, 0);
350 + };
351 +
352 + /**
353 + * Return a 'port' abstraction to the Authenticator app.
354 + * @param {function(u2f.WrappedAuthenticatorPort_)} callback
355 + * @private
356 + */
357 +u2f.getAuthenticatorPort_ = function (callback) {
358 + setTimeout(function () {
359 + callback(new u2f.WrappedAuthenticatorPort_());
360 + }, 0);
361 + };
362 +
363 + /**
364 + * Return a 'port' abstraction to the iOS client app.
365 + * @param {function(u2f.WrappedIosPort_)} callback
366 + * @private
367 + */
368 +u2f.getIosPort_ = function (callback) {
369 + setTimeout(function () {
370 + callback(new u2f.WrappedIosPort_());
371 + }, 0);
372 + };
373 +
374 + /**
375 + * A wrapper for chrome.runtime.Port that is compatible with MessagePort.
376 + * @param {Port} port
377 + * @constructor
378 + * @private
379 + */
380 +u2f.WrappedChromeRuntimePort_ = function (port) {
381 + this.port_ = port;
382 + };
383 +
384 + /**
385 + * Format and return a sign request compliant with the JS API version supported by the extension.
386 + * @param {Array<u2f.SignRequest>} signRequests
387 + * @param {number} timeoutSeconds
388 + * @param {number} reqId
389 + * @return {Object}
390 + */
391 +u2f.formatSignRequest_ =
392 + function (appId, challenge, registeredKeys, timeoutSeconds, reqId) {
393 + if (js_api_version === undefined || js_api_version < 1.1) {
394 + // Adapt request to the 1.0 JS API
395 + var signRequests = [];
396 + for (var i = 0; i < registeredKeys.length; i++) {
397 + signRequests[i] = {
398 + version: registeredKeys[i].version,
399 + challenge: challenge,
400 + keyHandle: registeredKeys[i].keyHandle,
401 + appId: appId
402 + };
403 + }
404 + return {
405 + type: u2f.MessageTypes.U2F_SIGN_REQUEST,
406 + signRequests: signRequests,
407 + timeoutSeconds: timeoutSeconds,
408 + requestId: reqId
409 + };
410 + }
411 + // JS 1.1 API
412 + return {
413 + type: u2f.MessageTypes.U2F_SIGN_REQUEST,
414 + appId: appId,
415 + challenge: challenge,
416 + registeredKeys: registeredKeys,
417 + timeoutSeconds: timeoutSeconds,
418 + requestId: reqId
419 + };
420 + };
421 +
422 + /**
423 + * Format and return a register request compliant with the JS API version supported by the extension..
424 + * @param {Array<u2f.SignRequest>} signRequests
425 + * @param {Array<u2f.RegisterRequest>} signRequests
426 + * @param {number} timeoutSeconds
427 + * @param {number} reqId
428 + * @return {Object}
429 + */
430 +u2f.formatRegisterRequest_ =
431 + function (appId, registeredKeys, registerRequests, timeoutSeconds, reqId) {
432 + if (js_api_version === undefined || js_api_version < 1.1) {
433 + // Adapt request to the 1.0 JS API
434 + for (var i = 0; i < registerRequests.length; i++) {
435 + registerRequests[i].appId = appId;
436 + }
437 + var signRequests = [];
438 + for (var i = 0; i < registeredKeys.length; i++) {
439 + signRequests[i] = {
440 + version: registeredKeys[i].version,
441 + challenge: registerRequests[0],
442 + keyHandle: registeredKeys[i].keyHandle,
443 + appId: appId
444 + };
445 + }
446 + return {
447 + type: u2f.MessageTypes.U2F_REGISTER_REQUEST,
448 + signRequests: signRequests,
449 + registerRequests: registerRequests,
450 + timeoutSeconds: timeoutSeconds,
451 + requestId: reqId
452 + };
453 + }
454 + // JS 1.1 API
455 + return {
456 + type: u2f.MessageTypes.U2F_REGISTER_REQUEST,
457 + appId: appId,
458 + registerRequests: registerRequests,
459 + registeredKeys: registeredKeys,
460 + timeoutSeconds: timeoutSeconds,
461 + requestId: reqId
462 + };
463 + };
464 +
465 +
466 + /**
467 + * Posts a message on the underlying channel.
468 + * @param {Object} message
469 + */
470 +u2f.WrappedChromeRuntimePort_.prototype.postMessage = function (message) {
471 + this.port_.postMessage(message);
472 + };
473 +
474 +
475 + /**
476 + * Emulates the HTML 5 addEventListener interface. Works only for the
477 + * onmessage event, which is hooked up to the chrome.runtime.Port.onMessage.
478 + * @param {string} eventName
479 + * @param {function({data: Object})} handler
480 + */
481 +u2f.WrappedChromeRuntimePort_.prototype.addEventListener =
482 + function (eventName, handler) {
483 + var name = eventName.toLowerCase();
484 + if (name == 'message' || name == 'onmessage') {
485 + this.port_.onMessage.addListener(function (message) {
486 + // Emulate a minimal MessageEvent object
487 + handler({ 'data': message });
488 + });
489 + } else {
490 + console.error('WrappedChromeRuntimePort only supports onMessage');
491 + }
492 + };
493 +
494 + /**
495 + * Wrap the Authenticator app with a MessagePort interface.
496 + * @constructor
497 + * @private
498 + */
499 +u2f.WrappedAuthenticatorPort_ = function () {
500 + this.requestId_ = -1;
501 + this.requestObject_ = null;
502 + }
503 +
504 + /**
505 + * Launch the Authenticator intent.
506 + * @param {Object} message
507 + */
508 +u2f.WrappedAuthenticatorPort_.prototype.postMessage = function (message) {
509 + var intentUrl =
510 + u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_ +
511 + ';S.request=' + encodeURIComponent(JSON.stringify(message)) +
512 + ';end';
513 + document.location = intentUrl;
514 + };
515 +
516 + /**
517 + * Tells what type of port this is.
518 + * @return {String} port type
519 + */
520 +u2f.WrappedAuthenticatorPort_.prototype.getPortType = function () {
521 + return "WrappedAuthenticatorPort_";
522 + };
523 +
524 +
525 + /**
526 + * Emulates the HTML 5 addEventListener interface.
527 + * @param {string} eventName
528 + * @param {function({data: Object})} handler
529 + */
530 +u2f.WrappedAuthenticatorPort_.prototype.addEventListener = function (eventName, handler) {
531 + var name = eventName.toLowerCase();
532 + if (name == 'message') {
533 + var self = this;
534 + /* Register a callback to that executes when
535 + * chrome injects the response. */
536 + window.addEventListener(
537 + 'message', self.onRequestUpdate_.bind(self, handler), false);
538 + } else {
539 + console.error('WrappedAuthenticatorPort only supports message');
540 + }
541 + };
542 +
543 + /**
544 + * Callback invoked when a response is received from the Authenticator.
545 + * @param function({data: Object}) callback
546 + * @param {Object} message message Object
547 + */
548 +u2f.WrappedAuthenticatorPort_.prototype.onRequestUpdate_ =
549 + function (callback, message) {
550 + var messageObject = JSON.parse(message.data);
551 + var intentUrl = messageObject['intentURL'];
552 +
553 + var errorCode = messageObject['errorCode'];
554 + var responseObject = null;
555 + if (messageObject.hasOwnProperty('data')) {
556 + responseObject = /** @type {Object} */ (
557 + JSON.parse(messageObject['data']));
558 + }
559 +
560 + callback({ 'data': responseObject });
561 + };
562 +
563 + /**
564 + * Base URL for intents to Authenticator.
565 + * @const
566 + * @private
567 + */
568 +u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_ =
569 + 'intent:#Intent;action=com.google.android.apps.authenticator.AUTHENTICATE';
570 +
571 + /**
572 + * Wrap the iOS client app with a MessagePort interface.
573 + * @constructor
574 + * @private
575 + */
576 +u2f.WrappedIosPort_ = function () { };
577 +
578 + /**
579 + * Launch the iOS client app request
580 + * @param {Object} message
581 + */
582 +u2f.WrappedIosPort_.prototype.postMessage = function (message) {
583 + var str = JSON.stringify(message);
584 + var url = "u2f://auth?" + encodeURI(str);
585 + location.replace(url);
586 + };
587 +
588 + /**
589 + * Tells what type of port this is.
590 + * @return {String} port type
591 + */
592 +u2f.WrappedIosPort_.prototype.getPortType = function () {
593 + return "WrappedIosPort_";
594 + };
595 +
596 + /**
597 + * Emulates the HTML 5 addEventListener interface.
598 + * @param {string} eventName
599 + * @param {function({data: Object})} handler
600 + */
601 +u2f.WrappedIosPort_.prototype.addEventListener = function (eventName, handler) {
602 + var name = eventName.toLowerCase();
603 + if (name !== 'message') {
604 + console.error('WrappedIosPort only supports message');
605 + }
606 + };
607 +
608 + /**
609 + * Sets up an embedded trampoline iframe, sourced from the extension.
610 + * @param {function(MessagePort)} callback
611 + * @private
612 + */
613 +u2f.getIframePort_ = function (callback) {
614 + // Create the iframe
615 + var iframeOrigin = 'chrome-extension://' + u2f.EXTENSION_ID;
616 + var iframe = document.createElement('iframe');
617 + iframe.src = iframeOrigin + '/u2f-comms.html';
618 + iframe.setAttribute('style', 'display:none');
619 + document.body.appendChild(iframe);
620 +
621 + var channel = new MessageChannel();
622 + var ready = function (message) {
623 + if (message.data == 'ready') {
624 + channel.port1.removeEventListener('message', ready);
625 + callback(channel.port1);
626 + } else {
627 + console.error('First event on iframe port was not "ready"');
628 + }
629 + };
630 + channel.port1.addEventListener('message', ready);
631 + channel.port1.start();
632 +
633 + iframe.addEventListener('load', function () {
634 + // Deliver the port to the iframe and initialize
635 + iframe.contentWindow.postMessage('init', iframeOrigin, [channel.port2]);
636 + });
637 + };
638 +
639 +
640 + //High-level JS API
641 +
642 + /**
643 + * Default extension response timeout in seconds.
644 + * @const
645 + */
646 +u2f.EXTENSION_TIMEOUT_SEC = 30;
647 +
648 + /**
649 + * A singleton instance for a MessagePort to the extension.
650 + * @type {MessagePort|u2f.WrappedChromeRuntimePort_}
651 + * @private
652 + */
653 +u2f.port_ = null;
654 +
655 + /**
656 + * Callbacks waiting for a port
657 + * @type {Array<function((MessagePort|u2f.WrappedChromeRuntimePort_))>}
658 + * @private
659 + */
660 +u2f.waitingForPort_ = [];
661 +
662 + /**
663 + * A counter for requestIds.
664 + * @type {number}
665 + * @private
666 + */
667 +u2f.reqCounter_ = 0;
668 +
669 + /**
670 + * A map from requestIds to client callbacks
671 + * @type {Object.<number,(function((u2f.Error|u2f.RegisterResponse))
672 + * |function((u2f.Error|u2f.SignResponse)))>}
673 + * @private
674 + */
675 +u2f.callbackMap_ = {};
676 +
677 + /**
678 + * Creates or retrieves the MessagePort singleton to use.
679 + * @param {function((MessagePort|u2f.WrappedChromeRuntimePort_))} callback
680 + * @private
681 + */
682 +u2f.getPortSingleton_ = function (callback) {
683 + if (u2f.port_) {
684 + callback(u2f.port_);
685 + } else {
686 + if (u2f.waitingForPort_.length == 0) {
687 + u2f.getMessagePort(function (port) {
688 + u2f.port_ = port;
689 + u2f.port_.addEventListener('message',
690 + /** @type {function(Event)} */ (u2f.responseHandler_));
691 +
692 + // Careful, here be async callbacks. Maybe.
693 + while (u2f.waitingForPort_.length)
694 + u2f.waitingForPort_.shift()(u2f.port_);
695 + });
696 + }
697 + u2f.waitingForPort_.push(callback);
698 + }
699 + };
700 +
701 + /**
702 + * Handles response messages from the extension.
703 + * @param {MessageEvent.<u2f.Response>} message
704 + * @private
705 + */
706 +u2f.responseHandler_ = function (message) {
707 + var response = message.data;
708 + var reqId = response['requestId'];
709 + if (!reqId || !u2f.callbackMap_[reqId]) {
710 + console.error('Unknown or missing requestId in response.');
711 + return;
712 + }
713 + var cb = u2f.callbackMap_[reqId];
714 + delete u2f.callbackMap_[reqId];
715 + cb(response['responseData']);
716 + };
717 +
718 + /**
719 + * Dispatches an array of sign requests to available U2F tokens.
720 + * If the JS API version supported by the extension is unknown, it first sends a
721 + * message to the extension to find out the supported API version and then it sends
722 + * the sign request.
723 + * @param {string=} appId
724 + * @param {string=} challenge
725 + * @param {Array<u2f.RegisteredKey>} registeredKeys
726 + * @param {function((u2f.Error|u2f.SignResponse))} callback
727 + * @param {number=} opt_timeoutSeconds
728 + */
729 +u2f.sign = function (appId, challenge, registeredKeys, callback, opt_timeoutSeconds) {
730 + if (js_api_version === undefined) {
731 + // Send a message to get the extension to JS API version, then send the actual sign request.
732 + u2f.getApiVersion(
733 + function (response) {
734 + js_api_version = response['js_api_version'] === undefined ? 0 : response['js_api_version'];
735 + //console.log("Extension JS API Version: ", js_api_version);
736 + u2f.sendSignRequest(appId, challenge, registeredKeys, callback, opt_timeoutSeconds);
737 + });
738 + } else {
739 + // We know the JS API version. Send the actual sign request in the supported API version.
740 + u2f.sendSignRequest(appId, challenge, registeredKeys, callback, opt_timeoutSeconds);
741 + }
742 + };
743 +
744 + /**
745 + * Dispatches an array of sign requests to available U2F tokens.
746 + * @param {string=} appId
747 + * @param {string=} challenge
748 + * @param {Array<u2f.RegisteredKey>} registeredKeys
749 + * @param {function((u2f.Error|u2f.SignResponse))} callback
750 + * @param {number=} opt_timeoutSeconds
751 + */
752 +u2f.sendSignRequest = function (appId, challenge, registeredKeys, callback, opt_timeoutSeconds) {
753 + u2f.getPortSingleton_(function (port) {
754 + var reqId = ++u2f.reqCounter_;
755 + u2f.callbackMap_[reqId] = callback;
756 + var timeoutSeconds = (typeof opt_timeoutSeconds !== 'undefined' ?
757 + opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC);
758 + var req = u2f.formatSignRequest_(appId, challenge, registeredKeys, timeoutSeconds, reqId);
759 + port.postMessage(req);
760 + });
761 + };
762 +
763 + /**
764 + * Dispatches register requests to available U2F tokens. An array of sign
765 + * requests identifies already registered tokens.
766 + * If the JS API version supported by the extension is unknown, it first sends a
767 + * message to the extension to find out the supported API version and then it sends
768 + * the register request.
769 + * @param {string=} appId
770 + * @param {Array<u2f.RegisterRequest>} registerRequests
771 + * @param {Array<u2f.RegisteredKey>} registeredKeys
772 + * @param {function((u2f.Error|u2f.RegisterResponse))} callback
773 + * @param {number=} opt_timeoutSeconds
774 + */
775 +u2f.register = function (appId, registerRequests, registeredKeys, callback, opt_timeoutSeconds) {
776 + if (js_api_version === undefined) {
777 + // Send a message to get the extension to JS API version, then send the actual register request.
778 + u2f.getApiVersion(
779 + function (response) {
780 + js_api_version = response['js_api_version'] === undefined ? 0: response['js_api_version'];
781 + //console.log("Extension JS API Version: ", js_api_version);
782 + u2f.sendRegisterRequest(appId, registerRequests, registeredKeys,
783 + callback, opt_timeoutSeconds);
784 + });
785 + } else {
786 + // We know the JS API version. Send the actual register request in the supported API version.
787 + u2f.sendRegisterRequest(appId, registerRequests, registeredKeys,
788 + callback, opt_timeoutSeconds);
789 + }
790 + };
791 +
792 + /**
793 + * Dispatches register requests to available U2F tokens. An array of sign
794 + * requests identifies already registered tokens.
795 + * @param {string=} appId
796 + * @param {Array<u2f.RegisterRequest>} registerRequests
797 + * @param {Array<u2f.RegisteredKey>} registeredKeys
798 + * @param {function((u2f.Error|u2f.RegisterResponse))} callback
799 + * @param {number=} opt_timeoutSeconds
800 + */
801 +u2f.sendRegisterRequest = function (appId, registerRequests, registeredKeys, callback, opt_timeoutSeconds) {
802 + u2f.getPortSingleton_(function (port) {
803 + var reqId = ++u2f.reqCounter_;
804 + u2f.callbackMap_[reqId] = callback;
805 + var timeoutSeconds = (typeof opt_timeoutSeconds !== 'undefined' ?
806 + opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC);
807 + var req = u2f.formatRegisterRequest_(
808 + appId, registeredKeys, registerRequests, timeoutSeconds, reqId);
809 + port.postMessage(req);
810 + });
811 + };
812 +
813 +
814 + /**
815 + * Dispatches a message to the extension to find out the supported
816 + * JS API version.
817 + * If the user is on a mobile phone and is thus using Google Authenticator instead
818 + * of the Chrome extension, don't send the request and simply return 0.
819 + * @param {function((u2f.Error|u2f.GetJsApiVersionResponse))} callback
820 + * @param {number=} opt_timeoutSeconds
821 + */
822 +u2f.getApiVersion = function (callback, opt_timeoutSeconds) {
823 + u2f.getPortSingleton_(function (port) {
824 + // If we are using Android Google Authenticator or iOS client app,
825 + // do not fire an intent to ask which JS API version to use.
826 + if (port.getPortType) {
827 + var apiVersion;
828 + switch (port.getPortType()) {
829 + case 'WrappedIosPort_':
830 + case 'WrappedAuthenticatorPort_':
831 + apiVersion = 1.1;
832 + break;
833 +
834 + default:
835 + apiVersion = 0;
836 + break;
837 + }
838 + callback({ 'js_api_version': apiVersion });
839 + return;
840 + }
841 + var reqId = ++u2f.reqCounter_;
842 + u2f.callbackMap_[reqId] = callback;
843 + var req = {
844 + type: u2f.MessageTypes.U2F_GET_API_VERSION_REQUEST,
845 + timeoutSeconds: (typeof opt_timeoutSeconds !== 'undefined' ?
846 + opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC),
847 + requestId: reqId
848 + };
849 + port.postMessage(req);
850 + });
851 + };
852 +
853 +}
854 + 'use strict';
855 + var passhint = "{{{passhint}}}";
856 + var newAccountPass = parseInt('{{{newAccountPass}}}');
857 + var emailCheck = ('{{{emailcheck}}}' == 'true');
858 + var passRequirements = "{{{passRequirements}}}";
859 + var hardwareKeyChallenge = '{{{hkey}}}';
860 + if (passRequirements != "") { passRequirements = JSON.parse(decodeURIComponent(passRequirements)); } else { passRequirements = {}; }
861 + var passRequirementsEx = ((passRequirements.min != null) || (passRequirements.max != null) || (passRequirements.upper != null) || (passRequirements.lower != null) || (passRequirements.numeric != null) || (passRequirements.nonalpha != null));
862 + var features = parseInt('{{{features}}}');
863 + var webPageFullScreen = getstore('webPageFullScreen', true);
864 + if (webPageFullScreen == 'false') { webPageFullScreen = false; }
865 + if (webPageFullScreen == 'true') { webPageFullScreen = true; }
866 + var welcomeText = decodeURIComponent("{{{welcometext}}}");
867 + var currentpanel = 0;
868 + toggleFullScreen();
869 +
870 + function startup() {
871 + if ((features & 32) == 0) {
872 + // Guard against other site's top frames (web bugs).
873 + var loc = null;
874 + try { loc = top.location.toString().toLowerCase(); } catch (e) { }
875 + if (top != self && (loc == null || top.active == false)) { top.location = self.location; return; }
876 + }
877 +
878 + QV('createPanelHint', passRequirements.hint === true);
879 + QV('resetpasswordpanelHint', passRequirements.hint === true);
880 +
881 + // Display the welcome text
882 + if (welcomeText) { QH('welcomeText', welcomeText); }
883 + QV('welcomeText', true);
884 +
885 + window.onresize = center;
886 + center();
887 +
888 + validateLogin();
889 + validateCreate();
890 + if ('{{loginmode}}' != '') { go(parseInt('{{loginmode}}')); } else { go(1); }
891 + QV('newAccountDiv', ('{{{newAccount}}}' != '0') && ('{{{newAccount}}}' != 'false')); // If new accounts are not allowed, don't display the new account link.
892 + if ((passhint != null) && (passhint.length > 0)) { QV("showPassHintLink", true); }
893 + QV("newAccountPass", (newAccountPass == 1));
894 + QV("resetAccountDiv", (emailCheck == true));
895 + QV("hrAccountDiv", (emailCheck == true) || (newAccountPass == 1));
896 +
897 + if ('{{loginmode}}' == '4') {
898 + try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
899 + if ((hardwareKeyChallenge != null) && (hardwareKeyChallenge.type == 'webAuthn')) {
900 + hardwareKeyChallenge.challenge = Uint8Array.from(atob(hardwareKeyChallenge.challenge), c => c.charCodeAt(0)).buffer;
901 +
902 + const publicKeyCredentialRequestOptions = { challenge: hardwareKeyChallenge.challenge, allowCredentials: [], timeout: hardwareKeyChallenge.timeout }
903 + for (var i = 0; i < hardwareKeyChallenge.keyIds.length; i++) {
904 + publicKeyCredentialRequestOptions.allowCredentials.push(
905 + { id: Uint8Array.from(atob(hardwareKeyChallenge.keyIds[i]), c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }
906 + );
907 + }
908 +
909 + // New WebAuthn hardware keys
910 + navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
911 + function (rawAssertion) {
912 + var assertion = {
913 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
914 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
915 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
916 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
917 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
918 + };
919 + Q('hwtokenInput').value = JSON.stringify(assertion);
920 + QE('tokenOkButton', true);
921 + Q('tokenOkButton').click();
922 + },
923 + function (error) { console.log('credentials-get error', error); }
924 + );
925 + } else if ((hardwareKeyChallenge != null) && u2fSupported()) {
926 + // Old U2F hardware keys
927 + window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
928 + if ((currentpanel == 4) && authResponse.signatureData) {
929 + Q('hwtokenInput').value = JSON.stringify(authResponse);
930 + QE('tokenOkButton', true);
931 + Q('tokenOkButton').click();
932 + }
933 + }, hardwareKeyChallenge.timeoutSeconds);
934 + }
935 + }
936 +
937 + if ('{{loginmode}}' == '5') {
938 + try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
939 + if ((hardwareKeyChallenge != null) && (hardwareKeyChallenge.type == 'webAuthn')) {
940 + hardwareKeyChallenge.challenge = Uint8Array.from(atob(hardwareKeyChallenge.challenge), c => c.charCodeAt(0)).buffer;
941 +
942 + const publicKeyCredentialRequestOptions = { challenge: hardwareKeyChallenge.challenge, allowCredentials: [], timeout: hardwareKeyChallenge.timeout }
943 + for (var i = 0; i < hardwareKeyChallenge.keyIds.length; i++) {
944 + publicKeyCredentialRequestOptions.allowCredentials.push(
945 + { id: Uint8Array.from(atob(hardwareKeyChallenge.keyIds[i]), c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }
946 + );
947 + }
948 +
949 + // New WebAuthn hardware keys
950 + navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
951 + function (rawAssertion) {
952 + var assertion = {
953 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
954 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
955 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
956 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
957 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
958 + };
959 + Q('resetHwtokenInput').value = JSON.stringify(assertion);
960 + QE('resetTokenOkButton', true);
961 + Q('resetTokenOkButton').click();
962 + },
963 + function (error) { console.log('credentials-get error', error); }
964 + );
965 + } else if ((hardwareKeyChallenge != null) && u2fSupported()) {
966 + // Old U2F hardware keys
967 + window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
968 + if ((currentpanel == 5) && authResponse.signatureData) {
969 + Q('resetHwtokenInput').value = JSON.stringify(authResponse);
970 + QE('resetTokenOkButton', true);
971 + Q('resetTokenOkButton').click();
972 + }
973 + }, hardwareKeyChallenge.timeoutSeconds);
974 + }
975 + }
976 + }
977 +
978 + function showPassHint() {
979 + messagebox("Password Hint", passhint);
980 + }
981 +
982 + function xgo(x) {
983 + QV('message1', false);
984 + QV('message2', false);
985 + QV('message3', false);
986 + QV('message4', false);
987 + QV('message5', false);
988 + QV('message6', false);
989 + go(x);
990 + }
991 +
992 + function go(x) {
993 + currentpanel = x;
994 + setDialogMode(0);
995 + QV("showPassHintLink", false);
996 + QV('loginpanel', x == 1);
997 + QV('createpanel', x == 2);
998 + QV('resetpanel', x == 3);
999 + QV('tokenpanel', x == 4);
1000 + QV('resettokenpanel', x == 5);
1001 + QV('resetpasswordpanel', x == 6);
1002 + if (x == 1) { Q('username').focus(); }
1003 + if (x == 2) { Q('ausername').focus(); }
1004 + if (x == 3) { Q('remail').focus(); }
1005 + if (x == 4) { Q('tokenInput').focus(); }
1006 + if (x == 5) { Q('resetTokenInput').focus(); }
1007 + if (x == 6) { Q('rapassword1').focus(); }
1008 + }
1009 +
1010 + function validateLogin(box, e) {
1011 + var ok = ((Q('username').value.length > 0) && (Q('username').value.indexOf(' ') == -1) && (Q('password').value.length > 0));
1012 + QE('loginButton', ok);
1013 + setDialogMode(0);
1014 + if ((e != null) && (e.keyCode == 13)) { if (box == 1) { Q('password').focus(); } else if (box == 2) { Q('loginButton').click(); } }
1015 + if (e != null) { haltEvent(e); }
1016 + }
1017 +
1018 + function validateCreate(box, e) {
1019 + setDialogMode(0);
1020 + var userok = (Q('ausername').value.length > 0) && (Q('ausername').value.indexOf(' ') == -1);
1021 + var emailok = (validateEmail(Q('aemail').value) == true);
1022 + var pass1ok = (Q('apassword1').value.length > 0);
1023 + var pass2ok = (Q('apassword2').value.length > 0) && (Q('apassword2').value == Q('apassword1').value);
1024 + var newAccOk = (newAccountPass == 0) || (Q('anewaccountpass').value.length > 0);
1025 + var ok = (userok && emailok && pass1ok && pass2ok && newAccOk);
1026 +
1027 + // Color the fields
1028 + QS('nuUser').color = userok?'black':'#7b241c';
1029 + QS('nuEmail').color = emailok?'black':'#7b241c';
1030 + QS('nuPass1').color = pass1ok?'black':'#7b241c';
1031 + QS('nuPass2').color = pass2ok?'black':'#7b241c';
1032 + QS('nuToken').color = newAccOk?'black':'#7b241c';
1033 +
1034 + if (Q('apassword1').value == '') {
1035 + QH('passWarning', '');
1036 + QV('passwordPolicyCallout', false);
1037 + } else {
1038 + if (!passRequirementsEx) {
1039 + // No password requirements, display password strength
1040 + var passStrength = checkPasswordStrength(Q('apassword1').value);
1041 + if (passStrength >= 80) { QH('passWarning', '<span style=color:green><b>Strong Password</b><span>'); }
1042 + else if (passStrength >= 60) { QH('passWarning', '<span style=color:blue><b>Good Password</b><span>'); }
1043 + else { QH('passWarning', '<span style=color:red><b>Weak Password</b><span>'); }
1044 + } else {
1045 + // Password requirements provided, use that
1046 + var passReq = checkPasswordRequirements(Q('apassword1').value, passRequirements);
1047 + if (passReq == false) {
1048 + ok = false;
1049 + QS('nuPass1').color = '#7b241c';
1050 + QS('nuPass2').color = '#7b241c';
1051 + QH('passWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>'); // This is also a link to the password policy
1052 + QV('passwordPolicyCallout', true);
1053 + QH('passwordPolicyCallout', passwordPolicyText(Q('apassword1').value));
1054 + } else {
1055 + QH('passWarning', '');
1056 + QV('passwordPolicyCallout', false);
1057 + }
1058 + }
1059 + }
1060 + if ((e != null) && (e.keyCode == 13)) {
1061 + if (box == 1) { Q('aemail').focus(); }
1062 + if (box == 2) { Q('apassword1').focus(); }
1063 + if (box == 3) { Q('apassword2').focus(); }
1064 + if (box == 4) { Q('apasswordhint').focus(); }
1065 + if (box == 5) { if (newAccountPass == 1) { Q('anewaccountpass').focus(); } else { Q('createButton').click(); } }
1066 + if (box == 6) { Q('createButton').click(); }
1067 + }
1068 + if (e != null) { haltEvent(e); }
1069 + QE('createButton', ok);
1070 + }
1071 +
1072 + function validatePassReset(box, e) {
1073 + setDialogMode(0);
1074 + var pass1ok = (Q('rapassword1').value.length > 0);
1075 + var pass2ok = (Q('rapassword2').value.length > 0) && (Q('rapassword2').value == Q('rapassword1').value);
1076 + var ok = (pass1ok && pass2ok);
1077 +
1078 + // Color the fields
1079 + QS('rnuPass1').color = pass1ok ? 'black' : '#7b241c';
1080 + QS('rnuPass2').color = pass2ok ? 'black' : '#7b241c';
1081 +
1082 + if (Q('rapassword1').value == '') {
1083 + QH('rpassWarning', '');
1084 + QV('rpasswordPolicyCallout', false);
1085 + } else {
1086 + if (!passRequirementsEx) {
1087 + // No password requirements, display password strength
1088 + var passStrength = checkPasswordStrength(Q('rapassword1').value);
1089 + if (passStrength >= 80) { QH('rpassWarning', '<span style=color:green><b>Strong Password</b><span>'); }
1090 + else if (passStrength >= 60) { QH('rpassWarning', '<span style=color:blue><b>Good Password</b><span>'); }
1091 + else { QH('rpassWarning', '<span style=color:red><b>Weak Password</b><span>'); }
1092 + } else {
1093 + // Password requirements provided, use that
1094 + var passReq = checkPasswordRequirements(Q('rapassword1').value, passRequirements);
1095 + if (passReq == false) {
1096 + ok = false;
1097 + QS('rnuPass1').color = '#7b241c';
1098 + QS('rnuPass2').color = '#7b241c';
1099 + QH('rpassWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>'); // This is also a link to the password policy
1100 + QV('rpasswordPolicyCallout', true);
1101 + QH('rpasswordPolicyCallout', passwordPolicyText(Q('rapassword1').value));
1102 + } else {
1103 + QH('rpassWarning', '');
1104 + QV('rpasswordPolicyCallout', false);
1105 + }
1106 + }
1107 + }
1108 + if ((e != null) && (e.keyCode == 13)) {
1109 + if (box == 2) { Q('rapassword1').focus(); }
1110 + if (box == 3) { Q('rapassword2').focus(); }
1111 + if (box == 4) { Q('rapasswordhint').focus(); }
1112 + if (box == 6) { Q('resetPassButton').click(); }
1113 + }
1114 + if (e != null) { haltEvent(e); }
1115 + QE('resetPassButton', ok);
1116 + }
1117 +
1118 + function passwordPolicyText(pass) {
1119 + var policy = '<div style=text-align:left>';
1120 + var counts = strCount(pass);
1121 + if (passRequirements.min && ((pass == null) || (pass.length < passRequirements.min))) { policy += 'Minimum length of ' + passRequirements.min + '<br />'; }
1122 + if (passRequirements.max && ((pass == null) || (pass.length > passRequirements.max))) { policy += 'Maximum length of ' + passRequirements.max + '<br />'; }
1123 + if (passRequirements.upper && ((pass == null) || (counts.upper < passRequirements.upper))) { policy += '' + passRequirements.upper + ' upper case<br />'; }
1124 + if (passRequirements.lower && ((pass == null) || (counts.lower < passRequirements.lower))) { policy += '' + passRequirements.lower + ' lower case<br />'; }
1125 + if (passRequirements.numeric && ((pass == null) || (counts.numeric < passRequirements.numeric))) { policy += '' + passRequirements.numeric + ' numeric<br />'; }
1126 + if (passRequirements.nonalpha && ((pass == null) || (counts.nonalpha < passRequirements.nonalpha))) { policy += passRequirements.nonalpha + ' non-alphanumeric<br />'; }
1127 + policy += '</div>';
1128 + return policy;
1129 + }
1130 +
1131 + function showPasswordPolicy() {
1132 + messagebox("Password Policy", passwordPolicyText());
1133 + }
1134 +
1135 + function validateReset(e) {
1136 + setDialogMode(0);
1137 + var x = validateEmail(Q('remail').value);
1138 + QE('eresetButton', x);
1139 + if ((e != null) && (e.keyCode == 13) && (x == true)) {
1140 + Q('eresetButton').click();
1141 + }
1142 + if (e != null) { haltEvent(e); }
1143 + }
1144 +
1145 + // Return a password strength score
1146 + function checkPasswordStrength(password) {
1147 + var r = 0, letters = {}, varCount = 0, variations = { digits: /\d/.test(password), lower: /[a-z]/.test(password), upper: /[A-Z]/.test(password), nonWords: /\W/.test(password) }
1148 + if (!password) return 0;
1149 + for (var i = 0; i< password.length; i++) { letters[password[i]] = (letters[password[i]] || 0) + 1; r += 5.0 / letters[password[i]]; }
1150 + for (var c in variations) { varCount += (variations[c] == true) ? 1 : 0; }
1151 + return parseInt(r + (varCount - 1) * 10);
1152 + }
1153 +
1154 + // Check password requirements
1155 + function checkPasswordRequirements(password, requirements) {
1156 + if ((requirements == null) || (requirements == '') || (typeof requirements != 'object')) return true;
1157 + if (requirements.min) { if (password.length < requirements.min) return false; }
1158 + if (requirements.max) { if (password.length > requirements.max) return false; }
1159 + var counts = strCount(password);
1160 + if (requirements.numeric && (counts.numeric < requirements.numeric)) return false;
1161 + if (requirements.lower && (counts.lower < requirements.lower)) return false;
1162 + if (requirements.upper && (counts.upper < requirements.upper)) return false;
1163 + if (requirements.nonalpha && (counts.nonalpha < requirements.nonalpha)) return false;
1164 + return true;
1165 + }
1166 +
1167 + function strCount(password) {
1168 + var counts = { numeric: 0, lower: 0, upper: 0, nonalpha: 0 };
1169 + if (typeof password != 'string') return counts;
1170 + for (var i = 0; i < password.length; i++) {
1171 + if (/\d/.test(password[i])) { counts.numeric++; }
1172 + if (/[a-z]/.test(password[i])) { counts.lower++; }
1173 + if (/[A-Z]/.test(password[i])) { counts.upper++; }
1174 + if (/\W/.test(password[i])) { counts.nonalpha++; }
1175 + }
1176 + return counts;
1177 + }
1178 +
1179 + function checkToken() {
1180 + var t1 = Q('tokenInput').value;
1181 + var t2 = t1.split(' ').join('');
1182 + if (t1 != t2) { Q('tokenInput').value = t2; }
1183 + QE('tokenOkButton', (Q('tokenInput').value.length == 6) || (Q('tokenInput').value.length == 8) || (Q('tokenInput').value.length == 44));
1184 + }
1185 +
1186 + function resetCheckToken() {
1187 + var t1 = Q('resetTokenInput').value;
1188 + var t2 = t1.split(' ').join('');
1189 + if (t1 != t2) { Q('resetTokenInput').value = t2; }
1190 + QE('resetTokenOkButton', (Q('resetTokenInput').value.length == 6) || (Q('resetTokenInput').value.length == 8) || (Q('resetTokenInput').value.length == 44));
1191 + }
1192 +
1193 + //
1194 + // POPUP DIALOG
1195 + //
1196 +
1197 + // undefined = Hidden, 1 = Generic Message
1198 + var xxdialogMode;
1199 + var xxdialogFunc;
1200 + var xxdialogButtons;
1201 + var xxdialogTag;
1202 + var xxcurrentView = 0;
1203 +
1204 + // Display a dialog box
1205 + // Parameters: Dialog Mode (0 = none), Dialog Title, Buttons (1 = OK, 2 = Cancel, 3 = OK & Cancel), Call back function(0 = Cancel, 1 = OK), Dialog Content (Mode 2 only)
1206 + function setDialogMode(x, y, b, f, c, tag) {
1207 + xxdialogMode = x;
1208 + xxdialogFunc = f;
1209 + xxdialogButtons = b;
1210 + xxdialogTag = tag;
1211 + QE('idx_dlgOkButton', true);
1212 + QV('idx_dlgOkButton', b & 1);
1213 + QV('idx_dlgCancelButton', b & 2);
1214 + QV('id_dialogclose', (b & 2) || (b & 8));
1215 + QV('idx_dlgButtonBar', b & 7);
1216 + if (y) QH('id_dialogtitle', y);
1217 + for (var i = 1; i < 24; i++) { QV('dialog' + i, i == x); } // Edit this line when more dialogs are added
1218 + QV('dialog', x);
1219 + if (c) { if (x == 2) { QH('id_dialogOptions', c); } else { QH('id_dialogMessage', c); } }
1220 + }
1221 +
1222 + function dialogclose(x) {
1223 + var f = xxdialogFunc;
1224 + var b = xxdialogButtons;
1225 + var t = xxdialogTag;
1226 + setDialogMode();
1227 + if (((b & 8) || x) && f) f(x, t);
1228 + }
1229 +
1230 + // Toggle the web page to full screen
1231 + function toggleFullScreen(toggle) {
1232 + if (toggle === 1) { webPageFullScreen = !webPageFullScreen; putstore('webPageFullScreen', webPageFullScreen); }
1233 + if (webPageFullScreen == false) {
1234 + QS('container').width = '960px';
1235 + QS('container')["min-width"] = '960px';
1236 + QS('container')['border-right'] = '1px solid #b7b7b7';
1237 + QS('container')['border-left'] = '1px solid #b7b7b7';
1238 + QS('container')['overflow'] = 'hidden';
1239 + QS('column_l').height = '';
1240 + QS('column_l').width = '930px';
1241 + QS('column_l')["overflow-y"] = '';
1242 + QS('column_l')["max-height"] = 'calc(100vh - 111px)';
1243 + QS('column_l')["min-width"] = '';
1244 + QS('masthead')["width"] = '960px';
1245 + } else {
1246 + QS('container').width = '100%';
1247 + QS('container')['min-width'] = '';
1248 + QS('container')['border-right'] = '0';
1249 + QS('container')['border-left'] = '0';
1250 + QS('container')['overflow'] = 'hidden';
1251 + QS('column_l').height = 'calc(100vh - 135px)';
1252 + QS('column_l').width = '';
1253 + QS('column_l')["overflow-y"] = 'auto';
1254 + QS('column_l')["max-height"] = 'calc(100vh - 111px)';
1255 + QS('column_l')["min-width"] = '';
1256 + QS('masthead')["width"] = '100%';
1257 + }
1258 + QV('body', true);
1259 + center();
1260 + }
1261 +
1262 + function center() {
1263 + var w = getDocWidth();
1264 + QS('dialog').left = ((((w - 400) / 2)) + "px");
1265 + var showimage = (webPageFullScreen == false) || (w > 800);
1266 + QV('welcomeimage', showimage);
1267 + Q('logincell').setAttribute('align', showimage?'left':'center');
1268 +
1269 + if (webPageFullScreen == false) {
1270 + QS('centralTable')['margin-top'] = '';
1271 + } else {
1272 + var h = (Q('column_l').clientHeight / 2) - 250;
1273 + if (h < 0) h = 0;
1274 + QS('centralTable')['margin-top'] = h + 'px';
1275 + }
1276 + }
1277 + function messagebox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t, 1); }
1278 + function statusbox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t); }
1279 + function getDocWidth() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientWidth != 0) return document.documentElement.clientWidth; return document.getElementsByTagName('body')[0].clientWidth; }
1280 + function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
1281 + function haltReturn(e) { if (e.keyCode == 13) { haltEvent(e); } }
1282 + function validateEmail(v) { var emailReg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return emailReg.test(v); } // New version
1283 + function putstore(name, val) { try { if (typeof (localStorage) === 'undefined') return; localStorage.setItem(name, val); } catch (e) { } }
1284 + function getstore(name, val) { try { if (typeof (localStorage) === 'undefined') return val; var v = localStorage.getItem(name); if ((v == null) || (v == null)) return val; return v; } catch (e) { return val; } }
1285 + function u2fSupported() { return (window.u2f && ((navigator.userAgent.indexOf('Chrome/') > 0) || (navigator.userAgent.indexOf('Firefox/') > 0) || (navigator.userAgent.indexOf('Opera/') > 0) || (navigator.userAgent.indexOf('Safari/') > 0))); }
1286 +
1287 + </script></body></html>
\ No newline at end of file
views/login-mobile-min.handlebars
+1217 -1
@@ -1 +1,1217 @@
1 -<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <title>MeshCentral - Login</title> <style> a{color:#036;text-decoration:underline;}#footer a{color:#fff;text-decoration:underline;}#footer a:hover{color:#fff;text-decoration:none;}</style> </head> <body onload="if (typeof(startup) !== 'undefined') startup();" style="overflow-y:hidden;margin:0;padding:0;border:0;color:black;font-size:13px;font-family:\'Trebuchet MS\', Arial, Helvetica, sans-serif"> <div id="container"> <div id="mastheadx"></div> <div id="masthead" style="background:url(logo.png) 0px 0px;background-size:341px 50px;background-color:#036;background-repeat:no-repeat;height:50px;width:100%;overflow:hidden"> <div style="float:left;height:66px;color:#c8c8c8;padding-left:10px;padding-top:6px"> <strong><font style="font-size:36px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong> </div> <div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:10px"> <strong><font style="font-size:12px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong> </div> </div> <div id="page_content" style="overflow-y:scroll;position:absolute;bottom:32px;top:50px;width:100%;display:flex;align-items:center"> <div id="column_l" style="padding:10px;width:100%"> <table style="width:100%"> <tr> <td align="center"> <div id="loginpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;clear:both;display:none"> <form action="login" method="post"> <div id="message1"> {{{message}}} </div> <div> <b>Log In</b> </div> <table> <tr> <td align="right" width="100">Username:</td> <td><input id="username" type="text" maxlength="64" name="username" onchange="validateLogin(1)" onkeyup="validateLogin(1,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="password" type="password" maxlength="256" name="password" autocomplete="off" onchange="validateLogin(2)" onkeyup="validateLogin(2,event)"></td> </tr> <tr> <td><div id="showPassHintLink" style="display:none"><a onclick="showPassHint()" style="cursor:pointer">Show Hint</a></div></td> <td align="right"><input id="loginButton" type="submit" value="Log In" disabled="disabled"></td> </tr> </table> <div id="hrAccountDiv" style="display:none"><hr></div> <div id="resetAccountDiv" style="display:none;padding:2px"> Forgot user/password? <a onclick="xgo(3)" style="cursor:pointer">Reset account</a>. </div> <div id="newAccountDiv" style="display:none;padding:2px"> Don&#39;t have an account? <a onclick="xgo(2)" style="cursor:pointer">Create one</a>. </div> </form> </div> <div id="createpanel" style="position:relative;display:none"> <div style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;clear:both"> <form action="createaccount" method="post"> <div id="message2"> {{{message}}} </div> <div> <b>Account Creation</b> </div> <div id="passwordPolicyCallout" style="left:-5px;top:10px;width:100px;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td align="right" width="100">Username:</td> <td><input id="ausername" type="text" name="username" onchange="validateCreate(1)" maxlength="64" onkeydown="haltReturn(event)" onkeyup="validateCreate(1,event)"></td> </tr> <tr> <td align="right" width="100">Email:</td> <td><input id="aemail" type="text" name="email" onchange="validateCreate(2)" maxlength="256" onkeydown="haltReturn(event)" onkeyup="validateCreate(2,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="apassword1" type="password" name="password1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(3)" onkeyup="validateCreate(3,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="apassword2" type="password" name="password2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(4)" onkeyup="validateCreate(4,event)"></td> </tr> <tr id="createPanelHint" style="display:none"> <td align="right">Pass Hint:</td> <td><input id="apasswordhint" type="text" name="apasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(5)" onkeyup="validateCreate(5,event)"></td> </tr> <tr id="newAccountPass" title="Enter the account creation token"> <td align="right">Creation Token:</td> <td><input id="anewaccountpass" type="password" name="anewaccountpass" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(6)" onkeyup="validateCreate(6,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="createButton" type="submit" value="Create Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> </div> <div id="resetpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both"> <form action="resetaccount" method="post"> <div id="message3"> {{{message}}} </div> <div> <b>Account Reset</b> </div> <table> <tr> <td align="right" width="100">Email:</td> <td><input id="remail" type="text" name="email" maxlength="256" onchange="validateReset()" onkeyup="validateReset(event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="eresetButton" type="submit" value="Reset Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="tokenpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both"> <form action="tokenlogin" method="post" autocomplete="off"> <div id="message4"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="tokenInput" type="text" name="token" maxlength="50" onchange="checkToken(event)" onkeyup="checkToken(event)" onkeydown="checkToken(event)" onfocus="checkTokenTimer(1)" onblur="checkTokenTimer(0)"> <input id="hwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="tokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resettokenpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both"> <form action="resetaccount" method="post" autocomplete="off"> <div id="message5"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="resetTokenInput" type="text" name="token" maxlength="50" onchange="resetCheckToken(event)" onpaste="resetCheckToken(event)" onkeyup="resetCheckToken(event)" onkeydown="resetCheckToken(event)"> <input id="resetHwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetTokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resetpasswordpanel" style="position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetpassword" method="post"> <div id="message6"> {{{message}}} </div> <div id="rpasswordPolicyCallout" style="left:-10px;width:100px;display:none;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td id="rnuPass1" width="100" align="right">Password:</td> <td><input id="rapassword1" type="password" name="rpassword1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(3,event)" onkeyup="validatePassReset(3,event)"></td> </tr> <tr> <td id="rnuPass2" align="right">Password:</td> <td><input id="rapassword2" type="password" name="rpassword2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(4,event)" onkeyup="validatePassReset(4,event)"></td> </tr> <tr id="resetpasswordpanelHint" style="display:none"> <td id="rnuHint" align="right">Password Hint:</td> <td><input id="rapasswordhint" type="text" name="rpasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(5,event)" onkeyup="validatePassReset(5,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetPassButton" type="submit" value="Reset Password" disabled="disabled"></div> <div id="rpassWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> </td> </tr> </table> </div> </div> <div id="footer" style="height:32px;width:100%;text-align:center;background-color:#113962;position:absolute;bottom:0px"> <table cellpadding="0" cellspacing="6" style="width:100%"> <tr> <td style="text-align:left;color:white">{{{footer}}}</td> <td style="text-align:right">{{{rootCertLink}}}&nbsp;<a href="terms">Terms &amp; Privacy</a></td> </tr> </table> </div> </div> <div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:180px;width:400px;display:none"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="id_dialogclose" style="float:right;padding:5px;cursor:pointer" onclick="setDialogMode()"><b>X</b></div> <div id="id_dialogtitle" style="padding:5px"></div> <div style="width:100%;margin:6px"></div> </div> <div style="margin-right:16px;margin-left:8px"> <div id="dialog1" style="margin:auto;text-align:center;margin:3px"> <div id="id_dialogMessage" style="padding:10px"></div> </div> <div id="dialog2" style="margin:auto;margin:3px"> <div id="id_dialogOptions"></div> </div> </div> <div id="idx_dlgButtonBar" style="padding:10px;margin-bottom:20px"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="float:right;width:80px" onclick="dialogclose(1)"> </div> </div> <script>if(!String.prototype.startsWith){String.prototype.startsWith=function(a){return this.lastIndexOf(a,0)===0}}if(!String.prototype.endsWith){String.prototype.endsWith=function(a){return this.indexOf(a,this.length-a.length)!==-1}}function Q(a){return document.getElementById(a)}function QS(a){try{return Q(a).style}catch(a){}}function QE(a,b){try{Q(a).disabled=!b}catch(a){}}function QV(a,b){try{QS(a).display=(b?"":"none")}catch(a){}}function QA(a,b){Q(a).innerHTML+=b}function QH(a,b){Q(a).innerHTML=b}function inputBoxFocus(b){Q(b).focus();var a=Q(b).value;Q(b).value="";Q(b).value=a}function ReadShort(b,a){return(b.charCodeAt(a)<<8)+b.charCodeAt(a+1)}function ReadShortX(b,a){return(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ReadInt(b,a){return(b.charCodeAt(a)*16777216)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadSInt(b,a){return(b.charCodeAt(a)<<24)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadIntX(b,a){return(b.charCodeAt(a+3)*16777216)+(b.charCodeAt(a+2)<<16)+(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ShortToStr(a){return String.fromCharCode((a>>8)&255,a&255)}function ShortToStrX(a){return String.fromCharCode(a&255,(a>>8)&255)}function IntToStr(a){return String.fromCharCode((a>>24)&255,(a>>16)&255,(a>>8)&255,a&255)}function IntToStrX(a){return String.fromCharCode(a&255,(a>>8)&255,(a>>16)&255,(a>>24)&255)}function MakeToArray(a){if(!a||a==null||typeof a=="object"){return a}return[a]}function SplitArray(a){return a.split(",")}function Clone(a){return JSON.parse(JSON.stringify(a))}function EscapeHtml(a){if(typeof a=="string"){return a.replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function EscapeHtmlBreaks(a){if(typeof a=="string"){return a.replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/\r/g,"<br />").replace(/\n/g,"").replace(/\t/g,"&nbsp;&nbsp;")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function ArrayElementMove(a,b,c){a.splice(c,0,a.splice(b,1)[0])}function ObjectToStringEx(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="<br />"+gap(a)+"Item #"+b+": "+ObjectToStringEx(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="<br />"+gap(a)+b+" = "+ObjectToStringEx(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function ObjectToStringEx2(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="\r\n"+gap2(a)+"Item #"+b+": "+ObjectToStringEx2(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="\r\n"+gap2(a)+b+" = "+ObjectToStringEx2(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function gap(a){var d="";for(var b=0;b<(a*4);b++){d+="&nbsp;"}return d}function gap2(a){var d="";for(var b=0;b<(a*4);b++){d+=" "}return d}function ObjectToString(a){return ObjectToStringEx(a,0)}function ObjectToString2(a){return ObjectToStringEx2(a,0)}function hex2rstr(a){if(typeof a!="string"||a.length==0){return""}var c="",b=(""+a).match(/../g),e;while(e=b.shift()){c+=String.fromCharCode("0x"+e)}return c}function char2hex(a){return(a+256).toString(16).substr(-2).toUpperCase()}function rstr2hex(b){var c="",a;for(a=0;a<b.length;a++){c+=char2hex(b.charCodeAt(a))}return c}function encode_utf8(a){return unescape(encodeURIComponent(a))}function decode_utf8(a){return decodeURIComponent(escape(a))}function data2blob(c){var b=new Array(c.length);for(var d=0;d<c.length;d++){b[d]=c.charCodeAt(d)}var a=new Blob([new Uint8Array(b)]);return a}function random(a){return Math.floor(Math.random()*a)}function trademarks(a){return a.replace(/\(R\)/g,"&reg;").replace(/\(TM\)/g,"&trade;")}"use strict";if(!window.u2f){var u2f=u2f||{};var js_api_version;u2f.EXTENSION_ID="kmendfapggjehodndflmmgagdbamhnfd";u2f.MessageTypes={U2F_REGISTER_REQUEST:"u2f_register_request",U2F_REGISTER_RESPONSE:"u2f_register_response",U2F_SIGN_REQUEST:"u2f_sign_request",U2F_SIGN_RESPONSE:"u2f_sign_response",U2F_GET_API_VERSION_REQUEST:"u2f_get_api_version_request",U2F_GET_API_VERSION_RESPONSE:"u2f_get_api_version_response"};u2f.ErrorCodes={OK:0,OTHER_ERROR:1,BAD_REQUEST:2,CONFIGURATION_UNSUPPORTED:3,DEVICE_INELIGIBLE:4,TIMEOUT:5};u2f.U2fRequest;u2f.U2fResponse;u2f.Error;u2f.Transport;u2f.Transports;u2f.SignRequest;u2f.SignResponse;u2f.RegisterRequest;u2f.RegisterResponse;u2f.RegisteredKey;u2f.GetJsApiVersionResponse;u2f.getMessagePort=function(a){if(typeof chrome!="undefined"&&chrome.runtime){var b={type:u2f.MessageTypes.U2F_SIGN_REQUEST,signRequests:[]};chrome.runtime.sendMessage(u2f.EXTENSION_ID,b,function(){if(!chrome.runtime.lastError){u2f.getChromeRuntimePort_(a)}else{u2f.getIframePort_(a)}})}else{if(u2f.isAndroidChrome_()){u2f.getAuthenticatorPort_(a)}else{if(u2f.isIosChrome_()){u2f.getIosPort_(a)}else{u2f.getIframePort_(a)}}}};u2f.isAndroidChrome_=function(){var a=navigator.userAgent;return a.indexOf("Chrome")!=-1&&a.indexOf("Android")!=-1};u2f.isIosChrome_=function(){var b=["iPhone","iPad","iPod"];for(var a in b){if(navigator.platform==b[a]){return true}}return false};u2f.getChromeRuntimePort_=function(a){var b=chrome.runtime.connect(u2f.EXTENSION_ID,{includeTlsChannelId:true});setTimeout(function(){a(new u2f.WrappedChromeRuntimePort_(b))},0)};u2f.getAuthenticatorPort_=function(a){setTimeout(function(){a(new u2f.WrappedAuthenticatorPort_())},0)};u2f.getIosPort_=function(a){setTimeout(function(){a(new u2f.WrappedIosPort_())},0)};u2f.WrappedChromeRuntimePort_=function(a){this.port_=a};u2f.formatSignRequest_=function(a,b,d,g,e){if(js_api_version===undefined||js_api_version<1.1){var f=[];for(var c=0;c<d.length;c++){f[c]={version:d[c].version,challenge:b,keyHandle:d[c].keyHandle,appId:a}}return{type:u2f.MessageTypes.U2F_SIGN_REQUEST,signRequests:f,timeoutSeconds:g,requestId:e}}return{type:u2f.MessageTypes.U2F_SIGN_REQUEST,appId:a,challenge:b,registeredKeys:d,timeoutSeconds:g,requestId:e}};u2f.formatRegisterRequest_=function(a,c,d,g,e){if(js_api_version===undefined||js_api_version<1.1){for(var b=0;b<d.length;b++){d[b].appId=a}var f=[];for(var b=0;b<c.length;b++){f[b]={version:c[b].version,challenge:d[0],keyHandle:c[b].keyHandle,appId:a}}return{type:u2f.MessageTypes.U2F_REGISTER_REQUEST,signRequests:f,registerRequests:d,timeoutSeconds:g,requestId:e}}return{type:u2f.MessageTypes.U2F_REGISTER_REQUEST,appId:a,registerRequests:d,registeredKeys:c,timeoutSeconds:g,requestId:e}};u2f.WrappedChromeRuntimePort_.prototype.postMessage=function(a){this.port_.postMessage(a)};u2f.WrappedChromeRuntimePort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c=="message"||c=="onmessage"){this.port_.onMessage.addListener(function(d){b({data:d})})}else{console.error("WrappedChromeRuntimePort only supports onMessage")}};u2f.WrappedAuthenticatorPort_=function(){this.requestId_=-1;this.requestObject_=null};u2f.WrappedAuthenticatorPort_.prototype.postMessage=function(b){var a=u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_+";S.request="+encodeURIComponent(JSON.stringify(b))+";end";document.location=a};u2f.WrappedAuthenticatorPort_.prototype.getPortType=function(){return"WrappedAuthenticatorPort_"};u2f.WrappedAuthenticatorPort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c=="message"){var d=this;window.addEventListener("message",d.onRequestUpdate_.bind(d,b),false)}else{console.error("WrappedAuthenticatorPort only supports message")}};u2f.WrappedAuthenticatorPort_.prototype.onRequestUpdate_=function(a,d){var e=JSON.parse(d.data);var c=e.intentURL;var b=e.errorCode;var f=null;if(e.hasOwnProperty("data")){f=(JSON.parse(e.data))}a({data:f})};u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_="intent:#Intent;action=com.google.android.apps.authenticator.AUTHENTICATE";u2f.WrappedIosPort_=function(){};u2f.WrappedIosPort_.prototype.postMessage=function(a){var b=JSON.stringify(a);var c="u2f://auth?"+encodeURI(b);location.replace(c)};u2f.WrappedIosPort_.prototype.getPortType=function(){return"WrappedIosPort_"};u2f.WrappedIosPort_.prototype.addEventListener=function(a,b){var c=a.toLowerCase();if(c!=="message"){console.error("WrappedIosPort only supports message")}};u2f.getIframePort_=function(a){var d="chrome-extension://"+u2f.EXTENSION_ID;var c=document.createElement("iframe");c.src=d+"/u2f-comms.html";c.setAttribute("style","display:none");document.body.appendChild(c);var b=new MessageChannel();var e=function(f){if(f.data=="ready"){b.port1.removeEventListener("message",e);a(b.port1)}else{console.error('First event on iframe port was not "ready"')}};b.port1.addEventListener("message",e);b.port1.start();c.addEventListener("load",function(){c.contentWindow.postMessage("init",d,[b.port2])})};u2f.EXTENSION_TIMEOUT_SEC=30;u2f.port_=null;u2f.waitingForPort_=[];u2f.reqCounter_=0;u2f.callbackMap_={};u2f.getPortSingleton_=function(a){if(u2f.port_){a(u2f.port_)}else{if(u2f.waitingForPort_.length==0){u2f.getMessagePort(function(b){u2f.port_=b;u2f.port_.addEventListener("message",(u2f.responseHandler_));while(u2f.waitingForPort_.length){u2f.waitingForPort_.shift()(u2f.port_)}})}u2f.waitingForPort_.push(a)}};u2f.responseHandler_=function(b){var d=b.data;var c=d.requestId;if(!c||!u2f.callbackMap_[c]){console.error("Unknown or missing requestId in response.");return}var a=u2f.callbackMap_[c];delete u2f.callbackMap_[c];a(d.responseData)};u2f.sign=function(a,c,e,b,d){if(js_api_version===undefined){u2f.getApiVersion(function(f){js_api_version=f.js_api_version===undefined?0:f.js_api_version;u2f.sendSignRequest(a,c,e,b,d)})}else{u2f.sendSignRequest(a,c,e,b,d)}};u2f.sendSignRequest=function(a,c,e,b,d){u2f.getPortSingleton_(function(f){var h=++u2f.reqCounter_;u2f.callbackMap_[h]=b;var i=(typeof d!=="undefined"?d:u2f.EXTENSION_TIMEOUT_SEC);var g=u2f.formatSignRequest_(a,c,e,i,h);f.postMessage(g)})};u2f.register=function(a,e,d,b,c){if(js_api_version===undefined){u2f.getApiVersion(function(f){js_api_version=f.js_api_version===undefined?0:f.js_api_version;u2f.sendRegisterRequest(a,e,d,b,c)})}else{u2f.sendRegisterRequest(a,e,d,b,c)}};u2f.sendRegisterRequest=function(a,e,d,b,c){u2f.getPortSingleton_(function(f){var h=++u2f.reqCounter_;u2f.callbackMap_[h]=b;var i=(typeof c!=="undefined"?c:u2f.EXTENSION_TIMEOUT_SEC);var g=u2f.formatRegisterRequest_(a,d,e,i,h);f.postMessage(g)})};u2f.getApiVersion=function(a,b){u2f.getPortSingleton_(function(d){if(d.getPortType){var c;switch(d.getPortType()){case"WrappedIosPort_":case"WrappedAuthenticatorPort_":c=1.1;break;default:c=0;break}a({js_api_version:c});return}var f=++u2f.reqCounter_;u2f.callbackMap_[f]=a;var e={type:u2f.MessageTypes.U2F_GET_API_VERSION_REQUEST,timeoutSeconds:(typeof b!=="undefined"?b:u2f.EXTENSION_TIMEOUT_SEC),requestId:f};d.postMessage(e)})}}"use strict";var passhint="{{{passhint}}}";var newAccountPass=parseInt("{{{newAccountPass}}}");var emailCheck=("{{{emailcheck}}}"=="true");var features=parseInt("{{{features}}}");var passRequirements="{{{passRequirements}}}";if(passRequirements!=""){passRequirements=JSON.parse(decodeURIComponent(passRequirements))}else{passRequirements={}}var passRequirementsEx=((passRequirements.min!=null)||(passRequirements.max!=null)||(passRequirements.upper!=null)||(passRequirements.lower!=null)||(passRequirements.numeric!=null)||(passRequirements.nonalpha!=null));var hardwareKeyChallenge="{{{hkey}}}";var currentpanel=0;function startup(){if((features&32)==0){var c=null;try{c=top.location.toString().toLowerCase()}catch(a){}if(top!=self&&(c==null||top.active==false)){top.location=self.location;return}}QV("createPanelHint",passRequirements.hint===true);QV("resetpasswordpanelHint",passRequirements.hint===true);window.onresize=center;center();validateLogin();validateCreate();if("{{loginmode}}"!=""){go(parseInt("{{loginmode}}"))}else{go(1)}QV("newAccountDiv",("{{{newAccount}}}"!="0")&&("{{{newAccount}}}"!="false"));if((passRequirements.hint===true)&&(passhint!=null)&&(passhint.length>0)){QV("showPassHintLink",true)}QV("newAccountPass",(newAccountPass==1));QV("resetAccountDiv",(emailCheck==true));QV("hrAccountDiv",(emailCheck==true)||(newAccountPass==1));if("{{loginmode}}"=="4"){try{if(hardwareKeyChallenge.length>0){hardwareKeyChallenge=JSON.parse(hardwareKeyChallenge)}else{hardwareKeyChallenge=null}}catch(b){hardwareKeyChallenge=null}if((hardwareKeyChallenge!=null)&&u2fSupported()){window.u2f.sign(hardwareKeyChallenge.appId,hardwareKeyChallenge.challenge,hardwareKeyChallenge.registeredKeys,function(d){if((currentpanel==4)&&d.signatureData){Q("hwtokenInput").value=JSON.stringify(d);QE("tokenOkButton",true);Q("tokenOkButton").click()}},hardwareKeyChallenge.timeoutSeconds)}}if("{{loginmode}}"=="5"){try{if(hardwareKeyChallenge.length>0){hardwareKeyChallenge=JSON.parse(hardwareKeyChallenge)}else{hardwareKeyChallenge=null}}catch(b){hardwareKeyChallenge=null}if((hardwareKeyChallenge!=null)&&u2fSupported()){window.u2f.sign(hardwareKeyChallenge.appId,hardwareKeyChallenge.challenge,hardwareKeyChallenge.registeredKeys,function(d){if((currentpanel==5)&&d.signatureData){Q("resetHwtokenInput").value=JSON.stringify(d);QE("resetTokenOkButton",true);Q("resetTokenOkButton").click()}},hardwareKeyChallenge.timeoutSeconds)}}}function showPassHint(){if(passRequirements.hint===true){messagebox("Password Hint",passhint)}}function xgo(a){QV("message1",false);QV("message2",false);QV("message3",false);QV("message4",false);QV("message5",false);QV("message6",false);go(a)}function go(a){currentpanel=a;setDialogMode(0);QV("showPassHintLink",false);QV("loginpanel",a==1);QV("createpanel",a==2);QV("resetpanel",a==3);QV("tokenpanel",a==4);QV("resettokenpanel",a==5);QV("resetpasswordpanel",a==6);if(a==1){Q("username").focus()}if(a==2){Q("ausername").focus()}if(a==3){Q("remail").focus()}if(a==4){Q("tokenInput").focus()}if(a==5){Q("resetTokenInput").focus()}if(a==6){Q("rapassword1").focus()}}function validateLogin(a,b){var c=((Q("username").value.length>0)&&(Q("username").value.indexOf(" ")==-1)&&(Q("password").value.length>0));QE("loginButton",c);setDialogMode(0);if((b!=null)&&(b.keyCode==13)){if(a==1){Q("password").focus()}else{if(a==2){Q("loginButton").click()}}}if(b!=null){haltEvent(b)}}function validateCreate(a,b){setDialogMode(0);var c=((Q("ausername").value.length>0)&&(Q("ausername").value.indexOf(" ")==-1)&&(validateEmail(Q("aemail").value)==true)&&(Q("apassword1").value.length>0)&&(Q("apassword2").value==Q("apassword1").value));if((newAccountPass==1)&&(Q("anewaccountpass").value.length==0)){c=false}if(Q("apassword1").value==""){QH("passWarning","");QV("passwordPolicyCallout",false)}else{if(!passRequirementsEx){var f=checkPasswordStrength(Q("apassword1").value);if(f>=80){QH("passWarning","<span style=color:green><b>Strong Password</b><span>")}else{if(f>=60){QH("passWarning","<span style=color:blue><b>Good Password</b><span>")}else{QH("passWarning","<span style=color:red><b>Weak Password</b><span>")}}}else{var d=checkPasswordRequirements(Q("apassword1").value,passRequirements);if(d==false){c=false;QH("passWarning","<span style=color:red><b>Password Policy</b><span>");QV("passwordPolicyCallout",true);QH("passwordPolicyCallout",passwordPolicyText(Q("apassword1").value))}else{QH("passWarning","");QV("passwordPolicyCallout",false)}}}QE("createButton",c);if((b!=null)&&(b.keyCode==13)){if(a==1){Q("aemail").focus()}if(a==2){Q("apassword1").focus()}if(a==3){Q("apassword2").focus()}if(a==4){Q("apasswordhint").focus()}if(a==5){if(newAccountPass==1){Q("anewaccountpass").focus()}else{Q("createButton").click()}}if(a==6){Q("createButton").click()}}if(b!=null){haltEvent(b)}}function validatePassReset(a,b){setDialogMode(0);var d=(Q("rapassword1").value.length>0);var f=(Q("rapassword2").value.length>0)&&(Q("rapassword2").value==Q("rapassword1").value);var c=(d&&f);QS("rnuPass1").color=d?"black":"#7b241c";QS("rnuPass2").color=f?"black":"#7b241c";if(Q("rapassword1").value==""){QH("rpassWarning","");QV("rpasswordPolicyCallout",false)}else{if(!passRequirementsEx){var h=checkPasswordStrength(Q("rapassword1").value);if(h>=80){QH("rpassWarning","<span style=color:green><b>Strong Password</b><span>")}else{if(h>=60){QH("rpassWarning","<span style=color:blue><b>Good Password</b><span>")}else{QH("rpassWarning","<span style=color:red><b>Weak Password</b><span>")}}}else{var g=checkPasswordRequirements(Q("rapassword1").value,passRequirements);if(g==false){c=false;QS("rnuPass1").color="#7b241c";QS("rnuPass2").color="#7b241c";QH("rpassWarning","<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>");QV("rpasswordPolicyCallout",true);QH("rpasswordPolicyCallout",passwordPolicyText(Q("rapassword1").value))}else{QH("rpassWarning","");QV("rpasswordPolicyCallout",false)}}}if((b!=null)&&(b.keyCode==13)){if(a==2){Q("rapassword1").focus()}if(a==3){Q("rapassword2").focus()}if(a==4){Q("rapasswordhint").focus()}if(a==6){Q("resetPassButton").click()}}if(b!=null){haltEvent(b)}QE("resetPassButton",c)}function validateReset(a){setDialogMode(0);var b=validateEmail(Q("remail").value);QE("eresetButton",b);if((a!=null)&&(a.keyCode==13)&&(b==true)){Q("eresetButton").click()}if(a!=null){haltEvent(a)}}function passwordPolicyText(b){var c="<div style=text-align:left>";var a=strCount(b);if(passRequirements.min&&((b==null)||(b.length<passRequirements.min))){c+="Minimum length of "+passRequirements.min+"<br />"}if(passRequirements.max&&((b==null)||(b.length>passRequirements.max))){c+="Maximum length of "+passRequirements.max+"<br />"}if(passRequirements.upper&&((b==null)||(a.upper<passRequirements.upper))){c+=""+passRequirements.upper+" upper case<br />"}if(passRequirements.lower&&((b==null)||(a.lower<passRequirements.lower))){c+=""+passRequirements.lower+" lower case<br />"}if(passRequirements.numeric&&((b==null)||(a.numeric<passRequirements.numeric))){c+=""+passRequirements.numeric+" numeric<br />"}if(passRequirements.nonalpha&&((b==null)||(a.nonalpha<passRequirements.nonalpha))){c+=passRequirements.nonalpha+" non-alphanumeric<br />"}c+="</div>";return c}function checkPasswordStrength(e){var f=0,d={},g=0,h={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)};if(!e){return 0}for(var b=0;b<e.length;b++){d[e[b]]=(d[e[b]]||0)+1;f+=5/d[e[b]]}for(var a in h){g+=(h[a]==true)?1:0}return parseInt(f+(g-1)*10)}function checkPasswordRequirements(b,c){if((c==null)||(c=="")||(typeof c!="object")){return true}if(c.min){if(b.length<c.min){return false}}if(c.max){if(b.length>c.max){return false}}var a=strCount(b);if(c.numeric&&(a.numeric<c.numeric)){return false}if(c.lower&&(a.lower<c.lower)){return false}if(c.upper&&(a.upper<c.upper)){return false}if(c.nonalpha&&(a.nonalpha<c.nonalpha)){return false}return true}function strCount(c){var a={numeric:0,lower:0,upper:0,nonalpha:0};if(typeof c!="string"){return a}for(var b=0;b<c.length;b++){if(/\d/.test(c[b])){a.numeric++}if(/[a-z]/.test(c[b])){a.lower++}if(/[A-Z]/.test(c[b])){a.upper++}if(/\W/.test(c[b])){a.nonalpha++}}return a}var xcheckTokenTimer=null;function checkTokenTimer(a){if((a==0)&&(xcheckTokenTimer!=null)){clearInterval(xcheckTokenTimer);xcheckTokenTimer=null}if((a==1)&&(xcheckTokenTimer==null)){xcheckTokenTimer=setInterval(checkToken,200)}}function checkToken(){var a=Q("tokenInput").value,b=a.split(" ").join("");if(a!=b){Q("tokenInput").value=b}QE("tokenOkButton",(Q("tokenInput").value.length==6)||(Q("tokenInput").value.length==8)||(Q("tokenInput").value.length==44))}function resetCheckToken(){var a=Q("resetTokenInput").value,b=a.split(" ").join("");if(a!=b){Q("resetTokenInput").value=b}QE("resetTokenOkButton",(Q("resetTokenInput").value.length==6)||(Q("resetTokenInput").value.length==8)||(Q("resetTokenInput").value.length==44))}var xxdialogMode;var xxdialogFunc;var xxdialogButtons;var xxdialogTag;var xxcurrentView=0;function setDialogMode(j,k,a,e,d,h){xxdialogMode=j;xxdialogFunc=e;xxdialogButtons=a;xxdialogTag=h;QE("idx_dlgOkButton",true);QV("idx_dlgOkButton",a&1);QV("idx_dlgCancelButton",a&2);QV("id_dialogclose",(a&2)||(a&8));QV("idx_dlgButtonBar",a&7);if(k){QH("id_dialogtitle",k)}for(var g=1;g<24;g++){QV("dialog"+g,g==j)}QV("dialog",j);if(d){if(j==2){QH("id_dialogOptions",d)}else{QH("id_dialogMessage",d)}}}function dialogclose(e){var c=xxdialogFunc;var a=xxdialogButtons;var d=xxdialogTag;setDialogMode();if(((a&8)||e)&&c){c(e,d)}}function center(){QS("dialog").left=((((getDocWidth()-400)/2))+"px")}function messagebox(b,a){QH("id_dialogMessage",a);setDialogMode(1,b,1)}function statusbox(b,a){QH("id_dialogMessage",a);setDialogMode(1,b)}function getDocWidth(){if(window.innerWidth){return window.innerWidth}if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientWidth!=0){return document.documentElement.clientWidth}return document.getElementsByTagName("body")[0].clientWidth}function haltEvent(a){if(a.preventDefault){a.preventDefault()}if(a.stopPropagation){a.stopPropagation()}return false}function haltReturn(a){if(a.keyCode==13){haltEvent(a)}}function validateEmail(b){var a=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return a.test(b)}function u2fSupported(){return(window.u2f&&((navigator.userAgent.indexOf("Chrome/")>0)||(navigator.userAgent.indexOf("Firefox/")>0)||(navigator.userAgent.indexOf("Opera/")>0)||(navigator.userAgent.indexOf("Safari/")>0)))};</script></body></html>
\ No newline at end of file
1 +<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <title>MeshCentral - Login</title> <style> a{color:#036;text-decoration:underline;}#footer a{color:#fff;text-decoration:underline;}#footer a:hover{color:#fff;text-decoration:none;}</style> </head> <body onload="if (typeof(startup) !== 'undefined') startup();" style="overflow-y:hidden;margin:0;padding:0;border:0;color:black;font-size:13px;font-family:\'Trebuchet MS\', Arial, Helvetica, sans-serif"> <div id="container"> <div id="mastheadx"></div> <div id="masthead" style="background:url(logo.png) 0px 0px;background-size:341px 50px;background-color:#036;background-repeat:no-repeat;height:50px;width:100%;overflow:hidden"> <div style="float:left;height:66px;color:#c8c8c8;padding-left:10px;padding-top:6px"> <strong><font style="font-size:36px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong> </div> <div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:10px"> <strong><font style="font-size:12px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong> </div> </div> <div id="page_content" style="overflow-y:scroll;position:absolute;bottom:32px;top:50px;width:100%;display:flex;align-items:center"> <div id="column_l" style="padding:10px;width:100%"> <table style="width:100%"> <tr> <td align="center"> <div id="loginpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;clear:both;display:none"> <form action="login" method="post"> <div id="message1"> {{{message}}} </div> <div> <b>Log In</b> </div> <table> <tr> <td align="right" width="100">Username:</td> <td><input id="username" type="text" maxlength="64" name="username" onchange="validateLogin(1)" onkeyup="validateLogin(1,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="password" type="password" maxlength="256" name="password" autocomplete="off" onchange="validateLogin(2)" onkeyup="validateLogin(2,event)"></td> </tr> <tr> <td><div id="showPassHintLink" style="display:none"><a onclick="showPassHint()" style="cursor:pointer">Show Hint</a></div></td> <td align="right"><input id="loginButton" type="submit" value="Log In" disabled="disabled"></td> </tr> </table> <div id="hrAccountDiv" style="display:none"><hr></div> <div id="resetAccountDiv" style="display:none;padding:2px"> Forgot user/password? <a onclick="xgo(3)" style="cursor:pointer">Reset account</a>. </div> <div id="newAccountDiv" style="display:none;padding:2px"> Don&#39;t have an account? <a onclick="xgo(2)" style="cursor:pointer">Create one</a>. </div> </form> </div> <div id="createpanel" style="position:relative;display:none"> <div style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;clear:both"> <form action="createaccount" method="post"> <div id="message2"> {{{message}}} </div> <div> <b>Account Creation</b> </div> <div id="passwordPolicyCallout" style="left:-5px;top:10px;width:100px;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td align="right" width="100">Username:</td> <td><input id="ausername" type="text" name="username" onchange="validateCreate(1)" maxlength="64" onkeydown="haltReturn(event)" onkeyup="validateCreate(1,event)"></td> </tr> <tr> <td align="right" width="100">Email:</td> <td><input id="aemail" type="text" name="email" onchange="validateCreate(2)" maxlength="256" onkeydown="haltReturn(event)" onkeyup="validateCreate(2,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="apassword1" type="password" name="password1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(3)" onkeyup="validateCreate(3,event)"></td> </tr> <tr> <td align="right">Password:</td> <td><input id="apassword2" type="password" name="password2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(4)" onkeyup="validateCreate(4,event)"></td> </tr> <tr id="createPanelHint" style="display:none"> <td align="right">Pass Hint:</td> <td><input id="apasswordhint" type="text" name="apasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(5)" onkeyup="validateCreate(5,event)"></td> </tr> <tr id="newAccountPass" title="Enter the account creation token"> <td align="right">Creation Token:</td> <td><input id="anewaccountpass" type="password" name="anewaccountpass" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validateCreate(6)" onkeyup="validateCreate(6,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="createButton" type="submit" value="Create Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> </div> <div id="resetpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both"> <form action="resetaccount" method="post"> <div id="message3"> {{{message}}} </div> <div> <b>Account Reset</b> </div> <table> <tr> <td align="right" width="100">Email:</td> <td><input id="remail" type="text" name="email" maxlength="256" onchange="validateReset()" onkeyup="validateReset(event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="eresetButton" type="submit" value="Reset Account" disabled="disabled"></div> <div id="passWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="tokenpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both"> <form action="tokenlogin" method="post" autocomplete="off"> <div id="message4"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="tokenInput" type="text" name="token" maxlength="50" onchange="checkToken(event)" onkeyup="checkToken(event)" onkeydown="checkToken(event)" onfocus="checkTokenTimer(1)" onblur="checkTokenTimer(0)"> <input id="hwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="tokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resettokenpanel" style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both"> <form action="resetaccount" method="post" autocomplete="off"> <div id="message5"> {{{message}}} </div> <table> <tr> <td align="right" width="100">Login token:</td> <td> <input id="resetTokenInput" type="text" name="token" maxlength="50" onchange="resetCheckToken(event)" onpaste="resetCheckToken(event)" onkeyup="resetCheckToken(event)" onkeydown="resetCheckToken(event)"> <input id="resetHwtokenInput" type="text" name="hwtoken" style="display:none"> </td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetTokenOkButton" type="submit" value="Login" disabled="disabled"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> <div id="resetpasswordpanel" style="position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none"> <form action="resetpassword" method="post"> <div id="message6"> {{{message}}} </div> <div id="rpasswordPolicyCallout" style="left:-10px;width:100px;display:none;position:absolute;background-color:#FFC;border-radius:5px;padding:5px;box-shadow:0px 0px 15px #666;font-size:10px"></div> <table> <tr> <td id="rnuPass1" width="100" align="right">Password:</td> <td><input id="rapassword1" type="password" name="rpassword1" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(3,event)" onkeyup="validatePassReset(3,event)"></td> </tr> <tr> <td id="rnuPass2" align="right">Password:</td> <td><input id="rapassword2" type="password" name="rpassword2" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(4,event)" onkeyup="validatePassReset(4,event)"></td> </tr> <tr id="resetpasswordpanelHint" style="display:none"> <td id="rnuHint" align="right">Password Hint:</td> <td><input id="rapasswordhint" type="text" name="rpasswordhint" autocomplete="off" maxlength="256" onkeydown="haltReturn(event)" onchange="validatePassReset(5,event)" onkeyup="validatePassReset(5,event)"></td> </tr> <tr> <td colspan="2"> <div style="float:right"><input id="resetPassButton" type="submit" value="Reset Password" disabled="disabled"></div> <div id="rpassWarning" style="padding-top:6px"></div> </td> </tr> </table> <hr><a onclick="xgo(1)" style="cursor:pointer">Back to login</a> </form> </div> </td> </tr> </table> </div> </div> <div id="footer" style="height:32px;width:100%;text-align:center;background-color:#113962;position:absolute;bottom:0px"> <table cellpadding="0" cellspacing="6" style="width:100%"> <tr> <td style="text-align:left;color:white">{{{footer}}}</td> <td style="text-align:right">{{{rootCertLink}}}&nbsp;<a href="terms">Terms &amp; Privacy</a></td> </tr> </table> </div> </div> <div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:180px;width:400px;display:none"> <div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0"> <div id="id_dialogclose" style="float:right;padding:5px;cursor:pointer" onclick="setDialogMode()"><b>X</b></div> <div id="id_dialogtitle" style="padding:5px"></div> <div style="width:100%;margin:6px"></div> </div> <div style="margin-right:16px;margin-left:8px"> <div id="dialog1" style="margin:auto;text-align:center;margin:3px"> <div id="id_dialogMessage" style="padding:10px"></div> </div> <div id="dialog2" style="margin:auto;margin:3px"> <div id="id_dialogOptions"></div> </div> </div> <div id="idx_dlgButtonBar" style="padding:10px;margin-bottom:20px"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="float:right;width:80px" onclick="dialogclose(1)"> </div> </div> <script>/**
2 +* @description Set of short commonly used methods for handling HTML elements
3 +* @author Ylian Saint-Hilaire
4 +* @version v0.0.1b
5 +*/
6 +
7 +// Add startsWith for IE browser
8 +if (!String.prototype.startsWith) { String.prototype.startsWith = function (str) { return this.lastIndexOf(str, 0) === 0; }; }
9 +if (!String.prototype.endsWith) { String.prototype.endsWith = function (str) { return this.indexOf(str, this.length - str.length) !== -1; }; }
10 +
11 +// Quick UI functions, a bit of a replacement for jQuery
12 +//function Q(x) { if (document.getElementById(x) == null) { console.log('Invalid element: ' + x); } return document.getElementById(x); } // "Q"
13 +function Q(x) { return document.getElementById(x); } // "Q"
14 +function QS(x) { try { return Q(x).style; } catch (x) { } } // "Q" style
15 +function QE(x, y) { try { Q(x).disabled = !y; } catch (x) { } } // "Q" enable
16 +function QV(x, y) { try { QS(x).display = (y ? '' : 'none'); } catch (x) { } } // "Q" visible
17 +function QA(x, y) { Q(x).innerHTML += y; } // "Q" append
18 +function QH(x, y) { Q(x).innerHTML = y; } // "Q" html
19 +
20 +// Move cursor to end of input box
21 +function inputBoxFocus(x) { Q(x).focus(); var v = Q(x).value; Q(x).value = ''; Q(x).value = v; }
22 +
23 +// Binary encoding and decoding functions
24 +function ReadShort(v, p) { return (v.charCodeAt(p) << 8) + v.charCodeAt(p + 1); }
25 +function ReadShortX(v, p) { return (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
26 +function ReadInt(v, p) { return (v.charCodeAt(p) * 0x1000000) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); } // We use "*0x1000000" instead of "<<24" because the shift converts the number to signed int32.
27 +function ReadSInt(v, p) { return (v.charCodeAt(p) << 24) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); }
28 +function ReadIntX(v, p) { return (v.charCodeAt(p + 3) * 0x1000000) + (v.charCodeAt(p + 2) << 16) + (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
29 +function ShortToStr(v) { return String.fromCharCode((v >> 8) & 0xFF, v & 0xFF); }
30 +function ShortToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF); }
31 +function IntToStr(v) { return String.fromCharCode((v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); }
32 +function IntToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF, (v >> 24) & 0xFF); }
33 +function MakeToArray(v) { if (!v || v == null || typeof v == 'object') return v; return [v]; }
34 +function SplitArray(v) { return v.split(','); }
35 +function Clone(v) { return JSON.parse(JSON.stringify(v)); }
36 +function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
37 +function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, '&nbsp;&nbsp;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
38 +
39 +// Move an element from one position in an array to a new position
40 +function ArrayElementMove(arr, from, to) { arr.splice(to, 0, arr.splice(from, 1)[0]); };
41 +
42 +// Print object for HTML
43 +function ObjectToStringEx(x, c) {
44 + var r = "";
45 + if (x != 0 && (!x || x == null)) return "(Null)";
46 + if (x instanceof Array) { for (var i in x) { r += '<br />' + gap(c) + "Item #" + i + ": " + ObjectToStringEx(x[i], c + 1); } }
47 + else if (x instanceof Object) { for (var i in x) { r += '<br />' + gap(c) + i + " = " + ObjectToStringEx(x[i], c + 1); } }
48 + else { r += EscapeHtml(x); }
49 + return r;
50 +}
51 +
52 +// Print object for console
53 +function ObjectToStringEx2(x, c) {
54 + var r = "";
55 + if (x != 0 && (!x || x == null)) return "(Null)";
56 + if (x instanceof Array) { for (var i in x) { r += '\r\n' + gap2(c) + "Item #" + i + ": " + ObjectToStringEx2(x[i], c + 1); } }
57 + else if (x instanceof Object) { for (var i in x) { r += '\r\n' + gap2(c) + i + " = " + ObjectToStringEx2(x[i], c + 1); } }
58 + else { r += EscapeHtml(x); }
59 + return r;
60 +}
61 +
62 +// Create an ident gap
63 +function gap(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += '&nbsp;'; } return x; }
64 +function gap2(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += ' '; } return x; }
65 +
66 +// Print an object in html
67 +function ObjectToString(x) { return ObjectToStringEx(x, 0); }
68 +function ObjectToString2(x) { return ObjectToStringEx2(x, 0); }
69 +
70 +// Convert a hex string to a raw string
71 +function hex2rstr(d) {
72 + if (typeof d != "string" || d.length == 0) return '';
73 + var r = '', m = ('' + d).match(/../g), t;
74 + while (t = m.shift()) r += String.fromCharCode('0x' + t);
75 + return r
76 +}
77 +
78 +// Convert decimal to hex
79 +function char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }
80 +
81 +// Convert a raw string to a hex string
82 +function rstr2hex(input) { var r = '', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }
83 +
84 +// UTF-8 encoding & decoding functions
85 +function encode_utf8(s) { return unescape(encodeURIComponent(s)); }
86 +function decode_utf8(s) { return decodeURIComponent(escape(s)); }
87 +
88 +// Convert a string into a blob
89 +function data2blob(data) {
90 + var bytes = new Array(data.length);
91 + for (var i = 0; i < data.length; i++) bytes[i] = data.charCodeAt(i);
92 + var blob = new Blob([new Uint8Array(bytes)]);
93 + return blob;
94 +}
95 +
96 +// Generate random numbers
97 +function random(max) { return Math.floor(Math.random() * max); }
98 +
99 +// Trademarks
100 +function trademarks(x) { return x.replace(/\(R\)/g, '&reg;').replace(/\(TM\)/g, '&trade;'); }
101 +//Copyright 2014-2015 Google Inc. All rights reserved.
102 +
103 +//Use of this source code is governed by a BSD-style
104 +//license that can be found in the LICENSE file or at
105 +//https://developers.google.com/open-source/licenses/bsd
106 +
107 +/**
108 + * @fileoverview The U2F api.
109 + */
110 +'use strict';
111 +if (!window.u2f) {
112 +
113 + /**
114 + * Namespace for the U2F api.
115 + * @type {Object}
116 + */
117 +var u2f = u2f || {};
118 +
119 + /**
120 + * FIDO U2F Javascript API Version
121 + * @number
122 + */
123 +var js_api_version;
124 +
125 + /**
126 + * The U2F extension id
127 + * @const {string}
128 + */
129 +// The Chrome packaged app extension ID.
130 +// Uncomment this if you want to deploy a server instance that uses
131 +// the package Chrome app and does not require installing the U2F Chrome extension.
132 + u2f.EXTENSION_ID = 'kmendfapggjehodndflmmgagdbamhnfd';
133 + // The U2F Chrome extension ID.
134 + // Uncomment this if you want to deploy a server instance that uses
135 + // the U2F Chrome extension to authenticate.
136 + // u2f.EXTENSION_ID = 'pfboblefjcgdjicmnffhdgionmgcdmne';
137 +
138 +
139 + /**
140 + * Message types for messsages to/from the extension
141 + * @const
142 + * @enum {string}
143 + */
144 +u2f.MessageTypes = {
145 + 'U2F_REGISTER_REQUEST': 'u2f_register_request',
146 + 'U2F_REGISTER_RESPONSE': 'u2f_register_response',
147 + 'U2F_SIGN_REQUEST': 'u2f_sign_request',
148 + 'U2F_SIGN_RESPONSE': 'u2f_sign_response',
149 + 'U2F_GET_API_VERSION_REQUEST': 'u2f_get_api_version_request',
150 + 'U2F_GET_API_VERSION_RESPONSE': 'u2f_get_api_version_response'
151 + };
152 +
153 +
154 + /**
155 + * Response status codes
156 + * @const
157 + * @enum {number}
158 + */
159 +u2f.ErrorCodes = {
160 + 'OK': 0,
161 + 'OTHER_ERROR': 1,
162 + 'BAD_REQUEST': 2,
163 + 'CONFIGURATION_UNSUPPORTED': 3,
164 + 'DEVICE_INELIGIBLE': 4,
165 + 'TIMEOUT': 5
166 + };
167 +
168 +
169 + /**
170 + * A message for registration requests
171 + * @typedef {{
172 + * type: u2f.MessageTypes,
173 + * appId: ?string,
174 + * timeoutSeconds: ?number,
175 + * requestId: ?number
176 + * }}
177 + */
178 +u2f.U2fRequest;
179 +
180 +
181 + /**
182 + * A message for registration responses
183 + * @typedef {{
184 + * type: u2f.MessageTypes,
185 + * responseData: (u2f.Error | u2f.RegisterResponse | u2f.SignResponse),
186 + * requestId: ?number
187 + * }}
188 + */
189 +u2f.U2fResponse;
190 +
191 +
192 + /**
193 + * An error object for responses
194 + * @typedef {{
195 + * errorCode: u2f.ErrorCodes,
196 + * errorMessage: ?string
197 + * }}
198 + */
199 +u2f.Error;
200 +
201 + /**
202 + * Data object for a single sign request.
203 + * @typedef {enum {BLUETOOTH_RADIO, BLUETOOTH_LOW_ENERGY, USB, NFC}}
204 + */
205 +u2f.Transport;
206 +
207 +
208 + /**
209 + * Data object for a single sign request.
210 + * @typedef {Array<u2f.Transport>}
211 + */
212 +u2f.Transports;
213 +
214 + /**
215 + * Data object for a single sign request.
216 + * @typedef {{
217 + * version: string,
218 + * challenge: string,
219 + * keyHandle: string,
220 + * appId: string
221 + * }}
222 + */
223 +u2f.SignRequest;
224 +
225 +
226 + /**
227 + * Data object for a sign response.
228 + * @typedef {{
229 + * keyHandle: string,
230 + * signatureData: string,
231 + * clientData: string
232 + * }}
233 + */
234 +u2f.SignResponse;
235 +
236 +
237 + /**
238 + * Data object for a registration request.
239 + * @typedef {{
240 + * version: string,
241 + * challenge: string
242 + * }}
243 + */
244 +u2f.RegisterRequest;
245 +
246 +
247 + /**
248 + * Data object for a registration response.
249 + * @typedef {{
250 + * version: string,
251 + * keyHandle: string,
252 + * transports: Transports,
253 + * appId: string
254 + * }}
255 + */
256 +u2f.RegisterResponse;
257 +
258 +
259 + /**
260 + * Data object for a registered key.
261 + * @typedef {{
262 + * version: string,
263 + * keyHandle: string,
264 + * transports: ?Transports,
265 + * appId: ?string
266 + * }}
267 + */
268 +u2f.RegisteredKey;
269 +
270 +
271 + /**
272 + * Data object for a get API register response.
273 + * @typedef {{
274 + * js_api_version: number
275 + * }}
276 + */
277 +u2f.GetJsApiVersionResponse;
278 +
279 +
280 + //Low level MessagePort API support
281 +
282 + /**
283 + * Sets up a MessagePort to the U2F extension using the
284 + * available mechanisms.
285 + * @param {function((MessagePort|u2f.WrappedChromeRuntimePort_))} callback
286 + */
287 +u2f.getMessagePort = function (callback) {
288 + if (typeof chrome != 'undefined' && chrome.runtime) {
289 + // The actual message here does not matter, but we need to get a reply
290 + // for the callback to run. Thus, send an empty signature request
291 + // in order to get a failure response.
292 + var msg = {
293 + type: u2f.MessageTypes.U2F_SIGN_REQUEST,
294 + signRequests: []
295 + };
296 + chrome.runtime.sendMessage(u2f.EXTENSION_ID, msg, function () {
297 + if (!chrome.runtime.lastError) {
298 + // We are on a whitelisted origin and can talk directly
299 + // with the extension.
300 + u2f.getChromeRuntimePort_(callback);
301 + } else {
302 + // chrome.runtime was available, but we couldn't message
303 + // the extension directly, use iframe
304 + u2f.getIframePort_(callback);
305 + }
306 + });
307 + } else if (u2f.isAndroidChrome_()) {
308 + u2f.getAuthenticatorPort_(callback);
309 + } else if (u2f.isIosChrome_()) {
310 + u2f.getIosPort_(callback);
311 + } else {
312 + // chrome.runtime was not available at all, which is normal
313 + // when this origin doesn't have access to any extensions.
314 + u2f.getIframePort_(callback);
315 + }
316 + };
317 +
318 + /**
319 + * Detect chrome running on android based on the browser's useragent.
320 + * @private
321 + */
322 +u2f.isAndroidChrome_ = function () {
323 + var userAgent = navigator.userAgent;
324 + return userAgent.indexOf('Chrome') != -1 &&
325 + userAgent.indexOf('Android') != -1;
326 + };
327 +
328 + /**
329 + * Detect chrome running on iOS based on the browser's platform.
330 + * @private
331 + */
332 +u2f.isIosChrome_ = function () {
333 + var r = ["iPhone", "iPad", "iPod"];
334 + for (var i in r) { if (navigator.platform == r[i]) { return true; } }
335 + return false;
336 + //return $.inArray(navigator.platform, ["iPhone", "iPad", "iPod"]) > -1;
337 + };
338 +
339 + /**
340 + * Connects directly to the extension via chrome.runtime.connect.
341 + * @param {function(u2f.WrappedChromeRuntimePort_)} callback
342 + * @private
343 + */
344 +u2f.getChromeRuntimePort_ = function (callback) {
345 + var port = chrome.runtime.connect(u2f.EXTENSION_ID,
346 + { 'includeTlsChannelId': true });
347 + setTimeout(function () {
348 + callback(new u2f.WrappedChromeRuntimePort_(port));
349 + }, 0);
350 + };
351 +
352 + /**
353 + * Return a 'port' abstraction to the Authenticator app.
354 + * @param {function(u2f.WrappedAuthenticatorPort_)} callback
355 + * @private
356 + */
357 +u2f.getAuthenticatorPort_ = function (callback) {
358 + setTimeout(function () {
359 + callback(new u2f.WrappedAuthenticatorPort_());
360 + }, 0);
361 + };
362 +
363 + /**
364 + * Return a 'port' abstraction to the iOS client app.
365 + * @param {function(u2f.WrappedIosPort_)} callback
366 + * @private
367 + */
368 +u2f.getIosPort_ = function (callback) {
369 + setTimeout(function () {
370 + callback(new u2f.WrappedIosPort_());
371 + }, 0);
372 + };
373 +
374 + /**
375 + * A wrapper for chrome.runtime.Port that is compatible with MessagePort.
376 + * @param {Port} port
377 + * @constructor
378 + * @private
379 + */
380 +u2f.WrappedChromeRuntimePort_ = function (port) {
381 + this.port_ = port;
382 + };
383 +
384 + /**
385 + * Format and return a sign request compliant with the JS API version supported by the extension.
386 + * @param {Array<u2f.SignRequest>} signRequests
387 + * @param {number} timeoutSeconds
388 + * @param {number} reqId
389 + * @return {Object}
390 + */
391 +u2f.formatSignRequest_ =
392 + function (appId, challenge, registeredKeys, timeoutSeconds, reqId) {
393 + if (js_api_version === undefined || js_api_version < 1.1) {
394 + // Adapt request to the 1.0 JS API
395 + var signRequests = [];
396 + for (var i = 0; i < registeredKeys.length; i++) {
397 + signRequests[i] = {
398 + version: registeredKeys[i].version,
399 + challenge: challenge,
400 + keyHandle: registeredKeys[i].keyHandle,
401 + appId: appId
402 + };
403 + }
404 + return {
405 + type: u2f.MessageTypes.U2F_SIGN_REQUEST,
406 + signRequests: signRequests,
407 + timeoutSeconds: timeoutSeconds,
408 + requestId: reqId
409 + };
410 + }
411 + // JS 1.1 API
412 + return {
413 + type: u2f.MessageTypes.U2F_SIGN_REQUEST,
414 + appId: appId,
415 + challenge: challenge,
416 + registeredKeys: registeredKeys,
417 + timeoutSeconds: timeoutSeconds,
418 + requestId: reqId
419 + };
420 + };
421 +
422 + /**
423 + * Format and return a register request compliant with the JS API version supported by the extension..
424 + * @param {Array<u2f.SignRequest>} signRequests
425 + * @param {Array<u2f.RegisterRequest>} signRequests
426 + * @param {number} timeoutSeconds
427 + * @param {number} reqId
428 + * @return {Object}
429 + */
430 +u2f.formatRegisterRequest_ =
431 + function (appId, registeredKeys, registerRequests, timeoutSeconds, reqId) {
432 + if (js_api_version === undefined || js_api_version < 1.1) {
433 + // Adapt request to the 1.0 JS API
434 + for (var i = 0; i < registerRequests.length; i++) {
435 + registerRequests[i].appId = appId;
436 + }
437 + var signRequests = [];
438 + for (var i = 0; i < registeredKeys.length; i++) {
439 + signRequests[i] = {
440 + version: registeredKeys[i].version,
441 + challenge: registerRequests[0],
442 + keyHandle: registeredKeys[i].keyHandle,
443 + appId: appId
444 + };
445 + }
446 + return {
447 + type: u2f.MessageTypes.U2F_REGISTER_REQUEST,
448 + signRequests: signRequests,
449 + registerRequests: registerRequests,
450 + timeoutSeconds: timeoutSeconds,
451 + requestId: reqId
452 + };
453 + }
454 + // JS 1.1 API
455 + return {
456 + type: u2f.MessageTypes.U2F_REGISTER_REQUEST,
457 + appId: appId,
458 + registerRequests: registerRequests,
459 + registeredKeys: registeredKeys,
460 + timeoutSeconds: timeoutSeconds,
461 + requestId: reqId
462 + };
463 + };
464 +
465 +
466 + /**
467 + * Posts a message on the underlying channel.
468 + * @param {Object} message
469 + */
470 +u2f.WrappedChromeRuntimePort_.prototype.postMessage = function (message) {
471 + this.port_.postMessage(message);
472 + };
473 +
474 +
475 + /**
476 + * Emulates the HTML 5 addEventListener interface. Works only for the
477 + * onmessage event, which is hooked up to the chrome.runtime.Port.onMessage.
478 + * @param {string} eventName
479 + * @param {function({data: Object})} handler
480 + */
481 +u2f.WrappedChromeRuntimePort_.prototype.addEventListener =
482 + function (eventName, handler) {
483 + var name = eventName.toLowerCase();
484 + if (name == 'message' || name == 'onmessage') {
485 + this.port_.onMessage.addListener(function (message) {
486 + // Emulate a minimal MessageEvent object
487 + handler({ 'data': message });
488 + });
489 + } else {
490 + console.error('WrappedChromeRuntimePort only supports onMessage');
491 + }
492 + };
493 +
494 + /**
495 + * Wrap the Authenticator app with a MessagePort interface.
496 + * @constructor
497 + * @private
498 + */
499 +u2f.WrappedAuthenticatorPort_ = function () {
500 + this.requestId_ = -1;
501 + this.requestObject_ = null;
502 + }
503 +
504 + /**
505 + * Launch the Authenticator intent.
506 + * @param {Object} message
507 + */
508 +u2f.WrappedAuthenticatorPort_.prototype.postMessage = function (message) {
509 + var intentUrl =
510 + u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_ +
511 + ';S.request=' + encodeURIComponent(JSON.stringify(message)) +
512 + ';end';
513 + document.location = intentUrl;
514 + };
515 +
516 + /**
517 + * Tells what type of port this is.
518 + * @return {String} port type
519 + */
520 +u2f.WrappedAuthenticatorPort_.prototype.getPortType = function () {
521 + return "WrappedAuthenticatorPort_";
522 + };
523 +
524 +
525 + /**
526 + * Emulates the HTML 5 addEventListener interface.
527 + * @param {string} eventName
528 + * @param {function({data: Object})} handler
529 + */
530 +u2f.WrappedAuthenticatorPort_.prototype.addEventListener = function (eventName, handler) {
531 + var name = eventName.toLowerCase();
532 + if (name == 'message') {
533 + var self = this;
534 + /* Register a callback to that executes when
535 + * chrome injects the response. */
536 + window.addEventListener(
537 + 'message', self.onRequestUpdate_.bind(self, handler), false);
538 + } else {
539 + console.error('WrappedAuthenticatorPort only supports message');
540 + }
541 + };
542 +
543 + /**
544 + * Callback invoked when a response is received from the Authenticator.
545 + * @param function({data: Object}) callback
546 + * @param {Object} message message Object
547 + */
548 +u2f.WrappedAuthenticatorPort_.prototype.onRequestUpdate_ =
549 + function (callback, message) {
550 + var messageObject = JSON.parse(message.data);
551 + var intentUrl = messageObject['intentURL'];
552 +
553 + var errorCode = messageObject['errorCode'];
554 + var responseObject = null;
555 + if (messageObject.hasOwnProperty('data')) {
556 + responseObject = /** @type {Object} */ (
557 + JSON.parse(messageObject['data']));
558 + }
559 +
560 + callback({ 'data': responseObject });
561 + };
562 +
563 + /**
564 + * Base URL for intents to Authenticator.
565 + * @const
566 + * @private
567 + */
568 +u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_ =
569 + 'intent:#Intent;action=com.google.android.apps.authenticator.AUTHENTICATE';
570 +
571 + /**
572 + * Wrap the iOS client app with a MessagePort interface.
573 + * @constructor
574 + * @private
575 + */
576 +u2f.WrappedIosPort_ = function () { };
577 +
578 + /**
579 + * Launch the iOS client app request
580 + * @param {Object} message
581 + */
582 +u2f.WrappedIosPort_.prototype.postMessage = function (message) {
583 + var str = JSON.stringify(message);
584 + var url = "u2f://auth?" + encodeURI(str);
585 + location.replace(url);
586 + };
587 +
588 + /**
589 + * Tells what type of port this is.
590 + * @return {String} port type
591 + */
592 +u2f.WrappedIosPort_.prototype.getPortType = function () {
593 + return "WrappedIosPort_";
594 + };
595 +
596 + /**
597 + * Emulates the HTML 5 addEventListener interface.
598 + * @param {string} eventName
599 + * @param {function({data: Object})} handler
600 + */
601 +u2f.WrappedIosPort_.prototype.addEventListener = function (eventName, handler) {
602 + var name = eventName.toLowerCase();
603 + if (name !== 'message') {
604 + console.error('WrappedIosPort only supports message');
605 + }
606 + };
607 +
608 + /**
609 + * Sets up an embedded trampoline iframe, sourced from the extension.
610 + * @param {function(MessagePort)} callback
611 + * @private
612 + */
613 +u2f.getIframePort_ = function (callback) {
614 + // Create the iframe
615 + var iframeOrigin = 'chrome-extension://' + u2f.EXTENSION_ID;
616 + var iframe = document.createElement('iframe');
617 + iframe.src = iframeOrigin + '/u2f-comms.html';
618 + iframe.setAttribute('style', 'display:none');
619 + document.body.appendChild(iframe);
620 +
621 + var channel = new MessageChannel();
622 + var ready = function (message) {
623 + if (message.data == 'ready') {
624 + channel.port1.removeEventListener('message', ready);
625 + callback(channel.port1);
626 + } else {
627 + console.error('First event on iframe port was not "ready"');
628 + }
629 + };
630 + channel.port1.addEventListener('message', ready);
631 + channel.port1.start();
632 +
633 + iframe.addEventListener('load', function () {
634 + // Deliver the port to the iframe and initialize
635 + iframe.contentWindow.postMessage('init', iframeOrigin, [channel.port2]);
636 + });
637 + };
638 +
639 +
640 + //High-level JS API
641 +
642 + /**
643 + * Default extension response timeout in seconds.
644 + * @const
645 + */
646 +u2f.EXTENSION_TIMEOUT_SEC = 30;
647 +
648 + /**
649 + * A singleton instance for a MessagePort to the extension.
650 + * @type {MessagePort|u2f.WrappedChromeRuntimePort_}
651 + * @private
652 + */
653 +u2f.port_ = null;
654 +
655 + /**
656 + * Callbacks waiting for a port
657 + * @type {Array<function((MessagePort|u2f.WrappedChromeRuntimePort_))>}
658 + * @private
659 + */
660 +u2f.waitingForPort_ = [];
661 +
662 + /**
663 + * A counter for requestIds.
664 + * @type {number}
665 + * @private
666 + */
667 +u2f.reqCounter_ = 0;
668 +
669 + /**
670 + * A map from requestIds to client callbacks
671 + * @type {Object.<number,(function((u2f.Error|u2f.RegisterResponse))
672 + * |function((u2f.Error|u2f.SignResponse)))>}
673 + * @private
674 + */
675 +u2f.callbackMap_ = {};
676 +
677 + /**
678 + * Creates or retrieves the MessagePort singleton to use.
679 + * @param {function((MessagePort|u2f.WrappedChromeRuntimePort_))} callback
680 + * @private
681 + */
682 +u2f.getPortSingleton_ = function (callback) {
683 + if (u2f.port_) {
684 + callback(u2f.port_);
685 + } else {
686 + if (u2f.waitingForPort_.length == 0) {
687 + u2f.getMessagePort(function (port) {
688 + u2f.port_ = port;
689 + u2f.port_.addEventListener('message',
690 + /** @type {function(Event)} */ (u2f.responseHandler_));
691 +
692 + // Careful, here be async callbacks. Maybe.
693 + while (u2f.waitingForPort_.length)
694 + u2f.waitingForPort_.shift()(u2f.port_);
695 + });
696 + }
697 + u2f.waitingForPort_.push(callback);
698 + }
699 + };
700 +
701 + /**
702 + * Handles response messages from the extension.
703 + * @param {MessageEvent.<u2f.Response>} message
704 + * @private
705 + */
706 +u2f.responseHandler_ = function (message) {
707 + var response = message.data;
708 + var reqId = response['requestId'];
709 + if (!reqId || !u2f.callbackMap_[reqId]) {
710 + console.error('Unknown or missing requestId in response.');
711 + return;
712 + }
713 + var cb = u2f.callbackMap_[reqId];
714 + delete u2f.callbackMap_[reqId];
715 + cb(response['responseData']);
716 + };
717 +
718 + /**
719 + * Dispatches an array of sign requests to available U2F tokens.
720 + * If the JS API version supported by the extension is unknown, it first sends a
721 + * message to the extension to find out the supported API version and then it sends
722 + * the sign request.
723 + * @param {string=} appId
724 + * @param {string=} challenge
725 + * @param {Array<u2f.RegisteredKey>} registeredKeys
726 + * @param {function((u2f.Error|u2f.SignResponse))} callback
727 + * @param {number=} opt_timeoutSeconds
728 + */
729 +u2f.sign = function (appId, challenge, registeredKeys, callback, opt_timeoutSeconds) {
730 + if (js_api_version === undefined) {
731 + // Send a message to get the extension to JS API version, then send the actual sign request.
732 + u2f.getApiVersion(
733 + function (response) {
734 + js_api_version = response['js_api_version'] === undefined ? 0 : response['js_api_version'];
735 + //console.log("Extension JS API Version: ", js_api_version);
736 + u2f.sendSignRequest(appId, challenge, registeredKeys, callback, opt_timeoutSeconds);
737 + });
738 + } else {
739 + // We know the JS API version. Send the actual sign request in the supported API version.
740 + u2f.sendSignRequest(appId, challenge, registeredKeys, callback, opt_timeoutSeconds);
741 + }
742 + };
743 +
744 + /**
745 + * Dispatches an array of sign requests to available U2F tokens.
746 + * @param {string=} appId
747 + * @param {string=} challenge
748 + * @param {Array<u2f.RegisteredKey>} registeredKeys
749 + * @param {function((u2f.Error|u2f.SignResponse))} callback
750 + * @param {number=} opt_timeoutSeconds
751 + */
752 +u2f.sendSignRequest = function (appId, challenge, registeredKeys, callback, opt_timeoutSeconds) {
753 + u2f.getPortSingleton_(function (port) {
754 + var reqId = ++u2f.reqCounter_;
755 + u2f.callbackMap_[reqId] = callback;
756 + var timeoutSeconds = (typeof opt_timeoutSeconds !== 'undefined' ?
757 + opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC);
758 + var req = u2f.formatSignRequest_(appId, challenge, registeredKeys, timeoutSeconds, reqId);
759 + port.postMessage(req);
760 + });
761 + };
762 +
763 + /**
764 + * Dispatches register requests to available U2F tokens. An array of sign
765 + * requests identifies already registered tokens.
766 + * If the JS API version supported by the extension is unknown, it first sends a
767 + * message to the extension to find out the supported API version and then it sends
768 + * the register request.
769 + * @param {string=} appId
770 + * @param {Array<u2f.RegisterRequest>} registerRequests
771 + * @param {Array<u2f.RegisteredKey>} registeredKeys
772 + * @param {function((u2f.Error|u2f.RegisterResponse))} callback
773 + * @param {number=} opt_timeoutSeconds
774 + */
775 +u2f.register = function (appId, registerRequests, registeredKeys, callback, opt_timeoutSeconds) {
776 + if (js_api_version === undefined) {
777 + // Send a message to get the extension to JS API version, then send the actual register request.
778 + u2f.getApiVersion(
779 + function (response) {
780 + js_api_version = response['js_api_version'] === undefined ? 0: response['js_api_version'];
781 + //console.log("Extension JS API Version: ", js_api_version);
782 + u2f.sendRegisterRequest(appId, registerRequests, registeredKeys,
783 + callback, opt_timeoutSeconds);
784 + });
785 + } else {
786 + // We know the JS API version. Send the actual register request in the supported API version.
787 + u2f.sendRegisterRequest(appId, registerRequests, registeredKeys,
788 + callback, opt_timeoutSeconds);
789 + }
790 + };
791 +
792 + /**
793 + * Dispatches register requests to available U2F tokens. An array of sign
794 + * requests identifies already registered tokens.
795 + * @param {string=} appId
796 + * @param {Array<u2f.RegisterRequest>} registerRequests
797 + * @param {Array<u2f.RegisteredKey>} registeredKeys
798 + * @param {function((u2f.Error|u2f.RegisterResponse))} callback
799 + * @param {number=} opt_timeoutSeconds
800 + */
801 +u2f.sendRegisterRequest = function (appId, registerRequests, registeredKeys, callback, opt_timeoutSeconds) {
802 + u2f.getPortSingleton_(function (port) {
803 + var reqId = ++u2f.reqCounter_;
804 + u2f.callbackMap_[reqId] = callback;
805 + var timeoutSeconds = (typeof opt_timeoutSeconds !== 'undefined' ?
806 + opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC);
807 + var req = u2f.formatRegisterRequest_(
808 + appId, registeredKeys, registerRequests, timeoutSeconds, reqId);
809 + port.postMessage(req);
810 + });
811 + };
812 +
813 +
814 + /**
815 + * Dispatches a message to the extension to find out the supported
816 + * JS API version.
817 + * If the user is on a mobile phone and is thus using Google Authenticator instead
818 + * of the Chrome extension, don't send the request and simply return 0.
819 + * @param {function((u2f.Error|u2f.GetJsApiVersionResponse))} callback
820 + * @param {number=} opt_timeoutSeconds
821 + */
822 +u2f.getApiVersion = function (callback, opt_timeoutSeconds) {
823 + u2f.getPortSingleton_(function (port) {
824 + // If we are using Android Google Authenticator or iOS client app,
825 + // do not fire an intent to ask which JS API version to use.
826 + if (port.getPortType) {
827 + var apiVersion;
828 + switch (port.getPortType()) {
829 + case 'WrappedIosPort_':
830 + case 'WrappedAuthenticatorPort_':
831 + apiVersion = 1.1;
832 + break;
833 +
834 + default:
835 + apiVersion = 0;
836 + break;
837 + }
838 + callback({ 'js_api_version': apiVersion });
839 + return;
840 + }
841 + var reqId = ++u2f.reqCounter_;
842 + u2f.callbackMap_[reqId] = callback;
843 + var req = {
844 + type: u2f.MessageTypes.U2F_GET_API_VERSION_REQUEST,
845 + timeoutSeconds: (typeof opt_timeoutSeconds !== 'undefined' ?
846 + opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC),
847 + requestId: reqId
848 + };
849 + port.postMessage(req);
850 + });
851 + };
852 +
853 +}
854 + 'use strict';
855 + var passhint = "{{{passhint}}}";
856 + var newAccountPass = parseInt('{{{newAccountPass}}}');
857 + var emailCheck = ('{{{emailcheck}}}' == 'true');
858 + var features = parseInt('{{{features}}}');
859 + var passRequirements = "{{{passRequirements}}}";
860 + if (passRequirements != "") { passRequirements = JSON.parse(decodeURIComponent(passRequirements)); } else { passRequirements = {}; }
861 + var passRequirementsEx = ((passRequirements.min != null) || (passRequirements.max != null) || (passRequirements.upper != null) || (passRequirements.lower != null) || (passRequirements.numeric != null) || (passRequirements.nonalpha != null));
862 + var hardwareKeyChallenge = '{{{hkey}}}';
863 + var currentpanel = 0;
864 +
865 + function startup() {
866 + if ((features & 32) == 0) {
867 + // Guard against other site's top frames (web bugs).
868 + var loc = null;
869 + try { loc = top.location.toString().toLowerCase(); } catch (e) { }
870 + if (top != self && (loc == null || top.active == false)) { top.location = self.location; return; }
871 + }
872 +
873 + QV('createPanelHint', passRequirements.hint === true);
874 + QV('resetpasswordpanelHint', passRequirements.hint === true);
875 +
876 + window.onresize = center;
877 + center();
878 + validateLogin();
879 + validateCreate();
880 + if ('{{loginmode}}' != '') { go(parseInt('{{loginmode}}')); } else { go(1); }
881 + QV('newAccountDiv', ('{{{newAccount}}}' != '0') && ('{{{newAccount}}}' != 'false')); // If new accounts are not allowed, don't display the new account link.
882 + if ((passRequirements.hint === true) && (passhint != null) && (passhint.length > 0)) { QV("showPassHintLink", true); }
883 + QV("newAccountPass", (newAccountPass == 1));
884 + QV("resetAccountDiv", (emailCheck == true));
885 + QV("hrAccountDiv", (emailCheck == true) || (newAccountPass == 1));
886 +
887 + if ('{{loginmode}}' == '4') {
888 + try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
889 + if ((hardwareKeyChallenge != null) && (hardwareKeyChallenge.type == 'webAuthn')) {
890 + hardwareKeyChallenge.challenge = Uint8Array.from(atob(hardwareKeyChallenge.challenge), c => c.charCodeAt(0)).buffer;
891 +
892 + const publicKeyCredentialRequestOptions = { challenge: hardwareKeyChallenge.challenge, allowCredentials: [], timeout: hardwareKeyChallenge.timeout }
893 + for (var i = 0; i < hardwareKeyChallenge.keyIds.length; i++) {
894 + publicKeyCredentialRequestOptions.allowCredentials.push(
895 + { id: Uint8Array.from(atob(hardwareKeyChallenge.keyIds[i]), c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }
896 + );
897 + }
898 +
899 + // New WebAuthn hardware keys
900 + navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
901 + function (rawAssertion) {
902 + var assertion = {
903 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
904 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
905 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
906 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
907 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
908 + };
909 + Q('hwtokenInput').value = JSON.stringify(assertion);
910 + QE('tokenOkButton', true);
911 + Q('tokenOkButton').click();
912 + },
913 + function (error) { console.log('credentials-get error', error); }
914 + );
915 + } else if ((hardwareKeyChallenge != null) && u2fSupported()) {
916 + // Old U2F hardware keys
917 + window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
918 + if ((currentpanel == 4) && authResponse.signatureData) {
919 + Q('hwtokenInput').value = JSON.stringify(authResponse);
920 + QE('tokenOkButton', true);
921 + Q('tokenOkButton').click();
922 + }
923 + }, hardwareKeyChallenge.timeoutSeconds);
924 + }
925 + }
926 +
927 + if ('{{loginmode}}' == '5') {
928 + try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
929 + if ((hardwareKeyChallenge != null) && (hardwareKeyChallenge.type == 'webAuthn')) {
930 + hardwareKeyChallenge.challenge = Uint8Array.from(atob(hardwareKeyChallenge.challenge), c => c.charCodeAt(0)).buffer;
931 +
932 + const publicKeyCredentialRequestOptions = { challenge: hardwareKeyChallenge.challenge, allowCredentials: [], timeout: hardwareKeyChallenge.timeout }
933 + for (var i = 0; i < hardwareKeyChallenge.keyIds.length; i++) {
934 + publicKeyCredentialRequestOptions.allowCredentials.push(
935 + { id: Uint8Array.from(atob(hardwareKeyChallenge.keyIds[i]), c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }
936 + );
937 + }
938 +
939 + // New WebAuthn hardware keys
940 + navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
941 + function (rawAssertion) {
942 + var assertion = {
943 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
944 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
945 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
946 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
947 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
948 + };
949 + Q('resetHwtokenInput').value = JSON.stringify(assertion);
950 + QE('resetTokenOkButton', true);
951 + Q('resetTokenOkButton').click();
952 + },
953 + function (error) { console.log('credentials-get error', error); }
954 + );
955 + } else if ((hardwareKeyChallenge != null) && u2fSupported()) {
956 + // Old U2F hardware keys
957 + window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
958 + if ((currentpanel == 5) && authResponse.signatureData) {
959 + Q('resetHwtokenInput').value = JSON.stringify(authResponse);
960 + QE('resetTokenOkButton', true);
961 + Q('resetTokenOkButton').click();
962 + }
963 + }, hardwareKeyChallenge.timeoutSeconds);
964 + }
965 + }
966 + }
967 +
968 + function showPassHint() {
969 + if (passRequirements.hint === true) { messagebox("Password Hint", passhint); }
970 + }
971 +
972 + function xgo(x) {
973 + QV('message1', false);
974 + QV('message2', false);
975 + QV('message3', false);
976 + QV('message4', false);
977 + QV('message5', false);
978 + QV('message6', false);
979 + go(x);
980 + }
981 +
982 + function go(x) {
983 + currentpanel = x;
984 + setDialogMode(0);
985 + QV("showPassHintLink", false);
986 + QV('loginpanel', x == 1);
987 + QV('createpanel', x == 2);
988 + QV('resetpanel', x == 3);
989 + QV('tokenpanel', x == 4);
990 + QV('resettokenpanel', x == 5);
991 + QV('resetpasswordpanel', x == 6);
992 + if (x == 1) { Q('username').focus(); }
993 + if (x == 2) { Q('ausername').focus(); }
994 + if (x == 3) { Q('remail').focus(); }
995 + if (x == 4) { Q('tokenInput').focus(); }
996 + if (x == 5) { Q('resetTokenInput').focus(); }
997 + if (x == 6) { Q('rapassword1').focus(); }
998 + }
999 +
1000 + function validateLogin(box, e) {
1001 + var ok = ((Q('username').value.length > 0) && (Q('username').value.indexOf(' ') == -1) && (Q('password').value.length > 0));
1002 + QE('loginButton', ok);
1003 + setDialogMode(0);
1004 + if ((e != null) && (e.keyCode == 13)) { if (box == 1) { Q('password').focus(); } else if (box == 2) { Q('loginButton').click(); } }
1005 + if (e != null) { haltEvent(e); }
1006 + }
1007 +
1008 + function validateCreate(box,e) {
1009 + setDialogMode(0);
1010 + var ok = ((Q('ausername').value.length > 0) && (Q('ausername').value.indexOf(' ') == -1) && (validateEmail(Q('aemail').value) == true) && (Q('apassword1').value.length > 0) && (Q('apassword2').value == Q('apassword1').value));
1011 + if ((newAccountPass == 1) && (Q('anewaccountpass').value.length == 0)) { ok = false; }
1012 + if (Q('apassword1').value == '') {
1013 + QH('passWarning', '');
1014 + QV('passwordPolicyCallout', false);
1015 + } else {
1016 + if (!passRequirementsEx) {
1017 + // No password requirements, display password strength
1018 + var passStrength = checkPasswordStrength(Q('apassword1').value);
1019 + if (passStrength >= 80) { QH('passWarning', '<span style=color:green><b>Strong Password</b><span>'); }
1020 + else if (passStrength >= 60) { QH('passWarning', '<span style=color:blue><b>Good Password</b><span>'); }
1021 + else { QH('passWarning', '<span style=color:red><b>Weak Password</b><span>'); }
1022 + } else {
1023 + // Password requirements provided, use that
1024 + var passReq = checkPasswordRequirements(Q('apassword1').value, passRequirements);
1025 + if (passReq == false) {
1026 + ok = false;
1027 + //QS('nuPass1').color = '#7b241c';
1028 + //QS('nuPass2').color = '#7b241c';
1029 + QH('passWarning', '<span style=color:red><b>Password Policy</b><span>'); // TODO: Display problem hint
1030 + QV('passwordPolicyCallout', true);
1031 + QH('passwordPolicyCallout', passwordPolicyText(Q('apassword1').value));
1032 + } else {
1033 + QH('passWarning', '');
1034 + QV('passwordPolicyCallout', false);
1035 + }
1036 + }
1037 + }
1038 + QE('createButton', ok);
1039 + if ((e != null) && (e.keyCode == 13)) {
1040 + if (box == 1) { Q('aemail').focus(); }
1041 + if (box == 2) { Q('apassword1').focus(); }
1042 + if (box == 3) { Q('apassword2').focus(); }
1043 + if (box == 4) { Q('apasswordhint').focus(); }
1044 + if (box == 5) { if (newAccountPass == 1) { Q('anewaccountpass').focus(); } else { Q('createButton').click(); } }
1045 + if (box == 6) { Q('createButton').click(); }
1046 + }
1047 + if (e != null) { haltEvent(e); }
1048 + }
1049 +
1050 + function validatePassReset(box, e) {
1051 + setDialogMode(0);
1052 + var pass1ok = (Q('rapassword1').value.length > 0);
1053 + var pass2ok = (Q('rapassword2').value.length > 0) && (Q('rapassword2').value == Q('rapassword1').value);
1054 + var ok = (pass1ok && pass2ok);
1055 +
1056 + // Color the fields
1057 + QS('rnuPass1').color = pass1ok ? 'black' : '#7b241c';
1058 + QS('rnuPass2').color = pass2ok ? 'black' : '#7b241c';
1059 +
1060 + if (Q('rapassword1').value == '') {
1061 + QH('rpassWarning', '');
1062 + QV('rpasswordPolicyCallout', false);
1063 + } else {
1064 + if (!passRequirementsEx) {
1065 + // No password requirements, display password strength
1066 + var passStrength = checkPasswordStrength(Q('rapassword1').value);
1067 + if (passStrength >= 80) { QH('rpassWarning', '<span style=color:green><b>Strong Password</b><span>'); }
1068 + else if (passStrength >= 60) { QH('rpassWarning', '<span style=color:blue><b>Good Password</b><span>'); }
1069 + else { QH('rpassWarning', '<span style=color:red><b>Weak Password</b><span>'); }
1070 + } else {
1071 + // Password requirements provided, use that
1072 + var passReq = checkPasswordRequirements(Q('rapassword1').value, passRequirements);
1073 + if (passReq == false) {
1074 + ok = false;
1075 + QS('rnuPass1').color = '#7b241c';
1076 + QS('rnuPass2').color = '#7b241c';
1077 + QH('rpassWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>'); // This is also a link to the password policy
1078 + QV('rpasswordPolicyCallout', true);
1079 + QH('rpasswordPolicyCallout', passwordPolicyText(Q('rapassword1').value));
1080 + } else {
1081 + QH('rpassWarning', '');
1082 + QV('rpasswordPolicyCallout', false);
1083 + }
1084 + }
1085 + }
1086 + if ((e != null) && (e.keyCode == 13)) {
1087 + if (box == 2) { Q('rapassword1').focus(); }
1088 + if (box == 3) { Q('rapassword2').focus(); }
1089 + if (box == 4) { Q('rapasswordhint').focus(); }
1090 + if (box == 6) { Q('resetPassButton').click(); }
1091 + }
1092 + if (e != null) { haltEvent(e); }
1093 + QE('resetPassButton', ok);
1094 + }
1095 +
1096 + function validateReset(e) {
1097 + setDialogMode(0);
1098 + var x = validateEmail(Q('remail').value);
1099 + QE('eresetButton', x);
1100 + if ((e != null) && (e.keyCode == 13) && (x == true)) {
1101 + Q('eresetButton').click();
1102 + }
1103 + if (e != null) { haltEvent(e); }
1104 + }
1105 +
1106 + function passwordPolicyText(pass) {
1107 + var policy = '<div style=text-align:left>';
1108 + var counts = strCount(pass);
1109 + if (passRequirements.min && ((pass == null) || (pass.length < passRequirements.min))) { policy += 'Minimum length of ' + passRequirements.min + '<br />'; }
1110 + if (passRequirements.max && ((pass == null) || (pass.length > passRequirements.max))) { policy += 'Maximum length of ' + passRequirements.max + '<br />'; }
1111 + if (passRequirements.upper && ((pass == null) || (counts.upper < passRequirements.upper))) { policy += '' + passRequirements.upper + ' upper case<br />'; }
1112 + if (passRequirements.lower && ((pass == null) || (counts.lower < passRequirements.lower))) { policy += '' + passRequirements.lower + ' lower case<br />'; }
1113 + if (passRequirements.numeric && ((pass == null) || (counts.numeric < passRequirements.numeric))) { policy += '' + passRequirements.numeric + ' numeric<br />'; }
1114 + if (passRequirements.nonalpha && ((pass == null) || (counts.nonalpha < passRequirements.nonalpha))) { policy += passRequirements.nonalpha + ' non-alphanumeric<br />'; }
1115 + policy += '</div>';
1116 + return policy;
1117 + }
1118 +
1119 + // Return a password strength score
1120 + function checkPasswordStrength(password) {
1121 + var r = 0, letters = {}, varCount = 0, variations = { digits: /\d/.test(password), lower: /[a-z]/.test(password), upper: /[A-Z]/.test(password), nonWords: /\W/.test(password) }
1122 + if (!password) return 0;
1123 + for (var i = 0; i< password.length; i++) { letters[password[i]] = (letters[password[i]] || 0) + 1; r += 5.0 / letters[password[i]]; }
1124 + for (var c in variations) { varCount += (variations[c] == true) ? 1 : 0; }
1125 + return parseInt(r + (varCount - 1) * 10);
1126 + }
1127 +
1128 + // Check password requirements
1129 + function checkPasswordRequirements(password, requirements) {
1130 + if ((requirements == null) || (requirements == '') || (typeof requirements != 'object')) return true;
1131 + if (requirements.min) { if (password.length < requirements.min) return false; }
1132 + if (requirements.max) { if (password.length > requirements.max) return false; }
1133 + var counts = strCount(password);
1134 + if (requirements.numeric && (counts.numeric < requirements.numeric)) return false;
1135 + if (requirements.lower && (counts.lower < requirements.lower)) return false;
1136 + if (requirements.upper && (counts.upper < requirements.upper)) return false;
1137 + if (requirements.nonalpha && (counts.nonalpha < requirements.nonalpha)) return false;
1138 + return true;
1139 + }
1140 +
1141 + function strCount(password) {
1142 + var counts = { numeric: 0, lower: 0, upper: 0, nonalpha: 0 };
1143 + if (typeof password != 'string') return counts;
1144 + for (var i = 0; i < password.length; i++) {
1145 + if (/\d/.test(password[i])) { counts.numeric++; }
1146 + if (/[a-z]/.test(password[i])) { counts.lower++; }
1147 + if (/[A-Z]/.test(password[i])) { counts.upper++; }
1148 + if (/\W/.test(password[i])) { counts.nonalpha++; }
1149 + }
1150 + return counts;
1151 + }
1152 +
1153 + var xcheckTokenTimer = null;
1154 + function checkTokenTimer(enter) {
1155 + if ((enter == 0) && (xcheckTokenTimer != null)) { clearInterval(xcheckTokenTimer); xcheckTokenTimer = null; }
1156 + if ((enter == 1) && (xcheckTokenTimer == null)) { xcheckTokenTimer = setInterval(checkToken, 200); }
1157 + }
1158 +
1159 + function checkToken() {
1160 + var t1 = Q('tokenInput').value, t2 = t1.split(' ').join('');
1161 + if (t1 != t2) { Q('tokenInput').value = t2; }
1162 + QE('tokenOkButton', (Q('tokenInput').value.length == 6) || (Q('tokenInput').value.length == 8) || (Q('tokenInput').value.length == 44));
1163 + }
1164 +
1165 + function resetCheckToken() {
1166 + var t1 = Q('resetTokenInput').value, t2 = t1.split(' ').join('');
1167 + if (t1 != t2) { Q('resetTokenInput').value = t2; }
1168 + QE('resetTokenOkButton', (Q('resetTokenInput').value.length == 6) || (Q('resetTokenInput').value.length == 8) || (Q('resetTokenInput').value.length == 44));
1169 + }
1170 +
1171 + //
1172 + // POPUP DIALOG
1173 + //
1174 +
1175 + // undefined = Hidden, 1 = Generic Message
1176 + var xxdialogMode;
1177 + var xxdialogFunc;
1178 + var xxdialogButtons;
1179 + var xxdialogTag;
1180 + var xxcurrentView = 0;
1181 +
1182 + // Display a dialog box
1183 + // Parameters: Dialog Mode (0 = none), Dialog Title, Buttons (1 = OK, 2 = Cancel, 3 = OK & Cancel), Call back function(0 = Cancel, 1 = OK), Dialog Content (Mode 2 only)
1184 + function setDialogMode(x, y, b, f, c, tag) {
1185 + xxdialogMode = x;
1186 + xxdialogFunc = f;
1187 + xxdialogButtons = b;
1188 + xxdialogTag = tag;
1189 + QE('idx_dlgOkButton', true);
1190 + QV('idx_dlgOkButton', b & 1);
1191 + QV('idx_dlgCancelButton', b & 2);
1192 + QV('id_dialogclose', (b & 2) || (b & 8));
1193 + QV('idx_dlgButtonBar', b & 7);
1194 + if (y) QH('id_dialogtitle', y);
1195 + for (var i = 1; i < 24; i++) { QV('dialog' + i, i == x); } // Edit this line when more dialogs are added
1196 + QV('dialog', x);
1197 + if (c) { if (x == 2) { QH('id_dialogOptions', c); } else { QH('id_dialogMessage', c); } }
1198 + }
1199 +
1200 + function dialogclose(x) {
1201 + var f = xxdialogFunc;
1202 + var b = xxdialogButtons;
1203 + var t = xxdialogTag;
1204 + setDialogMode();
1205 + if (((b & 8) || x) && f) f(x, t);
1206 + }
1207 +
1208 + function center() { QS('dialog').left = ((((getDocWidth() - 400) / 2)) + "px"); }
1209 + function messagebox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t, 1); }
1210 + function statusbox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t); }
1211 + function getDocWidth() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientWidth != 0) return document.documentElement.clientWidth; return document.getElementsByTagName('body')[0].clientWidth; }
1212 + function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
1213 + function haltReturn(e) { if (e.keyCode == 13) { haltEvent(e); } }
1214 + function validateEmail(v) { var emailReg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return emailReg.test(v); } // New version
1215 + function u2fSupported() { return (window.u2f && ((navigator.userAgent.indexOf('Chrome/') > 0) || (navigator.userAgent.indexOf('Firefox/') > 0) || (navigator.userAgent.indexOf('Opera/') > 0) || (navigator.userAgent.indexOf('Safari/') > 0))); }
1216 +
1217 + </script></body></html>
\ No newline at end of file
views/login-mobile.handlebars
+56 -2
@@ -287,7 +287,34 @@
287
288 if ('{{loginmode}}' == '4') {
289 try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
290 - if ((hardwareKeyChallenge != null) && u2fSupported()) {
290 + if ((hardwareKeyChallenge != null) && (hardwareKeyChallenge.type == 'webAuthn')) {
291 + hardwareKeyChallenge.challenge = Uint8Array.from(atob(hardwareKeyChallenge.challenge), c => c.charCodeAt(0)).buffer;
292 +
293 + const publicKeyCredentialRequestOptions = { challenge: hardwareKeyChallenge.challenge, allowCredentials: [], timeout: hardwareKeyChallenge.timeout }
294 + for (var i = 0; i < hardwareKeyChallenge.keyIds.length; i++) {
295 + publicKeyCredentialRequestOptions.allowCredentials.push(
296 + { id: Uint8Array.from(atob(hardwareKeyChallenge.keyIds[i]), c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }
297 + );
298 + }
299 +
300 + // New WebAuthn hardware keys
301 + navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
302 + function (rawAssertion) {
303 + var assertion = {
304 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
305 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
306 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
307 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
308 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
309 + };
310 + Q('hwtokenInput').value = JSON.stringify(assertion);
311 + QE('tokenOkButton', true);
312 + Q('tokenOkButton').click();
313 + },
314 + function (error) { console.log('credentials-get error', error); }
315 + );
316 + } else if ((hardwareKeyChallenge != null) && u2fSupported()) {
317 + // Old U2F hardware keys
318 window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
319 if ((currentpanel == 4) && authResponse.signatureData) {
320 Q('hwtokenInput').value = JSON.stringify(authResponse);
@@ -300,7 +327,34 @@
327
328 if ('{{loginmode}}' == '5') {
329 try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
303 - if ((hardwareKeyChallenge != null) && u2fSupported()) {
330 + if ((hardwareKeyChallenge != null) && (hardwareKeyChallenge.type == 'webAuthn')) {
331 + hardwareKeyChallenge.challenge = Uint8Array.from(atob(hardwareKeyChallenge.challenge), c => c.charCodeAt(0)).buffer;
332 +
333 + const publicKeyCredentialRequestOptions = { challenge: hardwareKeyChallenge.challenge, allowCredentials: [], timeout: hardwareKeyChallenge.timeout }
334 + for (var i = 0; i < hardwareKeyChallenge.keyIds.length; i++) {
335 + publicKeyCredentialRequestOptions.allowCredentials.push(
336 + { id: Uint8Array.from(atob(hardwareKeyChallenge.keyIds[i]), c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }
337 + );
338 + }
339 +
340 + // New WebAuthn hardware keys
341 + navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
342 + function (rawAssertion) {
343 + var assertion = {
344 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
345 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
346 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
347 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
348 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
349 + };
350 + Q('resetHwtokenInput').value = JSON.stringify(assertion);
351 + QE('resetTokenOkButton', true);
352 + Q('resetTokenOkButton').click();
353 + },
354 + function (error) { console.log('credentials-get error', error); }
355 + );
356 + } else if ((hardwareKeyChallenge != null) && u2fSupported()) {
357 + // Old U2F hardware keys
358 window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
359 if ((currentpanel == 5) && authResponse.signatureData) {
360 Q('resetHwtokenInput').value = JSON.stringify(authResponse);
views/login.handlebars
+33 -6
@@ -386,11 +386,11 @@
386 navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
387 function (rawAssertion) {
388 var assertion = {
389 - id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))), //base64encode(rawAssertion.rawId),
390 - clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))), //arrayBufferToString(rawAssertion.response.clientDataJSON),
391 - userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))), //base64encode(rawAssertion.response.userHandle),
392 - signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))), //base64encode(rawAssertion.response.signature),
393 - authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))), //base64encode(rawAssertion.response.authenticatorData)
389 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
390 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
391 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
392 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
393 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
394 };
395 Q('hwtokenInput').value = JSON.stringify(assertion);
396 QE('tokenOkButton', true);
@@ -412,7 +412,34 @@
412
413 if ('{{loginmode}}' == '5') {
414 try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
415 - if ((hardwareKeyChallenge != null) && u2fSupported()) {
415 + if ((hardwareKeyChallenge != null) && (hardwareKeyChallenge.type == 'webAuthn')) {
416 + hardwareKeyChallenge.challenge = Uint8Array.from(atob(hardwareKeyChallenge.challenge), c => c.charCodeAt(0)).buffer;
417 +
418 + const publicKeyCredentialRequestOptions = { challenge: hardwareKeyChallenge.challenge, allowCredentials: [], timeout: hardwareKeyChallenge.timeout }
419 + for (var i = 0; i < hardwareKeyChallenge.keyIds.length; i++) {
420 + publicKeyCredentialRequestOptions.allowCredentials.push(
421 + { id: Uint8Array.from(atob(hardwareKeyChallenge.keyIds[i]), c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }
422 + );
423 + }
424 +
425 + // New WebAuthn hardware keys
426 + navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }).then(
427 + function (rawAssertion) {
428 + var assertion = {
429 + id: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.rawId))),
430 + clientDataJSON: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.clientDataJSON))),
431 + userHandle: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.userHandle))),
432 + signature: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.signature))),
433 + authenticatorData: btoa(String.fromCharCode.apply(null, new Uint8Array(rawAssertion.response.authenticatorData))),
434 + };
435 + Q('resetHwtokenInput').value = JSON.stringify(assertion);
436 + QE('resetTokenOkButton', true);
437 + Q('resetTokenOkButton').click();
438 + },
439 + function (error) { console.log('credentials-get error', error); }
440 + );
441 + } else if ((hardwareKeyChallenge != null) && u2fSupported()) {
442 + // Old U2F hardware keys
443 window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
444 if ((currentpanel == 5) && authResponse.signatureData) {
445 Q('resetHwtokenInput').value = JSON.stringify(authResponse);
webserver.js
+1 -1
@@ -62,7 +62,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
62 const constants = (obj.crypto.constants ? obj.crypto.constants : require('constants')); // require('constants') is deprecated in Node 11.10, use require('crypto').constants instead.
63
64 // Setup WebAuthn / FIDO2
65 - try { const { Fido2Lib } = require("@davedoesdev/fido2-lib"); obj.f2l = new Fido2Lib({ attestation: "none" }); } catch (ex) { console.log(ex); }
65 + try { const { Fido2Lib } = require("@davedoesdev/fido2-lib"); obj.f2l = new Fido2Lib({ attestation: "none" }); } catch (ex) { }
66
67 // Variables
68 obj.parent = parent;