First attempt at MSTSC.js support.
Ylian Saint-Hilaire committed
Jun 9, 2020 at 18:17 UTC
b7f09f32f8b09ff29cb8635a123ff98fcb28b14f
17 files changed
+28365
-1237
MeshCentralServer.njsproj
+132
@@ -119,7 +119,64 @@
119
<Compile Include="meshuser.js" />
120
<Compile Include="mpsserver.js" />
121
<Compile Include="mqttbroker.js" />
122
+ <Compile Include="mstsc.js" />
123
<Compile Include="pluginHandler.js" />
124
+ <Compile Include="public\mstsc\js\canvas.js" />
125
+ <Compile Include="public\mstsc\js\client.js" />
126
+ <Compile Include="public\mstsc\js\keyboard.js" />
127
+ <Compile Include="public\mstsc\js\mstsc.js" />
128
+ <Compile Include="public\mstsc\js\rle.js" />
129
+ <Compile Include="public\novnc\app\error-handler.js" />
130
+ <Compile Include="public\novnc\app\localization.js" />
131
+ <Compile Include="public\novnc\app\ui.js" />
132
+ <Compile Include="public\novnc\app\webutil.js" />
133
+ <Compile Include="public\novnc\core\base64.js" />
134
+ <Compile Include="public\novnc\core\decoders\copyrect.js" />
135
+ <Compile Include="public\novnc\core\decoders\hextile.js" />
136
+ <Compile Include="public\novnc\core\decoders\raw.js" />
137
+ <Compile Include="public\novnc\core\decoders\rre.js" />
138
+ <Compile Include="public\novnc\core\decoders\tight.js" />
139
+ <Compile Include="public\novnc\core\decoders\tightpng.js" />
140
+ <Compile Include="public\novnc\core\des.js" />
141
+ <Compile Include="public\novnc\core\display.js" />
142
+ <Compile Include="public\novnc\core\encodings.js" />
143
+ <Compile Include="public\novnc\core\inflator.js" />
144
+ <Compile Include="public\novnc\core\input\domkeytable.js" />
145
+ <Compile Include="public\novnc\core\input\fixedkeys.js" />
146
+ <Compile Include="public\novnc\core\input\keyboard.js" />
147
+ <Compile Include="public\novnc\core\input\keysym.js" />
148
+ <Compile Include="public\novnc\core\input\keysymdef.js" />
149
+ <Compile Include="public\novnc\core\input\mouse.js" />
150
+ <Compile Include="public\novnc\core\input\util.js" />
151
+ <Compile Include="public\novnc\core\input\vkeys.js" />
152
+ <Compile Include="public\novnc\core\input\xtscancodes.js" />
153
+ <Compile Include="public\novnc\core\rfb.js" />
154
+ <Compile Include="public\novnc\core\util\browser.js" />
155
+ <Compile Include="public\novnc\core\util\cursor.js" />
156
+ <Compile Include="public\novnc\core\util\events.js" />
157
+ <Compile Include="public\novnc\core\util\eventtarget.js" />
158
+ <Compile Include="public\novnc\core\util\logging.js" />
159
+ <Compile Include="public\novnc\core\util\polyfill.js" />
160
+ <Compile Include="public\novnc\core\util\strings.js" />
161
+ <Compile Include="public\novnc\core\websock.js" />
162
+ <Compile Include="public\novnc\vendor\browser-es-module-loader\dist\babel-worker.js" />
163
+ <Compile Include="public\novnc\vendor\browser-es-module-loader\dist\browser-es-module-loader.js" />
164
+ <Compile Include="public\novnc\vendor\browser-es-module-loader\rollup.config.js" />
165
+ <Compile Include="public\novnc\vendor\browser-es-module-loader\src\babel-worker.js" />
166
+ <Compile Include="public\novnc\vendor\browser-es-module-loader\src\browser-es-module-loader.js" />
167
+ <Compile Include="public\novnc\vendor\pako\lib\utils\common.js" />
168
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\adler32.js" />
169
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\constants.js" />
170
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\crc32.js" />
171
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\deflate.js" />
172
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\gzheader.js" />
173
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\inffast.js" />
174
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\inflate.js" />
175
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\inftrees.js" />
176
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\messages.js" />
177
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\trees.js" />
178
+ <Compile Include="public\novnc\vendor\pako\lib\zlib\zstream.js" />
179
+ <Compile Include="public\novnc\vendor\promise.js" />
180
<Compile Include="public\scripts\agent-redir-rtc-0.1.0.js" />
181
<Compile Include="swarmserver.js" />
182
<Compile Include="multiserver.js" />
@@ -405,6 +462,60 @@
462
<Content Include="public\images\mapmarker.png" />
463
<Content Include="public\images\meshicon50.png" />
464
<Content Include="public\images\trash.png" />
465
+ <Content Include="public\mstsc\css\bootstrap.min.css" />
466
+ <Content Include="public\mstsc\css\signin.css" />
467
+ <Content Include="public\mstsc\index.html" />
468
+ <Content Include="public\mstsc\keymap.html" />
469
+ <Content Include="public\mstsc\LICENSE" />
470
+ <Content Include="public\novnc\app\images\alt.svg" />
471
+ <Content Include="public\novnc\app\images\clipboard.svg" />
472
+ <Content Include="public\novnc\app\images\connect.svg" />
473
+ <Content Include="public\novnc\app\images\ctrl.svg" />
474
+ <Content Include="public\novnc\app\images\ctrlaltdel.svg" />
475
+ <Content Include="public\novnc\app\images\disconnect.svg" />
476
+ <Content Include="public\novnc\app\images\drag.svg" />
477
+ <Content Include="public\novnc\app\images\error.svg" />
478
+ <Content Include="public\novnc\app\images\esc.svg" />
479
+ <Content Include="public\novnc\app\images\expander.svg" />
480
+ <Content Include="public\novnc\app\images\fullscreen.svg" />
481
+ <Content Include="public\novnc\app\images\handle.svg" />
482
+ <Content Include="public\novnc\app\images\handle_bg.svg" />
483
+ <Content Include="public\novnc\app\images\info.svg" />
484
+ <Content Include="public\novnc\app\images\keyboard.svg" />
485
+ <Content Include="public\novnc\app\images\mouse_left.svg" />
486
+ <Content Include="public\novnc\app\images\mouse_middle.svg" />
487
+ <Content Include="public\novnc\app\images\mouse_none.svg" />
488
+ <Content Include="public\novnc\app\images\mouse_right.svg" />
489
+ <Content Include="public\novnc\app\images\power.svg" />
490
+ <Content Include="public\novnc\app\images\settings.svg" />
491
+ <Content Include="public\novnc\app\images\tab.svg" />
492
+ <Content Include="public\novnc\app\images\toggleextrakeys.svg" />
493
+ <Content Include="public\novnc\app\images\warning.svg" />
494
+ <Content Include="public\novnc\app\images\windows.svg" />
495
+ <Content Include="public\novnc\app\locale\cs.json" />
496
+ <Content Include="public\novnc\app\locale\de.json" />
497
+ <Content Include="public\novnc\app\locale\el.json" />
498
+ <Content Include="public\novnc\app\locale\es.json" />
499
+ <Content Include="public\novnc\app\locale\ko.json" />
500
+ <Content Include="public\novnc\app\locale\nl.json" />
501
+ <Content Include="public\novnc\app\locale\pl.json" />
502
+ <Content Include="public\novnc\app\locale\ru.json" />
503
+ <Content Include="public\novnc\app\locale\sv.json" />
504
+ <Content Include="public\novnc\app\locale\tr.json" />
505
+ <Content Include="public\novnc\app\locale\zh_CN.json" />
506
+ <Content Include="public\novnc\app\locale\zh_TW.json" />
507
+ <Content Include="public\novnc\app\sounds\bell.mp3" />
508
+ <Content Include="public\novnc\app\sounds\bell.oga" />
509
+ <Content Include="public\novnc\app\sounds\CREDITS" />
510
+ <Content Include="public\novnc\app\styles\base.css" />
511
+ <Content Include="public\novnc\app\styles\Orbitron700.ttf" />
512
+ <Content Include="public\novnc\app\styles\Orbitron700.woff" />
513
+ <Content Include="public\novnc\LICENSE.txt" />
514
+ <Content Include="public\novnc\vendor\browser-es-module-loader\dist\browser-es-module-loader.js.map" />
515
+ <Content Include="public\novnc\vendor\browser-es-module-loader\README.md" />
516
+ <Content Include="public\novnc\vendor\pako\LICENSE" />
517
+ <Content Include="public\novnc\vendor\pako\README.md" />
518
+ <Content Include="public\novnc\vnc.html" />
519
<Content Include="public\scriptblocks.txt" />
520
<Content Include="public\sounds\chimes.mp3" />
521
<Content Include="public\styles\font-awesome\css\font-awesome.min.css" />
@@ -483,6 +594,27 @@
594
<Folder Include="public\email\translations\" />
595
<Folder Include="public\images-isdu" />
596
<Folder Include="public\images\" />
597
+ <Folder Include="public\mstsc\" />
598
+ <Folder Include="public\mstsc\css\" />
599
+ <Folder Include="public\mstsc\js\" />
600
+ <Folder Include="public\novnc\" />
601
+ <Folder Include="public\novnc\app\" />
602
+ <Folder Include="public\novnc\app\images\" />
603
+ <Folder Include="public\novnc\app\locale\" />
604
+ <Folder Include="public\novnc\app\sounds\" />
605
+ <Folder Include="public\novnc\app\styles\" />
606
+ <Folder Include="public\novnc\core\" />
607
+ <Folder Include="public\novnc\core\decoders\" />
608
+ <Folder Include="public\novnc\core\input\" />
609
+ <Folder Include="public\novnc\core\util\" />
610
+ <Folder Include="public\novnc\vendor\" />
611
+ <Folder Include="public\novnc\vendor\browser-es-module-loader\" />
612
+ <Folder Include="public\novnc\vendor\browser-es-module-loader\dist\" />
613
+ <Folder Include="public\novnc\vendor\browser-es-module-loader\src\" />
614
+ <Folder Include="public\novnc\vendor\pako\" />
615
+ <Folder Include="public\novnc\vendor\pako\lib\" />
616
+ <Folder Include="public\novnc\vendor\pako\lib\utils\" />
617
+ <Folder Include="public\novnc\vendor\pako\lib\zlib\" />
618
<Folder Include="public\scripts\" />
619
<Folder Include="public\sounds\" />
620
<Folder Include="public\styles\" />
meshcentral.js
+3
@@ -2551,6 +2551,7 @@ function mainStart() {
2551
var passport = null;
2552
var allsspi = true;
2553
var yubikey = false;
2554
+ var mstsc = false;
2555
var recordingIndex = false;
2556
var domainCount = 0;
2557
if (require('os').platform() == 'win32') { for (var i in config.domains) { domainCount++; if (config.domains[i].auth == 'sspi') { sspi = true; } else { allsspi = false; } } } else { allsspi = false; }
@@ -2558,6 +2559,7 @@ function mainStart() {
2559
for (var i in config.domains) {
2560
if (config.domains[i].yubikey != null) { yubikey = true; }
2561
if (config.domains[i].auth == 'ldap') { ldap = true; }
2562
+ if (config.domains[i].mstsc === true) { mstsc = true; }
2563
if ((typeof config.domains[i].authstrategies == 'object')) {
2564
if (passport == null) { passport = ['passport']; }
2565
if ((typeof config.domains[i].authstrategies.twitter == 'object') && (typeof config.domains[i].authstrategies.twitter.apikey == 'string') && (typeof config.domains[i].authstrategies.twitter.apisecret == 'string') && (passport.indexOf('passport-twitter') == -1)) { passport.push('passport-twitter'); }
@@ -2577,6 +2579,7 @@ function mainStart() {
2579
var modules = ['ws', 'cbor', 'nedb', 'https', 'yauzl', 'xmldom', 'ipcheck', 'express', 'archiver', 'multiparty', 'node-forge', 'express-ws', 'compression', 'body-parser', 'connect-redis', 'cookie-session', 'express-handlebars'];
2580
if (require('os').platform() == 'win32') { modules.push('node-windows'); if (sspi == true) { modules.push('node-sspi'); } } // Add Windows modules
2581
if (ldap == true) { modules.push('ldapauth-fork'); }
2582
+ if (mstsc == true) { modules.push('node-rdpjs-2'); }
2583
if (passport != null) { modules.push(...passport); }
2584
if (recordingIndex == true) { modules.push('image-size'); } // Need to get the remote desktop JPEG sizes to index the recodring file.
2585
if (config.letsencrypt != null) { if (nodeVersion < 8) { addServerWarning("Let's Encrypt support requires Node v8.x or higher.", !args.launch); } else { modules.push('acme-client'); } } // Add acme-client module
mstsc.js
new
+122
@@ -0,0 +1,122 @@
1
+/**
2
+* @description MeshCentral MSTSC relay
3
+* @author Ylian Saint-Hilaire & Bryan Roe
4
+* @copyright Intel Corporation 2018-2020
5
+* @license Apache-2.0
6
+* @version v0.0.1
7
+*/
8
+
9
+/*jslint node: true */
10
+/*jshint node: true */
11
+/*jshint strict:false */
12
+/*jshint -W097 */
13
+/*jshint esversion: 6 */
14
+"use strict";
15
+
16
+// Construct a MSTSC Relay object, called upon connection
17
+// This is a bit of a hack as we are going to run the RDP connection thru a loopback connection.
18
+// If the "node-rdpjs-2" module supported passing a socket, we would do something different.
19
+module.exports.CreateMstscRelay = function (parent, db, ws, req, args, domain, user) {
20
+ const Net = require('net');
21
+ const WebSocket = require('ws');
22
+
23
+ var obj = {};
24
+ obj.user = user;
25
+ obj.domain = domain;
26
+ obj.ws = ws;
27
+ obj.wsClient = null;
28
+ obj.tcpServer = null;
29
+ obj.tcpServerPort = 0;
30
+ obj.relaySocket = null;
31
+ obj.relayActive = false;
32
+ obj.infos = null;
33
+ var rdpClient = null;
34
+
35
+ // Disconnect this user
36
+ obj.close = function (arg) {
37
+ if ((arg == 1) || (arg == null)) { try { ws.close(); } catch (e) { console.log(e); } } // Soft close, close the websocket
38
+ if (arg == 2) { try { ws._socket._parent.end(); } catch (e) { console.log(e); } } // Hard close, close the TCP socket
39
+ if (obj.wsClient) { obj.wsClient.close(); obj.wsClient = null; }
40
+ if (obj.tcpServer) { obj.tcpServer.close(); obj.tcpServer = null; }
41
+ if (rdpClient) { rdpClient.close(); rdpClient = null; }
42
+ delete obj.user;
43
+ delete obj.domain;
44
+ delete obj.ws;
45
+ };
46
+
47
+ // Start the looppback server
48
+ function startTcpServer() {
49
+ obj.tcpServer = new Net.Server();
50
+ obj.tcpServer.listen(0, '127.0.0.1', function () { obj.tcpServerPort = obj.tcpServer.address().port; startRdp(obj.tcpServerPort); });
51
+ obj.tcpServer.on('connection', function (socket) {
52
+ if (obj.relaySocket != null) {
53
+ socket.close();
54
+ } else {
55
+ obj.relaySocket = socket;
56
+ obj.relaySocket.pause();
57
+ obj.relaySocket.on('data', function (chunk) { if (obj.relayActive == true) { obj.wsClient.send(chunk); } });
58
+ obj.relaySocket.on('end', function () { obj.close(0); });
59
+ obj.relaySocket.on('error', function (err) { obj.close(0); });
60
+
61
+ // TODO: Use correct URL with domain and use TLS only if needed.
62
+ obj.wsClient = new WebSocket('wss://127.0.0.1/meshrelay.ashx?auth=' + obj.infos.ip, { rejectUnauthorized: false });
63
+
64
+ obj.wsClient.on('open', function () { });
65
+ obj.wsClient.on('message', function (data) { if ((obj.relayActive == false) && (data == 'c')) { obj.relayActive = true; obj.relaySocket.resume(); } else { obj.relaySocket.write(data); } });
66
+ obj.wsClient.on('close', function () { obj.close(0); });
67
+ obj.tcpServer.close();
68
+ obj.tcpServer = null;
69
+ }
70
+ });
71
+ }
72
+
73
+ // Start the RDP client
74
+ function startRdp(port) {
75
+ rdpClient = require('node-rdpjs-2').createClient({
76
+ logLevel: 'ERROR',
77
+ domain: obj.infos.domain,
78
+ userName: obj.infos.username,
79
+ password: obj.infos.password,
80
+ enablePerf: true,
81
+ autoLogin: true,
82
+ screen: obj.infos.screen,
83
+ locale: obj.infos.locale
84
+ }).on('connect', function () {
85
+ send(['rdp-connect']);
86
+ }).on('bitmap', function (bitmap) {
87
+ send(['rdp-bitmap', bitmap]);
88
+ }).on('close', function () {
89
+ send(['rdp-close']);
90
+ }).on('error', function (err) {
91
+ send(['rdp-error', err]);
92
+ }).connect('127.0.0.1', obj.tcpServerPort);
93
+ }
94
+
95
+ // When data is received from the web socket
96
+ // RDP default port is 3389
97
+ ws.on('message', function (msg) {
98
+ msg = JSON.parse(msg);
99
+ switch (msg[0]) {
100
+ case 'infos': { obj.infos = msg[1]; startTcpServer(); break; }
101
+ case 'mouse': { if (rdpClient) { rdpClient.sendPointerEvent(msg[1], msg[2], msg[3], msg[4]); } break; }
102
+ case 'wheel': { if (rdpClient) { rdpClient.sendWheelEvent(msg[1], msg[2], msg[3], msg[4]); } break; }
103
+ case 'scancode': { if (rdpClient) { rdpClient.sendKeyEventScancode(msg[1], msg[2]); } break; }
104
+ case 'unicode': { if (rdpClient) { rdpClient.sendKeyEventUnicode(msg[1], msg[2]); } break; }
105
+ case 'disconnect': { obj.close(0); break; }
106
+ }
107
+ });
108
+
109
+ // If error, do nothing
110
+ ws.on('error', function (err) { console.log(err); obj.close(0); });
111
+
112
+ // If the web socket is closed
113
+ ws.on('close', function (req) { obj.close(0); });
114
+
115
+ // Send an object
116
+ function send(obj) { try { ws.send(JSON.stringify(obj)); } catch (ex) { } }
117
+
118
+ // We are all set, start receiving data
119
+ ws._socket.resume();
120
+
121
+ return obj;
122
+};
\ No newline at end of file
public/mstsc/LICENSE
new
+674
@@ -0,0 +1,674 @@
1
+GNU GENERAL PUBLIC LICENSE
2
+ Version 3, 29 June 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+ Preamble
9
+
10
+ The GNU General Public License is a free, copyleft license for
11
+software and other kinds of works.
12
+
13
+ The licenses for most software and other practical works are designed
14
+to take away your freedom to share and change the works. By contrast,
15
+the GNU General Public License is intended to guarantee your freedom to
16
+share and change all versions of a program--to make sure it remains free
17
+software for all its users. We, the Free Software Foundation, use the
18
+GNU General Public License for most of our software; it applies also to
19
+any other work released this way by its authors. You can apply it to
20
+your programs, too.
21
+
22
+ When we speak of free software, we are referring to freedom, not
23
+price. Our General Public Licenses are designed to make sure that you
24
+have the freedom to distribute copies of free software (and charge for
25
+them if you wish), that you receive source code or can get it if you
26
+want it, that you can change the software or use pieces of it in new
27
+free programs, and that you know you can do these things.
28
+
29
+ To protect your rights, we need to prevent others from denying you
30
+these rights or asking you to surrender the rights. Therefore, you have
31
+certain responsibilities if you distribute copies of the software, or if
32
+you modify it: responsibilities to respect the freedom of others.
33
+
34
+ For example, if you distribute copies of such a program, whether
35
+gratis or for a fee, you must pass on to the recipients the same
36
+freedoms that you received. You must make sure that they, too, receive
37
+or can get the source code. And you must show them these terms so they
38
+know their rights.
39
+
40
+ Developers that use the GNU GPL protect your rights with two steps:
41
+(1) assert copyright on the software, and (2) offer you this License
42
+giving you legal permission to copy, distribute and/or modify it.
43
+
44
+ For the developers' and authors' protection, the GPL clearly explains
45
+that there is no warranty for this free software. For both users' and
46
+authors' sake, the GPL requires that modified versions be marked as
47
+changed, so that their problems will not be attributed erroneously to
48
+authors of previous versions.
49
+
50
+ Some devices are designed to deny users access to install or run
51
+modified versions of the software inside them, although the manufacturer
52
+can do so. This is fundamentally incompatible with the aim of
53
+protecting users' freedom to change the software. The systematic
54
+pattern of such abuse occurs in the area of products for individuals to
55
+use, which is precisely where it is most unacceptable. Therefore, we
56
+have designed this version of the GPL to prohibit the practice for those
57
+products. If such problems arise substantially in other domains, we
58
+stand ready to extend this provision to those domains in future versions
59
+of the GPL, as needed to protect the freedom of users.
60
+
61
+ Finally, every program is threatened constantly by software patents.
62
+States should not allow patents to restrict development and use of
63
+software on general-purpose computers, but in those that do, we wish to
64
+avoid the special danger that patents applied to a free program could
65
+make it effectively proprietary. To prevent this, the GPL assures that
66
+patents cannot be used to render the program non-free.
67
+
68
+ The precise terms and conditions for copying, distribution and
69
+modification follow.
70
+
71
+ TERMS AND CONDITIONS
72
+
73
+ 0. Definitions.
74
+
75
+ "This License" refers to version 3 of the GNU General Public License.
76
+
77
+ "Copyright" also means copyright-like laws that apply to other kinds of
78
+works, such as semiconductor masks.
79
+
80
+ "The Program" refers to any copyrightable work licensed under this
81
+License. Each licensee is addressed as "you". "Licensees" and
82
+"recipients" may be individuals or organizations.
83
+
84
+ To "modify" a work means to copy from or adapt all or part of the work
85
+in a fashion requiring copyright permission, other than the making of an
86
+exact copy. The resulting work is called a "modified version" of the
87
+earlier work or a work "based on" the earlier work.
88
+
89
+ A "covered work" means either the unmodified Program or a work based
90
+on the Program.
91
+
92
+ To "propagate" a work means to do anything with it that, without
93
+permission, would make you directly or secondarily liable for
94
+infringement under applicable copyright law, except executing it on a
95
+computer or modifying a private copy. Propagation includes copying,
96
+distribution (with or without modification), making available to the
97
+public, and in some countries other activities as well.
98
+
99
+ To "convey" a work means any kind of propagation that enables other
100
+parties to make or receive copies. Mere interaction with a user through
101
+a computer network, with no transfer of a copy, is not conveying.
102
+
103
+ An interactive user interface displays "Appropriate Legal Notices"
104
+to the extent that it includes a convenient and prominently visible
105
+feature that (1) displays an appropriate copyright notice, and (2)
106
+tells the user that there is no warranty for the work (except to the
107
+extent that warranties are provided), that licensees may convey the
108
+work under this License, and how to view a copy of this License. If
109
+the interface presents a list of user commands or options, such as a
110
+menu, a prominent item in the list meets this criterion.
111
+
112
+ 1. Source Code.
113
+
114
+ The "source code" for a work means the preferred form of the work
115
+for making modifications to it. "Object code" means any non-source
116
+form of a work.
117
+
118
+ A "Standard Interface" means an interface that either is an official
119
+standard defined by a recognized standards body, or, in the case of
120
+interfaces specified for a particular programming language, one that
121
+is widely used among developers working in that language.
122
+
123
+ The "System Libraries" of an executable work include anything, other
124
+than the work as a whole, that (a) is included in the normal form of
125
+packaging a Major Component, but which is not part of that Major
126
+Component, and (b) serves only to enable use of the work with that
127
+Major Component, or to implement a Standard Interface for which an
128
+implementation is available to the public in source code form. A
129
+"Major Component", in this context, means a major essential component
130
+(kernel, window system, and so on) of the specific operating system
131
+(if any) on which the executable work runs, or a compiler used to
132
+produce the work, or an object code interpreter used to run it.
133
+
134
+ The "Corresponding Source" for a work in object code form means all
135
+the source code needed to generate, install, and (for an executable
136
+work) run the object code and to modify the work, including scripts to
137
+control those activities. However, it does not include the work's
138
+System Libraries, or general-purpose tools or generally available free
139
+programs which are used unmodified in performing those activities but
140
+which are not part of the work. For example, Corresponding Source
141
+includes interface definition files associated with source files for
142
+the work, and the source code for shared libraries and dynamically
143
+linked subprograms that the work is specifically designed to require,
144
+such as by intimate data communication or control flow between those
145
+subprograms and other parts of the work.
146
+
147
+ The Corresponding Source need not include anything that users
148
+can regenerate automatically from other parts of the Corresponding
149
+Source.
150
+
151
+ The Corresponding Source for a work in source code form is that
152
+same work.
153
+
154
+ 2. Basic Permissions.
155
+
156
+ All rights granted under this License are granted for the term of
157
+copyright on the Program, and are irrevocable provided the stated
158
+conditions are met. This License explicitly affirms your unlimited
159
+permission to run the unmodified Program. The output from running a
160
+covered work is covered by this License only if the output, given its
161
+content, constitutes a covered work. This License acknowledges your
162
+rights of fair use or other equivalent, as provided by copyright law.
163
+
164
+ You may make, run and propagate covered works that you do not
165
+convey, without conditions so long as your license otherwise remains
166
+in force. You may convey covered works to others for the sole purpose
167
+of having them make modifications exclusively for you, or provide you
168
+with facilities for running those works, provided that you comply with
169
+the terms of this License in conveying all material for which you do
170
+not control copyright. Those thus making or running the covered works
171
+for you must do so exclusively on your behalf, under your direction
172
+and control, on terms that prohibit them from making any copies of
173
+your copyrighted material outside their relationship with you.
174
+
175
+ Conveying under any other circumstances is permitted solely under
176
+the conditions stated below. Sublicensing is not allowed; section 10
177
+makes it unnecessary.
178
+
179
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
+
181
+ No covered work shall be deemed part of an effective technological
182
+measure under any applicable law fulfilling obligations under article
183
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
+similar laws prohibiting or restricting circumvention of such
185
+measures.
186
+
187
+ When you convey a covered work, you waive any legal power to forbid
188
+circumvention of technological measures to the extent such circumvention
189
+is effected by exercising rights under this License with respect to
190
+the covered work, and you disclaim any intention to limit operation or
191
+modification of the work as a means of enforcing, against the work's
192
+users, your or third parties' legal rights to forbid circumvention of
193
+technological measures.
194
+
195
+ 4. Conveying Verbatim Copies.
196
+
197
+ You may convey verbatim copies of the Program's source code as you
198
+receive it, in any medium, provided that you conspicuously and
199
+appropriately publish on each copy an appropriate copyright notice;
200
+keep intact all notices stating that this License and any
201
+non-permissive terms added in accord with section 7 apply to the code;
202
+keep intact all notices of the absence of any warranty; and give all
203
+recipients a copy of this License along with the Program.
204
+
205
+ You may charge any price or no price for each copy that you convey,
206
+and you may offer support or warranty protection for a fee.
207
+
208
+ 5. Conveying Modified Source Versions.
209
+
210
+ You may convey a work based on the Program, or the modifications to
211
+produce it from the Program, in the form of source code under the
212
+terms of section 4, provided that you also meet all of these conditions:
213
+
214
+ a) The work must carry prominent notices stating that you modified
215
+ it, and giving a relevant date.
216
+
217
+ b) The work must carry prominent notices stating that it is
218
+ released under this License and any conditions added under section
219
+ 7. This requirement modifies the requirement in section 4 to
220
+ "keep intact all notices".
221
+
222
+ c) You must license the entire work, as a whole, under this
223
+ License to anyone who comes into possession of a copy. This
224
+ License will therefore apply, along with any applicable section 7
225
+ additional terms, to the whole of the work, and all its parts,
226
+ regardless of how they are packaged. This License gives no
227
+ permission to license the work in any other way, but it does not
228
+ invalidate such permission if you have separately received it.
229
+
230
+ d) If the work has interactive user interfaces, each must display
231
+ Appropriate Legal Notices; however, if the Program has interactive
232
+ interfaces that do not display Appropriate Legal Notices, your
233
+ work need not make them do so.
234
+
235
+ A compilation of a covered work with other separate and independent
236
+works, which are not by their nature extensions of the covered work,
237
+and which are not combined with it such as to form a larger program,
238
+in or on a volume of a storage or distribution medium, is called an
239
+"aggregate" if the compilation and its resulting copyright are not
240
+used to limit the access or legal rights of the compilation's users
241
+beyond what the individual works permit. Inclusion of a covered work
242
+in an aggregate does not cause this License to apply to the other
243
+parts of the aggregate.
244
+
245
+ 6. Conveying Non-Source Forms.
246
+
247
+ You may convey a covered work in object code form under the terms
248
+of sections 4 and 5, provided that you also convey the
249
+machine-readable Corresponding Source under the terms of this License,
250
+in one of these ways:
251
+
252
+ a) Convey the object code in, or embodied in, a physical product
253
+ (including a physical distribution medium), accompanied by the
254
+ Corresponding Source fixed on a durable physical medium
255
+ customarily used for software interchange.
256
+
257
+ b) Convey the object code in, or embodied in, a physical product
258
+ (including a physical distribution medium), accompanied by a
259
+ written offer, valid for at least three years and valid for as
260
+ long as you offer spare parts or customer support for that product
261
+ model, to give anyone who possesses the object code either (1) a
262
+ copy of the Corresponding Source for all the software in the
263
+ product that is covered by this License, on a durable physical
264
+ medium customarily used for software interchange, for a price no
265
+ more than your reasonable cost of physically performing this
266
+ conveying of source, or (2) access to copy the
267
+ Corresponding Source from a network server at no charge.
268
+
269
+ c) Convey individual copies of the object code with a copy of the
270
+ written offer to provide the Corresponding Source. This
271
+ alternative is allowed only occasionally and noncommercially, and
272
+ only if you received the object code with such an offer, in accord
273
+ with subsection 6b.
274
+
275
+ d) Convey the object code by offering access from a designated
276
+ place (gratis or for a charge), and offer equivalent access to the
277
+ Corresponding Source in the same way through the same place at no
278
+ further charge. You need not require recipients to copy the
279
+ Corresponding Source along with the object code. If the place to
280
+ copy the object code is a network server, the Corresponding Source
281
+ may be on a different server (operated by you or a third party)
282
+ that supports equivalent copying facilities, provided you maintain
283
+ clear directions next to the object code saying where to find the
284
+ Corresponding Source. Regardless of what server hosts the
285
+ Corresponding Source, you remain obligated to ensure that it is
286
+ available for as long as needed to satisfy these requirements.
287
+
288
+ e) Convey the object code using peer-to-peer transmission, provided
289
+ you inform other peers where the object code and Corresponding
290
+ Source of the work are being offered to the general public at no
291
+ charge under subsection 6d.
292
+
293
+ A separable portion of the object code, whose source code is excluded
294
+from the Corresponding Source as a System Library, need not be
295
+included in conveying the object code work.
296
+
297
+ A "User Product" is either (1) a "consumer product", which means any
298
+tangible personal property which is normally used for personal, family,
299
+or household purposes, or (2) anything designed or sold for incorporation
300
+into a dwelling. In determining whether a product is a consumer product,
301
+doubtful cases shall be resolved in favor of coverage. For a particular
302
+product received by a particular user, "normally used" refers to a
303
+typical or common use of that class of product, regardless of the status
304
+of the particular user or of the way in which the particular user
305
+actually uses, or expects or is expected to use, the product. A product
306
+is a consumer product regardless of whether the product has substantial
307
+commercial, industrial or non-consumer uses, unless such uses represent
308
+the only significant mode of use of the product.
309
+
310
+ "Installation Information" for a User Product means any methods,
311
+procedures, authorization keys, or other information required to install
312
+and execute modified versions of a covered work in that User Product from
313
+a modified version of its Corresponding Source. The information must
314
+suffice to ensure that the continued functioning of the modified object
315
+code is in no case prevented or interfered with solely because
316
+modification has been made.
317
+
318
+ If you convey an object code work under this section in, or with, or
319
+specifically for use in, a User Product, and the conveying occurs as
320
+part of a transaction in which the right of possession and use of the
321
+User Product is transferred to the recipient in perpetuity or for a
322
+fixed term (regardless of how the transaction is characterized), the
323
+Corresponding Source conveyed under this section must be accompanied
324
+by the Installation Information. But this requirement does not apply
325
+if neither you nor any third party retains the ability to install
326
+modified object code on the User Product (for example, the work has
327
+been installed in ROM).
328
+
329
+ The requirement to provide Installation Information does not include a
330
+requirement to continue to provide support service, warranty, or updates
331
+for a work that has been modified or installed by the recipient, or for
332
+the User Product in which it has been modified or installed. Access to a
333
+network may be denied when the modification itself materially and
334
+adversely affects the operation of the network or violates the rules and
335
+protocols for communication across the network.
336
+
337
+ Corresponding Source conveyed, and Installation Information provided,
338
+in accord with this section must be in a format that is publicly
339
+documented (and with an implementation available to the public in
340
+source code form), and must require no special password or key for
341
+unpacking, reading or copying.
342
+
343
+ 7. Additional Terms.
344
+
345
+ "Additional permissions" are terms that supplement the terms of this
346
+License by making exceptions from one or more of its conditions.
347
+Additional permissions that are applicable to the entire Program shall
348
+be treated as though they were included in this License, to the extent
349
+that they are valid under applicable law. If additional permissions
350
+apply only to part of the Program, that part may be used separately
351
+under those permissions, but the entire Program remains governed by
352
+this License without regard to the additional permissions.
353
+
354
+ When you convey a copy of a covered work, you may at your option
355
+remove any additional permissions from that copy, or from any part of
356
+it. (Additional permissions may be written to require their own
357
+removal in certain cases when you modify the work.) You may place
358
+additional permissions on material, added by you to a covered work,
359
+for which you have or can give appropriate copyright permission.
360
+
361
+ Notwithstanding any other provision of this License, for material you
362
+add to a covered work, you may (if authorized by the copyright holders of
363
+that material) supplement the terms of this License with terms:
364
+
365
+ a) Disclaiming warranty or limiting liability differently from the
366
+ terms of sections 15 and 16 of this License; or
367
+
368
+ b) Requiring preservation of specified reasonable legal notices or
369
+ author attributions in that material or in the Appropriate Legal
370
+ Notices displayed by works containing it; or
371
+
372
+ c) Prohibiting misrepresentation of the origin of that material, or
373
+ requiring that modified versions of such material be marked in
374
+ reasonable ways as different from the original version; or
375
+
376
+ d) Limiting the use for publicity purposes of names of licensors or
377
+ authors of the material; or
378
+
379
+ e) Declining to grant rights under trademark law for use of some
380
+ trade names, trademarks, or service marks; or
381
+
382
+ f) Requiring indemnification of licensors and authors of that
383
+ material by anyone who conveys the material (or modified versions of
384
+ it) with contractual assumptions of liability to the recipient, for
385
+ any liability that these contractual assumptions directly impose on
386
+ those licensors and authors.
387
+
388
+ All other non-permissive additional terms are considered "further
389
+restrictions" within the meaning of section 10. If the Program as you
390
+received it, or any part of it, contains a notice stating that it is
391
+governed by this License along with a term that is a further
392
+restriction, you may remove that term. If a license document contains
393
+a further restriction but permits relicensing or conveying under this
394
+License, you may add to a covered work material governed by the terms
395
+of that license document, provided that the further restriction does
396
+not survive such relicensing or conveying.
397
+
398
+ If you add terms to a covered work in accord with this section, you
399
+must place, in the relevant source files, a statement of the
400
+additional terms that apply to those files, or a notice indicating
401
+where to find the applicable terms.
402
+
403
+ Additional terms, permissive or non-permissive, may be stated in the
404
+form of a separately written license, or stated as exceptions;
405
+the above requirements apply either way.
406
+
407
+ 8. Termination.
408
+
409
+ You may not propagate or modify a covered work except as expressly
410
+provided under this License. Any attempt otherwise to propagate or
411
+modify it is void, and will automatically terminate your rights under
412
+this License (including any patent licenses granted under the third
413
+paragraph of section 11).
414
+
415
+ However, if you cease all violation of this License, then your
416
+license from a particular copyright holder is reinstated (a)
417
+provisionally, unless and until the copyright holder explicitly and
418
+finally terminates your license, and (b) permanently, if the copyright
419
+holder fails to notify you of the violation by some reasonable means
420
+prior to 60 days after the cessation.
421
+
422
+ Moreover, your license from a particular copyright holder is
423
+reinstated permanently if the copyright holder notifies you of the
424
+violation by some reasonable means, this is the first time you have
425
+received notice of violation of this License (for any work) from that
426
+copyright holder, and you cure the violation prior to 30 days after
427
+your receipt of the notice.
428
+
429
+ Termination of your rights under this section does not terminate the
430
+licenses of parties who have received copies or rights from you under
431
+this License. If your rights have been terminated and not permanently
432
+reinstated, you do not qualify to receive new licenses for the same
433
+material under section 10.
434
+
435
+ 9. Acceptance Not Required for Having Copies.
436
+
437
+ You are not required to accept this License in order to receive or
438
+run a copy of the Program. Ancillary propagation of a covered work
439
+occurring solely as a consequence of using peer-to-peer transmission
440
+to receive a copy likewise does not require acceptance. However,
441
+nothing other than this License grants you permission to propagate or
442
+modify any covered work. These actions infringe copyright if you do
443
+not accept this License. Therefore, by modifying or propagating a
444
+covered work, you indicate your acceptance of this License to do so.
445
+
446
+ 10. Automatic Licensing of Downstream Recipients.
447
+
448
+ Each time you convey a covered work, the recipient automatically
449
+receives a license from the original licensors, to run, modify and
450
+propagate that work, subject to this License. You are not responsible
451
+for enforcing compliance by third parties with this License.
452
+
453
+ An "entity transaction" is a transaction transferring control of an
454
+organization, or substantially all assets of one, or subdividing an
455
+organization, or merging organizations. If propagation of a covered
456
+work results from an entity transaction, each party to that
457
+transaction who receives a copy of the work also receives whatever
458
+licenses to the work the party's predecessor in interest had or could
459
+give under the previous paragraph, plus a right to possession of the
460
+Corresponding Source of the work from the predecessor in interest, if
461
+the predecessor has it or can get it with reasonable efforts.
462
+
463
+ You may not impose any further restrictions on the exercise of the
464
+rights granted or affirmed under this License. For example, you may
465
+not impose a license fee, royalty, or other charge for exercise of
466
+rights granted under this License, and you may not initiate litigation
467
+(including a cross-claim or counterclaim in a lawsuit) alleging that
468
+any patent claim is infringed by making, using, selling, offering for
469
+sale, or importing the Program or any portion of it.
470
+
471
+ 11. Patents.
472
+
473
+ A "contributor" is a copyright holder who authorizes use under this
474
+License of the Program or a work on which the Program is based. The
475
+work thus licensed is called the contributor's "contributor version".
476
+
477
+ A contributor's "essential patent claims" are all patent claims
478
+owned or controlled by the contributor, whether already acquired or
479
+hereafter acquired, that would be infringed by some manner, permitted
480
+by this License, of making, using, or selling its contributor version,
481
+but do not include claims that would be infringed only as a
482
+consequence of further modification of the contributor version. For
483
+purposes of this definition, "control" includes the right to grant
484
+patent sublicenses in a manner consistent with the requirements of
485
+this License.
486
+
487
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
488
+patent license under the contributor's essential patent claims, to
489
+make, use, sell, offer for sale, import and otherwise run, modify and
490
+propagate the contents of its contributor version.
491
+
492
+ In the following three paragraphs, a "patent license" is any express
493
+agreement or commitment, however denominated, not to enforce a patent
494
+(such as an express permission to practice a patent or covenant not to
495
+sue for patent infringement). To "grant" such a patent license to a
496
+party means to make such an agreement or commitment not to enforce a
497
+patent against the party.
498
+
499
+ If you convey a covered work, knowingly relying on a patent license,
500
+and the Corresponding Source of the work is not available for anyone
501
+to copy, free of charge and under the terms of this License, through a
502
+publicly available network server or other readily accessible means,
503
+then you must either (1) cause the Corresponding Source to be so
504
+available, or (2) arrange to deprive yourself of the benefit of the
505
+patent license for this particular work, or (3) arrange, in a manner
506
+consistent with the requirements of this License, to extend the patent
507
+license to downstream recipients. "Knowingly relying" means you have
508
+actual knowledge that, but for the patent license, your conveying the
509
+covered work in a country, or your recipient's use of the covered work
510
+in a country, would infringe one or more identifiable patents in that
511
+country that you have reason to believe are valid.
512
+
513
+ If, pursuant to or in connection with a single transaction or
514
+arrangement, you convey, or propagate by procuring conveyance of, a
515
+covered work, and grant a patent license to some of the parties
516
+receiving the covered work authorizing them to use, propagate, modify
517
+or convey a specific copy of the covered work, then the patent license
518
+you grant is automatically extended to all recipients of the covered
519
+work and works based on it.
520
+
521
+ A patent license is "discriminatory" if it does not include within
522
+the scope of its coverage, prohibits the exercise of, or is
523
+conditioned on the non-exercise of one or more of the rights that are
524
+specifically granted under this License. You may not convey a covered
525
+work if you are a party to an arrangement with a third party that is
526
+in the business of distributing software, under which you make payment
527
+to the third party based on the extent of your activity of conveying
528
+the work, and under which the third party grants, to any of the
529
+parties who would receive the covered work from you, a discriminatory
530
+patent license (a) in connection with copies of the covered work
531
+conveyed by you (or copies made from those copies), or (b) primarily
532
+for and in connection with specific products or compilations that
533
+contain the covered work, unless you entered into that arrangement,
534
+or that patent license was granted, prior to 28 March 2007.
535
+
536
+ Nothing in this License shall be construed as excluding or limiting
537
+any implied license or other defenses to infringement that may
538
+otherwise be available to you under applicable patent law.
539
+
540
+ 12. No Surrender of Others' Freedom.
541
+
542
+ If conditions are imposed on you (whether by court order, agreement or
543
+otherwise) that contradict the conditions of this License, they do not
544
+excuse you from the conditions of this License. If you cannot convey a
545
+covered work so as to satisfy simultaneously your obligations under this
546
+License and any other pertinent obligations, then as a consequence you may
547
+not convey it at all. For example, if you agree to terms that obligate you
548
+to collect a royalty for further conveying from those to whom you convey
549
+the Program, the only way you could satisfy both those terms and this
550
+License would be to refrain entirely from conveying the Program.
551
+
552
+ 13. Use with the GNU Affero General Public License.
553
+
554
+ Notwithstanding any other provision of this License, you have
555
+permission to link or combine any covered work with a work licensed
556
+under version 3 of the GNU Affero General Public License into a single
557
+combined work, and to convey the resulting work. The terms of this
558
+License will continue to apply to the part which is the covered work,
559
+but the special requirements of the GNU Affero General Public License,
560
+section 13, concerning interaction through a network will apply to the
561
+combination as such.
562
+
563
+ 14. Revised Versions of this License.
564
+
565
+ The Free Software Foundation may publish revised and/or new versions of
566
+the GNU General Public License from time to time. Such new versions will
567
+be similar in spirit to the present version, but may differ in detail to
568
+address new problems or concerns.
569
+
570
+ Each version is given a distinguishing version number. If the
571
+Program specifies that a certain numbered version of the GNU General
572
+Public License "or any later version" applies to it, you have the
573
+option of following the terms and conditions either of that numbered
574
+version or of any later version published by the Free Software
575
+Foundation. If the Program does not specify a version number of the
576
+GNU General Public License, you may choose any version ever published
577
+by the Free Software Foundation.
578
+
579
+ If the Program specifies that a proxy can decide which future
580
+versions of the GNU General Public License can be used, that proxy's
581
+public statement of acceptance of a version permanently authorizes you
582
+to choose that version for the Program.
583
+
584
+ Later license versions may give you additional or different
585
+permissions. However, no additional obligations are imposed on any
586
+author or copyright holder as a result of your choosing to follow a
587
+later version.
588
+
589
+ 15. Disclaimer of Warranty.
590
+
591
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
+
600
+ 16. Limitation of Liability.
601
+
602
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
+SUCH DAMAGES.
611
+
612
+ 17. Interpretation of Sections 15 and 16.
613
+
614
+ If the disclaimer of warranty and limitation of liability provided
615
+above cannot be given local legal effect according to their terms,
616
+reviewing courts shall apply local law that most closely approximates
617
+an absolute waiver of all civil liability in connection with the
618
+Program, unless a warranty or assumption of liability accompanies a
619
+copy of the Program in return for a fee.
620
+
621
+ END OF TERMS AND CONDITIONS
622
+
623
+ How to Apply These Terms to Your New Programs
624
+
625
+ If you develop a new program, and you want it to be of the greatest
626
+possible use to the public, the best way to achieve this is to make it
627
+free software which everyone can redistribute and change under these terms.
628
+
629
+ To do so, attach the following notices to the program. It is safest
630
+to attach them to the start of each source file to most effectively
631
+state the exclusion of warranty; and each file should have at least
632
+the "copyright" line and a pointer to where the full notice is found.
633
+
634
+ {one line to give the program's name and a brief idea of what it does.}
635
+ Copyright (C) {year} {name of author}
636
+
637
+ This program is free software: you can redistribute it and/or modify
638
+ it under the terms of the GNU General Public License as published by
639
+ the Free Software Foundation, either version 3 of the License, or
640
+ (at your option) any later version.
641
+
642
+ This program is distributed in the hope that it will be useful,
643
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
644
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
+ GNU General Public License for more details.
646
+
647
+ You should have received a copy of the GNU General Public License
648
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
649
+
650
+Also add information on how to contact you by electronic and paper mail.
651
+
652
+ If the program does terminal interaction, make it output a short
653
+notice like this when it starts in an interactive mode:
654
+
655
+ {project} Copyright (C) {year} {fullname}
656
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
+ This is free software, and you are welcome to redistribute it
658
+ under certain conditions; type `show c' for details.
659
+
660
+The hypothetical commands `show w' and `show c' should show the appropriate
661
+parts of the General Public License. Of course, your program's commands
662
+might be different; for a GUI interface, you would use an "about box".
663
+
664
+ You should also get your employer (if you work as a programmer) or school,
665
+if any, to sign a "copyright disclaimer" for the program, if necessary.
666
+For more information on this, and how to apply and follow the GNU GPL, see
667
+<http://www.gnu.org/licenses/>.
668
+
669
+ The GNU General Public License does not permit incorporating your program
670
+into proprietary programs. If your program is a subroutine library, you
671
+may consider it more useful to permit linking proprietary applications with
672
+the library. If this is what you want to do, use the GNU Lesser General
673
+Public License instead of this License. But first, please read
674
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
public/mstsc/css/bootstrap.min.css
new
+7271
@@ -0,0 +1,7271 @@
1
+/*!
2
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{
6
+ font-family:sans-serif;
7
+ -webkit-text-size-adjust:100%;
8
+ -ms-text-size-adjust:100%
9
+}
10
+
11
+body{
12
+ margin:0
13
+}
14
+
15
+article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{
16
+ display:block
17
+}
18
+
19
+audio,canvas,progress,video{
20
+ display:inline-block;
21
+ vertical-align:baseline
22
+}
23
+
24
+audio:not([controls]){
25
+ display:none;
26
+ height:0
27
+}
28
+
29
+[hidden],template{
30
+ display:none
31
+}
32
+
33
+a{
34
+ background-color:transparent
35
+}
36
+
37
+a:active,a:hover{
38
+ outline:0
39
+}
40
+
41
+abbr[title]{
42
+ border-bottom:1px dotted
43
+}
44
+
45
+b,strong{
46
+ font-weight:700
47
+}
48
+
49
+dfn{
50
+ font-style:italic
51
+}
52
+
53
+h1{
54
+ margin:.67em 0;
55
+ font-size:2em
56
+}
57
+
58
+mark{
59
+ color:#000;
60
+ background:#ff0
61
+}
62
+
63
+small{
64
+ font-size:80%
65
+}
66
+
67
+sub,sup{
68
+ position:relative;
69
+ font-size:75%;
70
+ line-height:0;
71
+ vertical-align:baseline
72
+}
73
+
74
+sup{
75
+ top:-.5em
76
+}
77
+
78
+sub{
79
+ bottom:-.25em
80
+}
81
+
82
+img{
83
+ border:0
84
+}
85
+
86
+svg:not(:root){
87
+ overflow:hidden
88
+}
89
+
90
+figure{
91
+ margin:1em 40px
92
+}
93
+
94
+hr{
95
+ height:0;
96
+ -webkit-box-sizing:content-box;
97
+ -moz-box-sizing:content-box;
98
+ box-sizing:content-box
99
+}
100
+
101
+pre{
102
+ overflow:auto
103
+}
104
+
105
+code,kbd,pre,samp{
106
+ font-family:monospace,monospace;
107
+ font-size:1em
108
+}
109
+
110
+button,input,optgroup,select,textarea{
111
+ margin:0;
112
+ font:inherit;
113
+ color:inherit
114
+}
115
+
116
+button{
117
+ overflow:visible
118
+}
119
+
120
+button,select{
121
+ text-transform:none
122
+}
123
+
124
+button,html input[type=button],input[type=reset],input[type=submit]{
125
+ -webkit-appearance:button;
126
+ cursor:pointer
127
+}
128
+
129
+button[disabled],html input[disabled]{
130
+ cursor:default
131
+}
132
+
133
+button::-moz-focus-inner,input::-moz-focus-inner{
134
+ padding:0;
135
+ border:0
136
+}
137
+
138
+input{
139
+ line-height:normal
140
+}
141
+
142
+input[type=checkbox],input[type=radio]{
143
+ -webkit-box-sizing:border-box;
144
+ -moz-box-sizing:border-box;
145
+ box-sizing:border-box;
146
+ padding:0
147
+}
148
+
149
+input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{
150
+ height:auto
151
+}
152
+
153
+input[type=search]{
154
+ -webkit-box-sizing:content-box;
155
+ -moz-box-sizing:content-box;
156
+ box-sizing:content-box;
157
+ -webkit-appearance:textfield
158
+}
159
+
160
+input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{
161
+ -webkit-appearance:none
162
+}
163
+
164
+fieldset{
165
+ padding:.35em .625em .75em;
166
+ margin:0 2px;
167
+ border:1px solid silver
168
+}
169
+
170
+legend{
171
+ padding:0;
172
+ border:0
173
+}
174
+
175
+textarea{
176
+ overflow:auto
177
+}
178
+
179
+optgroup{
180
+ font-weight:700
181
+}
182
+
183
+table{
184
+ border-spacing:0;
185
+ border-collapse:collapse
186
+}
187
+
188
+td,th{
189
+ padding:0
190
+}
191
+
192
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{
193
+ *,:after,:before{
194
+ color:#000!important;
195
+ text-shadow:none!important;
196
+ background:0 0!important;
197
+ -webkit-box-shadow:none!important;
198
+ box-shadow:none!important
199
+ }
200
+
201
+ a,a:visited{
202
+ text-decoration:underline
203
+ }
204
+
205
+ a[href]:after{
206
+ content:" (" attr(href) ")"
207
+ }
208
+
209
+ abbr[title]:after{
210
+ content:" (" attr(title) ")"
211
+ }
212
+
213
+ a[href^="javascript:"]:after,a[href^="#"]:after{
214
+ content:""
215
+ }
216
+
217
+ blockquote,pre{
218
+ border:1px solid #999;
219
+ page-break-inside:avoid
220
+ }
221
+
222
+ thead{
223
+ display:table-header-group
224
+ }
225
+
226
+ img,tr{
227
+ page-break-inside:avoid
228
+ }
229
+
230
+ img{
231
+ max-width:100%!important
232
+ }
233
+
234
+ h2,h3,p{
235
+ orphans:3;
236
+ widows:3
237
+ }
238
+
239
+ h2,h3{
240
+ page-break-after:avoid
241
+ }
242
+
243
+ .navbar{
244
+ display:none
245
+ }
246
+
247
+ .btn>.caret,.dropup>.btn>.caret{
248
+ border-top-color:#000!important
249
+ }
250
+
251
+ .label{
252
+ border:1px solid #000
253
+ }
254
+
255
+ .table{
256
+ border-collapse:collapse!important
257
+ }
258
+
259
+ .table td,.table th{
260
+ background-color:#fff!important
261
+ }
262
+
263
+ .table-bordered td,.table-bordered th{
264
+ border:1px solid #ddd!important
265
+ }
266
+
267
+}
268
+
269
+@font-face{
270
+ font-family:'Glyphicons Halflings';
271
+ src:url(../fonts/glyphicons-halflings-regular.eot);
272
+ src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')
273
+}
274
+
275
+.glyphicon{
276
+ position:relative;
277
+ top:1px;
278
+ display:inline-block;
279
+ font-family:'Glyphicons Halflings';
280
+ font-style:normal;
281
+ font-weight:400;
282
+ line-height:1;
283
+ -webkit-font-smoothing:antialiased;
284
+ -moz-osx-font-smoothing:grayscale
285
+}
286
+
287
+.glyphicon-asterisk:before{
288
+ content:"\2a"
289
+}
290
+
291
+.glyphicon-plus:before{
292
+ content:"\2b"
293
+}
294
+
295
+.glyphicon-eur:before,.glyphicon-euro:before{
296
+ content:"\20ac"
297
+}
298
+
299
+.glyphicon-minus:before{
300
+ content:"\2212"
301
+}
302
+
303
+.glyphicon-cloud:before{
304
+ content:"\2601"
305
+}
306
+
307
+.glyphicon-envelope:before{
308
+ content:"\2709"
309
+}
310
+
311
+.glyphicon-pencil:before{
312
+ content:"\270f"
313
+}
314
+
315
+.glyphicon-glass:before{
316
+ content:"\e001"
317
+}
318
+
319
+.glyphicon-music:before{
320
+ content:"\e002"
321
+}
322
+
323
+.glyphicon-search:before{
324
+ content:"\e003"
325
+}
326
+
327
+.glyphicon-heart:before{
328
+ content:"\e005"
329
+}
330
+
331
+.glyphicon-star:before{
332
+ content:"\e006"
333
+}
334
+
335
+.glyphicon-star-empty:before{
336
+ content:"\e007"
337
+}
338
+
339
+.glyphicon-user:before{
340
+ content:"\e008"
341
+}
342
+
343
+.glyphicon-film:before{
344
+ content:"\e009"
345
+}
346
+
347
+.glyphicon-th-large:before{
348
+ content:"\e010"
349
+}
350
+
351
+.glyphicon-th:before{
352
+ content:"\e011"
353
+}
354
+
355
+.glyphicon-th-list:before{
356
+ content:"\e012"
357
+}
358
+
359
+.glyphicon-ok:before{
360
+ content:"\e013"
361
+}
362
+
363
+.glyphicon-remove:before{
364
+ content:"\e014"
365
+}
366
+
367
+.glyphicon-zoom-in:before{
368
+ content:"\e015"
369
+}
370
+
371
+.glyphicon-zoom-out:before{
372
+ content:"\e016"
373
+}
374
+
375
+.glyphicon-off:before{
376
+ content:"\e017"
377
+}
378
+
379
+.glyphicon-signal:before{
380
+ content:"\e018"
381
+}
382
+
383
+.glyphicon-cog:before{
384
+ content:"\e019"
385
+}
386
+
387
+.glyphicon-trash:before{
388
+ content:"\e020"
389
+}
390
+
391
+.glyphicon-home:before{
392
+ content:"\e021"
393
+}
394
+
395
+.glyphicon-file:before{
396
+ content:"\e022"
397
+}
398
+
399
+.glyphicon-time:before{
400
+ content:"\e023"
401
+}
402
+
403
+.glyphicon-road:before{
404
+ content:"\e024"
405
+}
406
+
407
+.glyphicon-download-alt:before{
408
+ content:"\e025"
409
+}
410
+
411
+.glyphicon-download:before{
412
+ content:"\e026"
413
+}
414
+
415
+.glyphicon-upload:before{
416
+ content:"\e027"
417
+}
418
+
419
+.glyphicon-inbox:before{
420
+ content:"\e028"
421
+}
422
+
423
+.glyphicon-play-circle:before{
424
+ content:"\e029"
425
+}
426
+
427
+.glyphicon-repeat:before{
428
+ content:"\e030"
429
+}
430
+
431
+.glyphicon-refresh:before{
432
+ content:"\e031"
433
+}
434
+
435
+.glyphicon-list-alt:before{
436
+ content:"\e032"
437
+}
438
+
439
+.glyphicon-lock:before{
440
+ content:"\e033"
441
+}
442
+
443
+.glyphicon-flag:before{
444
+ content:"\e034"
445
+}
446
+
447
+.glyphicon-headphones:before{
448
+ content:"\e035"
449
+}
450
+
451
+.glyphicon-volume-off:before{
452
+ content:"\e036"
453
+}
454
+
455
+.glyphicon-volume-down:before{
456
+ content:"\e037"
457
+}
458
+
459
+.glyphicon-volume-up:before{
460
+ content:"\e038"
461
+}
462
+
463
+.glyphicon-qrcode:before{
464
+ content:"\e039"
465
+}
466
+
467
+.glyphicon-barcode:before{
468
+ content:"\e040"
469
+}
470
+
471
+.glyphicon-tag:before{
472
+ content:"\e041"
473
+}
474
+
475
+.glyphicon-tags:before{
476
+ content:"\e042"
477
+}
478
+
479
+.glyphicon-book:before{
480
+ content:"\e043"
481
+}
482
+
483
+.glyphicon-bookmark:before{
484
+ content:"\e044"
485
+}
486
+
487
+.glyphicon-print:before{
488
+ content:"\e045"
489
+}
490
+
491
+.glyphicon-camera:before{
492
+ content:"\e046"
493
+}
494
+
495
+.glyphicon-font:before{
496
+ content:"\e047"
497
+}
498
+
499
+.glyphicon-bold:before{
500
+ content:"\e048"
501
+}
502
+
503
+.glyphicon-italic:before{
504
+ content:"\e049"
505
+}
506
+
507
+.glyphicon-text-height:before{
508
+ content:"\e050"
509
+}
510
+
511
+.glyphicon-text-width:before{
512
+ content:"\e051"
513
+}
514
+
515
+.glyphicon-align-left:before{
516
+ content:"\e052"
517
+}
518
+
519
+.glyphicon-align-center:before{
520
+ content:"\e053"
521
+}
522
+
523
+.glyphicon-align-right:before{
524
+ content:"\e054"
525
+}
526
+
527
+.glyphicon-align-justify:before{
528
+ content:"\e055"
529
+}
530
+
531
+.glyphicon-list:before{
532
+ content:"\e056"
533
+}
534
+
535
+.glyphicon-indent-left:before{
536
+ content:"\e057"
537
+}
538
+
539
+.glyphicon-indent-right:before{
540
+ content:"\e058"
541
+}
542
+
543
+.glyphicon-facetime-video:before{
544
+ content:"\e059"
545
+}
546
+
547
+.glyphicon-picture:before{
548
+ content:"\e060"
549
+}
550
+
551
+.glyphicon-map-marker:before{
552
+ content:"\e062"
553
+}
554
+
555
+.glyphicon-adjust:before{
556
+ content:"\e063"
557
+}
558
+
559
+.glyphicon-tint:before{
560
+ content:"\e064"
561
+}
562
+
563
+.glyphicon-edit:before{
564
+ content:"\e065"
565
+}
566
+
567
+.glyphicon-share:before{
568
+ content:"\e066"
569
+}
570
+
571
+.glyphicon-check:before{
572
+ content:"\e067"
573
+}
574
+
575
+.glyphicon-move:before{
576
+ content:"\e068"
577
+}
578
+
579
+.glyphicon-step-backward:before{
580
+ content:"\e069"
581
+}
582
+
583
+.glyphicon-fast-backward:before{
584
+ content:"\e070"
585
+}
586
+
587
+.glyphicon-backward:before{
588
+ content:"\e071"
589
+}
590
+
591
+.glyphicon-play:before{
592
+ content:"\e072"
593
+}
594
+
595
+.glyphicon-pause:before{
596
+ content:"\e073"
597
+}
598
+
599
+.glyphicon-stop:before{
600
+ content:"\e074"
601
+}
602
+
603
+.glyphicon-forward:before{
604
+ content:"\e075"
605
+}
606
+
607
+.glyphicon-fast-forward:before{
608
+ content:"\e076"
609
+}
610
+
611
+.glyphicon-step-forward:before{
612
+ content:"\e077"
613
+}
614
+
615
+.glyphicon-eject:before{
616
+ content:"\e078"
617
+}
618
+
619
+.glyphicon-chevron-left:before{
620
+ content:"\e079"
621
+}
622
+
623
+.glyphicon-chevron-right:before{
624
+ content:"\e080"
625
+}
626
+
627
+.glyphicon-plus-sign:before{
628
+ content:"\e081"
629
+}
630
+
631
+.glyphicon-minus-sign:before{
632
+ content:"\e082"
633
+}
634
+
635
+.glyphicon-remove-sign:before{
636
+ content:"\e083"
637
+}
638
+
639
+.glyphicon-ok-sign:before{
640
+ content:"\e084"
641
+}
642
+
643
+.glyphicon-question-sign:before{
644
+ content:"\e085"
645
+}
646
+
647
+.glyphicon-info-sign:before{
648
+ content:"\e086"
649
+}
650
+
651
+.glyphicon-screenshot:before{
652
+ content:"\e087"
653
+}
654
+
655
+.glyphicon-remove-circle:before{
656
+ content:"\e088"
657
+}
658
+
659
+.glyphicon-ok-circle:before{
660
+ content:"\e089"
661
+}
662
+
663
+.glyphicon-ban-circle:before{
664
+ content:"\e090"
665
+}
666
+
667
+.glyphicon-arrow-left:before{
668
+ content:"\e091"
669
+}
670
+
671
+.glyphicon-arrow-right:before{
672
+ content:"\e092"
673
+}
674
+
675
+.glyphicon-arrow-up:before{
676
+ content:"\e093"
677
+}
678
+
679
+.glyphicon-arrow-down:before{
680
+ content:"\e094"
681
+}
682
+
683
+.glyphicon-share-alt:before{
684
+ content:"\e095"
685
+}
686
+
687
+.glyphicon-resize-full:before{
688
+ content:"\e096"
689
+}
690
+
691
+.glyphicon-resize-small:before{
692
+ content:"\e097"
693
+}
694
+
695
+.glyphicon-exclamation-sign:before{
696
+ content:"\e101"
697
+}
698
+
699
+.glyphicon-gift:before{
700
+ content:"\e102"
701
+}
702
+
703
+.glyphicon-leaf:before{
704
+ content:"\e103"
705
+}
706
+
707
+.glyphicon-fire:before{
708
+ content:"\e104"
709
+}
710
+
711
+.glyphicon-eye-open:before{
712
+ content:"\e105"
713
+}
714
+
715
+.glyphicon-eye-close:before{
716
+ content:"\e106"
717
+}
718
+
719
+.glyphicon-warning-sign:before{
720
+ content:"\e107"
721
+}
722
+
723
+.glyphicon-plane:before{
724
+ content:"\e108"
725
+}
726
+
727
+.glyphicon-calendar:before{
728
+ content:"\e109"
729
+}
730
+
731
+.glyphicon-random:before{
732
+ content:"\e110"
733
+}
734
+
735
+.glyphicon-comment:before{
736
+ content:"\e111"
737
+}
738
+
739
+.glyphicon-magnet:before{
740
+ content:"\e112"
741
+}
742
+
743
+.glyphicon-chevron-up:before{
744
+ content:"\e113"
745
+}
746
+
747
+.glyphicon-chevron-down:before{
748
+ content:"\e114"
749
+}
750
+
751
+.glyphicon-retweet:before{
752
+ content:"\e115"
753
+}
754
+
755
+.glyphicon-shopping-cart:before{
756
+ content:"\e116"
757
+}
758
+
759
+.glyphicon-folder-close:before{
760
+ content:"\e117"
761
+}
762
+
763
+.glyphicon-folder-open:before{
764
+ content:"\e118"
765
+}
766
+
767
+.glyphicon-resize-vertical:before{
768
+ content:"\e119"
769
+}
770
+
771
+.glyphicon-resize-horizontal:before{
772
+ content:"\e120"
773
+}
774
+
775
+.glyphicon-hdd:before{
776
+ content:"\e121"
777
+}
778
+
779
+.glyphicon-bullhorn:before{
780
+ content:"\e122"
781
+}
782
+
783
+.glyphicon-bell:before{
784
+ content:"\e123"
785
+}
786
+
787
+.glyphicon-certificate:before{
788
+ content:"\e124"
789
+}
790
+
791
+.glyphicon-thumbs-up:before{
792
+ content:"\e125"
793
+}
794
+
795
+.glyphicon-thumbs-down:before{
796
+ content:"\e126"
797
+}
798
+
799
+.glyphicon-hand-right:before{
800
+ content:"\e127"
801
+}
802
+
803
+.glyphicon-hand-left:before{
804
+ content:"\e128"
805
+}
806
+
807
+.glyphicon-hand-up:before{
808
+ content:"\e129"
809
+}
810
+
811
+.glyphicon-hand-down:before{
812
+ content:"\e130"
813
+}
814
+
815
+.glyphicon-circle-arrow-right:before{
816
+ content:"\e131"
817
+}
818
+
819
+.glyphicon-circle-arrow-left:before{
820
+ content:"\e132"
821
+}
822
+
823
+.glyphicon-circle-arrow-up:before{
824
+ content:"\e133"
825
+}
826
+
827
+.glyphicon-circle-arrow-down:before{
828
+ content:"\e134"
829
+}
830
+
831
+.glyphicon-globe:before{
832
+ content:"\e135"
833
+}
834
+
835
+.glyphicon-wrench:before{
836
+ content:"\e136"
837
+}
838
+
839
+.glyphicon-tasks:before{
840
+ content:"\e137"
841
+}
842
+
843
+.glyphicon-filter:before{
844
+ content:"\e138"
845
+}
846
+
847
+.glyphicon-briefcase:before{
848
+ content:"\e139"
849
+}
850
+
851
+.glyphicon-fullscreen:before{
852
+ content:"\e140"
853
+}
854
+
855
+.glyphicon-dashboard:before{
856
+ content:"\e141"
857
+}
858
+
859
+.glyphicon-paperclip:before{
860
+ content:"\e142"
861
+}
862
+
863
+.glyphicon-heart-empty:before{
864
+ content:"\e143"
865
+}
866
+
867
+.glyphicon-link:before{
868
+ content:"\e144"
869
+}
870
+
871
+.glyphicon-phone:before{
872
+ content:"\e145"
873
+}
874
+
875
+.glyphicon-pushpin:before{
876
+ content:"\e146"
877
+}
878
+
879
+.glyphicon-usd:before{
880
+ content:"\e148"
881
+}
882
+
883
+.glyphicon-gbp:before{
884
+ content:"\e149"
885
+}
886
+
887
+.glyphicon-sort:before{
888
+ content:"\e150"
889
+}
890
+
891
+.glyphicon-sort-by-alphabet:before{
892
+ content:"\e151"
893
+}
894
+
895
+.glyphicon-sort-by-alphabet-alt:before{
896
+ content:"\e152"
897
+}
898
+
899
+.glyphicon-sort-by-order:before{
900
+ content:"\e153"
901
+}
902
+
903
+.glyphicon-sort-by-order-alt:before{
904
+ content:"\e154"
905
+}
906
+
907
+.glyphicon-sort-by-attributes:before{
908
+ content:"\e155"
909
+}
910
+
911
+.glyphicon-sort-by-attributes-alt:before{
912
+ content:"\e156"
913
+}
914
+
915
+.glyphicon-unchecked:before{
916
+ content:"\e157"
917
+}
918
+
919
+.glyphicon-expand:before{
920
+ content:"\e158"
921
+}
922
+
923
+.glyphicon-collapse-down:before{
924
+ content:"\e159"
925
+}
926
+
927
+.glyphicon-collapse-up:before{
928
+ content:"\e160"
929
+}
930
+
931
+.glyphicon-log-in:before{
932
+ content:"\e161"
933
+}
934
+
935
+.glyphicon-flash:before{
936
+ content:"\e162"
937
+}
938
+
939
+.glyphicon-log-out:before{
940
+ content:"\e163"
941
+}
942
+
943
+.glyphicon-new-window:before{
944
+ content:"\e164"
945
+}
946
+
947
+.glyphicon-record:before{
948
+ content:"\e165"
949
+}
950
+
951
+.glyphicon-save:before{
952
+ content:"\e166"
953
+}
954
+
955
+.glyphicon-open:before{
956
+ content:"\e167"
957
+}
958
+
959
+.glyphicon-saved:before{
960
+ content:"\e168"
961
+}
962
+
963
+.glyphicon-import:before{
964
+ content:"\e169"
965
+}
966
+
967
+.glyphicon-export:before{
968
+ content:"\e170"
969
+}
970
+
971
+.glyphicon-send:before{
972
+ content:"\e171"
973
+}
974
+
975
+.glyphicon-floppy-disk:before{
976
+ content:"\e172"
977
+}
978
+
979
+.glyphicon-floppy-saved:before{
980
+ content:"\e173"
981
+}
982
+
983
+.glyphicon-floppy-remove:before{
984
+ content:"\e174"
985
+}
986
+
987
+.glyphicon-floppy-save:before{
988
+ content:"\e175"
989
+}
990
+
991
+.glyphicon-floppy-open:before{
992
+ content:"\e176"
993
+}
994
+
995
+.glyphicon-credit-card:before{
996
+ content:"\e177"
997
+}
998
+
999
+.glyphicon-transfer:before{
1000
+ content:"\e178"
1001
+}
1002
+
1003
+.glyphicon-cutlery:before{
1004
+ content:"\e179"
1005
+}
1006
+
1007
+.glyphicon-header:before{
1008
+ content:"\e180"
1009
+}
1010
+
1011
+.glyphicon-compressed:before{
1012
+ content:"\e181"
1013
+}
1014
+
1015
+.glyphicon-earphone:before{
1016
+ content:"\e182"
1017
+}
1018
+
1019
+.glyphicon-phone-alt:before{
1020
+ content:"\e183"
1021
+}
1022
+
1023
+.glyphicon-tower:before{
1024
+ content:"\e184"
1025
+}
1026
+
1027
+.glyphicon-stats:before{
1028
+ content:"\e185"
1029
+}
1030
+
1031
+.glyphicon-sd-video:before{
1032
+ content:"\e186"
1033
+}
1034
+
1035
+.glyphicon-hd-video:before{
1036
+ content:"\e187"
1037
+}
1038
+
1039
+.glyphicon-subtitles:before{
1040
+ content:"\e188"
1041
+}
1042
+
1043
+.glyphicon-sound-stereo:before{
1044
+ content:"\e189"
1045
+}
1046
+
1047
+.glyphicon-sound-dolby:before{
1048
+ content:"\e190"
1049
+}
1050
+
1051
+.glyphicon-sound-5-1:before{
1052
+ content:"\e191"
1053
+}
1054
+
1055
+.glyphicon-sound-6-1:before{
1056
+ content:"\e192"
1057
+}
1058
+
1059
+.glyphicon-sound-7-1:before{
1060
+ content:"\e193"
1061
+}
1062
+
1063
+.glyphicon-copyright-mark:before{
1064
+ content:"\e194"
1065
+}
1066
+
1067
+.glyphicon-registration-mark:before{
1068
+ content:"\e195"
1069
+}
1070
+
1071
+.glyphicon-cloud-download:before{
1072
+ content:"\e197"
1073
+}
1074
+
1075
+.glyphicon-cloud-upload:before{
1076
+ content:"\e198"
1077
+}
1078
+
1079
+.glyphicon-tree-conifer:before{
1080
+ content:"\e199"
1081
+}
1082
+
1083
+.glyphicon-tree-deciduous:before{
1084
+ content:"\e200"
1085
+}
1086
+
1087
+.glyphicon-cd:before{
1088
+ content:"\e201"
1089
+}
1090
+
1091
+.glyphicon-save-file:before{
1092
+ content:"\e202"
1093
+}
1094
+
1095
+.glyphicon-open-file:before{
1096
+ content:"\e203"
1097
+}
1098
+
1099
+.glyphicon-level-up:before{
1100
+ content:"\e204"
1101
+}
1102
+
1103
+.glyphicon-copy:before{
1104
+ content:"\e205"
1105
+}
1106
+
1107
+.glyphicon-paste:before{
1108
+ content:"\e206"
1109
+}
1110
+
1111
+.glyphicon-alert:before{
1112
+ content:"\e209"
1113
+}
1114
+
1115
+.glyphicon-equalizer:before{
1116
+ content:"\e210"
1117
+}
1118
+
1119
+.glyphicon-king:before{
1120
+ content:"\e211"
1121
+}
1122
+
1123
+.glyphicon-queen:before{
1124
+ content:"\e212"
1125
+}
1126
+
1127
+.glyphicon-pawn:before{
1128
+ content:"\e213"
1129
+}
1130
+
1131
+.glyphicon-bishop:before{
1132
+ content:"\e214"
1133
+}
1134
+
1135
+.glyphicon-knight:before{
1136
+ content:"\e215"
1137
+}
1138
+
1139
+.glyphicon-baby-formula:before{
1140
+ content:"\e216"
1141
+}
1142
+
1143
+.glyphicon-tent:before{
1144
+ content:"\26fa"
1145
+}
1146
+
1147
+.glyphicon-blackboard:before{
1148
+ content:"\e218"
1149
+}
1150
+
1151
+.glyphicon-bed:before{
1152
+ content:"\e219"
1153
+}
1154
+
1155
+.glyphicon-apple:before{
1156
+ content:"\f8ff"
1157
+}
1158
+
1159
+.glyphicon-erase:before{
1160
+ content:"\e221"
1161
+}
1162
+
1163
+.glyphicon-hourglass:before{
1164
+ content:"\231b"
1165
+}
1166
+
1167
+.glyphicon-lamp:before{
1168
+ content:"\e223"
1169
+}
1170
+
1171
+.glyphicon-duplicate:before{
1172
+ content:"\e224"
1173
+}
1174
+
1175
+.glyphicon-piggy-bank:before{
1176
+ content:"\e225"
1177
+}
1178
+
1179
+.glyphicon-scissors:before{
1180
+ content:"\e226"
1181
+}
1182
+
1183
+.glyphicon-bitcoin:before{
1184
+ content:"\e227"
1185
+}
1186
+
1187
+.glyphicon-btc:before{
1188
+ content:"\e227"
1189
+}
1190
+
1191
+.glyphicon-xbt:before{
1192
+ content:"\e227"
1193
+}
1194
+
1195
+.glyphicon-yen:before{
1196
+ content:"\00a5"
1197
+}
1198
+
1199
+.glyphicon-jpy:before{
1200
+ content:"\00a5"
1201
+}
1202
+
1203
+.glyphicon-ruble:before{
1204
+ content:"\20bd"
1205
+}
1206
+
1207
+.glyphicon-rub:before{
1208
+ content:"\20bd"
1209
+}
1210
+
1211
+.glyphicon-scale:before{
1212
+ content:"\e230"
1213
+}
1214
+
1215
+.glyphicon-ice-lolly:before{
1216
+ content:"\e231"
1217
+}
1218
+
1219
+.glyphicon-ice-lolly-tasted:before{
1220
+ content:"\e232"
1221
+}
1222
+
1223
+.glyphicon-education:before{
1224
+ content:"\e233"
1225
+}
1226
+
1227
+.glyphicon-option-horizontal:before{
1228
+ content:"\e234"
1229
+}
1230
+
1231
+.glyphicon-option-vertical:before{
1232
+ content:"\e235"
1233
+}
1234
+
1235
+.glyphicon-menu-hamburger:before{
1236
+ content:"\e236"
1237
+}
1238
+
1239
+.glyphicon-modal-window:before{
1240
+ content:"\e237"
1241
+}
1242
+
1243
+.glyphicon-oil:before{
1244
+ content:"\e238"
1245
+}
1246
+
1247
+.glyphicon-grain:before{
1248
+ content:"\e239"
1249
+}
1250
+
1251
+.glyphicon-sunglasses:before{
1252
+ content:"\e240"
1253
+}
1254
+
1255
+.glyphicon-text-size:before{
1256
+ content:"\e241"
1257
+}
1258
+
1259
+.glyphicon-text-color:before{
1260
+ content:"\e242"
1261
+}
1262
+
1263
+.glyphicon-text-background:before{
1264
+ content:"\e243"
1265
+}
1266
+
1267
+.glyphicon-object-align-top:before{
1268
+ content:"\e244"
1269
+}
1270
+
1271
+.glyphicon-object-align-bottom:before{
1272
+ content:"\e245"
1273
+}
1274
+
1275
+.glyphicon-object-align-horizontal:before{
1276
+ content:"\e246"
1277
+}
1278
+
1279
+.glyphicon-object-align-left:before{
1280
+ content:"\e247"
1281
+}
1282
+
1283
+.glyphicon-object-align-vertical:before{
1284
+ content:"\e248"
1285
+}
1286
+
1287
+.glyphicon-object-align-right:before{
1288
+ content:"\e249"
1289
+}
1290
+
1291
+.glyphicon-triangle-right:before{
1292
+ content:"\e250"
1293
+}
1294
+
1295
+.glyphicon-triangle-left:before{
1296
+ content:"\e251"
1297
+}
1298
+
1299
+.glyphicon-triangle-bottom:before{
1300
+ content:"\e252"
1301
+}
1302
+
1303
+.glyphicon-triangle-top:before{
1304
+ content:"\e253"
1305
+}
1306
+
1307
+.glyphicon-console:before{
1308
+ content:"\e254"
1309
+}
1310
+
1311
+.glyphicon-superscript:before{
1312
+ content:"\e255"
1313
+}
1314
+
1315
+.glyphicon-subscript:before{
1316
+ content:"\e256"
1317
+}
1318
+
1319
+.glyphicon-menu-left:before{
1320
+ content:"\e257"
1321
+}
1322
+
1323
+.glyphicon-menu-right:before{
1324
+ content:"\e258"
1325
+}
1326
+
1327
+.glyphicon-menu-down:before{
1328
+ content:"\e259"
1329
+}
1330
+
1331
+.glyphicon-menu-up:before{
1332
+ content:"\e260"
1333
+}
1334
+
1335
+*{
1336
+ -webkit-box-sizing:border-box;
1337
+ -moz-box-sizing:border-box;
1338
+ box-sizing:border-box
1339
+}
1340
+
1341
+:after,:before{
1342
+ -webkit-box-sizing:border-box;
1343
+ -moz-box-sizing:border-box;
1344
+ box-sizing:border-box
1345
+}
1346
+
1347
+html{
1348
+ font-size:10px;
1349
+ -webkit-tap-highlight-color:rgba(0,0,0,0)
1350
+}
1351
+
1352
+body{
1353
+ font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
1354
+ font-size:14px;
1355
+ line-height:1.42857143;
1356
+ color:#333;
1357
+ background-color:#fff
1358
+}
1359
+
1360
+button,input,select,textarea{
1361
+ font-family:inherit;
1362
+ font-size:inherit;
1363
+ line-height:inherit
1364
+}
1365
+
1366
+a{
1367
+ color:#337ab7;
1368
+ text-decoration:none
1369
+}
1370
+
1371
+a:focus,a:hover{
1372
+ color:#23527c;
1373
+ text-decoration:underline
1374
+}
1375
+
1376
+a:focus{
1377
+ outline:thin dotted;
1378
+ outline:5px auto -webkit-focus-ring-color;
1379
+ outline-offset:-2px
1380
+}
1381
+
1382
+figure{
1383
+ margin:0
1384
+}
1385
+
1386
+img{
1387
+ vertical-align:middle
1388
+}
1389
+
1390
+.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{
1391
+ display:block;
1392
+ max-width:100%;
1393
+ height:auto
1394
+}
1395
+
1396
+.img-rounded{
1397
+ border-radius:6px
1398
+}
1399
+
1400
+.img-thumbnail{
1401
+ display:inline-block;
1402
+ max-width:100%;
1403
+ height:auto;
1404
+ padding:4px;
1405
+ line-height:1.42857143;
1406
+ background-color:#fff;
1407
+ border:1px solid #ddd;
1408
+ border-radius:4px;
1409
+ -webkit-transition:all .2s ease-in-out;
1410
+ -o-transition:all .2s ease-in-out;
1411
+ transition:all .2s ease-in-out
1412
+}
1413
+
1414
+.img-circle{
1415
+ border-radius:50%
1416
+}
1417
+
1418
+hr{
1419
+ margin-top:20px;
1420
+ margin-bottom:20px;
1421
+ border:0;
1422
+ border-top:1px solid #eee
1423
+}
1424
+
1425
+.sr-only{
1426
+ position:absolute;
1427
+ width:1px;
1428
+ height:1px;
1429
+ padding:0;
1430
+ margin:-1px;
1431
+ overflow:hidden;
1432
+ clip:rect(0,0,0,0);
1433
+ border:0
1434
+}
1435
+
1436
+.sr-only-focusable:active,.sr-only-focusable:focus{
1437
+ position:static;
1438
+ width:auto;
1439
+ height:auto;
1440
+ margin:0;
1441
+ overflow:visible;
1442
+ clip:auto
1443
+}
1444
+
1445
+[role=button]{
1446
+ cursor:pointer
1447
+}
1448
+
1449
+.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{
1450
+ font-family:inherit;
1451
+ font-weight:500;
1452
+ line-height:1.1;
1453
+ color:inherit
1454
+}
1455
+
1456
+.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{
1457
+ font-weight:400;
1458
+ line-height:1;
1459
+ color:#777
1460
+}
1461
+
1462
+.h1,.h2,.h3,h1,h2,h3{
1463
+ margin-top:20px;
1464
+ margin-bottom:10px
1465
+}
1466
+
1467
+.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{
1468
+ font-size:65%
1469
+}
1470
+
1471
+.h4,.h5,.h6,h4,h5,h6{
1472
+ margin-top:10px;
1473
+ margin-bottom:10px
1474
+}
1475
+
1476
+.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{
1477
+ font-size:75%
1478
+}
1479
+
1480
+.h1,h1{
1481
+ font-size:36px
1482
+}
1483
+
1484
+.h2,h2{
1485
+ font-size:30px
1486
+}
1487
+
1488
+.h3,h3{
1489
+ font-size:24px
1490
+}
1491
+
1492
+.h4,h4{
1493
+ font-size:18px
1494
+}
1495
+
1496
+.h5,h5{
1497
+ font-size:14px
1498
+}
1499
+
1500
+.h6,h6{
1501
+ font-size:12px
1502
+}
1503
+
1504
+p{
1505
+ margin:0 0 10px
1506
+}
1507
+
1508
+.lead{
1509
+ margin-bottom:20px;
1510
+ font-size:16px;
1511
+ font-weight:300;
1512
+ line-height:1.4
1513
+}
1514
+
1515
+@media (min-width:768px){
1516
+ .lead{
1517
+ font-size:21px
1518
+ }
1519
+
1520
+}
1521
+
1522
+.small,small{
1523
+ font-size:85%
1524
+}
1525
+
1526
+.mark,mark{
1527
+ padding:.2em;
1528
+ background-color:#fcf8e3
1529
+}
1530
+
1531
+.text-left{
1532
+ text-align:left
1533
+}
1534
+
1535
+.text-right{
1536
+ text-align:right
1537
+}
1538
+
1539
+.text-center{
1540
+ text-align:center
1541
+}
1542
+
1543
+.text-justify{
1544
+ text-align:justify
1545
+}
1546
+
1547
+.text-nowrap{
1548
+ white-space:nowrap
1549
+}
1550
+
1551
+.text-lowercase{
1552
+ text-transform:lowercase
1553
+}
1554
+
1555
+.text-uppercase{
1556
+ text-transform:uppercase
1557
+}
1558
+
1559
+.text-capitalize{
1560
+ text-transform:capitalize
1561
+}
1562
+
1563
+.text-muted{
1564
+ color:#777
1565
+}
1566
+
1567
+.text-primary{
1568
+ color:#337ab7
1569
+}
1570
+
1571
+a.text-primary:focus,a.text-primary:hover{
1572
+ color:#286090
1573
+}
1574
+
1575
+.text-success{
1576
+ color:#3c763d
1577
+}
1578
+
1579
+a.text-success:focus,a.text-success:hover{
1580
+ color:#2b542c
1581
+}
1582
+
1583
+.text-info{
1584
+ color:#31708f
1585
+}
1586
+
1587
+a.text-info:focus,a.text-info:hover{
1588
+ color:#245269
1589
+}
1590
+
1591
+.text-warning{
1592
+ color:#8a6d3b
1593
+}
1594
+
1595
+a.text-warning:focus,a.text-warning:hover{
1596
+ color:#66512c
1597
+}
1598
+
1599
+.text-danger{
1600
+ color:#a94442
1601
+}
1602
+
1603
+a.text-danger:focus,a.text-danger:hover{
1604
+ color:#843534
1605
+}
1606
+
1607
+.bg-primary{
1608
+ color:#fff;
1609
+ background-color:#337ab7
1610
+}
1611
+
1612
+a.bg-primary:focus,a.bg-primary:hover{
1613
+ background-color:#286090
1614
+}
1615
+
1616
+.bg-success{
1617
+ background-color:#dff0d8
1618
+}
1619
+
1620
+a.bg-success:focus,a.bg-success:hover{
1621
+ background-color:#c1e2b3
1622
+}
1623
+
1624
+.bg-info{
1625
+ background-color:#d9edf7
1626
+}
1627
+
1628
+a.bg-info:focus,a.bg-info:hover{
1629
+ background-color:#afd9ee
1630
+}
1631
+
1632
+.bg-warning{
1633
+ background-color:#fcf8e3
1634
+}
1635
+
1636
+a.bg-warning:focus,a.bg-warning:hover{
1637
+ background-color:#f7ecb5
1638
+}
1639
+
1640
+.bg-danger{
1641
+ background-color:#f2dede
1642
+}
1643
+
1644
+a.bg-danger:focus,a.bg-danger:hover{
1645
+ background-color:#e4b9b9
1646
+}
1647
+
1648
+.page-header{
1649
+ padding-bottom:9px;
1650
+ margin:40px 0 20px;
1651
+ border-bottom:1px solid #eee
1652
+}
1653
+
1654
+ol,ul{
1655
+ margin-top:0;
1656
+ margin-bottom:10px
1657
+}
1658
+
1659
+ol ol,ol ul,ul ol,ul ul{
1660
+ margin-bottom:0
1661
+}
1662
+
1663
+.list-unstyled{
1664
+ padding-left:0;
1665
+ list-style:none
1666
+}
1667
+
1668
+.list-inline{
1669
+ padding-left:0;
1670
+ margin-left:-5px;
1671
+ list-style:none
1672
+}
1673
+
1674
+.list-inline>li{
1675
+ display:inline-block;
1676
+ padding-right:5px;
1677
+ padding-left:5px
1678
+}
1679
+
1680
+dl{
1681
+ margin-top:0;
1682
+ margin-bottom:20px
1683
+}
1684
+
1685
+dd,dt{
1686
+ line-height:1.42857143
1687
+}
1688
+
1689
+dt{
1690
+ font-weight:700
1691
+}
1692
+
1693
+dd{
1694
+ margin-left:0
1695
+}
1696
+
1697
+@media (min-width:768px){
1698
+ .dl-horizontal dt{
1699
+ float:left;
1700
+ width:160px;
1701
+ overflow:hidden;
1702
+ clear:left;
1703
+ text-align:right;
1704
+ text-overflow:ellipsis;
1705
+ white-space:nowrap
1706
+ }
1707
+
1708
+ .dl-horizontal dd{
1709
+ margin-left:180px
1710
+ }
1711
+
1712
+}
1713
+
1714
+abbr[data-original-title],abbr[title]{
1715
+ cursor:help;
1716
+ border-bottom:1px dotted #777
1717
+}
1718
+
1719
+.initialism{
1720
+ font-size:90%;
1721
+ text-transform:uppercase
1722
+}
1723
+
1724
+blockquote{
1725
+ padding:10px 20px;
1726
+ margin:0 0 20px;
1727
+ font-size:17.5px;
1728
+ border-left:5px solid #eee
1729
+}
1730
+
1731
+blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{
1732
+ margin-bottom:0
1733
+}
1734
+
1735
+blockquote .small,blockquote footer,blockquote small{
1736
+ display:block;
1737
+ font-size:80%;
1738
+ line-height:1.42857143;
1739
+ color:#777
1740
+}
1741
+
1742
+blockquote .small:before,blockquote footer:before,blockquote small:before{
1743
+ content:'\2014 \00A0'
1744
+}
1745
+
1746
+.blockquote-reverse,blockquote.pull-right{
1747
+ padding-right:15px;
1748
+ padding-left:0;
1749
+ text-align:right;
1750
+ border-right:5px solid #eee;
1751
+ border-left:0
1752
+}
1753
+
1754
+.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{
1755
+ content:''
1756
+}
1757
+
1758
+.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{
1759
+ content:'\00A0 \2014'
1760
+}
1761
+
1762
+address{
1763
+ margin-bottom:20px;
1764
+ font-style:normal;
1765
+ line-height:1.42857143
1766
+}
1767
+
1768
+code,kbd,pre,samp{
1769
+ font-family:Menlo,Monaco,Consolas,"Courier New",monospace
1770
+}
1771
+
1772
+code{
1773
+ padding:2px 4px;
1774
+ font-size:90%;
1775
+ color:#c7254e;
1776
+ background-color:#f9f2f4;
1777
+ border-radius:4px
1778
+}
1779
+
1780
+kbd{
1781
+ padding:2px 4px;
1782
+ font-size:90%;
1783
+ color:#fff;
1784
+ background-color:#333;
1785
+ border-radius:3px;
1786
+ -webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);
1787
+ box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)
1788
+}
1789
+
1790
+kbd kbd{
1791
+ padding:0;
1792
+ font-size:100%;
1793
+ font-weight:700;
1794
+ -webkit-box-shadow:none;
1795
+ box-shadow:none
1796
+}
1797
+
1798
+pre{
1799
+ display:block;
1800
+ padding:9.5px;
1801
+ margin:0 0 10px;
1802
+ font-size:13px;
1803
+ line-height:1.42857143;
1804
+ color:#333;
1805
+ word-break:break-all;
1806
+ word-wrap:break-word;
1807
+ background-color:#f5f5f5;
1808
+ border:1px solid #ccc;
1809
+ border-radius:4px
1810
+}
1811
+
1812
+pre code{
1813
+ padding:0;
1814
+ font-size:inherit;
1815
+ color:inherit;
1816
+ white-space:pre-wrap;
1817
+ background-color:transparent;
1818
+ border-radius:0
1819
+}
1820
+
1821
+.pre-scrollable{
1822
+ max-height:340px;
1823
+ overflow-y:scroll
1824
+}
1825
+
1826
+.container{
1827
+ padding-right:15px;
1828
+ padding-left:15px;
1829
+ margin-right:auto;
1830
+ margin-left:auto
1831
+}
1832
+
1833
+@media (min-width:768px){
1834
+ .container{
1835
+ width:750px
1836
+ }
1837
+
1838
+}
1839
+
1840
+@media (min-width:992px){
1841
+ .container{
1842
+ width:970px
1843
+ }
1844
+
1845
+}
1846
+
1847
+@media (min-width:1200px){
1848
+ .container{
1849
+ width:1170px
1850
+ }
1851
+
1852
+}
1853
+
1854
+.container-fluid{
1855
+ padding-right:15px;
1856
+ padding-left:15px;
1857
+ margin-right:auto;
1858
+ margin-left:auto
1859
+}
1860
+
1861
+.row{
1862
+ margin-right:-15px;
1863
+ margin-left:-15px
1864
+}
1865
+
1866
+.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{
1867
+ position:relative;
1868
+ min-height:1px;
1869
+ padding-right:15px;
1870
+ padding-left:15px
1871
+}
1872
+
1873
+.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{
1874
+ float:left
1875
+}
1876
+
1877
+.col-xs-12{
1878
+ width:100%
1879
+}
1880
+
1881
+.col-xs-11{
1882
+ width:91.66666667%
1883
+}
1884
+
1885
+.col-xs-10{
1886
+ width:83.33333333%
1887
+}
1888
+
1889
+.col-xs-9{
1890
+ width:75%
1891
+}
1892
+
1893
+.col-xs-8{
1894
+ width:66.66666667%
1895
+}
1896
+
1897
+.col-xs-7{
1898
+ width:58.33333333%
1899
+}
1900
+
1901
+.col-xs-6{
1902
+ width:50%
1903
+}
1904
+
1905
+.col-xs-5{
1906
+ width:41.66666667%
1907
+}
1908
+
1909
+.col-xs-4{
1910
+ width:33.33333333%
1911
+}
1912
+
1913
+.col-xs-3{
1914
+ width:25%
1915
+}
1916
+
1917
+.col-xs-2{
1918
+ width:16.66666667%
1919
+}
1920
+
1921
+.col-xs-1{
1922
+ width:8.33333333%
1923
+}
1924
+
1925
+.col-xs-pull-12{
1926
+ right:100%
1927
+}
1928
+
1929
+.col-xs-pull-11{
1930
+ right:91.66666667%
1931
+}
1932
+
1933
+.col-xs-pull-10{
1934
+ right:83.33333333%
1935
+}
1936
+
1937
+.col-xs-pull-9{
1938
+ right:75%
1939
+}
1940
+
1941
+.col-xs-pull-8{
1942
+ right:66.66666667%
1943
+}
1944
+
1945
+.col-xs-pull-7{
1946
+ right:58.33333333%
1947
+}
1948
+
1949
+.col-xs-pull-6{
1950
+ right:50%
1951
+}
1952
+
1953
+.col-xs-pull-5{
1954
+ right:41.66666667%
1955
+}
1956
+
1957
+.col-xs-pull-4{
1958
+ right:33.33333333%
1959
+}
1960
+
1961
+.col-xs-pull-3{
1962
+ right:25%
1963
+}
1964
+
1965
+.col-xs-pull-2{
1966
+ right:16.66666667%
1967
+}
1968
+
1969
+.col-xs-pull-1{
1970
+ right:8.33333333%
1971
+}
1972
+
1973
+.col-xs-pull-0{
1974
+ right:auto
1975
+}
1976
+
1977
+.col-xs-push-12{
1978
+ left:100%
1979
+}
1980
+
1981
+.col-xs-push-11{
1982
+ left:91.66666667%
1983
+}
1984
+
1985
+.col-xs-push-10{
1986
+ left:83.33333333%
1987
+}
1988
+
1989
+.col-xs-push-9{
1990
+ left:75%
1991
+}
1992
+
1993
+.col-xs-push-8{
1994
+ left:66.66666667%
1995
+}
1996
+
1997
+.col-xs-push-7{
1998
+ left:58.33333333%
1999
+}
2000
+
2001
+.col-xs-push-6{
2002
+ left:50%
2003
+}
2004
+
2005
+.col-xs-push-5{
2006
+ left:41.66666667%
2007
+}
2008
+
2009
+.col-xs-push-4{
2010
+ left:33.33333333%
2011
+}
2012
+
2013
+.col-xs-push-3{
2014
+ left:25%
2015
+}
2016
+
2017
+.col-xs-push-2{
2018
+ left:16.66666667%
2019
+}
2020
+
2021
+.col-xs-push-1{
2022
+ left:8.33333333%
2023
+}
2024
+
2025
+.col-xs-push-0{
2026
+ left:auto
2027
+}
2028
+
2029
+.col-xs-offset-12{
2030
+ margin-left:100%
2031
+}
2032
+
2033
+.col-xs-offset-11{
2034
+ margin-left:91.66666667%
2035
+}
2036
+
2037
+.col-xs-offset-10{
2038
+ margin-left:83.33333333%
2039
+}
2040
+
2041
+.col-xs-offset-9{
2042
+ margin-left:75%
2043
+}
2044
+
2045
+.col-xs-offset-8{
2046
+ margin-left:66.66666667%
2047
+}
2048
+
2049
+.col-xs-offset-7{
2050
+ margin-left:58.33333333%
2051
+}
2052
+
2053
+.col-xs-offset-6{
2054
+ margin-left:50%
2055
+}
2056
+
2057
+.col-xs-offset-5{
2058
+ margin-left:41.66666667%
2059
+}
2060
+
2061
+.col-xs-offset-4{
2062
+ margin-left:33.33333333%
2063
+}
2064
+
2065
+.col-xs-offset-3{
2066
+ margin-left:25%
2067
+}
2068
+
2069
+.col-xs-offset-2{
2070
+ margin-left:16.66666667%
2071
+}
2072
+
2073
+.col-xs-offset-1{
2074
+ margin-left:8.33333333%
2075
+}
2076
+
2077
+.col-xs-offset-0{
2078
+ margin-left:0
2079
+}
2080
+
2081
+@media (min-width:768px){
2082
+ .col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{
2083
+ float:left
2084
+ }
2085
+
2086
+ .col-sm-12{
2087
+ width:100%
2088
+ }
2089
+
2090
+ .col-sm-11{
2091
+ width:91.66666667%
2092
+ }
2093
+
2094
+ .col-sm-10{
2095
+ width:83.33333333%
2096
+ }
2097
+
2098
+ .col-sm-9{
2099
+ width:75%
2100
+ }
2101
+
2102
+ .col-sm-8{
2103
+ width:66.66666667%
2104
+ }
2105
+
2106
+ .col-sm-7{
2107
+ width:58.33333333%
2108
+ }
2109
+
2110
+ .col-sm-6{
2111
+ width:50%
2112
+ }
2113
+
2114
+ .col-sm-5{
2115
+ width:41.66666667%
2116
+ }
2117
+
2118
+ .col-sm-4{
2119
+ width:33.33333333%
2120
+ }
2121
+
2122
+ .col-sm-3{
2123
+ width:25%
2124
+ }
2125
+
2126
+ .col-sm-2{
2127
+ width:16.66666667%
2128
+ }
2129
+
2130
+ .col-sm-1{
2131
+ width:8.33333333%
2132
+ }
2133
+
2134
+ .col-sm-pull-12{
2135
+ right:100%
2136
+ }
2137
+
2138
+ .col-sm-pull-11{
2139
+ right:91.66666667%
2140
+ }
2141
+
2142
+ .col-sm-pull-10{
2143
+ right:83.33333333%
2144
+ }
2145
+
2146
+ .col-sm-pull-9{
2147
+ right:75%
2148
+ }
2149
+
2150
+ .col-sm-pull-8{
2151
+ right:66.66666667%
2152
+ }
2153
+
2154
+ .col-sm-pull-7{
2155
+ right:58.33333333%
2156
+ }
2157
+
2158
+ .col-sm-pull-6{
2159
+ right:50%
2160
+ }
2161
+
2162
+ .col-sm-pull-5{
2163
+ right:41.66666667%
2164
+ }
2165
+
2166
+ .col-sm-pull-4{
2167
+ right:33.33333333%
2168
+ }
2169
+
2170
+ .col-sm-pull-3{
2171
+ right:25%
2172
+ }
2173
+
2174
+ .col-sm-pull-2{
2175
+ right:16.66666667%
2176
+ }
2177
+
2178
+ .col-sm-pull-1{
2179
+ right:8.33333333%
2180
+ }
2181
+
2182
+ .col-sm-pull-0{
2183
+ right:auto
2184
+ }
2185
+
2186
+ .col-sm-push-12{
2187
+ left:100%
2188
+ }
2189
+
2190
+ .col-sm-push-11{
2191
+ left:91.66666667%
2192
+ }
2193
+
2194
+ .col-sm-push-10{
2195
+ left:83.33333333%
2196
+ }
2197
+
2198
+ .col-sm-push-9{
2199
+ left:75%
2200
+ }
2201
+
2202
+ .col-sm-push-8{
2203
+ left:66.66666667%
2204
+ }
2205
+
2206
+ .col-sm-push-7{
2207
+ left:58.33333333%
2208
+ }
2209
+
2210
+ .col-sm-push-6{
2211
+ left:50%
2212
+ }
2213
+
2214
+ .col-sm-push-5{
2215
+ left:41.66666667%
2216
+ }
2217
+
2218
+ .col-sm-push-4{
2219
+ left:33.33333333%
2220
+ }
2221
+
2222
+ .col-sm-push-3{
2223
+ left:25%
2224
+ }
2225
+
2226
+ .col-sm-push-2{
2227
+ left:16.66666667%
2228
+ }
2229
+
2230
+ .col-sm-push-1{
2231
+ left:8.33333333%
2232
+ }
2233
+
2234
+ .col-sm-push-0{
2235
+ left:auto
2236
+ }
2237
+
2238
+ .col-sm-offset-12{
2239
+ margin-left:100%
2240
+ }
2241
+
2242
+ .col-sm-offset-11{
2243
+ margin-left:91.66666667%
2244
+ }
2245
+
2246
+ .col-sm-offset-10{
2247
+ margin-left:83.33333333%
2248
+ }
2249
+
2250
+ .col-sm-offset-9{
2251
+ margin-left:75%
2252
+ }
2253
+
2254
+ .col-sm-offset-8{
2255
+ margin-left:66.66666667%
2256
+ }
2257
+
2258
+ .col-sm-offset-7{
2259
+ margin-left:58.33333333%
2260
+ }
2261
+
2262
+ .col-sm-offset-6{
2263
+ margin-left:50%
2264
+ }
2265
+
2266
+ .col-sm-offset-5{
2267
+ margin-left:41.66666667%
2268
+ }
2269
+
2270
+ .col-sm-offset-4{
2271
+ margin-left:33.33333333%
2272
+ }
2273
+
2274
+ .col-sm-offset-3{
2275
+ margin-left:25%
2276
+ }
2277
+
2278
+ .col-sm-offset-2{
2279
+ margin-left:16.66666667%
2280
+ }
2281
+
2282
+ .col-sm-offset-1{
2283
+ margin-left:8.33333333%
2284
+ }
2285
+
2286
+ .col-sm-offset-0{
2287
+ margin-left:0
2288
+ }
2289
+
2290
+}
2291
+
2292
+@media (min-width:992px){
2293
+ .col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{
2294
+ float:left
2295
+ }
2296
+
2297
+ .col-md-12{
2298
+ width:100%
2299
+ }
2300
+
2301
+ .col-md-11{
2302
+ width:91.66666667%
2303
+ }
2304
+
2305
+ .col-md-10{
2306
+ width:83.33333333%
2307
+ }
2308
+
2309
+ .col-md-9{
2310
+ width:75%
2311
+ }
2312
+
2313
+ .col-md-8{
2314
+ width:66.66666667%
2315
+ }
2316
+
2317
+ .col-md-7{
2318
+ width:58.33333333%
2319
+ }
2320
+
2321
+ .col-md-6{
2322
+ width:50%
2323
+ }
2324
+
2325
+ .col-md-5{
2326
+ width:41.66666667%
2327
+ }
2328
+
2329
+ .col-md-4{
2330
+ width:33.33333333%
2331
+ }
2332
+
2333
+ .col-md-3{
2334
+ width:25%
2335
+ }
2336
+
2337
+ .col-md-2{
2338
+ width:16.66666667%
2339
+ }
2340
+
2341
+ .col-md-1{
2342
+ width:8.33333333%
2343
+ }
2344
+
2345
+ .col-md-pull-12{
2346
+ right:100%
2347
+ }
2348
+
2349
+ .col-md-pull-11{
2350
+ right:91.66666667%
2351
+ }
2352
+
2353
+ .col-md-pull-10{
2354
+ right:83.33333333%
2355
+ }
2356
+
2357
+ .col-md-pull-9{
2358
+ right:75%
2359
+ }
2360
+
2361
+ .col-md-pull-8{
2362
+ right:66.66666667%
2363
+ }
2364
+
2365
+ .col-md-pull-7{
2366
+ right:58.33333333%
2367
+ }
2368
+
2369
+ .col-md-pull-6{
2370
+ right:50%
2371
+ }
2372
+
2373
+ .col-md-pull-5{
2374
+ right:41.66666667%
2375
+ }
2376
+
2377
+ .col-md-pull-4{
2378
+ right:33.33333333%
2379
+ }
2380
+
2381
+ .col-md-pull-3{
2382
+ right:25%
2383
+ }
2384
+
2385
+ .col-md-pull-2{
2386
+ right:16.66666667%
2387
+ }
2388
+
2389
+ .col-md-pull-1{
2390
+ right:8.33333333%
2391
+ }
2392
+
2393
+ .col-md-pull-0{
2394
+ right:auto
2395
+ }
2396
+
2397
+ .col-md-push-12{
2398
+ left:100%
2399
+ }
2400
+
2401
+ .col-md-push-11{
2402
+ left:91.66666667%
2403
+ }
2404
+
2405
+ .col-md-push-10{
2406
+ left:83.33333333%
2407
+ }
2408
+
2409
+ .col-md-push-9{
2410
+ left:75%
2411
+ }
2412
+
2413
+ .col-md-push-8{
2414
+ left:66.66666667%
2415
+ }
2416
+
2417
+ .col-md-push-7{
2418
+ left:58.33333333%
2419
+ }
2420
+
2421
+ .col-md-push-6{
2422
+ left:50%
2423
+ }
2424
+
2425
+ .col-md-push-5{
2426
+ left:41.66666667%
2427
+ }
2428
+
2429
+ .col-md-push-4{
2430
+ left:33.33333333%
2431
+ }
2432
+
2433
+ .col-md-push-3{
2434
+ left:25%
2435
+ }
2436
+
2437
+ .col-md-push-2{
2438
+ left:16.66666667%
2439
+ }
2440
+
2441
+ .col-md-push-1{
2442
+ left:8.33333333%
2443
+ }
2444
+
2445
+ .col-md-push-0{
2446
+ left:auto
2447
+ }
2448
+
2449
+ .col-md-offset-12{
2450
+ margin-left:100%
2451
+ }
2452
+
2453
+ .col-md-offset-11{
2454
+ margin-left:91.66666667%
2455
+ }
2456
+
2457
+ .col-md-offset-10{
2458
+ margin-left:83.33333333%
2459
+ }
2460
+
2461
+ .col-md-offset-9{
2462
+ margin-left:75%
2463
+ }
2464
+
2465
+ .col-md-offset-8{
2466
+ margin-left:66.66666667%
2467
+ }
2468
+
2469
+ .col-md-offset-7{
2470
+ margin-left:58.33333333%
2471
+ }
2472
+
2473
+ .col-md-offset-6{
2474
+ margin-left:50%
2475
+ }
2476
+
2477
+ .col-md-offset-5{
2478
+ margin-left:41.66666667%
2479
+ }
2480
+
2481
+ .col-md-offset-4{
2482
+ margin-left:33.33333333%
2483
+ }
2484
+
2485
+ .col-md-offset-3{
2486
+ margin-left:25%
2487
+ }
2488
+
2489
+ .col-md-offset-2{
2490
+ margin-left:16.66666667%
2491
+ }
2492
+
2493
+ .col-md-offset-1{
2494
+ margin-left:8.33333333%
2495
+ }
2496
+
2497
+ .col-md-offset-0{
2498
+ margin-left:0
2499
+ }
2500
+
2501
+}
2502
+
2503
+@media (min-width:1200px){
2504
+ .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{
2505
+ float:left
2506
+ }
2507
+
2508
+ .col-lg-12{
2509
+ width:100%
2510
+ }
2511
+
2512
+ .col-lg-11{
2513
+ width:91.66666667%
2514
+ }
2515
+
2516
+ .col-lg-10{
2517
+ width:83.33333333%
2518
+ }
2519
+
2520
+ .col-lg-9{
2521
+ width:75%
2522
+ }
2523
+
2524
+ .col-lg-8{
2525
+ width:66.66666667%
2526
+ }
2527
+
2528
+ .col-lg-7{
2529
+ width:58.33333333%
2530
+ }
2531
+
2532
+ .col-lg-6{
2533
+ width:50%
2534
+ }
2535
+
2536
+ .col-lg-5{
2537
+ width:41.66666667%
2538
+ }
2539
+
2540
+ .col-lg-4{
2541
+ width:33.33333333%
2542
+ }
2543
+
2544
+ .col-lg-3{
2545
+ width:25%
2546
+ }
2547
+
2548
+ .col-lg-2{
2549
+ width:16.66666667%
2550
+ }
2551
+
2552
+ .col-lg-1{
2553
+ width:8.33333333%
2554
+ }
2555
+
2556
+ .col-lg-pull-12{
2557
+ right:100%
2558
+ }
2559
+
2560
+ .col-lg-pull-11{
2561
+ right:91.66666667%
2562
+ }
2563
+
2564
+ .col-lg-pull-10{
2565
+ right:83.33333333%
2566
+ }
2567
+
2568
+ .col-lg-pull-9{
2569
+ right:75%
2570
+ }
2571
+
2572
+ .col-lg-pull-8{
2573
+ right:66.66666667%
2574
+ }
2575
+
2576
+ .col-lg-pull-7{
2577
+ right:58.33333333%
2578
+ }
2579
+
2580
+ .col-lg-pull-6{
2581
+ right:50%
2582
+ }
2583
+
2584
+ .col-lg-pull-5{
2585
+ right:41.66666667%
2586
+ }
2587
+
2588
+ .col-lg-pull-4{
2589
+ right:33.33333333%
2590
+ }
2591
+
2592
+ .col-lg-pull-3{
2593
+ right:25%
2594
+ }
2595
+
2596
+ .col-lg-pull-2{
2597
+ right:16.66666667%
2598
+ }
2599
+
2600
+ .col-lg-pull-1{
2601
+ right:8.33333333%
2602
+ }
2603
+
2604
+ .col-lg-pull-0{
2605
+ right:auto
2606
+ }
2607
+
2608
+ .col-lg-push-12{
2609
+ left:100%
2610
+ }
2611
+
2612
+ .col-lg-push-11{
2613
+ left:91.66666667%
2614
+ }
2615
+
2616
+ .col-lg-push-10{
2617
+ left:83.33333333%
2618
+ }
2619
+
2620
+ .col-lg-push-9{
2621
+ left:75%
2622
+ }
2623
+
2624
+ .col-lg-push-8{
2625
+ left:66.66666667%
2626
+ }
2627
+
2628
+ .col-lg-push-7{
2629
+ left:58.33333333%
2630
+ }
2631
+
2632
+ .col-lg-push-6{
2633
+ left:50%
2634
+ }
2635
+
2636
+ .col-lg-push-5{
2637
+ left:41.66666667%
2638
+ }
2639
+
2640
+ .col-lg-push-4{
2641
+ left:33.33333333%
2642
+ }
2643
+
2644
+ .col-lg-push-3{
2645
+ left:25%
2646
+ }
2647
+
2648
+ .col-lg-push-2{
2649
+ left:16.66666667%
2650
+ }
2651
+
2652
+ .col-lg-push-1{
2653
+ left:8.33333333%
2654
+ }
2655
+
2656
+ .col-lg-push-0{
2657
+ left:auto
2658
+ }
2659
+
2660
+ .col-lg-offset-12{
2661
+ margin-left:100%
2662
+ }
2663
+
2664
+ .col-lg-offset-11{
2665
+ margin-left:91.66666667%
2666
+ }
2667
+
2668
+ .col-lg-offset-10{
2669
+ margin-left:83.33333333%
2670
+ }
2671
+
2672
+ .col-lg-offset-9{
2673
+ margin-left:75%
2674
+ }
2675
+
2676
+ .col-lg-offset-8{
2677
+ margin-left:66.66666667%
2678
+ }
2679
+
2680
+ .col-lg-offset-7{
2681
+ margin-left:58.33333333%
2682
+ }
2683
+
2684
+ .col-lg-offset-6{
2685
+ margin-left:50%
2686
+ }
2687
+
2688
+ .col-lg-offset-5{
2689
+ margin-left:41.66666667%
2690
+ }
2691
+
2692
+ .col-lg-offset-4{
2693
+ margin-left:33.33333333%
2694
+ }
2695
+
2696
+ .col-lg-offset-3{
2697
+ margin-left:25%
2698
+ }
2699
+
2700
+ .col-lg-offset-2{
2701
+ margin-left:16.66666667%
2702
+ }
2703
+
2704
+ .col-lg-offset-1{
2705
+ margin-left:8.33333333%
2706
+ }
2707
+
2708
+ .col-lg-offset-0{
2709
+ margin-left:0
2710
+ }
2711
+
2712
+}
2713
+
2714
+table{
2715
+ background-color:transparent
2716
+}
2717
+
2718
+caption{
2719
+ padding-top:8px;
2720
+ padding-bottom:8px;
2721
+ color:#777;
2722
+ text-align:left
2723
+}
2724
+
2725
+th{
2726
+ text-align:left
2727
+}
2728
+
2729
+.table{
2730
+ width:100%;
2731
+ max-width:100%;
2732
+ margin-bottom:20px
2733
+}
2734
+
2735
+.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{
2736
+ padding:8px;
2737
+ line-height:1.42857143;
2738
+ vertical-align:top;
2739
+ border-top:1px solid #ddd
2740
+}
2741
+
2742
+.table>thead>tr>th{
2743
+ vertical-align:bottom;
2744
+ border-bottom:2px solid #ddd
2745
+}
2746
+
2747
+.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{
2748
+ border-top:0
2749
+}
2750
+
2751
+.table>tbody+tbody{
2752
+ border-top:2px solid #ddd
2753
+}
2754
+
2755
+.table .table{
2756
+ background-color:#fff
2757
+}
2758
+
2759
+.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{
2760
+ padding:5px
2761
+}
2762
+
2763
+.table-bordered{
2764
+ border:1px solid #ddd
2765
+}
2766
+
2767
+.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{
2768
+ border:1px solid #ddd
2769
+}
2770
+
2771
+.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{
2772
+ border-bottom-width:2px
2773
+}
2774
+
2775
+.table-striped>tbody>tr:nth-of-type(odd){
2776
+ background-color:#f9f9f9
2777
+}
2778
+
2779
+.table-hover>tbody>tr:hover{
2780
+ background-color:#f5f5f5
2781
+}
2782
+
2783
+table col[class*=col-]{
2784
+ position:static;
2785
+ display:table-column;
2786
+ float:none
2787
+}
2788
+
2789
+table td[class*=col-],table th[class*=col-]{
2790
+ position:static;
2791
+ display:table-cell;
2792
+ float:none
2793
+}
2794
+
2795
+.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{
2796
+ background-color:#f5f5f5
2797
+}
2798
+
2799
+.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{
2800
+ background-color:#e8e8e8
2801
+}
2802
+
2803
+.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{
2804
+ background-color:#dff0d8
2805
+}
2806
+
2807
+.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{
2808
+ background-color:#d0e9c6
2809
+}
2810
+
2811
+.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{
2812
+ background-color:#d9edf7
2813
+}
2814
+
2815
+.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{
2816
+ background-color:#c4e3f3
2817
+}
2818
+
2819
+.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{
2820
+ background-color:#fcf8e3
2821
+}
2822
+
2823
+.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{
2824
+ background-color:#faf2cc
2825
+}
2826
+
2827
+.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{
2828
+ background-color:#f2dede
2829
+}
2830
+
2831
+.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{
2832
+ background-color:#ebcccc
2833
+}
2834
+
2835
+.table-responsive{
2836
+ min-height:.01%;
2837
+ overflow-x:auto
2838
+}
2839
+
2840
+@media screen and (max-width:767px){
2841
+ .table-responsive{
2842
+ width:100%;
2843
+ margin-bottom:15px;
2844
+ overflow-y:hidden;
2845
+ -ms-overflow-style:-ms-autohiding-scrollbar;
2846
+ border:1px solid #ddd
2847
+ }
2848
+
2849
+ .table-responsive>.table{
2850
+ margin-bottom:0
2851
+ }
2852
+
2853
+ .table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{
2854
+ white-space:nowrap
2855
+ }
2856
+
2857
+ .table-responsive>.table-bordered{
2858
+ border:0
2859
+ }
2860
+
2861
+ .table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{
2862
+ border-left:0
2863
+ }
2864
+
2865
+ .table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{
2866
+ border-right:0
2867
+ }
2868
+
2869
+ .table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{
2870
+ border-bottom:0
2871
+ }
2872
+
2873
+}
2874
+
2875
+fieldset{
2876
+ min-width:0;
2877
+ padding:0;
2878
+ margin:0;
2879
+ border:0
2880
+}
2881
+
2882
+legend{
2883
+ display:block;
2884
+ width:100%;
2885
+ padding:0;
2886
+ margin-bottom:20px;
2887
+ font-size:21px;
2888
+ line-height:inherit;
2889
+ color:#333;
2890
+ border:0;
2891
+ border-bottom:1px solid #e5e5e5
2892
+}
2893
+
2894
+label{
2895
+ display:inline-block;
2896
+ max-width:100%;
2897
+ margin-bottom:5px;
2898
+ font-weight:700
2899
+}
2900
+
2901
+input[type=search]{
2902
+ -webkit-box-sizing:border-box;
2903
+ -moz-box-sizing:border-box;
2904
+ box-sizing:border-box
2905
+}
2906
+
2907
+input[type=checkbox],input[type=radio]{
2908
+ margin:4px 0 0;
2909
+ margin-top:1px\9;
2910
+ line-height:normal
2911
+}
2912
+
2913
+input[type=file]{
2914
+ display:block
2915
+}
2916
+
2917
+input[type=range]{
2918
+ display:block;
2919
+ width:100%
2920
+}
2921
+
2922
+select[multiple],select[size]{
2923
+ height:auto
2924
+}
2925
+
2926
+input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{
2927
+ outline:thin dotted;
2928
+ outline:5px auto -webkit-focus-ring-color;
2929
+ outline-offset:-2px
2930
+}
2931
+
2932
+output{
2933
+ display:block;
2934
+ padding-top:7px;
2935
+ font-size:14px;
2936
+ line-height:1.42857143;
2937
+ color:#555
2938
+}
2939
+
2940
+.form-control{
2941
+ display:block;
2942
+ width:100%;
2943
+ height:34px;
2944
+ padding:6px 12px;
2945
+ font-size:14px;
2946
+ line-height:1.42857143;
2947
+ color:#555;
2948
+ background-color:#fff;
2949
+ background-image:none;
2950
+ border:1px solid #ccc;
2951
+ border-radius:4px;
2952
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
2953
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
2954
+ -webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;
2955
+ -o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;
2956
+ transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s
2957
+}
2958
+
2959
+.form-control:focus{
2960
+ border-color:#66afe9;
2961
+ outline:0;
2962
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);
2963
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)
2964
+}
2965
+
2966
+.form-control::-moz-placeholder{
2967
+ color:#999;
2968
+ opacity:1
2969
+}
2970
+
2971
+.form-control:-ms-input-placeholder{
2972
+ color:#999
2973
+}
2974
+
2975
+.form-control::-webkit-input-placeholder{
2976
+ color:#999
2977
+}
2978
+
2979
+.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{
2980
+ background-color:#eee;
2981
+ opacity:1
2982
+}
2983
+
2984
+.form-control[disabled],fieldset[disabled] .form-control{
2985
+ cursor:not-allowed
2986
+}
2987
+
2988
+textarea.form-control{
2989
+ height:auto
2990
+}
2991
+
2992
+input[type=search]{
2993
+ -webkit-appearance:none
2994
+}
2995
+
2996
+@media screen and (-webkit-min-device-pixel-ratio:0){
2997
+ input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{
2998
+ line-height:34px
2999
+ }
3000
+
3001
+ .input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{
3002
+ line-height:30px
3003
+ }
3004
+
3005
+ .input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{
3006
+ line-height:46px
3007
+ }
3008
+
3009
+}
3010
+
3011
+.form-group{
3012
+ margin-bottom:15px
3013
+}
3014
+
3015
+.checkbox,.radio{
3016
+ position:relative;
3017
+ display:block;
3018
+ margin-top:10px;
3019
+ margin-bottom:10px
3020
+}
3021
+
3022
+.checkbox label,.radio label{
3023
+ min-height:20px;
3024
+ padding-left:20px;
3025
+ margin-bottom:0;
3026
+ font-weight:400;
3027
+ cursor:pointer
3028
+}
3029
+
3030
+.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{
3031
+ position:absolute;
3032
+ margin-top:4px\9;
3033
+ margin-left:-20px
3034
+}
3035
+
3036
+.checkbox+.checkbox,.radio+.radio{
3037
+ margin-top:-5px
3038
+}
3039
+
3040
+.checkbox-inline,.radio-inline{
3041
+ position:relative;
3042
+ display:inline-block;
3043
+ padding-left:20px;
3044
+ margin-bottom:0;
3045
+ font-weight:400;
3046
+ vertical-align:middle;
3047
+ cursor:pointer
3048
+}
3049
+
3050
+.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{
3051
+ margin-top:0;
3052
+ margin-left:10px
3053
+}
3054
+
3055
+fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{
3056
+ cursor:not-allowed
3057
+}
3058
+
3059
+.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{
3060
+ cursor:not-allowed
3061
+}
3062
+
3063
+.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{
3064
+ cursor:not-allowed
3065
+}
3066
+
3067
+.form-control-static{
3068
+ min-height:34px;
3069
+ padding-top:7px;
3070
+ padding-bottom:7px;
3071
+ margin-bottom:0
3072
+}
3073
+
3074
+.form-control-static.input-lg,.form-control-static.input-sm{
3075
+ padding-right:0;
3076
+ padding-left:0
3077
+}
3078
+
3079
+.input-sm{
3080
+ height:30px;
3081
+ padding:5px 10px;
3082
+ font-size:12px;
3083
+ line-height:1.5;
3084
+ border-radius:3px
3085
+}
3086
+
3087
+select.input-sm{
3088
+ height:30px;
3089
+ line-height:30px
3090
+}
3091
+
3092
+select[multiple].input-sm,textarea.input-sm{
3093
+ height:auto
3094
+}
3095
+
3096
+.form-group-sm .form-control{
3097
+ height:30px;
3098
+ padding:5px 10px;
3099
+ font-size:12px;
3100
+ line-height:1.5;
3101
+ border-radius:3px
3102
+}
3103
+
3104
+.form-group-sm select.form-control{
3105
+ height:30px;
3106
+ line-height:30px
3107
+}
3108
+
3109
+.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{
3110
+ height:auto
3111
+}
3112
+
3113
+.form-group-sm .form-control-static{
3114
+ height:30px;
3115
+ min-height:32px;
3116
+ padding:6px 10px;
3117
+ font-size:12px;
3118
+ line-height:1.5
3119
+}
3120
+
3121
+.input-lg{
3122
+ height:46px;
3123
+ padding:10px 16px;
3124
+ font-size:18px;
3125
+ line-height:1.3333333;
3126
+ border-radius:6px
3127
+}
3128
+
3129
+select.input-lg{
3130
+ height:46px;
3131
+ line-height:46px
3132
+}
3133
+
3134
+select[multiple].input-lg,textarea.input-lg{
3135
+ height:auto
3136
+}
3137
+
3138
+.form-group-lg .form-control{
3139
+ height:46px;
3140
+ padding:10px 16px;
3141
+ font-size:18px;
3142
+ line-height:1.3333333;
3143
+ border-radius:6px
3144
+}
3145
+
3146
+.form-group-lg select.form-control{
3147
+ height:46px;
3148
+ line-height:46px
3149
+}
3150
+
3151
+.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{
3152
+ height:auto
3153
+}
3154
+
3155
+.form-group-lg .form-control-static{
3156
+ height:46px;
3157
+ min-height:38px;
3158
+ padding:11px 16px;
3159
+ font-size:18px;
3160
+ line-height:1.3333333
3161
+}
3162
+
3163
+.has-feedback{
3164
+ position:relative
3165
+}
3166
+
3167
+.has-feedback .form-control{
3168
+ padding-right:42.5px
3169
+}
3170
+
3171
+.form-control-feedback{
3172
+ position:absolute;
3173
+ top:0;
3174
+ right:0;
3175
+ z-index:2;
3176
+ display:block;
3177
+ width:34px;
3178
+ height:34px;
3179
+ line-height:34px;
3180
+ text-align:center;
3181
+ pointer-events:none
3182
+}
3183
+
3184
+.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{
3185
+ width:46px;
3186
+ height:46px;
3187
+ line-height:46px
3188
+}
3189
+
3190
+.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{
3191
+ width:30px;
3192
+ height:30px;
3193
+ line-height:30px
3194
+}
3195
+
3196
+.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{
3197
+ color:#3c763d
3198
+}
3199
+
3200
+.has-success .form-control{
3201
+ border-color:#3c763d;
3202
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
3203
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075)
3204
+}
3205
+
3206
+.has-success .form-control:focus{
3207
+ border-color:#2b542c;
3208
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;
3209
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168
3210
+}
3211
+
3212
+.has-success .input-group-addon{
3213
+ color:#3c763d;
3214
+ background-color:#dff0d8;
3215
+ border-color:#3c763d
3216
+}
3217
+
3218
+.has-success .form-control-feedback{
3219
+ color:#3c763d
3220
+}
3221
+
3222
+.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{
3223
+ color:#8a6d3b
3224
+}
3225
+
3226
+.has-warning .form-control{
3227
+ border-color:#8a6d3b;
3228
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
3229
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075)
3230
+}
3231
+
3232
+.has-warning .form-control:focus{
3233
+ border-color:#66512c;
3234
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;
3235
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b
3236
+}
3237
+
3238
+.has-warning .input-group-addon{
3239
+ color:#8a6d3b;
3240
+ background-color:#fcf8e3;
3241
+ border-color:#8a6d3b
3242
+}
3243
+
3244
+.has-warning .form-control-feedback{
3245
+ color:#8a6d3b
3246
+}
3247
+
3248
+.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{
3249
+ color:#a94442
3250
+}
3251
+
3252
+.has-error .form-control{
3253
+ border-color:#a94442;
3254
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
3255
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075)
3256
+}
3257
+
3258
+.has-error .form-control:focus{
3259
+ border-color:#843534;
3260
+ -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;
3261
+ box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483
3262
+}
3263
+
3264
+.has-error .input-group-addon{
3265
+ color:#a94442;
3266
+ background-color:#f2dede;
3267
+ border-color:#a94442
3268
+}
3269
+
3270
+.has-error .form-control-feedback{
3271
+ color:#a94442
3272
+}
3273
+
3274
+.has-feedback label~.form-control-feedback{
3275
+ top:25px
3276
+}
3277
+
3278
+.has-feedback label.sr-only~.form-control-feedback{
3279
+ top:0
3280
+}
3281
+
3282
+.help-block{
3283
+ display:block;
3284
+ margin-top:5px;
3285
+ margin-bottom:10px;
3286
+ color:#737373
3287
+}
3288
+
3289
+@media (min-width:768px){
3290
+ .form-inline .form-group{
3291
+ display:inline-block;
3292
+ margin-bottom:0;
3293
+ vertical-align:middle
3294
+ }
3295
+
3296
+ .form-inline .form-control{
3297
+ display:inline-block;
3298
+ width:auto;
3299
+ vertical-align:middle
3300
+ }
3301
+
3302
+ .form-inline .form-control-static{
3303
+ display:inline-block
3304
+ }
3305
+
3306
+ .form-inline .input-group{
3307
+ display:inline-table;
3308
+ vertical-align:middle
3309
+ }
3310
+
3311
+ .form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{
3312
+ width:auto
3313
+ }
3314
+
3315
+ .form-inline .input-group>.form-control{
3316
+ width:100%
3317
+ }
3318
+
3319
+ .form-inline .control-label{
3320
+ margin-bottom:0;
3321
+ vertical-align:middle
3322
+ }
3323
+
3324
+ .form-inline .checkbox,.form-inline .radio{
3325
+ display:inline-block;
3326
+ margin-top:0;
3327
+ margin-bottom:0;
3328
+ vertical-align:middle
3329
+ }
3330
+
3331
+ .form-inline .checkbox label,.form-inline .radio label{
3332
+ padding-left:0
3333
+ }
3334
+
3335
+ .form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{
3336
+ position:relative;
3337
+ margin-left:0
3338
+ }
3339
+
3340
+ .form-inline .has-feedback .form-control-feedback{
3341
+ top:0
3342
+ }
3343
+
3344
+}
3345
+
3346
+.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{
3347
+ padding-top:7px;
3348
+ margin-top:0;
3349
+ margin-bottom:0
3350
+}
3351
+
3352
+.form-horizontal .checkbox,.form-horizontal .radio{
3353
+ min-height:27px
3354
+}
3355
+
3356
+.form-horizontal .form-group{
3357
+ margin-right:-15px;
3358
+ margin-left:-15px
3359
+}
3360
+
3361
+@media (min-width:768px){
3362
+ .form-horizontal .control-label{
3363
+ padding-top:7px;
3364
+ margin-bottom:0;
3365
+ text-align:right
3366
+ }
3367
+
3368
+}
3369
+
3370
+.form-horizontal .has-feedback .form-control-feedback{
3371
+ right:15px
3372
+}
3373
+
3374
+@media (min-width:768px){
3375
+ .form-horizontal .form-group-lg .control-label{
3376
+ padding-top:14.33px;
3377
+ font-size:18px
3378
+ }
3379
+
3380
+}
3381
+
3382
+@media (min-width:768px){
3383
+ .form-horizontal .form-group-sm .control-label{
3384
+ padding-top:6px;
3385
+ font-size:12px
3386
+ }
3387
+
3388
+}
3389
+
3390
+.btn{
3391
+ display:inline-block;
3392
+ padding:6px 12px;
3393
+ margin-bottom:0;
3394
+ font-size:14px;
3395
+ font-weight:400;
3396
+ line-height:1.42857143;
3397
+ text-align:center;
3398
+ white-space:nowrap;
3399
+ vertical-align:middle;
3400
+ -ms-touch-action:manipulation;
3401
+ touch-action:manipulation;
3402
+ cursor:pointer;
3403
+ -webkit-user-select:none;
3404
+ -moz-user-select:none;
3405
+ -ms-user-select:none;
3406
+ user-select:none;
3407
+ background-image:none;
3408
+ border:1px solid transparent;
3409
+ border-radius:4px
3410
+}
3411
+
3412
+.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{
3413
+ outline:thin dotted;
3414
+ outline:5px auto -webkit-focus-ring-color;
3415
+ outline-offset:-2px
3416
+}
3417
+
3418
+.btn.focus,.btn:focus,.btn:hover{
3419
+ color:#333;
3420
+ text-decoration:none
3421
+}
3422
+
3423
+.btn.active,.btn:active{
3424
+ background-image:none;
3425
+ outline:0;
3426
+ -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);
3427
+ box-shadow:inset 0 3px 5px rgba(0,0,0,.125)
3428
+}
3429
+
3430
+.btn.disabled,.btn[disabled],fieldset[disabled] .btn{
3431
+ cursor:not-allowed;
3432
+ filter:alpha(opacity=65);
3433
+ -webkit-box-shadow:none;
3434
+ box-shadow:none;
3435
+ opacity:.65
3436
+}
3437
+
3438
+a.btn.disabled,fieldset[disabled] a.btn{
3439
+ pointer-events:none
3440
+}
3441
+
3442
+.btn-default{
3443
+ color:#333;
3444
+ background-color:#fff;
3445
+ border-color:#ccc
3446
+}
3447
+
3448
+.btn-default.focus,.btn-default:focus{
3449
+ color:#333;
3450
+ background-color:#e6e6e6;
3451
+ border-color:#8c8c8c
3452
+}
3453
+
3454
+.btn-default:hover{
3455
+ color:#333;
3456
+ background-color:#e6e6e6;
3457
+ border-color:#adadad
3458
+}
3459
+
3460
+.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{
3461
+ color:#333;
3462
+ background-color:#e6e6e6;
3463
+ border-color:#adadad
3464
+}
3465
+
3466
+.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{
3467
+ color:#333;
3468
+ background-color:#d4d4d4;
3469
+ border-color:#8c8c8c
3470
+}
3471
+
3472
+.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{
3473
+ background-image:none
3474
+}
3475
+
3476
+.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{
3477
+ background-color:#fff;
3478
+ border-color:#ccc
3479
+}
3480
+
3481
+.btn-default .badge{
3482
+ color:#fff;
3483
+ background-color:#333
3484
+}
3485
+
3486
+.btn-primary{
3487
+ color:#fff;
3488
+ background-color:#337ab7;
3489
+ border-color:#2e6da4
3490
+}
3491
+
3492
+.btn-primary.focus,.btn-primary:focus{
3493
+ color:#fff;
3494
+ background-color:#286090;
3495
+ border-color:#122b40
3496
+}
3497
+
3498
+.btn-primary:hover{
3499
+ color:#fff;
3500
+ background-color:#286090;
3501
+ border-color:#204d74
3502
+}
3503
+
3504
+.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{
3505
+ color:#fff;
3506
+ background-color:#286090;
3507
+ border-color:#204d74
3508
+}
3509
+
3510
+.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{
3511
+ color:#fff;
3512
+ background-color:#204d74;
3513
+ border-color:#122b40
3514
+}
3515
+
3516
+.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{
3517
+ background-image:none
3518
+}
3519
+
3520
+.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{
3521
+ background-color:#337ab7;
3522
+ border-color:#2e6da4
3523
+}
3524
+
3525
+.btn-primary .badge{
3526
+ color:#337ab7;
3527
+ background-color:#fff
3528
+}
3529
+
3530
+.btn-success{
3531
+ color:#fff;
3532
+ background-color:#5cb85c;
3533
+ border-color:#4cae4c
3534
+}
3535
+
3536
+.btn-success.focus,.btn-success:focus{
3537
+ color:#fff;
3538
+ background-color:#449d44;
3539
+ border-color:#255625
3540
+}
3541
+
3542
+.btn-success:hover{
3543
+ color:#fff;
3544
+ background-color:#449d44;
3545
+ border-color:#398439
3546
+}
3547
+
3548
+.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{
3549
+ color:#fff;
3550
+ background-color:#449d44;
3551
+ border-color:#398439
3552
+}
3553
+
3554
+.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{
3555
+ color:#fff;
3556
+ background-color:#398439;
3557
+ border-color:#255625
3558
+}
3559
+
3560
+.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{
3561
+ background-image:none
3562
+}
3563
+
3564
+.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{
3565
+ background-color:#5cb85c;
3566
+ border-color:#4cae4c
3567
+}
3568
+
3569
+.btn-success .badge{
3570
+ color:#5cb85c;
3571
+ background-color:#fff
3572
+}
3573
+
3574
+.btn-info{
3575
+ color:#fff;
3576
+ background-color:#5bc0de;
3577
+ border-color:#46b8da
3578
+}
3579
+
3580
+.btn-info.focus,.btn-info:focus{
3581
+ color:#fff;
3582
+ background-color:#31b0d5;
3583
+ border-color:#1b6d85
3584
+}
3585
+
3586
+.btn-info:hover{
3587
+ color:#fff;
3588
+ background-color:#31b0d5;
3589
+ border-color:#269abc
3590
+}
3591
+
3592
+.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{
3593
+ color:#fff;
3594
+ background-color:#31b0d5;
3595
+ border-color:#269abc
3596
+}
3597
+
3598
+.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{
3599
+ color:#fff;
3600
+ background-color:#269abc;
3601
+ border-color:#1b6d85
3602
+}
3603
+
3604
+.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{
3605
+ background-image:none
3606
+}
3607
+
3608
+.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{
3609
+ background-color:#5bc0de;
3610
+ border-color:#46b8da
3611
+}
3612
+
3613
+.btn-info .badge{
3614
+ color:#5bc0de;
3615
+ background-color:#fff
3616
+}
3617
+
3618
+.btn-warning{
3619
+ color:#fff;
3620
+ background-color:#f0ad4e;
3621
+ border-color:#eea236
3622
+}
3623
+
3624
+.btn-warning.focus,.btn-warning:focus{
3625
+ color:#fff;
3626
+ background-color:#ec971f;
3627
+ border-color:#985f0d
3628
+}
3629
+
3630
+.btn-warning:hover{
3631
+ color:#fff;
3632
+ background-color:#ec971f;
3633
+ border-color:#d58512
3634
+}
3635
+
3636
+.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{
3637
+ color:#fff;
3638
+ background-color:#ec971f;
3639
+ border-color:#d58512
3640
+}
3641
+
3642
+.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{
3643
+ color:#fff;
3644
+ background-color:#d58512;
3645
+ border-color:#985f0d
3646
+}
3647
+
3648
+.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{
3649
+ background-image:none
3650
+}
3651
+
3652
+.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{
3653
+ background-color:#f0ad4e;
3654
+ border-color:#eea236
3655
+}
3656
+
3657
+.btn-warning .badge{
3658
+ color:#f0ad4e;
3659
+ background-color:#fff
3660
+}
3661
+
3662
+.btn-danger{
3663
+ color:#fff;
3664
+ background-color:#d9534f;
3665
+ border-color:#d43f3a
3666
+}
3667
+
3668
+.btn-danger.focus,.btn-danger:focus{
3669
+ color:#fff;
3670
+ background-color:#c9302c;
3671
+ border-color:#761c19
3672
+}
3673
+
3674
+.btn-danger:hover{
3675
+ color:#fff;
3676
+ background-color:#c9302c;
3677
+ border-color:#ac2925
3678
+}
3679
+
3680
+.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{
3681
+ color:#fff;
3682
+ background-color:#c9302c;
3683
+ border-color:#ac2925
3684
+}
3685
+
3686
+.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{
3687
+ color:#fff;
3688
+ background-color:#ac2925;
3689
+ border-color:#761c19
3690
+}
3691
+
3692
+.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{
3693
+ background-image:none
3694
+}
3695
+
3696
+.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{
3697
+ background-color:#d9534f;
3698
+ border-color:#d43f3a
3699
+}
3700
+
3701
+.btn-danger .badge{
3702
+ color:#d9534f;
3703
+ background-color:#fff
3704
+}
3705
+
3706
+.btn-link{
3707
+ font-weight:400;
3708
+ color:#337ab7;
3709
+ border-radius:0
3710
+}
3711
+
3712
+.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{
3713
+ background-color:transparent;
3714
+ -webkit-box-shadow:none;
3715
+ box-shadow:none
3716
+}
3717
+
3718
+.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{
3719
+ border-color:transparent
3720
+}
3721
+
3722
+.btn-link:focus,.btn-link:hover{
3723
+ color:#23527c;
3724
+ text-decoration:underline;
3725
+ background-color:transparent
3726
+}
3727
+
3728
+.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{
3729
+ color:#777;
3730
+ text-decoration:none
3731
+}
3732
+
3733
+.btn-group-lg>.btn,.btn-lg{
3734
+ padding:10px 16px;
3735
+ font-size:18px;
3736
+ line-height:1.3333333;
3737
+ border-radius:6px
3738
+}
3739
+
3740
+.btn-group-sm>.btn,.btn-sm{
3741
+ padding:5px 10px;
3742
+ font-size:12px;
3743
+ line-height:1.5;
3744
+ border-radius:3px
3745
+}
3746
+
3747
+.btn-group-xs>.btn,.btn-xs{
3748
+ padding:1px 5px;
3749
+ font-size:12px;
3750
+ line-height:1.5;
3751
+ border-radius:3px
3752
+}
3753
+
3754
+.btn-block{
3755
+ display:block;
3756
+ width:100%
3757
+}
3758
+
3759
+.btn-block+.btn-block{
3760
+ margin-top:5px
3761
+}
3762
+
3763
+input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{
3764
+ width:100%
3765
+}
3766
+
3767
+.fade{
3768
+ opacity:0;
3769
+ -webkit-transition:opacity .15s linear;
3770
+ -o-transition:opacity .15s linear;
3771
+ transition:opacity .15s linear
3772
+}
3773
+
3774
+.fade.in{
3775
+ opacity:1
3776
+}
3777
+
3778
+.collapse{
3779
+ display:none
3780
+}
3781
+
3782
+.collapse.in{
3783
+ display:block
3784
+}
3785
+
3786
+tr.collapse.in{
3787
+ display:table-row
3788
+}
3789
+
3790
+tbody.collapse.in{
3791
+ display:table-row-group
3792
+}
3793
+
3794
+.collapsing{
3795
+ position:relative;
3796
+ height:0;
3797
+ overflow:hidden;
3798
+ -webkit-transition-timing-function:ease;
3799
+ -o-transition-timing-function:ease;
3800
+ transition-timing-function:ease;
3801
+ -webkit-transition-duration:.35s;
3802
+ -o-transition-duration:.35s;
3803
+ transition-duration:.35s;
3804
+ -webkit-transition-property:height,visibility;
3805
+ -o-transition-property:height,visibility;
3806
+ transition-property:height,visibility
3807
+}
3808
+
3809
+.caret{
3810
+ display:inline-block;
3811
+ width:0;
3812
+ height:0;
3813
+ margin-left:2px;
3814
+ vertical-align:middle;
3815
+ border-top:4px dashed;
3816
+ border-top:4px solid\9;
3817
+ border-right:4px solid transparent;
3818
+ border-left:4px solid transparent
3819
+}
3820
+
3821
+.dropdown,.dropup{
3822
+ position:relative
3823
+}
3824
+
3825
+.dropdown-toggle:focus{
3826
+ outline:0
3827
+}
3828
+
3829
+.dropdown-menu{
3830
+ position:absolute;
3831
+ top:100%;
3832
+ left:0;
3833
+ z-index:1000;
3834
+ display:none;
3835
+ float:left;
3836
+ min-width:160px;
3837
+ padding:5px 0;
3838
+ margin:2px 0 0;
3839
+ font-size:14px;
3840
+ text-align:left;
3841
+ list-style:none;
3842
+ background-color:#fff;
3843
+ -webkit-background-clip:padding-box;
3844
+ background-clip:padding-box;
3845
+ border:1px solid #ccc;
3846
+ border:1px solid rgba(0,0,0,.15);
3847
+ border-radius:4px;
3848
+ -webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);
3849
+ box-shadow:0 6px 12px rgba(0,0,0,.175)
3850
+}
3851
+
3852
+.dropdown-menu.pull-right{
3853
+ right:0;
3854
+ left:auto
3855
+}
3856
+
3857
+.dropdown-menu .divider{
3858
+ height:1px;
3859
+ margin:9px 0;
3860
+ overflow:hidden;
3861
+ background-color:#e5e5e5
3862
+}
3863
+
3864
+.dropdown-menu>li>a{
3865
+ display:block;
3866
+ padding:3px 20px;
3867
+ clear:both;
3868
+ font-weight:400;
3869
+ line-height:1.42857143;
3870
+ color:#333;
3871
+ white-space:nowrap
3872
+}
3873
+
3874
+.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{
3875
+ color:#262626;
3876
+ text-decoration:none;
3877
+ background-color:#f5f5f5
3878
+}
3879
+
3880
+.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{
3881
+ color:#fff;
3882
+ text-decoration:none;
3883
+ background-color:#337ab7;
3884
+ outline:0
3885
+}
3886
+
3887
+.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{
3888
+ color:#777
3889
+}
3890
+
3891
+.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{
3892
+ text-decoration:none;
3893
+ cursor:not-allowed;
3894
+ background-color:transparent;
3895
+ background-image:none;
3896
+ filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)
3897
+}
3898
+
3899
+.open>.dropdown-menu{
3900
+ display:block
3901
+}
3902
+
3903
+.open>a{
3904
+ outline:0
3905
+}
3906
+
3907
+.dropdown-menu-right{
3908
+ right:0;
3909
+ left:auto
3910
+}
3911
+
3912
+.dropdown-menu-left{
3913
+ right:auto;
3914
+ left:0
3915
+}
3916
+
3917
+.dropdown-header{
3918
+ display:block;
3919
+ padding:3px 20px;
3920
+ font-size:12px;
3921
+ line-height:1.42857143;
3922
+ color:#777;
3923
+ white-space:nowrap
3924
+}
3925
+
3926
+.dropdown-backdrop{
3927
+ position:fixed;
3928
+ top:0;
3929
+ right:0;
3930
+ bottom:0;
3931
+ left:0;
3932
+ z-index:990
3933
+}
3934
+
3935
+.pull-right>.dropdown-menu{
3936
+ right:0;
3937
+ left:auto
3938
+}
3939
+
3940
+.dropup .caret,.navbar-fixed-bottom .dropdown .caret{
3941
+ content:"";
3942
+ border-top:0;
3943
+ border-bottom:4px dashed;
3944
+ border-bottom:4px solid\9
3945
+}
3946
+
3947
+.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{
3948
+ top:auto;
3949
+ bottom:100%;
3950
+ margin-bottom:2px
3951
+}
3952
+
3953
+@media (min-width:768px){
3954
+ .navbar-right .dropdown-menu{
3955
+ right:0;
3956
+ left:auto
3957
+ }
3958
+
3959
+ .navbar-right .dropdown-menu-left{
3960
+ right:auto;
3961
+ left:0
3962
+ }
3963
+
3964
+}
3965
+
3966
+.btn-group,.btn-group-vertical{
3967
+ position:relative;
3968
+ display:inline-block;
3969
+ vertical-align:middle
3970
+}
3971
+
3972
+.btn-group-vertical>.btn,.btn-group>.btn{
3973
+ position:relative;
3974
+ float:left
3975
+}
3976
+
3977
+.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{
3978
+ z-index:2
3979
+}
3980
+
3981
+.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{
3982
+ margin-left:-1px
3983
+}
3984
+
3985
+.btn-toolbar{
3986
+ margin-left:-5px
3987
+}
3988
+
3989
+.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{
3990
+ float:left
3991
+}
3992
+
3993
+.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{
3994
+ margin-left:5px
3995
+}
3996
+
3997
+.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){
3998
+ border-radius:0
3999
+}
4000
+
4001
+.btn-group>.btn:first-child{
4002
+ margin-left:0
4003
+}
4004
+
4005
+.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){
4006
+ border-top-right-radius:0;
4007
+ border-bottom-right-radius:0
4008
+}
4009
+
4010
+.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){
4011
+ border-top-left-radius:0;
4012
+ border-bottom-left-radius:0
4013
+}
4014
+
4015
+.btn-group>.btn-group{
4016
+ float:left
4017
+}
4018
+
4019
+.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{
4020
+ border-radius:0
4021
+}
4022
+
4023
+.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{
4024
+ border-top-right-radius:0;
4025
+ border-bottom-right-radius:0
4026
+}
4027
+
4028
+.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{
4029
+ border-top-left-radius:0;
4030
+ border-bottom-left-radius:0
4031
+}
4032
+
4033
+.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{
4034
+ outline:0
4035
+}
4036
+
4037
+.btn-group>.btn+.dropdown-toggle{
4038
+ padding-right:8px;
4039
+ padding-left:8px
4040
+}
4041
+
4042
+.btn-group>.btn-lg+.dropdown-toggle{
4043
+ padding-right:12px;
4044
+ padding-left:12px
4045
+}
4046
+
4047
+.btn-group.open .dropdown-toggle{
4048
+ -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);
4049
+ box-shadow:inset 0 3px 5px rgba(0,0,0,.125)
4050
+}
4051
+
4052
+.btn-group.open .dropdown-toggle.btn-link{
4053
+ -webkit-box-shadow:none;
4054
+ box-shadow:none
4055
+}
4056
+
4057
+.btn .caret{
4058
+ margin-left:0
4059
+}
4060
+
4061
+.btn-lg .caret{
4062
+ border-width:5px 5px 0;
4063
+ border-bottom-width:0
4064
+}
4065
+
4066
+.dropup .btn-lg .caret{
4067
+ border-width:0 5px 5px
4068
+}
4069
+
4070
+.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{
4071
+ display:block;
4072
+ float:none;
4073
+ width:100%;
4074
+ max-width:100%
4075
+}
4076
+
4077
+.btn-group-vertical>.btn-group>.btn{
4078
+ float:none
4079
+}
4080
+
4081
+.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{
4082
+ margin-top:-1px;
4083
+ margin-left:0
4084
+}
4085
+
4086
+.btn-group-vertical>.btn:not(:first-child):not(:last-child){
4087
+ border-radius:0
4088
+}
4089
+
4090
+.btn-group-vertical>.btn:first-child:not(:last-child){
4091
+ border-top-right-radius:4px;
4092
+ border-bottom-right-radius:0;
4093
+ border-bottom-left-radius:0
4094
+}
4095
+
4096
+.btn-group-vertical>.btn:last-child:not(:first-child){
4097
+ border-top-left-radius:0;
4098
+ border-top-right-radius:0;
4099
+ border-bottom-left-radius:4px
4100
+}
4101
+
4102
+.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{
4103
+ border-radius:0
4104
+}
4105
+
4106
+.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{
4107
+ border-bottom-right-radius:0;
4108
+ border-bottom-left-radius:0
4109
+}
4110
+
4111
+.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{
4112
+ border-top-left-radius:0;
4113
+ border-top-right-radius:0
4114
+}
4115
+
4116
+.btn-group-justified{
4117
+ display:table;
4118
+ width:100%;
4119
+ table-layout:fixed;
4120
+ border-collapse:separate
4121
+}
4122
+
4123
+.btn-group-justified>.btn,.btn-group-justified>.btn-group{
4124
+ display:table-cell;
4125
+ float:none;
4126
+ width:1%
4127
+}
4128
+
4129
+.btn-group-justified>.btn-group .btn{
4130
+ width:100%
4131
+}
4132
+
4133
+.btn-group-justified>.btn-group .dropdown-menu{
4134
+ left:auto
4135
+}
4136
+
4137
+[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{
4138
+ position:absolute;
4139
+ clip:rect(0,0,0,0);
4140
+ pointer-events:none
4141
+}
4142
+
4143
+.input-group{
4144
+ position:relative;
4145
+ display:table;
4146
+ border-collapse:separate
4147
+}
4148
+
4149
+.input-group[class*=col-]{
4150
+ float:none;
4151
+ padding-right:0;
4152
+ padding-left:0
4153
+}
4154
+
4155
+.input-group .form-control{
4156
+ position:relative;
4157
+ z-index:2;
4158
+ float:left;
4159
+ width:100%;
4160
+ margin-bottom:0
4161
+}
4162
+
4163
+.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{
4164
+ height:46px;
4165
+ padding:10px 16px;
4166
+ font-size:18px;
4167
+ line-height:1.3333333;
4168
+ border-radius:6px
4169
+}
4170
+
4171
+select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{
4172
+ height:46px;
4173
+ line-height:46px
4174
+}
4175
+
4176
+select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{
4177
+ height:auto
4178
+}
4179
+
4180
+.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{
4181
+ height:30px;
4182
+ padding:5px 10px;
4183
+ font-size:12px;
4184
+ line-height:1.5;
4185
+ border-radius:3px
4186
+}
4187
+
4188
+select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{
4189
+ height:30px;
4190
+ line-height:30px
4191
+}
4192
+
4193
+select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{
4194
+ height:auto
4195
+}
4196
+
4197
+.input-group .form-control,.input-group-addon,.input-group-btn{
4198
+ display:table-cell
4199
+}
4200
+
4201
+.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){
4202
+ border-radius:0
4203
+}
4204
+
4205
+.input-group-addon,.input-group-btn{
4206
+ width:1%;
4207
+ white-space:nowrap;
4208
+ vertical-align:middle
4209
+}
4210
+
4211
+.input-group-addon{
4212
+ padding:6px 12px;
4213
+ font-size:14px;
4214
+ font-weight:400;
4215
+ line-height:1;
4216
+ color:#555;
4217
+ text-align:center;
4218
+ background-color:#eee;
4219
+ border:1px solid #ccc;
4220
+ border-radius:4px
4221
+}
4222
+
4223
+.input-group-addon.input-sm{
4224
+ padding:5px 10px;
4225
+ font-size:12px;
4226
+ border-radius:3px
4227
+}
4228
+
4229
+.input-group-addon.input-lg{
4230
+ padding:10px 16px;
4231
+ font-size:18px;
4232
+ border-radius:6px
4233
+}
4234
+
4235
+.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{
4236
+ margin-top:0
4237
+}
4238
+
4239
+.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){
4240
+ border-top-right-radius:0;
4241
+ border-bottom-right-radius:0
4242
+}
4243
+
4244
+.input-group-addon:first-child{
4245
+ border-right:0
4246
+}
4247
+
4248
+.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{
4249
+ border-top-left-radius:0;
4250
+ border-bottom-left-radius:0
4251
+}
4252
+
4253
+.input-group-addon:last-child{
4254
+ border-left:0
4255
+}
4256
+
4257
+.input-group-btn{
4258
+ position:relative;
4259
+ font-size:0;
4260
+ white-space:nowrap
4261
+}
4262
+
4263
+.input-group-btn>.btn{
4264
+ position:relative
4265
+}
4266
+
4267
+.input-group-btn>.btn+.btn{
4268
+ margin-left:-1px
4269
+}
4270
+
4271
+.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{
4272
+ z-index:2
4273
+}
4274
+
4275
+.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{
4276
+ margin-right:-1px
4277
+}
4278
+
4279
+.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{
4280
+ z-index:2;
4281
+ margin-left:-1px
4282
+}
4283
+
4284
+.nav{
4285
+ padding-left:0;
4286
+ margin-bottom:0;
4287
+ list-style:none
4288
+}
4289
+
4290
+.nav>li{
4291
+ position:relative;
4292
+ display:block
4293
+}
4294
+
4295
+.nav>li>a{
4296
+ position:relative;
4297
+ display:block;
4298
+ padding:10px 15px
4299
+}
4300
+
4301
+.nav>li>a:focus,.nav>li>a:hover{
4302
+ text-decoration:none;
4303
+ background-color:#eee
4304
+}
4305
+
4306
+.nav>li.disabled>a{
4307
+ color:#777
4308
+}
4309
+
4310
+.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{
4311
+ color:#777;
4312
+ text-decoration:none;
4313
+ cursor:not-allowed;
4314
+ background-color:transparent
4315
+}
4316
+
4317
+.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{
4318
+ background-color:#eee;
4319
+ border-color:#337ab7
4320
+}
4321
+
4322
+.nav .nav-divider{
4323
+ height:1px;
4324
+ margin:9px 0;
4325
+ overflow:hidden;
4326
+ background-color:#e5e5e5
4327
+}
4328
+
4329
+.nav>li>a>img{
4330
+ max-width:none
4331
+}
4332
+
4333
+.nav-tabs{
4334
+ border-bottom:1px solid #ddd
4335
+}
4336
+
4337
+.nav-tabs>li{
4338
+ float:left;
4339
+ margin-bottom:-1px
4340
+}
4341
+
4342
+.nav-tabs>li>a{
4343
+ margin-right:2px;
4344
+ line-height:1.42857143;
4345
+ border:1px solid transparent;
4346
+ border-radius:4px 4px 0 0
4347
+}
4348
+
4349
+.nav-tabs>li>a:hover{
4350
+ border-color:#eee #eee #ddd
4351
+}
4352
+
4353
+.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{
4354
+ color:#555;
4355
+ cursor:default;
4356
+ background-color:#fff;
4357
+ border:1px solid #ddd;
4358
+ border-bottom-color:transparent
4359
+}
4360
+
4361
+.nav-tabs.nav-justified{
4362
+ width:100%;
4363
+ border-bottom:0
4364
+}
4365
+
4366
+.nav-tabs.nav-justified>li{
4367
+ float:none
4368
+}
4369
+
4370
+.nav-tabs.nav-justified>li>a{
4371
+ margin-bottom:5px;
4372
+ text-align:center
4373
+}
4374
+
4375
+.nav-tabs.nav-justified>.dropdown .dropdown-menu{
4376
+ top:auto;
4377
+ left:auto
4378
+}
4379
+
4380
+@media (min-width:768px){
4381
+ .nav-tabs.nav-justified>li{
4382
+ display:table-cell;
4383
+ width:1%
4384
+ }
4385
+
4386
+ .nav-tabs.nav-justified>li>a{
4387
+ margin-bottom:0
4388
+ }
4389
+
4390
+}
4391
+
4392
+.nav-tabs.nav-justified>li>a{
4393
+ margin-right:0;
4394
+ border-radius:4px
4395
+}
4396
+
4397
+.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{
4398
+ border:1px solid #ddd
4399
+}
4400
+
4401
+@media (min-width:768px){
4402
+ .nav-tabs.nav-justified>li>a{
4403
+ border-bottom:1px solid #ddd;
4404
+ border-radius:4px 4px 0 0
4405
+ }
4406
+
4407
+ .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{
4408
+ border-bottom-color:#fff
4409
+ }
4410
+
4411
+}
4412
+
4413
+.nav-pills>li{
4414
+ float:left
4415
+}
4416
+
4417
+.nav-pills>li>a{
4418
+ border-radius:4px
4419
+}
4420
+
4421
+.nav-pills>li+li{
4422
+ margin-left:2px
4423
+}
4424
+
4425
+.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{
4426
+ color:#fff;
4427
+ background-color:#337ab7
4428
+}
4429
+
4430
+.nav-stacked>li{
4431
+ float:none
4432
+}
4433
+
4434
+.nav-stacked>li+li{
4435
+ margin-top:2px;
4436
+ margin-left:0
4437
+}
4438
+
4439
+.nav-justified{
4440
+ width:100%
4441
+}
4442
+
4443
+.nav-justified>li{
4444
+ float:none
4445
+}
4446
+
4447
+.nav-justified>li>a{
4448
+ margin-bottom:5px;
4449
+ text-align:center
4450
+}
4451
+
4452
+.nav-justified>.dropdown .dropdown-menu{
4453
+ top:auto;
4454
+ left:auto
4455
+}
4456
+
4457
+@media (min-width:768px){
4458
+ .nav-justified>li{
4459
+ display:table-cell;
4460
+ width:1%
4461
+ }
4462
+
4463
+ .nav-justified>li>a{
4464
+ margin-bottom:0
4465
+ }
4466
+
4467
+}
4468
+
4469
+.nav-tabs-justified{
4470
+ border-bottom:0
4471
+}
4472
+
4473
+.nav-tabs-justified>li>a{
4474
+ margin-right:0;
4475
+ border-radius:4px
4476
+}
4477
+
4478
+.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{
4479
+ border:1px solid #ddd
4480
+}
4481
+
4482
+@media (min-width:768px){
4483
+ .nav-tabs-justified>li>a{
4484
+ border-bottom:1px solid #ddd;
4485
+ border-radius:4px 4px 0 0
4486
+ }
4487
+
4488
+ .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{
4489
+ border-bottom-color:#fff
4490
+ }
4491
+
4492
+}
4493
+
4494
+.tab-content>.tab-pane{
4495
+ display:none
4496
+}
4497
+
4498
+.tab-content>.active{
4499
+ display:block
4500
+}
4501
+
4502
+.nav-tabs .dropdown-menu{
4503
+ margin-top:-1px;
4504
+ border-top-left-radius:0;
4505
+ border-top-right-radius:0
4506
+}
4507
+
4508
+.navbar{
4509
+ position:relative;
4510
+ min-height:50px;
4511
+ margin-bottom:20px;
4512
+ border:1px solid transparent
4513
+}
4514
+
4515
+@media (min-width:768px){
4516
+ .navbar{
4517
+ border-radius:4px
4518
+ }
4519
+
4520
+}
4521
+
4522
+@media (min-width:768px){
4523
+ .navbar-header{
4524
+ float:left
4525
+ }
4526
+
4527
+}
4528
+
4529
+.navbar-collapse{
4530
+ padding-right:15px;
4531
+ padding-left:15px;
4532
+ overflow-x:visible;
4533
+ -webkit-overflow-scrolling:touch;
4534
+ border-top:1px solid transparent;
4535
+ -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);
4536
+ box-shadow:inset 0 1px 0 rgba(255,255,255,.1)
4537
+}
4538
+
4539
+.navbar-collapse.in{
4540
+ overflow-y:auto
4541
+}
4542
+
4543
+@media (min-width:768px){
4544
+ .navbar-collapse{
4545
+ width:auto;
4546
+ border-top:0;
4547
+ -webkit-box-shadow:none;
4548
+ box-shadow:none
4549
+ }
4550
+
4551
+ .navbar-collapse.collapse{
4552
+ display:block!important;
4553
+ height:auto!important;
4554
+ padding-bottom:0;
4555
+ overflow:visible!important
4556
+ }
4557
+
4558
+ .navbar-collapse.in{
4559
+ overflow-y:visible
4560
+ }
4561
+
4562
+ .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{
4563
+ padding-right:0;
4564
+ padding-left:0
4565
+ }
4566
+
4567
+}
4568
+
4569
+.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{
4570
+ max-height:340px
4571
+}
4572
+
4573
+@media (max-device-width:480px) and (orientation:landscape){
4574
+ .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{
4575
+ max-height:200px
4576
+ }
4577
+
4578
+}
4579
+
4580
+.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{
4581
+ margin-right:-15px;
4582
+ margin-left:-15px
4583
+}
4584
+
4585
+@media (min-width:768px){
4586
+ .container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{
4587
+ margin-right:0;
4588
+ margin-left:0
4589
+ }
4590
+
4591
+}
4592
+
4593
+.navbar-static-top{
4594
+ z-index:1000;
4595
+ border-width:0 0 1px
4596
+}
4597
+
4598
+@media (min-width:768px){
4599
+ .navbar-static-top{
4600
+ border-radius:0
4601
+ }
4602
+
4603
+}
4604
+
4605
+.navbar-fixed-bottom,.navbar-fixed-top{
4606
+ position:fixed;
4607
+ right:0;
4608
+ left:0;
4609
+ z-index:1030
4610
+}
4611
+
4612
+@media (min-width:768px){
4613
+ .navbar-fixed-bottom,.navbar-fixed-top{
4614
+ border-radius:0
4615
+ }
4616
+
4617
+}
4618
+
4619
+.navbar-fixed-top{
4620
+ top:0;
4621
+ border-width:0 0 1px
4622
+}
4623
+
4624
+.navbar-fixed-bottom{
4625
+ bottom:0;
4626
+ margin-bottom:0;
4627
+ border-width:1px 0 0
4628
+}
4629
+
4630
+.navbar-brand{
4631
+ float:left;
4632
+ height:50px;
4633
+ padding:15px 15px;
4634
+ font-size:18px;
4635
+ line-height:20px
4636
+}
4637
+
4638
+.navbar-brand:focus,.navbar-brand:hover{
4639
+ text-decoration:none
4640
+}
4641
+
4642
+.navbar-brand>img{
4643
+ display:block
4644
+}
4645
+
4646
+@media (min-width:768px){
4647
+ .navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{
4648
+ margin-left:-15px
4649
+ }
4650
+
4651
+}
4652
+
4653
+.navbar-toggle{
4654
+ position:relative;
4655
+ float:right;
4656
+ padding:9px 10px;
4657
+ margin-top:8px;
4658
+ margin-right:15px;
4659
+ margin-bottom:8px;
4660
+ background-color:transparent;
4661
+ background-image:none;
4662
+ border:1px solid transparent;
4663
+ border-radius:4px
4664
+}
4665
+
4666
+.navbar-toggle:focus{
4667
+ outline:0
4668
+}
4669
+
4670
+.navbar-toggle .icon-bar{
4671
+ display:block;
4672
+ width:22px;
4673
+ height:2px;
4674
+ border-radius:1px
4675
+}
4676
+
4677
+.navbar-toggle .icon-bar+.icon-bar{
4678
+ margin-top:4px
4679
+}
4680
+
4681
+@media (min-width:768px){
4682
+ .navbar-toggle{
4683
+ display:none
4684
+ }
4685
+
4686
+}
4687
+
4688
+.navbar-nav{
4689
+ margin:7.5px -15px
4690
+}
4691
+
4692
+.navbar-nav>li>a{
4693
+ padding-top:10px;
4694
+ padding-bottom:10px;
4695
+ line-height:20px
4696
+}
4697
+
4698
+@media (max-width:767px){
4699
+ .navbar-nav .open .dropdown-menu{
4700
+ position:static;
4701
+ float:none;
4702
+ width:auto;
4703
+ margin-top:0;
4704
+ background-color:transparent;
4705
+ border:0;
4706
+ -webkit-box-shadow:none;
4707
+ box-shadow:none
4708
+ }
4709
+
4710
+ .navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{
4711
+ padding:5px 15px 5px 25px
4712
+ }
4713
+
4714
+ .navbar-nav .open .dropdown-menu>li>a{
4715
+ line-height:20px
4716
+ }
4717
+
4718
+ .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{
4719
+ background-image:none
4720
+ }
4721
+
4722
+}
4723
+
4724
+@media (min-width:768px){
4725
+ .navbar-nav{
4726
+ float:left;
4727
+ margin:0
4728
+ }
4729
+
4730
+ .navbar-nav>li{
4731
+ float:left
4732
+ }
4733
+
4734
+ .navbar-nav>li>a{
4735
+ padding-top:15px;
4736
+ padding-bottom:15px
4737
+ }
4738
+
4739
+}
4740
+
4741
+.navbar-form{
4742
+ padding:10px 15px;
4743
+ margin-top:8px;
4744
+ margin-right:-15px;
4745
+ margin-bottom:8px;
4746
+ margin-left:-15px;
4747
+ border-top:1px solid transparent;
4748
+ border-bottom:1px solid transparent;
4749
+ -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);
4750
+ box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)
4751
+}
4752
+
4753
+@media (min-width:768px){
4754
+ .navbar-form .form-group{
4755
+ display:inline-block;
4756
+ margin-bottom:0;
4757
+ vertical-align:middle
4758
+ }
4759
+
4760
+ .navbar-form .form-control{
4761
+ display:inline-block;
4762
+ width:auto;
4763
+ vertical-align:middle
4764
+ }
4765
+
4766
+ .navbar-form .form-control-static{
4767
+ display:inline-block
4768
+ }
4769
+
4770
+ .navbar-form .input-group{
4771
+ display:inline-table;
4772
+ vertical-align:middle
4773
+ }
4774
+
4775
+ .navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{
4776
+ width:auto
4777
+ }
4778
+
4779
+ .navbar-form .input-group>.form-control{
4780
+ width:100%
4781
+ }
4782
+
4783
+ .navbar-form .control-label{
4784
+ margin-bottom:0;
4785
+ vertical-align:middle
4786
+ }
4787
+
4788
+ .navbar-form .checkbox,.navbar-form .radio{
4789
+ display:inline-block;
4790
+ margin-top:0;
4791
+ margin-bottom:0;
4792
+ vertical-align:middle
4793
+ }
4794
+
4795
+ .navbar-form .checkbox label,.navbar-form .radio label{
4796
+ padding-left:0
4797
+ }
4798
+
4799
+ .navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{
4800
+ position:relative;
4801
+ margin-left:0
4802
+ }
4803
+
4804
+ .navbar-form .has-feedback .form-control-feedback{
4805
+ top:0
4806
+ }
4807
+
4808
+}
4809
+
4810
+@media (max-width:767px){
4811
+ .navbar-form .form-group{
4812
+ margin-bottom:5px
4813
+ }
4814
+
4815
+ .navbar-form .form-group:last-child{
4816
+ margin-bottom:0
4817
+ }
4818
+
4819
+}
4820
+
4821
+@media (min-width:768px){
4822
+ .navbar-form{
4823
+ width:auto;
4824
+ padding-top:0;
4825
+ padding-bottom:0;
4826
+ margin-right:0;
4827
+ margin-left:0;
4828
+ border:0;
4829
+ -webkit-box-shadow:none;
4830
+ box-shadow:none
4831
+ }
4832
+
4833
+}
4834
+
4835
+.navbar-nav>li>.dropdown-menu{
4836
+ margin-top:0;
4837
+ border-top-left-radius:0;
4838
+ border-top-right-radius:0
4839
+}
4840
+
4841
+.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{
4842
+ margin-bottom:0;
4843
+ border-top-left-radius:4px;
4844
+ border-top-right-radius:4px;
4845
+ border-bottom-right-radius:0;
4846
+ border-bottom-left-radius:0
4847
+}
4848
+
4849
+.navbar-btn{
4850
+ margin-top:8px;
4851
+ margin-bottom:8px
4852
+}
4853
+
4854
+.navbar-btn.btn-sm{
4855
+ margin-top:10px;
4856
+ margin-bottom:10px
4857
+}
4858
+
4859
+.navbar-btn.btn-xs{
4860
+ margin-top:14px;
4861
+ margin-bottom:14px
4862
+}
4863
+
4864
+.navbar-text{
4865
+ margin-top:15px;
4866
+ margin-bottom:15px
4867
+}
4868
+
4869
+@media (min-width:768px){
4870
+ .navbar-text{
4871
+ float:left;
4872
+ margin-right:15px;
4873
+ margin-left:15px
4874
+ }
4875
+
4876
+}
4877
+
4878
+@media (min-width:768px){
4879
+ .navbar-left{
4880
+ float:left!important
4881
+ }
4882
+
4883
+ .navbar-right{
4884
+ float:right!important;
4885
+ margin-right:-15px
4886
+ }
4887
+
4888
+ .navbar-right~.navbar-right{
4889
+ margin-right:0
4890
+ }
4891
+
4892
+}
4893
+
4894
+.navbar-default{
4895
+ background-color:#f8f8f8;
4896
+ border-color:#e7e7e7
4897
+}
4898
+
4899
+.navbar-default .navbar-brand{
4900
+ color:#777
4901
+}
4902
+
4903
+.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{
4904
+ color:#5e5e5e;
4905
+ background-color:transparent
4906
+}
4907
+
4908
+.navbar-default .navbar-text{
4909
+ color:#777
4910
+}
4911
+
4912
+.navbar-default .navbar-nav>li>a{
4913
+ color:#777
4914
+}
4915
+
4916
+.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{
4917
+ color:#333;
4918
+ background-color:transparent
4919
+}
4920
+
4921
+.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{
4922
+ color:#555;
4923
+ background-color:#e7e7e7
4924
+}
4925
+
4926
+.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{
4927
+ color:#ccc;
4928
+ background-color:transparent
4929
+}
4930
+
4931
+.navbar-default .navbar-toggle{
4932
+ border-color:#ddd
4933
+}
4934
+
4935
+.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{
4936
+ background-color:#ddd
4937
+}
4938
+
4939
+.navbar-default .navbar-toggle .icon-bar{
4940
+ background-color:#888
4941
+}
4942
+
4943
+.navbar-default .navbar-collapse,.navbar-default .navbar-form{
4944
+ border-color:#e7e7e7
4945
+}
4946
+
4947
+.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{
4948
+ color:#555;
4949
+ background-color:#e7e7e7
4950
+}
4951
+
4952
+@media (max-width:767px){
4953
+ .navbar-default .navbar-nav .open .dropdown-menu>li>a{
4954
+ color:#777
4955
+ }
4956
+
4957
+ .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{
4958
+ color:#333;
4959
+ background-color:transparent
4960
+ }
4961
+
4962
+ .navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{
4963
+ color:#555;
4964
+ background-color:#e7e7e7
4965
+ }
4966
+
4967
+ .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{
4968
+ color:#ccc;
4969
+ background-color:transparent
4970
+ }
4971
+
4972
+}
4973
+
4974
+.navbar-default .navbar-link{
4975
+ color:#777
4976
+}
4977
+
4978
+.navbar-default .navbar-link:hover{
4979
+ color:#333
4980
+}
4981
+
4982
+.navbar-default .btn-link{
4983
+ color:#777
4984
+}
4985
+
4986
+.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{
4987
+ color:#333
4988
+}
4989
+
4990
+.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{
4991
+ color:#ccc
4992
+}
4993
+
4994
+.navbar-inverse{
4995
+ background-color:#222;
4996
+ border-color:#080808
4997
+}
4998
+
4999
+.navbar-inverse .navbar-brand{
This file is too large to show in full.
public/mstsc/css/signin.css
new
+46
@@ -0,0 +1,46 @@
1
+body {
2
+ overflow:hidden;
3
+}
4
+
5
+.form-signin {
6
+ max-width: 330px;
7
+ padding: 15px;
8
+ margin: 0 auto;
9
+}
10
+.form-signin .form-signin-heading,
11
+.form-signin .checkbox {
12
+ margin-bottom: 10px;
13
+}
14
+.form-signin .checkbox {
15
+ font-weight: normal;
16
+}
17
+.form-signin .form-control {
18
+ position: relative;
19
+ height: auto;
20
+ -webkit-box-sizing: border-box;
21
+ -moz-box-sizing: border-box;
22
+ box-sizing: border-box;
23
+ padding: 10px;
24
+ font-size: 16px;
25
+}
26
+.form-signin .form-control:focus {
27
+ z-index: 2;
28
+}
29
+.form-signin input[type="text"] {
30
+ margin-bottom: -1px;
31
+ border-bottom-right-radius: 0;
32
+ border-bottom-left-radius: 0;
33
+}
34
+.form-signin input[type="password"] {
35
+ margin-bottom: 10px;
36
+ border-top-left-radius: 0;
37
+ border-top-right-radius: 0;
38
+}
39
+
40
+.logo {
41
+ width : 200px;
42
+ margin-left : auto;
43
+ margin-right : auto;
44
+ display : block;
45
+ margin-bottom: 10px;
46
+}
public/mstsc/index.html
new
+65
@@ -0,0 +1,65 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+<head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
8
+ <meta name="description" content="">
9
+ <meta name="author" content="">
10
+ <link rel="icon" href="/favicon.ico">
11
+ <title>RDP</title>
12
+ <!-- Bootstrap core CSS -->
13
+ <link href="./css/bootstrap.min.css" rel="stylesheet">
14
+ <!-- Custom styles for this template -->
15
+ <link href="./css/signin.css" rel="stylesheet">
16
+ <script type="text/javascript" src="./js/mstsc.js"></script>
17
+ <script type="text/javascript" src="./js/mstsc.js"></script>
18
+ <script type="text/javascript" src="./js/keyboard.js"></script>
19
+ <script type="text/javascript" src="./js/rle.js"></script>
20
+ <script type="text/javascript" src="./js/client.js"></script>
21
+ <script type="text/javascript" src="./js/canvas.js"></script>
22
+ <script language="javascript">
23
+ var client = null;
24
+ var urlargs = parseUriArgs();
25
+ if (urlargs.name) { document.title = urlargs.name + ' - ' + document.title; }
26
+ console.log(urlargs.ws);
27
+
28
+ function load(canvas) {
29
+ client = Mstsc.client.create(Mstsc.$(canvas));
30
+ }
31
+
32
+ function connect(domain, username, password) {
33
+ Mstsc.$("main").style.display = 'none';
34
+ var canvas = Mstsc.$("myCanvas");
35
+ canvas.style.display = 'inline';
36
+ canvas.width = window.innerWidth;
37
+ canvas.height = window.innerHeight;
38
+ client.connect(urlargs.ws, domain, username, password, function (err) {
39
+ Mstsc.$("myCanvas").style.display = 'none';
40
+ Mstsc.$("main").style.display = 'inline';
41
+ });
42
+ }
43
+
44
+ function parseUriArgs() { var href = window.document.location.href; if (href.endsWith('#')) { href = href.substring(0, href.length - 1); } var name, r = {}, parsedUri = href.split(/[\?&|\=]/); parsedUri.splice(0, 1); for (x in parsedUri) { switch (x % 2) { case 0: { name = decodeURIComponent(parsedUri[x]); break; } case 1: { r[name] = decodeURIComponent(parsedUri[x]); var x = parseInt(r[name]); if (x == r[name]) { r[name] = x; } break; } default: { break; } } } return r; }
45
+ </script>
46
+</head>
47
+<body onload='load("myCanvas")'>
48
+ <div id="main" class="container">
49
+ <form class="form-signin" onSubmit="connect(this.elements['inputDomain'].value, this.elements['inputUsername'].value, this.elements['inputPassword'].value);return false;">
50
+ <!--<img class='logo' src="./img/mstsc.js.svg"></img>-->
51
+ <!--<label for="inputIpAddress" class="sr-only">IP Address</label>-->
52
+ <!--<input type="text" id="inputIpAddress" class="form-control" placeholder="IP Address" required autofocus>-->
53
+ <label for="inputDomain" class="sr-only">Domain</label>
54
+ <input type="text" id="inputDomain" class="form-control" placeholder="Domain">
55
+ <label for="inputUsername" class="sr-only">Username</label>
56
+ <input type="text" id="inputUsername" class="form-control" placeholder="Username">
57
+ <label for="inputPassword" class="sr-only">Password</label>
58
+ <input type="password" id="inputPassword" class="form-control" placeholder="Password">
59
+
60
+ <button class="btn btn-lg btn-primary btn-block" type="submit" style="background-color: #34A6FF; border-color: #34A6FF">Connect</button>
61
+ </form>
62
+ </div> <!-- /container -->
63
+ <canvas id="myCanvas" style="display:none">
64
+</body>
65
+</html>
public/mstsc/js/canvas.js
new
+116
@@ -0,0 +1,116 @@
1
+/*
2
+ * Copyright (c) 2015 Sylvain Peyrefitte
3
+ *
4
+ * This file is part of mstsc.js.
5
+ *
6
+ * mstsc.js is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+(function() {
21
+
22
+ /**
23
+ * decompress bitmap from RLE algorithm
24
+ * @param bitmap {object} bitmap object of bitmap event of node-rdpjs
25
+ */
26
+ function decompress (bitmap) {
27
+ var fName = null;
28
+ switch (bitmap.bitsPerPixel) {
29
+ case 15:
30
+ fName = 'bitmap_decompress_15';
31
+ break;
32
+ case 16:
33
+ fName = 'bitmap_decompress_16';
34
+ break;
35
+ case 24:
36
+ fName = 'bitmap_decompress_24';
37
+ break;
38
+ case 32:
39
+ fName = 'bitmap_decompress_32';
40
+ break;
41
+ default:
42
+ throw 'invalid bitmap data format';
43
+ }
44
+
45
+ var input = new Uint8Array(bitmap.data);
46
+ var inputPtr = Module._malloc(input.length);
47
+ var inputHeap = new Uint8Array(Module.HEAPU8.buffer, inputPtr, input.length);
48
+ inputHeap.set(input);
49
+
50
+ var output_width = bitmap.destRight - bitmap.destLeft + 1;
51
+ var output_height = bitmap.destBottom - bitmap.destTop + 1;
52
+ var ouputSize = output_width * output_height * 4;
53
+ var outputPtr = Module._malloc(ouputSize);
54
+
55
+ var outputHeap = new Uint8Array(Module.HEAPU8.buffer, outputPtr, ouputSize);
56
+
57
+ var res = Module.ccall(fName,
58
+ 'number',
59
+ ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],
60
+ [outputHeap.byteOffset, output_width, output_height, bitmap.width, bitmap.height, inputHeap.byteOffset, input.length]
61
+ );
62
+
63
+ var output = new Uint8ClampedArray(outputHeap.buffer, outputHeap.byteOffset, ouputSize);
64
+
65
+ Module._free(inputPtr);
66
+ Module._free(outputPtr);
67
+
68
+ return { width : output_width, height : output_height, data : output };
69
+ }
70
+
71
+ /**
72
+ * Un compress bitmap are reverse in y axis
73
+ */
74
+ function reverse (bitmap) {
75
+ return { width : bitmap.width, height : bitmap.height, data : new Uint8ClampedArray(bitmap.data) };
76
+ }
77
+
78
+ /**
79
+ * Canvas renderer
80
+ * @param canvas {canvas} use for rendering
81
+ */
82
+ function Canvas(canvas) {
83
+ this.canvas = canvas;
84
+ this.ctx = canvas.getContext("2d");
85
+ }
86
+
87
+ Canvas.prototype = {
88
+ /**
89
+ * update canvas with new bitmap
90
+ * @param bitmap {object}
91
+ */
92
+ update : function (bitmap) {
93
+ var output = null;
94
+ if (bitmap.isCompress) {
95
+ output = decompress(bitmap);
96
+ }
97
+ else {
98
+ output = reverse(bitmap);
99
+ }
100
+
101
+ // use image data to use asm.js
102
+ var imageData = this.ctx.createImageData(output.width, output.height);
103
+ imageData.data.set(output.data);
104
+ this.ctx.putImageData(imageData, bitmap.destLeft, bitmap.destTop);
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Module export
110
+ */
111
+ Mstsc.Canvas = {
112
+ create : function (canvas) {
113
+ return new Canvas(canvas);
114
+ }
115
+ }
116
+})();
public/mstsc/js/client.js
new
+186
@@ -0,0 +1,186 @@
1
+/*
2
+ * Copyright (c) 2015 Sylvain Peyrefitte
3
+ *
4
+ * This file is part of mstsc.js.
5
+ *
6
+ * mstsc.js is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+(function() {
21
+ /**
22
+ * Mouse button mapping
23
+ * @param button {integer} client button number
24
+ */
25
+ function mouseButtonMap(button) {
26
+ switch(button) {
27
+ case 0: return 1;
28
+ case 2: return 2;
29
+ default: return 0;
30
+ }
31
+ };
32
+
33
+ /**
34
+ * Mstsc client
35
+ * Input client connection (mouse and keyboard)
36
+ * bitmap processing
37
+ * @param canvas {canvas} rendering element
38
+ */
39
+ function Client(canvas) {
40
+ this.canvas = canvas;
41
+ // create renderer
42
+ this.render = new Mstsc.Canvas.create(this.canvas);
43
+ this.socket = null;
44
+ this.activeSession = false;
45
+ this.install();
46
+ }
47
+
48
+ Client.prototype = {
49
+ install : function () {
50
+ var self = this;
51
+
52
+ // Bind mouse move event
53
+ this.canvas.addEventListener('mousemove', function (e) {
54
+ if (!self.socket || !self.activeSession) return;
55
+ var offset = Mstsc.elementOffset(self.canvas);
56
+ self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, 0, false]));
57
+ e.preventDefault();
58
+ return false;
59
+ });
60
+ this.canvas.addEventListener('mousedown', function (e) {
61
+ if (!self.socket || !self.activeSession) return;
62
+
63
+ var offset = Mstsc.elementOffset(self.canvas);
64
+ self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, mouseButtonMap(e.button), true]));
65
+ e.preventDefault();
66
+ return false;
67
+ });
68
+ this.canvas.addEventListener('mouseup', function (e) {
69
+ if (!self.socket || !self.activeSession) return;
70
+
71
+ var offset = Mstsc.elementOffset(self.canvas);
72
+ self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, mouseButtonMap(e.button), false]));
73
+ e.preventDefault();
74
+ return false;
75
+ });
76
+ this.canvas.addEventListener('contextmenu', function (e) {
77
+ if (!self.socket || !self.activeSession) return;
78
+ var offset = Mstsc.elementOffset(self.canvas);
79
+ self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, mouseButtonMap(e.button), false]));
80
+ e.preventDefault();
81
+ return false;
82
+ });
83
+ this.canvas.addEventListener('DOMMouseScroll', function (e) {
84
+ if (!self.socket || !self.activeSession) return;
85
+ var isHorizontal = false;
86
+ var delta = e.detail;
87
+ var step = Math.round(Math.abs(delta) * 15 / 8);
88
+ var offset = Mstsc.elementOffset(self.canvas);
89
+ self.socket.send(JSON.stringify(['wheel', e.clientX - offset.left, e.clientY - offset.top, step, delta > 0, isHorizontal]));
90
+ e.preventDefault();
91
+ return false;
92
+ });
93
+ this.canvas.addEventListener('mousewheel', function (e) {
94
+ if (!self.socket || !self.activeSession) return;
95
+ var isHorizontal = Math.abs(e.deltaX) > Math.abs(e.deltaY);
96
+ var delta = isHorizontal?e.deltaX:e.deltaY;
97
+ var step = Math.round(Math.abs(delta) * 15 / 8);
98
+ var offset = Mstsc.elementOffset(self.canvas);
99
+ self.socket.send(JSON.stringify(['wheel', e.clientX - offset.left, e.clientY - offset.top, step, delta > 0, isHorizontal]));
100
+ e.preventDefault();
101
+ return false;
102
+ });
103
+
104
+ // Bind keyboard event
105
+ window.addEventListener('keydown', function (e) {
106
+ if (!self.socket || !self.activeSession) return;
107
+ self.socket.send(JSON.stringify(['scancode', Mstsc.scancode(e), true]));
108
+ e.preventDefault();
109
+ return false;
110
+ });
111
+ window.addEventListener('keyup', function (e) {
112
+ if (!self.socket || !self.activeSession) return;
113
+ self.socket.send(JSON.stringify(['scancode', Mstsc.scancode(e), false]));
114
+ e.preventDefault();
115
+ return false;
116
+ });
117
+
118
+ return this;
119
+ },
120
+ /**
121
+ * connect
122
+ * @param ip {string} ip target for rdp
123
+ * @param domain {string} microsoft domain
124
+ * @param username {string} session username
125
+ * @param password {string} session password
126
+ * @param next {function} asynchrone end callback
127
+ */
128
+ connect : function (ip, domain, username, password, next) {
129
+ // start connection
130
+ var self = this;
131
+ this.socket = new WebSocket("wss://" + window.location.host + "/mstsc/relay.ashx");
132
+ this.socket.onopen = function () {
133
+ console.log("WS-OPEN");
134
+ self.socket.send(JSON.stringify(['infos', {
135
+ ip: ip,
136
+ port: 3389,
137
+ screen: {
138
+ width: self.canvas.width,
139
+ height: self.canvas.height
140
+ },
141
+ domain: domain,
142
+ username: username,
143
+ password: password,
144
+ locale: Mstsc.locale()
145
+ }]));
146
+ };
147
+ this.socket.onmessage = function (evt) {
148
+ var msg = JSON.parse(evt.data);
149
+ switch (msg[0]) {
150
+ case 'rdp-connect': {
151
+ //console.log('[mstsc.js] connected');
152
+ self.activeSession = true;
153
+ break;
154
+ }
155
+ case 'rdp-bitmap': {
156
+ var bitmap = msg[1];
157
+ bitmap.data = new Uint8Array(bitmap.data.data).buffer;
158
+ //console.log('[mstsc.js] bitmap update bpp : ' + bitmap.bitsPerPixel);
159
+ self.render.update(bitmap);
160
+ break;
161
+ }
162
+ case 'rdp-close': {
163
+ //console.log('[mstsc.js] close');
164
+ self.activeSession = false;
165
+ next(null);
166
+ break;
167
+ }
168
+ case 'rdp-error': {
169
+ var err = msg[1];
170
+ console.log('[mstsc.js] error : ' + err.code + '(' + err.message + ')');
171
+ self.activeSession = false;
172
+ next(err);
173
+ break;
174
+ }
175
+ }
176
+ };
177
+ this.socket.onclose = function () {
178
+ console.log("WS-CLOSE");
179
+ self.activeSession = false;
180
+ next(null);
181
+ };
182
+ }
183
+ }
184
+
185
+ Mstsc.client = { create : function (canvas) { return new Client(canvas); } }
186
+})();
public/mstsc/js/keyboard.js
new
+510
@@ -0,0 +1,510 @@
1
+/*
2
+ * Copyright (c) 2015 Sylvain Peyrefitte
3
+ *
4
+ * This file is part of mstsc.js.
5
+ *
6
+ * mstsc.js is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+(function() {
21
+ // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
22
+ var KeyMap = {
23
+ "" : 0x0000,
24
+ "Escape" : 0x0001,
25
+ "Digit1" : 0x0002,
26
+ "Digit2" : 0x0003,
27
+ "Digit3" : 0x0004,
28
+ "Digit4" : 0x0005,
29
+ "Digit5" : 0x0006,
30
+ "Digit6" : 0x0007,
31
+ "Digit7" : 0x0008,
32
+ "Digit8" : 0x0009,
33
+ "Digit9" : 0x000A,
34
+ "Digit0" : 0x000B,
35
+ "Minus" : 0x000C,
36
+ "Equal" : 0x000D,
37
+ "Backspace" : 0x000E,
38
+ "Tab" : 0x000F,
39
+ "KeyQ" : 0x0010,
40
+ "KeyW" : 0x0011,
41
+ "KeyE" : 0x0012,
42
+ "KeyR" : 0x0013,
43
+ "KeyT" : 0x0014,
44
+ "KeyY" : 0x0015,
45
+ "KeyU" : 0x0016,
46
+ "KeyI" : 0x0017,
47
+ "KeyO" : 0x0018,
48
+ "KeyP" : 0x0019,
49
+ "BracketLeft" : 0x001A,
50
+ "BracketRight" : 0x001B,
51
+ "Enter" : 0x001C,
52
+ "ControlLeft" : 0x001D,
53
+ "KeyA" : 0x001E,
54
+ "KeyS" : 0x001F,
55
+ "KeyD" : 0x0020,
56
+ "KeyF" : 0x0021,
57
+ "KeyG" : 0x0022,
58
+ "KeyH" : 0x0023,
59
+ "KeyJ" : 0x0024,
60
+ "KeyK" : 0x0025,
61
+ "KeyL" : 0x0026,
62
+ "Semicolon" : 0x0027,
63
+ "Quote" : 0x0028,
64
+ "Backquote" : 0x0029,
65
+ "ShiftLeft" : 0x002A,
66
+ "Backslash" : 0x002B,
67
+ "KeyZ" : 0x002C,
68
+ "KeyX" : 0x002D,
69
+ "KeyC" : 0x002E,
70
+ "KeyV" : 0x002F,
71
+ "KeyB" : 0x0030,
72
+ "KeyN" : 0x0031,
73
+ "KeyM" : 0x0032,
74
+ "Comma" : 0x0033,
75
+ "Period" : 0x0034,
76
+ "Slash" : 0x0035,
77
+ "ShiftRight" : 0x0036,
78
+ "NumpadMultiply" : 0x0037,
79
+ "AltLeft" : 0x0038,
80
+ "Space" : 0x0039,
81
+ "CapsLock" : 0x003A,
82
+ "F1" : 0x003B,
83
+ "F2" : 0x003C,
84
+ "F3" : 0x003D,
85
+ "F4" : 0x003E,
86
+ "F5" : 0x003F,
87
+ "F6" : 0x0040,
88
+ "F7" : 0x0041,
89
+ "F8" : 0x0042,
90
+ "F9" : 0x0043,
91
+ "F10" : 0x0044,
92
+ "Pause" : 0x0045,
93
+ "ScrollLock" : 0x0046,
94
+ "Numpad7" : 0x0047,
95
+ "Numpad8" : 0x0048,
96
+ "Numpad9" : 0x0049,
97
+ "NumpadSubtract" : 0x004A,
98
+ "Numpad4" : 0x004B,
99
+ "Numpad5" : 0x004C,
100
+ "Numpad6" : 0x004D,
101
+ "NumpadAdd" : 0x004E,
102
+ "Numpad1" : 0x004F,
103
+ "Numpad2" : 0x0050,
104
+ "Numpad3" : 0x0051,
105
+ "Numpad0" : 0x0052,
106
+ "NumpadDecimal" : 0x0053,
107
+ "PrintScreen" : 0x0054,
108
+ "IntlBackslash" : 0x0056,
109
+ "F11" : 0x0057,
110
+ "F12" : 0x0058,
111
+ "NumpadEqual" : 0x0059,
112
+ "F13" : 0x0064,
113
+ "F14" : 0x0065,
114
+ "F15" : 0x0066,
115
+ "F16" : 0x0067,
116
+ "F17" : 0x0068,
117
+ "F18" : 0x0069,
118
+ "F19" : 0x006A,
119
+ "F20" : 0x006B,
120
+ "F21" : 0x006C,
121
+ "F22" : 0x006D,
122
+ "F23" : 0x006E,
123
+ "KanaMode" : 0x0070,
124
+ "Lang2" : 0x0071,
125
+ "Lang1" : 0x0072,
126
+ "IntlRo" : 0x0073,
127
+ "F24" : 0x0076,
128
+ "Convert" : 0x0079,
129
+ "NonConvert" : 0x007B,
130
+ "IntlYen" : 0x007D,
131
+ "NumpadComma" : 0x007E,
132
+ "MediaTrackPrevious" : 0xE010,
133
+ "MediaTrackNext" : 0xE019,
134
+ "NumpadEnter" : 0xE01C,
135
+ "ControlRight" : 0xE01D,
136
+ "VolumeMute" : 0xE020,
137
+ "LaunchApp2" : 0xE021,
138
+ "MediaPlayPause" : 0xE022,
139
+ "MediaStop" : 0xE024,
140
+ "VolumeDown" : 0xE02E,
141
+ "VolumeUp" : 0xE030,
142
+ "BrowserHome" : 0xE032,
143
+ "NumpadDivide" : 0xE035,
144
+ "PrintScreen" : 0xE037,
145
+ "AltRight" : 0xE038,
146
+ "NumLock" : 0xE045,
147
+ "Pause" : 0xE046,
148
+ "Home" : 0xE047,
149
+ "ArrowUp" : 0xE048,
150
+ "PageUp" : 0xE049,
151
+ "ArrowLeft" : 0xE04B,
152
+ "ArrowRight" : 0xE04D,
153
+ "End" : 0xE04F,
154
+ "ArrowDown" : 0xE050,
155
+ "PageDown" : 0xE051,
156
+ "Insert" : 0xE052,
157
+ "Delete" : 0xE053,
158
+ "OSLeft" : 0xE05B,
159
+ "OSRight" : 0xE05C,
160
+ "ContextMenu" : 0xE05D,
161
+ "Power" : 0xE05E,
162
+ "BrowserSearch" : 0xE065,
163
+ "BrowserFavorites" : 0xE066,
164
+ "BrowserRefresh" : 0xE067,
165
+ "BrowserStop" : 0xE068,
166
+ "BrowserForward" : 0xE069,
167
+ "BrowserBack" : 0xE06A,
168
+ "LaunchApp1" : 0xE06B,
169
+ "LaunchMail" : 0xE06C,
170
+ "MediaSelect" : 0xE06D
171
+ };
172
+
173
+ var UnicodeToCodeFirefox_FR = {
174
+ 27 : "Escape",
175
+ 112 : "F1",
176
+ 113 : "F2",
177
+ 114 : "F3",
178
+ 115 : "F4",
179
+ 116 : "F5",
180
+ 117 : "F6",
181
+ 118 : "F7",
182
+ 119 : "F8",
183
+ 120 : "F9",
184
+ 121 : "F10",
185
+ 122 : "F11",
186
+ 123 : "F12",
187
+ 0 : "Backquote",
188
+ 49 : "Digit1",
189
+ 50 : "Digit2",
190
+ 51 : "Digit3",
191
+ 52 : "Digit4",
192
+ 53 : "Digit5",
193
+ 54 : "Digit6",
194
+ 55 : "Digit7",
195
+ 56 : "Digit8",
196
+ 57 : "Digit9",
197
+ 48 : "Digit0",
198
+ 169 : "Minus",
199
+ 61 : "Equal",
200
+ 8 : "Backspace",
201
+ 9 : "Tab",
202
+ 65 : "KeyQ",
203
+ 90 : "KeyW",
204
+ 69 : "KeyE",
205
+ 82 : "KeyR",
206
+ 84 : "KeyT",
207
+ 89 : "KeyY",
208
+ 85 : "KeyU",
209
+ 73 : "KeyI",
210
+ 79 : "KeyO",
211
+ 80 : "KeyP",
212
+ 160 : "BracketLeft",
213
+ 164 : "BracketRight",
214
+ 13 : "Enter",
215
+ 20 : "CapsLock",
216
+ 20 : "CapsLock",
217
+ 81 : "KeyA",
218
+ 83 : "KeyS",
219
+ 68 : "KeyD",
220
+ 70 : "KeyF",
221
+ 71 : "KeyG",
222
+ 72 : "KeyH",
223
+ 74 : "KeyJ",
224
+ 75 : "KeyK",
225
+ 76 : "KeyL",
226
+ 77 : "Semicolon",
227
+ 165 : "Quote",
228
+ 170 : "Backslash",
229
+ 16 : "ShiftLeft",
230
+ 60 : "IntlBackslash",
231
+ 87 : "KeyZ",
232
+ 88 : "KeyX",
233
+ 67 : "KeyC",
234
+ 86 : "KeyV",
235
+ 66 : "KeyB",
236
+ 78 : "KeyN",
237
+ 188 : "KeyM",
238
+ 59 : "Comma",
239
+ 58 : "Period",
240
+ 161 : "Slash",
241
+ 16 : "ShiftRight",
242
+ 17 : "ControlLeft",
243
+ 91 : "OSLeft",
244
+ 18 : "AltLeft",
245
+ 32 : "Space",
246
+ 17 : "ControlLeft",
247
+ 18 : "AltRight",
248
+ 91 : "OSRight",
249
+ 93 : "ContextMenu",
250
+ 17 : "ControlRight",
251
+ 37 : "ArrowLeft",
252
+ 38 : "ArrowUp",
253
+ 40 : "ArrowDown",
254
+ 39 : "ArrowRight",
255
+ 144 : "NumLock",
256
+ 144 : "NumLock",
257
+ 111 : "NumpadDivide",
258
+ 106 : "NumpadMultiply",
259
+ 109 : "NumpadSubtract",
260
+ 103 : "Numpad7",
261
+ 104 : "Numpad8",
262
+ 105 : "Numpad9",
263
+ 107 : "NumpadAdd",
264
+ 100 : "Numpad4",
265
+ 101 : "Numpad5",
266
+ 102 : "Numpad6",
267
+ 97 : "Numpad1",
268
+ 98 : "Numpad2",
269
+ 99 : "Numpad3",
270
+ 96 : "Numpad0",
271
+ 110 : "NumpadDecimal",
272
+ 13 : "NumpadEnter",
273
+ 17 : "ControlLeft",
274
+ 67 : "KeyC",
275
+ 17 : "ControlLeft"
276
+ };
277
+
278
+ var UnicodeToCodeChrome_FR = {
279
+ 27 : "Escape",
280
+ 112 : "F1",
281
+ 113 : "F2",
282
+ 114 : "F3",
283
+ 115 : "F4",
284
+ 116 : "F5",
285
+ 117 : "F6",
286
+ 118 : "F7",
287
+ 119 : "F8",
288
+ 120 : "F9",
289
+ 121 : "F10",
290
+ 122 : "F11",
291
+ 123 : "F12",
292
+ 0 : "Backquote",
293
+ 49 : "Digit1",
294
+ 50 : "Digit2",
295
+ 51 : "Digit3",
296
+ 52 : "Digit4",
297
+ 53 : "Digit5",
298
+ 54 : "Digit6",
299
+ 55 : "Digit7",
300
+ 56 : "Digit8",
301
+ 57 : "Digit9",
302
+ 48 : "Digit0",
303
+ 219 : "Minus",
304
+ 187 : "Equal",
305
+ 8 : "Backspace",
306
+ 9 : "Tab",
307
+ 65 : "KeyQ",
308
+ 90 : "KeyW",
309
+ 69 : "KeyE",
310
+ 82 : "KeyR",
311
+ 84 : "KeyT",
312
+ 89 : "KeyY",
313
+ 85 : "KeyU",
314
+ 73 : "KeyI",
315
+ 79 : "KeyO",
316
+ 80 : "KeyP",
317
+ 221 : "BracketLeft",
318
+ 186 : "BracketRight",
319
+ 13 : "Enter",
320
+ 20 : "CapsLock",
321
+ 20 : "CapsLock",
322
+ 81 : "KeyA",
323
+ 83 : "KeyS",
324
+ 68 : "KeyD",
325
+ 70 : "KeyF",
326
+ 71 : "KeyG",
327
+ 72 : "KeyH",
328
+ 74 : "KeyJ",
329
+ 75 : "KeyK",
330
+ 76 : "KeyL",
331
+ 77 : "Semicolon",
332
+ 192 : "Quote",
333
+ 220 : "Backslash",
334
+ 16 : "ShiftLeft",
335
+ 60 : "IntlBackslash",
336
+ 87 : "KeyZ",
337
+ 88 : "KeyX",
338
+ 67 : "KeyC",
339
+ 86 : "KeyV",
340
+ 66 : "KeyB",
341
+ 78 : "KeyN",
342
+ 188 : "KeyM",
343
+ 190 : "Comma",
344
+ 191 : "Period",
345
+ 223 : "Slash",
346
+ 16 : "ShiftRight",
347
+ 17 : "ControlLeft",
348
+ 91 : "OSLeft",
349
+ 18 : "AltLeft",
350
+ 32 : "Space",
351
+ 17 : "ControlLeft",
352
+ 18 : "AltRight",
353
+ 91 : "OSRight",
354
+ 93 : "ContextMenu",
355
+ 17 : "ControlRight",
356
+ 37 : "ArrowLeft",
357
+ 38 : "ArrowUp",
358
+ 40 : "ArrowDown",
359
+ 39 : "ArrowRight",
360
+ 144 : "NumLock",
361
+ 144 : "NumLock",
362
+ 111 : "NumpadDivide",
363
+ 106 : "NumpadMultiply",
364
+ 109 : "NumpadSubtract",
365
+ 103 : "Numpad7",
366
+ 104 : "Numpad8",
367
+ 105 : "Numpad9",
368
+ 107 : "NumpadAdd",
369
+ 100 : "Numpad4",
370
+ 101 : "Numpad5",
371
+ 102 : "Numpad6",
372
+ 97 : "Numpad1",
373
+ 98 : "Numpad2",
374
+ 99 : "Numpad3",
375
+ 96 : "Numpad0",
376
+ 110 : "NumpadDecimal",
377
+ 13 : "NumpadEnter",
378
+ 17 : "ControlLeft",
379
+ 67 : "KeyC",
380
+ 17 : "ControlLeft"
381
+ };
382
+
383
+ var UnicodeToCode_EN = {
384
+ 27 : "Escape",
385
+ 112 : "F1",
386
+ 113 : "F2",
387
+ 114 : "F3",
388
+ 115 : "F4",
389
+ 116 : "F5",
390
+ 117 : "F6",
391
+ 118 : "F7",
392
+ 119 : "F8",
393
+ 120 : "F9",
394
+ 121 : "F10",
395
+ 122 : "F11",
396
+ 123 : "F12",
397
+ 192 : "Backquote",
398
+ 49 : "Digit1",
399
+ 50 : "Digit2",
400
+ 51 : "Digit3",
401
+ 52 : "Digit4",
402
+ 53 : "Digit5",
403
+ 54 : "Digit6",
404
+ 55 : "Digit7",
405
+ 56 : "Digit8",
406
+ 57 : "Digit9",
407
+ 48 : "Digit0",
408
+ 173 : "Minus",
409
+ 61 : "Equal",
410
+ 8 : "Backspace",
411
+ 9 : "Tab",
412
+ 81 : "KeyQ",
413
+ 87 : "KeyW",
414
+ 69 : "KeyE",
415
+ 82 : "KeyR",
416
+ 84 : "KeyT",
417
+ 89 : "KeyY",
418
+ 85 : "KeyU",
419
+ 73 : "KeyI",
420
+ 79 : "KeyO",
421
+ 80 : "KeyP",
422
+ 219 : "BracketLeft",
423
+ 221 : "BracketRight",
424
+ 13 : "Enter",
425
+ 20 : "CapsLock",
426
+ 65 : "KeyA",
427
+ 83 : "KeyS",
428
+ 68 : "KeyD",
429
+ 70 : "KeyF",
430
+ 71 : "KeyG",
431
+ 72 : "KeyH",
432
+ 74 : "KeyJ",
433
+ 75 : "KeyK",
434
+ 76 : "KeyL",
435
+ 59 : "Semicolon",
436
+ 222 : "Quote",
437
+ 220 : "Backslash",
438
+ 16 : "ShiftLeft",
439
+ 220 : "IntlBackslash",
440
+ 90 : "KeyZ",
441
+ 88 : "KeyX",
442
+ 67 : "KeyC",
443
+ 86 : "KeyV",
444
+ 66 : "KeyB",
445
+ 78 : "KeyN",
446
+ 77 : "KeyM",
447
+ 188 : "Comma",
448
+ 190 : "Period",
449
+ 191 : "Slash",
450
+ 16 : "ShiftRight",
451
+ 17 : "ControlLeft",
452
+ 18 : "AltLeft",
453
+ 91 : "OSLeft",
454
+ 32 : "Space",
455
+ 18 : "AltRight",
456
+ 91 : "OSRight",
457
+ 93 : "ContextMenu",
458
+ 17 : "ControlRight",
459
+ 37 : "ArrowLeft",
460
+ 38 : "ArrowUp",
461
+ 40 : "ArrowDown",
462
+ 39 : "ArrowRight",
463
+ 144 : "NumLock",
464
+ 144 : "NumLock",
465
+ 111 : "NumpadDivide",
466
+ 106 : "NumpadMultiply",
467
+ 109 : "NumpadSubtract",
468
+ 103 : "Numpad7",
469
+ 104 : "Numpad8",
470
+ 105 : "Numpad9",
471
+ 107 : "NumpadAdd",
472
+ 100 : "Numpad4",
473
+ 101 : "Numpad5",
474
+ 102 : "Numpad6",
475
+ 97 : "Numpad1",
476
+ 98 : "Numpad2",
477
+ 99 : "Numpad3",
478
+ 13 : "NumpadEnter",
479
+ 96 : "Numpad0",
480
+ 110 : "NumpadDecimal",
481
+ 17 : "ControlLeft"
482
+ };
483
+
484
+
485
+ var UnicodeToCode = {
486
+ 'firefox' : {
487
+ 'fr' : UnicodeToCodeFirefox_FR,
488
+ 'en' : UnicodeToCode_EN
489
+ },
490
+
491
+ 'chrome' : {
492
+ 'fr' : UnicodeToCodeChrome_FR,
493
+ 'en' : UnicodeToCode_EN
494
+ }
495
+ }
496
+
497
+ /**
498
+ * Scancode of keyevent
499
+ * @param e {keyboardevent}
500
+ * @return {integer} scancode
501
+ */
502
+ function scancode (e) {
503
+ var locale = Mstsc.locale();
504
+ locale = (['fr', 'en'].indexOf(locale) > 0 && locale) || 'en';
505
+ return KeyMap[e.code || UnicodeToCode[Mstsc.browser() || 'firefox'][locale][e.keyCode]];
506
+ }
507
+
508
+ Mstsc.scancode = scancode;
509
+
510
+})();
\ No newline at end of file
public/mstsc/js/mstsc.js
new
+81
@@ -0,0 +1,81 @@
1
+/*
2
+ * Copyright (c) 2015 Sylvain Peyrefitte
3
+ *
4
+ * This file is part of mstsc.js.
5
+ *
6
+ * mstsc.j is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+(function() {
21
+
22
+ /**
23
+ * Use for domain declaration
24
+ */
25
+ Mstsc = function () {
26
+ }
27
+
28
+ Mstsc.prototype = {
29
+ // shortcut
30
+ $ : function (id) {
31
+ return document.getElementById(id);
32
+ },
33
+
34
+ /**
35
+ * Compute screen offset for a target element
36
+ * @param el {DOM element}
37
+ * @return {top : {integer}, left {integer}}
38
+ */
39
+ elementOffset : function (el) {
40
+ var x = 0;
41
+ var y = 0;
42
+ while (el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop )) {
43
+ x += el.offsetLeft - el.scrollLeft;
44
+ y += el.offsetTop - el.scrollTop;
45
+ el = el.offsetParent;
46
+ }
47
+ return { top: y, left: x };
48
+ },
49
+
50
+ /**
51
+ * Try to detect browser
52
+ * @returns {String} [firefox|chrome|ie]
53
+ */
54
+ browser : function () {
55
+ if (typeof InstallTrigger !== 'undefined') {
56
+ return 'firefox';
57
+ }
58
+
59
+ if (!!window.chrome) {
60
+ return 'chrome';
61
+ }
62
+
63
+ if (!!document.docuemntMode) {
64
+ return 'ie';
65
+ }
66
+
67
+ return null;
68
+ },
69
+
70
+ /**
71
+ * Try to detect language
72
+ * @returns
73
+ */
74
+ locale : function () {
75
+ return window.navigator.userLanguage || window.navigator.language;
76
+ }
77
+ }
78
+
79
+})();
80
+
81
+this.Mstsc = new Mstsc();
\ No newline at end of file
public/mstsc/js/rle.js
new
+17864
@@ -0,0 +1,17864 @@
1
+// Note: Some Emscripten settings will significantly limit the speed of the generated code.
2
+// Note: Some Emscripten settings may limit the speed of the generated code.
3
+// The Module object: Our interface to the outside world. We import
4
+// and export values on it, and do the work to get that through
5
+// closure compiler if necessary. There are various ways Module can be used:
6
+// 1. Not defined. We create it here
7
+// 2. A function parameter, function(Module) { ..generated code.. }
8
+// 3. pre-run appended it, var Module = {}; ..generated code..
9
+// 4. External script tag defines var Module.
10
+// We need to do an eval in order to handle the closure compiler
11
+// case, where this code here is minified but Module was defined
12
+// elsewhere (e.g. case 4 above). We also need to check if Module
13
+// already exists (e.g. case 3 above).
14
+// Note that if you want to run closure, and also to use Module
15
+// after the generated code, you will need to define var Module = {};
16
+// before the code. Then that object will be used in the code, and you
17
+// can continue to use Module afterwards as well.
18
+var Module = { };
19
+//if (!Module) { Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()'); }
20
+
21
+// Sometimes an existing Module object exists with properties
22
+// meant to overwrite the default module functionality. Here
23
+// we collect those properties and reapply _after_ we configure
24
+// the current environment's defaults to avoid having to be so
25
+// defensive during initialization.
26
+var moduleOverrides = {};
27
+for (var key in Module) {
28
+ if (Module.hasOwnProperty(key)) {
29
+ moduleOverrides[key] = Module[key];
30
+ }
31
+}
32
+
33
+// The environment setup code below is customized to use Module.
34
+// *** Environment setup code ***
35
+var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
36
+var ENVIRONMENT_IS_WEB = typeof window === 'object';
37
+var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
38
+var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
39
+
40
+if (ENVIRONMENT_IS_NODE) {
41
+ // Expose functionality in the same simple way that the shells work
42
+ // Note that we pollute the global namespace here, otherwise we break in node
43
+ if (!Module['print']) Module['print'] = function print(x) {
44
+ process['stdout'].write(x + '\n');
45
+ };
46
+ if (!Module['printErr']) Module['printErr'] = function printErr(x) {
47
+ process['stderr'].write(x + '\n');
48
+ };
49
+
50
+ var nodeFS = require('fs');
51
+ var nodePath = require('path');
52
+
53
+ Module['read'] = function read(filename, binary) {
54
+ filename = nodePath['normalize'](filename);
55
+ var ret = nodeFS['readFileSync'](filename);
56
+ // The path is absolute if the normalized version is the same as the resolved.
57
+ if (!ret && filename != nodePath['resolve'](filename)) {
58
+ filename = path.join(__dirname, '..', 'src', filename);
59
+ ret = nodeFS['readFileSync'](filename);
60
+ }
61
+ if (ret && !binary) ret = ret.toString();
62
+ return ret;
63
+ };
64
+
65
+ Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };
66
+
67
+ Module['load'] = function load(f) {
68
+ globalEval(read(f));
69
+ };
70
+
71
+ Module['arguments'] = process['argv'].slice(2);
72
+
73
+ module['exports'] = Module;
74
+}
75
+else if (ENVIRONMENT_IS_SHELL) {
76
+ if (!Module['print']) Module['print'] = print;
77
+ if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
78
+
79
+ if (typeof read != 'undefined') {
80
+ Module['read'] = read;
81
+ } else {
82
+ Module['read'] = function read() { throw 'no read() available (jsc?)' };
83
+ }
84
+
85
+ Module['readBinary'] = function readBinary(f) {
86
+ return read(f, 'binary');
87
+ };
88
+
89
+ if (typeof scriptArgs != 'undefined') {
90
+ Module['arguments'] = scriptArgs;
91
+ } else if (typeof arguments != 'undefined') {
92
+ Module['arguments'] = arguments;
93
+ }
94
+
95
+ this['Module'] = Module;
96
+
97
+ eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)
98
+}
99
+else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
100
+ Module['read'] = function read(url) {
101
+ var xhr = new XMLHttpRequest();
102
+ xhr.open('GET', url, false);
103
+ xhr.send(null);
104
+ return xhr.responseText;
105
+ };
106
+
107
+ if (typeof arguments != 'undefined') {
108
+ Module['arguments'] = arguments;
109
+ }
110
+
111
+ if (typeof console !== 'undefined') {
112
+ if (!Module['print']) Module['print'] = function print(x) {
113
+ console.log(x);
114
+ };
115
+ if (!Module['printErr']) Module['printErr'] = function printErr(x) {
116
+ console.log(x);
117
+ };
118
+ } else {
119
+ // Probably a worker, and without console.log. We can do very little here...
120
+ var TRY_USE_DUMP = false;
121
+ if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
122
+ dump(x);
123
+ }) : (function(x) {
124
+ // self.postMessage(x); // enable this if you want stdout to be sent as messages
125
+ }));
126
+ }
127
+
128
+ if (ENVIRONMENT_IS_WEB) {
129
+ this['Module'] = Module;
130
+ } else {
131
+ Module['load'] = importScripts;
132
+ }
133
+}
134
+else {
135
+ // Unreachable because SHELL is dependant on the others
136
+ throw 'Unknown runtime environment. Where are we?';
137
+}
138
+
139
+function globalEval(x) {
140
+ eval.call(null, x);
141
+}
142
+if (!Module['load'] == 'undefined' && Module['read']) {
143
+ Module['load'] = function load(f) {
144
+ globalEval(Module['read'](f));
145
+ };
146
+}
147
+if (!Module['print']) {
148
+ Module['print'] = function(){};
149
+}
150
+if (!Module['printErr']) {
151
+ Module['printErr'] = Module['print'];
152
+}
153
+if (!Module['arguments']) {
154
+ Module['arguments'] = [];
155
+}
156
+// *** Environment setup code ***
157
+
158
+// Closure helpers
159
+Module.print = Module['print'];
160
+Module.printErr = Module['printErr'];
161
+
162
+// Callbacks
163
+Module['preRun'] = [];
164
+Module['postRun'] = [];
165
+
166
+// Merge back in the overrides
167
+for (var key in moduleOverrides) {
168
+ if (moduleOverrides.hasOwnProperty(key)) {
169
+ Module[key] = moduleOverrides[key];
170
+ }
171
+}
172
+
173
+
174
+
175
+// === Auto-generated preamble library stuff ===
176
+
177
+//========================================
178
+// Runtime code shared with compiler
179
+//========================================
180
+
181
+var Runtime = {
182
+ stackSave: function () {
183
+ return STACKTOP;
184
+ },
185
+ stackRestore: function (stackTop) {
186
+ STACKTOP = stackTop;
187
+ },
188
+ forceAlign: function (target, quantum) {
189
+ quantum = quantum || 4;
190
+ if (quantum == 1) return target;
191
+ if (isNumber(target) && isNumber(quantum)) {
192
+ return Math.ceil(target/quantum)*quantum;
193
+ } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
194
+ return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';
195
+ }
196
+ return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
197
+ },
198
+ isNumberType: function (type) {
199
+ return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
200
+ },
201
+ isPointerType: function isPointerType(type) {
202
+ return type[type.length-1] == '*';
203
+},
204
+ isStructType: function isStructType(type) {
205
+ if (isPointerType(type)) return false;
206
+ if (isArrayType(type)) return true;
207
+ if (/<?{ ?[^}]* ?}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
208
+ // See comment in isStructPointerType()
209
+ return type[0] == '%';
210
+},
211
+ INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
212
+ FLOAT_TYPES: {"float":0,"double":0},
213
+ or64: function (x, y) {
214
+ var l = (x | 0) | (y | 0);
215
+ var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;
216
+ return l + h;
217
+ },
218
+ and64: function (x, y) {
219
+ var l = (x | 0) & (y | 0);
220
+ var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;
221
+ return l + h;
222
+ },
223
+ xor64: function (x, y) {
224
+ var l = (x | 0) ^ (y | 0);
225
+ var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;
226
+ return l + h;
227
+ },
228
+ getNativeTypeSize: function (type) {
229
+ switch (type) {
230
+ case 'i1': case 'i8': return 1;
231
+ case 'i16': return 2;
232
+ case 'i32': return 4;
233
+ case 'i64': return 8;
234
+ case 'float': return 4;
235
+ case 'double': return 8;
236
+ default: {
237
+ if (type[type.length-1] === '*') {
238
+ return Runtime.QUANTUM_SIZE; // A pointer
239
+ } else if (type[0] === 'i') {
240
+ var bits = parseInt(type.substr(1));
241
+ assert(bits % 8 === 0);
242
+ return bits/8;
243
+ } else {
244
+ return 0;
245
+ }
246
+ }
247
+ }
248
+ },
249
+ getNativeFieldSize: function (type) {
250
+ return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
251
+ },
252
+ dedup: function dedup(items, ident) {
253
+ var seen = {};
254
+ if (ident) {
255
+ return items.filter(function(item) {
256
+ if (seen[item[ident]]) return false;
257
+ seen[item[ident]] = true;
258
+ return true;
259
+ });
260
+ } else {
261
+ return items.filter(function(item) {
262
+ if (seen[item]) return false;
263
+ seen[item] = true;
264
+ return true;
265
+ });
266
+ }
267
+},
268
+ set: function set() {
269
+ var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
270
+ var ret = {};
271
+ for (var i = 0; i < args.length; i++) {
272
+ ret[args[i]] = 0;
273
+ }
274
+ return ret;
275
+},
276
+ STACK_ALIGN: 8,
277
+ getAlignSize: function (type, size, vararg) {
278
+ // we align i64s and doubles on 64-bit boundaries, unlike x86
279
+ if (vararg) return 8;
280
+ if (!vararg && (type == 'i64' || type == 'double')) return 8;
281
+ if (!type) return Math.min(size, 8); // align structures internally to 64 bits
282
+ return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
283
+ },
284
+ calculateStructAlignment: function calculateStructAlignment(type) {
285
+ type.flatSize = 0;
286
+ type.alignSize = 0;
287
+ var diffs = [];
288
+ var prev = -1;
289
+ var index = 0;
290
+ type.flatIndexes = type.fields.map(function(field) {
291
+ index++;
292
+ var size, alignSize;
293
+ if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
294
+ size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
295
+ alignSize = Runtime.getAlignSize(field, size);
296
+ } else if (Runtime.isStructType(field)) {
297
+ if (field[1] === '0') {
298
+ // this is [0 x something]. When inside another structure like here, it must be at the end,
299
+ // and it adds no size
300
+ // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');
301
+ size = 0;
302
+ if (Types.types[field]) {
303
+ alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
304
+ } else {
305
+ alignSize = type.alignSize || QUANTUM_SIZE;
306
+ }
307
+ } else {
308
+ size = Types.types[field].flatSize;
309
+ alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
310
+ }
311
+ } else if (field[0] == 'b') {
312
+ // bN, large number field, like a [N x i8]
313
+ size = field.substr(1)|0;
314
+ alignSize = 1;
315
+ } else if (field[0] === '<') {
316
+ // vector type
317
+ size = alignSize = Types.types[field].flatSize; // fully aligned
318
+ } else if (field[0] === 'i') {
319
+ // illegal integer field, that could not be legalized because it is an internal structure field
320
+ // it is ok to have such fields, if we just use them as markers of field size and nothing more complex
321
+ size = alignSize = parseInt(field.substr(1))/8;
322
+ assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);
323
+ } else {
324
+ assert(false, 'invalid type for calculateStructAlignment');
325
+ }
326
+ if (type.packed) alignSize = 1;
327
+ type.alignSize = Math.max(type.alignSize, alignSize);
328
+ var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
329
+ type.flatSize = curr + size;
330
+ if (prev >= 0) {
331
+ diffs.push(curr-prev);
332
+ }
333
+ prev = curr;
334
+ return curr;
335
+ });
336
+ if (type.name_ && type.name_[0] === '[') {
337
+ // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid
338
+ // allocating a potentially huge array for [999999 x i8] etc.
339
+ type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;
340
+ }
341
+ type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
342
+ if (diffs.length == 0) {
343
+ type.flatFactor = type.flatSize;
344
+ } else if (Runtime.dedup(diffs).length == 1) {
345
+ type.flatFactor = diffs[0];
346
+ }
347
+ type.needsFlattening = (type.flatFactor != 1);
348
+ return type.flatIndexes;
349
+ },
350
+ generateStructInfo: function (struct, typeName, offset) {
351
+ var type, alignment;
352
+ if (typeName) {
353
+ offset = offset || 0;
354
+ type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];
355
+ if (!type) return null;
356
+ if (type.fields.length != struct.length) {
357
+ printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
358
+ return null;
359
+ }
360
+ alignment = type.flatIndexes;
361
+ } else {
362
+ var type = { fields: struct.map(function(item) { return item[0] }) };
363
+ alignment = Runtime.calculateStructAlignment(type);
364
+ }
365
+ var ret = {
366
+ __size__: type.flatSize
367
+ };
368
+ if (typeName) {
369
+ struct.forEach(function(item, i) {
370
+ if (typeof item === 'string') {
371
+ ret[item] = alignment[i] + offset;
372
+ } else {
373
+ // embedded struct
374
+ var key;
375
+ for (var k in item) key = k;
376
+ ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);
377
+ }
378
+ });
379
+ } else {
380
+ struct.forEach(function(item, i) {
381
+ ret[item[1]] = alignment[i];
382
+ });
383
+ }
384
+ return ret;
385
+ },
386
+ dynCall: function (sig, ptr, args) {
387
+ if (args && args.length) {
388
+ assert(args.length == sig.length-1);
389
+ return FUNCTION_TABLE[ptr].apply(null, args);
390
+ } else {
391
+ assert(sig.length == 1);
392
+ return FUNCTION_TABLE[ptr]();
393
+ }
394
+ },
395
+ addFunction: function (func) {
396
+ var table = FUNCTION_TABLE;
397
+ var ret = table.length;
398
+ assert(ret % 2 === 0);
399
+ table.push(func);
400
+ for (var i = 0; i < 2-1; i++) table.push(0);
401
+ return ret;
402
+ },
403
+ removeFunction: function (index) {
404
+ var table = FUNCTION_TABLE;
405
+ table[index] = null;
406
+ },
407
+ getAsmConst: function (code, numArgs) {
408
+ // code is a constant string on the heap, so we can cache these
409
+ if (!Runtime.asmConstCache) Runtime.asmConstCache = {};
410
+ var func = Runtime.asmConstCache[code];
411
+ if (func) return func;
412
+ var args = [];
413
+ for (var i = 0; i < numArgs; i++) {
414
+ args.push(String.fromCharCode(36) + i); // $0, $1 etc
415
+ }
416
+ code = Pointer_stringify(code);
417
+ if (code[0] === '"') {
418
+ // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct
419
+ if (code.indexOf('"', 1) === code.length-1) {
420
+ code = code.substr(1, code.length-2);
421
+ } else {
422
+ // something invalid happened, e.g. EM_ASM("..code($0)..", input)
423
+ abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');
424
+ }
425
+ }
426
+ return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node
427
+ },
428
+ warnOnce: function (text) {
429
+ if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
430
+ if (!Runtime.warnOnce.shown[text]) {
431
+ Runtime.warnOnce.shown[text] = 1;
432
+ Module.printErr(text);
433
+ }
434
+ },
435
+ funcWrappers: {},
436
+ getFuncWrapper: function (func, sig) {
437
+ assert(sig);
438
+ if (!Runtime.funcWrappers[func]) {
439
+ Runtime.funcWrappers[func] = function dynCall_wrapper() {
440
+ return Runtime.dynCall(sig, func, arguments);
441
+ };
442
+ }
443
+ return Runtime.funcWrappers[func];
444
+ },
445
+ UTF8Processor: function () {
446
+ var buffer = [];
447
+ var needed = 0;
448
+ this.processCChar = function (code) {
449
+ code = code & 0xFF;
450
+
451
+ if (buffer.length == 0) {
452
+ if ((code & 0x80) == 0x00) { // 0xxxxxxx
453
+ return String.fromCharCode(code);
454
+ }
455
+ buffer.push(code);
456
+ if ((code & 0xE0) == 0xC0) { // 110xxxxx
457
+ needed = 1;
458
+ } else if ((code & 0xF0) == 0xE0) { // 1110xxxx
459
+ needed = 2;
460
+ } else { // 11110xxx
461
+ needed = 3;
462
+ }
463
+ return '';
464
+ }
465
+
466
+ if (needed) {
467
+ buffer.push(code);
468
+ needed--;
469
+ if (needed > 0) return '';
470
+ }
471
+
472
+ var c1 = buffer[0];
473
+ var c2 = buffer[1];
474
+ var c3 = buffer[2];
475
+ var c4 = buffer[3];
476
+ var ret;
477
+ if (buffer.length == 2) {
478
+ ret = String.fromCharCode(((c1 & 0x1F) << 6) | (c2 & 0x3F));
479
+ } else if (buffer.length == 3) {
480
+ ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F));
481
+ } else {
482
+ // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
483
+ var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
484
+ ((c3 & 0x3F) << 6) | (c4 & 0x3F);
485
+ ret = String.fromCharCode(
486
+ Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,
487
+ (codePoint - 0x10000) % 0x400 + 0xDC00);
488
+ }
489
+ buffer.length = 0;
490
+ return ret;
491
+ }
492
+ this.processJSString = function processJSString(string) {
493
+ string = unescape(encodeURIComponent(string));
494
+ var ret = [];
495
+ for (var i = 0; i < string.length; i++) {
496
+ ret.push(string.charCodeAt(i));
497
+ }
498
+ return ret;
499
+ }
500
+ },
501
+ stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8);(assert((STACKTOP|0) < (STACK_MAX|0))|0); return ret; },
502
+ staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + (assert(!staticSealed),size))|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },
503
+ dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + (assert(DYNAMICTOP > 0),size))|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },
504
+ alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
505
+ makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((low>>>0)+((high>>>0)*4294967296)) : ((low>>>0)+((high|0)*4294967296))); return ret; },
506
+ GLOBAL_BASE: 8,
507
+ QUANTUM_SIZE: 4,
508
+ __dummy__: 0
509
+}
510
+
511
+
512
+Module['Runtime'] = Runtime;
513
+
514
+
515
+
516
+
517
+
518
+
519
+
520
+
521
+
522
+//========================================
523
+// Runtime essentials
524
+//========================================
525
+
526
+var __THREW__ = 0; // Used in checking for thrown exceptions.
527
+var setjmpId = 1; // Used in setjmp/longjmp
528
+var setjmpLabels = {};
529
+
530
+var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
531
+var EXITSTATUS = 0;
532
+
533
+var undef = 0;
534
+// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
535
+// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt
536
+var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;
537
+var tempI64, tempI64b;
538
+var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;
539
+
540
+function assert(condition, text) {
541
+ if (!condition) {
542
+ abort('Assertion failed: ' + text);
543
+ }
544
+}
545
+
546
+var globalScope = this;
547
+
548
+// C calling interface. A convenient way to call C functions (in C files, or
549
+// defined with extern "C").
550
+//
551
+// Note: LLVM optimizations can inline and remove functions, after which you will not be
552
+// able to call them. Closure can also do so. To avoid that, add your function to
553
+// the exports using something like
554
+//
555
+// -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
556
+//
557
+// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C")
558
+// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and
559
+// 'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).
560
+// @param argTypes An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,
561
+// except that 'array' is not possible (there is no way for us to know the length of the array)
562
+// @param args An array of the arguments to the function, as native JS values (as in returnType)
563
+// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
564
+// @return The return value, as a native JS value (as in returnType)
565
+function ccall(ident, returnType, argTypes, args) {
566
+ return ccallFunc(getCFunc(ident), returnType, argTypes, args);
567
+}
568
+Module["ccall"] = ccall;
569
+
570
+// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
571
+function getCFunc(ident) {
572
+ try {
573
+ var func = Module['_' + ident]; // closure exported function
574
+ if (!func) func = eval('_' + ident); // explicit lookup
575
+ } catch(e) {
576
+ }
577
+ assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
578
+ return func;
579
+}
580
+
581
+// Internal function that does a C call using a function, not an identifier
582
+function ccallFunc(func, returnType, argTypes, args) {
583
+ var stack = 0;
584
+ function toC(value, type) {
585
+ if (type == 'string') {
586
+ if (value === null || value === undefined || value === 0) return 0; // null string
587
+ value = intArrayFromString(value);
588
+ type = 'array';
589
+ }
590
+ if (type == 'array') {
591
+ if (!stack) stack = Runtime.stackSave();
592
+ var ret = Runtime.stackAlloc(value.length);
593
+ writeArrayToMemory(value, ret);
594
+ return ret;
595
+ }
596
+ return value;
597
+ }
598
+ function fromC(value, type) {
599
+ if (type == 'string') {
600
+ return Pointer_stringify(value);
601
+ }
602
+ assert(type != 'array');
603
+ return value;
604
+ }
605
+ var i = 0;
606
+ var cArgs = args ? args.map(function(arg) {
607
+ return toC(arg, argTypes[i++]);
608
+ }) : [];
609
+ var ret = fromC(func.apply(null, cArgs), returnType);
610
+ if (stack) Runtime.stackRestore(stack);
611
+ return ret;
612
+}
613
+
614
+// Returns a native JS wrapper for a C function. This is similar to ccall, but
615
+// returns a function you can call repeatedly in a normal way. For example:
616
+//
617
+// var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
618
+// alert(my_function(5, 22));
619
+// alert(my_function(99, 12));
620
+//
621
+function cwrap(ident, returnType, argTypes) {
622
+ var func = getCFunc(ident);
623
+ return function() {
624
+ return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));
625
+ }
626
+}
627
+Module["cwrap"] = cwrap;
628
+
629
+// Sets a value in memory in a dynamic way at run-time. Uses the
630
+// type data. This is the same as makeSetValue, except that
631
+// makeSetValue is done at compile-time and generates the needed
632
+// code then, whereas this function picks the right code at
633
+// run-time.
634
+// Note that setValue and getValue only do *aligned* writes and reads!
635
+// Note that ccall uses JS types as for defining types, while setValue and
636
+// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
637
+function setValue(ptr, value, type, noSafe) {
638
+ type = type || 'i8';
639
+ if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
640
+ switch(type) {
641
+ case 'i1': HEAP8[(ptr)]=value; break;
642
+ case 'i8': HEAP8[(ptr)]=value; break;
643
+ case 'i16': HEAP16[((ptr)>>1)]=value; break;
644
+ case 'i32': HEAP32[((ptr)>>2)]=value; break;
645
+ case 'i64': (tempI64 = [value>>>0,(tempDouble=value,Math_abs(tempDouble) >= 1 ? (tempDouble > 0 ? Math_min(Math_floor((tempDouble)/4294967296), 4294967295)>>>0 : (~~(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296)))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break;
646
+ case 'float': HEAPF32[((ptr)>>2)]=value; break;
647
+ case 'double': HEAPF64[((ptr)>>3)]=value; break;
648
+ default: abort('invalid type for setValue: ' + type);
649
+ }
650
+}
651
+Module['setValue'] = setValue;
652
+
653
+// Parallel to setValue.
654
+function getValue(ptr, type, noSafe) {
655
+ type = type || 'i8';
656
+ if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
657
+ switch(type) {
658
+ case 'i1': return HEAP8[(ptr)];
659
+ case 'i8': return HEAP8[(ptr)];
660
+ case 'i16': return HEAP16[((ptr)>>1)];
661
+ case 'i32': return HEAP32[((ptr)>>2)];
662
+ case 'i64': return HEAP32[((ptr)>>2)];
663
+ case 'float': return HEAPF32[((ptr)>>2)];
664
+ case 'double': return HEAPF64[((ptr)>>3)];
665
+ default: abort('invalid type for setValue: ' + type);
666
+ }
667
+ return null;
668
+}
669
+Module['getValue'] = getValue;
670
+
671
+var ALLOC_NORMAL = 0; // Tries to use _malloc()
672
+var ALLOC_STACK = 1; // Lives for the duration of the current function call
673
+var ALLOC_STATIC = 2; // Cannot be freed
674
+var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
675
+var ALLOC_NONE = 4; // Do not allocate
676
+Module['ALLOC_NORMAL'] = ALLOC_NORMAL;
677
+Module['ALLOC_STACK'] = ALLOC_STACK;
678
+Module['ALLOC_STATIC'] = ALLOC_STATIC;
679
+Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
680
+Module['ALLOC_NONE'] = ALLOC_NONE;
681
+
682
+// allocate(): This is for internal use. You can use it yourself as well, but the interface
683
+// is a little tricky (see docs right below). The reason is that it is optimized
684
+// for multiple syntaxes to save space in generated code. So you should
685
+// normally not use allocate(), and instead allocate memory using _malloc(),
686
+// initialize it with setValue(), and so forth.
687
+// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
688
+// in *bytes* (note that this is sometimes confusing: the next parameter does not
689
+// affect this!)
690
+// @types: Either an array of types, one for each byte (or 0 if no type at that position),
691
+// or a single type which is used for the entire block. This only matters if there
692
+// is initial data - if @slab is a number, then this does not matter at all and is
693
+// ignored.
694
+// @allocator: How to allocate memory, see ALLOC_*
695
+function allocate(slab, types, allocator, ptr) {
696
+ var zeroinit, size;
697
+ if (typeof slab === 'number') {
698
+ zeroinit = true;
699
+ size = slab;
700
+ } else {
701
+ zeroinit = false;
702
+ size = slab.length;
703
+ }
704
+
705
+ var singleType = typeof types === 'string' ? types : null;
706
+
707
+ var ret;
708
+ if (allocator == ALLOC_NONE) {
709
+ ret = ptr;
710
+ } else {
711
+ ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
712
+ }
713
+
714
+ if (zeroinit) {
715
+ var ptr = ret, stop;
716
+ assert((ret & 3) == 0);
717
+ stop = ret + (size & ~3);
718
+ for (; ptr < stop; ptr += 4) {
719
+ HEAP32[((ptr)>>2)]=0;
720
+ }
721
+ stop = ret + size;
722
+ while (ptr < stop) {
723
+ HEAP8[((ptr++)|0)]=0;
724
+ }
725
+ return ret;
726
+ }
727
+
728
+ if (singleType === 'i8') {
729
+ if (slab.subarray || slab.slice) {
730
+ HEAPU8.set(slab, ret);
731
+ } else {
732
+ HEAPU8.set(new Uint8Array(slab), ret);
733
+ }
734
+ return ret;
735
+ }
736
+
737
+ var i = 0, type, typeSize, previousType;
738
+ while (i < size) {
739
+ var curr = slab[i];
740
+
741
+ if (typeof curr === 'function') {
742
+ curr = Runtime.getFunctionIndex(curr);
743
+ }
744
+
745
+ type = singleType || types[i];
746
+ if (type === 0) {
747
+ i++;
748
+ continue;
749
+ }
750
+ assert(type, 'Must know what type to store in allocate!');
751
+
752
+ if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later
753
+
754
+ setValue(ret+i, curr, type);
755
+
756
+ // no need to look up size unless type changes, so cache it
757
+ if (previousType !== type) {
758
+ typeSize = Runtime.getNativeTypeSize(type);
759
+ previousType = type;
760
+ }
761
+ i += typeSize;
762
+ }
763
+
764
+ return ret;
765
+}
766
+Module['allocate'] = allocate;
767
+
768
+function Pointer_stringify(ptr, /* optional */ length) {
769
+ // TODO: use TextDecoder
770
+ // Find the length, and check for UTF while doing so
771
+ var hasUtf = false;
772
+ var t;
773
+ var i = 0;
774
+ while (1) {
775
+ assert(ptr + i < TOTAL_MEMORY);
776
+ t = HEAPU8[(((ptr)+(i))|0)];
777
+ if (t >= 128) hasUtf = true;
778
+ else if (t == 0 && !length) break;
779
+ i++;
780
+ if (length && i == length) break;
781
+ }
782
+ if (!length) length = i;
783
+
784
+ var ret = '';
785
+
786
+ if (!hasUtf) {
787
+ var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
788
+ var curr;
789
+ while (length > 0) {
790
+ curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
791
+ ret = ret ? ret + curr : curr;
792
+ ptr += MAX_CHUNK;
793
+ length -= MAX_CHUNK;
794
+ }
795
+ return ret;
796
+ }
797
+
798
+ var utf8 = new Runtime.UTF8Processor();
799
+ for (i = 0; i < length; i++) {
800
+ assert(ptr + i < TOTAL_MEMORY);
801
+ t = HEAPU8[(((ptr)+(i))|0)];
802
+ ret += utf8.processCChar(t);
803
+ }
804
+ return ret;
805
+}
806
+Module['Pointer_stringify'] = Pointer_stringify;
807
+
808
+// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
809
+// a copy of that string as a Javascript String object.
810
+function UTF16ToString(ptr) {
811
+ var i = 0;
812
+
813
+ var str = '';
814
+ while (1) {
815
+ var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
816
+ if (codeUnit == 0)
817
+ return str;
818
+ ++i;
819
+ // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
820
+ str += String.fromCharCode(codeUnit);
821
+ }
822
+}
823
+Module['UTF16ToString'] = UTF16ToString;
824
+
825
+// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
826
+// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.
827
+function stringToUTF16(str, outPtr) {
828
+ for(var i = 0; i < str.length; ++i) {
829
+ // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
830
+ var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
831
+ HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;
832
+ }
833
+ // Null-terminate the pointer to the HEAP.
834
+ HEAP16[(((outPtr)+(str.length*2))>>1)]=0;
835
+}
836
+Module['stringToUTF16'] = stringToUTF16;
837
+
838
+// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns
839
+// a copy of that string as a Javascript String object.
840
+function UTF32ToString(ptr) {
841
+ var i = 0;
842
+
843
+ var str = '';
844
+ while (1) {
845
+ var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
846
+ if (utf32 == 0)
847
+ return str;
848
+ ++i;
849
+ // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
850
+ if (utf32 >= 0x10000) {
851
+ var ch = utf32 - 0x10000;
852
+ str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
853
+ } else {
854
+ str += String.fromCharCode(utf32);
855
+ }
856
+ }
857
+}
858
+Module['UTF32ToString'] = UTF32ToString;
859
+
860
+// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
861
+// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,
862
+// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.
863
+function stringToUTF32(str, outPtr) {
864
+ var iChar = 0;
865
+ for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {
866
+ // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
867
+ var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate
868
+ if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
869
+ var trailSurrogate = str.charCodeAt(++iCodeUnit);
870
+ codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
871
+ }
872
+ HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;
873
+ ++iChar;
874
+ }
875
+ // Null-terminate the pointer to the HEAP.
876
+ HEAP32[(((outPtr)+(iChar*4))>>2)]=0;
877
+}
878
+Module['stringToUTF32'] = stringToUTF32;
879
+
880
+function demangle(func) {
881
+ try {
882
+ // Special-case the entry point, since its name differs from other name mangling.
883
+ if (func == 'Object._main' || func == '_main') {
884
+ return 'main()';
885
+ }
886
+ if (typeof func === 'number') func = Pointer_stringify(func);
887
+ if (func[0] !== '_') return func;
888
+ if (func[1] !== '_') return func; // C function
889
+ if (func[2] !== 'Z') return func;
890
+ switch (func[3]) {
891
+ case 'n': return 'operator new()';
892
+ case 'd': return 'operator delete()';
893
+ }
894
+ var i = 3;
895
+ // params, etc.
896
+ var basicTypes = {
897
+ 'v': 'void',
898
+ 'b': 'bool',
899
+ 'c': 'char',
900
+ 's': 'short',
901
+ 'i': 'int',
902
+ 'l': 'long',
903
+ 'f': 'float',
904
+ 'd': 'double',
905
+ 'w': 'wchar_t',
906
+ 'a': 'signed char',
907
+ 'h': 'unsigned char',
908
+ 't': 'unsigned short',
909
+ 'j': 'unsigned int',
910
+ 'm': 'unsigned long',
911
+ 'x': 'long long',
912
+ 'y': 'unsigned long long',
913
+ 'z': '...'
914
+ };
915
+ function dump(x) {
916
+ //return;
917
+ if (x) Module.print(x);
918
+ Module.print(func);
919
+ var pre = '';
920
+ for (var a = 0; a < i; a++) pre += ' ';
921
+ Module.print (pre + '^');
922
+ }
923
+ var subs = [];
924
+ function parseNested() {
925
+ i++;
926
+ if (func[i] === 'K') i++; // ignore const
927
+ var parts = [];
928
+ while (func[i] !== 'E') {
929
+ if (func[i] === 'S') { // substitution
930
+ i++;
931
+ var next = func.indexOf('_', i);
932
+ var num = func.substring(i, next) || 0;
933
+ parts.push(subs[num] || '?');
934
+ i = next+1;
935
+ continue;
936
+ }
937
+ if (func[i] === 'C') { // constructor
938
+ parts.push(parts[parts.length-1]);
939
+ i += 2;
940
+ continue;
941
+ }
942
+ var size = parseInt(func.substr(i));
943
+ var pre = size.toString().length;
944
+ if (!size || !pre) { i--; break; } // counter i++ below us
945
+ var curr = func.substr(i + pre, size);
946
+ parts.push(curr);
947
+ subs.push(curr);
948
+ i += pre + size;
949
+ }
950
+ i++; // skip E
951
+ return parts;
952
+ }
953
+ var first = true;
954
+ function parse(rawList, limit, allowVoid) { // main parser
955
+ limit = limit || Infinity;
956
+ var ret = '', list = [];
957
+ function flushList() {
958
+ return '(' + list.join(', ') + ')';
959
+ }
960
+ var name;
961
+ if (func[i] === 'N') {
962
+ // namespaced N-E
963
+ name = parseNested().join('::');
964
+ limit--;
965
+ if (limit === 0) return rawList ? [name] : name;
966
+ } else {
967
+ // not namespaced
968
+ if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'
969
+ var size = parseInt(func.substr(i));
970
+ if (size) {
971
+ var pre = size.toString().length;
972
+ name = func.substr(i + pre, size);
973
+ i += pre + size;
974
+ }
975
+ }
976
+ first = false;
977
+ if (func[i] === 'I') {
978
+ i++;
979
+ var iList = parse(true);
980
+ var iRet = parse(true, 1, true);
981
+ ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
982
+ } else {
983
+ ret = name;
984
+ }
985
+ paramLoop: while (i < func.length && limit-- > 0) {
986
+ //dump('paramLoop');
987
+ var c = func[i++];
988
+ if (c in basicTypes) {
989
+ list.push(basicTypes[c]);
990
+ } else {
991
+ switch (c) {
992
+ case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer
993
+ case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference
994
+ case 'L': { // literal
995
+ i++; // skip basic type
996
+ var end = func.indexOf('E', i);
997
+ var size = end - i;
998
+ list.push(func.substr(i, size));
999
+ i += size + 2; // size + 'EE'
1000
+ break;
1001
+ }
1002
+ case 'A': { // array
1003
+ var size = parseInt(func.substr(i));
1004
+ i += size.toString().length;
1005
+ if (func[i] !== '_') throw '?';
1006
+ i++; // skip _
1007
+ list.push(parse(true, 1, true)[0] + ' [' + size + ']');
1008
+ break;
1009
+ }
1010
+ case 'E': break paramLoop;
1011
+ default: ret += '?' + c; break paramLoop;
1012
+ }
1013
+ }
1014
+ }
1015
+ if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)
1016
+ return rawList ? list : ret + flushList();
1017
+ }
1018
+ return parse();
1019
+ } catch(e) {
1020
+ return func;
1021
+ }
1022
+}
1023
+
1024
+function demangleAll(text) {
1025
+ return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });
1026
+}
1027
+
1028
+function stackTrace() {
1029
+ var stack = new Error().stack;
1030
+ return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.
1031
+}
1032
+
1033
+// Memory management
1034
+
1035
+var PAGE_SIZE = 4096;
1036
+function alignMemoryPage(x) {
1037
+ return (x+4095)&-4096;
1038
+}
1039
+
1040
+var HEAP;
1041
+var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
1042
+
1043
+var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
1044
+var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
1045
+var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk
1046
+
1047
+function enlargeMemory() {
1048
+ abort('Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + TOTAL_MEMORY + ', (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');
1049
+}
1050
+
1051
+var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
1052
+var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;
1053
+var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
1054
+
1055
+
1056
+// Initialize the runtime's memory
1057
+// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
1058
+assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
1059
+ 'Cannot fallback to non-typed array case: Code is too specialized');
1060
+
1061
+var buffer = new ArrayBuffer(TOTAL_MEMORY);
1062
+HEAP8 = new Int8Array(buffer);
1063
+HEAP16 = new Int16Array(buffer);
1064
+HEAP32 = new Int32Array(buffer);
1065
+HEAPU8 = new Uint8Array(buffer);
1066
+HEAPU16 = new Uint16Array(buffer);
1067
+HEAPU32 = new Uint32Array(buffer);
1068
+HEAPF32 = new Float32Array(buffer);
1069
+HEAPF64 = new Float64Array(buffer);
1070
+
1071
+// Endianness check (note: assumes compiler arch was little-endian)
1072
+HEAP32[0] = 255;
1073
+assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');
1074
+
1075
+Module['HEAP'] = HEAP;
1076
+Module['HEAP8'] = HEAP8;
1077
+Module['HEAP16'] = HEAP16;
1078
+Module['HEAP32'] = HEAP32;
1079
+Module['HEAPU8'] = HEAPU8;
1080
+Module['HEAPU16'] = HEAPU16;
1081
+Module['HEAPU32'] = HEAPU32;
1082
+Module['HEAPF32'] = HEAPF32;
1083
+Module['HEAPF64'] = HEAPF64;
1084
+
1085
+function callRuntimeCallbacks(callbacks) {
1086
+ while(callbacks.length > 0) {
1087
+ var callback = callbacks.shift();
1088
+ if (typeof callback == 'function') {
1089
+ callback();
1090
+ continue;
1091
+ }
1092
+ var func = callback.func;
1093
+ if (typeof func === 'number') {
1094
+ if (callback.arg === undefined) {
1095
+ Runtime.dynCall('v', func);
1096
+ } else {
1097
+ Runtime.dynCall('vi', func, [callback.arg]);
1098
+ }
1099
+ } else {
1100
+ func(callback.arg === undefined ? null : callback.arg);
1101
+ }
1102
+ }
1103
+}
1104
+
1105
+var __ATPRERUN__ = []; // functions called before the runtime is initialized
1106
+var __ATINIT__ = []; // functions called during startup
1107
+var __ATMAIN__ = []; // functions called when main() is to be run
1108
+var __ATEXIT__ = []; // functions called during shutdown
1109
+var __ATPOSTRUN__ = []; // functions called after the runtime has exited
1110
+
1111
+var runtimeInitialized = false;
1112
+
1113
+function preRun() {
1114
+ // compatibility - merge in anything from Module['preRun'] at this time
1115
+ if (Module['preRun']) {
1116
+ if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
1117
+ while (Module['preRun'].length) {
1118
+ addOnPreRun(Module['preRun'].shift());
1119
+ }
1120
+ }
1121
+ callRuntimeCallbacks(__ATPRERUN__);
1122
+}
1123
+
1124
+function ensureInitRuntime() {
1125
+ if (runtimeInitialized) return;
1126
+ runtimeInitialized = true;
1127
+ callRuntimeCallbacks(__ATINIT__);
1128
+}
1129
+
1130
+function preMain() {
1131
+ callRuntimeCallbacks(__ATMAIN__);
1132
+}
1133
+
1134
+function exitRuntime() {
1135
+ callRuntimeCallbacks(__ATEXIT__);
1136
+}
1137
+
1138
+function postRun() {
1139
+ // compatibility - merge in anything from Module['postRun'] at this time
1140
+ if (Module['postRun']) {
1141
+ if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
1142
+ while (Module['postRun'].length) {
1143
+ addOnPostRun(Module['postRun'].shift());
1144
+ }
1145
+ }
1146
+ callRuntimeCallbacks(__ATPOSTRUN__);
1147
+}
1148
+
1149
+function addOnPreRun(cb) {
1150
+ __ATPRERUN__.unshift(cb);
1151
+}
1152
+Module['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;
1153
+
1154
+function addOnInit(cb) {
1155
+ __ATINIT__.unshift(cb);
1156
+}
1157
+Module['addOnInit'] = Module.addOnInit = addOnInit;
1158
+
1159
+function addOnPreMain(cb) {
1160
+ __ATMAIN__.unshift(cb);
1161
+}
1162
+Module['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;
1163
+
1164
+function addOnExit(cb) {
1165
+ __ATEXIT__.unshift(cb);
1166
+}
1167
+Module['addOnExit'] = Module.addOnExit = addOnExit;
1168
+
1169
+function addOnPostRun(cb) {
1170
+ __ATPOSTRUN__.unshift(cb);
1171
+}
1172
+Module['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;
1173
+
1174
+// Tools
1175
+
1176
+// This processes a JS string into a C-line array of numbers, 0-terminated.
1177
+// For LLVM-originating strings, see parser.js:parseLLVMString function
1178
+function intArrayFromString(stringy, dontAddNull, length /* optional */) {
1179
+ var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
1180
+ if (length) {
1181
+ ret.length = length;
1182
+ }
1183
+ if (!dontAddNull) {
1184
+ ret.push(0);
1185
+ }
1186
+ return ret;
1187
+}
1188
+Module['intArrayFromString'] = intArrayFromString;
1189
+
1190
+function intArrayToString(array) {
1191
+ var ret = [];
1192
+ for (var i = 0; i < array.length; i++) {
1193
+ var chr = array[i];
1194
+ if (chr > 0xFF) {
1195
+ assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.');
1196
+ chr &= 0xFF;
1197
+ }
1198
+ ret.push(String.fromCharCode(chr));
1199
+ }
1200
+ return ret.join('');
1201
+}
1202
+Module['intArrayToString'] = intArrayToString;
1203
+
1204
+// Write a Javascript array to somewhere in the heap
1205
+function writeStringToMemory(string, buffer, dontAddNull) {
1206
+ var array = intArrayFromString(string, dontAddNull);
1207
+ var i = 0;
1208
+ while (i < array.length) {
1209
+ var chr = array[i];
1210
+ HEAP8[(((buffer)+(i))|0)]=chr;
1211
+ i = i + 1;
1212
+ }
1213
+}
1214
+Module['writeStringToMemory'] = writeStringToMemory;
1215
+
1216
+function writeArrayToMemory(array, buffer) {
1217
+ for (var i = 0; i < array.length; i++) {
1218
+ HEAP8[(((buffer)+(i))|0)]=array[i];
1219
+ }
1220
+}
1221
+Module['writeArrayToMemory'] = writeArrayToMemory;
1222
+
1223
+function writeAsciiToMemory(str, buffer, dontAddNull) {
1224
+ for (var i = 0; i < str.length; i++) {
1225
+ assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff);
1226
+ HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);
1227
+ }
1228
+ if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;
1229
+}
1230
+Module['writeAsciiToMemory'] = writeAsciiToMemory;
1231
+
1232
+function unSign(value, bits, ignore, sig) {
1233
+ if (value >= 0) {
1234
+ return value;
1235
+ }
1236
+ return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
1237
+ : Math.pow(2, bits) + value;
1238
+}
1239
+function reSign(value, bits, ignore, sig) {
1240
+ if (value <= 0) {
1241
+ return value;
1242
+ }
1243
+ var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
1244
+ : Math.pow(2, bits-1);
1245
+ if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that
1246
+ // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
1247
+ // TODO: In i64 mode 1, resign the two parts separately and safely
1248
+ value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
1249
+ }
1250
+ return value;
1251
+}
1252
+
1253
+// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
1254
+if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
1255
+ var ah = a >>> 16;
1256
+ var al = a & 0xffff;
1257
+ var bh = b >>> 16;
1258
+ var bl = b & 0xffff;
1259
+ return (al*bl + ((ah*bl + al*bh) << 16))|0;
1260
+};
1261
+Math.imul = Math['imul'];
1262
+
1263
+
1264
+var Math_abs = Math.abs;
1265
+var Math_cos = Math.cos;
1266
+var Math_sin = Math.sin;
1267
+var Math_tan = Math.tan;
1268
+var Math_acos = Math.acos;
1269
+var Math_asin = Math.asin;
1270
+var Math_atan = Math.atan;
1271
+var Math_atan2 = Math.atan2;
1272
+var Math_exp = Math.exp;
1273
+var Math_log = Math.log;
1274
+var Math_sqrt = Math.sqrt;
1275
+var Math_ceil = Math.ceil;
1276
+var Math_floor = Math.floor;
1277
+var Math_pow = Math.pow;
1278
+var Math_imul = Math.imul;
1279
+var Math_fround = Math.fround;
1280
+var Math_min = Math.min;
1281
+
1282
+// A counter of dependencies for calling run(). If we need to
1283
+// do asynchronous work before running, increment this and
1284
+// decrement it. Incrementing must happen in a place like
1285
+// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
1286
+// Note that you can add dependencies in preRun, even though
1287
+// it happens right before run - run will be postponed until
1288
+// the dependencies are met.
1289
+var runDependencies = 0;
1290
+var runDependencyWatcher = null;
1291
+var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
1292
+var runDependencyTracking = {};
1293
+
1294
+function addRunDependency(id) {
1295
+ runDependencies++;
1296
+ if (Module['monitorRunDependencies']) {
1297
+ Module['monitorRunDependencies'](runDependencies);
1298
+ }
1299
+ if (id) {
1300
+ assert(!runDependencyTracking[id]);
1301
+ runDependencyTracking[id] = 1;
1302
+ if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
1303
+ // Check for missing dependencies every few seconds
1304
+ runDependencyWatcher = setInterval(function() {
1305
+ var shown = false;
1306
+ for (var dep in runDependencyTracking) {
1307
+ if (!shown) {
1308
+ shown = true;
1309
+ Module.printErr('still waiting on run dependencies:');
1310
+ }
1311
+ Module.printErr('dependency: ' + dep);
1312
+ }
1313
+ if (shown) {
1314
+ Module.printErr('(end of list)');
1315
+ }
1316
+ }, 10000);
1317
+ }
1318
+ } else {
1319
+ Module.printErr('warning: run dependency added without ID');
1320
+ }
1321
+}
1322
+Module['addRunDependency'] = addRunDependency;
1323
+function removeRunDependency(id) {
1324
+ runDependencies--;
1325
+ if (Module['monitorRunDependencies']) {
1326
+ Module['monitorRunDependencies'](runDependencies);
1327
+ }
1328
+ if (id) {
1329
+ assert(runDependencyTracking[id]);
1330
+ delete runDependencyTracking[id];
1331
+ } else {
1332
+ Module.printErr('warning: run dependency removed without ID');
1333
+ }
1334
+ if (runDependencies == 0) {
1335
+ if (runDependencyWatcher !== null) {
1336
+ clearInterval(runDependencyWatcher);
1337
+ runDependencyWatcher = null;
1338
+ }
1339
+ if (dependenciesFulfilled) {
1340
+ var callback = dependenciesFulfilled;
1341
+ dependenciesFulfilled = null;
1342
+ callback(); // can add another dependenciesFulfilled
1343
+ }
1344
+ }
1345
+}
1346
+Module['removeRunDependency'] = removeRunDependency;
1347
+
1348
+Module["preloadedImages"] = {}; // maps url to image data
1349
+Module["preloadedAudios"] = {}; // maps url to audio data
1350
+
1351
+
1352
+var memoryInitializer = null;
1353
+
1354
+// === Body ===
1355
+
1356
+
1357
+
1358
+STATIC_BASE = 8;
1359
+
1360
+STATICTOP = STATIC_BASE + 504;
1361
+
1362
+
1363
+/* global initializers */ __ATINIT__.push({ func: function() { runPostSets() } });
1364
+
1365
+
1366
+
1367
+
1368
+
1369
+/* memory initializer */ allocate([255,255,255,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);
1370
+function runPostSets() {
1371
+
1372
+
1373
+}
1374
+
1375
+var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);
1376
+
1377
+assert(tempDoublePtr % 8 == 0);
1378
+
1379
+function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
1380
+
1381
+ HEAP8[tempDoublePtr] = HEAP8[ptr];
1382
+
1383
+ HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
1384
+
1385
+ HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
1386
+
1387
+ HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
1388
+
1389
+}
1390
+
1391
+function copyTempDouble(ptr) {
1392
+
1393
+ HEAP8[tempDoublePtr] = HEAP8[ptr];
1394
+
1395
+ HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
1396
+
1397
+ HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
1398
+
1399
+ HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
1400
+
1401
+ HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
1402
+
1403
+ HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
1404
+
1405
+ HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
1406
+
1407
+ HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
1408
+
1409
+}
1410
+
1411
+
1412
+
1413
+ function _memset(ptr, value, num) {
1414
+ ptr = ptr|0; value = value|0; num = num|0;
1415
+ var stop = 0, value4 = 0, stop4 = 0, unaligned = 0;
1416
+ stop = (ptr + num)|0;
1417
+ if ((num|0) >= 20) {
1418
+ // This is unaligned, but quite large, so work hard to get to aligned settings
1419
+ value = value & 0xff;
1420
+ unaligned = ptr & 3;
1421
+ value4 = value | (value << 8) | (value << 16) | (value << 24);
1422
+ stop4 = stop & ~3;
1423
+ if (unaligned) {
1424
+ unaligned = (ptr + 4 - unaligned)|0;
1425
+ while ((ptr|0) < (unaligned|0)) { // no need to check for stop, since we have large num
1426
+ HEAP8[(ptr)]=value;
1427
+ ptr = (ptr+1)|0;
1428
+ }
1429
+ }
1430
+ while ((ptr|0) < (stop4|0)) {
1431
+ HEAP32[((ptr)>>2)]=value4;
1432
+ ptr = (ptr+4)|0;
1433
+ }
1434
+ }
1435
+ while ((ptr|0) < (stop|0)) {
1436
+ HEAP8[(ptr)]=value;
1437
+ ptr = (ptr+1)|0;
1438
+ }
1439
+ return (ptr-num)|0;
1440
+ }var _llvm_memset_p0i8_i32=_memset;
1441
+
1442
+
1443
+ function _memcpy(dest, src, num) {
1444
+ dest = dest|0; src = src|0; num = num|0;
1445
+ var ret = 0;
1446
+ ret = dest|0;
1447
+ if ((dest&3) == (src&3)) {
1448
+ while (dest & 3) {
1449
+ if ((num|0) == 0) return ret|0;
1450
+ HEAP8[(dest)]=HEAP8[(src)];
1451
+ dest = (dest+1)|0;
1452
+ src = (src+1)|0;
1453
+ num = (num-1)|0;
1454
+ }
1455
+ while ((num|0) >= 4) {
1456
+ HEAP32[((dest)>>2)]=HEAP32[((src)>>2)];
1457
+ dest = (dest+4)|0;
1458
+ src = (src+4)|0;
1459
+ num = (num-4)|0;
1460
+ }
1461
+ }
1462
+ while ((num|0) > 0) {
1463
+ HEAP8[(dest)]=HEAP8[(src)];
1464
+ dest = (dest+1)|0;
1465
+ src = (src+1)|0;
1466
+ num = (num-1)|0;
1467
+ }
1468
+ return ret|0;
1469
+ }var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;
1470
+
1471
+ function _abort() {
1472
+ Module['abort']();
1473
+ }
1474
+
1475
+
1476
+
1477
+ var ___errno_state=0;function ___setErrNo(value) {
1478
+ // For convenient setting and returning of errno.
1479
+ HEAP32[((___errno_state)>>2)]=value;
1480
+ return value;
1481
+ }function ___errno_location() {
1482
+ return ___errno_state;
1483
+ }
1484
+
1485
+ function _sbrk(bytes) {
1486
+ // Implement a Linux-like 'memory area' for our 'process'.
1487
+ // Changes the size of the memory area by |bytes|; returns the
1488
+ // address of the previous top ('break') of the memory area
1489
+ // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP
1490
+ var self = _sbrk;
1491
+ if (!self.called) {
1492
+ DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned
1493
+ self.called = true;
1494
+ assert(Runtime.dynamicAlloc);
1495
+ self.alloc = Runtime.dynamicAlloc;
1496
+ Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };
1497
+ }
1498
+ var ret = DYNAMICTOP;
1499
+ if (bytes != 0) self.alloc(bytes);
1500
+ return ret; // Previous break location.
1501
+ }
1502
+
1503
+
1504
+ var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name) {
1505
+ // long sysconf(int name);
1506
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
1507
+ switch(name) {
1508
+ case 30: return PAGE_SIZE;
1509
+ case 132:
1510
+ case 133:
1511
+ case 12:
1512
+ case 137:
1513
+ case 138:
1514
+ case 15:
1515
+ case 235:
1516
+ case 16:
1517
+ case 17:
1518
+ case 18:
1519
+ case 19:
1520
+ case 20:
1521
+ case 149:
1522
+ case 13:
1523
+ case 10:
1524
+ case 236:
1525
+ case 153:
1526
+ case 9:
1527
+ case 21:
1528
+ case 22:
1529
+ case 159:
1530
+ case 154:
1531
+ case 14:
1532
+ case 77:
1533
+ case 78:
1534
+ case 139:
1535
+ case 80:
1536
+ case 81:
1537
+ case 79:
1538
+ case 82:
1539
+ case 68:
1540
+ case 67:
1541
+ case 164:
1542
+ case 11:
1543
+ case 29:
1544
+ case 47:
1545
+ case 48:
1546
+ case 95:
1547
+ case 52:
1548
+ case 51:
1549
+ case 46:
1550
+ return 200809;
1551
+ case 27:
1552
+ case 246:
1553
+ case 127:
1554
+ case 128:
1555
+ case 23:
1556
+ case 24:
1557
+ case 160:
1558
+ case 161:
1559
+ case 181:
1560
+ case 182:
1561
+ case 242:
1562
+ case 183:
1563
+ case 184:
1564
+ case 243:
1565
+ case 244:
1566
+ case 245:
1567
+ case 165:
1568
+ case 178:
1569
+ case 179:
1570
+ case 49:
1571
+ case 50:
1572
+ case 168:
1573
+ case 169:
1574
+ case 175:
1575
+ case 170:
1576
+ case 171:
1577
+ case 172:
1578
+ case 97:
1579
+ case 76:
1580
+ case 32:
1581
+ case 173:
1582
+ case 35:
1583
+ return -1;
1584
+ case 176:
1585
+ case 177:
1586
+ case 7:
1587
+ case 155:
1588
+ case 8:
1589
+ case 157:
1590
+ case 125:
1591
+ case 126:
1592
+ case 92:
1593
+ case 93:
1594
+ case 129:
1595
+ case 130:
1596
+ case 131:
1597
+ case 94:
1598
+ case 91:
1599
+ return 1;
1600
+ case 74:
1601
+ case 60:
1602
+ case 69:
1603
+ case 70:
1604
+ case 4:
1605
+ return 1024;
1606
+ case 31:
1607
+ case 42:
1608
+ case 72:
1609
+ return 32;
1610
+ case 87:
1611
+ case 26:
1612
+ case 33:
1613
+ return 2147483647;
1614
+ case 34:
1615
+ case 1:
1616
+ return 47839;
1617
+ case 38:
1618
+ case 36:
1619
+ return 99;
1620
+ case 43:
1621
+ case 37:
1622
+ return 2048;
1623
+ case 0: return 2097152;
1624
+ case 3: return 65536;
1625
+ case 28: return 32768;
1626
+ case 44: return 32767;
1627
+ case 75: return 16384;
1628
+ case 39: return 1000;
1629
+ case 89: return 700;
1630
+ case 71: return 256;
1631
+ case 40: return 255;
1632
+ case 2: return 100;
1633
+ case 180: return 64;
1634
+ case 25: return 20;
1635
+ case 5: return 16;
1636
+ case 6: return 6;
1637
+ case 73: return 4;
1638
+ case 84: return 1;
1639
+ }
1640
+ ___setErrNo(ERRNO_CODES.EINVAL);
1641
+ return -1;
1642
+ }
1643
+
1644
+ function _time(ptr) {
1645
+ var ret = Math.floor(Date.now()/1000);
1646
+ if (ptr) {
1647
+ HEAP32[((ptr)>>2)]=ret;
1648
+ }
1649
+ return ret;
1650
+ }
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+ function _strlen(ptr) {
1657
+ ptr = ptr|0;
1658
+ var curr = 0;
1659
+ curr = ptr;
1660
+ while (HEAP8[(curr)]) {
1661
+ curr = (curr + 1)|0;
1662
+ }
1663
+ return (curr - ptr)|0;
1664
+ }
1665
+
1666
+
1667
+
1668
+
1669
+ var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};
1670
+
1671
+ var TTY={ttys:[],init:function () {
1672
+ // https://github.com/kripken/emscripten/pull/1555
1673
+ // if (ENVIRONMENT_IS_NODE) {
1674
+ // // currently, FS.init does not distinguish if process.stdin is a file or TTY
1675
+ // // device, it always assumes it's a TTY device. because of this, we're forcing
1676
+ // // process.stdin to UTF8 encoding to at least make stdin reading compatible
1677
+ // // with text files until FS.init can be refactored.
1678
+ // process['stdin']['setEncoding']('utf8');
1679
+ // }
1680
+ },shutdown:function () {
1681
+ // https://github.com/kripken/emscripten/pull/1555
1682
+ // if (ENVIRONMENT_IS_NODE) {
1683
+ // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
1684
+ // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation
1685
+ // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
1686
+ // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
1687
+ // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
1688
+ // process['stdin']['pause']();
1689
+ // }
1690
+ },register:function (dev, ops) {
1691
+ TTY.ttys[dev] = { input: [], output: [], ops: ops };
1692
+ FS.registerDevice(dev, TTY.stream_ops);
1693
+ },stream_ops:{open:function (stream) {
1694
+ var tty = TTY.ttys[stream.node.rdev];
1695
+ if (!tty) {
1696
+ throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
1697
+ }
1698
+ stream.tty = tty;
1699
+ stream.seekable = false;
1700
+ },close:function (stream) {
1701
+ // flush any pending line data
1702
+ if (stream.tty.output.length) {
1703
+ stream.tty.ops.put_char(stream.tty, 10);
1704
+ }
1705
+ },read:function (stream, buffer, offset, length, pos /* ignored */) {
1706
+ if (!stream.tty || !stream.tty.ops.get_char) {
1707
+ throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
1708
+ }
1709
+ var bytesRead = 0;
1710
+ for (var i = 0; i < length; i++) {
1711
+ var result;
1712
+ try {
1713
+ result = stream.tty.ops.get_char(stream.tty);
1714
+ } catch (e) {
1715
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
1716
+ }
1717
+ if (result === undefined && bytesRead === 0) {
1718
+ throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
1719
+ }
1720
+ if (result === null || result === undefined) break;
1721
+ bytesRead++;
1722
+ buffer[offset+i] = result;
1723
+ }
1724
+ if (bytesRead) {
1725
+ stream.node.timestamp = Date.now();
1726
+ }
1727
+ return bytesRead;
1728
+ },write:function (stream, buffer, offset, length, pos) {
1729
+ if (!stream.tty || !stream.tty.ops.put_char) {
1730
+ throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
1731
+ }
1732
+ for (var i = 0; i < length; i++) {
1733
+ try {
1734
+ stream.tty.ops.put_char(stream.tty, buffer[offset+i]);
1735
+ } catch (e) {
1736
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
1737
+ }
1738
+ }
1739
+ if (length) {
1740
+ stream.node.timestamp = Date.now();
1741
+ }
1742
+ return i;
1743
+ }},default_tty_ops:{get_char:function (tty) {
1744
+ if (!tty.input.length) {
1745
+ var result = null;
1746
+ if (ENVIRONMENT_IS_NODE) {
1747
+ result = process['stdin']['read']();
1748
+ if (!result) {
1749
+ if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {
1750
+ return null; // EOF
1751
+ }
1752
+ return undefined; // no data available
1753
+ }
1754
+ } else if (typeof window != 'undefined' &&
1755
+ typeof window.prompt == 'function') {
1756
+ // Browser.
1757
+ result = window.prompt('Input: '); // returns null on cancel
1758
+ if (result !== null) {
1759
+ result += '\n';
1760
+ }
1761
+ } else if (typeof readline == 'function') {
1762
+ // Command line.
1763
+ result = readline();
1764
+ if (result !== null) {
1765
+ result += '\n';
1766
+ }
1767
+ }
1768
+ if (!result) {
1769
+ return null;
1770
+ }
1771
+ tty.input = intArrayFromString(result, true);
1772
+ }
1773
+ return tty.input.shift();
1774
+ },put_char:function (tty, val) {
1775
+ if (val === null || val === 10) {
1776
+ Module['print'](tty.output.join(''));
1777
+ tty.output = [];
1778
+ } else {
1779
+ tty.output.push(TTY.utf8.processCChar(val));
1780
+ }
1781
+ }},default_tty1_ops:{put_char:function (tty, val) {
1782
+ if (val === null || val === 10) {
1783
+ Module['printErr'](tty.output.join(''));
1784
+ tty.output = [];
1785
+ } else {
1786
+ tty.output.push(TTY.utf8.processCChar(val));
1787
+ }
1788
+ }}};
1789
+
1790
+ var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {
1791
+ return MEMFS.createNode(null, '/', 16384 | 0777, 0);
1792
+ },createNode:function (parent, name, mode, dev) {
1793
+ if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
1794
+ // no supported
1795
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
1796
+ }
1797
+ if (!MEMFS.ops_table) {
1798
+ MEMFS.ops_table = {
1799
+ dir: {
1800
+ node: {
1801
+ getattr: MEMFS.node_ops.getattr,
1802
+ setattr: MEMFS.node_ops.setattr,
1803
+ lookup: MEMFS.node_ops.lookup,
1804
+ mknod: MEMFS.node_ops.mknod,
1805
+ mknod: MEMFS.node_ops.mknod,
1806
+ rename: MEMFS.node_ops.rename,
1807
+ unlink: MEMFS.node_ops.unlink,
1808
+ rmdir: MEMFS.node_ops.rmdir,
1809
+ readdir: MEMFS.node_ops.readdir,
1810
+ symlink: MEMFS.node_ops.symlink
1811
+ },
1812
+ stream: {
1813
+ llseek: MEMFS.stream_ops.llseek
1814
+ }
1815
+ },
1816
+ file: {
1817
+ node: {
1818
+ getattr: MEMFS.node_ops.getattr,
1819
+ setattr: MEMFS.node_ops.setattr
1820
+ },
1821
+ stream: {
1822
+ llseek: MEMFS.stream_ops.llseek,
1823
+ read: MEMFS.stream_ops.read,
1824
+ write: MEMFS.stream_ops.write,
1825
+ allocate: MEMFS.stream_ops.allocate,
1826
+ mmap: MEMFS.stream_ops.mmap
1827
+ }
1828
+ },
1829
+ link: {
1830
+ node: {
1831
+ getattr: MEMFS.node_ops.getattr,
1832
+ setattr: MEMFS.node_ops.setattr,
1833
+ readlink: MEMFS.node_ops.readlink
1834
+ },
1835
+ stream: {}
1836
+ },
1837
+ chrdev: {
1838
+ node: {
1839
+ getattr: MEMFS.node_ops.getattr,
1840
+ setattr: MEMFS.node_ops.setattr
1841
+ },
1842
+ stream: FS.chrdev_stream_ops
1843
+ },
1844
+ };
1845
+ }
1846
+ var node = FS.createNode(parent, name, mode, dev);
1847
+ if (FS.isDir(node.mode)) {
1848
+ node.node_ops = MEMFS.ops_table.dir.node;
1849
+ node.stream_ops = MEMFS.ops_table.dir.stream;
1850
+ node.contents = {};
1851
+ } else if (FS.isFile(node.mode)) {
1852
+ node.node_ops = MEMFS.ops_table.file.node;
1853
+ node.stream_ops = MEMFS.ops_table.file.stream;
1854
+ node.contents = [];
1855
+ node.contentMode = MEMFS.CONTENT_FLEXIBLE;
1856
+ } else if (FS.isLink(node.mode)) {
1857
+ node.node_ops = MEMFS.ops_table.link.node;
1858
+ node.stream_ops = MEMFS.ops_table.link.stream;
1859
+ } else if (FS.isChrdev(node.mode)) {
1860
+ node.node_ops = MEMFS.ops_table.chrdev.node;
1861
+ node.stream_ops = MEMFS.ops_table.chrdev.stream;
1862
+ }
1863
+ node.timestamp = Date.now();
1864
+ // add the new node to the parent
1865
+ if (parent) {
1866
+ parent.contents[name] = node;
1867
+ }
1868
+ return node;
1869
+ },ensureFlexible:function (node) {
1870
+ if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {
1871
+ var contents = node.contents;
1872
+ node.contents = Array.prototype.slice.call(contents);
1873
+ node.contentMode = MEMFS.CONTENT_FLEXIBLE;
1874
+ }
1875
+ },node_ops:{getattr:function (node) {
1876
+ var attr = {};
1877
+ // device numbers reuse inode numbers.
1878
+ attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
1879
+ attr.ino = node.id;
1880
+ attr.mode = node.mode;
1881
+ attr.nlink = 1;
1882
+ attr.uid = 0;
1883
+ attr.gid = 0;
1884
+ attr.rdev = node.rdev;
1885
+ if (FS.isDir(node.mode)) {
1886
+ attr.size = 4096;
1887
+ } else if (FS.isFile(node.mode)) {
1888
+ attr.size = node.contents.length;
1889
+ } else if (FS.isLink(node.mode)) {
1890
+ attr.size = node.link.length;
1891
+ } else {
1892
+ attr.size = 0;
1893
+ }
1894
+ attr.atime = new Date(node.timestamp);
1895
+ attr.mtime = new Date(node.timestamp);
1896
+ attr.ctime = new Date(node.timestamp);
1897
+ // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
1898
+ // but this is not required by the standard.
1899
+ attr.blksize = 4096;
1900
+ attr.blocks = Math.ceil(attr.size / attr.blksize);
1901
+ return attr;
1902
+ },setattr:function (node, attr) {
1903
+ if (attr.mode !== undefined) {
1904
+ node.mode = attr.mode;
1905
+ }
1906
+ if (attr.timestamp !== undefined) {
1907
+ node.timestamp = attr.timestamp;
1908
+ }
1909
+ if (attr.size !== undefined) {
1910
+ MEMFS.ensureFlexible(node);
1911
+ var contents = node.contents;
1912
+ if (attr.size < contents.length) contents.length = attr.size;
1913
+ else while (attr.size > contents.length) contents.push(0);
1914
+ }
1915
+ },lookup:function (parent, name) {
1916
+ throw FS.genericErrors[ERRNO_CODES.ENOENT];
1917
+ },mknod:function (parent, name, mode, dev) {
1918
+ return MEMFS.createNode(parent, name, mode, dev);
1919
+ },rename:function (old_node, new_dir, new_name) {
1920
+ // if we're overwriting a directory at new_name, make sure it's empty.
1921
+ if (FS.isDir(old_node.mode)) {
1922
+ var new_node;
1923
+ try {
1924
+ new_node = FS.lookupNode(new_dir, new_name);
1925
+ } catch (e) {
1926
+ }
1927
+ if (new_node) {
1928
+ for (var i in new_node.contents) {
1929
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
1930
+ }
1931
+ }
1932
+ }
1933
+ // do the internal rewiring
1934
+ delete old_node.parent.contents[old_node.name];
1935
+ old_node.name = new_name;
1936
+ new_dir.contents[new_name] = old_node;
1937
+ old_node.parent = new_dir;
1938
+ },unlink:function (parent, name) {
1939
+ delete parent.contents[name];
1940
+ },rmdir:function (parent, name) {
1941
+ var node = FS.lookupNode(parent, name);
1942
+ for (var i in node.contents) {
1943
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
1944
+ }
1945
+ delete parent.contents[name];
1946
+ },readdir:function (node) {
1947
+ var entries = ['.', '..']
1948
+ for (var key in node.contents) {
1949
+ if (!node.contents.hasOwnProperty(key)) {
1950
+ continue;
1951
+ }
1952
+ entries.push(key);
1953
+ }
1954
+ return entries;
1955
+ },symlink:function (parent, newname, oldpath) {
1956
+ var node = MEMFS.createNode(parent, newname, 0777 | 40960, 0);
1957
+ node.link = oldpath;
1958
+ return node;
1959
+ },readlink:function (node) {
1960
+ if (!FS.isLink(node.mode)) {
1961
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
1962
+ }
1963
+ return node.link;
1964
+ }},stream_ops:{read:function (stream, buffer, offset, length, position) {
1965
+ var contents = stream.node.contents;
1966
+ if (position >= contents.length)
1967
+ return 0;
1968
+ var size = Math.min(contents.length - position, length);
1969
+ assert(size >= 0);
1970
+ if (size > 8 && contents.subarray) { // non-trivial, and typed array
1971
+ buffer.set(contents.subarray(position, position + size), offset);
1972
+ } else
1973
+ {
1974
+ for (var i = 0; i < size; i++) {
1975
+ buffer[offset + i] = contents[position + i];
1976
+ }
1977
+ }
1978
+ return size;
1979
+ },write:function (stream, buffer, offset, length, position, canOwn) {
1980
+ var node = stream.node;
1981
+ node.timestamp = Date.now();
1982
+ var contents = node.contents;
1983
+ if (length && contents.length === 0 && position === 0 && buffer.subarray) {
1984
+ // just replace it with the new data
1985
+ assert(buffer.length);
1986
+ if (canOwn && offset === 0) {
1987
+ node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.
1988
+ node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;
1989
+ } else {
1990
+ node.contents = new Uint8Array(buffer.subarray(offset, offset+length));
1991
+ node.contentMode = MEMFS.CONTENT_FIXED;
1992
+ }
1993
+ return length;
1994
+ }
1995
+ MEMFS.ensureFlexible(node);
1996
+ var contents = node.contents;
1997
+ while (contents.length < position) contents.push(0);
1998
+ for (var i = 0; i < length; i++) {
1999
+ contents[position + i] = buffer[offset + i];
2000
+ }
2001
+ return length;
2002
+ },llseek:function (stream, offset, whence) {
2003
+ var position = offset;
2004
+ if (whence === 1) { // SEEK_CUR.
2005
+ position += stream.position;
2006
+ } else if (whence === 2) { // SEEK_END.
2007
+ if (FS.isFile(stream.node.mode)) {
2008
+ position += stream.node.contents.length;
2009
+ }
2010
+ }
2011
+ if (position < 0) {
2012
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2013
+ }
2014
+ stream.ungotten = [];
2015
+ stream.position = position;
2016
+ return position;
2017
+ },allocate:function (stream, offset, length) {
2018
+ MEMFS.ensureFlexible(stream.node);
2019
+ var contents = stream.node.contents;
2020
+ var limit = offset + length;
2021
+ while (limit > contents.length) contents.push(0);
2022
+ },mmap:function (stream, buffer, offset, length, position, prot, flags) {
2023
+ if (!FS.isFile(stream.node.mode)) {
2024
+ throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
2025
+ }
2026
+ var ptr;
2027
+ var allocated;
2028
+ var contents = stream.node.contents;
2029
+ // Only make a new copy when MAP_PRIVATE is specified.
2030
+ if ( !(flags & 2) &&
2031
+ (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {
2032
+ // We can't emulate MAP_SHARED when the file is not backed by the buffer
2033
+ // we're mapping to (e.g. the HEAP buffer).
2034
+ allocated = false;
2035
+ ptr = contents.byteOffset;
2036
+ } else {
2037
+ // Try to avoid unnecessary slices.
2038
+ if (position > 0 || position + length < contents.length) {
2039
+ if (contents.subarray) {
2040
+ contents = contents.subarray(position, position + length);
2041
+ } else {
2042
+ contents = Array.prototype.slice.call(contents, position, position + length);
2043
+ }
2044
+ }
2045
+ allocated = true;
2046
+ ptr = _malloc(length);
2047
+ if (!ptr) {
2048
+ throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
2049
+ }
2050
+ buffer.set(contents, ptr);
2051
+ }
2052
+ return { ptr: ptr, allocated: allocated };
2053
+ }}};
2054
+
2055
+ var IDBFS={dbs:{},indexedDB:function () {
2056
+ return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
2057
+ },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",mount:function (mount) {
2058
+ return MEMFS.mount.apply(null, arguments);
2059
+ },syncfs:function (mount, populate, callback) {
2060
+ IDBFS.getLocalSet(mount, function(err, local) {
2061
+ if (err) return callback(err);
2062
+
2063
+ IDBFS.getRemoteSet(mount, function(err, remote) {
2064
+ if (err) return callback(err);
2065
+
2066
+ var src = populate ? remote : local;
2067
+ var dst = populate ? local : remote;
2068
+
2069
+ IDBFS.reconcile(src, dst, callback);
2070
+ });
2071
+ });
2072
+ },reconcile:function (src, dst, callback) {
2073
+ var total = 0;
2074
+
2075
+ var create = {};
2076
+ for (var key in src.files) {
2077
+ if (!src.files.hasOwnProperty(key)) continue;
2078
+ var e = src.files[key];
2079
+ var e2 = dst.files[key];
2080
+ if (!e2 || e.timestamp > e2.timestamp) {
2081
+ create[key] = e;
2082
+ total++;
2083
+ }
2084
+ }
2085
+
2086
+ var remove = {};
2087
+ for (var key in dst.files) {
2088
+ if (!dst.files.hasOwnProperty(key)) continue;
2089
+ var e = dst.files[key];
2090
+ var e2 = src.files[key];
2091
+ if (!e2) {
2092
+ remove[key] = e;
2093
+ total++;
2094
+ }
2095
+ }
2096
+
2097
+ if (!total) {
2098
+ // early out
2099
+ return callback(null);
2100
+ }
2101
+
2102
+ var completed = 0;
2103
+ function done(err) {
2104
+ if (err) return callback(err);
2105
+ if (++completed >= total) {
2106
+ return callback(null);
2107
+ }
2108
+ };
2109
+
2110
+ // create a single transaction to handle and IDB reads / writes we'll need to do
2111
+ var db = src.type === 'remote' ? src.db : dst.db;
2112
+ var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');
2113
+ transaction.onerror = function transaction_onerror() { callback(this.error); };
2114
+ var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
2115
+
2116
+ for (var path in create) {
2117
+ if (!create.hasOwnProperty(path)) continue;
2118
+ var entry = create[path];
2119
+
2120
+ if (dst.type === 'local') {
2121
+ // save file to local
2122
+ try {
2123
+ if (FS.isDir(entry.mode)) {
2124
+ FS.mkdir(path, entry.mode);
2125
+ } else if (FS.isFile(entry.mode)) {
2126
+ var stream = FS.open(path, 'w+', 0666);
2127
+ FS.write(stream, entry.contents, 0, entry.contents.length, 0, true /* canOwn */);
2128
+ FS.close(stream);
2129
+ }
2130
+ done(null);
2131
+ } catch (e) {
2132
+ return done(e);
2133
+ }
2134
+ } else {
2135
+ // save file to IDB
2136
+ var req = store.put(entry, path);
2137
+ req.onsuccess = function req_onsuccess() { done(null); };
2138
+ req.onerror = function req_onerror() { done(this.error); };
2139
+ }
2140
+ }
2141
+
2142
+ for (var path in remove) {
2143
+ if (!remove.hasOwnProperty(path)) continue;
2144
+ var entry = remove[path];
2145
+
2146
+ if (dst.type === 'local') {
2147
+ // delete file from local
2148
+ try {
2149
+ if (FS.isDir(entry.mode)) {
2150
+ // TODO recursive delete?
2151
+ FS.rmdir(path);
2152
+ } else if (FS.isFile(entry.mode)) {
2153
+ FS.unlink(path);
2154
+ }
2155
+ done(null);
2156
+ } catch (e) {
2157
+ return done(e);
2158
+ }
2159
+ } else {
2160
+ // delete file from IDB
2161
+ var req = store.delete(path);
2162
+ req.onsuccess = function req_onsuccess() { done(null); };
2163
+ req.onerror = function req_onerror() { done(this.error); };
2164
+ }
2165
+ }
2166
+ },getLocalSet:function (mount, callback) {
2167
+ var files = {};
2168
+
2169
+ function isRealDir(p) {
2170
+ return p !== '.' && p !== '..';
2171
+ };
2172
+ function toAbsolute(root) {
2173
+ return function(p) {
2174
+ return PATH.join2(root, p);
2175
+ }
2176
+ };
2177
+
2178
+ var check = FS.readdir(mount.mountpoint)
2179
+ .filter(isRealDir)
2180
+ .map(toAbsolute(mount.mountpoint));
2181
+
2182
+ while (check.length) {
2183
+ var path = check.pop();
2184
+ var stat, node;
2185
+
2186
+ try {
2187
+ var lookup = FS.lookupPath(path);
2188
+ node = lookup.node;
2189
+ stat = FS.stat(path);
2190
+ } catch (e) {
2191
+ return callback(e);
2192
+ }
2193
+
2194
+ if (FS.isDir(stat.mode)) {
2195
+ check.push.apply(check, FS.readdir(path)
2196
+ .filter(isRealDir)
2197
+ .map(toAbsolute(path)));
2198
+
2199
+ files[path] = { mode: stat.mode, timestamp: stat.mtime };
2200
+ } else if (FS.isFile(stat.mode)) {
2201
+ files[path] = { contents: node.contents, mode: stat.mode, timestamp: stat.mtime };
2202
+ } else {
2203
+ return callback(new Error('node type not supported'));
2204
+ }
2205
+ }
2206
+
2207
+ return callback(null, { type: 'local', files: files });
2208
+ },getDB:function (name, callback) {
2209
+ // look it up in the cache
2210
+ var db = IDBFS.dbs[name];
2211
+ if (db) {
2212
+ return callback(null, db);
2213
+ }
2214
+ var req;
2215
+ try {
2216
+ req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);
2217
+ } catch (e) {
2218
+ return onerror(e);
2219
+ }
2220
+ req.onupgradeneeded = function req_onupgradeneeded() {
2221
+ db = req.result;
2222
+ db.createObjectStore(IDBFS.DB_STORE_NAME);
2223
+ };
2224
+ req.onsuccess = function req_onsuccess() {
2225
+ db = req.result;
2226
+ // add to the cache
2227
+ IDBFS.dbs[name] = db;
2228
+ callback(null, db);
2229
+ };
2230
+ req.onerror = function req_onerror() {
2231
+ callback(this.error);
2232
+ };
2233
+ },getRemoteSet:function (mount, callback) {
2234
+ var files = {};
2235
+
2236
+ IDBFS.getDB(mount.mountpoint, function(err, db) {
2237
+ if (err) return callback(err);
2238
+
2239
+ var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
2240
+ transaction.onerror = function transaction_onerror() { callback(this.error); };
2241
+
2242
+ var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
2243
+ store.openCursor().onsuccess = function store_openCursor_onsuccess(event) {
2244
+ var cursor = event.target.result;
2245
+ if (!cursor) {
2246
+ return callback(null, { type: 'remote', db: db, files: files });
2247
+ }
2248
+
2249
+ files[cursor.key] = cursor.value;
2250
+ cursor.continue();
2251
+ };
2252
+ });
2253
+ }};
2254
+
2255
+ var NODEFS={isWindows:false,staticInit:function () {
2256
+ NODEFS.isWindows = !!process.platform.match(/^win/);
2257
+ },mount:function (mount) {
2258
+ assert(ENVIRONMENT_IS_NODE);
2259
+ return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
2260
+ },createNode:function (parent, name, mode, dev) {
2261
+ if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
2262
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2263
+ }
2264
+ var node = FS.createNode(parent, name, mode);
2265
+ node.node_ops = NODEFS.node_ops;
2266
+ node.stream_ops = NODEFS.stream_ops;
2267
+ return node;
2268
+ },getMode:function (path) {
2269
+ var stat;
2270
+ try {
2271
+ stat = fs.lstatSync(path);
2272
+ if (NODEFS.isWindows) {
2273
+ // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
2274
+ // propagate write bits to execute bits.
2275
+ stat.mode = stat.mode | ((stat.mode & 146) >> 1);
2276
+ }
2277
+ } catch (e) {
2278
+ if (!e.code) throw e;
2279
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2280
+ }
2281
+ return stat.mode;
2282
+ },realPath:function (node) {
2283
+ var parts = [];
2284
+ while (node.parent !== node) {
2285
+ parts.push(node.name);
2286
+ node = node.parent;
2287
+ }
2288
+ parts.push(node.mount.opts.root);
2289
+ parts.reverse();
2290
+ return PATH.join.apply(null, parts);
2291
+ },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) {
2292
+ if (flags in NODEFS.flagsToPermissionStringMap) {
2293
+ return NODEFS.flagsToPermissionStringMap[flags];
2294
+ } else {
2295
+ return flags;
2296
+ }
2297
+ },node_ops:{getattr:function (node) {
2298
+ var path = NODEFS.realPath(node);
2299
+ var stat;
2300
+ try {
2301
+ stat = fs.lstatSync(path);
2302
+ } catch (e) {
2303
+ if (!e.code) throw e;
2304
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2305
+ }
2306
+ // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
2307
+ // See http://support.microsoft.com/kb/140365
2308
+ if (NODEFS.isWindows && !stat.blksize) {
2309
+ stat.blksize = 4096;
2310
+ }
2311
+ if (NODEFS.isWindows && !stat.blocks) {
2312
+ stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
2313
+ }
2314
+ return {
2315
+ dev: stat.dev,
2316
+ ino: stat.ino,
2317
+ mode: stat.mode,
2318
+ nlink: stat.nlink,
2319
+ uid: stat.uid,
2320
+ gid: stat.gid,
2321
+ rdev: stat.rdev,
2322
+ size: stat.size,
2323
+ atime: stat.atime,
2324
+ mtime: stat.mtime,
2325
+ ctime: stat.ctime,
2326
+ blksize: stat.blksize,
2327
+ blocks: stat.blocks
2328
+ };
2329
+ },setattr:function (node, attr) {
2330
+ var path = NODEFS.realPath(node);
2331
+ try {
2332
+ if (attr.mode !== undefined) {
2333
+ fs.chmodSync(path, attr.mode);
2334
+ // update the common node structure mode as well
2335
+ node.mode = attr.mode;
2336
+ }
2337
+ if (attr.timestamp !== undefined) {
2338
+ var date = new Date(attr.timestamp);
2339
+ fs.utimesSync(path, date, date);
2340
+ }
2341
+ if (attr.size !== undefined) {
2342
+ fs.truncateSync(path, attr.size);
2343
+ }
2344
+ } catch (e) {
2345
+ if (!e.code) throw e;
2346
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2347
+ }
2348
+ },lookup:function (parent, name) {
2349
+ var path = PATH.join2(NODEFS.realPath(parent), name);
2350
+ var mode = NODEFS.getMode(path);
2351
+ return NODEFS.createNode(parent, name, mode);
2352
+ },mknod:function (parent, name, mode, dev) {
2353
+ var node = NODEFS.createNode(parent, name, mode, dev);
2354
+ // create the backing node for this in the fs root as well
2355
+ var path = NODEFS.realPath(node);
2356
+ try {
2357
+ if (FS.isDir(node.mode)) {
2358
+ fs.mkdirSync(path, node.mode);
2359
+ } else {
2360
+ fs.writeFileSync(path, '', { mode: node.mode });
2361
+ }
2362
+ } catch (e) {
2363
+ if (!e.code) throw e;
2364
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2365
+ }
2366
+ return node;
2367
+ },rename:function (oldNode, newDir, newName) {
2368
+ var oldPath = NODEFS.realPath(oldNode);
2369
+ var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
2370
+ try {
2371
+ fs.renameSync(oldPath, newPath);
2372
+ } catch (e) {
2373
+ if (!e.code) throw e;
2374
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2375
+ }
2376
+ },unlink:function (parent, name) {
2377
+ var path = PATH.join2(NODEFS.realPath(parent), name);
2378
+ try {
2379
+ fs.unlinkSync(path);
2380
+ } catch (e) {
2381
+ if (!e.code) throw e;
2382
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2383
+ }
2384
+ },rmdir:function (parent, name) {
2385
+ var path = PATH.join2(NODEFS.realPath(parent), name);
2386
+ try {
2387
+ fs.rmdirSync(path);
2388
+ } catch (e) {
2389
+ if (!e.code) throw e;
2390
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2391
+ }
2392
+ },readdir:function (node) {
2393
+ var path = NODEFS.realPath(node);
2394
+ try {
2395
+ return fs.readdirSync(path);
2396
+ } catch (e) {
2397
+ if (!e.code) throw e;
2398
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2399
+ }
2400
+ },symlink:function (parent, newName, oldPath) {
2401
+ var newPath = PATH.join2(NODEFS.realPath(parent), newName);
2402
+ try {
2403
+ fs.symlinkSync(oldPath, newPath);
2404
+ } catch (e) {
2405
+ if (!e.code) throw e;
2406
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2407
+ }
2408
+ },readlink:function (node) {
2409
+ var path = NODEFS.realPath(node);
2410
+ try {
2411
+ return fs.readlinkSync(path);
2412
+ } catch (e) {
2413
+ if (!e.code) throw e;
2414
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2415
+ }
2416
+ }},stream_ops:{open:function (stream) {
2417
+ var path = NODEFS.realPath(stream.node);
2418
+ try {
2419
+ if (FS.isFile(stream.node.mode)) {
2420
+ stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));
2421
+ }
2422
+ } catch (e) {
2423
+ if (!e.code) throw e;
2424
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2425
+ }
2426
+ },close:function (stream) {
2427
+ try {
2428
+ if (FS.isFile(stream.node.mode) && stream.nfd) {
2429
+ fs.closeSync(stream.nfd);
2430
+ }
2431
+ } catch (e) {
2432
+ if (!e.code) throw e;
2433
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2434
+ }
2435
+ },read:function (stream, buffer, offset, length, position) {
2436
+ // FIXME this is terrible.
2437
+ var nbuffer = new Buffer(length);
2438
+ var res;
2439
+ try {
2440
+ res = fs.readSync(stream.nfd, nbuffer, 0, length, position);
2441
+ } catch (e) {
2442
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2443
+ }
2444
+ if (res > 0) {
2445
+ for (var i = 0; i < res; i++) {
2446
+ buffer[offset + i] = nbuffer[i];
2447
+ }
2448
+ }
2449
+ return res;
2450
+ },write:function (stream, buffer, offset, length, position) {
2451
+ // FIXME this is terrible.
2452
+ var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
2453
+ var res;
2454
+ try {
2455
+ res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);
2456
+ } catch (e) {
2457
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2458
+ }
2459
+ return res;
2460
+ },llseek:function (stream, offset, whence) {
2461
+ var position = offset;
2462
+ if (whence === 1) { // SEEK_CUR.
2463
+ position += stream.position;
2464
+ } else if (whence === 2) { // SEEK_END.
2465
+ if (FS.isFile(stream.node.mode)) {
2466
+ try {
2467
+ var stat = fs.fstatSync(stream.nfd);
2468
+ position += stat.size;
2469
+ } catch (e) {
2470
+ throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2471
+ }
2472
+ }
2473
+ }
2474
+
2475
+ if (position < 0) {
2476
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2477
+ }
2478
+
2479
+ stream.position = position;
2480
+ return position;
2481
+ }}};
2482
+
2483
+ var _stdin=allocate(1, "i32*", ALLOC_STATIC);
2484
+
2485
+ var _stdout=allocate(1, "i32*", ALLOC_STATIC);
2486
+
2487
+ var _stderr=allocate(1, "i32*", ALLOC_STATIC);
2488
+
2489
+ function _fflush(stream) {
2490
+ // int fflush(FILE *stream);
2491
+ // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
2492
+ // we don't currently perform any user-space buffering of data
2493
+ }var FS={root:null,mounts:[],devices:[null],streams:[null],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {
2494
+ if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
2495
+ return ___setErrNo(e.errno);
2496
+ },lookupPath:function (path, opts) {
2497
+ path = PATH.resolve(FS.cwd(), path);
2498
+ opts = opts || { recurse_count: 0 };
2499
+
2500
+ if (opts.recurse_count > 8) { // max recursive lookup of 8
2501
+ throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
2502
+ }
2503
+
2504
+ // split the path
2505
+ var parts = PATH.normalizeArray(path.split('/').filter(function(p) {
2506
+ return !!p;
2507
+ }), false);
2508
+
2509
+ // start at the root
2510
+ var current = FS.root;
2511
+ var current_path = '/';
2512
+
2513
+ for (var i = 0; i < parts.length; i++) {
2514
+ var islast = (i === parts.length-1);
2515
+ if (islast && opts.parent) {
2516
+ // stop resolving
2517
+ break;
2518
+ }
2519
+
2520
+ current = FS.lookupNode(current, parts[i]);
2521
+ current_path = PATH.join2(current_path, parts[i]);
2522
+
2523
+ // jump to the mount's root node if this is a mountpoint
2524
+ if (FS.isMountpoint(current)) {
2525
+ current = current.mount.root;
2526
+ }
2527
+
2528
+ // follow symlinks
2529
+ // by default, lookupPath will not follow a symlink if it is the final path component.
2530
+ // setting opts.follow = true will override this behavior.
2531
+ if (!islast || opts.follow) {
2532
+ var count = 0;
2533
+ while (FS.isLink(current.mode)) {
2534
+ var link = FS.readlink(current_path);
2535
+ current_path = PATH.resolve(PATH.dirname(current_path), link);
2536
+
2537
+ var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });
2538
+ current = lookup.node;
2539
+
2540
+ if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
2541
+ throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
2542
+ }
2543
+ }
2544
+ }
2545
+ }
2546
+
2547
+ return { path: current_path, node: current };
2548
+ },getPath:function (node) {
2549
+ var path;
2550
+ while (true) {
2551
+ if (FS.isRoot(node)) {
2552
+ var mount = node.mount.mountpoint;
2553
+ if (!path) return mount;
2554
+ return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;
2555
+ }
2556
+ path = path ? node.name + '/' + path : node.name;
2557
+ node = node.parent;
2558
+ }
2559
+ },hashName:function (parentid, name) {
2560
+ var hash = 0;
2561
+
2562
+
2563
+ for (var i = 0; i < name.length; i++) {
2564
+ hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
2565
+ }
2566
+ return ((parentid + hash) >>> 0) % FS.nameTable.length;
2567
+ },hashAddNode:function (node) {
2568
+ var hash = FS.hashName(node.parent.id, node.name);
2569
+ node.name_next = FS.nameTable[hash];
2570
+ FS.nameTable[hash] = node;
2571
+ },hashRemoveNode:function (node) {
2572
+ var hash = FS.hashName(node.parent.id, node.name);
2573
+ if (FS.nameTable[hash] === node) {
2574
+ FS.nameTable[hash] = node.name_next;
2575
+ } else {
2576
+ var current = FS.nameTable[hash];
2577
+ while (current) {
2578
+ if (current.name_next === node) {
2579
+ current.name_next = node.name_next;
2580
+ break;
2581
+ }
2582
+ current = current.name_next;
2583
+ }
2584
+ }
2585
+ },lookupNode:function (parent, name) {
2586
+ var err = FS.mayLookup(parent);
2587
+ if (err) {
2588
+ throw new FS.ErrnoError(err);
2589
+ }
2590
+ var hash = FS.hashName(parent.id, name);
2591
+ for (var node = FS.nameTable[hash]; node; node = node.name_next) {
2592
+ var nodeName = node.name;
2593
+ if (node.parent.id === parent.id && nodeName === name) {
2594
+ return node;
2595
+ }
2596
+ }
2597
+ // if we failed to find it in the cache, call into the VFS
2598
+ return FS.lookup(parent, name);
2599
+ },createNode:function (parent, name, mode, rdev) {
2600
+ if (!FS.FSNode) {
2601
+ FS.FSNode = function(parent, name, mode, rdev) {
2602
+ this.id = FS.nextInode++;
2603
+ this.name = name;
2604
+ this.mode = mode;
2605
+ this.node_ops = {};
2606
+ this.stream_ops = {};
2607
+ this.rdev = rdev;
2608
+ this.parent = null;
2609
+ this.mount = null;
2610
+ if (!parent) {
2611
+ parent = this; // root node sets parent to itself
2612
+ }
2613
+ this.parent = parent;
2614
+ this.mount = parent.mount;
2615
+ FS.hashAddNode(this);
2616
+ };
2617
+
2618
+ // compatibility
2619
+ var readMode = 292 | 73;
2620
+ var writeMode = 146;
2621
+
2622
+ FS.FSNode.prototype = {};
2623
+
2624
+ // NOTE we must use Object.defineProperties instead of individual calls to
2625
+ // Object.defineProperty in order to make closure compiler happy
2626
+ Object.defineProperties(FS.FSNode.prototype, {
2627
+ read: {
2628
+ get: function() { return (this.mode & readMode) === readMode; },
2629
+ set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }
2630
+ },
2631
+ write: {
2632
+ get: function() { return (this.mode & writeMode) === writeMode; },
2633
+ set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }
2634
+ },
2635
+ isFolder: {
2636
+ get: function() { return FS.isDir(this.mode); },
2637
+ },
2638
+ isDevice: {
2639
+ get: function() { return FS.isChrdev(this.mode); },
2640
+ },
2641
+ });
2642
+ }
2643
+ return new FS.FSNode(parent, name, mode, rdev);
2644
+ },destroyNode:function (node) {
2645
+ FS.hashRemoveNode(node);
2646
+ },isRoot:function (node) {
2647
+ return node === node.parent;
2648
+ },isMountpoint:function (node) {
2649
+ return node.mounted;
2650
+ },isFile:function (mode) {
2651
+ return (mode & 61440) === 32768;
2652
+ },isDir:function (mode) {
2653
+ return (mode & 61440) === 16384;
2654
+ },isLink:function (mode) {
2655
+ return (mode & 61440) === 40960;
2656
+ },isChrdev:function (mode) {
2657
+ return (mode & 61440) === 8192;
2658
+ },isBlkdev:function (mode) {
2659
+ return (mode & 61440) === 24576;
2660
+ },isFIFO:function (mode) {
2661
+ return (mode & 61440) === 4096;
2662
+ },isSocket:function (mode) {
2663
+ return (mode & 49152) === 49152;
2664
+ },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) {
2665
+ var flags = FS.flagModes[str];
2666
+ if (typeof flags === 'undefined') {
2667
+ throw new Error('Unknown file open mode: ' + str);
2668
+ }
2669
+ return flags;
2670
+ },flagsToPermissionString:function (flag) {
2671
+ var accmode = flag & 2097155;
2672
+ var perms = ['r', 'w', 'rw'][accmode];
2673
+ if ((flag & 512)) {
2674
+ perms += 'w';
2675
+ }
2676
+ return perms;
2677
+ },nodePermissions:function (node, perms) {
2678
+ if (FS.ignorePermissions) {
2679
+ return 0;
2680
+ }
2681
+ // return 0 if any user, group or owner bits are set.
2682
+ if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
2683
+ return ERRNO_CODES.EACCES;
2684
+ } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
2685
+ return ERRNO_CODES.EACCES;
2686
+ } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
2687
+ return ERRNO_CODES.EACCES;
2688
+ }
2689
+ return 0;
2690
+ },mayLookup:function (dir) {
2691
+ return FS.nodePermissions(dir, 'x');
2692
+ },mayCreate:function (dir, name) {
2693
+ try {
2694
+ var node = FS.lookupNode(dir, name);
2695
+ return ERRNO_CODES.EEXIST;
2696
+ } catch (e) {
2697
+ }
2698
+ return FS.nodePermissions(dir, 'wx');
2699
+ },mayDelete:function (dir, name, isdir) {
2700
+ var node;
2701
+ try {
2702
+ node = FS.lookupNode(dir, name);
2703
+ } catch (e) {
2704
+ return e.errno;
2705
+ }
2706
+ var err = FS.nodePermissions(dir, 'wx');
2707
+ if (err) {
2708
+ return err;
2709
+ }
2710
+ if (isdir) {
2711
+ if (!FS.isDir(node.mode)) {
2712
+ return ERRNO_CODES.ENOTDIR;
2713
+ }
2714
+ if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
2715
+ return ERRNO_CODES.EBUSY;
2716
+ }
2717
+ } else {
2718
+ if (FS.isDir(node.mode)) {
2719
+ return ERRNO_CODES.EISDIR;
2720
+ }
2721
+ }
2722
+ return 0;
2723
+ },mayOpen:function (node, flags) {
2724
+ if (!node) {
2725
+ return ERRNO_CODES.ENOENT;
2726
+ }
2727
+ if (FS.isLink(node.mode)) {
2728
+ return ERRNO_CODES.ELOOP;
2729
+ } else if (FS.isDir(node.mode)) {
2730
+ if ((flags & 2097155) !== 0 || // opening for write
2731
+ (flags & 512)) {
2732
+ return ERRNO_CODES.EISDIR;
2733
+ }
2734
+ }
2735
+ return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
2736
+ },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {
2737
+ fd_start = fd_start || 1;
2738
+ fd_end = fd_end || FS.MAX_OPEN_FDS;
2739
+ for (var fd = fd_start; fd <= fd_end; fd++) {
2740
+ if (!FS.streams[fd]) {
2741
+ return fd;
2742
+ }
2743
+ }
2744
+ throw new FS.ErrnoError(ERRNO_CODES.EMFILE);
2745
+ },getStream:function (fd) {
2746
+ return FS.streams[fd];
2747
+ },createStream:function (stream, fd_start, fd_end) {
2748
+ if (!FS.FSStream) {
2749
+ FS.FSStream = function(){};
2750
+ FS.FSStream.prototype = {};
2751
+ // compatibility
2752
+ Object.defineProperties(FS.FSStream.prototype, {
2753
+ object: {
2754
+ get: function() { return this.node; },
2755
+ set: function(val) { this.node = val; }
2756
+ },
2757
+ isRead: {
2758
+ get: function() { return (this.flags & 2097155) !== 1; }
2759
+ },
2760
+ isWrite: {
2761
+ get: function() { return (this.flags & 2097155) !== 0; }
2762
+ },
2763
+ isAppend: {
2764
+ get: function() { return (this.flags & 1024); }
2765
+ }
2766
+ });
2767
+ }
2768
+ if (stream.__proto__) {
2769
+ // reuse the object
2770
+ stream.__proto__ = FS.FSStream.prototype;
2771
+ } else {
2772
+ var newStream = new FS.FSStream();
2773
+ for (var p in stream) {
2774
+ newStream[p] = stream[p];
2775
+ }
2776
+ stream = newStream;
2777
+ }
2778
+ var fd = FS.nextfd(fd_start, fd_end);
2779
+ stream.fd = fd;
2780
+ FS.streams[fd] = stream;
2781
+ return stream;
2782
+ },closeStream:function (fd) {
2783
+ FS.streams[fd] = null;
2784
+ },chrdev_stream_ops:{open:function (stream) {
2785
+ var device = FS.getDevice(stream.node.rdev);
2786
+ // override node's stream ops with the device's
2787
+ stream.stream_ops = device.stream_ops;
2788
+ // forward the open call
2789
+ if (stream.stream_ops.open) {
2790
+ stream.stream_ops.open(stream);
2791
+ }
2792
+ },llseek:function () {
2793
+ throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
2794
+ }},major:function (dev) {
2795
+ return ((dev) >> 8);
2796
+ },minor:function (dev) {
2797
+ return ((dev) & 0xff);
2798
+ },makedev:function (ma, mi) {
2799
+ return ((ma) << 8 | (mi));
2800
+ },registerDevice:function (dev, ops) {
2801
+ FS.devices[dev] = { stream_ops: ops };
2802
+ },getDevice:function (dev) {
2803
+ return FS.devices[dev];
2804
+ },syncfs:function (populate, callback) {
2805
+ if (typeof(populate) === 'function') {
2806
+ callback = populate;
2807
+ populate = false;
2808
+ }
2809
+
2810
+ var completed = 0;
2811
+ var total = FS.mounts.length;
2812
+ function done(err) {
2813
+ if (err) {
2814
+ return callback(err);
2815
+ }
2816
+ if (++completed >= total) {
2817
+ callback(null);
2818
+ }
2819
+ };
2820
+
2821
+ // sync all mounts
2822
+ for (var i = 0; i < FS.mounts.length; i++) {
2823
+ var mount = FS.mounts[i];
2824
+ if (!mount.type.syncfs) {
2825
+ done(null);
2826
+ continue;
2827
+ }
2828
+ mount.type.syncfs(mount, populate, done);
2829
+ }
2830
+ },mount:function (type, opts, mountpoint) {
2831
+ var lookup;
2832
+ if (mountpoint) {
2833
+ lookup = FS.lookupPath(mountpoint, { follow: false });
2834
+ mountpoint = lookup.path; // use the absolute path
2835
+ }
2836
+ var mount = {
2837
+ type: type,
2838
+ opts: opts,
2839
+ mountpoint: mountpoint,
2840
+ root: null
2841
+ };
2842
+ // create a root node for the fs
2843
+ var root = type.mount(mount);
2844
+ root.mount = mount;
2845
+ mount.root = root;
2846
+ // assign the mount info to the mountpoint's node
2847
+ if (lookup) {
2848
+ lookup.node.mount = mount;
2849
+ lookup.node.mounted = true;
2850
+ // compatibility update FS.root if we mount to /
2851
+ if (mountpoint === '/') {
2852
+ FS.root = mount.root;
2853
+ }
2854
+ }
2855
+ // add to our cached list of mounts
2856
+ FS.mounts.push(mount);
2857
+ return root;
2858
+ },lookup:function (parent, name) {
2859
+ return parent.node_ops.lookup(parent, name);
2860
+ },mknod:function (path, mode, dev) {
2861
+ var lookup = FS.lookupPath(path, { parent: true });
2862
+ var parent = lookup.node;
2863
+ var name = PATH.basename(path);
2864
+ var err = FS.mayCreate(parent, name);
2865
+ if (err) {
2866
+ throw new FS.ErrnoError(err);
2867
+ }
2868
+ if (!parent.node_ops.mknod) {
2869
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2870
+ }
2871
+ return parent.node_ops.mknod(parent, name, mode, dev);
2872
+ },create:function (path, mode) {
2873
+ mode = mode !== undefined ? mode : 0666;
2874
+ mode &= 4095;
2875
+ mode |= 32768;
2876
+ return FS.mknod(path, mode, 0);
2877
+ },mkdir:function (path, mode) {
2878
+ mode = mode !== undefined ? mode : 0777;
2879
+ mode &= 511 | 512;
2880
+ mode |= 16384;
2881
+ return FS.mknod(path, mode, 0);
2882
+ },mkdev:function (path, mode, dev) {
2883
+ if (typeof(dev) === 'undefined') {
2884
+ dev = mode;
2885
+ mode = 0666;
2886
+ }
2887
+ mode |= 8192;
2888
+ return FS.mknod(path, mode, dev);
2889
+ },symlink:function (oldpath, newpath) {
2890
+ var lookup = FS.lookupPath(newpath, { parent: true });
2891
+ var parent = lookup.node;
2892
+ var newname = PATH.basename(newpath);
2893
+ var err = FS.mayCreate(parent, newname);
2894
+ if (err) {
2895
+ throw new FS.ErrnoError(err);
2896
+ }
2897
+ if (!parent.node_ops.symlink) {
2898
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2899
+ }
2900
+ return parent.node_ops.symlink(parent, newname, oldpath);
2901
+ },rename:function (old_path, new_path) {
2902
+ var old_dirname = PATH.dirname(old_path);
2903
+ var new_dirname = PATH.dirname(new_path);
2904
+ var old_name = PATH.basename(old_path);
2905
+ var new_name = PATH.basename(new_path);
2906
+ // parents must exist
2907
+ var lookup, old_dir, new_dir;
2908
+ try {
2909
+ lookup = FS.lookupPath(old_path, { parent: true });
2910
+ old_dir = lookup.node;
2911
+ lookup = FS.lookupPath(new_path, { parent: true });
2912
+ new_dir = lookup.node;
2913
+ } catch (e) {
2914
+ throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
2915
+ }
2916
+ // need to be part of the same mount
2917
+ if (old_dir.mount !== new_dir.mount) {
2918
+ throw new FS.ErrnoError(ERRNO_CODES.EXDEV);
2919
+ }
2920
+ // source must exist
2921
+ var old_node = FS.lookupNode(old_dir, old_name);
2922
+ // old path should not be an ancestor of the new path
2923
+ var relative = PATH.relative(old_path, new_dirname);
2924
+ if (relative.charAt(0) !== '.') {
2925
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2926
+ }
2927
+ // new path should not be an ancestor of the old path
2928
+ relative = PATH.relative(new_path, old_dirname);
2929
+ if (relative.charAt(0) !== '.') {
2930
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
2931
+ }
2932
+ // see if the new path already exists
2933
+ var new_node;
2934
+ try {
2935
+ new_node = FS.lookupNode(new_dir, new_name);
2936
+ } catch (e) {
2937
+ // not fatal
2938
+ }
2939
+ // early out if nothing needs to change
2940
+ if (old_node === new_node) {
2941
+ return;
2942
+ }
2943
+ // we'll need to delete the old entry
2944
+ var isdir = FS.isDir(old_node.mode);
2945
+ var err = FS.mayDelete(old_dir, old_name, isdir);
2946
+ if (err) {
2947
+ throw new FS.ErrnoError(err);
2948
+ }
2949
+ // need delete permissions if we'll be overwriting.
2950
+ // need create permissions if new doesn't already exist.
2951
+ err = new_node ?
2952
+ FS.mayDelete(new_dir, new_name, isdir) :
2953
+ FS.mayCreate(new_dir, new_name);
2954
+ if (err) {
2955
+ throw new FS.ErrnoError(err);
2956
+ }
2957
+ if (!old_dir.node_ops.rename) {
2958
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2959
+ }
2960
+ if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
2961
+ throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
2962
+ }
2963
+ // if we are going to change the parent, check write permissions
2964
+ if (new_dir !== old_dir) {
2965
+ err = FS.nodePermissions(old_dir, 'w');
2966
+ if (err) {
2967
+ throw new FS.ErrnoError(err);
2968
+ }
2969
+ }
2970
+ // remove the node from the lookup hash
2971
+ FS.hashRemoveNode(old_node);
2972
+ // do the underlying fs rename
2973
+ try {
2974
+ old_dir.node_ops.rename(old_node, new_dir, new_name);
2975
+ } catch (e) {
2976
+ throw e;
2977
+ } finally {
2978
+ // add the node back to the hash (in case node_ops.rename
2979
+ // changed its name)
2980
+ FS.hashAddNode(old_node);
2981
+ }
2982
+ },rmdir:function (path) {
2983
+ var lookup = FS.lookupPath(path, { parent: true });
2984
+ var parent = lookup.node;
2985
+ var name = PATH.basename(path);
2986
+ var node = FS.lookupNode(parent, name);
2987
+ var err = FS.mayDelete(parent, name, true);
2988
+ if (err) {
2989
+ throw new FS.ErrnoError(err);
2990
+ }
2991
+ if (!parent.node_ops.rmdir) {
2992
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2993
+ }
2994
+ if (FS.isMountpoint(node)) {
2995
+ throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
2996
+ }
2997
+ parent.node_ops.rmdir(parent, name);
2998
+ FS.destroyNode(node);
2999
+ },readdir:function (path) {
3000
+ var lookup = FS.lookupPath(path, { follow: true });
3001
+ var node = lookup.node;
3002
+ if (!node.node_ops.readdir) {
3003
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
3004
+ }
3005
+ return node.node_ops.readdir(node);
3006
+ },unlink:function (path) {
3007
+ var lookup = FS.lookupPath(path, { parent: true });
3008
+ var parent = lookup.node;
3009
+ var name = PATH.basename(path);
3010
+ var node = FS.lookupNode(parent, name);
3011
+ var err = FS.mayDelete(parent, name, false);
3012
+ if (err) {
3013
+ // POSIX says unlink should set EPERM, not EISDIR
3014
+ if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;
3015
+ throw new FS.ErrnoError(err);
3016
+ }
3017
+ if (!parent.node_ops.unlink) {
3018
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3019
+ }
3020
+ if (FS.isMountpoint(node)) {
3021
+ throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3022
+ }
3023
+ parent.node_ops.unlink(parent, name);
3024
+ FS.destroyNode(node);
3025
+ },readlink:function (path) {
3026
+ var lookup = FS.lookupPath(path, { follow: false });
3027
+ var link = lookup.node;
3028
+ if (!link.node_ops.readlink) {
3029
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3030
+ }
3031
+ return link.node_ops.readlink(link);
3032
+ },stat:function (path, dontFollow) {
3033
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
3034
+ var node = lookup.node;
3035
+ if (!node.node_ops.getattr) {
3036
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3037
+ }
3038
+ return node.node_ops.getattr(node);
3039
+ },lstat:function (path) {
3040
+ return FS.stat(path, true);
3041
+ },chmod:function (path, mode, dontFollow) {
3042
+ var node;
3043
+ if (typeof path === 'string') {
3044
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
3045
+ node = lookup.node;
3046
+ } else {
3047
+ node = path;
3048
+ }
3049
+ if (!node.node_ops.setattr) {
3050
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3051
+ }
3052
+ node.node_ops.setattr(node, {
3053
+ mode: (mode & 4095) | (node.mode & ~4095),
3054
+ timestamp: Date.now()
3055
+ });
3056
+ },lchmod:function (path, mode) {
3057
+ FS.chmod(path, mode, true);
3058
+ },fchmod:function (fd, mode) {
3059
+ var stream = FS.getStream(fd);
3060
+ if (!stream) {
3061
+ throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3062
+ }
3063
+ FS.chmod(stream.node, mode);
3064
+ },chown:function (path, uid, gid, dontFollow) {
3065
+ var node;
3066
+ if (typeof path === 'string') {
3067
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
3068
+ node = lookup.node;
3069
+ } else {
3070
+ node = path;
3071
+ }
3072
+ if (!node.node_ops.setattr) {
3073
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3074
+ }
3075
+ node.node_ops.setattr(node, {
3076
+ timestamp: Date.now()
3077
+ // we ignore the uid / gid for now
3078
+ });
3079
+ },lchown:function (path, uid, gid) {
3080
+ FS.chown(path, uid, gid, true);
3081
+ },fchown:function (fd, uid, gid) {
3082
+ var stream = FS.getStream(fd);
3083
+ if (!stream) {
3084
+ throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3085
+ }
3086
+ FS.chown(stream.node, uid, gid);
3087
+ },truncate:function (path, len) {
3088
+ if (len < 0) {
3089
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3090
+ }
3091
+ var node;
3092
+ if (typeof path === 'string') {
3093
+ var lookup = FS.lookupPath(path, { follow: true });
3094
+ node = lookup.node;
3095
+ } else {
3096
+ node = path;
3097
+ }
3098
+ if (!node.node_ops.setattr) {
3099
+ throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3100
+ }
3101
+ if (FS.isDir(node.mode)) {
3102
+ throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3103
+ }
3104
+ if (!FS.isFile(node.mode)) {
3105
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3106
+ }
3107
+ var err = FS.nodePermissions(node, 'w');
3108
+ if (err) {
3109
+ throw new FS.ErrnoError(err);
3110
+ }
3111
+ node.node_ops.setattr(node, {
3112
+ size: len,
3113
+ timestamp: Date.now()
3114
+ });
3115
+ },ftruncate:function (fd, len) {
3116
+ var stream = FS.getStream(fd);
3117
+ if (!stream) {
3118
+ throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3119
+ }
3120
+ if ((stream.flags & 2097155) === 0) {
3121
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3122
+ }
3123
+ FS.truncate(stream.node, len);
3124
+ },utime:function (path, atime, mtime) {
3125
+ var lookup = FS.lookupPath(path, { follow: true });
3126
+ var node = lookup.node;
3127
+ node.node_ops.setattr(node, {
3128
+ timestamp: Math.max(atime, mtime)
3129
+ });
3130
+ },open:function (path, flags, mode, fd_start, fd_end) {
3131
+ flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
3132
+ mode = typeof mode === 'undefined' ? 0666 : mode;
3133
+ if ((flags & 64)) {
3134
+ mode = (mode & 4095) | 32768;
3135
+ } else {
3136
+ mode = 0;
3137
+ }
3138
+ var node;
3139
+ if (typeof path === 'object') {
3140
+ node = path;
3141
+ } else {
3142
+ path = PATH.normalize(path);
3143
+ try {
3144
+ var lookup = FS.lookupPath(path, {
3145
+ follow: !(flags & 131072)
3146
+ });
3147
+ node = lookup.node;
3148
+ } catch (e) {
3149
+ // ignore
3150
+ }
3151
+ }
3152
+ // perhaps we need to create the node
3153
+ if ((flags & 64)) {
3154
+ if (node) {
3155
+ // if O_CREAT and O_EXCL are set, error out if the node already exists
3156
+ if ((flags & 128)) {
3157
+ throw new FS.ErrnoError(ERRNO_CODES.EEXIST);
3158
+ }
3159
+ } else {
3160
+ // node doesn't exist, try to create it
3161
+ node = FS.mknod(path, mode, 0);
3162
+ }
3163
+ }
3164
+ if (!node) {
3165
+ throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
3166
+ }
3167
+ // can't truncate a device
3168
+ if (FS.isChrdev(node.mode)) {
3169
+ flags &= ~512;
3170
+ }
3171
+ // check permissions
3172
+ var err = FS.mayOpen(node, flags);
3173
+ if (err) {
3174
+ throw new FS.ErrnoError(err);
3175
+ }
3176
+ // do truncation if necessary
3177
+ if ((flags & 512)) {
3178
+ FS.truncate(node, 0);
3179
+ }
3180
+ // we've already handled these, don't pass down to the underlying vfs
3181
+ flags &= ~(128 | 512);
3182
+
3183
+ // register the stream with the filesystem
3184
+ var stream = FS.createStream({
3185
+ node: node,
3186
+ path: FS.getPath(node), // we want the absolute path to the node
3187
+ flags: flags,
3188
+ seekable: true,
3189
+ position: 0,
3190
+ stream_ops: node.stream_ops,
3191
+ // used by the file family libc calls (fopen, fwrite, ferror, etc.)
3192
+ ungotten: [],
3193
+ error: false
3194
+ }, fd_start, fd_end);
3195
+ // call the new stream's open function
3196
+ if (stream.stream_ops.open) {
3197
+ stream.stream_ops.open(stream);
3198
+ }
3199
+ if (Module['logReadFiles'] && !(flags & 1)) {
3200
+ if (!FS.readFiles) FS.readFiles = {};
3201
+ if (!(path in FS.readFiles)) {
3202
+ FS.readFiles[path] = 1;
3203
+ Module['printErr']('read file: ' + path);
3204
+ }
3205
+ }
3206
+ return stream;
3207
+ },close:function (stream) {
3208
+ try {
3209
+ if (stream.stream_ops.close) {
3210
+ stream.stream_ops.close(stream);
3211
+ }
3212
+ } catch (e) {
3213
+ throw e;
3214
+ } finally {
3215
+ FS.closeStream(stream.fd);
3216
+ }
3217
+ },llseek:function (stream, offset, whence) {
3218
+ if (!stream.seekable || !stream.stream_ops.llseek) {
3219
+ throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3220
+ }
3221
+ return stream.stream_ops.llseek(stream, offset, whence);
3222
+ },read:function (stream, buffer, offset, length, position) {
3223
+ if (length < 0 || position < 0) {
3224
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3225
+ }
3226
+ if ((stream.flags & 2097155) === 1) {
3227
+ throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3228
+ }
3229
+ if (FS.isDir(stream.node.mode)) {
3230
+ throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3231
+ }
3232
+ if (!stream.stream_ops.read) {
3233
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3234
+ }
3235
+ var seeking = true;
3236
+ if (typeof position === 'undefined') {
3237
+ position = stream.position;
3238
+ seeking = false;
3239
+ } else if (!stream.seekable) {
3240
+ throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3241
+ }
3242
+ var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
3243
+ if (!seeking) stream.position += bytesRead;
3244
+ return bytesRead;
3245
+ },write:function (stream, buffer, offset, length, position, canOwn) {
3246
+ if (length < 0 || position < 0) {
3247
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3248
+ }
3249
+ if ((stream.flags & 2097155) === 0) {
3250
+ throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3251
+ }
3252
+ if (FS.isDir(stream.node.mode)) {
3253
+ throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3254
+ }
3255
+ if (!stream.stream_ops.write) {
3256
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3257
+ }
3258
+ var seeking = true;
3259
+ if (typeof position === 'undefined') {
3260
+ position = stream.position;
3261
+ seeking = false;
3262
+ } else if (!stream.seekable) {
3263
+ throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3264
+ }
3265
+ if (stream.flags & 1024) {
3266
+ // seek to the end before writing in append mode
3267
+ FS.llseek(stream, 0, 2);
3268
+ }
3269
+ var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
3270
+ if (!seeking) stream.position += bytesWritten;
3271
+ return bytesWritten;
3272
+ },allocate:function (stream, offset, length) {
3273
+ if (offset < 0 || length <= 0) {
3274
+ throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3275
+ }
3276
+ if ((stream.flags & 2097155) === 0) {
3277
+ throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3278
+ }
3279
+ if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {
3280
+ throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
3281
+ }
3282
+ if (!stream.stream_ops.allocate) {
3283
+ throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
3284
+ }
3285
+ stream.stream_ops.allocate(stream, offset, length);
3286
+ },mmap:function (stream, buffer, offset, length, position, prot, flags) {
3287
+ // TODO if PROT is PROT_WRITE, make sure we have write access
3288
+ if ((stream.flags & 2097155) === 1) {
3289
+ throw new FS.ErrnoError(ERRNO_CODES.EACCES);
3290
+ }
3291
+ if (!stream.stream_ops.mmap) {
3292
+ throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
3293
+ }
3294
+ return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
3295
+ },ioctl:function (stream, cmd, arg) {
3296
+ if (!stream.stream_ops.ioctl) {
3297
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);
3298
+ }
3299
+ return stream.stream_ops.ioctl(stream, cmd, arg);
3300
+ },readFile:function (path, opts) {
3301
+ opts = opts || {};
3302
+ opts.flags = opts.flags || 'r';
3303
+ opts.encoding = opts.encoding || 'binary';
3304
+ var ret;
3305
+ var stream = FS.open(path, opts.flags);
3306
+ var stat = FS.stat(path);
3307
+ var length = stat.size;
3308
+ var buf = new Uint8Array(length);
3309
+ FS.read(stream, buf, 0, length, 0);
3310
+ if (opts.encoding === 'utf8') {
3311
+ ret = '';
3312
+ var utf8 = new Runtime.UTF8Processor();
3313
+ for (var i = 0; i < length; i++) {
3314
+ ret += utf8.processCChar(buf[i]);
3315
+ }
3316
+ } else if (opts.encoding === 'binary') {
3317
+ ret = buf;
3318
+ } else {
3319
+ throw new Error('Invalid encoding type "' + opts.encoding + '"');
3320
+ }
3321
+ FS.close(stream);
3322
+ return ret;
3323
+ },writeFile:function (path, data, opts) {
3324
+ opts = opts || {};
3325
+ opts.flags = opts.flags || 'w';
3326
+ opts.encoding = opts.encoding || 'utf8';
3327
+ var stream = FS.open(path, opts.flags, opts.mode);
3328
+ if (opts.encoding === 'utf8') {
3329
+ var utf8 = new Runtime.UTF8Processor();
3330
+ var buf = new Uint8Array(utf8.processJSString(data));
3331
+ FS.write(stream, buf, 0, buf.length, 0);
3332
+ } else if (opts.encoding === 'binary') {
3333
+ FS.write(stream, data, 0, data.length, 0);
3334
+ } else {
3335
+ throw new Error('Invalid encoding type "' + opts.encoding + '"');
3336
+ }
3337
+ FS.close(stream);
3338
+ },cwd:function () {
3339
+ return FS.currentPath;
3340
+ },chdir:function (path) {
3341
+ var lookup = FS.lookupPath(path, { follow: true });
3342
+ if (!FS.isDir(lookup.node.mode)) {
3343
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
3344
+ }
3345
+ var err = FS.nodePermissions(lookup.node, 'x');
3346
+ if (err) {
3347
+ throw new FS.ErrnoError(err);
3348
+ }
3349
+ FS.currentPath = lookup.path;
3350
+ },createDefaultDirectories:function () {
3351
+ FS.mkdir('/tmp');
3352
+ },createDefaultDevices:function () {
3353
+ // create /dev
3354
+ FS.mkdir('/dev');
3355
+ // setup /dev/null
3356
+ FS.registerDevice(FS.makedev(1, 3), {
3357
+ read: function() { return 0; },
3358
+ write: function() { return 0; }
3359
+ });
3360
+ FS.mkdev('/dev/null', FS.makedev(1, 3));
3361
+ // setup /dev/tty and /dev/tty1
3362
+ // stderr needs to print output using Module['printErr']
3363
+ // so we register a second tty just for it.
3364
+ TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
3365
+ TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
3366
+ FS.mkdev('/dev/tty', FS.makedev(5, 0));
3367
+ FS.mkdev('/dev/tty1', FS.makedev(6, 0));
3368
+ // we're not going to emulate the actual shm device,
3369
+ // just create the tmp dirs that reside in it commonly
3370
+ FS.mkdir('/dev/shm');
3371
+ FS.mkdir('/dev/shm/tmp');
3372
+ },createStandardStreams:function () {
3373
+ // TODO deprecate the old functionality of a single
3374
+ // input / output callback and that utilizes FS.createDevice
3375
+ // and instead require a unique set of stream ops
3376
+
3377
+ // by default, we symlink the standard streams to the
3378
+ // default tty devices. however, if the standard streams
3379
+ // have been overwritten we create a unique device for
3380
+ // them instead.
3381
+ if (Module['stdin']) {
3382
+ FS.createDevice('/dev', 'stdin', Module['stdin']);
3383
+ } else {
3384
+ FS.symlink('/dev/tty', '/dev/stdin');
3385
+ }
3386
+ if (Module['stdout']) {
3387
+ FS.createDevice('/dev', 'stdout', null, Module['stdout']);
3388
+ } else {
3389
+ FS.symlink('/dev/tty', '/dev/stdout');
3390
+ }
3391
+ if (Module['stderr']) {
3392
+ FS.createDevice('/dev', 'stderr', null, Module['stderr']);
3393
+ } else {
3394
+ FS.symlink('/dev/tty1', '/dev/stderr');
3395
+ }
3396
+
3397
+ // open default streams for the stdin, stdout and stderr devices
3398
+ var stdin = FS.open('/dev/stdin', 'r');
3399
+ HEAP32[((_stdin)>>2)]=stdin.fd;
3400
+ assert(stdin.fd === 1, 'invalid handle for stdin (' + stdin.fd + ')');
3401
+
3402
+ var stdout = FS.open('/dev/stdout', 'w');
3403
+ HEAP32[((_stdout)>>2)]=stdout.fd;
3404
+ assert(stdout.fd === 2, 'invalid handle for stdout (' + stdout.fd + ')');
3405
+
3406
+ var stderr = FS.open('/dev/stderr', 'w');
3407
+ HEAP32[((_stderr)>>2)]=stderr.fd;
3408
+ assert(stderr.fd === 3, 'invalid handle for stderr (' + stderr.fd + ')');
3409
+ },ensureErrnoError:function () {
3410
+ if (FS.ErrnoError) return;
3411
+ FS.ErrnoError = function ErrnoError(errno) {
3412
+ this.errno = errno;
3413
+ for (var key in ERRNO_CODES) {
3414
+ if (ERRNO_CODES[key] === errno) {
3415
+ this.code = key;
3416
+ break;
3417
+ }
3418
+ }
3419
+ this.message = ERRNO_MESSAGES[errno];
3420
+ if (this.stack) this.stack = demangleAll(this.stack);
3421
+ };
3422
+ FS.ErrnoError.prototype = new Error();
3423
+ FS.ErrnoError.prototype.constructor = FS.ErrnoError;
3424
+ // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)
3425
+ [ERRNO_CODES.ENOENT].forEach(function(code) {
3426
+ FS.genericErrors[code] = new FS.ErrnoError(code);
3427
+ FS.genericErrors[code].stack = '<generic error, no stack>';
3428
+ });
3429
+ },staticInit:function () {
3430
+ FS.ensureErrnoError();
3431
+
3432
+ FS.nameTable = new Array(4096);
3433
+
3434
+ FS.root = FS.createNode(null, '/', 16384 | 0777, 0);
3435
+ FS.mount(MEMFS, {}, '/');
3436
+
3437
+ FS.createDefaultDirectories();
3438
+ FS.createDefaultDevices();
3439
+ },init:function (input, output, error) {
3440
+ assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');
3441
+ FS.init.initialized = true;
3442
+
3443
+ FS.ensureErrnoError();
3444
+
3445
+ // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
3446
+ Module['stdin'] = input || Module['stdin'];
3447
+ Module['stdout'] = output || Module['stdout'];
3448
+ Module['stderr'] = error || Module['stderr'];
3449
+
3450
+ FS.createStandardStreams();
3451
+ },quit:function () {
3452
+ FS.init.initialized = false;
3453
+ for (var i = 0; i < FS.streams.length; i++) {
3454
+ var stream = FS.streams[i];
3455
+ if (!stream) {
3456
+ continue;
3457
+ }
3458
+ FS.close(stream);
3459
+ }
3460
+ },getMode:function (canRead, canWrite) {
3461
+ var mode = 0;
3462
+ if (canRead) mode |= 292 | 73;
3463
+ if (canWrite) mode |= 146;
3464
+ return mode;
3465
+ },joinPath:function (parts, forceRelative) {
3466
+ var path = PATH.join.apply(null, parts);
3467
+ if (forceRelative && path[0] == '/') path = path.substr(1);
3468
+ return path;
3469
+ },absolutePath:function (relative, base) {
3470
+ return PATH.resolve(base, relative);
3471
+ },standardizePath:function (path) {
3472
+ return PATH.normalize(path);
3473
+ },findObject:function (path, dontResolveLastLink) {
3474
+ var ret = FS.analyzePath(path, dontResolveLastLink);
3475
+ if (ret.exists) {
3476
+ return ret.object;
3477
+ } else {
3478
+ ___setErrNo(ret.error);
3479
+ return null;
3480
+ }
3481
+ },analyzePath:function (path, dontResolveLastLink) {
3482
+ // operate from within the context of the symlink's target
3483
+ try {
3484
+ var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
3485
+ path = lookup.path;
3486
+ } catch (e) {
3487
+ }
3488
+ var ret = {
3489
+ isRoot: false, exists: false, error: 0, name: null, path: null, object: null,
3490
+ parentExists: false, parentPath: null, parentObject: null
3491
+ };
3492
+ try {
3493
+ var lookup = FS.lookupPath(path, { parent: true });
3494
+ ret.parentExists = true;
3495
+ ret.parentPath = lookup.path;
3496
+ ret.parentObject = lookup.node;
3497
+ ret.name = PATH.basename(path);
3498
+ lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
3499
+ ret.exists = true;
3500
+ ret.path = lookup.path;
3501
+ ret.object = lookup.node;
3502
+ ret.name = lookup.node.name;
3503
+ ret.isRoot = lookup.path === '/';
3504
+ } catch (e) {
3505
+ ret.error = e.errno;
3506
+ };
3507
+ return ret;
3508
+ },createFolder:function (parent, name, canRead, canWrite) {
3509
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3510
+ var mode = FS.getMode(canRead, canWrite);
3511
+ return FS.mkdir(path, mode);
3512
+ },createPath:function (parent, path, canRead, canWrite) {
3513
+ parent = typeof parent === 'string' ? parent : FS.getPath(parent);
3514
+ var parts = path.split('/').reverse();
3515
+ while (parts.length) {
3516
+ var part = parts.pop();
3517
+ if (!part) continue;
3518
+ var current = PATH.join2(parent, part);
3519
+ try {
3520
+ FS.mkdir(current);
3521
+ } catch (e) {
3522
+ // ignore EEXIST
3523
+ }
3524
+ parent = current;
3525
+ }
3526
+ return current;
3527
+ },createFile:function (parent, name, properties, canRead, canWrite) {
3528
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3529
+ var mode = FS.getMode(canRead, canWrite);
3530
+ return FS.create(path, mode);
3531
+ },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {
3532
+ var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
3533
+ var mode = FS.getMode(canRead, canWrite);
3534
+ var node = FS.create(path, mode);
3535
+ if (data) {
3536
+ if (typeof data === 'string') {
3537
+ var arr = new Array(data.length);
3538
+ for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
3539
+ data = arr;
3540
+ }
3541
+ // make sure we can write to the file
3542
+ FS.chmod(node, mode | 146);
3543
+ var stream = FS.open(node, 'w');
3544
+ FS.write(stream, data, 0, data.length, 0, canOwn);
3545
+ FS.close(stream);
3546
+ FS.chmod(node, mode);
3547
+ }
3548
+ return node;
3549
+ },createDevice:function (parent, name, input, output) {
3550
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3551
+ var mode = FS.getMode(!!input, !!output);
3552
+ if (!FS.createDevice.major) FS.createDevice.major = 64;
3553
+ var dev = FS.makedev(FS.createDevice.major++, 0);
3554
+ // Create a fake device that a set of stream ops to emulate
3555
+ // the old behavior.
3556
+ FS.registerDevice(dev, {
3557
+ open: function(stream) {
3558
+ stream.seekable = false;
3559
+ },
3560
+ close: function(stream) {
3561
+ // flush any pending line data
3562
+ if (output && output.buffer && output.buffer.length) {
3563
+ output(10);
3564
+ }
3565
+ },
3566
+ read: function(stream, buffer, offset, length, pos /* ignored */) {
3567
+ var bytesRead = 0;
3568
+ for (var i = 0; i < length; i++) {
3569
+ var result;
3570
+ try {
3571
+ result = input();
3572
+ } catch (e) {
3573
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
3574
+ }
3575
+ if (result === undefined && bytesRead === 0) {
3576
+ throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
3577
+ }
3578
+ if (result === null || result === undefined) break;
3579
+ bytesRead++;
3580
+ buffer[offset+i] = result;
3581
+ }
3582
+ if (bytesRead) {
3583
+ stream.node.timestamp = Date.now();
3584
+ }
3585
+ return bytesRead;
3586
+ },
3587
+ write: function(stream, buffer, offset, length, pos) {
3588
+ for (var i = 0; i < length; i++) {
3589
+ try {
3590
+ output(buffer[offset+i]);
3591
+ } catch (e) {
3592
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
3593
+ }
3594
+ }
3595
+ if (length) {
3596
+ stream.node.timestamp = Date.now();
3597
+ }
3598
+ return i;
3599
+ }
3600
+ });
3601
+ return FS.mkdev(path, mode, dev);
3602
+ },createLink:function (parent, name, target, canRead, canWrite) {
3603
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3604
+ return FS.symlink(target, path);
3605
+ },forceLoadFile:function (obj) {
3606
+ if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
3607
+ var success = true;
3608
+ if (typeof XMLHttpRequest !== 'undefined') {
3609
+ throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
3610
+ } else if (Module['read']) {
3611
+ // Command-line.
3612
+ try {
3613
+ // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
3614
+ // read() will try to parse UTF8.
3615
+ obj.contents = intArrayFromString(Module['read'](obj.url), true);
3616
+ } catch (e) {
3617
+ success = false;
3618
+ }
3619
+ } else {
3620
+ throw new Error('Cannot load without read() or XMLHttpRequest.');
3621
+ }
3622
+ if (!success) ___setErrNo(ERRNO_CODES.EIO);
3623
+ return success;
3624
+ },createLazyFile:function (parent, name, url, canRead, canWrite) {
3625
+ if (typeof XMLHttpRequest !== 'undefined') {
3626
+ if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
3627
+ // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
3628
+ function LazyUint8Array() {
3629
+ this.lengthKnown = false;
3630
+ this.chunks = []; // Loaded chunks. Index is the chunk number
3631
+ }
3632
+ LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
3633
+ if (idx > this.length-1 || idx < 0) {
3634
+ return undefined;
3635
+ }
3636
+ var chunkOffset = idx % this.chunkSize;
3637
+ var chunkNum = Math.floor(idx / this.chunkSize);
3638
+ return this.getter(chunkNum)[chunkOffset];
3639
+ }
3640
+ LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
3641
+ this.getter = getter;
3642
+ }
3643
+ LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
3644
+ // Find length
3645
+ var xhr = new XMLHttpRequest();
3646
+ xhr.open('HEAD', url, false);
3647
+ xhr.send(null);
3648
+ if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3649
+ var datalength = Number(xhr.getResponseHeader("Content-length"));
3650
+ var header;
3651
+ var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
3652
+ var chunkSize = 1024*1024; // Chunk size in bytes
3653
+
3654
+ if (!hasByteServing) chunkSize = datalength;
3655
+
3656
+ // Function to get a range from the remote URL.
3657
+ var doXHR = (function(from, to) {
3658
+ if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
3659
+ if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!");
3660
+
3661
+ // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
3662
+ var xhr = new XMLHttpRequest();
3663
+ xhr.open('GET', url, false);
3664
+ if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
3665
+
3666
+ // Some hints to the browser that we want binary data.
3667
+ if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
3668
+ if (xhr.overrideMimeType) {
3669
+ xhr.overrideMimeType('text/plain; charset=x-user-defined');
3670
+ }
3671
+
3672
+ xhr.send(null);
3673
+ if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3674
+ if (xhr.response !== undefined) {
3675
+ return new Uint8Array(xhr.response || []);
3676
+ } else {
3677
+ return intArrayFromString(xhr.responseText || '', true);
3678
+ }
3679
+ });
3680
+ var lazyArray = this;
3681
+ lazyArray.setDataGetter(function(chunkNum) {
3682
+ var start = chunkNum * chunkSize;
3683
+ var end = (chunkNum+1) * chunkSize - 1; // including this byte
3684
+ end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
3685
+ if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
3686
+ lazyArray.chunks[chunkNum] = doXHR(start, end);
3687
+ }
3688
+ if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
3689
+ return lazyArray.chunks[chunkNum];
3690
+ });
3691
+
3692
+ this._length = datalength;
3693
+ this._chunkSize = chunkSize;
3694
+ this.lengthKnown = true;
3695
+ }
3696
+
3697
+ var lazyArray = new LazyUint8Array();
3698
+ Object.defineProperty(lazyArray, "length", {
3699
+ get: function() {
3700
+ if(!this.lengthKnown) {
3701
+ this.cacheLength();
3702
+ }
3703
+ return this._length;
3704
+ }
3705
+ });
3706
+ Object.defineProperty(lazyArray, "chunkSize", {
3707
+ get: function() {
3708
+ if(!this.lengthKnown) {
3709
+ this.cacheLength();
3710
+ }
3711
+ return this._chunkSize;
3712
+ }
3713
+ });
3714
+
3715
+ var properties = { isDevice: false, contents: lazyArray };
3716
+ } else {
3717
+ var properties = { isDevice: false, url: url };
3718
+ }
3719
+
3720
+ var node = FS.createFile(parent, name, properties, canRead, canWrite);
3721
+ // This is a total hack, but I want to get this lazy file code out of the
3722
+ // core of MEMFS. If we want to keep this lazy file concept I feel it should
3723
+ // be its own thin LAZYFS proxying calls to MEMFS.
3724
+ if (properties.contents) {
3725
+ node.contents = properties.contents;
3726
+ } else if (properties.url) {
3727
+ node.contents = null;
3728
+ node.url = properties.url;
3729
+ }
3730
+ // override each stream op with one that tries to force load the lazy file first
3731
+ var stream_ops = {};
3732
+ var keys = Object.keys(node.stream_ops);
3733
+ keys.forEach(function(key) {
3734
+ var fn = node.stream_ops[key];
3735
+ stream_ops[key] = function forceLoadLazyFile() {
3736
+ if (!FS.forceLoadFile(node)) {
3737
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
3738
+ }
3739
+ return fn.apply(null, arguments);
3740
+ };
3741
+ });
3742
+ // use a custom read function
3743
+ stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
3744
+ if (!FS.forceLoadFile(node)) {
3745
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
3746
+ }
3747
+ var contents = stream.node.contents;
3748
+ if (position >= contents.length)
3749
+ return 0;
3750
+ var size = Math.min(contents.length - position, length);
3751
+ assert(size >= 0);
3752
+ if (contents.slice) { // normal array
3753
+ for (var i = 0; i < size; i++) {
3754
+ buffer[offset + i] = contents[position + i];
3755
+ }
3756
+ } else {
3757
+ for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
3758
+ buffer[offset + i] = contents.get(position + i);
3759
+ }
3760
+ }
3761
+ return size;
3762
+ };
3763
+ node.stream_ops = stream_ops;
3764
+ return node;
3765
+ },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {
3766
+ Browser.init();
3767
+ // TODO we should allow people to just pass in a complete filename instead
3768
+ // of parent and name being that we just join them anyways
3769
+ var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
3770
+ function processData(byteArray) {
3771
+ function finish(byteArray) {
3772
+ if (!dontCreateFile) {
3773
+ FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
3774
+ }
3775
+ if (onload) onload();
3776
+ removeRunDependency('cp ' + fullname);
3777
+ }
3778
+ var handled = false;
3779
+ Module['preloadPlugins'].forEach(function(plugin) {
3780
+ if (handled) return;
3781
+ if (plugin['canHandle'](fullname)) {
3782
+ plugin['handle'](byteArray, fullname, finish, function() {
3783
+ if (onerror) onerror();
3784
+ removeRunDependency('cp ' + fullname);
3785
+ });
3786
+ handled = true;
3787
+ }
3788
+ });
3789
+ if (!handled) finish(byteArray);
3790
+ }
3791
+ addRunDependency('cp ' + fullname);
3792
+ if (typeof url == 'string') {
3793
+ Browser.asyncLoad(url, function(byteArray) {
3794
+ processData(byteArray);
3795
+ }, onerror);
3796
+ } else {
3797
+ processData(url);
3798
+ }
3799
+ },indexedDB:function () {
3800
+ return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
3801
+ },DB_NAME:function () {
3802
+ return 'EM_FS_' + window.location.pathname;
3803
+ },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) {
3804
+ onload = onload || function(){};
3805
+ onerror = onerror || function(){};
3806
+ var indexedDB = FS.indexedDB();
3807
+ try {
3808
+ var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
3809
+ } catch (e) {
3810
+ return onerror(e);
3811
+ }
3812
+ openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
3813
+ console.log('creating db');
3814
+ var db = openRequest.result;
3815
+ db.createObjectStore(FS.DB_STORE_NAME);
3816
+ };
3817
+ openRequest.onsuccess = function openRequest_onsuccess() {
3818
+ var db = openRequest.result;
3819
+ var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
3820
+ var files = transaction.objectStore(FS.DB_STORE_NAME);
3821
+ var ok = 0, fail = 0, total = paths.length;
3822
+ function finish() {
3823
+ if (fail == 0) onload(); else onerror();
3824
+ }
3825
+ paths.forEach(function(path) {
3826
+ var putRequest = files.put(FS.analyzePath(path).object.contents, path);
3827
+ putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };
3828
+ putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
3829
+ });
3830
+ transaction.onerror = onerror;
3831
+ };
3832
+ openRequest.onerror = onerror;
3833
+ },loadFilesFromDB:function (paths, onload, onerror) {
3834
+ onload = onload || function(){};
3835
+ onerror = onerror || function(){};
3836
+ var indexedDB = FS.indexedDB();
3837
+ try {
3838
+ var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
3839
+ } catch (e) {
3840
+ return onerror(e);
3841
+ }
3842
+ openRequest.onupgradeneeded = onerror; // no database to load from
3843
+ openRequest.onsuccess = function openRequest_onsuccess() {
3844
+ var db = openRequest.result;
3845
+ try {
3846
+ var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
3847
+ } catch(e) {
3848
+ onerror(e);
3849
+ return;
3850
+ }
3851
+ var files = transaction.objectStore(FS.DB_STORE_NAME);
3852
+ var ok = 0, fail = 0, total = paths.length;
3853
+ function finish() {
3854
+ if (fail == 0) onload(); else onerror();
3855
+ }
3856
+ paths.forEach(function(path) {
3857
+ var getRequest = files.get(path);
3858
+ getRequest.onsuccess = function getRequest_onsuccess() {
3859
+ if (FS.analyzePath(path).exists) {
3860
+ FS.unlink(path);
3861
+ }
3862
+ FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
3863
+ ok++;
3864
+ if (ok + fail == total) finish();
3865
+ };
3866
+ getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
3867
+ });
3868
+ transaction.onerror = onerror;
3869
+ };
3870
+ openRequest.onerror = onerror;
3871
+ }};var PATH={splitPath:function (filename) {
3872
+ var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
3873
+ return splitPathRe.exec(filename).slice(1);
3874
+ },normalizeArray:function (parts, allowAboveRoot) {
3875
+ // if the path tries to go above the root, `up` ends up > 0
3876
+ var up = 0;
3877
+ for (var i = parts.length - 1; i >= 0; i--) {
3878
+ var last = parts[i];
3879
+ if (last === '.') {
3880
+ parts.splice(i, 1);
3881
+ } else if (last === '..') {
3882
+ parts.splice(i, 1);
3883
+ up++;
3884
+ } else if (up) {
3885
+ parts.splice(i, 1);
3886
+ up--;
3887
+ }
3888
+ }
3889
+ // if the path is allowed to go above the root, restore leading ..s
3890
+ if (allowAboveRoot) {
3891
+ for (; up--; up) {
3892
+ parts.unshift('..');
3893
+ }
3894
+ }
3895
+ return parts;
3896
+ },normalize:function (path) {
3897
+ var isAbsolute = path.charAt(0) === '/',
3898
+ trailingSlash = path.substr(-1) === '/';
3899
+ // Normalize the path
3900
+ path = PATH.normalizeArray(path.split('/').filter(function(p) {
3901
+ return !!p;
3902
+ }), !isAbsolute).join('/');
3903
+ if (!path && !isAbsolute) {
3904
+ path = '.';
3905
+ }
3906
+ if (path && trailingSlash) {
3907
+ path += '/';
3908
+ }
3909
+ return (isAbsolute ? '/' : '') + path;
3910
+ },dirname:function (path) {
3911
+ var result = PATH.splitPath(path),
3912
+ root = result[0],
3913
+ dir = result[1];
3914
+ if (!root && !dir) {
3915
+ // No dirname whatsoever
3916
+ return '.';
3917
+ }
3918
+ if (dir) {
3919
+ // It has a dirname, strip trailing slash
3920
+ dir = dir.substr(0, dir.length - 1);
3921
+ }
3922
+ return root + dir;
3923
+ },basename:function (path) {
3924
+ // EMSCRIPTEN return '/'' for '/', not an empty string
3925
+ if (path === '/') return '/';
3926
+ var lastSlash = path.lastIndexOf('/');
3927
+ if (lastSlash === -1) return path;
3928
+ return path.substr(lastSlash+1);
3929
+ },extname:function (path) {
3930
+ return PATH.splitPath(path)[3];
3931
+ },join:function () {
3932
+ var paths = Array.prototype.slice.call(arguments, 0);
3933
+ return PATH.normalize(paths.join('/'));
3934
+ },join2:function (l, r) {
3935
+ return PATH.normalize(l + '/' + r);
3936
+ },resolve:function () {
3937
+ var resolvedPath = '',
3938
+ resolvedAbsolute = false;
3939
+ for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
3940
+ var path = (i >= 0) ? arguments[i] : FS.cwd();
3941
+ // Skip empty and invalid entries
3942
+ if (typeof path !== 'string') {
3943
+ throw new TypeError('Arguments to path.resolve must be strings');
3944
+ } else if (!path) {
3945
+ continue;
3946
+ }
3947
+ resolvedPath = path + '/' + resolvedPath;
3948
+ resolvedAbsolute = path.charAt(0) === '/';
3949
+ }
3950
+ // At this point the path should be resolved to a full absolute path, but
3951
+ // handle relative paths to be safe (might happen when process.cwd() fails)
3952
+ resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {
3953
+ return !!p;
3954
+ }), !resolvedAbsolute).join('/');
3955
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
3956
+ },relative:function (from, to) {
3957
+ from = PATH.resolve(from).substr(1);
3958
+ to = PATH.resolve(to).substr(1);
3959
+ function trim(arr) {
3960
+ var start = 0;
3961
+ for (; start < arr.length; start++) {
3962
+ if (arr[start] !== '') break;
3963
+ }
3964
+ var end = arr.length - 1;
3965
+ for (; end >= 0; end--) {
3966
+ if (arr[end] !== '') break;
3967
+ }
3968
+ if (start > end) return [];
3969
+ return arr.slice(start, end - start + 1);
3970
+ }
3971
+ var fromParts = trim(from.split('/'));
3972
+ var toParts = trim(to.split('/'));
3973
+ var length = Math.min(fromParts.length, toParts.length);
3974
+ var samePartsLength = length;
3975
+ for (var i = 0; i < length; i++) {
3976
+ if (fromParts[i] !== toParts[i]) {
3977
+ samePartsLength = i;
3978
+ break;
3979
+ }
3980
+ }
3981
+ var outputParts = [];
3982
+ for (var i = samePartsLength; i < fromParts.length; i++) {
3983
+ outputParts.push('..');
3984
+ }
3985
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
3986
+ return outputParts.join('/');
3987
+ }};var Browser={mainLoop:{scheduler:null,shouldPause:false,paused:false,queue:[],pause:function () {
3988
+ Browser.mainLoop.shouldPause = true;
3989
+ },resume:function () {
3990
+ if (Browser.mainLoop.paused) {
3991
+ Browser.mainLoop.paused = false;
3992
+ Browser.mainLoop.scheduler();
3993
+ }
3994
+ Browser.mainLoop.shouldPause = false;
3995
+ },updateStatus:function () {
3996
+ if (Module['setStatus']) {
3997
+ var message = Module['statusMessage'] || 'Please wait...';
3998
+ var remaining = Browser.mainLoop.remainingBlockers;
3999
+ var expected = Browser.mainLoop.expectedBlockers;
4000
+ if (remaining) {
4001
+ if (remaining < expected) {
4002
+ Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');
4003
+ } else {
4004
+ Module['setStatus'](message);
4005
+ }
4006
+ } else {
4007
+ Module['setStatus']('');
4008
+ }
4009
+ }
4010
+ }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {
4011
+ if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers
4012
+
4013
+ if (Browser.initted || ENVIRONMENT_IS_WORKER) return;
4014
+ Browser.initted = true;
4015
+
4016
+ try {
4017
+ new Blob();
4018
+ Browser.hasBlobConstructor = true;
4019
+ } catch(e) {
4020
+ Browser.hasBlobConstructor = false;
4021
+ console.log("warning: no blob constructor, cannot create blobs with mimetypes");
4022
+ }
4023
+ Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
4024
+ Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
4025
+ if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
4026
+ console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
4027
+ Module.noImageDecoding = true;
4028
+ }
4029
+
4030
+ // Support for plugins that can process preloaded files. You can add more of these to
4031
+ // your app by creating and appending to Module.preloadPlugins.
4032
+ //
4033
+ // Each plugin is asked if it can handle a file based on the file's name. If it can,
4034
+ // it is given the file's raw data. When it is done, it calls a callback with the file's
4035
+ // (possibly modified) data. For example, a plugin might decompress a file, or it
4036
+ // might create some side data structure for use later (like an Image element, etc.).
4037
+
4038
+ var imagePlugin = {};
4039
+ imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
4040
+ return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
4041
+ };
4042
+ imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {
4043
+ var b = null;
4044
+ if (Browser.hasBlobConstructor) {
4045
+ try {
4046
+ b = new Blob([byteArray], { type: Browser.getMimetype(name) });
4047
+ if (b.size !== byteArray.length) { // Safari bug #118630
4048
+ // Safari's Blob can only take an ArrayBuffer
4049
+ b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
4050
+ }
4051
+ } catch(e) {
4052
+ Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
4053
+ }
4054
+ }
4055
+ if (!b) {
4056
+ var bb = new Browser.BlobBuilder();
4057
+ bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
4058
+ b = bb.getBlob();
4059
+ }
4060
+ var url = Browser.URLObject.createObjectURL(b);
4061
+ assert(typeof url == 'string', 'createObjectURL must return a url as a string');
4062
+ var img = new Image();
4063
+ img.onload = function img_onload() {
4064
+ assert(img.complete, 'Image ' + name + ' could not be decoded');
4065
+ var canvas = document.createElement('canvas');
4066
+ canvas.width = img.width;
4067
+ canvas.height = img.height;
4068
+ var ctx = canvas.getContext('2d');
4069
+ ctx.drawImage(img, 0, 0);
4070
+ Module["preloadedImages"][name] = canvas;
4071
+ Browser.URLObject.revokeObjectURL(url);
4072
+ if (onload) onload(byteArray);
4073
+ };
4074
+ img.onerror = function img_onerror(event) {
4075
+ console.log('Image ' + url + ' could not be decoded');
4076
+ if (onerror) onerror();
4077
+ };
4078
+ img.src = url;
4079
+ };
4080
+ Module['preloadPlugins'].push(imagePlugin);
4081
+
4082
+ var audioPlugin = {};
4083
+ audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
4084
+ return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
4085
+ };
4086
+ audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {
4087
+ var done = false;
4088
+ function finish(audio) {
4089
+ if (done) return;
4090
+ done = true;
4091
+ Module["preloadedAudios"][name] = audio;
4092
+ if (onload) onload(byteArray);
4093
+ }
4094
+ function fail() {
4095
+ if (done) return;
4096
+ done = true;
4097
+ Module["preloadedAudios"][name] = new Audio(); // empty shim
4098
+ if (onerror) onerror();
4099
+ }
4100
+ if (Browser.hasBlobConstructor) {
4101
+ try {
4102
+ var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
4103
+ } catch(e) {
4104
+ return fail();
4105
+ }
4106
+ var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
4107
+ assert(typeof url == 'string', 'createObjectURL must return a url as a string');
4108
+ var audio = new Audio();
4109
+ audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
4110
+ audio.onerror = function audio_onerror(event) {
4111
+ if (done) return;
4112
+ console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
4113
+ function encode64(data) {
4114
+ var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
4115
+ var PAD = '=';
4116
+ var ret = '';
4117
+ var leftchar = 0;
4118
+ var leftbits = 0;
4119
+ for (var i = 0; i < data.length; i++) {
4120
+ leftchar = (leftchar << 8) | data[i];
4121
+ leftbits += 8;
4122
+ while (leftbits >= 6) {
4123
+ var curr = (leftchar >> (leftbits-6)) & 0x3f;
4124
+ leftbits -= 6;
4125
+ ret += BASE[curr];
4126
+ }
4127
+ }
4128
+ if (leftbits == 2) {
4129
+ ret += BASE[(leftchar&3) << 4];
4130
+ ret += PAD + PAD;
4131
+ } else if (leftbits == 4) {
4132
+ ret += BASE[(leftchar&0xf) << 2];
4133
+ ret += PAD;
4134
+ }
4135
+ return ret;
4136
+ }
4137
+ audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
4138
+ finish(audio); // we don't wait for confirmation this worked - but it's worth trying
4139
+ };
4140
+ audio.src = url;
4141
+ // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
4142
+ Browser.safeSetTimeout(function() {
4143
+ finish(audio); // try to use it even though it is not necessarily ready to play
4144
+ }, 10000);
4145
+ } else {
4146
+ return fail();
4147
+ }
4148
+ };
4149
+ Module['preloadPlugins'].push(audioPlugin);
4150
+
4151
+ // Canvas event setup
4152
+
4153
+ var canvas = Module['canvas'];
4154
+ canvas.requestPointerLock = canvas['requestPointerLock'] ||
4155
+ canvas['mozRequestPointerLock'] ||
4156
+ canvas['webkitRequestPointerLock'];
4157
+ canvas.exitPointerLock = document['exitPointerLock'] ||
4158
+ document['mozExitPointerLock'] ||
4159
+ document['webkitExitPointerLock'] ||
4160
+ function(){}; // no-op if function does not exist
4161
+ canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
4162
+
4163
+ function pointerLockChange() {
4164
+ Browser.pointerLock = document['pointerLockElement'] === canvas ||
4165
+ document['mozPointerLockElement'] === canvas ||
4166
+ document['webkitPointerLockElement'] === canvas;
4167
+ }
4168
+
4169
+ document.addEventListener('pointerlockchange', pointerLockChange, false);
4170
+ document.addEventListener('mozpointerlockchange', pointerLockChange, false);
4171
+ document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
4172
+
4173
+ if (Module['elementPointerLock']) {
4174
+ canvas.addEventListener("click", function(ev) {
4175
+ if (!Browser.pointerLock && canvas.requestPointerLock) {
4176
+ canvas.requestPointerLock();
4177
+ ev.preventDefault();
4178
+ }
4179
+ }, false);
4180
+ }
4181
+ },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {
4182
+ var ctx;
4183
+ try {
4184
+ if (useWebGL) {
4185
+ var contextAttributes = {
4186
+ antialias: false,
4187
+ alpha: false
4188
+ };
4189
+
4190
+ if (webGLContextAttributes) {
4191
+ for (var attribute in webGLContextAttributes) {
4192
+ contextAttributes[attribute] = webGLContextAttributes[attribute];
4193
+ }
4194
+ }
4195
+
4196
+
4197
+ var errorInfo = '?';
4198
+ function onContextCreationError(event) {
4199
+ errorInfo = event.statusMessage || errorInfo;
4200
+ }
4201
+ canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
4202
+ try {
4203
+ ['experimental-webgl', 'webgl'].some(function(webglId) {
4204
+ return ctx = canvas.getContext(webglId, contextAttributes);
4205
+ });
4206
+ } finally {
4207
+ canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
4208
+ }
4209
+ } else {
4210
+ ctx = canvas.getContext('2d');
4211
+ }
4212
+ if (!ctx) throw ':(';
4213
+ } catch (e) {
4214
+ Module.print('Could not create canvas: ' + [errorInfo, e]);
4215
+ return null;
4216
+ }
4217
+ if (useWebGL) {
4218
+ // Set the background of the WebGL canvas to black
4219
+ canvas.style.backgroundColor = "black";
4220
+
4221
+ // Warn on context loss
4222
+ canvas.addEventListener('webglcontextlost', function(event) {
4223
+ alert('WebGL context lost. You will need to reload the page.');
4224
+ }, false);
4225
+ }
4226
+ if (setInModule) {
4227
+ GLctx = Module.ctx = ctx;
4228
+ Module.useWebGL = useWebGL;
4229
+ Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });
4230
+ Browser.init();
4231
+ }
4232
+ return ctx;
4233
+ },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {
4234
+ Browser.lockPointer = lockPointer;
4235
+ Browser.resizeCanvas = resizeCanvas;
4236
+ if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;
4237
+ if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;
4238
+
4239
+ var canvas = Module['canvas'];
4240
+ function fullScreenChange() {
4241
+ Browser.isFullScreen = false;
4242
+ if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
4243
+ document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
4244
+ document['fullScreenElement'] || document['fullscreenElement']) === canvas) {
4245
+ canvas.cancelFullScreen = document['cancelFullScreen'] ||
4246
+ document['mozCancelFullScreen'] ||
4247
+ document['webkitCancelFullScreen'];
4248
+ canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
4249
+ if (Browser.lockPointer) canvas.requestPointerLock();
4250
+ Browser.isFullScreen = true;
4251
+ if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
4252
+ } else if (Browser.resizeCanvas){
4253
+ Browser.setWindowedCanvasSize();
4254
+ }
4255
+ if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
4256
+ }
4257
+
4258
+ if (!Browser.fullScreenHandlersInstalled) {
4259
+ Browser.fullScreenHandlersInstalled = true;
4260
+ document.addEventListener('fullscreenchange', fullScreenChange, false);
4261
+ document.addEventListener('mozfullscreenchange', fullScreenChange, false);
4262
+ document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
4263
+ }
4264
+
4265
+ canvas.requestFullScreen = canvas['requestFullScreen'] ||
4266
+ canvas['mozRequestFullScreen'] ||
4267
+ (canvas['webkitRequestFullScreen'] ? function() { canvas['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
4268
+ canvas.requestFullScreen();
4269
+ },requestAnimationFrame:function requestAnimationFrame(func) {
4270
+ if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)
4271
+ setTimeout(func, 1000/60);
4272
+ } else {
4273
+ if (!window.requestAnimationFrame) {
4274
+ window.requestAnimationFrame = window['requestAnimationFrame'] ||
4275
+ window['mozRequestAnimationFrame'] ||
4276
+ window['webkitRequestAnimationFrame'] ||
4277
+ window['msRequestAnimationFrame'] ||
4278
+ window['oRequestAnimationFrame'] ||
4279
+ window['setTimeout'];
4280
+ }
4281
+ window.requestAnimationFrame(func);
4282
+ }
4283
+ },safeCallback:function (func) {
4284
+ return function() {
4285
+ if (!ABORT) return func.apply(null, arguments);
4286
+ };
4287
+ },safeRequestAnimationFrame:function (func) {
4288
+ return Browser.requestAnimationFrame(function() {
4289
+ if (!ABORT) func();
4290
+ });
4291
+ },safeSetTimeout:function (func, timeout) {
4292
+ return setTimeout(function() {
4293
+ if (!ABORT) func();
4294
+ }, timeout);
4295
+ },safeSetInterval:function (func, timeout) {
4296
+ return setInterval(function() {
4297
+ if (!ABORT) func();
4298
+ }, timeout);
4299
+ },getMimetype:function (name) {
4300
+ return {
4301
+ 'jpg': 'image/jpeg',
4302
+ 'jpeg': 'image/jpeg',
4303
+ 'png': 'image/png',
4304
+ 'bmp': 'image/bmp',
4305
+ 'ogg': 'audio/ogg',
4306
+ 'wav': 'audio/wav',
4307
+ 'mp3': 'audio/mpeg'
4308
+ }[name.substr(name.lastIndexOf('.')+1)];
4309
+ },getUserMedia:function (func) {
4310
+ if(!window.getUserMedia) {
4311
+ window.getUserMedia = navigator['getUserMedia'] ||
4312
+ navigator['mozGetUserMedia'];
4313
+ }
4314
+ window.getUserMedia(func);
4315
+ },getMovementX:function (event) {
4316
+ return event['movementX'] ||
4317
+ event['mozMovementX'] ||
4318
+ event['webkitMovementX'] ||
4319
+ 0;
4320
+ },getMovementY:function (event) {
4321
+ return event['movementY'] ||
4322
+ event['mozMovementY'] ||
4323
+ event['webkitMovementY'] ||
4324
+ 0;
4325
+ },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup
4326
+ if (Browser.pointerLock) {
4327
+ // When the pointer is locked, calculate the coordinates
4328
+ // based on the movement of the mouse.
4329
+ // Workaround for Firefox bug 764498
4330
+ if (event.type != 'mousemove' &&
4331
+ ('mozMovementX' in event)) {
4332
+ Browser.mouseMovementX = Browser.mouseMovementY = 0;
4333
+ } else {
4334
+ Browser.mouseMovementX = Browser.getMovementX(event);
4335
+ Browser.mouseMovementY = Browser.getMovementY(event);
4336
+ }
4337
+
4338
+ // check if SDL is available
4339
+ if (typeof SDL != "undefined") {
4340
+ Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
4341
+ Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
4342
+ } else {
4343
+ // just add the mouse delta to the current absolut mouse position
4344
+ // FIXME: ideally this should be clamped against the canvas size and zero
4345
+ Browser.mouseX += Browser.mouseMovementX;
4346
+ Browser.mouseY += Browser.mouseMovementY;
4347
+ }
4348
+ } else {
4349
+ // Otherwise, calculate the movement based on the changes
4350
+ // in the coordinates.
4351
+ var rect = Module["canvas"].getBoundingClientRect();
4352
+ var x, y;
4353
+
4354
+ // Neither .scrollX or .pageXOffset are defined in a spec, but
4355
+ // we prefer .scrollX because it is currently in a spec draft.
4356
+ // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)
4357
+ var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);
4358
+ var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);
4359
+ // If this assert lands, it's likely because the browser doesn't support scrollX or pageXOffset
4360
+ // and we have no viable fallback.
4361
+ assert((typeof scrollX !== 'undefined') && (typeof scrollY !== 'undefined'), 'Unable to retrieve scroll position, mouse positions likely broken.');
4362
+ if (event.type == 'touchstart' ||
4363
+ event.type == 'touchend' ||
4364
+ event.type == 'touchmove') {
4365
+ var t = event.touches.item(0);
4366
+ if (t) {
4367
+ x = t.pageX - (scrollX + rect.left);
4368
+ y = t.pageY - (scrollY + rect.top);
4369
+ } else {
4370
+ return;
4371
+ }
4372
+ } else {
4373
+ x = event.pageX - (scrollX + rect.left);
4374
+ y = event.pageY - (scrollY + rect.top);
4375
+ }
4376
+
4377
+ // the canvas might be CSS-scaled compared to its backbuffer;
4378
+ // SDL-using content will want mouse coordinates in terms
4379
+ // of backbuffer units.
4380
+ var cw = Module["canvas"].width;
4381
+ var ch = Module["canvas"].height;
4382
+ x = x * (cw / rect.width);
4383
+ y = y * (ch / rect.height);
4384
+
4385
+ Browser.mouseMovementX = x - Browser.mouseX;
4386
+ Browser.mouseMovementY = y - Browser.mouseY;
4387
+ Browser.mouseX = x;
4388
+ Browser.mouseY = y;
4389
+ }
4390
+ },xhrLoad:function (url, onload, onerror) {
4391
+ var xhr = new XMLHttpRequest();
4392
+ xhr.open('GET', url, true);
4393
+ xhr.responseType = 'arraybuffer';
4394
+ xhr.onload = function xhr_onload() {
4395
+ if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
4396
+ onload(xhr.response);
4397
+ } else {
4398
+ onerror();
4399
+ }
4400
+ };
4401
+ xhr.onerror = onerror;
4402
+ xhr.send(null);
4403
+ },asyncLoad:function (url, onload, onerror, noRunDep) {
4404
+ Browser.xhrLoad(url, function(arrayBuffer) {
4405
+ assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
4406
+ onload(new Uint8Array(arrayBuffer));
4407
+ if (!noRunDep) removeRunDependency('al ' + url);
4408
+ }, function(event) {
4409
+ if (onerror) {
4410
+ onerror();
4411
+ } else {
4412
+ throw 'Loading data file "' + url + '" failed.';
4413
+ }
4414
+ });
4415
+ if (!noRunDep) addRunDependency('al ' + url);
4416
+ },resizeListeners:[],updateResizeListeners:function () {
4417
+ var canvas = Module['canvas'];
4418
+ Browser.resizeListeners.forEach(function(listener) {
4419
+ listener(canvas.width, canvas.height);
4420
+ });
4421
+ },setCanvasSize:function (width, height, noUpdates) {
4422
+ var canvas = Module['canvas'];
4423
+ canvas.width = width;
4424
+ canvas.height = height;
4425
+ if (!noUpdates) Browser.updateResizeListeners();
4426
+ },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
4427
+ var canvas = Module['canvas'];
4428
+ this.windowedWidth = canvas.width;
4429
+ this.windowedHeight = canvas.height;
4430
+ canvas.width = screen.width;
4431
+ canvas.height = screen.height;
4432
+ // check if SDL is available
4433
+ if (typeof SDL != "undefined") {
4434
+ var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
4435
+ flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
4436
+ HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
4437
+ }
4438
+ Browser.updateResizeListeners();
4439
+ },setWindowedCanvasSize:function () {
4440
+ var canvas = Module['canvas'];
4441
+ canvas.width = this.windowedWidth;
4442
+ canvas.height = this.windowedHeight;
4443
+ // check if SDL is available
4444
+ if (typeof SDL != "undefined") {
4445
+ var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
4446
+ flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
4447
+ HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
4448
+ }
4449
+ Browser.updateResizeListeners();
4450
+ }};
4451
+___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;
4452
+Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
4453
+ Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
4454
+ Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
4455
+ Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
4456
+ Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
4457
+ Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
4458
+FS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;
4459
+__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();
4460
+if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); }
4461
+STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
4462
+
4463
+staticSealed = true; // seal the static portion of memory
4464
+
4465
+STACK_MAX = STACK_BASE + 5242880;
4466
+
4467
+DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);
4468
+
4469
+assert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack");
4470
+
4471
+
4472
+
4473
+var FUNCTION_TABLE = [0, 0];
4474
+
4475
+// EMSCRIPTEN_START_FUNCS
4476
+
4477
+function _bitmap_decompress_15($output,$output_width,$output_height,$input_width,$input_height,$input,$size){
4478
+ var label=0;
4479
+ var sp=STACKTOP; (assert((STACKTOP|0) < (STACK_MAX|0))|0);
4480
+ label = 1;
4481
+ while(1)switch(label){
4482
+ case 1:
4483
+ var $1;
4484
+ var $2;
4485
+ var $3;
4486
+ var $4;
4487
+ var $5;
4488
+ var $6;
4489
+ var $7;
4490
+ var $temp;
4491
+ var $rv;
4492
+ var $y;
4493
+ var $x;
4494
+ var $a;
4495
+ var $r;
4496
+ var $g;
4497
+ var $b;
4498
+ $1=$output;
4499
+ $2=$output_width;
4500
+ $3=$output_height;
4501
+ $4=$input_width;
4502
+ $5=$input_height;
4503
+ $6=$input;
4504
+ $7=$size;
4505
+ var $8=$4;
4506
+ var $9=$5;
4507
+ var $10=(Math_imul($8,$9)|0);
4508
+ var $11=($10<<1);
4509
+ var $12=_malloc($11);
4510
+ $temp=$12;
4511
+ var $13=$temp;
4512
+ var $14=$4;
4513
+ var $15=$5;
4514
+ var $16=$6;
4515
+ var $17=$7;
4516
+ var $18=_bitmap_decompress2($13,$14,$15,$16,$17);
4517
+ $rv=$18;
4518
+ $y=0;
4519
+ label=2;break;
4520
+ case 2:
4521
+ var $20=$y;
4522
+ var $21=$3;
4523
+ var $22=($20|0)<($21|0);
4524
+ if($22){label=3;break;}else{label=9;break;}
4525
+ case 3:
4526
+ $x=0;
4527
+ label=4;break;
4528
+ case 4:
4529
+ var $25=$x;
4530
+ var $26=$2;
4531
+ var $27=($25|0)<($26|0);
4532
+ if($27){label=5;break;}else{label=7;break;}
4533
+ case 5:
4534
+ var $29=$y;
4535
+ var $30=$4;
4536
+ var $31=(Math_imul($29,$30)|0);
4537
+ var $32=$x;
4538
+ var $33=((($31)+($32))|0);
4539
+ var $34=$temp;
4540
+ var $35=$34;
4541
+ var $36=(($35+($33<<1))|0);
4542
+ var $37=HEAP16[(($36)>>1)];
4543
+ $a=$37;
4544
+ var $38=$a;
4545
+ var $39=($38&65535);
4546
+ var $40=$39&31744;
4547
+ var $41=$40>>10;
4548
+ var $42=(($41)&255);
4549
+ $r=$42;
4550
+ var $43=$a;
4551
+ var $44=($43&65535);
4552
+ var $45=$44&992;
4553
+ var $46=$45>>5;
4554
+ var $47=(($46)&255);
4555
+ $g=$47;
4556
+ var $48=$a;
4557
+ var $49=($48&65535);
4558
+ var $50=$49&31;
4559
+ var $51=(($50)&255);
4560
+ $b=$51;
4561
+ var $52=$r;
4562
+ var $53=($52&255);
4563
+ var $54=((($53)*(255))&-1);
4564
+ var $55=(((($54|0))/(31))&-1);
4565
+ var $56=(($55)&255);
4566
+ $r=$56;
4567
+ var $57=$g;
4568
+ var $58=($57&255);
4569
+ var $59=((($58)*(255))&-1);
4570
+ var $60=(((($59|0))/(31))&-1);
4571
+ var $61=(($60)&255);
4572
+ $g=$61;
4573
+ var $62=$b;
4574
+ var $63=($62&255);
4575
+ var $64=((($63)*(255))&-1);
4576
+ var $65=(((($64|0))/(31))&-1);
4577
+ var $66=(($65)&255);
4578
+ $b=$66;
4579
+ var $67=$b;
4580
+ var $68=($67&255);
4581
+ var $69=$68<<16;
4582
+ var $70=-16777216|$69;
4583
+ var $71=$g;
4584
+ var $72=($71&255);
4585
+ var $73=$72<<8;
4586
+ var $74=$70|$73;
4587
+ var $75=$r;
4588
+ var $76=($75&255);
4589
+ var $77=$74|$76;
4590
+ var $78=$y;
4591
+ var $79=$2;
4592
+ var $80=(Math_imul($78,$79)|0);
4593
+ var $81=$x;
4594
+ var $82=((($80)+($81))|0);
4595
+ var $83=$1;
4596
+ var $84=$83;
4597
+ var $85=(($84+($82<<2))|0);
4598
+ HEAP32[(($85)>>2)]=$77;
4599
+ label=6;break;
4600
+ case 6:
4601
+ var $87=$x;
4602
+ var $88=((($87)+(1))|0);
4603
+ $x=$88;
4604
+ label=4;break;
4605
+ case 7:
4606
+ label=8;break;
4607
+ case 8:
4608
+ var $91=$y;
4609
+ var $92=((($91)+(1))|0);
4610
+ $y=$92;
4611
+ label=2;break;
4612
+ case 9:
4613
+ var $94=$temp;
4614
+ _free($94);
4615
+ var $95=$rv;
4616
+ STACKTOP=sp;return $95;
4617
+ default: assert(0, "bad label: " + label);
4618
+ }
4619
+
4620
+}
4621
+Module["_bitmap_decompress_15"] = _bitmap_decompress_15;
4622
+
4623
+function _bitmap_decompress2($output,$width,$height,$input,$size){
4624
+ var label=0;
4625
+ var sp=STACKTOP; (assert((STACKTOP|0) < (STACK_MAX|0))|0);
4626
+ label = 1;
4627
+ while(1)switch(label){
4628
+ case 1:
4629
+ var $1;
4630
+ var $2;
4631
+ var $3;
4632
+ var $4;
4633
+ var $5;
4634
+ var $6;
4635
+ var $end;
4636
+ var $prevline;
4637
+ var $line;
4638
+ var $opcode;
4639
+ var $count;
4640
+ var $offset;
4641
+ var $isfillormix;
4642
+ var $x;
4643
+ var $lastopcode;
4644
+ var $insertmix;
4645
+ var $bicolour;
4646
+ var $code;
4647
+ var $colour1;
4648
+ var $colour2;
4649
+ var $mixmask;
4650
+ var $mask;
4651
+ var $mix;
4652
+ var $fom_mask;
4653
+ $2=$output;
4654
+ $3=$width;
4655
+ $4=$height;
4656
+ $5=$input;
4657
+ $6=$size;
4658
+ var $7=$5;
4659
+ var $8=$6;
4660
+ var $9=(($7+$8)|0);
4661
+ $end=$9;
4662
+ $prevline=0;
4663
+ $line=0;
4664
+ var $10=$3;
4665
+ $x=$10;
4666
+ $lastopcode=-1;
4667
+ $insertmix=0;
4668
+ $bicolour=0;
4669
+ $colour1=0;
4670
+ $colour2=0;
4671
+ $mask=0;
4672
+ $mix=-1;
4673
+ $fom_mask=0;
4674
+ label=2;break;
4675
+ case 2:
4676
+ var $12=$5;
4677
+ var $13=$end;
4678
+ var $14=($12>>>0)<($13>>>0);
4679
+ if($14){label=3;break;}else{label=346;break;}
4680
+ case 3:
4681
+ $fom_mask=0;
4682
+ var $16=$5;
4683
+ var $17=(($16+1)|0);
4684
+ $5=$17;
4685
+ var $18=HEAP8[($16)];
4686
+ $code=$18;
4687
+ var $19=$code;
4688
+ var $20=($19&255);
4689
+ var $21=$20>>4;
4690
+ $opcode=$21;
4691
+ var $22=$opcode;
4692
+ if(($22|0)==12|($22|0)==13|($22|0)==14){ label=4;break;}else if(($22|0)==15){ label=5;break;}else{label=9;break;}
4693
+ case 4:
4694
+ var $24=$opcode;
4695
+ var $25=((($24)-(6))|0);
4696
+ $opcode=$25;
4697
+ var $26=$code;
4698
+ var $27=($26&255);
4699
+ var $28=$27&15;
4700
+ $count=$28;
4701
+ $offset=16;
4702
+ label=10;break;
4703
+ case 5:
4704
+ var $30=$code;
4705
+ var $31=($30&255);
4706
+ var $32=$31&15;
4707
+ $opcode=$32;
4708
+ var $33=$opcode;
4709
+ var $34=($33|0)<9;
4710
+ if($34){label=6;break;}else{label=7;break;}
4711
+ case 6:
4712
+ var $36=$5;
4713
+ var $37=(($36+1)|0);
4714
+ $5=$37;
4715
+ var $38=HEAP8[($36)];
4716
+ var $39=($38&255);
4717
+ $count=$39;
4718
+ var $40=$5;
4719
+ var $41=(($40+1)|0);
4720
+ $5=$41;
4721
+ var $42=HEAP8[($40)];
4722
+ var $43=($42&255);
4723
+ var $44=$43<<8;
4724
+ var $45=$count;
4725
+ var $46=$45|$44;
4726
+ $count=$46;
4727
+ label=8;break;
4728
+ case 7:
4729
+ var $48=$opcode;
4730
+ var $49=($48|0)<11;
4731
+ var $50=($49?8:1);
4732
+ $count=$50;
4733
+ label=8;break;
4734
+ case 8:
4735
+ $offset=0;
4736
+ label=10;break;
4737
+ case 9:
4738
+ var $53=$opcode;
4739
+ var $54=$53>>1;
4740
+ $opcode=$54;
4741
+ var $55=$code;
4742
+ var $56=($55&255);
4743
+ var $57=$56&31;
4744
+ $count=$57;
4745
+ $offset=32;
4746
+ label=10;break;
4747
+ case 10:
4748
+ var $59=$offset;
4749
+ var $60=($59|0)!=0;
4750
+ if($60){label=11;break;}else{label=22;break;}
4751
+ case 11:
4752
+ var $62=$opcode;
4753
+ var $63=($62|0)==2;
4754
+ if($63){var $68=1;label=13;break;}else{label=12;break;}
4755
+ case 12:
4756
+ var $65=$opcode;
4757
+ var $66=($65|0)==7;
4758
+ var $68=$66;label=13;break;
4759
+ case 13:
4760
+ var $68;
4761
+ var $69=($68&1);
4762
+ $isfillormix=$69;
4763
+ var $70=$count;
4764
+ var $71=($70|0)==0;
4765
+ if($71){label=14;break;}else{label=18;break;}
4766
+ case 14:
4767
+ var $73=$isfillormix;
4768
+ var $74=($73|0)!=0;
4769
+ if($74){label=15;break;}else{label=16;break;}
4770
+ case 15:
4771
+ var $76=$5;
4772
+ var $77=(($76+1)|0);
4773
+ $5=$77;
4774
+ var $78=HEAP8[($76)];
4775
+ var $79=($78&255);
4776
+ var $80=((($79)+(1))|0);
4777
+ $count=$80;
4778
+ label=17;break;
4779
+ case 16:
4780
+ var $82=$5;
4781
+ var $83=(($82+1)|0);
4782
+ $5=$83;
4783
+ var $84=HEAP8[($82)];
4784
+ var $85=($84&255);
4785
+ var $86=$offset;
4786
+ var $87=((($85)+($86))|0);
4787
+ $count=$87;
4788
+ label=17;break;
4789
+ case 17:
4790
+ label=21;break;
4791
+ case 18:
4792
+ var $90=$isfillormix;
4793
+ var $91=($90|0)!=0;
4794
+ if($91){label=19;break;}else{label=20;break;}
4795
+ case 19:
4796
+ var $93=$count;
4797
+ var $94=$93<<3;
4798
+ $count=$94;
4799
+ label=20;break;
4800
+ case 20:
4801
+ label=21;break;
4802
+ case 21:
4803
+ label=22;break;
4804
+ case 22:
4805
+ var $98=$opcode;
4806
+ switch(($98|0)){case 0:{ label=23;break;}case 8:{ label=28;break;}case 3:{ label=29;break;}case 6:case 7:{ label=30;break;}case 9:{ label=31;break;}case 10:{ label=32;break;}default:{label=33;break;}}break;
4807
+ case 23:
4808
+ var $100=$lastopcode;
4809
+ var $101=$opcode;
4810
+ var $102=($100|0)==($101|0);
4811
+ if($102){label=24;break;}else{label=27;break;}
4812
+ case 24:
4813
+ var $104=$x;
4814
+ var $105=$3;
4815
+ var $106=($104|0)==($105|0);
4816
+ if($106){label=25;break;}else{label=26;break;}
4817
+ case 25:
4818
+ var $108=$prevline;
4819
+ var $109=($108|0)==0;
4820
+ if($109){label=27;break;}else{label=26;break;}
4821
+ case 26:
4822
+ $insertmix=1;
4823
+ label=27;break;
4824
+ case 27:
4825
+ label=33;break;
4826
+ case 28:
4827
+ var $113=$5;
4828
+ var $114=(($113+1)|0);
4829
+ $5=$114;
4830
+ var $115=HEAP8[($113)];
4831
+ var $116=($115&255);
4832
+ $colour1=$116;
4833
+ var $117=$5;
4834
+ var $118=(($117+1)|0);
4835
+ $5=$118;
4836
+ var $119=HEAP8[($117)];
4837
+ var $120=($119&255);
4838
+ var $121=$120<<8;
4839
+ var $122=$colour1;
4840
+ var $123=($122&65535);
4841
+ var $124=$123|$121;
4842
+ var $125=(($124)&65535);
4843
+ $colour1=$125;
4844
+ label=29;break;
4845
+ case 29:
4846
+ var $127=$5;
4847
+ var $128=(($127+1)|0);
4848
+ $5=$128;
4849
+ var $129=HEAP8[($127)];
4850
+ var $130=($129&255);
4851
+ $colour2=$130;
4852
+ var $131=$5;
4853
+ var $132=(($131+1)|0);
4854
+ $5=$132;
4855
+ var $133=HEAP8[($131)];
4856
+ var $134=($133&255);
4857
+ var $135=$134<<8;
4858
+ var $136=$colour2;
4859
+ var $137=($136&65535);
4860
+ var $138=$137|$135;
4861
+ var $139=(($138)&65535);
4862
+ $colour2=$139;
4863
+ label=33;break;
4864
+ case 30:
4865
+ var $141=$5;
4866
+ var $142=(($141+1)|0);
4867
+ $5=$142;
4868
+ var $143=HEAP8[($141)];
4869
+ var $144=($143&255);
4870
+ $mix=$144;
4871
+ var $145=$5;
4872
+ var $146=(($145+1)|0);
4873
+ $5=$146;
4874
+ var $147=HEAP8[($145)];
4875
+ var $148=($147&255);
4876
+ var $149=$148<<8;
4877
+ var $150=$mix;
4878
+ var $151=($150&65535);
4879
+ var $152=$151|$149;
4880
+ var $153=(($152)&65535);
4881
+ $mix=$153;
4882
+ var $154=$opcode;
4883
+ var $155=((($154)-(5))|0);
4884
+ $opcode=$155;
4885
+ label=33;break;
4886
+ case 31:
4887
+ $mask=3;
4888
+ $opcode=2;
4889
+ $fom_mask=3;
4890
+ label=33;break;
4891
+ case 32:
4892
+ $mask=5;
4893
+ $opcode=2;
4894
+ $fom_mask=5;
4895
+ label=33;break;
4896
+ case 33:
4897
+ var $159=$opcode;
4898
+ $lastopcode=$159;
4899
+ $mixmask=0;
4900
+ label=34;break;
4901
+ case 34:
4902
+ var $161=$count;
4903
+ var $162=($161|0)>0;
4904
+ if($162){label=35;break;}else{label=345;break;}
4905
+ case 35:
4906
+ var $164=$x;
4907
+ var $165=$3;
4908
+ var $166=($164|0)>=($165|0);
4909
+ if($166){label=36;break;}else{label=39;break;}
4910
+ case 36:
4911
+ var $168=$4;
4912
+ var $169=($168|0)<=0;
4913
+ if($169){label=37;break;}else{label=38;break;}
4914
+ case 37:
4915
+ $1=0;
4916
+ label=347;break;
4917
+ case 38:
4918
+ $x=0;
4919
+ var $172=$4;
4920
+ var $173=((($172)-(1))|0);
4921
+ $4=$173;
4922
+ var $174=$line;
4923
+ $prevline=$174;
4924
+ var $175=$2;
4925
+ var $176=$175;
4926
+ var $177=$4;
4927
+ var $178=$3;
4928
+ var $179=(Math_imul($177,$178)|0);
4929
+ var $180=(($176+($179<<1))|0);
4930
+ $line=$180;
4931
+ label=39;break;
4932
+ case 39:
4933
+ var $182=$opcode;
4934
+ switch(($182|0)){case 3:{ label=261;break;}case 4:{ label=272;break;}case 8:{ label=283;break;}case 13:{ label=321;break;}case 14:{ label=332;break;}case 0:{ label=40;break;}case 1:{ label=69;break;}case 2:{ label=93;break;}default:{label=343;break;}}break;
4935
+ case 40:
4936
+ var $184=$insertmix;
4937
+ var $185=($184|0)!=0;
4938
+ if($185){label=41;break;}else{label=45;break;}
4939
+ case 41:
4940
+ var $187=$prevline;
4941
+ var $188=($187|0)==0;
4942
+ if($188){label=42;break;}else{label=43;break;}
4943
+ case 42:
4944
+ var $190=$mix;
4945
+ var $191=$x;
4946
+ var $192=$line;
4947
+ var $193=(($192+($191<<1))|0);
4948
+ HEAP16[(($193)>>1)]=$190;
4949
+ label=44;break;
4950
+ case 43:
4951
+ var $195=$x;
4952
+ var $196=$prevline;
4953
+ var $197=(($196+($195<<1))|0);
4954
+ var $198=HEAP16[(($197)>>1)];
4955
+ var $199=($198&65535);
4956
+ var $200=$mix;
4957
+ var $201=($200&65535);
4958
+ var $202=$199^$201;
4959
+ var $203=(($202)&65535);
4960
+ var $204=$x;
4961
+ var $205=$line;
4962
+ var $206=(($205+($204<<1))|0);
4963
+ HEAP16[(($206)>>1)]=$203;
4964
+ label=44;break;
4965
+ case 44:
4966
+ $insertmix=0;
4967
+ var $208=$count;
4968
+ var $209=((($208)-(1))|0);
4969
+ $count=$209;
4970
+ var $210=$x;
4971
+ var $211=((($210)+(1))|0);
4972
+ $x=$211;
4973
+ label=45;break;
4974
+ case 45:
4975
+ var $213=$prevline;
4976
+ var $214=($213|0)==0;
4977
+ if($214){label=46;break;}else{label=57;break;}
4978
+ case 46:
4979
+ label=47;break;
4980
+ case 47:
4981
+ var $217=$count;
4982
+ var $218=$217&-8;
4983
+ var $219=($218|0)!=0;
4984
+ if($219){label=48;break;}else{var $226=0;label=49;break;}
4985
+ case 48:
4986
+ var $221=$x;
4987
+ var $222=((($221)+(8))|0);
4988
+ var $223=$3;
4989
+ var $224=($222|0)<($223|0);
4990
+ var $226=$224;label=49;break;
4991
+ case 49:
4992
+ var $226;
4993
+ if($226){label=50;break;}else{label=51;break;}
4994
+ case 50:
4995
+ var $228=$x;
4996
+ var $229=$line;
4997
+ var $230=(($229+($228<<1))|0);
4998
+ HEAP16[(($230)>>1)]=0;
4999
+ var $231=$count;
This file is too large to show in full.
public/mstsc/keymap.html
new
+20
@@ -0,0 +1,20 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+
5
+ <script language="javascript">
6
+ function install() {
7
+ // bind keyboard event
8
+ window.addEventListener('keydown', function (e) {
9
+ document.getElementById('output').innerHTML += e.keyCode + ' : "' + e.code + '", <br>';
10
+ e.preventDefault();
11
+ return false;
12
+ });
13
+ }
14
+ </script>
15
+ </head>
16
+
17
+ <body onload='install()'>
18
+ <p id='output'></p>
19
+ </body>
20
+</html>
public/scripts/amt-wsman-0.2.0-min.js
+1
-1
@@ -1 +1 @@
1
-var WsmanStackCreateService=function(e,s,r,a,o,t){var p={};function l(e){if(!e)return"";var s=" ";for(var r in e)e.hasOwnProperty(r)&&0===r.indexOf("@")&&(s+=r.substring(1)+'="'+e[r]+'" ');return s}function w(e){if(!e)return"";if("string"==typeof e)return e;if(e.InstanceID)return'<w:SelectorSet><w:Selector Name="InstanceID">'+e.InstanceID+"</w:Selector></w:SelectorSet>";var s="<w:SelectorSet>";for(var r in e)if(e.hasOwnProperty(r)){if(s+='<w:Selector Name="'+r+'">',e[r].ReferenceParameters){s+="<a:EndpointReference>",s+="<a:Address>"+e[r].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+e[r].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var a=e[r].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(a))for(var o=0;o<a.length;o++)s+="<w:Selector"+l(a[o])+">"+a[o].Value+"</w:Selector>";else s+="<w:Selector"+l(a)+">"+a.Value+"</w:Selector>";s+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else s+=e[r];s+="</w:Selector>"}return s+="</w:SelectorSet>"}return p.NextMessageId=1,p.Address="/wsman",p.comm=CreateWsmanComm(e,s,r,a,o,t),p.PerformAjax=function(e,o,s,r,a){null==a&&(a=""),p.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" '+a+"><Header><a:Action>"+e,function(e,s,r){if(200==s){var a=p.ParseWsman(e);a&&null!=a?o(p,a.Header.ResourceURI,a,200,r):o(p,null,{Header:{HttpError:s}},601,r)}else o(p,null,{Header:{HttpError:s}},s,r)},s,r)},p.CancelAllQueries=function(e){p.comm.CancelAllQueries(e)},p.GetNameFromUrl=function(e){var s=e.lastIndexOf("/");return-1==s?e:e.substring(s+1)},p.ExecSubscribe=function(e,s,r,a,o,t,n,l,d,c){var m="",i="";null!=d&&null!=c&&(m="<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>"+d+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+c+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>",i='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'),l=null!=l&&null!=l?"<a:ReferenceParameters>"+l+"</a:ReferenceParameters>":"";var u="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(n)+m+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+s+'"><e:NotifyTo><a:Address>'+r+"</a:Address></e:NotifyTo>"+i+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";p.PerformAjax(u+"</Body></Envelope>",a,o,t,'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"')},p.ExecUnSubscribe=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(o)+"</Header><Body><e:Unsubscribe/>";p.PerformAjax(t+"</Body></Envelope>",s,r,a,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')},p.ExecPut=function(e,s,r,a,o,t){var n="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(t)+"</Header><Body>"+function(e,s){if(!e||null==s)return"";var r=p.GetNameFromUrl(e),a="<r:"+r+' xmlns:r="'+e+'">';for(var o in s)if(s.hasOwnProperty(o)&&0!==o.indexOf("__")&&0!==o.indexOf("@")&&void 0!==s[o]&&null!==s[o]&&"function"!=typeof s[o])if("object"==typeof s[o]&&s[o].ReferenceParameters){a+="<r:"+o+"><a:Address>"+s[o].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[o].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var t=s[o].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(t))for(var n=0;n<t.length;n++)a+="<w:Selector"+l(t[n])+">"+t[n].Value+"</w:Selector>";else a+="<w:Selector"+l(t)+">"+t.Value+"</w:Selector>";a+="</w:SelectorSet></a:ReferenceParameters></r:"+o+">"}else if(Array.isArray(s[o]))for(n=0;n<s[o].length;n++)a+="<r:"+o+">"+s[o][n].toString()+"</r:"+o+">";else a+="<r:"+o+">"+s[o].toString()+"</r:"+o+">";return a+="</r:"+r+">"}(e,s);p.PerformAjax(n+"</Body></Envelope>",r,a,o)},p.ExecCreate=function(e,s,r,a,o,t){var n=p.GetNameFromUrl(e),l="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(t)+"</Header><Body><g:"+n+' xmlns:g="'+e+'">';for(var d in s)l+="<g:"+d+">"+s[d]+"</g:"+d+">";p.PerformAjax(l+"</g:"+n+"></Body></Envelope>",r,a,o)},p.ExecCreateXml=function(e,s,r,a,o){var t=p.GetNameFromUrl(e);p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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:"+t+' xmlns:r="'+e+'">'+s+"</r:"+t+"></Body></Envelope>",r,a,o)},p.ExecDelete=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(s)+"</Header><Body /></Envelope>";p.PerformAjax(t,r,a,o)},p.ExecGet=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>",s,r,a)},p.ExecMethod=function(e,s,r,a,o,t,n){var l="";for(var d in r)if(null!=r[d])if(Array.isArray(r[d]))for(var c in r[d])l+="<r:"+d+">"+r[d][c]+"</r:"+d+">";else l+="<r:"+d+">"+r[d]+"</r:"+d+">";p.ExecMethodXml(e,s,l,a,o,t,n)},p.ExecMethodXml=function(e,s,r,a,o,t,n){p.PerformAjax(e+"/"+s+"</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(n)+"</Header><Body><r:"+s+'_INPUT xmlns:r="'+e+'">'+r+"</r:"+s+"_INPUT></Body></Envelope>",a,o,t)},p.ExecEnum=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>',s,r,a)},p.ExecPull=function(e,s,r,a,o){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>'+s+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",r,a,o)},p.ParseWsman=function(s){try{s.childNodes||(s=function(e){{if(window.DOMParser)return(new DOMParser).parseFromString(e,"text/xml");var s=new ActiveXObject("Microsoft.XMLDOM");return s.async=!1,s.loadXML(e),s}}(s));var e,r={Header:{}},a=s.getElementsByTagName("Header")[0];if(!(a=a||s.getElementsByTagName("a:Header")[0]))return null;for(var o=0;o<a.childNodes.length;o++){var t=a.childNodes[o];r.Header[t.localName]=t.textContent}var n=s.getElementsByTagName("Body")[0];return(n=n||s.getElementsByTagName("a:Body")[0])?(0<n.childNodes.length&&((e=n.childNodes[0].localName).indexOf("_OUTPUT")==e.length-7&&(e=e.substring(0,e.length-7)),r.Header.Method=e,r.Body=function e(s){var r,a={};for(var o=0;o<s.childNodes.length;o++){var t=s.childNodes[o];"true"==(r=0==t.childElementCount?t.textContent:e(t))&&(r=!0),"false"==r&&(r=!1);var n=r;if(0<t.attributes.length){n={Value:r};for(var l=0;l<t.attributes.length;l++)n["@"+t.attributes[l].name]=t.attributes[l].value}a[t.localName]instanceof Array?a[t.localName].push(n):null==a[t.localName]?a[t.localName]=n:a[t.localName]=[a[t.localName],n]}return a}(n.childNodes[0])),r):null}catch(e){return console.log("Unable to parse XML: "+s),null}},p}
\ No newline at end of file
1
+var WsmanStackCreateService=function(e,s,r,a,o,t){var p={};function l(e){if(!e)return"";var s=" ";for(var r in e)e.hasOwnProperty(r)&&0===r.indexOf("@")&&(s+=r.substring(1)+'="'+e[r]+'" ');return s}function w(e){if(!e)return"";if("string"==typeof e)return e;if(e.InstanceID)return'<w:SelectorSet><w:Selector Name="InstanceID">'+e.InstanceID+"</w:Selector></w:SelectorSet>";var s="<w:SelectorSet>";for(var r in e)if(e.hasOwnProperty(r)){if(s+='<w:Selector Name="'+r+'">',e[r].ReferenceParameters){s+="<a:EndpointReference>",s+="<a:Address>"+e[r].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+e[r].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var a=e[r].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(a))for(var o=0;o<a.length;o++)s+="<w:Selector"+l(a[o])+">"+a[o].Value+"</w:Selector>";else s+="<w:Selector"+l(a)+">"+a.Value+"</w:Selector>";s+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else s+=e[r];s+="</w:Selector>"}return s+="</w:SelectorSet>"}return p.NextMessageId=1,p.Address="/wsman",p.comm=CreateWsmanComm(e,s,r,a,o,t),p.PerformAjax=function(e,o,s,r,a){null==a&&(a=""),p.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" '+a+"><Header><a:Action>"+e,function(e,s,r){if(200==s){var a=p.ParseWsman(e);a&&null!=a?o(p,a.Header.ResourceURI,a,200,r):o(p,null,{Header:{HttpError:s}},601,r)}else o(p,null,{Header:{HttpError:s}},s,r)},s,r)},p.CancelAllQueries=function(e){p.comm.CancelAllQueries(e)},p.GetNameFromUrl=function(e){var s=e.lastIndexOf("/");return-1==s?e:e.substring(s+1)},p.ExecSubscribe=function(e,s,r,a,o,t,n,l,c,d){var m="",i="";null!=c&&null!=d&&(m="<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>"+c+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+d+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>",i='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'),l=null!=l&&null!=l?"<a:ReferenceParameters>"+l+"</a:ReferenceParameters>":"";var u="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(n)+m+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+s+'"><e:NotifyTo><a:Address>'+r+"</a:Address></e:NotifyTo>"+i+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";p.PerformAjax(u+"</Body></Envelope>",a,o,t,'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"')},p.ExecUnSubscribe=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(o)+"</Header><Body><e:Unsubscribe/>";p.PerformAjax(t+"</Body></Envelope>",s,r,a,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')},p.ExecPut=function(e,s,r,a,o,t){var n="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(t)+"</Header><Body>"+function(e,s){if(!e||null==s)return"";var r=p.GetNameFromUrl(e),a="<r:"+r+' xmlns:r="'+e+'">';for(var o in s)if(s.hasOwnProperty(o)&&0!==o.indexOf("__")&&0!==o.indexOf("@")&&void 0!==s[o]&&null!==s[o]&&"function"!=typeof s[o])if("object"==typeof s[o]&&s[o].ReferenceParameters){a+="<r:"+o+"><a:Address>"+s[o].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[o].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var t=s[o].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(t))for(var n=0;n<t.length;n++)a+="<w:Selector"+l(t[n])+">"+t[n].Value+"</w:Selector>";else a+="<w:Selector"+l(t)+">"+t.Value+"</w:Selector>";a+="</w:SelectorSet></a:ReferenceParameters></r:"+o+">"}else if(Array.isArray(s[o]))for(n=0;n<s[o].length;n++)a+="<r:"+o+">"+s[o][n].toString()+"</r:"+o+">";else a+="<r:"+o+">"+s[o].toString()+"</r:"+o+">";return a+="</r:"+r+">"}(e,s);p.PerformAjax(n+"</Body></Envelope>",r,a,o)},p.ExecCreate=function(e,s,r,a,o,t){var n=p.GetNameFromUrl(e),l="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(t)+"</Header><Body><g:"+n+' xmlns:g="'+e+'">';for(var c in s)l+="<g:"+c+">"+s[c]+"</g:"+c+">";p.PerformAjax(l+"</g:"+n+"></Body></Envelope>",r,a,o)},p.ExecCreateXml=function(e,s,r,a,o){var t=p.GetNameFromUrl(e);p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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:"+t+' xmlns:r="'+e+'">'+s+"</r:"+t+"></Body></Envelope>",r,a,o)},p.ExecDelete=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(s)+"</Header><Body /></Envelope>";p.PerformAjax(t,r,a,o)},p.ExecGet=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>",s,r,a)},p.ExecMethod=function(e,s,r,a,o,t,n){var l="";for(var c in r)if(null!=r[c])if(Array.isArray(r[c]))for(var d in r[c])l+="<r:"+c+">"+r[c][d]+"</r:"+c+">";else l+="<r:"+c+">"+r[c]+"</r:"+c+">";p.ExecMethodXml(e,s,l,a,o,t,n)},p.ExecMethodXml=function(e,s,r,a,o,t,n){p.PerformAjax(e+"/"+s+"</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>"+w(n)+"</Header><Body><r:"+s+'_INPUT xmlns:r="'+e+'">'+r+"</r:"+s+"_INPUT></Body></Envelope>",a,o,t)},p.ExecEnum=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>',s,r,a)},p.ExecPull=function(e,s,r,a,o){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.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>'+s+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",r,a,o)},p.ParseWsman=function(s){try{s.childNodes||(s=function(e){{if(window.DOMParser)return(new DOMParser).parseFromString(e,"text/xml");var s=new ActiveXObject("Microsoft.XMLDOM");return s.async=!1,s.loadXML(e),s}}(s));var e,r={Header:{}},a=s.getElementsByTagName("Header")[0];if(!(a=a||s.getElementsByTagName("a:Header")[0]))return null;for(var o=0;o<a.childNodes.length;o++){var t=a.childNodes[o];r.Header[t.localName]=t.textContent}var n=s.getElementsByTagName("Body")[0];return(n=n||s.getElementsByTagName("a:Body")[0])?(0<n.childNodes.length&&((e=n.childNodes[0].localName).indexOf("_OUTPUT")==e.length-7&&(e=e.substring(0,e.length-7)),r.Header.Method=e,r.Body=function e(s){var r,a={};for(var o=0;o<s.childNodes.length;o++){var t=s.childNodes[o];"true"==(r=0==t.childElementCount?t.textContent:e(t))&&(r=!0),"false"==r&&(r=!1);var n=r;if(0<t.attributes.length){n={Value:r};for(var l=0;l<t.attributes.length;l++)n["@"+t.attributes[l].name]=t.attributes[l].value}a[t.localName]instanceof Array?a[t.localName].push(n):null==a[t.localName]?a[t.localName]=n:a[t.localName]=[a[t.localName],n]}return a}(n.childNodes[0])),r):null}catch(e){return console.log("Unable to parse XML: "+s),null}},p}
\ No newline at end of file
translate/translate.json
+1246
-1234
@@ -14,8 +14,8 @@
14
"ru": " + CIRA",
15
"zh-chs": " + CIRA",
16
"xloc": [
17
- "default.handlebars->27->1193",
18
- "default.handlebars->27->1195"
17
+ "default.handlebars->27->1195",
18
+ "default.handlebars->27->1197"
19
]
20
},
21
{
@@ -174,7 +174,7 @@
174
"ru": " Может быть использована подсказка пароля, но не рекоммендуется.",
175
"zh-chs": " 可以使用密碼提示,但不建議使用。",
176
"xloc": [
177
- "default.handlebars->27->1119"
177
+ "default.handlebars->27->1121"
178
]
179
},
180
{
@@ -191,8 +191,8 @@
191
"ru": " Для добавления в группу устройств, пользователь должен зайти на сервер хотя бы один раз.",
192
"zh-chs": " 用戶需要先登錄到該服務器一次,然後才能將其添加到設備組。",
193
"xloc": [
194
- "default.handlebars->27->1268",
195
- "default.handlebars->27->1581"
194
+ "default.handlebars->27->1270",
195
+ "default.handlebars->27->1583"
196
]
197
},
198
{
@@ -377,7 +377,7 @@
377
"ru": "* Оставьте пустым для установления случайного пароля каждому устройству.",
378
"zh-chs": "*保留空白以為每個設備分配一個隨機密碼。",
379
"xloc": [
380
- "default.handlebars->27->1240"
380
+ "default.handlebars->27->1242"
381
]
382
},
383
{
@@ -411,7 +411,7 @@
411
"zh-chs": ",",
412
"xloc": [
413
"default-mobile.handlebars->9->435",
414
- "default.handlebars->27->1334"
414
+ "default.handlebars->27->1336"
415
]
416
},
417
{
@@ -446,7 +446,7 @@
446
"ru": ", MQTT онлайн",
447
"zh-chs": ",MQTT在線",
448
"xloc": [
449
- "default.handlebars->27->862"
449
+ "default.handlebars->27->864"
450
]
451
},
452
{
@@ -463,7 +463,7 @@
463
"ru": ", Soft-KVM",
464
"zh-chs": ",軟KVM",
465
"xloc": [
466
- "default.handlebars->27->708"
466
+ "default.handlebars->27->710"
467
]
468
},
469
{
@@ -482,9 +482,9 @@
482
"xloc": [
483
"default-mobile.handlebars->9->277",
484
"default-mobile.handlebars->9->286",
485
- "default.handlebars->27->715",
486
- "default.handlebars->27->746",
487
- "default.handlebars->27->758",
485
+ "default.handlebars->27->717",
486
+ "default.handlebars->27->748",
487
+ "default.handlebars->27->760",
488
"xterm.handlebars->9->6"
489
]
490
},
@@ -510,7 +510,7 @@
510
"en": ", for this link to work you must download MeshCentral Router run it and click the install button.",
511
"nl": ", om deze link te laten werken, moet u MeshCentral Router downloaden, het uitvoeren en op de installatieknop klikken.",
512
"xloc": [
513
- "default.handlebars->27->672"
513
+ "default.handlebars->27->674"
514
]
515
},
516
{
@@ -568,7 +568,7 @@
568
"en": ", {0} watching",
569
"nl": ", {0} kijken",
570
"xloc": [
571
- "default.handlebars->27->709"
571
+ "default.handlebars->27->711"
572
]
573
},
574
{
@@ -625,9 +625,9 @@
625
"xloc": [
626
"default-mobile.handlebars->9->108",
627
"default-mobile.handlebars->9->288",
628
- "default.handlebars->27->1375",
629
- "default.handlebars->27->1729",
630
- "default.handlebars->27->760"
628
+ "default.handlebars->27->1377",
629
+ "default.handlebars->27->1731",
630
+ "default.handlebars->27->762"
631
]
632
},
633
{
@@ -676,7 +676,7 @@
676
"ru": "1 активная сессия",
677
"zh-chs": "1個活動會話",
678
"xloc": [
679
- "default.handlebars->27->1647"
679
+ "default.handlebars->27->1649"
680
]
681
},
682
{
@@ -695,14 +695,14 @@
695
"xloc": [
696
"default-mobile.handlebars->9->118",
697
"default-mobile.handlebars->9->439",
698
- "default.handlebars->27->1394"
698
+ "default.handlebars->27->1396"
699
]
700
},
701
{
702
"en": "1 connection",
703
"nl": "1 verbinding",
704
"xloc": [
705
- "default.handlebars->27->711"
705
+ "default.handlebars->27->713"
706
]
707
},
708
{
@@ -738,7 +738,7 @@
738
"ru": "1 группа",
739
"zh-chs": "1組",
740
"xloc": [
741
- "default.handlebars->27->1612"
741
+ "default.handlebars->27->1614"
742
]
743
},
744
{
@@ -810,7 +810,7 @@
810
"ru": "Еще 1 пользователь не показан, используйте поиск чтобы найти пользователей...",
811
"zh-chs": "未再顯示1個用戶,請使用搜索框查找用戶...",
812
"xloc": [
813
- "default.handlebars->27->1429"
813
+ "default.handlebars->27->1431"
814
]
815
},
816
{
@@ -865,7 +865,7 @@
865
"default-mobile.handlebars->9->162",
866
"default-mobile.handlebars->9->165",
867
"default-mobile.handlebars->9->168",
868
- "default.handlebars->27->1433",
868
+ "default.handlebars->27->1435",
869
"default.handlebars->27->212",
870
"default.handlebars->27->215",
871
"default.handlebars->27->218",
@@ -1137,8 +1137,8 @@
1137
"ru": "двухфакторная аутентификация включена",
1138
"zh-chs": "啟用第二因素身份驗證",
1139
"xloc": [
1140
- "default.handlebars->27->1446",
1141
- "default.handlebars->27->1634"
1140
+ "default.handlebars->27->1448",
1141
+ "default.handlebars->27->1636"
1142
]
1143
},
1144
{
@@ -1503,7 +1503,7 @@
1503
"ru": "7-дневная статистика работы",
1504
"zh-chs": "7天電源狀態",
1505
"xloc": [
1506
- "default.handlebars->27->641"
1506
+ "default.handlebars->27->643"
1507
]
1508
},
1509
{
@@ -1850,7 +1850,7 @@
1850
"ru": "Отказано в доступе",
1851
"zh-chs": "拒絕訪問",
1852
"xloc": [
1853
- "default.handlebars->27->863"
1853
+ "default.handlebars->27->865"
1854
]
1855
},
1856
{
@@ -1885,7 +1885,7 @@
1885
"ru": "Доступ к файлам сервера",
1886
"zh-chs": "訪問服務器文件",
1887
"xloc": [
1888
- "default.handlebars->27->1587"
1888
+ "default.handlebars->27->1589"
1889
]
1890
},
1891
{
@@ -1960,8 +1960,8 @@
1960
"default-mobile.handlebars->9->93",
1961
"default-mobile.handlebars->9->95",
1962
"default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->p3AccountActions->p2AccountSecurity->1->0",
1963
- "default.handlebars->27->1128",
1963
"default.handlebars->27->1130",
1964
+ "default.handlebars->27->1132",
1965
"default.handlebars->27->464",
1966
"default.handlebars->27->466"
1967
]
@@ -2009,8 +2009,8 @@
2009
"ru": "Аккаунт заблокирован",
2010
"zh-chs": "帐户已被锁定",
2011
"xloc": [
2012
- "default.handlebars->27->1448",
2013
- "default.handlebars->27->1584"
2012
+ "default.handlebars->27->1450",
2013
+ "default.handlebars->27->1586"
2014
]
2015
},
2016
{
@@ -2098,7 +2098,7 @@
2098
"ru": "Действиe",
2099
"zh-chs": "行動",
2100
"xloc": [
2101
- "default.handlebars->27->868",
2101
+ "default.handlebars->27->870",
2102
"default.handlebars->container->column_l->p42->p42tbl->1->0->8"
2103
]
2104
},
@@ -2116,8 +2116,8 @@
2116
"ru": "Файл действий",
2117
"zh-chs": "動作文件",
2118
"xloc": [
2119
- "default.handlebars->27->684",
2120
- "default.handlebars->27->686"
2119
+ "default.handlebars->27->686",
2120
+ "default.handlebars->27->688"
2121
]
2122
},
2123
{
@@ -2196,7 +2196,7 @@
2196
"default-mobile.handlebars->9->344",
2197
"default.handlebars->27->488",
2198
"default.handlebars->27->490",
2199
- "default.handlebars->27->826"
2199
+ "default.handlebars->27->828"
2200
]
2201
},
2202
{
@@ -2213,8 +2213,8 @@
2213
"ru": "Активация",
2214
"zh-chs": "激活",
2215
"xloc": [
2216
- "default.handlebars->27->1206",
2216
"default.handlebars->27->1208",
2217
+ "default.handlebars->27->1210",
2218
"default.handlebars->27->238",
2219
"default.handlebars->27->240"
2220
]
@@ -2250,7 +2250,7 @@
2250
"ru": "Добавить агент",
2251
"zh-chs": "添加代理",
2252
"xloc": [
2253
- "default.handlebars->27->1210",
2253
+ "default.handlebars->27->1212",
2254
"default.handlebars->27->242"
2255
]
2256
},
@@ -2285,8 +2285,8 @@
2285
"ru": "Добавить устройство",
2286
"zh-chs": "添加設備",
2287
"xloc": [
2288
- "default.handlebars->27->1561",
2289
- "default.handlebars->27->1680"
2288
+ "default.handlebars->27->1563",
2289
+ "default.handlebars->27->1682"
2290
]
2291
},
2292
{
@@ -2303,7 +2303,7 @@
2303
"ru": "Добавить событие к устройству",
2304
"zh-chs": "添加設備事件",
2305
"xloc": [
2306
- "default.handlebars->27->622"
2306
+ "default.handlebars->27->624"
2307
]
2308
},
2309
{
@@ -2320,9 +2320,9 @@
2320
"ru": "Добавить группу устройств",
2321
"zh-chs": "添加設備組",
2322
"xloc": [
2323
- "default.handlebars->27->1300",
2324
- "default.handlebars->27->1555",
2325
- "default.handlebars->27->1668",
2323
+ "default.handlebars->27->1302",
2324
+ "default.handlebars->27->1557",
2325
+ "default.handlebars->27->1670",
2326
"default.handlebars->27->200"
2327
]
2328
},
@@ -2337,7 +2337,7 @@
2337
"nl": "Machtigingen voor apparaatgroep toevoegen",
2338
"zh-chs": "添加设备组权限",
2339
"xloc": [
2340
- "default.handlebars->27->1297"
2340
+ "default.handlebars->27->1299"
2341
]
2342
},
2343
{
@@ -2353,8 +2353,8 @@
2353
"ru": "Добавить разрешения для устройства",
2354
"zh-chs": "添加设备权限",
2355
"xloc": [
2356
- "default.handlebars->27->1302",
2357
- "default.handlebars->27->1304"
2356
+ "default.handlebars->27->1304",
2357
+ "default.handlebars->27->1306"
2358
]
2359
},
2360
{
@@ -2439,7 +2439,7 @@
2439
"ru": "Добавить участие",
2440
"zh-chs": "添加會員",
2441
"xloc": [
2442
- "default.handlebars->27->1698"
2442
+ "default.handlebars->27->1700"
2443
]
2444
},
2445
{
@@ -2477,8 +2477,8 @@
2477
"default.handlebars->27->135",
2478
"default.handlebars->27->138",
2479
"default.handlebars->27->139",
2480
- "default.handlebars->27->896",
2481
- "default.handlebars->27->897"
2480
+ "default.handlebars->27->898",
2481
+ "default.handlebars->27->899"
2482
]
2483
},
2484
{
@@ -2496,7 +2496,7 @@
2496
"zh-chs": "添加用戶",
2497
"xloc": [
2498
"default-mobile.handlebars->9->384",
2499
- "default.handlebars->27->579"
2499
+ "default.handlebars->27->581"
2500
]
2501
},
2502
{
@@ -2512,7 +2512,7 @@
2512
"ru": "Добавить разрешения для пользовательских устройств",
2513
"zh-chs": "添加用户设备权限",
2514
"xloc": [
2515
- "default.handlebars->27->1307"
2515
+ "default.handlebars->27->1309"
2516
]
2517
},
2518
{
@@ -2529,10 +2529,10 @@
2529
"ru": "Добавить группу пользователей",
2530
"zh-chs": "添加用戶組",
2531
"xloc": [
2532
- "default.handlebars->27->1200",
2533
- "default.handlebars->27->1299",
2534
- "default.handlebars->27->1674",
2535
- "default.handlebars->27->580"
2532
+ "default.handlebars->27->1202",
2533
+ "default.handlebars->27->1301",
2534
+ "default.handlebars->27->1676",
2535
+ "default.handlebars->27->582"
2536
]
2537
},
2538
{
@@ -2546,7 +2546,7 @@
2546
"nl": "Gebruikersmachtigingen voor apparaatgroep toevoegen",
2547
"zh-chs": "添加用户组设备权限",
2548
"xloc": [
2549
- "default.handlebars->27->1309"
2549
+ "default.handlebars->27->1311"
2550
]
2551
},
2552
{
@@ -2591,8 +2591,8 @@
2591
"ru": "Добавить пользователей",
2592
"zh-chs": "添加用戶",
2593
"xloc": [
2594
- "default.handlebars->27->1199",
2595
- "default.handlebars->27->1550"
2594
+ "default.handlebars->27->1201",
2595
+ "default.handlebars->27->1552"
2596
]
2597
},
2598
{
@@ -2609,7 +2609,7 @@
2609
"ru": "Добавить пользователей в группу устройств",
2610
"zh-chs": "將用戶添加到設備組",
2611
"xloc": [
2612
- "default.handlebars->27->1296"
2612
+ "default.handlebars->27->1298"
2613
]
2614
},
2615
{
@@ -2626,7 +2626,7 @@
2626
"ru": "Добавить пользователей в группу",
2627
"zh-chs": "將用戶添加到用戶組",
2628
"xloc": [
2629
- "default.handlebars->27->1583"
2629
+ "default.handlebars->27->1585"
2630
]
2631
},
2632
{
@@ -2677,7 +2677,7 @@
2677
"ru": "Добавить новый Intel® AMT компьютер, находящийся в интернете.",
2678
"zh-chs": "添加位於互聯網上的新英特爾®AMT計算機。",
2679
"xloc": [
2680
- "default.handlebars->27->1201",
2680
+ "default.handlebars->27->1203",
2681
"default.handlebars->27->231"
2682
]
2683
},
@@ -2695,7 +2695,7 @@
2695
"ru": "Добавить новый Intel® AMT компьютер, находящийся в локальной сети.",
2696
"zh-chs": "添加位於本地網絡上的新英特爾®AMT計算機。",
2697
"xloc": [
2698
- "default.handlebars->27->1203",
2698
+ "default.handlebars->27->1205",
2699
"default.handlebars->27->233"
2700
]
2701
},
@@ -2727,7 +2727,7 @@
2727
"nl": "Voeg een nieuwe computer toe aan deze apparaatgroep door de mesh-agent te installeren.",
2728
"zh-chs": "通过安装网状代理,将新计算机添加到该设备组。",
2729
"xloc": [
2730
- "default.handlebars->27->1209",
2730
+ "default.handlebars->27->1211",
2731
"default.handlebars->27->241"
2732
]
2733
},
@@ -2780,7 +2780,7 @@
2780
"zh-chs": "管理員控制模式(ACM)",
2781
"xloc": [
2782
"default-mobile.handlebars->9->346",
2783
- "default.handlebars->27->828"
2783
+ "default.handlebars->27->830"
2784
]
2785
},
2786
{
@@ -2798,7 +2798,7 @@
2798
"zh-chs": "管理員憑證",
2799
"xloc": [
2800
"default-mobile.handlebars->9->352",
2801
- "default.handlebars->27->834"
2801
+ "default.handlebars->27->836"
2802
]
2803
},
2804
{
@@ -2833,7 +2833,7 @@
2833
"ru": "Области администратора",
2834
"zh-chs": "管理領域",
2835
"xloc": [
2836
- "default.handlebars->27->1616"
2836
+ "default.handlebars->27->1618"
2837
]
2838
},
2839
{
@@ -2868,7 +2868,7 @@
2868
"ru": "Административные области",
2869
"zh-chs": "行政領域",
2870
"xloc": [
2871
- "default.handlebars->27->1501"
2871
+ "default.handlebars->27->1503"
2872
]
2873
},
2874
{
@@ -2885,7 +2885,7 @@
2885
"ru": "Администратор",
2886
"zh-chs": "管理員",
2887
"xloc": [
2888
- "default.handlebars->27->1440"
2888
+ "default.handlebars->27->1442"
2889
]
2890
},
2891
{
@@ -2902,7 +2902,7 @@
2902
"ru": "Африканский",
2903
"zh-chs": "南非語",
2904
"xloc": [
2905
- "default.handlebars->27->899"
2905
+ "default.handlebars->27->901"
2906
]
2907
},
2908
{
@@ -2922,8 +2922,8 @@
2922
"default-mobile.handlebars->9->192",
2923
"default-mobile.handlebars->9->216",
2924
"default-mobile.handlebars->9->232",
2925
- "default.handlebars->27->1361",
2926
- "default.handlebars->27->1369",
2925
+ "default.handlebars->27->1363",
2926
+ "default.handlebars->27->1371",
2927
"default.handlebars->27->179",
2928
"default.handlebars->27->385",
2929
"default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->1"
@@ -2943,8 +2943,8 @@
2943
"ru": "Агент + Intel AMT",
2944
"zh-chs": "代理+英特爾AMT",
2945
"xloc": [
2946
- "default.handlebars->27->1363",
2947
- "default.handlebars->27->1371"
2946
+ "default.handlebars->27->1365",
2947
+ "default.handlebars->27->1373"
2948
]
2949
},
2950
{
@@ -2979,7 +2979,7 @@
2979
"zh-chs": "代理控制台",
2980
"xloc": [
2981
"default-mobile.handlebars->9->419",
2982
- "default.handlebars->27->1317"
2982
+ "default.handlebars->27->1319"
2983
]
2984
},
2985
{
@@ -2996,7 +2996,7 @@
2996
"ru": "Счетчик ошибок агента",
2997
"zh-chs": "座席錯誤計數器",
2998
"xloc": [
2999
- "default.handlebars->27->1739"
2999
+ "default.handlebars->27->1741"
3000
]
3001
},
3002
{
@@ -3065,7 +3065,7 @@
3065
"ru": "Сессии агентов",
3066
"zh-chs": "座席會議",
3067
"xloc": [
3068
- "default.handlebars->27->1755"
3068
+ "default.handlebars->27->1757"
3069
]
3070
},
3071
{
@@ -3100,7 +3100,7 @@
3100
"ru": "Типы агента",
3101
"zh-chs": "代理類型",
3102
"xloc": [
3103
- "default.handlebars->27->1367",
3103
+ "default.handlebars->27->1369",
3104
"default.handlebars->container->column_l->p21->3->1->meshOsChartDiv->1"
3105
]
3106
},
@@ -3119,8 +3119,8 @@
3119
"zh-chs": "代理已連接",
3120
"xloc": [
3121
"default.handlebars->27->144",
3122
- "default.handlebars->27->570",
3123
- "default.handlebars->27->571"
3122
+ "default.handlebars->27->572",
3123
+ "default.handlebars->27->573"
3124
]
3125
},
3126
{
@@ -3154,7 +3154,7 @@
3154
"ru": "Агент оффлайн",
3155
"zh-chs": "代理離線",
3156
"xloc": [
3157
- "default.handlebars->27->861"
3157
+ "default.handlebars->27->863"
3158
]
3159
},
3160
{
@@ -3171,7 +3171,7 @@
3171
"ru": "Агент онлайн",
3172
"zh-chs": "代理在線",
3173
"xloc": [
3174
- "default.handlebars->27->860"
3174
+ "default.handlebars->27->862"
3175
]
3176
},
3177
{
@@ -3188,7 +3188,7 @@
3188
"ru": "Агенты",
3189
"zh-chs": "代理商",
3190
"xloc": [
3191
- "default.handlebars->27->1768"
3191
+ "default.handlebars->27->1770"
3192
]
3193
},
3194
{
@@ -3205,7 +3205,7 @@
3205
"ru": "Албанский",
3206
"zh-chs": "阿爾巴尼亞語",
3207
"xloc": [
3208
- "default.handlebars->27->900"
3208
+ "default.handlebars->27->902"
3209
]
3210
},
3211
{
@@ -3255,9 +3255,9 @@
3255
"ru": "Фокусирование всех",
3256
"zh-chs": "全部聚焦",
3257
"xloc": [
3258
- "default.handlebars->27->716",
3258
"default.handlebars->27->718",
3260
- "default.handlebars->27->719"
3259
+ "default.handlebars->27->720",
3260
+ "default.handlebars->27->721"
3261
]
3262
},
3263
{
@@ -3274,8 +3274,8 @@
3274
"ru": "Разрешить пользователям управлять этой группой и устройствами этой группы.",
3275
"zh-chs": "允許用戶管理此設備組和該組中的設備。",
3276
"xloc": [
3277
- "default.handlebars->27->1266",
3278
- "default.handlebars->27->1580"
3277
+ "default.handlebars->27->1268",
3278
+ "default.handlebars->27->1582"
3279
]
3280
},
3281
{
@@ -3291,7 +3291,7 @@
3291
"ru": "Разрешить пользователям управлять этим устройством.",
3292
"zh-chs": "允许用户管理此设备。",
3293
"xloc": [
3294
- "default.handlebars->27->1267"
3294
+ "default.handlebars->27->1269"
3295
]
3296
},
3297
{
@@ -3344,7 +3344,7 @@
3344
"ru": "Поменять (F10 = ESC+0)",
3345
"zh-chs": "備用(F10 = ESC + 0)",
3346
"xloc": [
3347
- "default.handlebars->27->751"
3347
+ "default.handlebars->27->753"
3348
]
3349
},
3350
{
@@ -3379,8 +3379,8 @@
3379
"ru": "Всегда уведомлять",
3380
"zh-chs": "始終通知",
3381
"xloc": [
3382
- "default.handlebars->27->1180",
3383
- "default.handlebars->27->1625",
3382
+ "default.handlebars->27->1182",
3383
+ "default.handlebars->27->1627",
3384
"default.handlebars->27->524"
3385
]
3386
},
@@ -3398,8 +3398,8 @@
3398
"ru": "Всегда запрашивать",
3399
"zh-chs": "總是提示",
3400
"xloc": [
3401
- "default.handlebars->27->1181",
3402
- "default.handlebars->27->1626",
3401
+ "default.handlebars->27->1183",
3402
+ "default.handlebars->27->1628",
3403
"default.handlebars->27->525"
3404
]
3405
},
@@ -3599,7 +3599,7 @@
3599
"ru": "Арабский (Алжир)",
3600
"zh-chs": "阿拉伯文(阿爾及利亞)",
3601
"xloc": [
3602
- "default.handlebars->27->902"
3602
+ "default.handlebars->27->904"
3603
]
3604
},
3605
{
@@ -3616,7 +3616,7 @@
3616
"ru": "Арабский (Бахрейн)",
3617
"zh-chs": "阿拉伯文(巴林)",
3618
"xloc": [
3619
- "default.handlebars->27->903"
3619
+ "default.handlebars->27->905"
3620
]
3621
},
3622
{
@@ -3633,7 +3633,7 @@
3633
"ru": "Арабский (Египет)",
3634
"zh-chs": "阿拉伯文(埃及)",
3635
"xloc": [
3636
- "default.handlebars->27->904"
3636
+ "default.handlebars->27->906"
3637
]
3638
},
3639
{
@@ -3650,7 +3650,7 @@
3650
"ru": "Арабский (Ирак)",
3651
"zh-chs": "阿拉伯文(伊拉克)",
3652
"xloc": [
3653
- "default.handlebars->27->905"
3653
+ "default.handlebars->27->907"
3654
]
3655
},
3656
{
@@ -3667,7 +3667,7 @@
3667
"ru": "Арабский (Иордания)",
3668
"zh-chs": "阿拉伯語(約旦)",
3669
"xloc": [
3670
- "default.handlebars->27->906"
3670
+ "default.handlebars->27->908"
3671
]
3672
},
3673
{
@@ -3684,7 +3684,7 @@
3684
"ru": "Арабский (Кувейт)",
3685
"zh-chs": "阿拉伯文(科威特)",
3686
"xloc": [
3687
- "default.handlebars->27->907"
3687
+ "default.handlebars->27->909"
3688
]
3689
},
3690
{
@@ -3701,7 +3701,7 @@
3701
"ru": "Арабский (Ливан)",
3702
"zh-chs": "阿拉伯語(黎巴嫩)",
3703
"xloc": [
3704
- "default.handlebars->27->908"
3704
+ "default.handlebars->27->910"
3705
]
3706
},
3707
{
@@ -3718,7 +3718,7 @@
3718
"ru": "Арабский (Ливия)",
3719
"zh-chs": "阿拉伯文(利比亞)",
3720
"xloc": [
3721
- "default.handlebars->27->909"
3721
+ "default.handlebars->27->911"
3722
]
3723
},
3724
{
@@ -3735,7 +3735,7 @@
3735
"ru": "Арабский (Марокко)",
3736
"zh-chs": "阿拉伯文(摩洛哥)",
3737
"xloc": [
3738
- "default.handlebars->27->910"
3738
+ "default.handlebars->27->912"
3739
]
3740
},
3741
{
@@ -3752,7 +3752,7 @@
3752
"ru": "Арабский (Оман)",
3753
"zh-chs": "阿拉伯文(阿曼)",
3754
"xloc": [
3755
- "default.handlebars->27->911"
3755
+ "default.handlebars->27->913"
3756
]
3757
},
3758
{
@@ -3769,7 +3769,7 @@
3769
"ru": "Арабский (Катар)",
3770
"zh-chs": "阿拉伯語(卡塔爾)",
3771
"xloc": [
3772
- "default.handlebars->27->912"
3772
+ "default.handlebars->27->914"
3773
]
3774
},
3775
{
@@ -3786,7 +3786,7 @@
3786
"ru": "Арабский (Саудовская Аравия)",
3787
"zh-chs": "阿拉伯語(沙特阿拉伯)",
3788
"xloc": [
3789
- "default.handlebars->27->913"
3789
+ "default.handlebars->27->915"
3790
]
3791
},
3792
{
@@ -3803,7 +3803,7 @@
3803
"ru": "Арабский (стандартный)",
3804
"zh-chs": "阿拉伯語(標準)",
3805
"xloc": [
3806
- "default.handlebars->27->901"
3806
+ "default.handlebars->27->903"
3807
]
3808
},
3809
{
@@ -3820,7 +3820,7 @@
3820
"ru": "Арабский (Сирия)",
3821
"zh-chs": "阿拉伯語(敘利亞)",
3822
"xloc": [
3823
- "default.handlebars->27->914"
3823
+ "default.handlebars->27->916"
3824
]
3825
},
3826
{
@@ -3837,7 +3837,7 @@
3837
"ru": "Арабский (Тунис)",
3838
"zh-chs": "阿拉伯文(突尼斯)",
3839
"xloc": [
3840
- "default.handlebars->27->915"
3840
+ "default.handlebars->27->917"
3841
]
3842
},
3843
{
@@ -3854,7 +3854,7 @@
3854
"ru": "Арабский (О.А.Э.)",
3855
"zh-chs": "阿拉伯文(阿聯酋)",
3856
"xloc": [
3857
- "default.handlebars->27->916"
3857
+ "default.handlebars->27->918"
3858
]
3859
},
3860
{
@@ -3871,7 +3871,7 @@
3871
"ru": "Арабский (Йемен)",
3872
"zh-chs": "阿拉伯文(也門)",
3873
"xloc": [
3874
- "default.handlebars->27->917"
3874
+ "default.handlebars->27->919"
3875
]
3876
},
3877
{
@@ -3888,7 +3888,7 @@
3888
"ru": "Арагонский",
3889
"zh-chs": "阿拉貢人",
3890
"xloc": [
3891
- "default.handlebars->27->918"
3891
+ "default.handlebars->27->920"
3892
]
3893
},
3894
{
@@ -3906,7 +3906,7 @@
3906
"zh-chs": "建築",
3907
"xloc": [
3908
"default-mobile.handlebars->9->320",
3909
- "default.handlebars->27->802"
3909
+ "default.handlebars->27->804"
3910
]
3911
},
3912
{
@@ -3941,7 +3941,7 @@
3941
"zh-chs": "您確定要刪除組{0}嗎?刪除設備組還將刪除該組中有關設備的所有信息。",
3942
"xloc": [
3943
"default-mobile.handlebars->9->390",
3944
- "default.handlebars->27->1244"
3944
+ "default.handlebars->27->1246"
3945
]
3946
},
3947
{
@@ -3958,7 +3958,7 @@
3958
"ru": "Вы действительно хотите удалить устройство \\\"{0}\\\"?",
3959
"zh-chs": "您確定要刪除節點{0}嗎?",
3960
"xloc": [
3961
- "default.handlebars->27->663"
3961
+ "default.handlebars->27->665"
3962
]
3963
},
3964
{
@@ -3975,7 +3975,7 @@
3975
"ru": "Вы действительно хотите деинсталировать выбранного агента?",
3976
"zh-chs": "您確定要卸載所選代理嗎?",
3977
"xloc": [
3978
- "default.handlebars->27->652"
3978
+ "default.handlebars->27->654"
3979
]
3980
},
3981
{
@@ -3992,7 +3992,7 @@
3992
"ru": "Вы действительно хотите деинсталлировать выбранных {0} агентов?",
3993
"zh-chs": "您確定要卸載所選的{0}代理嗎?",
3994
"xloc": [
3995
- "default.handlebars->27->651"
3995
+ "default.handlebars->27->653"
3996
]
3997
},
3998
{
@@ -4009,7 +4009,7 @@
4009
"ru": "Вы уверенны, что {0} плагин: {1}",
4010
"zh-chs": "您確定要{0}插件嗎:{1}",
4011
"xloc": [
4012
- "default.handlebars->27->1808"
4012
+ "default.handlebars->27->1810"
4013
]
4014
},
4015
{
@@ -4026,7 +4026,7 @@
4026
"ru": "Армянский",
4027
"zh-chs": "亞美尼亞人",
4028
"xloc": [
4029
- "default.handlebars->27->919"
4029
+ "default.handlebars->27->921"
4030
]
4031
},
4032
{
@@ -4071,7 +4071,7 @@
4071
"ru": "Ассамский",
4072
"zh-chs": "阿薩姆語",
4073
"xloc": [
4074
- "default.handlebars->27->920"
4074
+ "default.handlebars->27->922"
4075
]
4076
},
4077
{
@@ -4088,7 +4088,7 @@
4088
"ru": "Астурии",
4089
"zh-chs": "阿斯圖里亞斯人",
4090
"xloc": [
4091
- "default.handlebars->27->921"
4091
+ "default.handlebars->27->923"
4092
]
4093
},
4094
{
@@ -4105,7 +4105,7 @@
4105
"ru": "Приложение аутентификации",
4106
"zh-chs": "身份驗證應用",
4107
"xloc": [
4108
- "default.handlebars->27->1629"
4108
+ "default.handlebars->27->1631"
4109
]
4110
},
4111
{
@@ -4128,8 +4128,8 @@
4128
"default-mobile.handlebars->9->73",
4129
"default.handlebars->27->109",
4130
"default.handlebars->27->114",
4131
- "default.handlebars->27->885",
4132
- "default.handlebars->27->887"
4131
+ "default.handlebars->27->887",
4132
+ "default.handlebars->27->889"
4133
]
4134
},
4135
{
@@ -4197,7 +4197,7 @@
4197
"ru": "Автоудаление",
4198
"zh-chs": "自動刪除",
4199
"xloc": [
4200
- "default.handlebars->27->1168"
4200
+ "default.handlebars->27->1170"
4201
]
4202
},
4203
{
@@ -4251,7 +4251,7 @@
4251
"ru": "Азербайджанский",
4252
"zh-chs": "阿塞拜疆",
4253
"xloc": [
4254
- "default.handlebars->27->922"
4254
+ "default.handlebars->27->924"
4255
]
4256
},
4257
{
@@ -4269,7 +4269,7 @@
4269
"zh-chs": "的BIOS",
4270
"xloc": [
4271
"default-mobile.handlebars->9->358",
4272
- "default.handlebars->27->840"
4272
+ "default.handlebars->27->842"
4273
]
4274
},
4275
{
@@ -4366,8 +4366,8 @@
4366
"ru": "Фоновый и интерактивный",
4367
"zh-chs": "背景與互動",
4368
"xloc": [
4369
- "default.handlebars->27->1344",
4370
- "default.handlebars->27->1351",
4369
+ "default.handlebars->27->1346",
4370
+ "default.handlebars->27->1353",
4371
"default.handlebars->27->310"
4372
]
4373
},
@@ -4385,8 +4385,8 @@
4385
"ru": "Только фоновый",
4386
"zh-chs": "僅背景",
4387
"xloc": [
4388
- "default.handlebars->27->1345",
4389
- "default.handlebars->27->1352",
4388
+ "default.handlebars->27->1347",
4389
+ "default.handlebars->27->1354",
4390
"default.handlebars->27->311",
4391
"default.handlebars->27->333"
4392
]
@@ -4422,7 +4422,7 @@
4422
"ru": "Резервные коды",
4423
"zh-chs": "備用碼",
4424
"xloc": [
4425
- "default.handlebars->27->1631"
4425
+ "default.handlebars->27->1633"
4426
]
4427
},
4428
{
@@ -4439,7 +4439,7 @@
4439
"ru": "Плохой ключ",
4440
"zh-chs": "錯誤的簽名",
4441
"xloc": [
4442
- "default.handlebars->27->1746"
4442
+ "default.handlebars->27->1748"
4443
]
4444
},
4445
{
@@ -4456,7 +4456,7 @@
4456
"ru": "Плохой веб-сертификат",
4457
"zh-chs": "錯誤的網絡證書",
4458
"xloc": [
4459
- "default.handlebars->27->1745"
4459
+ "default.handlebars->27->1747"
4460
]
4461
},
4462
{
@@ -4473,7 +4473,7 @@
4473
"ru": "Баскский",
4474
"zh-chs": "巴斯克",
4475
"xloc": [
4476
- "default.handlebars->27->923"
4476
+ "default.handlebars->27->925"
4477
]
4478
},
4479
{
@@ -4507,7 +4507,7 @@
4507
"ru": "Белорусский",
4508
"zh-chs": "白俄羅斯語",
4509
"xloc": [
4510
- "default.handlebars->27->925"
4510
+ "default.handlebars->27->927"
4511
]
4512
},
4513
{
@@ -4524,7 +4524,7 @@
4524
"ru": "Бенгальский",
4525
"zh-chs": "孟加拉",
4526
"xloc": [
4527
- "default.handlebars->27->926"
4527
+ "default.handlebars->27->928"
4528
]
4529
},
4530
{
@@ -4560,7 +4560,7 @@
4560
"ru": "Боснийский",
4561
"zh-chs": "波斯尼亞人",
4562
"xloc": [
4563
- "default.handlebars->27->927"
4563
+ "default.handlebars->27->929"
4564
]
4565
},
4566
{
@@ -4577,7 +4577,7 @@
4577
"ru": "Бретонский",
4578
"zh-chs": "布列塔尼",
4579
"xloc": [
4580
- "default.handlebars->27->928"
4580
+ "default.handlebars->27->930"
4581
]
4582
},
4583
{
@@ -4594,7 +4594,7 @@
4594
"ru": "Отправить сообщение",
4595
"zh-chs": "廣播",
4596
"xloc": [
4597
- "default.handlebars->27->1548",
4597
+ "default.handlebars->27->1550",
4598
"default.handlebars->container->column_l->p4->3->1->0->3->1"
4599
]
4600
},
@@ -4612,7 +4612,7 @@
4612
"ru": "Отправить сообщение",
4613
"zh-chs": "廣播消息",
4614
"xloc": [
4615
- "default.handlebars->27->1483"
4615
+ "default.handlebars->27->1485"
4616
]
4617
},
4618
{
@@ -4629,7 +4629,7 @@
4629
"ru": "Отправить сообщение всем подключенным пользователям.",
4630
"zh-chs": "向所有連接的用戶廣播消息。",
4631
"xloc": [
4632
- "default.handlebars->27->1482"
4632
+ "default.handlebars->27->1484"
4633
]
4634
},
4635
{
@@ -4646,7 +4646,7 @@
4646
"ru": "Болгарский",
4647
"zh-chs": "保加利亞語",
4648
"xloc": [
4649
- "default.handlebars->27->924"
4649
+ "default.handlebars->27->926"
4650
]
4651
},
4652
{
@@ -4663,7 +4663,7 @@
4663
"ru": "Бирманский",
4664
"zh-chs": "緬甸人",
4665
"xloc": [
4666
- "default.handlebars->27->929"
4666
+ "default.handlebars->27->931"
4667
]
4668
},
4669
{
@@ -4699,8 +4699,8 @@
4699
"zh-chs": "CIRA",
4700
"xloc": [
4701
"default-mobile.handlebars->9->193",
4702
- "default.handlebars->27->1232",
4703
- "default.handlebars->27->1237",
4702
+ "default.handlebars->27->1234",
4703
+ "default.handlebars->27->1239",
4704
"default.handlebars->27->181",
4705
"default.handlebars->27->387"
4706
]
@@ -4719,7 +4719,7 @@
4719
"ru": "CIRA Сервер",
4720
"zh-chs": "CIRA服務器",
4721
"xloc": [
4722
- "default.handlebars->27->1796"
4722
+ "default.handlebars->27->1798"
4723
]
4724
},
4725
{
@@ -4736,7 +4736,7 @@
4736
"ru": "CIRA Сервер команды",
4737
"zh-chs": "CIRA服務器命令",
4738
"xloc": [
4739
- "default.handlebars->27->1797"
4739
+ "default.handlebars->27->1799"
4740
]
4741
},
4742
{
@@ -4753,7 +4753,7 @@
4753
"zh-chs": "CPU",
4754
"xloc": [
4755
"default-mobile.handlebars->9->364",
4756
- "default.handlebars->27->846"
4756
+ "default.handlebars->27->848"
4757
]
4758
},
4759
{
@@ -4770,7 +4770,7 @@
4770
"ru": "Загрузка CPU",
4771
"zh-chs": "CPU負載",
4772
"xloc": [
4773
- "default.handlebars->27->1760"
4773
+ "default.handlebars->27->1762"
4774
]
4775
},
4776
{
@@ -4787,7 +4787,7 @@
4787
"ru": "Загрузка CPU за последние 15 минут",
4788
"zh-chs": "最近15分鐘的CPU負載",
4789
"xloc": [
4790
- "default.handlebars->27->1763"
4790
+ "default.handlebars->27->1765"
4791
]
4792
},
4793
{
@@ -4804,7 +4804,7 @@
4804
"ru": "Загрузка CPU за последние 5 минут",
4805
"zh-chs": "最近5分鐘的CPU負載",
4806
"xloc": [
4807
- "default.handlebars->27->1762"
4807
+ "default.handlebars->27->1764"
4808
]
4809
},
4810
{
@@ -4821,7 +4821,7 @@
4821
"ru": "Загрузка CPU за последнюю минуту",
4822
"zh-chs": "最後一分鐘的CPU負載",
4823
"xloc": [
4824
- "default.handlebars->27->1761"
4824
+ "default.handlebars->27->1763"
4825
]
4826
},
4827
{
@@ -4838,8 +4838,8 @@
4838
"ru": "CR+LF",
4839
"zh-chs": "CR +低頻",
4840
"xloc": [
4841
- "default.handlebars->27->744",
4842
- "default.handlebars->27->753",
4841
+ "default.handlebars->27->746",
4842
+ "default.handlebars->27->755",
4843
"default.handlebars->container->column_l->p12->termTable->1->1->6->1->1->terminalSettingsButtons"
4844
]
4845
},
@@ -4857,8 +4857,8 @@
4857
"ru": "Формат CSV",
4858
"zh-chs": "CSV格式",
4859
"xloc": [
4860
- "default.handlebars->27->1415",
4861
- "default.handlebars->27->1474",
4860
+ "default.handlebars->27->1417",
4861
+ "default.handlebars->27->1476",
4862
"default.handlebars->27->413"
4863
]
4864
},
@@ -4876,7 +4876,7 @@
4876
"ru": "Ошибка вызова",
4877
"zh-chs": "通話錯誤",
4878
"xloc": [
4879
- "default.handlebars->27->1809"
4879
+ "default.handlebars->27->1811"
4880
]
4881
},
4882
{
@@ -4895,7 +4895,7 @@
4895
"xloc": [
4896
"default-mobile.handlebars->9->82",
4897
"default-mobile.handlebars->dialog->idx_dlgButtonBar",
4898
- "default.handlebars->27->1149",
4898
+ "default.handlebars->27->1151",
4899
"default.handlebars->container->dialog->idx_dlgButtonBar",
4900
"login-mobile.handlebars->dialog->idx_dlgButtonBar",
4901
"login.handlebars->dialog->idx_dlgButtonBar",
@@ -4915,8 +4915,8 @@
4915
"xloc": [
4916
"default-mobile.handlebars->9->372",
4917
"default-mobile.handlebars->9->374",
4918
- "default.handlebars->27->854",
4919
- "default.handlebars->27->856"
4918
+ "default.handlebars->27->856",
4919
+ "default.handlebars->27->858"
4920
]
4921
},
4922
{
@@ -4934,7 +4934,7 @@
4934
"zh-chs": "容量/速度",
4935
"xloc": [
4936
"default-mobile.handlebars->9->367",
4937
- "default.handlebars->27->849"
4937
+ "default.handlebars->27->851"
4938
]
4939
},
4940
{
@@ -4951,7 +4951,7 @@
4951
"ru": "Каталонский",
4952
"zh-chs": "加泰羅尼亞語",
4953
"xloc": [
4954
- "default.handlebars->27->930"
4954
+ "default.handlebars->27->932"
4955
]
4956
},
4957
{
@@ -4985,7 +4985,7 @@
4985
"ru": "Чаморро",
4986
"zh-chs": "查莫羅",
4987
"xloc": [
4988
- "default.handlebars->27->931"
4988
+ "default.handlebars->27->933"
4989
]
4990
},
4991
{
@@ -5016,7 +5016,7 @@
5016
"ru": "Смена email для {0}",
5017
"zh-chs": "更改{0}的電子郵件",
5018
"xloc": [
5019
- "default.handlebars->27->1657"
5019
+ "default.handlebars->27->1659"
5020
]
5021
},
5022
{
@@ -5034,8 +5034,8 @@
5034
"zh-chs": "變更組",
5035
"xloc": [
5036
"default.handlebars->27->549",
5037
- "default.handlebars->27->660",
5038
- "default.handlebars->27->661"
5037
+ "default.handlebars->27->662",
5038
+ "default.handlebars->27->663"
5039
]
5040
},
5041
{
@@ -5053,8 +5053,8 @@
5053
"zh-chs": "更改密碼",
5054
"xloc": [
5055
"default-mobile.handlebars->9->90",
5056
- "default.handlebars->27->1125",
5057
- "default.handlebars->27->1646"
5056
+ "default.handlebars->27->1127",
5057
+ "default.handlebars->27->1648"
5058
]
5059
},
5060
{
@@ -5071,7 +5071,7 @@
5071
"ru": "Смена пароля для {0}",
5072
"zh-chs": "更改{0}的密碼",
5073
"xloc": [
5074
- "default.handlebars->27->1664"
5074
+ "default.handlebars->27->1666"
5075
]
5076
},
5077
{
@@ -5141,7 +5141,7 @@
5141
"ru": "Изменить пароль для этого пользователя",
5142
"zh-chs": "更改該用戶的密碼",
5143
"xloc": [
5144
- "default.handlebars->27->1645"
5144
+ "default.handlebars->27->1647"
5145
]
5146
},
5147
{
@@ -5175,7 +5175,7 @@
5175
"ru": "Измените адрес электронной почты вашей учетной записи здесь.",
5176
"zh-chs": "在此處更改您的帳戶電子郵件地址。",
5177
"xloc": [
5178
- "default.handlebars->27->1112"
5178
+ "default.handlebars->27->1114"
5179
]
5180
},
5181
{
@@ -5192,7 +5192,7 @@
5192
"ru": "Измените пароль своей учетной записи, введя старый пароль и дважды новый пароль в поля ниже.",
5193
"zh-chs": "在下面的框中兩次輸入舊密碼和新密碼,以更改帳戶密碼。",
5194
"xloc": [
5195
- "default.handlebars->27->1118"
5195
+ "default.handlebars->27->1120"
5196
]
5197
},
5198
{
@@ -5209,7 +5209,7 @@
5209
"ru": "Изменение языка потребует перезагрузить страницу.",
5210
"zh-chs": "更改語言將需要刷新頁面。",
5211
"xloc": [
5212
- "default.handlebars->27->1097"
5212
+ "default.handlebars->27->1099"
5213
]
5214
},
5215
{
@@ -5226,10 +5226,10 @@
5226
"ru": "Чат",
5227
"zh-chs": "聊天室",
5228
"xloc": [
5229
- "default.handlebars->27->1432",
5230
- "default.handlebars->27->600",
5231
- "default.handlebars->27->619"
5232
- ]
5229
+ "default.handlebars->27->1434",
5230
+ "default.handlebars->27->602",
5231
+ "default.handlebars->27->621"
5232
+ ]
5233
},
5234
{
5235
"cs": "Chat a upozornění",
@@ -5247,8 +5247,8 @@
5247
"xloc": [
5248
"default-mobile.handlebars->9->411",
5249
"default-mobile.handlebars->9->429",
5250
- "default.handlebars->27->1294",
5251
- "default.handlebars->27->1328"
5250
+ "default.handlebars->27->1296",
5251
+ "default.handlebars->27->1330"
5252
]
5253
},
5254
{
@@ -5265,7 +5265,7 @@
5265
"ru": "Чеченский",
5266
"zh-chs": "車臣",
5267
"xloc": [
5268
- "default.handlebars->27->932"
5268
+ "default.handlebars->27->934"
5269
]
5270
},
5271
{
@@ -5346,8 +5346,8 @@
5346
"ru": "Проверка...",
5347
"zh-chs": "檢查...",
5348
"xloc": [
5349
- "default.handlebars->27->1803",
5350
- "default.handlebars->27->898"
5349
+ "default.handlebars->27->1805",
5350
+ "default.handlebars->27->900"
5351
]
5352
},
5353
{
@@ -5364,7 +5364,7 @@
5364
"ru": "Китайский",
5365
"zh-chs": "中文",
5366
"xloc": [
5367
- "default.handlebars->27->933"
5367
+ "default.handlebars->27->935"
5368
]
5369
},
5370
{
@@ -5381,7 +5381,7 @@
5381
"ru": "Китайский (Гонконг)",
5382
"zh-chs": "中文(香港)",
5383
"xloc": [
5384
- "default.handlebars->27->934"
5384
+ "default.handlebars->27->936"
5385
]
5386
},
5387
{
@@ -5398,7 +5398,7 @@
5398
"ru": "Китайский (КНР)",
5399
"zh-chs": "中文(中國)",
5400
"xloc": [
5401
- "default.handlebars->27->935"
5401
+ "default.handlebars->27->937"
5402
]
5403
},
5404
{
@@ -5415,7 +5415,7 @@
5415
"ru": "Упрощенный китайский)",
5416
"zh-chs": "简体中文)",
5417
"xloc": [
5418
- "default.handlebars->27->1095"
5418
+ "default.handlebars->27->1097"
5419
]
5420
},
5421
{
@@ -5432,7 +5432,7 @@
5432
"ru": "Китайский (Сингапур)",
5433
"zh-chs": "中文(新加坡)",
5434
"xloc": [
5435
- "default.handlebars->27->936"
5435
+ "default.handlebars->27->938"
5436
]
5437
},
5438
{
@@ -5449,7 +5449,7 @@
5449
"ru": "Китайский (Тайвань)",
5450
"zh-chs": "中文(台灣)",
5451
"xloc": [
5452
- "default.handlebars->27->937"
5452
+ "default.handlebars->27->939"
5453
]
5454
},
5455
{
@@ -5484,7 +5484,7 @@
5484
"ru": "Чувашский",
5485
"zh-chs": "楚瓦什",
5486
"xloc": [
5487
- "default.handlebars->27->938"
5487
+ "default.handlebars->27->940"
5488
]
5489
},
5490
{
@@ -5524,11 +5524,11 @@
5524
"default-mobile.handlebars->9->311",
5525
"default-mobile.handlebars->9->313",
5526
"default-mobile.handlebars->9->59",
5527
- "default.handlebars->27->1409",
5528
- "default.handlebars->27->779",
5527
+ "default.handlebars->27->1411",
5528
"default.handlebars->27->781",
5529
"default.handlebars->27->783",
5530
"default.handlebars->27->785",
5531
+ "default.handlebars->27->787",
5532
"default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->7",
5533
"default.handlebars->container->column_l->p41->3->1",
5534
"messenger.handlebars->xbottom"
@@ -5562,7 +5562,7 @@
5562
"nl": "Wis alle meldingen",
5563
"zh-chs": "全部清除",
5564
"xloc": [
5565
- "default.handlebars->27->1733"
5565
+ "default.handlebars->27->1735"
5566
]
5567
},
5568
{
@@ -5579,7 +5579,7 @@
5579
"ru": "Очистить ядро",
5580
"zh-chs": "清除核心",
5581
"xloc": [
5582
- "default.handlebars->27->870"
5582
+ "default.handlebars->27->872"
5583
]
5584
},
5585
{
@@ -5612,7 +5612,7 @@
5612
"ru": "Очистить это уведомление",
5613
"zh-chs": "清除此通知",
5614
"xloc": [
5615
- "default.handlebars->27->1732"
5615
+ "default.handlebars->27->1734"
5616
]
5617
},
5618
{
@@ -5657,8 +5657,8 @@
5657
"nl": "Klik hier om de apparaatgroepsnaam te bewerken",
5658
"zh-chs": "单击此处编辑设备组名称",
5659
"xloc": [
5660
- "default.handlebars->27->1160",
5661
- "default.handlebars->27->1365"
5660
+ "default.handlebars->27->1162",
5661
+ "default.handlebars->27->1367"
5662
]
5663
},
5664
{
@@ -5688,7 +5688,7 @@
5688
"nl": "Klik hier om de gebruikersgroepsnaam te bewerken",
5689
"zh-chs": "单击此处编辑用户组名称",
5690
"xloc": [
5691
- "default.handlebars->27->1537"
5691
+ "default.handlebars->27->1539"
5692
]
5693
},
5694
{
@@ -5738,7 +5738,7 @@
5738
"zh-chs": "單擊確定將驗證郵件發送到:",
5739
"xloc": [
5740
"default-mobile.handlebars->9->75",
5741
- "default.handlebars->27->1109"
5741
+ "default.handlebars->27->1111"
5742
]
5743
},
5744
{
@@ -5773,7 +5773,7 @@
5773
"zh-chs": "客戶端控制模式(CCM)",
5774
"xloc": [
5775
"default-mobile.handlebars->9->345",
5776
- "default.handlebars->27->827"
5776
+ "default.handlebars->27->829"
5777
]
5778
},
5779
{
@@ -5790,8 +5790,8 @@
5790
"ru": "Клиент инициировал удаленный доступ",
5791
"zh-chs": "客戶端啟動的遠程訪問",
5792
"xloc": [
5793
- "default.handlebars->27->1231",
5794
- "default.handlebars->27->1236"
5793
+ "default.handlebars->27->1233",
5794
+ "default.handlebars->27->1238"
5795
]
5796
},
5797
{
@@ -5828,7 +5828,7 @@
5828
"default-mobile.handlebars->9->57",
5829
"default.handlebars->27->121",
5830
"default.handlebars->27->129",
5831
- "default.handlebars->27->737"
5831
+ "default.handlebars->27->739"
5832
]
5833
},
5834
{
@@ -5863,8 +5863,8 @@
5863
"ru": "Общие группы устройств",
5864
"zh-chs": "通用設備組",
5865
"xloc": [
5866
- "default.handlebars->27->1556",
5867
- "default.handlebars->27->1669"
5866
+ "default.handlebars->27->1558",
5867
+ "default.handlebars->27->1671"
5868
]
5869
},
5870
{
@@ -5881,8 +5881,8 @@
5881
"ru": "Общие устройства",
5882
"zh-chs": "通用設備",
5883
"xloc": [
5884
- "default.handlebars->27->1562",
5885
- "default.handlebars->27->1681"
5884
+ "default.handlebars->27->1564",
5885
+ "default.handlebars->27->1683"
5886
]
5887
},
5888
{
@@ -5900,7 +5900,7 @@
5900
"zh-chs": "將{1}入口{2}中的{0}限製到此位置?",
5901
"xloc": [
5902
"default-mobile.handlebars->9->127",
5903
- "default.handlebars->27->1404"
5903
+ "default.handlebars->27->1406"
5904
]
5905
},
5906
{
@@ -5919,14 +5919,14 @@
5919
"xloc": [
5920
"default-mobile.handlebars->9->269",
5921
"default-mobile.handlebars->9->391",
5922
- "default.handlebars->27->1245",
5923
- "default.handlebars->27->1458",
5924
- "default.handlebars->27->1527",
5925
- "default.handlebars->27->1576",
5926
- "default.handlebars->27->1667",
5922
+ "default.handlebars->27->1247",
5923
+ "default.handlebars->27->1460",
5924
+ "default.handlebars->27->1529",
5925
+ "default.handlebars->27->1578",
5926
+ "default.handlebars->27->1669",
5927
"default.handlebars->27->410",
5928
- "default.handlebars->27->655",
5929
- "default.handlebars->27->664"
5928
+ "default.handlebars->27->657",
5929
+ "default.handlebars->27->666"
5930
]
5931
},
5932
{
@@ -5944,7 +5944,7 @@
5944
"zh-chs": "確認將1個副本複製到此位置?",
5945
"xloc": [
5946
"default-mobile.handlebars->9->302",
5947
- "default.handlebars->27->774"
5947
+ "default.handlebars->27->776"
5948
]
5949
},
5950
{
@@ -5962,7 +5962,7 @@
5962
"zh-chs": "確認{0}個條目的副本到此位置?",
5963
"xloc": [
5964
"default-mobile.handlebars->9->301",
5965
- "default.handlebars->27->773"
5965
+ "default.handlebars->27->775"
5966
]
5967
},
5968
{
@@ -5976,7 +5976,7 @@
5976
"nl": "Bevestig verwijdering geselecteerde account(s)?",
5977
"zh-chs": "确认删除选定的帐户?",
5978
"xloc": [
5979
- "default.handlebars->27->1457"
5979
+ "default.handlebars->27->1459"
5980
]
5981
},
5982
{
@@ -6007,7 +6007,7 @@
6007
"nl": "Bevestig verwijdering geselecteerde gebruikersgroep(en)?",
6008
"zh-chs": "确认删除选定的用户组?",
6009
"xloc": [
6010
- "default.handlebars->27->1526"
6010
+ "default.handlebars->27->1528"
6011
]
6012
},
6013
{
@@ -6024,7 +6024,7 @@
6024
"ru": "Подтвердить удаление пользователя {0}?",
6025
"zh-chs": "確認刪除用戶{0}?",
6026
"xloc": [
6027
- "default.handlebars->27->1666"
6027
+ "default.handlebars->27->1668"
6028
]
6029
},
6030
{
@@ -6038,7 +6038,7 @@
6038
"nl": "Bevestig lidmaatschap verwijderen van gebruiker \\\"{0}\\\"?",
6039
"zh-chs": "确认删除用户\\“ {0} \\”的成员身份?",
6040
"xloc": [
6041
- "default.handlebars->27->1579"
6041
+ "default.handlebars->27->1581"
6042
]
6043
},
6044
{
@@ -6052,7 +6052,7 @@
6052
"nl": "Bevestig lidmaatschap verwijdering van gebruikergroep \\\"{0}\\\"?",
6053
"zh-chs": "确认删除用户组 “{0}” 的成员身份?",
6054
"xloc": [
6055
- "default.handlebars->27->1696"
6055
+ "default.handlebars->27->1698"
6056
]
6057
},
6058
{
@@ -6070,7 +6070,7 @@
6070
"zh-chs": "確認將1個入口移動到此位置?",
6071
"xloc": [
6072
"default-mobile.handlebars->9->304",
6073
- "default.handlebars->27->776"
6073
+ "default.handlebars->27->778"
6074
]
6075
},
6076
{
@@ -6088,7 +6088,7 @@
6088
"zh-chs": "確認將{0}個條目移到此位置?",
6089
"xloc": [
6090
"default-mobile.handlebars->9->303",
6091
- "default.handlebars->27->775"
6091
+ "default.handlebars->27->777"
6092
]
6093
},
6094
{
@@ -6105,7 +6105,7 @@
6105
"ru": "Подтвердить перезапись?",
6106
"zh-chs": "確認覆蓋?",
6107
"xloc": [
6108
- "default.handlebars->27->1403"
6108
+ "default.handlebars->27->1405"
6109
]
6110
},
6111
{
@@ -6119,8 +6119,8 @@
6119
"nl": "Bevestig verwijdering van toegangsrechten voor apparaat \\\"{0}\\\"?",
6120
"zh-chs": "确认删除设备“ {0} ”的访问权限?",
6121
"xloc": [
6122
- "default.handlebars->27->1569",
6123
- "default.handlebars->27->1687"
6122
+ "default.handlebars->27->1571",
6123
+ "default.handlebars->27->1689"
6124
]
6125
},
6126
{
@@ -6134,8 +6134,8 @@
6134
"nl": "Bevestig verwijdering van toegangsrechten voor apparaatgroep \\\"{0}\\\"?",
6135
"zh-chs": "是否确认删除设备组“ {0}”的访问权限?",
6136
"xloc": [
6137
- "default.handlebars->27->1571",
6138
- "default.handlebars->27->1700"
6137
+ "default.handlebars->27->1573",
6138
+ "default.handlebars->27->1702"
6139
]
6140
},
6141
{
@@ -6149,7 +6149,7 @@
6149
"nl": "Bevestig verwijdering van toegangsrechten voor gebruiker \\\"{0}\\\"?",
6150
"zh-chs": "确认删除用户\\“ {0} \\”的访问权限?",
6151
"xloc": [
6152
- "default.handlebars->27->1689"
6152
+ "default.handlebars->27->1691"
6153
]
6154
},
6155
{
@@ -6163,7 +6163,7 @@
6163
"nl": "Bevestig verwijdering van toegangsrechten voor gebruikergroep \\\"{0}\\\"?",
6164
"zh-chs": "确认删除用户组“ {0}”的访问权限?",
6165
"xloc": [
6166
- "default.handlebars->27->1692"
6166
+ "default.handlebars->27->1694"
6167
]
6168
},
6169
{
@@ -6177,8 +6177,8 @@
6177
"nl": "Verwijdering van toegangsrechten bevestigen?",
6178
"zh-chs": "确认删除访问权限?",
6179
"xloc": [
6180
- "default.handlebars->27->1690",
6181
- "default.handlebars->27->1693"
6180
+ "default.handlebars->27->1692",
6181
+ "default.handlebars->27->1695"
6182
]
6183
},
6184
{
@@ -6196,7 +6196,7 @@
6196
"zh-chs": "確認刪除身份驗證器應用程序兩步登錄?",
6197
"xloc": [
6198
"default-mobile.handlebars->9->74",
6199
- "default.handlebars->27->888"
6199
+ "default.handlebars->27->890"
6200
]
6201
},
6202
{
@@ -6251,7 +6251,7 @@
6251
"nl": "Bevestig de verwijdering van rechten voor gebruiker \\\"{0}\\\"?",
6252
"zh-chs": "确认删除用户“ {0} ”的权限?",
6253
"xloc": [
6254
- "default.handlebars->27->1337"
6254
+ "default.handlebars->27->1339"
6255
]
6256
},
6257
{
@@ -6265,7 +6265,7 @@
6265
"nl": "Bevestig de verwijdering van rechten voor de gebruikergroep \\\"{0}\\\"?",
6266
"zh-chs": "确认删除用户组“ {0} ”的权限?",
6267
"xloc": [
6268
- "default.handlebars->27->1339"
6268
+ "default.handlebars->27->1341"
6269
]
6270
},
6271
{
@@ -6313,8 +6313,8 @@
6313
"default-mobile.handlebars->9->284",
6314
"default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3",
6315
"default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->0->1->3",
6316
- "default.handlebars->27->1184",
6317
- "default.handlebars->27->756",
6316
+ "default.handlebars->27->1186",
6317
+ "default.handlebars->27->758",
6318
"default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->connectbutton1span",
6319
"default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->connectbutton2span",
6320
"default.handlebars->container->column_l->p13->p13toolbar->1->0->1->3",
@@ -6353,8 +6353,8 @@
6353
"ru": "Подключиться к серверу",
6354
"zh-chs": "連接到服務器",
6355
"xloc": [
6356
- "default.handlebars->27->1235",
6357
- "default.handlebars->27->1239"
6356
+ "default.handlebars->27->1237",
6357
+ "default.handlebars->27->1241"
6358
]
6359
},
6360
{
@@ -6425,7 +6425,7 @@
6425
"ru": "Подключено Intel® AMT",
6426
"zh-chs": "連接的英特爾®AMT",
6427
"xloc": [
6428
- "default.handlebars->27->1751"
6428
+ "default.handlebars->27->1753"
6429
]
6430
},
6431
{
@@ -6442,7 +6442,7 @@
6442
"ru": "Подключенные пользователи",
6443
"zh-chs": "關聯用戶",
6444
"xloc": [
6445
- "default.handlebars->27->1756"
6445
+ "default.handlebars->27->1758"
6446
]
6447
},
6448
{
@@ -6460,7 +6460,7 @@
6460
"zh-chs": "現在已連接",
6461
"xloc": [
6462
"default-mobile.handlebars->9->324",
6463
- "default.handlebars->27->806"
6463
+ "default.handlebars->27->808"
6464
]
6465
},
6466
{
@@ -6500,7 +6500,7 @@
6500
"default.handlebars->27->206",
6501
"default.handlebars->27->209",
6502
"default.handlebars->27->228",
6503
- "default.handlebars->27->797",
6503
+ "default.handlebars->27->799",
6504
"default.handlebars->27->9",
6505
"xterm.handlebars->9->2"
6506
]
@@ -6519,7 +6519,7 @@
6519
"ru": "Подключений ",
6520
"zh-chs": "連接數",
6521
"xloc": [
6522
- "default.handlebars->27->1767"
6522
+ "default.handlebars->27->1769"
6523
]
6524
},
6525
{
@@ -6536,7 +6536,7 @@
6536
"ru": "Ретранслятор подключения",
6537
"zh-chs": "連接繼電器",
6538
"xloc": [
6539
- "default.handlebars->27->1795"
6539
+ "default.handlebars->27->1797"
6540
]
6541
},
6542
{
@@ -6588,7 +6588,7 @@
6588
"zh-chs": "連接性",
6589
"xloc": [
6590
"default-mobile.handlebars->9->237",
6591
- "default.handlebars->27->1372",
6591
+ "default.handlebars->27->1374",
6592
"default.handlebars->27->197",
6593
"default.handlebars->27->538",
6594
"default.handlebars->container->column_l->p21->3->1->meshConnChartDiv->1"
@@ -6608,8 +6608,8 @@
6608
"ru": "Консоль",
6609
"zh-chs": "安慰",
6610
"xloc": [
6611
- "default.handlebars->27->595",
6612
- "default.handlebars->27->614",
6611
+ "default.handlebars->27->597",
6612
+ "default.handlebars->27->616",
6613
"default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevConsole",
6614
"default.handlebars->container->topbar->1->1->ServerSubMenuSpan->ServerSubMenu->1->0->ServerConsole",
6615
"default.handlebars->contextMenu->cxconsole"
@@ -6645,8 +6645,8 @@
6645
"ru": "контроль",
6646
"zh-chs": "控制",
6647
"xloc": [
6648
- "default.handlebars->27->594",
6649
- "default.handlebars->27->613"
6648
+ "default.handlebars->27->596",
6649
+ "default.handlebars->27->615"
6650
]
6651
},
6652
{
@@ -6663,7 +6663,7 @@
6663
"ru": "Cookie-кодировщик",
6664
"zh-chs": "Cookie編碼器",
6665
"xloc": [
6666
- "default.handlebars->27->1781"
6666
+ "default.handlebars->27->1783"
6667
]
6668
},
6669
{
@@ -6789,8 +6789,8 @@
6789
"ru": "Скопировать ссылку в буфер обмена",
6790
"zh-chs": "複製鏈接到剪貼板",
6791
"xloc": [
6792
- "default.handlebars->27->1377",
6793
- "default.handlebars->27->1391",
6792
+ "default.handlebars->27->1379",
6793
+ "default.handlebars->27->1393",
6794
"default.handlebars->27->323"
6795
]
6796
},
@@ -6968,7 +6968,7 @@
6968
"ru": "Основной сервер",
6969
"zh-chs": "核心服務器",
6970
"xloc": [
6971
- "default.handlebars->27->1780"
6971
+ "default.handlebars->27->1782"
6972
]
6973
},
6974
{
@@ -6985,7 +6985,7 @@
6985
"ru": "Kорсиканский",
6986
"zh-chs": "科西嘉人",
6987
"xloc": [
6988
- "default.handlebars->27->939"
6988
+ "default.handlebars->27->941"
6989
]
6990
},
6991
{
@@ -7002,7 +7002,7 @@
7002
"ru": "Создать учетную запись",
7003
"zh-chs": "創建帳號",
7004
"xloc": [
7005
- "default.handlebars->27->1497",
7005
+ "default.handlebars->27->1499",
7006
"login-mobile.handlebars->container->page_content->column_l->1->1->0->1->createpanel->1->1->9->1->12->1->1",
7007
"login.handlebars->container->column_l->centralTable->1->0->logincell->createpanel->1->9->1->12->1->1"
7008
]
@@ -7038,7 +7038,7 @@
7038
"ru": "Создать группу пользователей",
7039
"zh-chs": "創建用戶組",
7040
"xloc": [
7041
- "default.handlebars->27->1534"
7041
+ "default.handlebars->27->1536"
7042
]
7043
},
7044
{
@@ -7055,7 +7055,7 @@
7055
"ru": "Создайте новую группу устройств, используя параметры ниже.",
7056
"zh-chs": "使用以下選項創建一個新的設備組。",
7057
"xloc": [
7058
- "default.handlebars->27->1132"
7058
+ "default.handlebars->27->1134"
7059
]
7060
},
7061
{
@@ -7089,7 +7089,7 @@
7089
"ru": "Создайте сразу несколько учетных записей, импортировав файл JSON в следующем формате:",
7090
"zh-chs": "通過導入以下格式的JSON文件一次創建多個帳戶:",
7091
"xloc": [
7092
- "default.handlebars->27->1465"
7092
+ "default.handlebars->27->1467"
7093
]
7094
},
7095
{
@@ -7124,7 +7124,7 @@
7124
"ru": "Создано",
7125
"zh-chs": "創建",
7126
"xloc": [
7127
- "default.handlebars->27->1605"
7127
+ "default.handlebars->27->1607"
7128
]
7129
},
7130
{
@@ -7159,7 +7159,7 @@
7159
"ru": "Кри (Канадский язык)",
7160
"zh-chs": "克里",
7161
"xloc": [
7162
- "default.handlebars->27->940"
7162
+ "default.handlebars->27->942"
7163
]
7164
},
7165
{
@@ -7176,7 +7176,7 @@
7176
"ru": "Хорватский",
7177
"zh-chs": "克羅地亞語",
7178
"xloc": [
7179
- "default.handlebars->27->941"
7179
+ "default.handlebars->27->943"
7180
]
7181
},
7182
{
@@ -7317,7 +7317,7 @@
7317
"ru": "Чешский",
7318
"zh-chs": "捷克文",
7319
"xloc": [
7320
- "default.handlebars->27->942"
7320
+ "default.handlebars->27->944"
7321
]
7322
},
7323
{
@@ -7351,7 +7351,7 @@
7351
"ru": "Датский",
7352
"zh-chs": "丹麥文",
7353
"xloc": [
7354
- "default.handlebars->27->943"
7354
+ "default.handlebars->27->945"
7355
]
7356
},
7357
{
@@ -7368,7 +7368,7 @@
7368
"ru": "DataChannel",
7369
"zh-chs": "數據通道",
7370
"xloc": [
7371
- "default.handlebars->27->707"
7371
+ "default.handlebars->27->709"
7372
]
7373
},
7374
{
@@ -7385,7 +7385,7 @@
7385
"ru": "Дата & Время",
7386
"zh-chs": "日期和時間",
7387
"xloc": [
7388
- "default.handlebars->27->1100"
7388
+ "default.handlebars->27->1102"
7389
]
7390
},
7391
{
@@ -7403,7 +7403,7 @@
7403
"zh-chs": "天",
7404
"xloc": [
7405
"default-mobile.handlebars->9->259",
7406
- "default.handlebars->27->639"
7406
+ "default.handlebars->27->641"
7407
]
7408
},
7409
{
@@ -7420,7 +7420,7 @@
7420
"ru": "Деактивировать режим управления клиентом (CCM)",
7421
"zh-chs": "停用客戶端控制模式(CCM)",
7422
"xloc": [
7423
- "default.handlebars->27->1223"
7423
+ "default.handlebars->27->1225"
7424
]
7425
},
7426
{
@@ -7445,10 +7445,10 @@
7445
"en": "Default",
7446
"nl": "Standaard",
7447
"xloc": [
7448
- "default.handlebars->27->1484",
7449
- "default.handlebars->27->1530",
7450
- "default.handlebars->27->1541",
7451
- "default.handlebars->27->1596"
7448
+ "default.handlebars->27->1486",
7449
+ "default.handlebars->27->1532",
7450
+ "default.handlebars->27->1543",
7451
+ "default.handlebars->27->1598"
7452
]
7453
},
7454
{
@@ -7469,9 +7469,9 @@
7469
"default-mobile.handlebars->9->294",
7470
"default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->2->1->1",
7471
"default-mobile.handlebars->container->page_content->column_l->p5->p5myfiles->p5toolbar->1->0->1->1",
7472
- "default.handlebars->27->1398",
7472
+ "default.handlebars->27->1400",
7473
"default.handlebars->27->442",
7474
- "default.handlebars->27->766",
7474
+ "default.handlebars->27->768",
7475
"default.handlebars->container->column_l->p13->p13toolbar->1->2->1->3",
7476
"default.handlebars->container->column_l->p5->p5toolbar->1->0->p5filehead->3",
7477
"default.handlebars->container->dialog->idx_dlgButtonBar->5",
@@ -7495,7 +7495,7 @@
7495
"zh-chs": "刪除帳戶",
7496
"xloc": [
7497
"default-mobile.handlebars->9->84",
7498
- "default.handlebars->27->1117"
7498
+ "default.handlebars->27->1119"
7499
]
7500
},
7501
{
@@ -7509,7 +7509,7 @@
7509
"nl": "Verwijder accounts",
7510
"zh-chs": "删除帐号",
7511
"xloc": [
7512
- "default.handlebars->27->1459"
7512
+ "default.handlebars->27->1461"
7513
]
7514
},
7515
{
@@ -7546,8 +7546,8 @@
7546
"xloc": [
7547
"default-mobile.handlebars->9->389",
7548
"default-mobile.handlebars->9->392",
7549
- "default.handlebars->27->1216",
7550
- "default.handlebars->27->1246"
7549
+ "default.handlebars->27->1218",
7550
+ "default.handlebars->27->1248"
7551
]
7552
},
7553
{
@@ -7565,7 +7565,7 @@
7565
"zh-chs": "刪除節點",
7566
"xloc": [
7567
"default-mobile.handlebars->9->267",
7568
- "default.handlebars->27->665"
7568
+ "default.handlebars->27->667"
7569
]
7570
},
7571
{
@@ -7599,7 +7599,7 @@
7599
"ru": "Удалить пользователя",
7600
"zh-chs": "刪除用戶",
7601
"xloc": [
7602
- "default.handlebars->27->1644"
7602
+ "default.handlebars->27->1646"
7603
]
7604
},
7605
{
@@ -7616,8 +7616,8 @@
7616
"ru": "Удалить группу пользователей",
7617
"zh-chs": "刪除用戶組",
7618
"xloc": [
7619
- "default.handlebars->27->1567",
7620
- "default.handlebars->27->1577"
7619
+ "default.handlebars->27->1569",
7620
+ "default.handlebars->27->1579"
7621
]
7622
},
7623
{
@@ -7631,7 +7631,7 @@
7631
"nl": "Gebruikersgroepen verwijderen",
7632
"zh-chs": "删除用户组",
7633
"xloc": [
7634
- "default.handlebars->27->1528"
7634
+ "default.handlebars->27->1530"
7635
]
7636
},
7637
{
@@ -7648,7 +7648,7 @@
7648
"ru": "Удалить пользователя {0}",
7649
"zh-chs": "刪除用戶{0}",
7650
"xloc": [
7651
- "default.handlebars->27->1665"
7651
+ "default.handlebars->27->1667"
7652
]
7653
},
7654
{
@@ -7666,7 +7666,7 @@
7666
"zh-chs": "刪除帳戶",
7667
"xloc": [
7668
"default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->p3AccountActions->p2AccountActions->3->9->0",
7669
- "default.handlebars->27->1455",
7669
+ "default.handlebars->27->1457",
7670
"default.handlebars->container->column_l->p2->p2info->p2AccountActions->3->p2AccountPassActions->7"
7671
]
7672
},
@@ -7698,7 +7698,7 @@
7698
"nl": "Verwijder groep",
7699
"zh-chs": "删除群组",
7700
"xloc": [
7701
- "default.handlebars->27->1524"
7701
+ "default.handlebars->27->1526"
7702
]
7703
},
7704
{
@@ -7734,8 +7734,8 @@
7734
"xloc": [
7735
"default-mobile.handlebars->9->124",
7736
"default-mobile.handlebars->9->296",
7737
- "default.handlebars->27->1400",
7738
- "default.handlebars->27->768"
7737
+ "default.handlebars->27->1402",
7738
+ "default.handlebars->27->770"
7739
]
7740
},
7741
{
@@ -7752,7 +7752,7 @@
7752
"ru": "Удалить группу пользователей {0}?",
7753
"zh-chs": "刪除用戶組{0}?",
7754
"xloc": [
7755
- "default.handlebars->27->1575"
7755
+ "default.handlebars->27->1577"
7756
]
7757
},
7758
{
@@ -7771,8 +7771,8 @@
7771
"xloc": [
7772
"default-mobile.handlebars->9->123",
7773
"default-mobile.handlebars->9->295",
7774
- "default.handlebars->27->1399",
7775
- "default.handlebars->27->767"
7774
+ "default.handlebars->27->1401",
7775
+ "default.handlebars->27->769"
7776
]
7777
},
7778
{
@@ -7802,7 +7802,7 @@
7802
"ko": "거부",
7803
"zh-chs": "被拒绝",
7804
"xloc": [
7805
- "default.handlebars->27->703"
7805
+ "default.handlebars->27->705"
7806
]
7807
},
7808
{
@@ -7886,18 +7886,18 @@
7886
"default-mobile.handlebars->9->330",
7887
"default-mobile.handlebars->9->381",
7888
"default-mobile.handlebars->9->394",
7889
- "default.handlebars->27->1137",
7890
- "default.handlebars->27->1165",
7891
- "default.handlebars->27->1248",
7892
- "default.handlebars->27->1533",
7893
- "default.handlebars->27->1543",
7894
- "default.handlebars->27->1544",
7895
- "default.handlebars->27->1573",
7889
+ "default.handlebars->27->1139",
7890
+ "default.handlebars->27->1167",
7891
+ "default.handlebars->27->1250",
7892
+ "default.handlebars->27->1535",
7893
+ "default.handlebars->27->1545",
7894
+ "default.handlebars->27->1546",
7895
+ "default.handlebars->27->1575",
7896
"default.handlebars->27->483",
7897
"default.handlebars->27->484",
7898
- "default.handlebars->27->698",
7898
+ "default.handlebars->27->700",
7899
"default.handlebars->27->78",
7900
- "default.handlebars->27->812",
7900
+ "default.handlebars->27->814",
7901
"default.handlebars->container->column_l->p42->p42tbl->1->0->3"
7902
]
7903
},
@@ -7930,8 +7930,8 @@
7930
"zh-chs": "桌面",
7931
"xloc": [
7932
"default-mobile.handlebars->9->249",
7933
- "default.handlebars->27->1253",
7934
- "default.handlebars->27->1710",
7933
+ "default.handlebars->27->1255",
7934
+ "default.handlebars->27->1712",
7935
"default.handlebars->27->448",
7936
"default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevDesktop",
7937
"default.handlebars->contextMenu->cxdesktop"
@@ -7968,8 +7968,8 @@
7968
"ru": "Уведомление на рабочем столе",
7969
"zh-chs": "桌面通知",
7970
"xloc": [
7971
- "default.handlebars->27->1175",
7972
- "default.handlebars->27->1620",
7971
+ "default.handlebars->27->1177",
7972
+ "default.handlebars->27->1622",
7973
"default.handlebars->27->519"
7974
]
7975
},
@@ -7987,8 +7987,8 @@
7987
"ru": "Запрос рабочего стола",
7988
"zh-chs": "桌面提示",
7989
"xloc": [
7990
- "default.handlebars->27->1174",
7991
- "default.handlebars->27->1619",
7990
+ "default.handlebars->27->1176",
7991
+ "default.handlebars->27->1621",
7992
"default.handlebars->27->518"
7993
]
7994
},
@@ -8006,8 +8006,8 @@
8006
"ru": "Запрос рабочего стола + панель инструментов",
8007
"zh-chs": "桌面提示+工具欄",
8008
"xloc": [
8009
- "default.handlebars->27->1172",
8010
- "default.handlebars->27->1617",
8009
+ "default.handlebars->27->1174",
8010
+ "default.handlebars->27->1619",
8011
"default.handlebars->27->516"
8012
]
8013
},
@@ -8039,8 +8039,8 @@
8039
"ru": "Панель инструментов рабочего стола",
8040
"zh-chs": "桌面工具欄",
8041
"xloc": [
8042
- "default.handlebars->27->1173",
8043
- "default.handlebars->27->1618",
8042
+ "default.handlebars->27->1175",
8043
+ "default.handlebars->27->1620",
8044
"default.handlebars->27->517"
8045
]
8046
},
@@ -8112,8 +8112,8 @@
8112
"ru": "Устройство",
8113
"zh-chs": "設備",
8114
"xloc": [
8115
- "default.handlebars->27->1275",
8116
- "default.handlebars->27->1684",
8115
+ "default.handlebars->27->1277",
8116
+ "default.handlebars->27->1686",
8117
"default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->5"
8118
]
8119
},
@@ -8132,7 +8132,7 @@
8132
"zh-chs": "設備動作",
8133
"xloc": [
8134
"default-mobile.handlebars->9->258",
8135
- "default.handlebars->27->638"
8135
+ "default.handlebars->27->640"
8136
]
8137
},
8138
{
@@ -8149,13 +8149,13 @@
8149
"ru": "Группа устройства",
8150
"zh-chs": "設備組",
8151
"xloc": [
8152
- "default.handlebars->27->1270",
8153
- "default.handlebars->27->1273",
8154
- "default.handlebars->27->1274",
8155
- "default.handlebars->27->1559",
8156
- "default.handlebars->27->1565",
8157
- "default.handlebars->27->1672",
8158
- "default.handlebars->27->1719"
8152
+ "default.handlebars->27->1272",
8153
+ "default.handlebars->27->1275",
8154
+ "default.handlebars->27->1276",
8155
+ "default.handlebars->27->1561",
8156
+ "default.handlebars->27->1567",
8157
+ "default.handlebars->27->1674",
8158
+ "default.handlebars->27->1721"
8159
]
8160
},
8161
{
@@ -8173,7 +8173,7 @@
8173
"zh-chs": "設備組用戶",
8174
"xloc": [
8175
"default-mobile.handlebars->9->436",
8176
- "default.handlebars->27->1335"
8176
+ "default.handlebars->27->1337"
8177
]
8178
},
8179
{
@@ -8191,11 +8191,11 @@
8191
"zh-chs": "設備組",
8192
"xloc": [
8193
"default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->3",
8194
- "default.handlebars->27->1424",
8195
- "default.handlebars->27->1518",
8196
- "default.handlebars->27->1546",
8197
- "default.handlebars->27->1614",
8198
- "default.handlebars->27->1754",
8194
+ "default.handlebars->27->1426",
8195
+ "default.handlebars->27->1520",
8196
+ "default.handlebars->27->1548",
8197
+ "default.handlebars->27->1616",
8198
+ "default.handlebars->27->1756",
8199
"default.handlebars->container->column_l->p2->p2info->7"
8200
]
8201
},
@@ -8230,7 +8230,7 @@
8230
"ru": "Местонахождение устройства",
8231
"zh-chs": "設備位置",
8232
"xloc": [
8233
- "default.handlebars->27->666"
8233
+ "default.handlebars->27->668"
8234
]
8235
},
8236
{
@@ -8238,7 +8238,7 @@
8238
"nl": "Apparaatbericht",
8239
"fr": "Message de Service\r\n",
8240
"xloc": [
8241
- "default.handlebars->27->627"
8241
+ "default.handlebars->27->629"
8242
]
8243
},
8244
{
@@ -8256,9 +8256,9 @@
8256
"zh-chs": "設備名稱",
8257
"xloc": [
8258
"default-mobile.handlebars->9->271",
8259
- "default.handlebars->27->1718",
8259
+ "default.handlebars->27->1720",
8260
"default.handlebars->27->246",
8261
- "default.handlebars->27->696",
8261
+ "default.handlebars->27->698",
8262
"player.handlebars->3->9"
8263
]
8264
},
@@ -8276,7 +8276,7 @@
8276
"ru": "Уведомление устройства",
8277
"zh-chs": "設備通知",
8278
"xloc": [
8279
- "default.handlebars->27->629"
8279
+ "default.handlebars->27->631"
8280
]
8281
},
8282
{
@@ -8310,8 +8310,8 @@
8310
"ru": "Подключения устройств.",
8311
"zh-chs": "設備連接。",
8312
"xloc": [
8313
- "default.handlebars->27->1105",
8314
- "default.handlebars->27->1356"
8313
+ "default.handlebars->27->1107",
8314
+ "default.handlebars->27->1358"
8315
]
8316
},
8317
{
@@ -8328,8 +8328,8 @@
8328
"ru": "Отключения устройств.",
8329
"zh-chs": "設備斷開連接。",
8330
"xloc": [
8331
- "default.handlebars->27->1106",
8332
- "default.handlebars->27->1357"
8331
+ "default.handlebars->27->1108",
8332
+ "default.handlebars->27->1359"
8333
]
8334
},
8335
{
@@ -8346,7 +8346,7 @@
8346
"ru": "Примечания могут быть просмотрены и изменены другими администраторами.",
8347
"zh-chs": "其他設備組管理員可以查看和更改設備組註釋。",
8348
"xloc": [
8349
- "default.handlebars->27->625"
8349
+ "default.handlebars->27->627"
8350
]
8351
},
8352
{
@@ -8656,8 +8656,8 @@
8656
"nl": "Apparaten",
8657
"zh-chs": "设备",
8658
"xloc": [
8659
- "default.handlebars->27->1519",
8660
- "default.handlebars->27->1547"
8659
+ "default.handlebars->27->1521",
8660
+ "default.handlebars->27->1549"
8661
]
8662
},
8663
{
@@ -8693,8 +8693,8 @@
8693
"xloc": [
8694
"default-mobile.handlebars->9->285",
8695
"default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3",
8696
- "default.handlebars->27->1185",
8697
- "default.handlebars->27->757",
8696
+ "default.handlebars->27->1187",
8697
+ "default.handlebars->27->759",
8698
"default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->disconnectbutton1span",
8699
"default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->disconnectbutton2span",
8700
"xterm.handlebars->p11->deskarea0->deskarea1->3"
@@ -8750,7 +8750,7 @@
8750
"nl": "Geef een berichtvenster weer op het externe apparaat.",
8751
"fr": "Afficher un message sur le poste distant",
8752
"xloc": [
8753
- "default.handlebars->27->628"
8753
+ "default.handlebars->27->630"
8754
]
8755
},
8756
{
@@ -8792,7 +8792,7 @@
8792
"ru": "Отобразить имя группы устройств",
8793
"zh-chs": "顯示設備組名稱",
8794
"xloc": [
8795
- "default.handlebars->27->1104"
8795
+ "default.handlebars->27->1106"
8796
]
8797
},
8798
{
@@ -8809,7 +8809,7 @@
8809
"ru": "Отображаемое имя",
8810
"zh-chs": "顯示名稱",
8811
"xloc": [
8812
- "default.handlebars->27->728"
8812
+ "default.handlebars->27->730"
8813
]
8814
},
8815
{
@@ -8825,7 +8825,7 @@
8825
"ru": "Показать публичную ссылку",
8826
"zh-chs": "显示公共链接",
8827
"xloc": [
8828
- "default.handlebars->27->1376"
8828
+ "default.handlebars->27->1378"
8829
]
8830
},
8831
{
@@ -8842,17 +8842,17 @@
8842
"ru": "Ничего не делать",
8843
"zh-chs": "沒做什麼",
8844
"xloc": [
8845
- "default.handlebars->27->1229"
8845
+ "default.handlebars->27->1231"
8846
]
8847
},
8848
{
8849
"en": "Domain",
8850
"nl": "Domein",
8851
"xloc": [
8852
- "default.handlebars->27->1485",
8853
- "default.handlebars->27->1531",
8854
- "default.handlebars->27->1540",
8855
- "default.handlebars->27->1595"
8852
+ "default.handlebars->27->1487",
8853
+ "default.handlebars->27->1533",
8854
+ "default.handlebars->27->1542",
8855
+ "default.handlebars->27->1597"
8856
]
8857
},
8858
{
@@ -8865,8 +8865,8 @@
8865
"nl": "Niet configureren",
8866
"zh-chs": "不要配置",
8867
"xloc": [
8868
- "default.handlebars->27->1233",
8869
- "default.handlebars->27->1238"
8868
+ "default.handlebars->27->1235",
8869
+ "default.handlebars->27->1240"
8870
]
8871
},
8872
{
@@ -8879,7 +8879,7 @@
8879
"nl": "Maak geen verbinding met de server",
8880
"zh-chs": "不要连接到服务器",
8881
"xloc": [
8882
- "default.handlebars->27->1234"
8882
+ "default.handlebars->27->1236"
8883
]
8884
},
8885
{
@@ -8979,7 +8979,7 @@
8979
"zh-chs": "下載文件",
8980
"xloc": [
8981
"default-mobile.handlebars->9->315",
8982
- "default.handlebars->27->786"
8982
+ "default.handlebars->27->788"
8983
]
8984
},
8985
{
@@ -9013,7 +9013,7 @@
9013
"ru": "Скачать MeshCmd",
9014
"zh-chs": "下載MeshCmd",
9015
"xloc": [
9016
- "default.handlebars->27->688"
9016
+ "default.handlebars->27->690"
9017
]
9018
},
9019
{
@@ -9064,7 +9064,7 @@
9064
"ru": "Скачайте \\\"meshcmd\\\" с файлом команд для маршрутизации трафика к этому устройству через сервер. Не забудьте указать пароль от своей учетной записи в meshaction.txt и сделать другие правки при необходимости.",
9065
"zh-chs": "下載帶有動作文件的“ meshcmd”,以將通過此服務器的流量路由到該設備。確保編輯meshaction.txt並添加您的帳戶密碼或進行任何必要的更改。",
9066
"xloc": [
9067
- "default.handlebars->27->681"
9067
+ "default.handlebars->27->683"
9068
]
9069
},
9070
{
@@ -9132,7 +9132,7 @@
9132
"ru": "Скачать события состояния питания",
9133
"zh-chs": "下載電源事件",
9134
"xloc": [
9135
- "default.handlebars->27->640"
9135
+ "default.handlebars->27->642"
9136
]
9137
},
9138
{
@@ -9200,7 +9200,7 @@
9200
"ru": "Скачать список событий в одном из форматов ниже.",
9201
"zh-chs": "使用以下一種文件格式下載事件列表。",
9202
"xloc": [
9203
- "default.handlebars->27->1414"
9203
+ "default.handlebars->27->1416"
9204
]
9205
},
9206
{
@@ -9217,7 +9217,7 @@
9217
"ru": "Скачать список пользователей в одном из форматов ниже.",
9218
"zh-chs": "使用以下一種文件格式下載用戶列表。",
9219
"xloc": [
9220
- "default.handlebars->27->1473"
9220
+ "default.handlebars->27->1475"
9221
]
9222
},
9223
{
@@ -9300,7 +9300,7 @@
9300
"nl": "Dubbele agent",
9301
"zh-chs": "代理重复",
9302
"xloc": [
9303
- "default.handlebars->27->1750"
9303
+ "default.handlebars->27->1752"
9304
]
9305
},
9306
{
@@ -9334,7 +9334,7 @@
9334
"ru": "Скопировать группу пользователей",
9335
"zh-chs": "重複的用戶組",
9336
"xloc": [
9337
- "default.handlebars->27->1535"
9337
+ "default.handlebars->27->1537"
9338
]
9339
},
9340
{
@@ -9365,8 +9365,8 @@
9365
"ru": "Длительность",
9366
"zh-chs": "持續時間",
9367
"xloc": [
9368
- "default.handlebars->27->1704",
9369
- "default.handlebars->27->1724",
9368
+ "default.handlebars->27->1706",
9369
+ "default.handlebars->27->1726",
9370
"player.handlebars->3->2"
9371
]
9372
},
@@ -9384,7 +9384,7 @@
9384
"ru": "Во время активации агент будет иметь доступ к паролю администратора.",
9385
"zh-chs": "在激活期間,代理將有權訪問管理員密碼信息。",
9386
"xloc": [
9387
- "default.handlebars->27->1243"
9387
+ "default.handlebars->27->1245"
9388
]
9389
},
9390
{
@@ -9401,7 +9401,7 @@
9401
"ru": "Голландский (Бельгийский)",
9402
"zh-chs": "荷蘭語(比利時)",
9403
"xloc": [
9404
- "default.handlebars->27->945"
9404
+ "default.handlebars->27->947"
9405
]
9406
},
9407
{
@@ -9418,7 +9418,7 @@
9418
"ru": "Голландский (Стандартный)",
9419
"zh-chs": "荷蘭語(標準)",
9420
"xloc": [
9421
- "default.handlebars->27->944"
9421
+ "default.handlebars->27->946"
9422
]
9423
},
9424
{
@@ -9609,7 +9609,7 @@
9609
"zh-chs": "編輯裝置",
9610
"xloc": [
9611
"default-mobile.handlebars->9->276",
9612
- "default.handlebars->27->701"
9612
+ "default.handlebars->27->703"
9613
]
9614
},
9615
{
@@ -9629,11 +9629,11 @@
9629
"default-mobile.handlebars->9->395",
9630
"default-mobile.handlebars->9->397",
9631
"default-mobile.handlebars->9->415",
9632
- "default.handlebars->27->1249",
9633
- "default.handlebars->27->1279",
9634
- "default.handlebars->27->1301",
9635
- "default.handlebars->27->1313"
9636
- ]
9632
+ "default.handlebars->27->1251",
9633
+ "default.handlebars->27->1281",
9634
+ "default.handlebars->27->1303",
9635
+ "default.handlebars->27->1315"
9636
+ ]
9637
},
9638
{
9639
"cs": "Upravit vlastnosti skupiny zařízení",
@@ -9649,7 +9649,7 @@
9649
"ru": "Редактировать функции группы устройств",
9650
"zh-chs": "編輯設備組功能",
9651
"xloc": [
9652
- "default.handlebars->27->1265"
9652
+ "default.handlebars->27->1267"
9653
]
9654
},
9655
{
@@ -9666,8 +9666,8 @@
9666
"ru": "Редактировать права группы устройств",
9667
"zh-chs": "編輯設備組權限",
9668
"xloc": [
9669
- "default.handlebars->27->1298",
9670
- "default.handlebars->27->1310"
9669
+ "default.handlebars->27->1300",
9670
+ "default.handlebars->27->1312"
9671
]
9672
},
9673
{
@@ -9684,7 +9684,7 @@
9684
"ru": "Редактировать согласие пользователя группы устройств",
9685
"zh-chs": "編輯設備組用戶同意",
9686
"xloc": [
9687
- "default.handlebars->27->1250"
9687
+ "default.handlebars->27->1252"
9688
]
9689
},
9690
{
@@ -9702,7 +9702,7 @@
9702
"zh-chs": "編輯設備說明",
9703
"xloc": [
9704
"default-mobile.handlebars->9->409",
9705
- "default.handlebars->27->1292"
9705
+ "default.handlebars->27->1294"
9706
]
9707
},
9708
{
@@ -9718,8 +9718,8 @@
9718
"ru": "Изменить разрешения устройства",
9719
"zh-chs": "编辑设备权限",
9720
"xloc": [
9721
- "default.handlebars->27->1303",
9722
- "default.handlebars->27->1305"
9721
+ "default.handlebars->27->1305",
9722
+ "default.handlebars->27->1307"
9723
]
9724
},
9725
{
@@ -9733,7 +9733,7 @@
9733
"nl": "Gebruikerstoestemming apparaat bewerken",
9734
"zh-chs": "编辑设备用户同意",
9735
"xloc": [
9736
- "default.handlebars->27->1252"
9736
+ "default.handlebars->27->1254"
9737
]
9738
},
9739
{
@@ -9749,7 +9749,7 @@
9749
"ru": "Редактировать группу",
9750
"zh-chs": "编辑组",
9751
"xloc": [
9752
- "default.handlebars->27->604"
9752
+ "default.handlebars->27->606"
9753
]
9754
},
9755
{
@@ -9769,7 +9769,7 @@
9769
"default-mobile.handlebars->9->266",
9770
"default.handlebars->27->498",
9771
"default.handlebars->27->501",
9772
- "default.handlebars->27->647"
9772
+ "default.handlebars->27->649"
9773
]
9774
},
9775
{
@@ -9787,7 +9787,7 @@
9787
"zh-chs": "編輯筆記",
9788
"xloc": [
9789
"default-mobile.handlebars->9->422",
9790
- "default.handlebars->27->1320"
9790
+ "default.handlebars->27->1322"
9791
]
9792
},
9793
{
@@ -9801,7 +9801,7 @@
9801
"nl": "Gebruikerstoestemming bewerken",
9802
"zh-chs": "编辑用户同意",
9803
"xloc": [
9804
- "default.handlebars->27->1251"
9804
+ "default.handlebars->27->1253"
9805
]
9806
},
9807
{
@@ -9818,7 +9818,7 @@
9818
"ru": "Редактировать права пользователя для группы устройств",
9819
"zh-chs": "編輯用戶設備組權限",
9820
"xloc": [
9821
- "default.handlebars->27->1311"
9821
+ "default.handlebars->27->1313"
9822
]
9823
},
9824
{
@@ -9834,7 +9834,7 @@
9834
"ru": "Изменить разрешения для пользовательских устройств",
9835
"zh-chs": "编辑用户设备权限",
9836
"xloc": [
9837
- "default.handlebars->27->1306"
9837
+ "default.handlebars->27->1308"
9838
]
9839
},
9840
{
@@ -9851,7 +9851,7 @@
9851
"ru": "Редактировать группу пользователей",
9852
"zh-chs": "編輯用戶組",
9853
"xloc": [
9854
- "default.handlebars->27->1574"
9854
+ "default.handlebars->27->1576"
9855
]
9856
},
9857
{
@@ -9865,7 +9865,7 @@
9865
"nl": "Gebruikersmachtigingen voor apparaatgroep bewerken",
9866
"zh-chs": "编辑用户组设备权限",
9867
"xloc": [
9868
- "default.handlebars->27->1308"
9868
+ "default.handlebars->27->1310"
9869
]
9870
},
9871
{
@@ -9900,11 +9900,11 @@
9900
"zh-chs": "電子郵件",
9901
"xloc": [
9902
"default-mobile.handlebars->9->78",
9903
- "default.handlebars->27->1487",
9904
- "default.handlebars->27->1599",
9905
- "default.handlebars->27->1600",
9906
- "default.handlebars->27->1639",
9907
- "default.handlebars->27->1653",
9903
+ "default.handlebars->27->1489",
9904
+ "default.handlebars->27->1601",
9905
+ "default.handlebars->27->1602",
9906
+ "default.handlebars->27->1641",
9907
+ "default.handlebars->27->1655",
9908
"default.handlebars->27->294",
9909
"login-mobile.handlebars->5->42",
9910
"login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3",
@@ -9927,7 +9927,7 @@
9927
"zh-chs": "電郵地址變更",
9928
"xloc": [
9929
"default-mobile.handlebars->9->79",
9930
- "default.handlebars->27->1113"
9930
+ "default.handlebars->27->1115"
9931
]
9932
},
9933
{
@@ -9945,7 +9945,7 @@
9945
"zh-chs": "郵件認證",
9946
"xloc": [
9947
"default-mobile.handlebars->9->68",
9948
- "default.handlebars->27->882"
9948
+ "default.handlebars->27->884"
9949
]
9950
},
9951
{
@@ -9990,7 +9990,7 @@
9990
"zh-chs": "電子郵件驗證",
9991
"xloc": [
9992
"default-mobile.handlebars->9->77",
9993
- "default.handlebars->27->1111"
9993
+ "default.handlebars->27->1113"
9994
]
9995
},
9996
{
@@ -10020,7 +10020,7 @@
10020
"ru": "Электронная почта не подтверждена",
10021
"zh-chs": "邮件未验证",
10022
"xloc": [
10023
- "default.handlebars->27->1443"
10023
+ "default.handlebars->27->1445"
10024
]
10025
},
10026
{
@@ -10037,8 +10037,8 @@
10037
"ru": "Email подтвержден",
10038
"zh-chs": "電子郵件已驗證",
10039
"xloc": [
10040
- "default.handlebars->27->1444",
10041
- "default.handlebars->27->1593"
10040
+ "default.handlebars->27->1446",
10041
+ "default.handlebars->27->1595"
10042
]
10043
},
10044
{
@@ -10055,7 +10055,7 @@
10055
"ru": "Email подтвержден.",
10056
"zh-chs": "電子郵件已驗證。",
10057
"xloc": [
10058
- "default.handlebars->27->1493"
10058
+ "default.handlebars->27->1495"
10059
]
10060
},
10061
{
@@ -10072,7 +10072,7 @@
10072
"ru": "Email не подтвержден",
10073
"zh-chs": "電子郵件未驗證",
10074
"xloc": [
10075
- "default.handlebars->27->1594"
10075
+ "default.handlebars->27->1596"
10076
]
10077
},
10078
{
@@ -10111,7 +10111,7 @@
10111
"en": "Email verified and forced password reset required.",
10112
"nl": "E-mail geverifieerd en geforceerd opnieuw instellen van wachtwoord vereist.",
10113
"xloc": [
10114
- "default.handlebars->27->1494"
10114
+ "default.handlebars->27->1496"
10115
]
10116
},
10117
{
@@ -10124,7 +10124,7 @@
10124
"nl": "Email/SMS verkeer",
10125
"zh-chs": "电子邮件/短信流量",
10126
"xloc": [
10127
- "default.handlebars->27->1789"
10127
+ "default.handlebars->27->1791"
10128
]
10129
},
10130
{
@@ -10163,7 +10163,7 @@
10163
"ru": "Включить коды приглашения",
10164
"zh-chs": "啟用邀請代碼",
10165
"xloc": [
10166
- "default.handlebars->27->1341"
10166
+ "default.handlebars->27->1343"
10167
]
10168
},
10169
{
@@ -10198,7 +10198,7 @@
10198
"zh-chs": "啟用電子郵件兩因素驗證。",
10199
"xloc": [
10200
"default-mobile.handlebars->9->70",
10201
- "default.handlebars->27->884"
10201
+ "default.handlebars->27->886"
10202
]
10203
},
10204
{
@@ -10222,7 +10222,7 @@
10222
"en": "Enabled",
10223
"nl": "Ingeschakeld",
10224
"xloc": [
10225
- "default.handlebars->27->1726"
10225
+ "default.handlebars->27->1728"
10226
]
10227
},
10228
{
@@ -10246,7 +10246,7 @@
10246
"en": "End Time",
10247
"nl": "Eindtijd",
10248
"xloc": [
10249
- "default.handlebars->27->1723"
10249
+ "default.handlebars->27->1725"
10250
]
10251
},
10252
{
@@ -10263,7 +10263,7 @@
10263
"ru": "Английский",
10264
"zh-chs": "英語",
10265
"xloc": [
10266
- "default.handlebars->27->946"
10266
+ "default.handlebars->27->948"
10267
]
10268
},
10269
{
@@ -10280,7 +10280,7 @@
10280
"ru": "Английский (Австралия)",
10281
"zh-chs": "英文(澳洲)",
10282
"xloc": [
10283
- "default.handlebars->27->947"
10283
+ "default.handlebars->27->949"
10284
]
10285
},
10286
{
@@ -10297,7 +10297,7 @@
10297
"ru": "Английский (Белиз)",
10298
"zh-chs": "英語(伯利茲)",
10299
"xloc": [
10300
- "default.handlebars->27->948"
10300
+ "default.handlebars->27->950"
10301
]
10302
},
10303
{
@@ -10314,7 +10314,7 @@
10314
"ru": "Английский (Канада)",
10315
"zh-chs": "英文(加拿大)",
10316
"xloc": [
10317
- "default.handlebars->27->949"
10317
+ "default.handlebars->27->951"
10318
]
10319
},
10320
{
@@ -10331,7 +10331,7 @@
10331
"ru": "Английский (Ирландия)",
10332
"zh-chs": "英文(愛爾蘭)",
10333
"xloc": [
10334
- "default.handlebars->27->950"
10334
+ "default.handlebars->27->952"
10335
]
10336
},
10337
{
@@ -10348,7 +10348,7 @@
10348
"ru": "Английский (Ямайка)",
10349
"zh-chs": "英文(牙買加)",
10350
"xloc": [
10351
- "default.handlebars->27->951"
10351
+ "default.handlebars->27->953"
10352
]
10353
},
10354
{
@@ -10365,7 +10365,7 @@
10365
"ru": "Английский (Новая Зеландия)",
10366
"zh-chs": "英文(紐西蘭)",
10367
"xloc": [
10368
- "default.handlebars->27->952"
10368
+ "default.handlebars->27->954"
10369
]
10370
},
10371
{
@@ -10382,7 +10382,7 @@
10382
"ru": "Английский (Филиппины)",
10383
"zh-chs": "英文(菲律賓)",
10384
"xloc": [
10385
- "default.handlebars->27->953"
10385
+ "default.handlebars->27->955"
10386
]
10387
},
10388
{
@@ -10399,7 +10399,7 @@
10399
"ru": "Английский (Южная Африка)",
10400
"zh-chs": "英語(南非)",
10401
"xloc": [
10402
- "default.handlebars->27->954"
10402
+ "default.handlebars->27->956"
10403
]
10404
},
10405
{
@@ -10416,7 +10416,7 @@
10416
"ru": "Английский (Тринидад и Тобаго)",
10417
"zh-chs": "英文(特立尼達和多巴哥)",
10418
"xloc": [
10419
- "default.handlebars->27->955"
10419
+ "default.handlebars->27->957"
10420
]
10421
},
10422
{
@@ -10433,7 +10433,7 @@
10433
"ru": "Английский (Великобритания)",
10434
"zh-chs": "英文(英國)",
10435
"xloc": [
10436
- "default.handlebars->27->956"
10436
+ "default.handlebars->27->958"
10437
]
10438
},
10439
{
@@ -10450,7 +10450,7 @@
10450
"ru": "Английский (Соединенные Штаты)",
10451
"zh-chs": "美國英語)",
10452
"xloc": [
10453
- "default.handlebars->27->957"
10453
+ "default.handlebars->27->959"
10454
]
10455
},
10456
{
@@ -10467,7 +10467,7 @@
10467
"ru": "Английский (Зимбабве)",
10468
"zh-chs": "英文(津巴布韋)",
10469
"xloc": [
10470
- "default.handlebars->27->958"
10470
+ "default.handlebars->27->960"
10471
]
10472
},
10473
{
@@ -10484,8 +10484,8 @@
10484
"ru": "Ввод",
10485
"zh-chs": "輸入",
10486
"xloc": [
10487
- "default.handlebars->27->1139",
10488
- "default.handlebars->27->1140"
10487
+ "default.handlebars->27->1141",
10488
+ "default.handlebars->27->1142"
10489
]
10490
},
10491
{
@@ -10502,7 +10502,7 @@
10502
"ru": "Введите разделенный запятыми список имен административных областей.",
10503
"zh-chs": "輸入管理領域名稱的逗號分隔列表。",
10504
"xloc": [
10505
- "default.handlebars->27->1498"
10505
+ "default.handlebars->27->1500"
10506
]
10507
},
10508
{
@@ -10536,7 +10536,7 @@
10536
"ru": "Для удаленного набора введите текст, используя английскую раскладку и нажмите OK. Перед продолжением убедитесь, что курсор на удаленном компьютере установлен в правильное положение.",
10537
"zh-chs": "輸入文本,然後單擊“確定”以使用美式英語鍵盤遠程輸入文本。在繼續操作之前,請確保將遠程光標放置在正確的位置。",
10538
"xloc": [
10539
- "default.handlebars->27->722"
10539
+ "default.handlebars->27->724"
10540
]
10541
},
10542
{
@@ -10584,7 +10584,7 @@
10584
"nl": "Voer uw telefoonnummer in dat geschikt is voor SMS. Na verificatie kan het nummer worden gebruikt voor inlogverificatie en andere meldingen.",
10585
"zh-chs": "输入支持SMS的电话号码。验证后,该号码可用于登录验证和其他通知。",
10586
"xloc": [
10587
- "default.handlebars->27->879"
10587
+ "default.handlebars->27->881"
10588
]
10589
},
10590
{
@@ -10635,7 +10635,7 @@
10635
"ru": "Эсперанто",
10636
"zh-chs": "世界語",
10637
"xloc": [
10638
- "default.handlebars->27->959"
10638
+ "default.handlebars->27->961"
10639
]
10640
},
10641
{
@@ -10652,7 +10652,7 @@
10652
"ru": "Эстонский",
10653
"zh-chs": "愛沙尼亞語",
10654
"xloc": [
10655
- "default.handlebars->27->960"
10655
+ "default.handlebars->27->962"
10656
]
10657
},
10658
{
@@ -10669,7 +10669,7 @@
10669
"ru": "Детали события",
10670
"zh-chs": "活動詳情",
10671
"xloc": [
10672
- "default.handlebars->27->799"
10672
+ "default.handlebars->27->801"
10673
]
10674
},
10675
{
@@ -10686,7 +10686,7 @@
10686
"ru": "Экспорт списка событий",
10687
"zh-chs": "活動列表導出",
10688
"xloc": [
10689
- "default.handlebars->27->1419"
10689
+ "default.handlebars->27->1421"
10690
]
10691
},
10692
{
@@ -10775,7 +10775,7 @@
10775
"ru": "Расширенный ASCII",
10776
"zh-chs": "擴展ASCII",
10777
"xloc": [
10778
- "default.handlebars->27->748"
10778
+ "default.handlebars->27->750"
10779
]
10780
},
10781
{
@@ -10809,7 +10809,7 @@
10809
"ru": "Внешний",
10810
"zh-chs": "外部",
10811
"xloc": [
10812
- "default.handlebars->27->1774"
10812
+ "default.handlebars->27->1776"
10813
]
10814
},
10815
{
@@ -10826,7 +10826,7 @@
10826
"ru": "Mакедонский (БЮР)",
10827
"zh-chs": "FYRO馬其頓語",
10828
"xloc": [
10829
- "default.handlebars->27->1010"
10829
+ "default.handlebars->27->1012"
10830
]
10831
},
10832
{
@@ -10843,7 +10843,7 @@
10843
"ru": "Фарерский",
10844
"zh-chs": "法羅語",
10845
"xloc": [
10846
- "default.handlebars->27->961"
10846
+ "default.handlebars->27->963"
10847
]
10848
},
10849
{
@@ -10873,7 +10873,7 @@
10873
"ko": "원격 터미널 세션을 시작하지 못했습니다 : {0} ({1})",
10874
"zh-chs": "无法启动远程终端会话{0}({1})",
10875
"xloc": [
10876
- "default.handlebars->27->704"
10876
+ "default.handlebars->27->706"
10877
]
10878
},
10879
{
@@ -10890,7 +10890,7 @@
10890
"ru": "Фарси (Персидский)",
10891
"zh-chs": "波斯語(波斯語)",
10892
"xloc": [
10893
- "default.handlebars->27->962"
10893
+ "default.handlebars->27->964"
10894
]
10895
},
10896
{
@@ -10925,7 +10925,7 @@
10925
"ru": "Функции",
10926
"zh-chs": "特徵",
10927
"xloc": [
10928
- "default.handlebars->27->1171"
10928
+ "default.handlebars->27->1173"
10929
]
10930
},
10931
{
@@ -10942,7 +10942,7 @@
10942
"ru": "Фиджи",
10943
"zh-chs": "斐濟",
10944
"xloc": [
10945
- "default.handlebars->27->963"
10945
+ "default.handlebars->27->965"
10946
]
10947
},
10948
{
@@ -10961,7 +10961,7 @@
10961
"xloc": [
10962
"default-mobile.handlebars->9->299",
10963
"default.handlebars->27->440",
10964
- "default.handlebars->27->771"
10964
+ "default.handlebars->27->773"
10965
]
10966
},
10967
{
@@ -10995,7 +10995,7 @@
10995
"ru": "Драйвер файловой системы",
10996
"zh-chs": "FileSystemDriver",
10997
"xloc": [
10998
- "default.handlebars->27->731"
10998
+ "default.handlebars->27->733"
10999
]
11000
},
11001
{
@@ -11014,8 +11014,8 @@
11014
"xloc": [
11015
"default-mobile.handlebars->9->167",
11016
"default-mobile.handlebars->9->250",
11017
- "default.handlebars->27->1260",
11018
- "default.handlebars->27->1711",
11017
+ "default.handlebars->27->1262",
11018
+ "default.handlebars->27->1713",
11019
"default.handlebars->27->220",
11020
"default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevFiles",
11021
"default.handlebars->contextMenu->cxfiles"
@@ -11052,8 +11052,8 @@
11052
"ru": "Уведомление файлов",
11053
"zh-chs": "文件通知",
11054
"xloc": [
11055
- "default.handlebars->27->1179",
11056
- "default.handlebars->27->1624",
11055
+ "default.handlebars->27->1181",
11056
+ "default.handlebars->27->1626",
11057
"default.handlebars->27->523"
11058
]
11059
},
@@ -11071,8 +11071,8 @@
11071
"ru": "Запрос файлов",
11072
"zh-chs": "文件提示",
11073
"xloc": [
11074
- "default.handlebars->27->1178",
11075
- "default.handlebars->27->1623",
11074
+ "default.handlebars->27->1180",
11075
+ "default.handlebars->27->1625",
11076
"default.handlebars->27->522"
11077
]
11078
},
@@ -11110,7 +11110,7 @@
11110
"ru": "Финский",
11111
"zh-chs": "芬蘭",
11112
"xloc": [
11113
- "default.handlebars->27->964"
11113
+ "default.handlebars->27->966"
11114
]
11115
},
11116
{
@@ -11233,8 +11233,8 @@
11233
"ru": "Принудительно сбросить пароль при следующем входе в систему.",
11234
"zh-chs": "下次登錄時強制重置密碼。",
11235
"xloc": [
11236
- "default.handlebars->27->1492",
11237
- "default.handlebars->27->1662"
11236
+ "default.handlebars->27->1494",
11237
+ "default.handlebars->27->1664"
11238
]
11239
},
11240
{
@@ -11320,8 +11320,8 @@
11320
"ru": "Свободно",
11321
"zh-chs": "自由",
11322
"xloc": [
11323
- "default.handlebars->27->1735",
11324
- "default.handlebars->27->1737"
11323
+ "default.handlebars->27->1737",
11324
+ "default.handlebars->27->1739"
11325
]
11326
},
11327
{
@@ -11356,7 +11356,7 @@
11356
"ru": "Французский (Бельгия)",
11357
"zh-chs": "法語(比利時)",
11358
"xloc": [
11359
- "default.handlebars->27->966"
11359
+ "default.handlebars->27->968"
11360
]
11361
},
11362
{
@@ -11373,7 +11373,7 @@
11373
"ru": "Французский (Канада)",
11374
"zh-chs": "法語(加拿大)",
11375
"xloc": [
11376
- "default.handlebars->27->967"
11376
+ "default.handlebars->27->969"
11377
]
11378
},
11379
{
@@ -11390,7 +11390,7 @@
11390
"ru": "Французский (Франция)",
11391
"zh-chs": "法語(法國)",
11392
"xloc": [
11393
- "default.handlebars->27->968"
11393
+ "default.handlebars->27->970"
11394
]
11395
},
11396
{
@@ -11407,7 +11407,7 @@
11407
"ru": "Французский (Люксембург)",
11408
"zh-chs": "法語(盧森堡)",
11409
"xloc": [
11410
- "default.handlebars->27->969"
11410
+ "default.handlebars->27->971"
11411
]
11412
},
11413
{
@@ -11424,7 +11424,7 @@
11424
"ru": "Французский (Монако)",
11425
"zh-chs": "法語(摩納哥)",
11426
"xloc": [
11427
- "default.handlebars->27->970"
11427
+ "default.handlebars->27->972"
11428
]
11429
},
11430
{
@@ -11441,7 +11441,7 @@
11441
"ru": "Французский (Стандартный)",
11442
"zh-chs": "法語(標準)",
11443
"xloc": [
11444
- "default.handlebars->27->965"
11444
+ "default.handlebars->27->967"
11445
]
11446
},
11447
{
@@ -11458,7 +11458,7 @@
11458
"ru": "Французский (Швейцария)",
11459
"zh-chs": "法語(瑞士)",
11460
"xloc": [
11461
- "default.handlebars->27->971"
11461
+ "default.handlebars->27->973"
11462
]
11463
},
11464
{
@@ -11475,7 +11475,7 @@
11475
"ru": "Фризский",
11476
"zh-chs": "弗里斯蘭語",
11477
"xloc": [
11478
- "default.handlebars->27->972"
11478
+ "default.handlebars->27->974"
11479
]
11480
},
11481
{
@@ -11492,7 +11492,7 @@
11492
"ru": "Фриульский",
11493
"zh-chs": "弗留利",
11494
"xloc": [
11495
- "default.handlebars->27->973"
11495
+ "default.handlebars->27->975"
11496
]
11497
},
11498
{
@@ -11513,9 +11513,9 @@
11513
"default-mobile.handlebars->9->387",
11514
"default-mobile.handlebars->9->396",
11515
"default-mobile.handlebars->9->414",
11516
- "default.handlebars->27->1146",
11517
- "default.handlebars->27->1278",
11518
- "default.handlebars->27->1504"
11516
+ "default.handlebars->27->1148",
11517
+ "default.handlebars->27->1280",
11518
+ "default.handlebars->27->1506"
11519
]
11520
},
11521
{
@@ -11532,7 +11532,7 @@
11532
"ru": "Администратор с полным доступом (все права)",
11533
"zh-chs": "正式管理員(保留所有權利)",
11534
"xloc": [
11535
- "default.handlebars->27->1312"
11535
+ "default.handlebars->27->1314"
11536
]
11537
},
11538
{
@@ -11563,7 +11563,7 @@
11563
"ru": "Полные права на устройство",
11564
"zh-chs": "完整的設備權限",
11565
"xloc": [
11566
- "default.handlebars->27->587"
11566
+ "default.handlebars->27->589"
11567
]
11568
},
11569
{
@@ -11579,7 +11579,7 @@
11579
"ru": "Полные права",
11580
"zh-chs": "完全权利",
11581
"xloc": [
11582
- "default.handlebars->27->603"
11582
+ "default.handlebars->27->605"
11583
]
11584
},
11585
{
@@ -11615,7 +11615,7 @@
11615
"ru": "Администратор с полным доступом",
11616
"zh-chs": "正式管理員",
11617
"xloc": [
11618
- "default.handlebars->27->1588"
11618
+ "default.handlebars->27->1590"
11619
]
11620
},
11621
{
@@ -11629,7 +11629,7 @@
11629
"zh-chs": "显卡",
11630
"xloc": [
11631
"default-mobile.handlebars->9->365",
11632
- "default.handlebars->27->847"
11632
+ "default.handlebars->27->849"
11633
]
11634
},
11635
{
@@ -11646,7 +11646,7 @@
11646
"ru": "Гэльский (Ирландский)",
11647
"zh-chs": "蓋爾語(愛爾蘭)",
11648
"xloc": [
11649
- "default.handlebars->27->975"
11649
+ "default.handlebars->27->977"
11650
]
11651
},
11652
{
@@ -11663,7 +11663,7 @@
11663
"ru": "Гэльский (Шотландия)",
11664
"zh-chs": "蓋爾語(蘇格蘭語)",
11665
"xloc": [
11666
- "default.handlebars->27->974"
11666
+ "default.handlebars->27->976"
11667
]
11668
},
11669
{
@@ -11680,7 +11680,7 @@
11680
"ru": "Галицкий",
11681
"zh-chs": "加拉契人",
11682
"xloc": [
11683
- "default.handlebars->27->976"
11683
+ "default.handlebars->27->978"
11684
]
11685
},
11686
{
@@ -11788,7 +11788,7 @@
11788
"ru": "Грузинский",
11789
"zh-chs": "格魯吉亞人",
11790
"xloc": [
11791
- "default.handlebars->27->977"
11791
+ "default.handlebars->27->979"
11792
]
11793
},
11794
{
@@ -11805,7 +11805,7 @@
11805
"ru": "Немецкий (Австрия)",
11806
"zh-chs": "德語(奧地利)",
11807
"xloc": [
11808
- "default.handlebars->27->979"
11808
+ "default.handlebars->27->981"
11809
]
11810
},
11811
{
@@ -11822,7 +11822,7 @@
11822
"ru": "Немецкий (Германия)",
11823
"zh-chs": "德文(德國)",
11824
"xloc": [
11825
- "default.handlebars->27->980"
11825
+ "default.handlebars->27->982"
11826
]
11827
},
11828
{
@@ -11839,7 +11839,7 @@
11839
"ru": "Немецкий (Лихтенштейн)",
11840
"zh-chs": "德文(列支敦士登)",
11841
"xloc": [
11842
- "default.handlebars->27->981"
11842
+ "default.handlebars->27->983"
11843
]
11844
},
11845
{
@@ -11856,7 +11856,7 @@
11856
"ru": "Немецкий (Люксембург)",
11857
"zh-chs": "德語(盧森堡)",
11858
"xloc": [
11859
- "default.handlebars->27->982"
11859
+ "default.handlebars->27->984"
11860
]
11861
},
11862
{
@@ -11873,7 +11873,7 @@
11873
"ru": "Немецкий (Стандартный)",
11874
"zh-chs": "德語(標準)",
11875
"xloc": [
11876
- "default.handlebars->27->978"
11876
+ "default.handlebars->27->980"
11877
]
11878
},
11879
{
@@ -11890,7 +11890,7 @@
11890
"ru": "Немецкий (Швейцария)",
11891
"zh-chs": "德語(瑞士)",
11892
"xloc": [
11893
- "default.handlebars->27->983"
11893
+ "default.handlebars->27->985"
11894
]
11895
},
11896
{
@@ -11907,7 +11907,7 @@
11907
"ru": "Получить учетные данные MQTT для этого устройства.",
11908
"zh-chs": "獲取此設備的MQTT登錄憑據。",
11909
"xloc": [
11910
- "default.handlebars->27->568"
11910
+ "default.handlebars->27->570"
11911
]
11912
},
11913
{
@@ -11973,7 +11973,7 @@
11973
"ru": "Хорошо",
11974
"zh-chs": "好",
11975
"xloc": [
11976
- "default.handlebars->27->1142"
11976
+ "default.handlebars->27->1144"
11977
]
11978
},
11979
{
@@ -12010,7 +12010,7 @@
12010
"ru": "Греческий",
12011
"zh-chs": "希臘語",
12012
"xloc": [
12013
- "default.handlebars->27->984"
12013
+ "default.handlebars->27->986"
12014
]
12015
},
12016
{
@@ -12046,8 +12046,8 @@
12046
"ru": "Групповое действие",
12047
"zh-chs": "集體行動",
12048
"xloc": [
12049
- "default.handlebars->27->1456",
12050
- "default.handlebars->27->1525",
12049
+ "default.handlebars->27->1458",
12050
+ "default.handlebars->27->1527",
12051
"default.handlebars->27->408",
12052
"default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar",
12053
"default.handlebars->container->column_l->p4->3->1->0->3->3",
@@ -12058,7 +12058,7 @@
12058
"en": "Group Identifier",
12059
"nl": "Groepsidentificatie",
12060
"xloc": [
12061
- "default.handlebars->27->1542"
12061
+ "default.handlebars->27->1544"
12062
]
12063
},
12064
{
@@ -12075,7 +12075,7 @@
12075
"ru": "Члены группы",
12076
"zh-chs": "小組成員",
12077
"xloc": [
12078
- "default.handlebars->27->1551"
12078
+ "default.handlebars->27->1553"
12079
]
12080
},
12081
{
@@ -12092,7 +12092,7 @@
12092
"ru": "Права на группу для пользователя {0}.",
12093
"zh-chs": "用戶{0}的組權限。",
12094
"xloc": [
12095
- "default.handlebars->27->1277"
12095
+ "default.handlebars->27->1279"
12096
]
12097
},
12098
{
@@ -12109,7 +12109,7 @@
12109
"ru": "Права на группу для {0}.",
12110
"zh-chs": "{0}的組權限。",
12111
"xloc": [
12112
- "default.handlebars->27->1276"
12112
+ "default.handlebars->27->1278"
12113
]
12114
},
12115
{
@@ -12160,7 +12160,7 @@
12160
"ru": "Гуджарати",
12161
"zh-chs": "古久拉提",
12162
"xloc": [
12163
- "default.handlebars->27->985"
12163
+ "default.handlebars->27->987"
12164
]
12165
},
12166
{
@@ -12196,7 +12196,7 @@
12196
"ru": "Гаитянский",
12197
"zh-chs": "海地",
12198
"xloc": [
12199
- "default.handlebars->27->986"
12199
+ "default.handlebars->27->988"
12200
]
12201
},
12202
{
@@ -12230,7 +12230,7 @@
12230
"ru": "Жесткое отключение агента",
12231
"zh-chs": "硬斷開劑",
12232
"xloc": [
12233
- "default.handlebars->27->874"
12233
+ "default.handlebars->27->876"
12234
]
12235
},
12236
{
@@ -12247,7 +12247,7 @@
12247
"ru": "Всего кучи",
12248
"zh-chs": "堆總數",
12249
"xloc": [
12250
- "default.handlebars->27->1776"
12250
+ "default.handlebars->27->1778"
12251
]
12252
},
12253
{
@@ -12264,7 +12264,7 @@
12264
"ru": "Куча используется",
12265
"zh-chs": "堆使用",
12266
"xloc": [
12267
- "default.handlebars->27->1775"
12267
+ "default.handlebars->27->1777"
12268
]
12269
},
12270
{
@@ -12281,7 +12281,7 @@
12281
"ru": "Иврит",
12282
"zh-chs": "希伯來語",
12283
"xloc": [
12284
- "default.handlebars->27->987"
12284
+ "default.handlebars->27->989"
12285
]
12286
},
12287
{
@@ -12315,7 +12315,7 @@
12315
"ru": "Помочь перевести MeshCentral",
12316
"zh-chs": "幫助翻譯MeshCentral",
12317
"xloc": [
12318
- "default.handlebars->27->1101"
12318
+ "default.handlebars->27->1103"
12319
]
12320
},
12321
{
@@ -12401,7 +12401,7 @@
12401
"ru": "Хинди",
12402
"zh-chs": "印地語",
12403
"xloc": [
12404
- "default.handlebars->27->988"
12404
+ "default.handlebars->27->990"
12405
]
12406
},
12407
{
@@ -12437,7 +12437,7 @@
12437
"zh-chs": "持有1份副本",
12438
"xloc": [
12439
"default-mobile.handlebars->9->308",
12440
- "default.handlebars->27->780"
12440
+ "default.handlebars->27->782"
12441
]
12442
},
12443
{
@@ -12455,7 +12455,7 @@
12455
"zh-chs": "持有1個搬家公司",
12456
"xloc": [
12457
"default-mobile.handlebars->9->312",
12458
- "default.handlebars->27->784"
12458
+ "default.handlebars->27->786"
12459
]
12460
},
12461
{
@@ -12473,7 +12473,7 @@
12473
"zh-chs": "保留{0}個條目進行複制",
12474
"xloc": [
12475
"default-mobile.handlebars->9->306",
12476
- "default.handlebars->27->778"
12476
+ "default.handlebars->27->780"
12477
]
12478
},
12479
{
@@ -12491,7 +12491,7 @@
12491
"zh-chs": "保留{0}個條目以進行移動",
12492
"xloc": [
12493
"default-mobile.handlebars->9->310",
12494
- "default.handlebars->27->782"
12494
+ "default.handlebars->27->784"
12495
]
12496
},
12497
{
@@ -12509,7 +12509,7 @@
12509
"zh-chs": "保持{2}的{0}入口{1}",
12510
"xloc": [
12511
"default-mobile.handlebars->9->129",
12512
- "default.handlebars->27->1406"
12512
+ "default.handlebars->27->1408"
12513
]
12514
},
12515
{
@@ -12532,7 +12532,7 @@
12532
"default-mobile.handlebars->9->272",
12533
"default.handlebars->27->247",
12534
"default.handlebars->27->480",
12535
- "default.handlebars->27->697"
12535
+ "default.handlebars->27->699"
12536
]
12537
},
12538
{
@@ -12549,7 +12549,7 @@
12549
"ru": "Синхронизация имени хоста",
12550
"zh-chs": "主機名同步",
12551
"xloc": [
12552
- "default.handlebars->27->1169"
12552
+ "default.handlebars->27->1171"
12553
]
12554
},
12555
{
@@ -12566,7 +12566,7 @@
12566
"ru": "Венгерский",
12567
"zh-chs": "匈牙利",
12568
"xloc": [
12569
- "default.handlebars->27->989"
12569
+ "default.handlebars->27->991"
12570
]
12571
},
12572
{
@@ -12619,7 +12619,7 @@
12619
"zh-chs": "IP:{0}",
12620
"xloc": [
12621
"default-mobile.handlebars->9->338",
12622
- "default.handlebars->27->820"
12622
+ "default.handlebars->27->822"
12623
]
12624
},
12625
{
@@ -12637,7 +12637,7 @@
12637
"zh-chs": "IP:{0},掩碼:{1},網關:{2}",
12638
"xloc": [
12639
"default-mobile.handlebars->9->336",
12640
- "default.handlebars->27->818"
12640
+ "default.handlebars->27->820"
12641
]
12642
},
12643
{
@@ -12656,8 +12656,8 @@
12656
"xloc": [
12657
"default-mobile.handlebars->9->335",
12658
"default-mobile.handlebars->9->337",
12659
- "default.handlebars->27->817",
12660
- "default.handlebars->27->819"
12659
+ "default.handlebars->27->819",
12660
+ "default.handlebars->27->821"
12661
]
12662
},
12663
{
@@ -12725,7 +12725,7 @@
12725
"ru": "Исландский",
12726
"zh-chs": "冰島的",
12727
"xloc": [
12728
- "default.handlebars->27->990"
12728
+ "default.handlebars->27->992"
12729
]
12730
},
12731
{
@@ -12743,7 +12743,7 @@
12743
"zh-chs": "圖標選擇",
12744
"xloc": [
12745
"default-mobile.handlebars->9->270",
12746
- "default.handlebars->27->695"
12746
+ "default.handlebars->27->697"
12747
]
12748
},
12749
{
@@ -12761,7 +12761,7 @@
12761
"zh-chs": "識別碼",
12762
"xloc": [
12763
"default-mobile.handlebars->9->363",
12764
- "default.handlebars->27->845"
12764
+ "default.handlebars->27->847"
12765
]
12766
},
12767
{
@@ -12864,7 +12864,7 @@
12864
"ru": "Индонезийский",
12865
"zh-chs": "印度尼西亞",
12866
"xloc": [
12867
- "default.handlebars->27->991"
12867
+ "default.handlebars->27->993"
12868
]
12869
},
12870
{
@@ -12981,7 +12981,7 @@
12981
"ru": "Установка CIRA",
12982
"zh-chs": "安裝CIRA",
12983
"xloc": [
12984
- "default.handlebars->27->1202"
12984
+ "default.handlebars->27->1204"
12985
]
12986
},
12987
{
@@ -12998,7 +12998,7 @@
12998
"ru": "Локальная установка",
12999
"zh-chs": "安裝本地",
13000
"xloc": [
13001
- "default.handlebars->27->1204"
13001
+ "default.handlebars->27->1206"
13002
]
13003
},
13004
{
@@ -13015,8 +13015,8 @@
13015
"ru": "Тип установки",
13016
"zh-chs": "安裝類型",
13017
"xloc": [
13018
- "default.handlebars->27->1343",
13019
- "default.handlebars->27->1350",
13018
+ "default.handlebars->27->1345",
13019
+ "default.handlebars->27->1352",
13020
"default.handlebars->27->309",
13021
"default.handlebars->27->331"
13022
]
@@ -13035,7 +13035,7 @@
13035
"ru": "Intel (F10 = ESC+[OM)",
13036
"zh-chs": "英特爾(F10 = ESC + [OM)",
13037
"xloc": [
13038
- "default.handlebars->27->750",
13038
+ "default.handlebars->27->752",
13039
"default.handlebars->container->column_l->p12->termTable->1->1->6->1->1->terminalSettingsButtons"
13040
]
13041
},
@@ -13053,10 +13053,10 @@
13053
"ru": "Intel AMT",
13054
"zh-chs": "英特爾AMT",
13055
"xloc": [
13056
- "default.handlebars->27->1362",
13057
- "default.handlebars->27->1370",
13058
- "default.handlebars->27->1772",
13059
- "default.handlebars->27->1794"
13056
+ "default.handlebars->27->1364",
13057
+ "default.handlebars->27->1372",
13058
+ "default.handlebars->27->1774",
13059
+ "default.handlebars->27->1796"
13060
]
13061
},
13062
{
@@ -13097,14 +13097,14 @@
13097
"en": "Intel AMT Redirection",
13098
"nl": "Intel AMT omleiding",
13099
"xloc": [
13100
- "default.handlebars->27->1713"
13100
+ "default.handlebars->27->1715"
13101
]
13102
},
13103
{
13104
"en": "Intel AMT WSMAN",
13105
"nl": "Intel AMT WSMAN",
13106
"xloc": [
13107
- "default.handlebars->27->1712"
13107
+ "default.handlebars->27->1714"
13108
]
13109
},
13110
{
@@ -13223,7 +13223,7 @@
13223
"ru": "Intel ASCII",
13224
"zh-chs": "英特爾ASCII",
13225
"xloc": [
13226
- "default.handlebars->27->749"
13226
+ "default.handlebars->27->751"
13227
]
13228
},
13229
{
@@ -13243,8 +13243,8 @@
13243
"default-mobile.handlebars->9->194",
13244
"default-mobile.handlebars->9->229",
13245
"default-mobile.handlebars->9->234",
13246
- "default.handlebars->27->1186",
13247
- "default.handlebars->27->1196",
13246
+ "default.handlebars->27->1188",
13247
+ "default.handlebars->27->1198",
13248
"default.handlebars->27->450",
13249
"default.handlebars->27->505",
13250
"default.handlebars->27->533"
@@ -13320,7 +13320,7 @@
13320
"ru": "Политика Intel® AMT",
13321
"zh-chs": "英特爾®AMT政策",
13322
"xloc": [
13323
- "default.handlebars->27->1225"
13323
+ "default.handlebars->27->1227"
13324
]
13325
},
13326
{
@@ -13407,8 +13407,8 @@
13407
"zh-chs": "英特爾®AMT已連接",
13408
"xloc": [
13409
"default-mobile.handlebars->9->244",
13410
- "default.handlebars->27->572",
13411
- "default.handlebars->27->573"
13410
+ "default.handlebars->27->574",
13411
+ "default.handlebars->27->575"
13412
]
13413
},
13414
{
@@ -13425,8 +13425,8 @@
13425
"ru": "События Intel® AMT desktop или serial.",
13426
"zh-chs": "英特爾®AMT桌面和串行事件。",
13427
"xloc": [
13428
- "default.handlebars->27->1107",
13429
- "default.handlebars->27->1358"
13428
+ "default.handlebars->27->1109",
13429
+ "default.handlebars->27->1360"
13430
]
13431
},
13432
{
@@ -13444,8 +13444,8 @@
13444
"zh-chs": "檢測到英特爾®AMT",
13445
"xloc": [
13446
"default-mobile.handlebars->9->245",
13447
- "default.handlebars->27->574",
13448
- "default.handlebars->27->575"
13447
+ "default.handlebars->27->576",
13448
+ "default.handlebars->27->577"
13449
]
13450
},
13451
{
@@ -13515,8 +13515,8 @@
13515
"zh-chs": "僅限英特爾®AMT,無代理",
13516
"xloc": [
13517
"default-mobile.handlebars->9->378",
13518
- "default.handlebars->27->1136",
13519
- "default.handlebars->27->1162"
13518
+ "default.handlebars->27->1138",
13519
+ "default.handlebars->27->1164"
13520
]
13521
},
13522
{
@@ -13551,7 +13551,7 @@
13551
"zh-chs": "英特爾®主動管理技術(英特爾®AMT)",
13552
"xloc": [
13553
"default-mobile.handlebars->9->355",
13554
- "default.handlebars->27->837"
13554
+ "default.handlebars->27->839"
13555
]
13556
},
13557
{
@@ -13718,7 +13718,7 @@
13718
"ru": "Интерактивный",
13719
"zh-chs": "互動",
13720
"xloc": [
13721
- "default.handlebars->27->732"
13721
+ "default.handlebars->27->734"
13722
]
13723
},
13724
{
@@ -13735,8 +13735,8 @@
13735
"ru": "Только интерактивный режим",
13736
"zh-chs": "僅限互動",
13737
"xloc": [
13738
- "default.handlebars->27->1346",
13739
- "default.handlebars->27->1353",
13738
+ "default.handlebars->27->1348",
13739
+ "default.handlebars->27->1355",
13740
"default.handlebars->27->312",
13741
"default.handlebars->27->334"
13742
]
@@ -13772,7 +13772,7 @@
13772
"ru": "Инуктитут",
13773
"zh-chs": "因紐特人",
13774
"xloc": [
13775
- "default.handlebars->27->992"
13775
+ "default.handlebars->27->994"
13776
]
13777
},
13778
{
@@ -13789,7 +13789,7 @@
13789
"ru": "Некорректный тип группы устройств",
13790
"zh-chs": "無效的設備組類型",
13791
"xloc": [
13792
- "default.handlebars->27->1749"
13792
+ "default.handlebars->27->1751"
13793
]
13794
},
13795
{
@@ -13806,7 +13806,7 @@
13806
"ru": "Некорректный JSON",
13807
"zh-chs": "無效的JSON",
13808
"xloc": [
13809
- "default.handlebars->27->1743"
13809
+ "default.handlebars->27->1745"
13810
]
13811
},
13812
{
@@ -13823,8 +13823,8 @@
13823
"ru": "Некорректный формат файла JSON.",
13824
"zh-chs": "無效的JSON文件格式。",
13825
"xloc": [
13826
- "default.handlebars->27->1470",
13827
- "default.handlebars->27->1472"
13826
+ "default.handlebars->27->1472",
13827
+ "default.handlebars->27->1474"
13828
]
13829
},
13830
{
@@ -13841,7 +13841,7 @@
13841
"ru": "Некорректный файл JSON: {0}.",
13842
"zh-chs": "無效的JSON文件:{0}。",
13843
"xloc": [
13844
- "default.handlebars->27->1468"
13844
+ "default.handlebars->27->1470"
13845
]
13846
},
13847
{
@@ -13858,7 +13858,7 @@
13858
"ru": "Некорректная сигнатура PKCS",
13859
"zh-chs": "無效的PKCS簽名",
13860
"xloc": [
13861
- "default.handlebars->27->1741"
13861
+ "default.handlebars->27->1743"
13862
]
13863
},
13864
{
@@ -13875,7 +13875,7 @@
13875
"ru": "Некорректная сигнатура RSA",
13876
"zh-chs": "無效的RSA密碼",
13877
"xloc": [
13878
- "default.handlebars->27->1742"
13878
+ "default.handlebars->27->1744"
13879
]
13880
},
13881
{
@@ -14011,7 +14011,7 @@
14011
"ru": "Коды приглашений могут использоваться любым пользователем для присоединения устройств к этой группе устройств по следующей общедоступной ссылке:",
14012
"zh-chs": "任何人都可以使用邀請代碼通過以下公共鏈接將設備加入該設備組:",
14013
"xloc": [
14014
- "default.handlebars->27->1348"
14014
+ "default.handlebars->27->1350"
14015
]
14016
},
14017
{
@@ -14044,7 +14044,7 @@
14044
"ru": "Пригласить",
14045
"zh-chs": "邀請",
14046
"xloc": [
14047
- "default.handlebars->27->1212",
14047
+ "default.handlebars->27->1214",
14048
"default.handlebars->27->244",
14049
"default.handlebars->27->324"
14050
]
@@ -14063,11 +14063,11 @@
14063
"ru": "Пригласительные коды",
14064
"zh-chs": "邀請碼",
14065
"xloc": [
14066
- "default.handlebars->27->1190",
14067
- "default.handlebars->27->1342",
14068
- "default.handlebars->27->1347",
14066
+ "default.handlebars->27->1192",
14067
+ "default.handlebars->27->1344",
14068
"default.handlebars->27->1349",
14070
- "default.handlebars->27->1354"
14069
+ "default.handlebars->27->1351",
14070
+ "default.handlebars->27->1356"
14071
]
14072
},
14073
{
@@ -14098,7 +14098,7 @@
14098
"nl": "Nodig iemand uit om de mesh-agent in deze apparaatgroep te installeren.",
14099
"zh-chs": "邀请某人在该设备组上安装网状代理。",
14100
"xloc": [
14101
- "default.handlebars->27->1211",
14101
+ "default.handlebars->27->1213",
14102
"default.handlebars->27->243"
14103
]
14104
},
@@ -14133,7 +14133,7 @@
14133
"ru": "Ирландский",
14134
"zh-chs": "愛爾蘭人",
14135
"xloc": [
14136
- "default.handlebars->27->993"
14136
+ "default.handlebars->27->995"
14137
]
14138
},
14139
{
@@ -14150,7 +14150,7 @@
14150
"ru": "Итальянский (Стандартный)",
14151
"zh-chs": "意大利語(標準)",
14152
"xloc": [
14153
- "default.handlebars->27->994"
14153
+ "default.handlebars->27->996"
14154
]
14155
},
14156
{
@@ -14167,7 +14167,7 @@
14167
"ru": "Итальянский (Швейцария)",
14168
"zh-chs": "義大利文(瑞士)",
14169
"xloc": [
14170
- "default.handlebars->27->995"
14170
+ "default.handlebars->27->997"
14171
]
14172
},
14173
{
@@ -14184,8 +14184,8 @@
14184
"ru": "Формат JSON",
14185
"zh-chs": "JSON格式",
14186
"xloc": [
14187
- "default.handlebars->27->1417",
14188
- "default.handlebars->27->1476",
14187
+ "default.handlebars->27->1419",
14188
+ "default.handlebars->27->1478",
14189
"default.handlebars->27->415"
14190
]
14191
},
@@ -14203,7 +14203,7 @@
14203
"ru": "Японский",
14204
"zh-chs": "日本",
14205
"xloc": [
14206
- "default.handlebars->27->996"
14206
+ "default.handlebars->27->998"
14207
]
14208
},
14209
{
@@ -14220,7 +14220,7 @@
14220
"ru": "Каннада",
14221
"zh-chs": "卡納達語",
14222
"xloc": [
14223
- "default.handlebars->27->997"
14223
+ "default.handlebars->27->999"
14224
]
14225
},
14226
{
@@ -14237,7 +14237,7 @@
14237
"ru": "Кашмирский",
14238
"zh-chs": "克什米爾語",
14239
"xloc": [
14240
- "default.handlebars->27->998"
14240
+ "default.handlebars->27->1000"
14241
]
14242
},
14243
{
@@ -14254,7 +14254,7 @@
14254
"ru": "Казахский",
14255
"zh-chs": "哈薩克語",
14256
"xloc": [
14257
- "default.handlebars->27->999"
14257
+ "default.handlebars->27->1001"
14258
]
14259
},
14260
{
@@ -14271,7 +14271,7 @@
14271
"ru": "Драйвер ядра",
14272
"zh-chs": "內核驅動程序",
14273
"xloc": [
14274
- "default.handlebars->27->733"
14274
+ "default.handlebars->27->735"
14275
]
14276
},
14277
{
@@ -14288,8 +14288,8 @@
14288
"ru": "Имя ключа",
14289
"zh-chs": "鍵名",
14290
"xloc": [
14291
- "default.handlebars->27->890",
14292
- "default.handlebars->27->893"
14291
+ "default.handlebars->27->892",
14292
+ "default.handlebars->27->895"
14293
]
14294
},
14295
{
@@ -14330,7 +14330,7 @@
14330
"ru": "Кхмерский",
14331
"zh-chs": "高棉語",
14332
"xloc": [
14333
- "default.handlebars->27->1000"
14333
+ "default.handlebars->27->1002"
14334
]
14335
},
14336
{
@@ -14347,7 +14347,7 @@
14347
"ru": "Киргизский",
14348
"zh-chs": "吉爾吉斯",
14349
"xloc": [
14350
- "default.handlebars->27->1001"
14350
+ "default.handlebars->27->1003"
14351
]
14352
},
14353
{
@@ -14364,7 +14364,7 @@
14364
"ru": "Клингонский",
14365
"zh-chs": "克林貢",
14366
"xloc": [
14367
- "default.handlebars->27->1002"
14367
+ "default.handlebars->27->1004"
14368
]
14369
},
14370
{
@@ -14382,7 +14382,7 @@
14382
"zh-chs": "已知的",
14383
"xloc": [
14384
"default-mobile.handlebars->9->354",
14385
- "default.handlebars->27->836"
14385
+ "default.handlebars->27->838"
14386
]
14387
},
14388
{
@@ -14399,7 +14399,7 @@
14399
"ru": "Korean",
14400
"zh-chs": "韓語",
14401
"xloc": [
14402
- "default.handlebars->27->1003"
14402
+ "default.handlebars->27->1005"
14403
]
14404
},
14405
{
@@ -14416,7 +14416,7 @@
14416
"ru": "Корейский (Северная Корея)",
14417
"zh-chs": "韓語(朝鮮)",
14418
"xloc": [
14419
- "default.handlebars->27->1004"
14419
+ "default.handlebars->27->1006"
14420
]
14421
},
14422
{
@@ -14433,7 +14433,7 @@
14433
"ru": "Корейский (Южная Корея)",
14434
"zh-chs": "韓語(韓國)",
14435
"xloc": [
14436
- "default.handlebars->27->1005"
14436
+ "default.handlebars->27->1007"
14437
]
14438
},
14439
{
@@ -14450,8 +14450,8 @@
14450
"ru": "LF",
14451
"zh-chs": "如果",
14452
"xloc": [
14453
- "default.handlebars->27->745",
14454
- "default.handlebars->27->754"
14453
+ "default.handlebars->27->747",
14454
+ "default.handlebars->27->756"
14455
]
14456
},
14457
{
@@ -14468,7 +14468,7 @@
14468
"ru": "Язык",
14469
"zh-chs": "語言",
14470
"xloc": [
14471
- "default.handlebars->27->1099"
14471
+ "default.handlebars->27->1101"
14472
]
14473
},
14474
{
@@ -14502,7 +14502,7 @@
14502
"ru": "Большой Фокус",
14503
"zh-chs": "大焦點",
14504
"xloc": [
14505
- "default.handlebars->27->721"
14505
+ "default.handlebars->27->723"
14506
]
14507
},
14508
{
@@ -14685,7 +14685,7 @@
14685
"ru": "Последний доступ",
14686
"zh-chs": "最後訪問",
14687
"xloc": [
14688
- "default.handlebars->27->1425"
14688
+ "default.handlebars->27->1427"
14689
]
14690
},
14691
{
@@ -14702,7 +14702,7 @@
14702
"ru": "Последний вход в систему",
14703
"zh-chs": "上次登錄",
14704
"xloc": [
14705
- "default.handlebars->27->1606"
14705
+ "default.handlebars->27->1608"
14706
]
14707
},
14708
{
@@ -14725,9 +14725,9 @@
14725
"default.handlebars->27->70",
14726
"default.handlebars->27->72",
14727
"default.handlebars->27->74",
14728
- "default.handlebars->27->808",
14729
- "default.handlebars->27->809",
14730
- "default.handlebars->27->810"
14728
+ "default.handlebars->27->810",
14729
+ "default.handlebars->27->811",
14730
+ "default.handlebars->27->812"
14731
]
14732
},
14733
{
@@ -14747,8 +14747,8 @@
14747
"default-mobile.handlebars->9->323",
14748
"default-mobile.handlebars->9->325",
14749
"default.handlebars->27->69",
14750
- "default.handlebars->27->805",
14751
- "default.handlebars->27->807"
14750
+ "default.handlebars->27->807",
14751
+ "default.handlebars->27->809"
14752
]
14753
},
14754
{
@@ -14765,7 +14765,7 @@
14765
"ru": "Последнее изменение: {0}",
14766
"zh-chs": "上次更改:{0}",
14767
"xloc": [
14768
- "default.handlebars->27->1610"
14768
+ "default.handlebars->27->1612"
14769
]
14770
},
14771
{
@@ -14816,7 +14816,7 @@
14816
"ru": "Последний вход в систему: {0}",
14817
"zh-chs": "上次登錄:{0}",
14818
"xloc": [
14819
- "default.handlebars->27->1435"
14819
+ "default.handlebars->27->1437"
14820
]
14821
},
14822
{
@@ -14833,7 +14833,7 @@
14833
"ru": "Последнее посещение:",
14834
"zh-chs": "最後一次露面:",
14835
"xloc": [
14836
- "default.handlebars->27->578",
14836
+ "default.handlebars->27->580",
14837
"default.handlebars->27->65"
14838
]
14839
},
@@ -14902,7 +14902,7 @@
14902
"ru": "Латинский",
14903
"zh-chs": "拉丁",
14904
"xloc": [
14905
- "default.handlebars->27->1006"
14905
+ "default.handlebars->27->1008"
14906
]
14907
},
14908
{
@@ -14919,7 +14919,13 @@
14919
"ru": "Латышский",
14920
"zh-chs": "拉脫維亞語",
14921
"xloc": [
14922
- "default.handlebars->27->1007"
14922
+ "default.handlebars->27->1009"
14923
+ ]
14924
+ },
14925
+ {
14926
+ "en": "Launch RDP session to this device",
14927
+ "xloc": [
14928
+ "default.handlebars->27->568"
14929
]
14930
},
14931
{
@@ -14939,7 +14945,7 @@
14945
"nl": "Leeg laten voor geen.",
14946
"zh-chs": "一无所有。",
14947
"xloc": [
14942
- "default.handlebars->27->1650"
14948
+ "default.handlebars->27->1652"
14949
]
14950
},
14951
{
@@ -14978,7 +14984,7 @@
14984
"ru": "Меньше",
14985
"zh-chs": "減",
14986
"xloc": [
14981
- "default.handlebars->27->1811"
14987
+ "default.handlebars->27->1813"
14988
]
14989
},
14990
{
@@ -14994,8 +15000,8 @@
15000
"ru": "Предельные события",
15001
"zh-chs": "极限赛事",
15002
"xloc": [
14997
- "default.handlebars->27->599",
14998
- "default.handlebars->27->618"
15003
+ "default.handlebars->27->601",
15004
+ "default.handlebars->27->620"
15005
]
15006
},
15007
{
@@ -15031,9 +15037,9 @@
15037
"zh-chs": "有限輸入",
15038
"xloc": [
15039
"default-mobile.handlebars->9->427",
15034
- "default.handlebars->27->1326",
15035
- "default.handlebars->27->592",
15036
- "default.handlebars->27->611"
15040
+ "default.handlebars->27->1328",
15041
+ "default.handlebars->27->594",
15042
+ "default.handlebars->27->613"
15043
]
15044
},
15045
{
@@ -15051,7 +15057,7 @@
15057
"zh-chs": "僅限於輸入",
15058
"xloc": [
15059
"default-mobile.handlebars->9->402",
15054
- "default.handlebars->27->1284"
15060
+ "default.handlebars->27->1286"
15061
]
15062
},
15063
{
@@ -15224,7 +15230,7 @@
15230
"ru": "Linux ARM, Raspberry Pi (32bit)",
15231
"zh-chs": "Linux ARM,Raspberry Pi(32位)",
15232
"xloc": [
15227
- "default.handlebars->27->679"
15233
+ "default.handlebars->27->681"
15234
]
15235
},
15236
{
@@ -15330,7 +15336,7 @@
15336
"ru": "Linux x86 (32bit)",
15337
"zh-chs": "Linux x86(32位)",
15338
"xloc": [
15333
- "default.handlebars->27->676"
15339
+ "default.handlebars->27->678"
15340
]
15341
},
15342
{
@@ -15347,7 +15353,7 @@
15353
"ru": "Linux x86 (64bit)",
15354
"zh-chs": "Linux x86(64位)",
15355
"xloc": [
15350
- "default.handlebars->27->677"
15356
+ "default.handlebars->27->679"
15357
]
15358
},
15359
{
@@ -15382,7 +15388,7 @@
15388
"ru": "Литовский",
15389
"zh-chs": "立陶宛語",
15390
"xloc": [
15385
- "default.handlebars->27->1008"
15391
+ "default.handlebars->27->1010"
15392
]
15393
},
15394
{
@@ -15400,10 +15406,10 @@
15406
"zh-chs": "載入中...",
15407
"xloc": [
15408
"default-mobile.handlebars->9->72",
15403
- "default.handlebars->27->1153",
15404
- "default.handlebars->27->1157",
15405
- "default.handlebars->27->668",
15406
- "default.handlebars->27->886"
15409
+ "default.handlebars->27->1155",
15410
+ "default.handlebars->27->1159",
15411
+ "default.handlebars->27->670",
15412
+ "default.handlebars->27->888"
15413
]
15414
},
15415
{
@@ -15471,7 +15477,7 @@
15477
"ru": "Настройки локализации",
15478
"zh-chs": "本地化設置",
15479
"xloc": [
15474
- "default.handlebars->27->1102",
15480
+ "default.handlebars->27->1104",
15481
"default.handlebars->container->column_l->p2->p2info->p2AccountActions->3->7"
15482
]
15483
},
@@ -15523,7 +15529,7 @@
15529
"ru": "Заблокировать учетную запись",
15530
"zh-chs": "鎖定賬戶",
15531
"xloc": [
15526
- "default.handlebars->27->1511"
15532
+ "default.handlebars->27->1513"
15533
]
15534
},
15535
{
@@ -15540,7 +15546,7 @@
15546
"ru": "Заблокировать учетную запись",
15547
"zh-chs": "鎖定賬戶",
15548
"xloc": [
15543
- "default.handlebars->27->1453"
15549
+ "default.handlebars->27->1455"
15550
]
15551
},
15552
{
@@ -15557,7 +15563,7 @@
15563
"ru": "Заблокирован",
15564
"zh-chs": "已鎖定",
15565
"xloc": [
15560
- "default.handlebars->27->1436"
15566
+ "default.handlebars->27->1438"
15567
]
15568
},
15569
{
@@ -15574,7 +15580,7 @@
15580
"ru": "Заблокированная учетная запись",
15581
"zh-chs": "賬戶鎖定",
15582
"xloc": [
15577
- "default.handlebars->27->1585"
15583
+ "default.handlebars->27->1587"
15584
]
15585
},
15586
{
@@ -15761,7 +15767,7 @@
15767
"ru": "Люксембургский",
15768
"zh-chs": "盧森堡語",
15769
"xloc": [
15764
- "default.handlebars->27->1009"
15770
+ "default.handlebars->27->1011"
15771
]
15772
},
15773
{
@@ -15780,8 +15786,8 @@
15786
"xloc": [
15787
"default-mobile.handlebars->9->331",
15788
"default-mobile.handlebars->9->333",
15783
- "default.handlebars->27->813",
15784
- "default.handlebars->27->815"
15789
+ "default.handlebars->27->815",
15790
+ "default.handlebars->27->817"
15791
]
15792
},
15793
{
@@ -15816,7 +15822,7 @@
15822
"zh-chs": "MAC:{0}",
15823
"xloc": [
15824
"default-mobile.handlebars->9->334",
15819
- "default.handlebars->27->816"
15825
+ "default.handlebars->27->818"
15826
]
15827
},
15828
{
@@ -15834,7 +15840,7 @@
15840
"zh-chs": "MAC:{0},網關:{1}",
15841
"xloc": [
15842
"default-mobile.handlebars->9->332",
15837
- "default.handlebars->27->814"
15843
+ "default.handlebars->27->816"
15844
]
15845
},
15846
{
@@ -15892,8 +15898,8 @@
15898
"default.handlebars->27->187",
15899
"default.handlebars->27->393",
15900
"default.handlebars->27->537",
15895
- "default.handlebars->27->864",
15896
- "default.handlebars->27->865",
15901
+ "default.handlebars->27->866",
15902
+ "default.handlebars->27->867",
15903
"default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->3"
15904
]
15905
},
@@ -15928,7 +15934,7 @@
15934
"ru": "MQTT Вход",
15935
"zh-chs": "MQTT登錄",
15936
"xloc": [
15931
- "default.handlebars->27->569"
15937
+ "default.handlebars->27->571"
15938
]
15939
},
15940
{
@@ -15946,7 +15952,7 @@
15952
"zh-chs": "MQTT通道已連接",
15953
"xloc": [
15954
"default-mobile.handlebars->9->246",
15949
- "default.handlebars->27->577"
15955
+ "default.handlebars->27->579"
15956
]
15957
},
15958
{
@@ -15964,7 +15970,7 @@
15970
"zh-chs": "MQTT已連接",
15971
"xloc": [
15972
"default.handlebars->27->147",
15967
- "default.handlebars->27->576"
15973
+ "default.handlebars->27->578"
15974
]
15975
},
15976
{
@@ -16003,6 +16009,12 @@
16009
"default.handlebars->27->151"
16010
]
16011
},
16012
+ {
16013
+ "en": "MSTSC",
16014
+ "xloc": [
16015
+ "default.handlebars->27->569"
16016
+ ]
16017
+ },
16018
{
16019
"cs": "macOS",
16020
"de": "MacOS",
@@ -16034,7 +16046,7 @@
16046
"ru": "MacOS (64bit)",
16047
"zh-chs": "MacOS(64位)",
16048
"xloc": [
16037
- "default.handlebars->27->678"
16049
+ "default.handlebars->27->680"
16050
]
16051
},
16052
{
@@ -16087,7 +16099,7 @@
16099
"ru": "Сообщения главного сервера",
16100
"zh-chs": "主服務器消息",
16101
"xloc": [
16090
- "default.handlebars->27->1783"
16102
+ "default.handlebars->27->1785"
16103
]
16104
},
16105
{
@@ -16104,7 +16116,7 @@
16116
"ru": "Малайский",
16117
"zh-chs": "馬來語",
16118
"xloc": [
16107
- "default.handlebars->27->1011"
16119
+ "default.handlebars->27->1013"
16120
]
16121
},
16122
{
@@ -16121,7 +16133,7 @@
16133
"ru": "Малаяламский",
16134
"zh-chs": "馬拉雅拉姆語",
16135
"xloc": [
16124
- "default.handlebars->27->1012"
16136
+ "default.handlebars->27->1014"
16137
]
16138
},
16139
{
@@ -16138,7 +16150,7 @@
16150
"ru": "Мальтийский",
16151
"zh-chs": "馬耳他語",
16152
"xloc": [
16141
- "default.handlebars->27->1013"
16153
+ "default.handlebars->27->1015"
16154
]
16155
},
16156
{
@@ -16175,8 +16187,8 @@
16187
"xloc": [
16188
"default-mobile.handlebars->9->399",
16189
"default-mobile.handlebars->9->417",
16178
- "default.handlebars->27->1281",
16179
- "default.handlebars->27->1315"
16190
+ "default.handlebars->27->1283",
16191
+ "default.handlebars->27->1317"
16192
]
16193
},
16194
{
@@ -16195,8 +16207,8 @@
16207
"xloc": [
16208
"default-mobile.handlebars->9->398",
16209
"default-mobile.handlebars->9->416",
16198
- "default.handlebars->27->1280",
16199
- "default.handlebars->27->1314"
16210
+ "default.handlebars->27->1282",
16211
+ "default.handlebars->27->1316"
16212
]
16213
},
16214
{
@@ -16212,14 +16224,14 @@
16224
"ru": "Управление устройствами",
16225
"zh-chs": "管理设备",
16226
"xloc": [
16215
- "default.handlebars->27->606"
16227
+ "default.handlebars->27->608"
16228
]
16229
},
16230
{
16231
"en": "Manage Recordings",
16232
"nl": "Beheeer opnames",
16233
"xloc": [
16222
- "default.handlebars->27->1510"
16234
+ "default.handlebars->27->1512"
16235
]
16236
},
16237
{
@@ -16253,7 +16265,7 @@
16265
"ru": "Управление группами пользователя",
16266
"zh-chs": "管理用戶組",
16267
"xloc": [
16256
- "default.handlebars->27->1509"
16268
+ "default.handlebars->27->1511"
16269
]
16270
},
16271
{
@@ -16270,8 +16282,8 @@
16282
"ru": "Управление пользователями",
16283
"zh-chs": "管理用戶",
16284
"xloc": [
16273
- "default.handlebars->27->1508",
16274
- "default.handlebars->27->605"
16285
+ "default.handlebars->27->1510",
16286
+ "default.handlebars->27->607"
16287
]
16288
},
16289
{
@@ -16375,7 +16387,7 @@
16387
"ru": "Управление с помощью программного агента",
16388
"zh-chs": "使用軟件代理進行管理",
16389
"xloc": [
16378
- "default.handlebars->27->1135"
16390
+ "default.handlebars->27->1137"
16391
]
16392
},
16393
{
@@ -16393,7 +16405,7 @@
16405
"zh-chs": "使用軟件代理進行管理",
16406
"xloc": [
16407
"default-mobile.handlebars->9->379",
16396
- "default.handlebars->27->1163"
16408
+ "default.handlebars->27->1165"
16409
]
16410
},
16411
{
@@ -16410,7 +16422,7 @@
16422
"ru": "Менеджер",
16423
"zh-chs": "經理",
16424
"xloc": [
16413
- "default.handlebars->27->1441"
16425
+ "default.handlebars->27->1443"
16426
]
16427
},
16428
{
@@ -16461,7 +16473,7 @@
16473
"ru": "Маори",
16474
"zh-chs": "毛利人",
16475
"xloc": [
16464
- "default.handlebars->27->1014"
16476
+ "default.handlebars->27->1016"
16477
]
16478
},
16479
{
@@ -16496,7 +16508,7 @@
16508
"ru": "Маратхи",
16509
"zh-chs": "馬拉地語",
16510
"xloc": [
16499
- "default.handlebars->27->1015"
16511
+ "default.handlebars->27->1017"
16512
]
16513
},
16514
{
@@ -16513,7 +16525,7 @@
16525
"ru": "Достигнуто максимальное число сессий",
16526
"zh-chs": "達到的會話數上限",
16527
"xloc": [
16516
- "default.handlebars->27->1747"
16528
+ "default.handlebars->27->1749"
16529
]
16530
},
16531
{
@@ -16567,7 +16579,7 @@
16579
"ru": "Мегабайт",
16580
"zh-chs": "兆字節",
16581
"xloc": [
16570
- "default.handlebars->27->1773"
16582
+ "default.handlebars->27->1775"
16583
]
16584
},
16585
{
@@ -16585,8 +16597,8 @@
16597
"zh-chs": "記憶",
16598
"xloc": [
16599
"default-mobile.handlebars->9->370",
16588
- "default.handlebars->27->1764",
16589
- "default.handlebars->27->852",
16600
+ "default.handlebars->27->1766",
16601
+ "default.handlebars->27->854",
16602
"default.handlebars->container->column_l->p40->3->1->p40type->3"
16603
]
16604
},
@@ -16614,8 +16626,8 @@
16626
"default.handlebars->27->356",
16627
"default.handlebars->27->485",
16628
"default.handlebars->27->529",
16617
- "default.handlebars->27->804",
16618
- "default.handlebars->27->811"
16629
+ "default.handlebars->27->806",
16630
+ "default.handlebars->27->813"
16631
]
16632
},
16633
{
@@ -16633,7 +16645,7 @@
16645
"zh-chs": "網格代理控制台",
16646
"xloc": [
16647
"default-mobile.handlebars->9->406",
16636
- "default.handlebars->27->1289"
16648
+ "default.handlebars->27->1291"
16649
]
16650
},
16651
{
@@ -16705,8 +16717,8 @@
16717
"ru": "MeshAction (.txt)",
16718
"zh-chs": "MeshAction(.txt)",
16719
"xloc": [
16708
- "default.handlebars->27->685",
16709
- "default.handlebars->27->687"
16720
+ "default.handlebars->27->687",
16721
+ "default.handlebars->27->689"
16722
]
16723
},
16724
{
@@ -16723,7 +16735,7 @@
16735
"ru": "Трафик MeshAgent",
16736
"zh-chs": "MeshAgent流量",
16737
"xloc": [
16726
- "default.handlebars->27->1785"
16738
+ "default.handlebars->27->1787"
16739
]
16740
},
16741
{
@@ -16740,7 +16752,7 @@
16752
"ru": "Обновление MeshAgent",
16753
"zh-chs": "MeshAgent更新",
16754
"xloc": [
16743
- "default.handlebars->27->1786"
16755
+ "default.handlebars->27->1788"
16756
]
16757
},
16758
{
@@ -16774,7 +16786,7 @@
16786
"ru": "Ошибки MeshCentral",
16787
"zh-chs": "網格中心錯誤",
16788
"xloc": [
16777
- "default.handlebars->27->1156"
16789
+ "default.handlebars->27->1158"
16790
]
16791
},
16792
{
@@ -16791,7 +16803,7 @@
16803
"ru": "MeshCentral Router ",
16804
"zh-chs": "MeshCentral路由器",
16805
"xloc": [
16794
- "default.handlebars->27->673"
16806
+ "default.handlebars->27->675"
16807
]
16808
},
16809
{
@@ -16808,7 +16820,7 @@
16820
"ru": "MeshCentral Router это инструмент Windows для сопоставления портов TCP. Например, через этот сервер можно установить подключение по RDP к удаленному устройству.",
16821
"zh-chs": "MeshCentral Router是Windows工具,用於TCP端口映射。例如,您可以通過該服務器將RDP放入遠程設備。",
16822
"xloc": [
16811
- "default.handlebars->27->669"
16823
+ "default.handlebars->27->671"
16824
]
16825
},
16826
{
@@ -16843,7 +16855,7 @@
16855
"ru": "Соединения сервера MeshCentral",
16856
"zh-chs": "MeshCentral服務器對等",
16857
"xloc": [
16846
- "default.handlebars->27->1784"
16858
+ "default.handlebars->27->1786"
16859
]
16860
},
16861
{
@@ -16878,7 +16890,7 @@
16890
"zh-chs": "MeshCentral版本",
16891
"xloc": [
16892
"default.handlebars->27->101",
16881
- "default.handlebars->27->1152",
16893
+ "default.handlebars->27->1154",
16894
"default.handlebars->27->99"
16895
]
16896
},
@@ -16898,7 +16910,7 @@
16910
"xloc": [
16911
"default.handlebars->27->202",
16912
"default.handlebars->27->557",
16901
- "default.handlebars->27->683"
16913
+ "default.handlebars->27->685"
16914
]
16915
},
16916
{
@@ -16915,7 +16927,7 @@
16927
"ru": "MeshCmd (Linux ARM, 32bit)",
16928
"zh-chs": "MeshCmd(Linux ARM,32位)",
16929
"xloc": [
16918
- "default.handlebars->27->694"
16930
+ "default.handlebars->27->696"
16931
]
16932
},
16933
{
@@ -16932,7 +16944,7 @@
16944
"ru": "MeshCmd (Linux x86, 32bit)",
16945
"zh-chs": "MeshCmd(Linux x86,32bit)",
16946
"xloc": [
16935
- "default.handlebars->27->691"
16947
+ "default.handlebars->27->693"
16948
]
16949
},
16950
{
@@ -16949,7 +16961,7 @@
16961
"ru": "MeshCmd (Linux x86, 64bit)",
16962
"zh-chs": "MeshCmd(Linux x86,64bit)",
16963
"xloc": [
16952
- "default.handlebars->27->692"
16964
+ "default.handlebars->27->694"
16965
]
16966
},
16967
{
@@ -16966,7 +16978,7 @@
16978
"ru": "MeshCmd (MacOS, 64bit)",
16979
"zh-chs": "MeshCmd(MacOS,64位)",
16980
"xloc": [
16969
- "default.handlebars->27->693"
16981
+ "default.handlebars->27->695"
16982
]
16983
},
16984
{
@@ -16983,7 +16995,7 @@
16995
"ru": "MeshCmd (приложение Win32)",
16996
"zh-chs": "MeshCmd(Win32可執行文件)",
16997
"xloc": [
16986
- "default.handlebars->27->689"
16998
+ "default.handlebars->27->691"
16999
]
17000
},
17001
{
@@ -17000,7 +17012,7 @@
17012
"ru": "MeshCmd (приложение Win64)",
17013
"zh-chs": "MeshCmd(Win64可執行文件)",
17014
"xloc": [
17003
- "default.handlebars->27->690"
17015
+ "default.handlebars->27->692"
17016
]
17017
},
17018
{
@@ -17017,7 +17029,7 @@
17029
"ru": "MeshCmd это утилита с командной строкой, которая позволяет выполнить множество операций. Файл с командами может быть опционально скачан и отредактирован для указания информации о сервере и учетных данных.",
17030
"zh-chs": "MeshCmd是執行許多不同操作的命令行工具。可以選擇下載和編輯操作文件以提供服務器信息和憑據。",
17031
"xloc": [
17020
- "default.handlebars->27->680"
17032
+ "default.handlebars->27->682"
17033
]
17034
},
17035
{
@@ -17090,7 +17102,7 @@
17102
"xloc": [
17103
"default.handlebars->27->313",
17104
"default.handlebars->27->546",
17093
- "default.handlebars->27->649"
17105
+ "default.handlebars->27->651"
17106
]
17107
},
17108
{
@@ -17107,7 +17119,7 @@
17119
"ru": "Диспетчер сообщения",
17120
"zh-chs": "郵件調度程序",
17121
"xloc": [
17110
- "default.handlebars->27->1782"
17122
+ "default.handlebars->27->1784"
17123
]
17124
},
17125
{
@@ -17205,7 +17217,7 @@
17217
"zh-chs": "模型",
17218
"xloc": [
17219
"default-mobile.handlebars->9->371",
17208
- "default.handlebars->27->853"
17220
+ "default.handlebars->27->855"
17221
]
17222
},
17223
{
@@ -17239,7 +17251,7 @@
17251
"ru": "Молдавский",
17252
"zh-chs": "摩爾達維亞人",
17253
"xloc": [
17242
- "default.handlebars->27->1016"
17254
+ "default.handlebars->27->1018"
17255
]
17256
},
17257
{
@@ -17256,7 +17268,7 @@
17268
"ru": "Еще",
17269
"zh-chs": "更多",
17270
"xloc": [
17259
- "default.handlebars->27->1810"
17271
+ "default.handlebars->27->1812"
17272
]
17273
},
17274
{
@@ -17274,7 +17286,7 @@
17286
"zh-chs": "母板",
17287
"xloc": [
17288
"default-mobile.handlebars->9->366",
17277
- "default.handlebars->27->848"
17289
+ "default.handlebars->27->850"
17290
]
17291
},
17292
{
@@ -17332,7 +17344,7 @@
17344
"en": "Multiplexor",
17345
"nl": "Multiplexor",
17346
"xloc": [
17335
- "default.handlebars->27->1725"
17347
+ "default.handlebars->27->1727"
17348
]
17349
},
17350
{
@@ -17447,7 +17459,7 @@
17459
"ru": "Консоль моего сервера",
17460
"zh-chs": "我的服務器控制台",
17461
"xloc": [
17450
- "default.handlebars->27->859"
17462
+ "default.handlebars->27->861"
17463
]
17464
},
17465
{
@@ -17575,8 +17587,8 @@
17587
"ru": "Мой ключ",
17588
"zh-chs": "我的鑰匙",
17589
"xloc": [
17578
- "default.handlebars->27->891",
17579
- "default.handlebars->27->894"
17590
+ "default.handlebars->27->893",
17591
+ "default.handlebars->27->896"
17592
]
17593
},
17594
{
@@ -17600,20 +17612,20 @@
17612
"default-mobile.handlebars->9->393",
17613
"default-mobile.handlebars->9->97",
17614
"default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea3->deskarea3x->DeskTools->5->1->1",
17603
- "default.handlebars->27->1133",
17604
- "default.handlebars->27->1164",
17605
- "default.handlebars->27->1247",
17606
- "default.handlebars->27->1423",
17607
- "default.handlebars->27->1516",
17608
- "default.handlebars->27->1532",
17609
- "default.handlebars->27->1539",
17610
- "default.handlebars->27->1572",
17611
- "default.handlebars->27->1591",
17615
+ "default.handlebars->27->1135",
17616
+ "default.handlebars->27->1166",
17617
+ "default.handlebars->27->1249",
17618
+ "default.handlebars->27->1425",
17619
+ "default.handlebars->27->1518",
17620
+ "default.handlebars->27->1534",
17621
+ "default.handlebars->27->1541",
17622
+ "default.handlebars->27->1574",
17623
+ "default.handlebars->27->1593",
17624
"default.handlebars->27->473",
17613
- "default.handlebars->27->727",
17625
+ "default.handlebars->27->729",
This file is too large to show in full.
views/default.handlebars
+18
-2
@@ -2195,13 +2195,19 @@
2195
var newWindow = window.open(rdpurl, '_blank');
2196
newWindow.opener = null;
2197
}
2198
- }
2199
- if (message.tag == 'novnc') {
2198
+ } else if (message.tag == 'novnc') {
2199
var vncurl = window.location.origin + domainUrl + 'novnc/vnc.html?ws=wss%3A%2F%2F' + window.location.host + '%2Fmeshrelay.ashx%3Fauth%3D' + message.cookie + '&show_dot=1';
2200
var node = getNodeFromId(message.nodeid);
2201
if (node != null) { vncurl += '&name=' + encodeURIComponentEx(node.name); }
2202
var newWindow = window.open(vncurl, 'mcnovnc/' + message.nodeid);
2203
newWindow.opener = null;
2204
+ } else if (message.tag == 'mstsc') {
2205
+ //var rdpurl = window.location.origin + domainUrl + 'mstsc/index.html?ws=wss%3A%2F%2F' + window.location.host + '%2Fmeshrelay.ashx%3Fauth%3D' + message.cookie;
2206
+ var rdpurl = window.location.origin + domainUrl + 'mstsc/index.html?ws=' + message.cookie;
2207
+ var node = getNodeFromId(message.nodeid);
2208
+ if (node != null) { rdpurl += '&name=' + encodeURIComponentEx(node.name); }
2209
+ var newWindow = window.open(rdpurl, 'mcmstsc/' + message.nodeid);
2210
+ newWindow.opener = null;
2211
}
2212
break;
2213
}
@@ -5367,6 +5373,11 @@
5373
x += '<a href=# cmenu=rfbPortContextMenu id=rfbLink onclick=p10rfb("' + node._id + '") title="' + "Launch noVNC session to this device" + '.">' + "noVNC" + '</a> ';
5374
}
5375
5376
+ // MSTSC.js link
5377
+ if (((connectivity & 1) != 0) && (node.agent) && ((meshrights & 8) != 0) && ((features & 0x40000000) == 0)) {
5378
+ x += '<a href=# cmenu=rfbPortContextMenu id=mstscLink onclick=p10mstsc("' + node._id + '") title="' + "Launch RDP session to this device" + '.">' + "MSTSC" + '</a> ';
5379
+ }
5380
+
5381
// MQTT options
5382
if ((meshrights == 0xFFFFFFFF) && (features & 0x00400000)) { x += '<a href=# onclick=p10showMqttLoginDialog("' + node._id + '") title="' + "Get MQTT login credentials for this device." + '">' + "MQTT Login" + '</a> '; }
5383
x += '</div><br>'
@@ -5880,6 +5891,11 @@
5891
meshserver.send({ action: 'getcookie', nodeid: nodeid, tcpport: port, tag: 'novnc' });
5892
}
5893
5894
+ function p10mstsc(nodeid, port) {
5895
+ if (port == null) { if (currentNode.rdpport != null) { port = currentNode.rdpport; } else { port = 3389; } }
5896
+ meshserver.send({ action: 'getcookie', nodeid: nodeid, tcpport: port, tag: 'mstsc' });
5897
+ }
5898
+
5899
// Show current location
5900
var d2map = null;
5901
function p10showNodeLocationDialog() {
webserver.js
+10
@@ -2157,6 +2157,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
2157
if (domain.sessionrecording != null) { features += 0x08000000; } // Server recordings enabled
2158
if (domain.urlswitching === false) { features += 0x10000000; } // Disables the URL switching feature
2159
if (domain.novnc === false) { features += 0x20000000; } // Disables noVNC
2160
+ if (domain.mstsc !== true) { features += 0x40000000; } // Disables MSTSC.js
2161
2162
// Create a authentication cookie
2163
const authCookie = obj.parent.encodeCookie({ userid: user._id, domainid: domain.id, ip: req.clientIp }, obj.parent.loginCookieEncryptionKey);
@@ -4342,6 +4343,15 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4343
obj.app.get(url + 'pluginHandler.js', obj.handlePluginJS);
4344
}
4345
4346
+ // Setup MSTSC.js if needed
4347
+ if (domain.mstsc === true) {
4348
+ obj.app.ws(url + 'mstsc/relay.ashx', function (ws, req) {
4349
+ PerformWSSessionAuth(ws, req, false, function (ws1, req1, domain, user) {
4350
+ require('./mstsc.js').CreateMstscRelay(obj, obj.db, ws1, req1, obj.args, domain, user);
4351
+ });
4352
+ });
4353
+ }
4354
+
4355
// Setup auth strategies using passport if needed
4356
if (typeof domain.authstrategies == 'object') {
4357
const passport = domain.passport = require('passport');