Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1070)

Side by Side Diff: test/mjsunit/asm/embenchen/fasta.js

Issue 704653004: Add test cases based on the programs from the Embenchen benchmark suite. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Mark certain tests as slow. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/mjsunit/asm/embenchen/fannkuch.js ('k') | test/mjsunit/asm/embenchen/memops.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 var EXPECTED_OUTPUT =
6 'GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA\n' +
7 'TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT\n' +
8 'AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG\n' +
9 'GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG\n' +
10 'CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT\n' +
11 'GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA\n' +
12 'GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA\n' +
13 'TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG\n' +
14 'AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA\n' +
15 'GCCTGGGCGA\n';
16 var Module = {
17 arguments: [1],
18 print: function(x) {Module.printBuffer += x + '\n';},
19 preRun: [function() {Module.printBuffer = ''}],
20 postRun: [function() {
21 assertEquals(EXPECTED_OUTPUT, Module.printBuffer);
22 }],
23 };
24 // The Module object: Our interface to the outside world. We import
25 // and export values on it, and do the work to get that through
26 // closure compiler if necessary. There are various ways Module can be used:
27 // 1. Not defined. We create it here
28 // 2. A function parameter, function(Module) { ..generated code.. }
29 // 3. pre-run appended it, var Module = {}; ..generated code..
30 // 4. External script tag defines var Module.
31 // We need to do an eval in order to handle the closure compiler
32 // case, where this code here is minified but Module was defined
33 // elsewhere (e.g. case 4 above). We also need to check if Module
34 // already exists (e.g. case 3 above).
35 // Note that if you want to run closure, and also to use Module
36 // after the generated code, you will need to define var Module = {};
37 // before the code. Then that object will be used in the code, and you
38 // can continue to use Module afterwards as well.
39 var Module;
40 if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {};
41
42 // Sometimes an existing Module object exists with properties
43 // meant to overwrite the default module functionality. Here
44 // we collect those properties and reapply _after_ we configure
45 // the current environment's defaults to avoid having to be so
46 // defensive during initialization.
47 var moduleOverrides = {};
48 for (var key in Module) {
49 if (Module.hasOwnProperty(key)) {
50 moduleOverrides[key] = Module[key];
51 }
52 }
53
54 // The environment setup code below is customized to use Module.
55 // *** Environment setup code ***
56 var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'fun ction';
57 var ENVIRONMENT_IS_WEB = typeof window === 'object';
58 var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
59 var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIR ONMENT_IS_WORKER;
60
61 if (ENVIRONMENT_IS_NODE) {
62 // Expose functionality in the same simple way that the shells work
63 // Note that we pollute the global namespace here, otherwise we break in node
64 if (!Module['print']) Module['print'] = function print(x) {
65 process['stdout'].write(x + '\n');
66 };
67 if (!Module['printErr']) Module['printErr'] = function printErr(x) {
68 process['stderr'].write(x + '\n');
69 };
70
71 var nodeFS = require('fs');
72 var nodePath = require('path');
73
74 Module['read'] = function read(filename, binary) {
75 filename = nodePath['normalize'](filename);
76 var ret = nodeFS['readFileSync'](filename);
77 // The path is absolute if the normalized version is the same as the resolve d.
78 if (!ret && filename != nodePath['resolve'](filename)) {
79 filename = path.join(__dirname, '..', 'src', filename);
80 ret = nodeFS['readFileSync'](filename);
81 }
82 if (ret && !binary) ret = ret.toString();
83 return ret;
84 };
85
86 Module['readBinary'] = function readBinary(filename) { return Module['read'](f ilename, true) };
87
88 Module['load'] = function load(f) {
89 globalEval(read(f));
90 };
91
92 Module['arguments'] = process['argv'].slice(2);
93
94 module['exports'] = Module;
95 }
96 else if (ENVIRONMENT_IS_SHELL) {
97 if (!Module['print']) Module['print'] = print;
98 if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not pres ent in v8 or older sm
99
100 if (typeof read != 'undefined') {
101 Module['read'] = read;
102 } else {
103 Module['read'] = function read() { throw 'no read() available (jsc?)' };
104 }
105
106 Module['readBinary'] = function readBinary(f) {
107 return read(f, 'binary');
108 };
109
110 if (typeof scriptArgs != 'undefined') {
111 Module['arguments'] = scriptArgs;
112 } else if (typeof arguments != 'undefined') {
113 Module['arguments'] = arguments;
114 }
115
116 this['Module'] = Module;
117
118 eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined"); // wipe out the SpiderMonkey shell 'gc' function, whic h can confuse closure (uses it as a minified name, and it is then initted to a n on-falsey value unexpectedly)
119 }
120 else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
121 Module['read'] = function read(url) {
122 var xhr = new XMLHttpRequest();
123 xhr.open('GET', url, false);
124 xhr.send(null);
125 return xhr.responseText;
126 };
127
128 if (typeof arguments != 'undefined') {
129 Module['arguments'] = arguments;
130 }
131
132 if (typeof console !== 'undefined') {
133 if (!Module['print']) Module['print'] = function print(x) {
134 console.log(x);
135 };
136 if (!Module['printErr']) Module['printErr'] = function printErr(x) {
137 console.log(x);
138 };
139 } else {
140 // Probably a worker, and without console.log. We can do very little here...
141 var TRY_USE_DUMP = false;
142 if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== " undefined") ? (function(x) {
143 dump(x);
144 }) : (function(x) {
145 // self.postMessage(x); // enable this if you want stdout to be sent as me ssages
146 }));
147 }
148
149 if (ENVIRONMENT_IS_WEB) {
150 window['Module'] = Module;
151 } else {
152 Module['load'] = importScripts;
153 }
154 }
155 else {
156 // Unreachable because SHELL is dependant on the others
157 throw 'Unknown runtime environment. Where are we?';
158 }
159
160 function globalEval(x) {
161 eval.call(null, x);
162 }
163 if (!Module['load'] == 'undefined' && Module['read']) {
164 Module['load'] = function load(f) {
165 globalEval(Module['read'](f));
166 };
167 }
168 if (!Module['print']) {
169 Module['print'] = function(){};
170 }
171 if (!Module['printErr']) {
172 Module['printErr'] = Module['print'];
173 }
174 if (!Module['arguments']) {
175 Module['arguments'] = [];
176 }
177 // *** Environment setup code ***
178
179 // Closure helpers
180 Module.print = Module['print'];
181 Module.printErr = Module['printErr'];
182
183 // Callbacks
184 Module['preRun'] = [];
185 Module['postRun'] = [];
186
187 // Merge back in the overrides
188 for (var key in moduleOverrides) {
189 if (moduleOverrides.hasOwnProperty(key)) {
190 Module[key] = moduleOverrides[key];
191 }
192 }
193
194
195
196 // === Auto-generated preamble library stuff ===
197
198 //========================================
199 // Runtime code shared with compiler
200 //========================================
201
202 var Runtime = {
203 stackSave: function () {
204 return STACKTOP;
205 },
206 stackRestore: function (stackTop) {
207 STACKTOP = stackTop;
208 },
209 forceAlign: function (target, quantum) {
210 quantum = quantum || 4;
211 if (quantum == 1) return target;
212 if (isNumber(target) && isNumber(quantum)) {
213 return Math.ceil(target/quantum)*quantum;
214 } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
215 return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';
216 }
217 return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
218 },
219 isNumberType: function (type) {
220 return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
221 },
222 isPointerType: function isPointerType(type) {
223 return type[type.length-1] == '*';
224 },
225 isStructType: function isStructType(type) {
226 if (isPointerType(type)) return false;
227 if (isArrayType(type)) return true;
228 if (/<?\{ ?[^}]* ?\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymo us struct types
229 // See comment in isStructPointerType()
230 return type[0] == '%';
231 },
232 INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
233 FLOAT_TYPES: {"float":0,"double":0},
234 or64: function (x, y) {
235 var l = (x | 0) | (y | 0);
236 var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 42949672 96;
237 return l + h;
238 },
239 and64: function (x, y) {
240 var l = (x | 0) & (y | 0);
241 var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 42949672 96;
242 return l + h;
243 },
244 xor64: function (x, y) {
245 var l = (x | 0) ^ (y | 0);
246 var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 42949672 96;
247 return l + h;
248 },
249 getNativeTypeSize: function (type) {
250 switch (type) {
251 case 'i1': case 'i8': return 1;
252 case 'i16': return 2;
253 case 'i32': return 4;
254 case 'i64': return 8;
255 case 'float': return 4;
256 case 'double': return 8;
257 default: {
258 if (type[type.length-1] === '*') {
259 return Runtime.QUANTUM_SIZE; // A pointer
260 } else if (type[0] === 'i') {
261 var bits = parseInt(type.substr(1));
262 assert(bits % 8 === 0);
263 return bits/8;
264 } else {
265 return 0;
266 }
267 }
268 }
269 },
270 getNativeFieldSize: function (type) {
271 return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
272 },
273 dedup: function dedup(items, ident) {
274 var seen = {};
275 if (ident) {
276 return items.filter(function(item) {
277 if (seen[item[ident]]) return false;
278 seen[item[ident]] = true;
279 return true;
280 });
281 } else {
282 return items.filter(function(item) {
283 if (seen[item]) return false;
284 seen[item] = true;
285 return true;
286 });
287 }
288 },
289 set: function set() {
290 var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
291 var ret = {};
292 for (var i = 0; i < args.length; i++) {
293 ret[args[i]] = 0;
294 }
295 return ret;
296 },
297 STACK_ALIGN: 8,
298 getAlignSize: function (type, size, vararg) {
299 // we align i64s and doubles on 64-bit boundaries, unlike x86
300 if (!vararg && (type == 'i64' || type == 'double')) return 8;
301 if (!type) return Math.min(size, 8); // align structures internally to 64 bi ts
302 return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runti me.QUANTUM_SIZE);
303 },
304 calculateStructAlignment: function calculateStructAlignment(type) {
305 type.flatSize = 0;
306 type.alignSize = 0;
307 var diffs = [];
308 var prev = -1;
309 var index = 0;
310 type.flatIndexes = type.fields.map(function(field) {
311 index++;
312 var size, alignSize;
313 if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
314 size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
315 alignSize = Runtime.getAlignSize(field, size);
316 } else if (Runtime.isStructType(field)) {
317 if (field[1] === '0') {
318 // this is [0 x something]. When inside another structure like here, i t must be at the end,
319 // and it adds no size
320 // XXX this happens in java-nbody for example... assert(index === type .fields.length, 'zero-length in the middle!');
321 size = 0;
322 if (Types.types[field]) {
323 alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize) ;
324 } else {
325 alignSize = type.alignSize || QUANTUM_SIZE;
326 }
327 } else {
328 size = Types.types[field].flatSize;
329 alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
330 }
331 } else if (field[0] == 'b') {
332 // bN, large number field, like a [N x i8]
333 size = field.substr(1)|0;
334 alignSize = 1;
335 } else if (field[0] === '<') {
336 // vector type
337 size = alignSize = Types.types[field].flatSize; // fully aligned
338 } else if (field[0] === 'i') {
339 // illegal integer field, that could not be legalized because it is an i nternal structure field
340 // it is ok to have such fields, if we just use them as markers of field size and nothing more complex
341 size = alignSize = parseInt(field.substr(1))/8;
342 assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);
343 } else {
344 assert(false, 'invalid type for calculateStructAlignment');
345 }
346 if (type.packed) alignSize = 1;
347 type.alignSize = Math.max(type.alignSize, alignSize);
348 var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
349 type.flatSize = curr + size;
350 if (prev >= 0) {
351 diffs.push(curr-prev);
352 }
353 prev = curr;
354 return curr;
355 });
356 if (type.name_ && type.name_[0] === '[') {
357 // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid
358 // allocating a potentially huge array for [999999 x i8] etc.
359 type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;
360 }
361 type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
362 if (diffs.length == 0) {
363 type.flatFactor = type.flatSize;
364 } else if (Runtime.dedup(diffs).length == 1) {
365 type.flatFactor = diffs[0];
366 }
367 type.needsFlattening = (type.flatFactor != 1);
368 return type.flatIndexes;
369 },
370 generateStructInfo: function (struct, typeName, offset) {
371 var type, alignment;
372 if (typeName) {
373 offset = offset || 0;
374 type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typ eName];
375 if (!type) return null;
376 if (type.fields.length != struct.length) {
377 printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
378 return null;
379 }
380 alignment = type.flatIndexes;
381 } else {
382 var type = { fields: struct.map(function(item) { return item[0] }) };
383 alignment = Runtime.calculateStructAlignment(type);
384 }
385 var ret = {
386 __size__: type.flatSize
387 };
388 if (typeName) {
389 struct.forEach(function(item, i) {
390 if (typeof item === 'string') {
391 ret[item] = alignment[i] + offset;
392 } else {
393 // embedded struct
394 var key;
395 for (var k in item) key = k;
396 ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], align ment[i]);
397 }
398 });
399 } else {
400 struct.forEach(function(item, i) {
401 ret[item[1]] = alignment[i];
402 });
403 }
404 return ret;
405 },
406 dynCall: function (sig, ptr, args) {
407 if (args && args.length) {
408 if (!args.splice) args = Array.prototype.slice.call(args);
409 args.splice(0, 0, ptr);
410 return Module['dynCall_' + sig].apply(null, args);
411 } else {
412 return Module['dynCall_' + sig].call(null, ptr);
413 }
414 },
415 functionPointers: [],
416 addFunction: function (func) {
417 for (var i = 0; i < Runtime.functionPointers.length; i++) {
418 if (!Runtime.functionPointers[i]) {
419 Runtime.functionPointers[i] = func;
420 return 2*(1 + i);
421 }
422 }
423 throw 'Finished up all reserved function pointers. Use a higher value for RE SERVED_FUNCTION_POINTERS.';
424 },
425 removeFunction: function (index) {
426 Runtime.functionPointers[(index-2)/2] = null;
427 },
428 getAsmConst: function (code, numArgs) {
429 // code is a constant string on the heap, so we can cache these
430 if (!Runtime.asmConstCache) Runtime.asmConstCache = {};
431 var func = Runtime.asmConstCache[code];
432 if (func) return func;
433 var args = [];
434 for (var i = 0; i < numArgs; i++) {
435 args.push(String.fromCharCode(36) + i); // $0, $1 etc
436 }
437 var source = Pointer_stringify(code);
438 if (source[0] === '"') {
439 // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct
440 if (source.indexOf('"', 1) === source.length-1) {
441 source = source.substr(1, source.length-2);
442 } else {
443 // something invalid happened, e.g. EM_ASM("..code($0)..", input)
444 abort('invalid EM_ASM input |' + source + '|. Please use EM_ASM(..code.. ) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');
445 }
446 }
447 try {
448 var evalled = eval('(function(' + args.join(',') + '){ ' + source + ' })') ; // new Function does not allow upvars in node
449 } catch(e) {
450 Module.printErr('error in executing inline EM_ASM code: ' + e + ' on: \n\n ' + source + '\n\nwith args |' + args + '| (make sure to use the right one out o f EM_ASM, EM_ASM_ARGS, etc.)');
451 throw e;
452 }
453 return Runtime.asmConstCache[code] = evalled;
454 },
455 warnOnce: function (text) {
456 if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
457 if (!Runtime.warnOnce.shown[text]) {
458 Runtime.warnOnce.shown[text] = 1;
459 Module.printErr(text);
460 }
461 },
462 funcWrappers: {},
463 getFuncWrapper: function (func, sig) {
464 assert(sig);
465 if (!Runtime.funcWrappers[func]) {
466 Runtime.funcWrappers[func] = function dynCall_wrapper() {
467 return Runtime.dynCall(sig, func, arguments);
468 };
469 }
470 return Runtime.funcWrappers[func];
471 },
472 UTF8Processor: function () {
473 var buffer = [];
474 var needed = 0;
475 this.processCChar = function (code) {
476 code = code & 0xFF;
477
478 if (buffer.length == 0) {
479 if ((code & 0x80) == 0x00) { // 0xxxxxxx
480 return String.fromCharCode(code);
481 }
482 buffer.push(code);
483 if ((code & 0xE0) == 0xC0) { // 110xxxxx
484 needed = 1;
485 } else if ((code & 0xF0) == 0xE0) { // 1110xxxx
486 needed = 2;
487 } else { // 11110xxx
488 needed = 3;
489 }
490 return '';
491 }
492
493 if (needed) {
494 buffer.push(code);
495 needed--;
496 if (needed > 0) return '';
497 }
498
499 var c1 = buffer[0];
500 var c2 = buffer[1];
501 var c3 = buffer[2];
502 var c4 = buffer[3];
503 var ret;
504 if (buffer.length == 2) {
505 ret = String.fromCharCode(((c1 & 0x1F) << 6) | (c2 & 0x3F));
506 } else if (buffer.length == 3) {
507 ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c 3 & 0x3F));
508 } else {
509 // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
510 var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
511 ((c3 & 0x3F) << 6) | (c4 & 0x3F);
512 ret = String.fromCharCode(
513 Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,
514 (codePoint - 0x10000) % 0x400 + 0xDC00);
515 }
516 buffer.length = 0;
517 return ret;
518 }
519 this.processJSString = function processJSString(string) {
520 /* TODO: use TextEncoder when present,
521 var encoder = new TextEncoder();
522 encoder['encoding'] = "utf-8";
523 var utf8Array = encoder['encode'](aMsg.data);
524 */
525 string = unescape(encodeURIComponent(string));
526 var ret = [];
527 for (var i = 0; i < string.length; i++) {
528 ret.push(string.charCodeAt(i));
529 }
530 return ret;
531 }
532 },
533 getCompilerSetting: function (name) {
534 throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getComp ilerSetting or emscripten_get_compiler_setting to work';
535 },
536 stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)| 0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },
537 staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + si ze)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },
538 dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) en largeMemory();; return ret; },
539 alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quan tum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
540 makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0) ))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+429496729 6)))); return ret; },
541 GLOBAL_BASE: 8,
542 QUANTUM_SIZE: 4,
543 __dummy__: 0
544 }
545
546
547 Module['Runtime'] = Runtime;
548
549
550
551
552
553
554
555
556
557 //========================================
558 // Runtime essentials
559 //========================================
560
561 var __THREW__ = 0; // Used in checking for thrown exceptions.
562
563 var ABORT = false; // whether we are quitting the application. no code should ru n after this. set in exit() and abort()
564 var EXITSTATUS = 0;
565
566 var undef = 0;
567 // tempInt is used for 32-bit signed values or smaller. tempBigInt is used
568 // for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of temp Int
569 var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI , tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;
570 var tempI64, tempI64b;
571 var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRe t7, tempRet8, tempRet9;
572
573 function assert(condition, text) {
574 if (!condition) {
575 abort('Assertion failed: ' + text);
576 }
577 }
578
579 var globalScope = this;
580
581 // C calling interface. A convenient way to call C functions (in C files, or
582 // defined with extern "C").
583 //
584 // Note: LLVM optimizations can inline and remove functions, after which you wil l not be
585 // able to call them. Closure can also do so. To avoid that, add your func tion to
586 // the exports using something like
587 //
588 // -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
589 //
590 // @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C")
591 // @param returnType The return type of the function, one of the JS types 'numbe r', 'string' or 'array' (use 'number' for any C pointer, and
592 // 'array' for JavaScript arrays and typed arrays; note that a rrays are 8-bit).
593 // @param argTypes An array of the types of arguments for the function (if the re are no arguments, this can be ommitted). Types are as in returnType,
594 // except that 'array' is not possible (there is no way for us to know the length of the array)
595 // @param args An array of the arguments to the function, as native JS val ues (as in returnType)
596 // Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
597 // @return The return value, as a native JS value (as in returnType)
598 function ccall(ident, returnType, argTypes, args) {
599 return ccallFunc(getCFunc(ident), returnType, argTypes, args);
600 }
601 Module["ccall"] = ccall;
602
603 // Returns the C function with a specified identifier (for C++, you need to do m anual name mangling)
604 function getCFunc(ident) {
605 try {
606 var func = Module['_' + ident]; // closure exported function
607 if (!func) func = eval('_' + ident); // explicit lookup
608 } catch(e) {
609 }
610 assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimiz ations or closure removed it?)');
611 return func;
612 }
613
614 // Internal function that does a C call using a function, not an identifier
615 function ccallFunc(func, returnType, argTypes, args) {
616 var stack = 0;
617 function toC(value, type) {
618 if (type == 'string') {
619 if (value === null || value === undefined || value === 0) return 0; // nul l string
620 value = intArrayFromString(value);
621 type = 'array';
622 }
623 if (type == 'array') {
624 if (!stack) stack = Runtime.stackSave();
625 var ret = Runtime.stackAlloc(value.length);
626 writeArrayToMemory(value, ret);
627 return ret;
628 }
629 return value;
630 }
631 function fromC(value, type) {
632 if (type == 'string') {
633 return Pointer_stringify(value);
634 }
635 assert(type != 'array');
636 return value;
637 }
638 var i = 0;
639 var cArgs = args ? args.map(function(arg) {
640 return toC(arg, argTypes[i++]);
641 }) : [];
642 var ret = fromC(func.apply(null, cArgs), returnType);
643 if (stack) Runtime.stackRestore(stack);
644 return ret;
645 }
646
647 // Returns a native JS wrapper for a C function. This is similar to ccall, but
648 // returns a function you can call repeatedly in a normal way. For example:
649 //
650 // var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
651 // alert(my_function(5, 22));
652 // alert(my_function(99, 12));
653 //
654 function cwrap(ident, returnType, argTypes) {
655 var func = getCFunc(ident);
656 return function() {
657 return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(argu ments));
658 }
659 }
660 Module["cwrap"] = cwrap;
661
662 // Sets a value in memory in a dynamic way at run-time. Uses the
663 // type data. This is the same as makeSetValue, except that
664 // makeSetValue is done at compile-time and generates the needed
665 // code then, whereas this function picks the right code at
666 // run-time.
667 // Note that setValue and getValue only do *aligned* writes and reads!
668 // Note that ccall uses JS types as for defining types, while setValue and
669 // getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
670 function setValue(ptr, value, type, noSafe) {
671 type = type || 'i8';
672 if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
673 switch(type) {
674 case 'i1': HEAP8[(ptr)]=value; break;
675 case 'i8': HEAP8[(ptr)]=value; break;
676 case 'i16': HEAP16[((ptr)>>1)]=value; break;
677 case 'i32': HEAP32[((ptr)>>2)]=value; break;
678 case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble ))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+42949 67296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDo uble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32 [(((ptr)+(4))>>2)]=tempI64[1]); break;
679 case 'float': HEAPF32[((ptr)>>2)]=value; break;
680 case 'double': HEAPF64[((ptr)>>3)]=value; break;
681 default: abort('invalid type for setValue: ' + type);
682 }
683 }
684 Module['setValue'] = setValue;
685
686 // Parallel to setValue.
687 function getValue(ptr, type, noSafe) {
688 type = type || 'i8';
689 if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
690 switch(type) {
691 case 'i1': return HEAP8[(ptr)];
692 case 'i8': return HEAP8[(ptr)];
693 case 'i16': return HEAP16[((ptr)>>1)];
694 case 'i32': return HEAP32[((ptr)>>2)];
695 case 'i64': return HEAP32[((ptr)>>2)];
696 case 'float': return HEAPF32[((ptr)>>2)];
697 case 'double': return HEAPF64[((ptr)>>3)];
698 default: abort('invalid type for setValue: ' + type);
699 }
700 return null;
701 }
702 Module['getValue'] = getValue;
703
704 var ALLOC_NORMAL = 0; // Tries to use _malloc()
705 var ALLOC_STACK = 1; // Lives for the duration of the current function call
706 var ALLOC_STATIC = 2; // Cannot be freed
707 var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
708 var ALLOC_NONE = 4; // Do not allocate
709 Module['ALLOC_NORMAL'] = ALLOC_NORMAL;
710 Module['ALLOC_STACK'] = ALLOC_STACK;
711 Module['ALLOC_STATIC'] = ALLOC_STATIC;
712 Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
713 Module['ALLOC_NONE'] = ALLOC_NONE;
714
715 // allocate(): This is for internal use. You can use it yourself as well, but th e interface
716 // is a little tricky (see docs right below). The reason is that it is optimized
717 // for multiple syntaxes to save space in generated code. So you sho uld
718 // normally not use allocate(), and instead allocate memory using _m alloc(),
719 // initialize it with setValue(), and so forth.
720 // @slab: An array of data, or a number. If a number, then the size of the block to allocate,
721 // in *bytes* (note that this is sometimes confusing: the next parameter does not
722 // affect this!)
723 // @types: Either an array of types, one for each byte (or 0 if no type at that position),
724 // or a single type which is used for the entire block. This only matter s if there
725 // is initial data - if @slab is a number, then this does not matter at all and is
726 // ignored.
727 // @allocator: How to allocate memory, see ALLOC_*
728 function allocate(slab, types, allocator, ptr) {
729 var zeroinit, size;
730 if (typeof slab === 'number') {
731 zeroinit = true;
732 size = slab;
733 } else {
734 zeroinit = false;
735 size = slab.length;
736 }
737
738 var singleType = typeof types === 'string' ? types : null;
739
740 var ret;
741 if (allocator == ALLOC_NONE) {
742 ret = ptr;
743 } else {
744 ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAllo c][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
745 }
746
747 if (zeroinit) {
748 var ptr = ret, stop;
749 assert((ret & 3) == 0);
750 stop = ret + (size & ~3);
751 for (; ptr < stop; ptr += 4) {
752 HEAP32[((ptr)>>2)]=0;
753 }
754 stop = ret + size;
755 while (ptr < stop) {
756 HEAP8[((ptr++)|0)]=0;
757 }
758 return ret;
759 }
760
761 if (singleType === 'i8') {
762 if (slab.subarray || slab.slice) {
763 HEAPU8.set(slab, ret);
764 } else {
765 HEAPU8.set(new Uint8Array(slab), ret);
766 }
767 return ret;
768 }
769
770 var i = 0, type, typeSize, previousType;
771 while (i < size) {
772 var curr = slab[i];
773
774 if (typeof curr === 'function') {
775 curr = Runtime.getFunctionIndex(curr);
776 }
777
778 type = singleType || types[i];
779 if (type === 0) {
780 i++;
781 continue;
782 }
783
784 if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later
785
786 setValue(ret+i, curr, type);
787
788 // no need to look up size unless type changes, so cache it
789 if (previousType !== type) {
790 typeSize = Runtime.getNativeTypeSize(type);
791 previousType = type;
792 }
793 i += typeSize;
794 }
795
796 return ret;
797 }
798 Module['allocate'] = allocate;
799
800 function Pointer_stringify(ptr, /* optional */ length) {
801 // TODO: use TextDecoder
802 // Find the length, and check for UTF while doing so
803 var hasUtf = false;
804 var t;
805 var i = 0;
806 while (1) {
807 t = HEAPU8[(((ptr)+(i))|0)];
808 if (t >= 128) hasUtf = true;
809 else if (t == 0 && !length) break;
810 i++;
811 if (length && i == length) break;
812 }
813 if (!length) length = i;
814
815 var ret = '';
816
817 if (!hasUtf) {
818 var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge stri ng can overflow the stack
819 var curr;
820 while (length > 0) {
821 curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.m in(length, MAX_CHUNK)));
822 ret = ret ? ret + curr : curr;
823 ptr += MAX_CHUNK;
824 length -= MAX_CHUNK;
825 }
826 return ret;
827 }
828
829 var utf8 = new Runtime.UTF8Processor();
830 for (i = 0; i < length; i++) {
831 t = HEAPU8[(((ptr)+(i))|0)];
832 ret += utf8.processCChar(t);
833 }
834 return ret;
835 }
836 Module['Pointer_stringify'] = Pointer_stringify;
837
838 // Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emsc ripten HEAP, returns
839 // a copy of that string as a Javascript String object.
840 function UTF16ToString(ptr) {
841 var i = 0;
842
843 var str = '';
844 while (1) {
845 var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
846 if (codeUnit == 0)
847 return str;
848 ++i;
849 // fromCharCode constructs a character from a UTF-16 code unit, so we can pa ss the UTF16 string right through.
850 str += String.fromCharCode(codeUnit);
851 }
852 }
853 Module['UTF16ToString'] = UTF16ToString;
854
855 // Copies the given Javascript String object 'str' to the emscripten HEAP at add ress 'outPtr',
856 // null-terminated and encoded in UTF16LE form. The copy will require at most (s tr.length*2+1)*2 bytes of space in the HEAP.
857 function stringToUTF16(str, outPtr) {
858 for(var i = 0; i < str.length; ++i) {
859 // charCodeAt returns a UTF-16 encoded code unit, so it can be directly writ ten to the HEAP.
860 var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
861 HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;
862 }
863 // Null-terminate the pointer to the HEAP.
864 HEAP16[(((outPtr)+(str.length*2))>>1)]=0;
865 }
866 Module['stringToUTF16'] = stringToUTF16;
867
868 // Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emsc ripten HEAP, returns
869 // a copy of that string as a Javascript String object.
870 function UTF32ToString(ptr) {
871 var i = 0;
872
873 var str = '';
874 while (1) {
875 var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
876 if (utf32 == 0)
877 return str;
878 ++i;
879 // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (p air), not from a Unicode code point! So encode the code point to UTF-16 for cons tructing.
880 if (utf32 >= 0x10000) {
881 var ch = utf32 - 0x10000;
882 str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
883 } else {
884 str += String.fromCharCode(utf32);
885 }
886 }
887 }
888 Module['UTF32ToString'] = UTF32ToString;
889
890 // Copies the given Javascript String object 'str' to the emscripten HEAP at add ress 'outPtr',
891 // null-terminated and encoded in UTF32LE form. The copy will require at most (s tr.length+1)*4 bytes of space in the HEAP,
892 // but can use less, since str.length does not return the number of characters i n the string, but the number of UTF-16 code units in the string.
893 function stringToUTF32(str, outPtr) {
894 var iChar = 0;
895 for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {
896 // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code un it, not a Unicode code point of the character! We must decode the string to UTF- 32 to the heap.
897 var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate
898 if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
899 var trailSurrogate = str.charCodeAt(++iCodeUnit);
900 codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF) ;
901 }
902 HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;
903 ++iChar;
904 }
905 // Null-terminate the pointer to the HEAP.
906 HEAP32[(((outPtr)+(iChar*4))>>2)]=0;
907 }
908 Module['stringToUTF32'] = stringToUTF32;
909
910 function demangle(func) {
911 var i = 3;
912 // params, etc.
913 var basicTypes = {
914 'v': 'void',
915 'b': 'bool',
916 'c': 'char',
917 's': 'short',
918 'i': 'int',
919 'l': 'long',
920 'f': 'float',
921 'd': 'double',
922 'w': 'wchar_t',
923 'a': 'signed char',
924 'h': 'unsigned char',
925 't': 'unsigned short',
926 'j': 'unsigned int',
927 'm': 'unsigned long',
928 'x': 'long long',
929 'y': 'unsigned long long',
930 'z': '...'
931 };
932 var subs = [];
933 var first = true;
934 function dump(x) {
935 //return;
936 if (x) Module.print(x);
937 Module.print(func);
938 var pre = '';
939 for (var a = 0; a < i; a++) pre += ' ';
940 Module.print (pre + '^');
941 }
942 function parseNested() {
943 i++;
944 if (func[i] === 'K') i++; // ignore const
945 var parts = [];
946 while (func[i] !== 'E') {
947 if (func[i] === 'S') { // substitution
948 i++;
949 var next = func.indexOf('_', i);
950 var num = func.substring(i, next) || 0;
951 parts.push(subs[num] || '?');
952 i = next+1;
953 continue;
954 }
955 if (func[i] === 'C') { // constructor
956 parts.push(parts[parts.length-1]);
957 i += 2;
958 continue;
959 }
960 var size = parseInt(func.substr(i));
961 var pre = size.toString().length;
962 if (!size || !pre) { i--; break; } // counter i++ below us
963 var curr = func.substr(i + pre, size);
964 parts.push(curr);
965 subs.push(curr);
966 i += pre + size;
967 }
968 i++; // skip E
969 return parts;
970 }
971 function parse(rawList, limit, allowVoid) { // main parser
972 limit = limit || Infinity;
973 var ret = '', list = [];
974 function flushList() {
975 return '(' + list.join(', ') + ')';
976 }
977 var name;
978 if (func[i] === 'N') {
979 // namespaced N-E
980 name = parseNested().join('::');
981 limit--;
982 if (limit === 0) return rawList ? [name] : name;
983 } else {
984 // not namespaced
985 if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const an d first 'L'
986 var size = parseInt(func.substr(i));
987 if (size) {
988 var pre = size.toString().length;
989 name = func.substr(i + pre, size);
990 i += pre + size;
991 }
992 }
993 first = false;
994 if (func[i] === 'I') {
995 i++;
996 var iList = parse(true);
997 var iRet = parse(true, 1, true);
998 ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
999 } else {
1000 ret = name;
1001 }
1002 paramLoop: while (i < func.length && limit-- > 0) {
1003 //dump('paramLoop');
1004 var c = func[i++];
1005 if (c in basicTypes) {
1006 list.push(basicTypes[c]);
1007 } else {
1008 switch (c) {
1009 case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer
1010 case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // referenc e
1011 case 'L': { // literal
1012 i++; // skip basic type
1013 var end = func.indexOf('E', i);
1014 var size = end - i;
1015 list.push(func.substr(i, size));
1016 i += size + 2; // size + 'EE'
1017 break;
1018 }
1019 case 'A': { // array
1020 var size = parseInt(func.substr(i));
1021 i += size.toString().length;
1022 if (func[i] !== '_') throw '?';
1023 i++; // skip _
1024 list.push(parse(true, 1, true)[0] + ' [' + size + ']');
1025 break;
1026 }
1027 case 'E': break paramLoop;
1028 default: ret += '?' + c; break paramLoop;
1029 }
1030 }
1031 }
1032 if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avo id (void)
1033 if (rawList) {
1034 if (ret) {
1035 list.push(ret + '?');
1036 }
1037 return list;
1038 } else {
1039 return ret + flushList();
1040 }
1041 }
1042 try {
1043 // Special-case the entry point, since its name differs from other name mang ling.
1044 if (func == 'Object._main' || func == '_main') {
1045 return 'main()';
1046 }
1047 if (typeof func === 'number') func = Pointer_stringify(func);
1048 if (func[0] !== '_') return func;
1049 if (func[1] !== '_') return func; // C function
1050 if (func[2] !== 'Z') return func;
1051 switch (func[3]) {
1052 case 'n': return 'operator new()';
1053 case 'd': return 'operator delete()';
1054 }
1055 return parse();
1056 } catch(e) {
1057 return func;
1058 }
1059 }
1060
1061 function demangleAll(text) {
1062 return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });
1063 }
1064
1065 function stackTrace() {
1066 var stack = new Error().stack;
1067 return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack tra ce is not available at least on IE10 and Safari 6.
1068 }
1069
1070 // Memory management
1071
1072 var PAGE_SIZE = 4096;
1073 function alignMemoryPage(x) {
1074 return (x+4095)&-4096;
1075 }
1076
1077 var HEAP;
1078 var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
1079
1080 var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
1081 var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
1082 var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk
1083
1084 function enlargeMemory() {
1085 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 ALL OW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizatio ns, or (3) set Module.TOTAL_MEMORY before the program runs.');
1086 }
1087
1088 var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
1089 var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728;
1090 var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
1091
1092 var totalMemory = 4096;
1093 while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {
1094 if (totalMemory < 16*1024*1024) {
1095 totalMemory *= 2;
1096 } else {
1097 totalMemory += 16*1024*1024
1098 }
1099 }
1100 if (totalMemory !== TOTAL_MEMORY) {
1101 Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more rea sonable');
1102 TOTAL_MEMORY = totalMemory;
1103 }
1104
1105 // Initialize the runtime's memory
1106 // check for full engine support (use string 'subarray' to avoid closure compile r confusion)
1107 assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
1108 'JS engine does not provide full typed array support');
1109
1110 var buffer = new ArrayBuffer(TOTAL_MEMORY);
1111 HEAP8 = new Int8Array(buffer);
1112 HEAP16 = new Int16Array(buffer);
1113 HEAP32 = new Int32Array(buffer);
1114 HEAPU8 = new Uint8Array(buffer);
1115 HEAPU16 = new Uint16Array(buffer);
1116 HEAPU32 = new Uint32Array(buffer);
1117 HEAPF32 = new Float32Array(buffer);
1118 HEAPF64 = new Float64Array(buffer);
1119
1120 // Endianness check (note: assumes compiler arch was little-endian)
1121 HEAP32[0] = 255;
1122 assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a li ttle-endian system');
1123
1124 Module['HEAP'] = HEAP;
1125 Module['HEAP8'] = HEAP8;
1126 Module['HEAP16'] = HEAP16;
1127 Module['HEAP32'] = HEAP32;
1128 Module['HEAPU8'] = HEAPU8;
1129 Module['HEAPU16'] = HEAPU16;
1130 Module['HEAPU32'] = HEAPU32;
1131 Module['HEAPF32'] = HEAPF32;
1132 Module['HEAPF64'] = HEAPF64;
1133
1134 function callRuntimeCallbacks(callbacks) {
1135 while(callbacks.length > 0) {
1136 var callback = callbacks.shift();
1137 if (typeof callback == 'function') {
1138 callback();
1139 continue;
1140 }
1141 var func = callback.func;
1142 if (typeof func === 'number') {
1143 if (callback.arg === undefined) {
1144 Runtime.dynCall('v', func);
1145 } else {
1146 Runtime.dynCall('vi', func, [callback.arg]);
1147 }
1148 } else {
1149 func(callback.arg === undefined ? null : callback.arg);
1150 }
1151 }
1152 }
1153
1154 var __ATPRERUN__ = []; // functions called before the runtime is initialized
1155 var __ATINIT__ = []; // functions called during startup
1156 var __ATMAIN__ = []; // functions called when main() is to be run
1157 var __ATEXIT__ = []; // functions called during shutdown
1158 var __ATPOSTRUN__ = []; // functions called after the runtime has exited
1159
1160 var runtimeInitialized = false;
1161
1162 function preRun() {
1163 // compatibility - merge in anything from Module['preRun'] at this time
1164 if (Module['preRun']) {
1165 if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRu n']];
1166 while (Module['preRun'].length) {
1167 addOnPreRun(Module['preRun'].shift());
1168 }
1169 }
1170 callRuntimeCallbacks(__ATPRERUN__);
1171 }
1172
1173 function ensureInitRuntime() {
1174 if (runtimeInitialized) return;
1175 runtimeInitialized = true;
1176 callRuntimeCallbacks(__ATINIT__);
1177 }
1178
1179 function preMain() {
1180 callRuntimeCallbacks(__ATMAIN__);
1181 }
1182
1183 function exitRuntime() {
1184 callRuntimeCallbacks(__ATEXIT__);
1185 }
1186
1187 function postRun() {
1188 // compatibility - merge in anything from Module['postRun'] at this time
1189 if (Module['postRun']) {
1190 if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['pos tRun']];
1191 while (Module['postRun'].length) {
1192 addOnPostRun(Module['postRun'].shift());
1193 }
1194 }
1195 callRuntimeCallbacks(__ATPOSTRUN__);
1196 }
1197
1198 function addOnPreRun(cb) {
1199 __ATPRERUN__.unshift(cb);
1200 }
1201 Module['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;
1202
1203 function addOnInit(cb) {
1204 __ATINIT__.unshift(cb);
1205 }
1206 Module['addOnInit'] = Module.addOnInit = addOnInit;
1207
1208 function addOnPreMain(cb) {
1209 __ATMAIN__.unshift(cb);
1210 }
1211 Module['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;
1212
1213 function addOnExit(cb) {
1214 __ATEXIT__.unshift(cb);
1215 }
1216 Module['addOnExit'] = Module.addOnExit = addOnExit;
1217
1218 function addOnPostRun(cb) {
1219 __ATPOSTRUN__.unshift(cb);
1220 }
1221 Module['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;
1222
1223 // Tools
1224
1225 // This processes a JS string into a C-line array of numbers, 0-terminated.
1226 // For LLVM-originating strings, see parser.js:parseLLVMString function
1227 function intArrayFromString(stringy, dontAddNull, length /* optional */) {
1228 var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
1229 if (length) {
1230 ret.length = length;
1231 }
1232 if (!dontAddNull) {
1233 ret.push(0);
1234 }
1235 return ret;
1236 }
1237 Module['intArrayFromString'] = intArrayFromString;
1238
1239 function intArrayToString(array) {
1240 var ret = [];
1241 for (var i = 0; i < array.length; i++) {
1242 var chr = array[i];
1243 if (chr > 0xFF) {
1244 chr &= 0xFF;
1245 }
1246 ret.push(String.fromCharCode(chr));
1247 }
1248 return ret.join('');
1249 }
1250 Module['intArrayToString'] = intArrayToString;
1251
1252 // Write a Javascript array to somewhere in the heap
1253 function writeStringToMemory(string, buffer, dontAddNull) {
1254 var array = intArrayFromString(string, dontAddNull);
1255 var i = 0;
1256 while (i < array.length) {
1257 var chr = array[i];
1258 HEAP8[(((buffer)+(i))|0)]=chr;
1259 i = i + 1;
1260 }
1261 }
1262 Module['writeStringToMemory'] = writeStringToMemory;
1263
1264 function writeArrayToMemory(array, buffer) {
1265 for (var i = 0; i < array.length; i++) {
1266 HEAP8[(((buffer)+(i))|0)]=array[i];
1267 }
1268 }
1269 Module['writeArrayToMemory'] = writeArrayToMemory;
1270
1271 function writeAsciiToMemory(str, buffer, dontAddNull) {
1272 for (var i = 0; i < str.length; i++) {
1273 HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);
1274 }
1275 if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;
1276 }
1277 Module['writeAsciiToMemory'] = writeAsciiToMemory;
1278
1279 function unSign(value, bits, ignore) {
1280 if (value >= 0) {
1281 return value;
1282 }
1283 return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, s ince if bits == 32, we are right at the limit of the bits JS uses in bitshifts
1284 : Math.pow(2, bits) + value;
1285 }
1286 function reSign(value, bits, ignore) {
1287 if (value <= 0) {
1288 return value;
1289 }
1290 var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
1291 : Math.pow(2, bits-1);
1292 if (value >= half && (bits <= 32 || value > half)) { // for huge values, we ca n hit the precision limit and always get true here. so don't do that
1293 // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
1294 // TODO: In i64 mode 1, r esign the two parts separately and safely
1295 value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
1296 }
1297 return value;
1298 }
1299
1300 // check for imul support, and also for correctness ( https://bugs.webkit.org/sh ow_bug.cgi?id=126345 )
1301 if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
1302 var ah = a >>> 16;
1303 var al = a & 0xffff;
1304 var bh = b >>> 16;
1305 var bl = b & 0xffff;
1306 return (al*bl + ((ah*bl + al*bh) << 16))|0;
1307 };
1308 Math.imul = Math['imul'];
1309
1310
1311 var Math_abs = Math.abs;
1312 var Math_cos = Math.cos;
1313 var Math_sin = Math.sin;
1314 var Math_tan = Math.tan;
1315 var Math_acos = Math.acos;
1316 var Math_asin = Math.asin;
1317 var Math_atan = Math.atan;
1318 var Math_atan2 = Math.atan2;
1319 var Math_exp = Math.exp;
1320 var Math_log = Math.log;
1321 var Math_sqrt = Math.sqrt;
1322 var Math_ceil = Math.ceil;
1323 var Math_floor = Math.floor;
1324 var Math_pow = Math.pow;
1325 var Math_imul = Math.imul;
1326 var Math_fround = Math.fround;
1327 var Math_min = Math.min;
1328
1329 // A counter of dependencies for calling run(). If we need to
1330 // do asynchronous work before running, increment this and
1331 // decrement it. Incrementing must happen in a place like
1332 // PRE_RUN_ADDITIONS (used by emcc to add file preloading).
1333 // Note that you can add dependencies in preRun, even though
1334 // it happens right before run - run will be postponed until
1335 // the dependencies are met.
1336 var runDependencies = 0;
1337 var runDependencyWatcher = null;
1338 var dependenciesFulfilled = null; // overridden to take different actions when a ll run dependencies are fulfilled
1339
1340 function addRunDependency(id) {
1341 runDependencies++;
1342 if (Module['monitorRunDependencies']) {
1343 Module['monitorRunDependencies'](runDependencies);
1344 }
1345 }
1346 Module['addRunDependency'] = addRunDependency;
1347 function removeRunDependency(id) {
1348 runDependencies--;
1349 if (Module['monitorRunDependencies']) {
1350 Module['monitorRunDependencies'](runDependencies);
1351 }
1352 if (runDependencies == 0) {
1353 if (runDependencyWatcher !== null) {
1354 clearInterval(runDependencyWatcher);
1355 runDependencyWatcher = null;
1356 }
1357 if (dependenciesFulfilled) {
1358 var callback = dependenciesFulfilled;
1359 dependenciesFulfilled = null;
1360 callback(); // can add another dependenciesFulfilled
1361 }
1362 }
1363 }
1364 Module['removeRunDependency'] = removeRunDependency;
1365
1366 Module["preloadedImages"] = {}; // maps url to image data
1367 Module["preloadedAudios"] = {}; // maps url to audio data
1368
1369
1370 var memoryInitializer = null;
1371
1372 // === Body ===
1373
1374
1375
1376
1377
1378 STATIC_BASE = 8;
1379
1380 STATICTOP = STATIC_BASE + Runtime.alignMemory(1155);
1381 /* global initializers */ __ATINIT__.push();
1382
1383
1384 /* memory initializer */ allocate([38,2,0,0,0,0,0,0,42,0,0,0,0,0,0,0,97,0,0,0,11 3,61,138,62,0,0,0,0,99,0,0,0,143,194,245,61,0,0,0,0,103,0,0,0,143,194,245,61,0,0 ,0,0,116,0,0,0,113,61,138,62,0,0,0,0,66,0,0,0,10,215,163,60,0,0,0,0,68,0,0,0,10, 215,163,60,0,0,0,0,72,0,0,0,10,215,163,60,0,0,0,0,75,0,0,0,10,215,163,60,0,0,0,0 ,77,0,0,0,10,215,163,60,0,0,0,0,78,0,0,0,10,215,163,60,0,0,0,0,82,0,0,0,10,215,1 63,60,0,0,0,0,83,0,0,0,10,215,163,60,0,0,0,0,86,0,0,0,10,215,163,60,0,0,0,0,87,0 ,0,0,10,215,163,60,0,0,0,0,89,0,0,0,10,215,163,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,97,0,0,0,233,28,155,62,0,0,0,0,99,0,0,0,114,189,74,62,0,0,0,0,103,0,0,0,215,73 ,74,62,0,0,0,0,116,0,0,0,114,95,154,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 01,114,114,111,114,58,32,37,100,10,0,0,0,0,0,0,71,71,67,67,71,71,71,67,71,67,71, 71,84,71,71,67,84,67,65,67,71,67,67,84,71,84,65,65,84,67,67,67,65,71,67,65,67,84 ,84,84,71,71,71,65,71,71,67,67,71,65,71,71,67,71,71,71,67,71,71,65,84,67,65,67,6 7,84,71,65,71,71,84,67,65,71,71,65,71,84,84,67,71,65,71,65,67,67,65,71,67,67,84, 71,71,67,67,65,65,67,65,84,71,71,84,71,65,65,65,67,67,67,67,71,84,67,84,67,84,65 ,67,84,65,65,65,65,65,84,65,67,65,65,65,65,65,84,84,65,71,67,67,71,71,71,67,71,8 4,71,71,84,71,71,67,71,67,71,67,71,67,67,84,71,84,65,65,84,67,67,67,65,71,67,84, 65,67,84,67,71,71,71,65,71,71,67,84,71,65,71,71,67,65,71,71,65,71,65,65,84,67,71 ,67,84,84,71,65,65,67,67,67,71,71,71,65,71,71,67,71,71,65,71,71,84,84,71,67,65,7 1,84,71,65,71,67,67,71,65,71,65,84,67,71,67,71,67,67,65,67,84,71,67,65,67,84,67, 67,65,71,67,67,84,71,71,71,67,71,65,67,65,71,65,71,67,71,65,71,65,67,84,67,67,71 ,84,67,84,67,65,65,65,65,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,120,4,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,9 7,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,8,0,0,0,10 4,4,0,0,0,0,0,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);
1385
1386
1387
1388
1389 var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);
1390
1391 assert(tempDoublePtr % 8 == 0);
1392
1393 function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
1394
1395 HEAP8[tempDoublePtr] = HEAP8[ptr];
1396
1397 HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
1398
1399 HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
1400
1401 HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
1402
1403 }
1404
1405 function copyTempDouble(ptr) {
1406
1407 HEAP8[tempDoublePtr] = HEAP8[ptr];
1408
1409 HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
1410
1411 HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
1412
1413 HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
1414
1415 HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
1416
1417 HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
1418
1419 HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
1420
1421 HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
1422
1423 }
1424
1425
1426
1427
1428 var ___errno_state=0;function ___setErrNo(value) {
1429 // For convenient setting and returning of errno.
1430 HEAP32[((___errno_state)>>2)]=value;
1431 return value;
1432 }
1433
1434 var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXE C:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENO TBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENF ILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLI NK: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,EBAD E:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,E NOSTR: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,E CONNRESET: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,EALRE ADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRN OTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQ UOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125 ,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name) {
1435 // long sysconf(int name);
1436 // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
1437 switch(name) {
1438 case 30: return PAGE_SIZE;
1439 case 132:
1440 case 133:
1441 case 12:
1442 case 137:
1443 case 138:
1444 case 15:
1445 case 235:
1446 case 16:
1447 case 17:
1448 case 18:
1449 case 19:
1450 case 20:
1451 case 149:
1452 case 13:
1453 case 10:
1454 case 236:
1455 case 153:
1456 case 9:
1457 case 21:
1458 case 22:
1459 case 159:
1460 case 154:
1461 case 14:
1462 case 77:
1463 case 78:
1464 case 139:
1465 case 80:
1466 case 81:
1467 case 79:
1468 case 82:
1469 case 68:
1470 case 67:
1471 case 164:
1472 case 11:
1473 case 29:
1474 case 47:
1475 case 48:
1476 case 95:
1477 case 52:
1478 case 51:
1479 case 46:
1480 return 200809;
1481 case 27:
1482 case 246:
1483 case 127:
1484 case 128:
1485 case 23:
1486 case 24:
1487 case 160:
1488 case 161:
1489 case 181:
1490 case 182:
1491 case 242:
1492 case 183:
1493 case 184:
1494 case 243:
1495 case 244:
1496 case 245:
1497 case 165:
1498 case 178:
1499 case 179:
1500 case 49:
1501 case 50:
1502 case 168:
1503 case 169:
1504 case 175:
1505 case 170:
1506 case 171:
1507 case 172:
1508 case 97:
1509 case 76:
1510 case 32:
1511 case 173:
1512 case 35:
1513 return -1;
1514 case 176:
1515 case 177:
1516 case 7:
1517 case 155:
1518 case 8:
1519 case 157:
1520 case 125:
1521 case 126:
1522 case 92:
1523 case 93:
1524 case 129:
1525 case 130:
1526 case 131:
1527 case 94:
1528 case 91:
1529 return 1;
1530 case 74:
1531 case 60:
1532 case 69:
1533 case 70:
1534 case 4:
1535 return 1024;
1536 case 31:
1537 case 42:
1538 case 72:
1539 return 32;
1540 case 87:
1541 case 26:
1542 case 33:
1543 return 2147483647;
1544 case 34:
1545 case 1:
1546 return 47839;
1547 case 38:
1548 case 36:
1549 return 99;
1550 case 43:
1551 case 37:
1552 return 2048;
1553 case 0: return 2097152;
1554 case 3: return 65536;
1555 case 28: return 32768;
1556 case 44: return 32767;
1557 case 75: return 16384;
1558 case 39: return 1000;
1559 case 89: return 700;
1560 case 71: return 256;
1561 case 40: return 255;
1562 case 2: return 100;
1563 case 180: return 64;
1564 case 25: return 20;
1565 case 5: return 16;
1566 case 6: return 6;
1567 case 73: return 4;
1568 case 84: return 1;
1569 }
1570 ___setErrNo(ERRNO_CODES.EINVAL);
1571 return -1;
1572 }
1573
1574
1575 function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()
1576 return !!__ZSt18uncaught_exceptionv.uncaught_exception;
1577 }
1578
1579
1580
1581 function ___cxa_is_number_type(type) {
1582 var isNumber = false;
1583 try { if (type == __ZTIi) isNumber = true } catch(e){}
1584 try { if (type == __ZTIj) isNumber = true } catch(e){}
1585 try { if (type == __ZTIl) isNumber = true } catch(e){}
1586 try { if (type == __ZTIm) isNumber = true } catch(e){}
1587 try { if (type == __ZTIx) isNumber = true } catch(e){}
1588 try { if (type == __ZTIy) isNumber = true } catch(e){}
1589 try { if (type == __ZTIf) isNumber = true } catch(e){}
1590 try { if (type == __ZTId) isNumber = true } catch(e){}
1591 try { if (type == __ZTIe) isNumber = true } catch(e){}
1592 try { if (type == __ZTIc) isNumber = true } catch(e){}
1593 try { if (type == __ZTIa) isNumber = true } catch(e){}
1594 try { if (type == __ZTIh) isNumber = true } catch(e){}
1595 try { if (type == __ZTIs) isNumber = true } catch(e){}
1596 try { if (type == __ZTIt) isNumber = true } catch(e){}
1597 return isNumber;
1598 }function ___cxa_does_inherit(definiteType, possibilityType, possibility) {
1599 if (possibility == 0) return false;
1600 if (possibilityType == 0 || possibilityType == definiteType)
1601 return true;
1602 var possibility_type_info;
1603 if (___cxa_is_number_type(possibilityType)) {
1604 possibility_type_info = possibilityType;
1605 } else {
1606 var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8;
1607 possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)];
1608 }
1609 switch (possibility_type_info) {
1610 case 0: // possibility is a pointer
1611 // See if definite type is a pointer
1612 var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8;
1613 var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)];
1614 if (definite_type_info == 0) {
1615 // Also a pointer; compare base types of pointers
1616 var defPointerBaseAddr = definiteType+8;
1617 var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)];
1618 var possPointerBaseAddr = possibilityType+8;
1619 var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)];
1620 return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, po ssibility);
1621 } else
1622 return false; // one pointer and one non-pointer
1623 case 1: // class with no base class
1624 return false;
1625 case 2: // class with base class
1626 var parentTypeAddr = possibilityType + 8;
1627 var parentType = HEAP32[((parentTypeAddr)>>2)];
1628 return ___cxa_does_inherit(definiteType, parentType, possibility);
1629 default:
1630 return false; // some unencountered type
1631 }
1632 }
1633
1634
1635
1636 var ___cxa_last_thrown_exception=0;function ___resumeException(ptr) {
1637 if (!___cxa_last_thrown_exception) { ___cxa_last_thrown_exception = ptr; }
1638 throw ptr + " - Exception catching is disabled, this exception cannot be c aught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHIN G=2 to catch.";
1639 }
1640
1641 var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown, throwntype) {
1642 if (thrown == -1) thrown = ___cxa_last_thrown_exception;
1643 header = thrown - ___cxa_exception_header_size;
1644 if (throwntype == -1) throwntype = HEAP32[((header)>>2)];
1645 var typeArray = Array.prototype.slice.call(arguments, 2);
1646
1647 // If throwntype is a pointer, this means a pointer has been
1648 // thrown. When a pointer is thrown, actually what's thrown
1649 // is a pointer to the pointer. We'll dereference it.
1650 if (throwntype != 0 && !___cxa_is_number_type(throwntype)) {
1651 var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8;
1652 var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)];
1653 if (throwntypeInfo == 0)
1654 thrown = HEAP32[((thrown)>>2)];
1655 }
1656 // The different catch blocks are denoted by different types.
1657 // Due to inheritance, those types may not precisely match the
1658 // type of the thrown object. Find one which matches, and
1659 // return the type of the catch block which should be called.
1660 for (var i = 0; i < typeArray.length; i++) {
1661 if (___cxa_does_inherit(typeArray[i], throwntype, thrown))
1662 return ((asm["setTempRet0"](typeArray[i]),thrown)|0);
1663 }
1664 // Shouldn't happen unless we have bogus data in typeArray
1665 // or encounter a type for which emscripten doesn't have suitable
1666 // typeinfo defined. Best-efforts match just in case.
1667 return ((asm["setTempRet0"](throwntype),thrown)|0);
1668 }function ___cxa_throw(ptr, type, destructor) {
1669 if (!___cxa_throw.initialized) {
1670 try {
1671 HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workarou nd for libcxxabi integration bug
1672 } catch(e){}
1673 try {
1674 HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug
1675 } catch(e){}
1676 try {
1677 HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaro und for libcxxabi integration bug
1678 } catch(e){}
1679 ___cxa_throw.initialized = true;
1680 }
1681 var header = ptr - ___cxa_exception_header_size;
1682 HEAP32[((header)>>2)]=type;
1683 HEAP32[(((header)+(4))>>2)]=destructor;
1684 ___cxa_last_thrown_exception = ptr;
1685 if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) {
1686 __ZSt18uncaught_exceptionv.uncaught_exception = 1;
1687 } else {
1688 __ZSt18uncaught_exceptionv.uncaught_exception++;
1689 }
1690 throw ptr + " - Exception catching is disabled, this exception cannot be c aught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHIN G=2 to catch.";
1691 }
1692
1693
1694 Module["_memset"] = _memset;
1695
1696 function _abort() {
1697 Module['abort']();
1698 }
1699
1700
1701
1702
1703
1704 var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or director y",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such devi ce or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",1 0:"No children",11:"No more processes",12:"Not enough core",13:"Permission denie d",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File e xists",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:"N o space left on device",29:"Illegal seek",30:"Read only file system",31:"Too man y links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result no t 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:"Identif ier 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 dr iver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Inval id 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 r esources",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:"Srmoun t error",70:"Communication error on send",71:"Protocol error",72:"Multihop attem pted",73:"Cross mount point (not really error)",74:"Trying to read unreadable me ssage",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 acc ess 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 e xec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address require d",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not av ailable",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 int erface 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:"Connectio n timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachabl e",114:"Socket already connected",115:"Connection already in progress",116:"Stal e file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operati on canceled",130:"Previous owner died",131:"State not recoverable"};
1705
1706 var PATH={splitPath:function (filename) {
1707 var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(? :[\/]*)$/;
1708 return splitPathRe.exec(filename).slice(1);
1709 },normalizeArray:function (parts, allowAboveRoot) {
1710 // if the path tries to go above the root, `up` ends up > 0
1711 var up = 0;
1712 for (var i = parts.length - 1; i >= 0; i--) {
1713 var last = parts[i];
1714 if (last === '.') {
1715 parts.splice(i, 1);
1716 } else if (last === '..') {
1717 parts.splice(i, 1);
1718 up++;
1719 } else if (up) {
1720 parts.splice(i, 1);
1721 up--;
1722 }
1723 }
1724 // if the path is allowed to go above the root, restore leading ..s
1725 if (allowAboveRoot) {
1726 for (; up--; up) {
1727 parts.unshift('..');
1728 }
1729 }
1730 return parts;
1731 },normalize:function (path) {
1732 var isAbsolute = path.charAt(0) === '/',
1733 trailingSlash = path.substr(-1) === '/';
1734 // Normalize the path
1735 path = PATH.normalizeArray(path.split('/').filter(function(p) {
1736 return !!p;
1737 }), !isAbsolute).join('/');
1738 if (!path && !isAbsolute) {
1739 path = '.';
1740 }
1741 if (path && trailingSlash) {
1742 path += '/';
1743 }
1744 return (isAbsolute ? '/' : '') + path;
1745 },dirname:function (path) {
1746 var result = PATH.splitPath(path),
1747 root = result[0],
1748 dir = result[1];
1749 if (!root && !dir) {
1750 // No dirname whatsoever
1751 return '.';
1752 }
1753 if (dir) {
1754 // It has a dirname, strip trailing slash
1755 dir = dir.substr(0, dir.length - 1);
1756 }
1757 return root + dir;
1758 },basename:function (path) {
1759 // EMSCRIPTEN return '/'' for '/', not an empty string
1760 if (path === '/') return '/';
1761 var lastSlash = path.lastIndexOf('/');
1762 if (lastSlash === -1) return path;
1763 return path.substr(lastSlash+1);
1764 },extname:function (path) {
1765 return PATH.splitPath(path)[3];
1766 },join:function () {
1767 var paths = Array.prototype.slice.call(arguments, 0);
1768 return PATH.normalize(paths.join('/'));
1769 },join2:function (l, r) {
1770 return PATH.normalize(l + '/' + r);
1771 },resolve:function () {
1772 var resolvedPath = '',
1773 resolvedAbsolute = false;
1774 for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
1775 var path = (i >= 0) ? arguments[i] : FS.cwd();
1776 // Skip empty and invalid entries
1777 if (typeof path !== 'string') {
1778 throw new TypeError('Arguments to path.resolve must be strings');
1779 } else if (!path) {
1780 continue;
1781 }
1782 resolvedPath = path + '/' + resolvedPath;
1783 resolvedAbsolute = path.charAt(0) === '/';
1784 }
1785 // At this point the path should be resolved to a full absolute path, bu t
1786 // handle relative paths to be safe (might happen when process.cwd() fai ls)
1787 resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(functi on(p) {
1788 return !!p;
1789 }), !resolvedAbsolute).join('/');
1790 return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
1791 },relative:function (from, to) {
1792 from = PATH.resolve(from).substr(1);
1793 to = PATH.resolve(to).substr(1);
1794 function trim(arr) {
1795 var start = 0;
1796 for (; start < arr.length; start++) {
1797 if (arr[start] !== '') break;
1798 }
1799 var end = arr.length - 1;
1800 for (; end >= 0; end--) {
1801 if (arr[end] !== '') break;
1802 }
1803 if (start > end) return [];
1804 return arr.slice(start, end - start + 1);
1805 }
1806 var fromParts = trim(from.split('/'));
1807 var toParts = trim(to.split('/'));
1808 var length = Math.min(fromParts.length, toParts.length);
1809 var samePartsLength = length;
1810 for (var i = 0; i < length; i++) {
1811 if (fromParts[i] !== toParts[i]) {
1812 samePartsLength = i;
1813 break;
1814 }
1815 }
1816 var outputParts = [];
1817 for (var i = samePartsLength; i < fromParts.length; i++) {
1818 outputParts.push('..');
1819 }
1820 outputParts = outputParts.concat(toParts.slice(samePartsLength));
1821 return outputParts.join('/');
1822 }};
1823
1824 var TTY={ttys:[],init:function () {
1825 // https://github.com/kripken/emscripten/pull/1555
1826 // if (ENVIRONMENT_IS_NODE) {
1827 // // currently, FS.init does not distinguish if process.stdin is a fi le or TTY
1828 // // device, it always assumes it's a TTY device. because of this, we 're forcing
1829 // // process.stdin to UTF8 encoding to at least make stdin reading co mpatible
1830 // // with text files until FS.init can be refactored.
1831 // process['stdin']['setEncoding']('utf8');
1832 // }
1833 },shutdown:function () {
1834 // https://github.com/kripken/emscripten/pull/1555
1835 // if (ENVIRONMENT_IS_NODE) {
1836 // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn 't exit immediately (with process.stdin being a tty)?
1837 // // isaacs: because now it's reading from the stream, you've express ed interest in it, so that read() kicks off a _read() which creates a ReadReq op eration
1838 // // inolen: I thought read() in that case was a synchronous operatio n that just grabbed some amount of buffered data if it exists?
1839 // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
1840 // // isaacs: do process.stdin.pause() and i'd think it'd probably clo se the pending call
1841 // process['stdin']['pause']();
1842 // }
1843 },register:function (dev, ops) {
1844 TTY.ttys[dev] = { input: [], output: [], ops: ops };
1845 FS.registerDevice(dev, TTY.stream_ops);
1846 },stream_ops:{open:function (stream) {
1847 var tty = TTY.ttys[stream.node.rdev];
1848 if (!tty) {
1849 throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
1850 }
1851 stream.tty = tty;
1852 stream.seekable = false;
1853 },close:function (stream) {
1854 // flush any pending line data
1855 if (stream.tty.output.length) {
1856 stream.tty.ops.put_char(stream.tty, 10);
1857 }
1858 },read:function (stream, buffer, offset, length, pos /* ignored */) {
1859 if (!stream.tty || !stream.tty.ops.get_char) {
1860 throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
1861 }
1862 var bytesRead = 0;
1863 for (var i = 0; i < length; i++) {
1864 var result;
1865 try {
1866 result = stream.tty.ops.get_char(stream.tty);
1867 } catch (e) {
1868 throw new FS.ErrnoError(ERRNO_CODES.EIO);
1869 }
1870 if (result === undefined && bytesRead === 0) {
1871 throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
1872 }
1873 if (result === null || result === undefined) break;
1874 bytesRead++;
1875 buffer[offset+i] = result;
1876 }
1877 if (bytesRead) {
1878 stream.node.timestamp = Date.now();
1879 }
1880 return bytesRead;
1881 },write:function (stream, buffer, offset, length, pos) {
1882 if (!stream.tty || !stream.tty.ops.put_char) {
1883 throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
1884 }
1885 for (var i = 0; i < length; i++) {
1886 try {
1887 stream.tty.ops.put_char(stream.tty, buffer[offset+i]);
1888 } catch (e) {
1889 throw new FS.ErrnoError(ERRNO_CODES.EIO);
1890 }
1891 }
1892 if (length) {
1893 stream.node.timestamp = Date.now();
1894 }
1895 return i;
1896 }},default_tty_ops:{get_char:function (tty) {
1897 if (!tty.input.length) {
1898 var result = null;
1899 if (ENVIRONMENT_IS_NODE) {
1900 result = process['stdin']['read']();
1901 if (!result) {
1902 if (process['stdin']['_readableState'] && process['stdin']['_rea dableState']['ended']) {
1903 return null; // EOF
1904 }
1905 return undefined; // no data available
1906 }
1907 } else if (typeof window != 'undefined' &&
1908 typeof window.prompt == 'function') {
1909 // Browser.
1910 result = window.prompt('Input: '); // returns null on cancel
1911 if (result !== null) {
1912 result += '\n';
1913 }
1914 } else if (typeof readline == 'function') {
1915 // Command line.
1916 result = readline();
1917 if (result !== null) {
1918 result += '\n';
1919 }
1920 }
1921 if (!result) {
1922 return null;
1923 }
1924 tty.input = intArrayFromString(result, true);
1925 }
1926 return tty.input.shift();
1927 },put_char:function (tty, val) {
1928 if (val === null || val === 10) {
1929 Module['print'](tty.output.join(''));
1930 tty.output = [];
1931 } else {
1932 tty.output.push(TTY.utf8.processCChar(val));
1933 }
1934 }},default_tty1_ops:{put_char:function (tty, val) {
1935 if (val === null || val === 10) {
1936 Module['printErr'](tty.output.join(''));
1937 tty.output = [];
1938 } else {
1939 tty.output.push(TTY.utf8.processCChar(val));
1940 }
1941 }}};
1942
1943 var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3, mount:function (mount) {
1944 return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
1945 },createNode:function (parent, name, mode, dev) {
1946 if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
1947 // no supported
1948 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
1949 }
1950 if (!MEMFS.ops_table) {
1951 MEMFS.ops_table = {
1952 dir: {
1953 node: {
1954 getattr: MEMFS.node_ops.getattr,
1955 setattr: MEMFS.node_ops.setattr,
1956 lookup: MEMFS.node_ops.lookup,
1957 mknod: MEMFS.node_ops.mknod,
1958 rename: MEMFS.node_ops.rename,
1959 unlink: MEMFS.node_ops.unlink,
1960 rmdir: MEMFS.node_ops.rmdir,
1961 readdir: MEMFS.node_ops.readdir,
1962 symlink: MEMFS.node_ops.symlink
1963 },
1964 stream: {
1965 llseek: MEMFS.stream_ops.llseek
1966 }
1967 },
1968 file: {
1969 node: {
1970 getattr: MEMFS.node_ops.getattr,
1971 setattr: MEMFS.node_ops.setattr
1972 },
1973 stream: {
1974 llseek: MEMFS.stream_ops.llseek,
1975 read: MEMFS.stream_ops.read,
1976 write: MEMFS.stream_ops.write,
1977 allocate: MEMFS.stream_ops.allocate,
1978 mmap: MEMFS.stream_ops.mmap
1979 }
1980 },
1981 link: {
1982 node: {
1983 getattr: MEMFS.node_ops.getattr,
1984 setattr: MEMFS.node_ops.setattr,
1985 readlink: MEMFS.node_ops.readlink
1986 },
1987 stream: {}
1988 },
1989 chrdev: {
1990 node: {
1991 getattr: MEMFS.node_ops.getattr,
1992 setattr: MEMFS.node_ops.setattr
1993 },
1994 stream: FS.chrdev_stream_ops
1995 },
1996 };
1997 }
1998 var node = FS.createNode(parent, name, mode, dev);
1999 if (FS.isDir(node.mode)) {
2000 node.node_ops = MEMFS.ops_table.dir.node;
2001 node.stream_ops = MEMFS.ops_table.dir.stream;
2002 node.contents = {};
2003 } else if (FS.isFile(node.mode)) {
2004 node.node_ops = MEMFS.ops_table.file.node;
2005 node.stream_ops = MEMFS.ops_table.file.stream;
2006 node.contents = [];
2007 node.contentMode = MEMFS.CONTENT_FLEXIBLE;
2008 } else if (FS.isLink(node.mode)) {
2009 node.node_ops = MEMFS.ops_table.link.node;
2010 node.stream_ops = MEMFS.ops_table.link.stream;
2011 } else if (FS.isChrdev(node.mode)) {
2012 node.node_ops = MEMFS.ops_table.chrdev.node;
2013 node.stream_ops = MEMFS.ops_table.chrdev.stream;
2014 }
2015 node.timestamp = Date.now();
2016 // add the new node to the parent
2017 if (parent) {
2018 parent.contents[name] = node;
2019 }
2020 return node;
2021 },ensureFlexible:function (node) {
2022 if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {
2023 var contents = node.contents;
2024 node.contents = Array.prototype.slice.call(contents);
2025 node.contentMode = MEMFS.CONTENT_FLEXIBLE;
2026 }
2027 },node_ops:{getattr:function (node) {
2028 var attr = {};
2029 // device numbers reuse inode numbers.
2030 attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
2031 attr.ino = node.id;
2032 attr.mode = node.mode;
2033 attr.nlink = 1;
2034 attr.uid = 0;
2035 attr.gid = 0;
2036 attr.rdev = node.rdev;
2037 if (FS.isDir(node.mode)) {
2038 attr.size = 4096;
2039 } else if (FS.isFile(node.mode)) {
2040 attr.size = node.contents.length;
2041 } else if (FS.isLink(node.mode)) {
2042 attr.size = node.link.length;
2043 } else {
2044 attr.size = 0;
2045 }
2046 attr.atime = new Date(node.timestamp);
2047 attr.mtime = new Date(node.timestamp);
2048 attr.ctime = new Date(node.timestamp);
2049 // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksi ze),
2050 // but this is not required by the standard.
2051 attr.blksize = 4096;
2052 attr.blocks = Math.ceil(attr.size / attr.blksize);
2053 return attr;
2054 },setattr:function (node, attr) {
2055 if (attr.mode !== undefined) {
2056 node.mode = attr.mode;
2057 }
2058 if (attr.timestamp !== undefined) {
2059 node.timestamp = attr.timestamp;
2060 }
2061 if (attr.size !== undefined) {
2062 MEMFS.ensureFlexible(node);
2063 var contents = node.contents;
2064 if (attr.size < contents.length) contents.length = attr.size;
2065 else while (attr.size > contents.length) contents.push(0);
2066 }
2067 },lookup:function (parent, name) {
2068 throw FS.genericErrors[ERRNO_CODES.ENOENT];
2069 },mknod:function (parent, name, mode, dev) {
2070 return MEMFS.createNode(parent, name, mode, dev);
2071 },rename:function (old_node, new_dir, new_name) {
2072 // if we're overwriting a directory at new_name, make sure it's empty.
2073 if (FS.isDir(old_node.mode)) {
2074 var new_node;
2075 try {
2076 new_node = FS.lookupNode(new_dir, new_name);
2077 } catch (e) {
2078 }
2079 if (new_node) {
2080 for (var i in new_node.contents) {
2081 throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
2082 }
2083 }
2084 }
2085 // do the internal rewiring
2086 delete old_node.parent.contents[old_node.name];
2087 old_node.name = new_name;
2088 new_dir.contents[new_name] = old_node;
2089 old_node.parent = new_dir;
2090 },unlink:function (parent, name) {
2091 delete parent.contents[name];
2092 },rmdir:function (parent, name) {
2093 var node = FS.lookupNode(parent, name);
2094 for (var i in node.contents) {
2095 throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
2096 }
2097 delete parent.contents[name];
2098 },readdir:function (node) {
2099 var entries = ['.', '..']
2100 for (var key in node.contents) {
2101 if (!node.contents.hasOwnProperty(key)) {
2102 continue;
2103 }
2104 entries.push(key);
2105 }
2106 return entries;
2107 },symlink:function (parent, newname, oldpath) {
2108 var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0 );
2109 node.link = oldpath;
2110 return node;
2111 },readlink:function (node) {
2112 if (!FS.isLink(node.mode)) {
2113 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2114 }
2115 return node.link;
2116 }},stream_ops:{read:function (stream, buffer, offset, length, position) {
2117 var contents = stream.node.contents;
2118 if (position >= contents.length)
2119 return 0;
2120 var size = Math.min(contents.length - position, length);
2121 assert(size >= 0);
2122 if (size > 8 && contents.subarray) { // non-trivial, and typed array
2123 buffer.set(contents.subarray(position, position + size), offset);
2124 } else
2125 {
2126 for (var i = 0; i < size; i++) {
2127 buffer[offset + i] = contents[position + i];
2128 }
2129 }
2130 return size;
2131 },write:function (stream, buffer, offset, length, position, canOwn) {
2132 var node = stream.node;
2133 node.timestamp = Date.now();
2134 var contents = node.contents;
2135 if (length && contents.length === 0 && position === 0 && buffer.subarr ay) {
2136 // just replace it with the new data
2137 if (canOwn && offset === 0) {
2138 node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.
2139 node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTEN T_OWNING : MEMFS.CONTENT_FIXED;
2140 } else {
2141 node.contents = new Uint8Array(buffer.subarray(offset, offset+leng th));
2142 node.contentMode = MEMFS.CONTENT_FIXED;
2143 }
2144 return length;
2145 }
2146 MEMFS.ensureFlexible(node);
2147 var contents = node.contents;
2148 while (contents.length < position) contents.push(0);
2149 for (var i = 0; i < length; i++) {
2150 contents[position + i] = buffer[offset + i];
2151 }
2152 return length;
2153 },llseek:function (stream, offset, whence) {
2154 var position = offset;
2155 if (whence === 1) { // SEEK_CUR.
2156 position += stream.position;
2157 } else if (whence === 2) { // SEEK_END.
2158 if (FS.isFile(stream.node.mode)) {
2159 position += stream.node.contents.length;
2160 }
2161 }
2162 if (position < 0) {
2163 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2164 }
2165 stream.ungotten = [];
2166 stream.position = position;
2167 return position;
2168 },allocate:function (stream, offset, length) {
2169 MEMFS.ensureFlexible(stream.node);
2170 var contents = stream.node.contents;
2171 var limit = offset + length;
2172 while (limit > contents.length) contents.push(0);
2173 },mmap:function (stream, buffer, offset, length, position, prot, flags) {
2174 if (!FS.isFile(stream.node.mode)) {
2175 throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
2176 }
2177 var ptr;
2178 var allocated;
2179 var contents = stream.node.contents;
2180 // Only make a new copy when MAP_PRIVATE is specified.
2181 if ( !(flags & 2) &&
2182 (contents.buffer === buffer || contents.buffer === buffer.buffer ) ) {
2183 // We can't emulate MAP_SHARED when the file is not backed by the bu ffer
2184 // we're mapping to (e.g. the HEAP buffer).
2185 allocated = false;
2186 ptr = contents.byteOffset;
2187 } else {
2188 // Try to avoid unnecessary slices.
2189 if (position > 0 || position + length < contents.length) {
2190 if (contents.subarray) {
2191 contents = contents.subarray(position, position + length);
2192 } else {
2193 contents = Array.prototype.slice.call(contents, position, positi on + length);
2194 }
2195 }
2196 allocated = true;
2197 ptr = _malloc(length);
2198 if (!ptr) {
2199 throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
2200 }
2201 buffer.set(contents, ptr);
2202 }
2203 return { ptr: ptr, allocated: allocated };
2204 }}};
2205
2206 var IDBFS={dbs:{},indexedDB:function () {
2207 return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
2208 },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) {
2209 // reuse all of the core MEMFS functionality
2210 return MEMFS.mount.apply(null, arguments);
2211 },syncfs:function (mount, populate, callback) {
2212 IDBFS.getLocalSet(mount, function(err, local) {
2213 if (err) return callback(err);
2214
2215 IDBFS.getRemoteSet(mount, function(err, remote) {
2216 if (err) return callback(err);
2217
2218 var src = populate ? remote : local;
2219 var dst = populate ? local : remote;
2220
2221 IDBFS.reconcile(src, dst, callback);
2222 });
2223 });
2224 },getDB:function (name, callback) {
2225 // check the cache first
2226 var db = IDBFS.dbs[name];
2227 if (db) {
2228 return callback(null, db);
2229 }
2230
2231 var req;
2232 try {
2233 req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);
2234 } catch (e) {
2235 return callback(e);
2236 }
2237 req.onupgradeneeded = function(e) {
2238 var db = e.target.result;
2239 var transaction = e.target.transaction;
2240
2241 var fileStore;
2242
2243 if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
2244 fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);
2245 } else {
2246 fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);
2247 }
2248
2249 fileStore.createIndex('timestamp', 'timestamp', { unique: false });
2250 };
2251 req.onsuccess = function() {
2252 db = req.result;
2253
2254 // add to the cache
2255 IDBFS.dbs[name] = db;
2256 callback(null, db);
2257 };
2258 req.onerror = function() {
2259 callback(this.error);
2260 };
2261 },getLocalSet:function (mount, callback) {
2262 var entries = {};
2263
2264 function isRealDir(p) {
2265 return p !== '.' && p !== '..';
2266 };
2267 function toAbsolute(root) {
2268 return function(p) {
2269 return PATH.join2(root, p);
2270 }
2271 };
2272
2273 var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolut e(mount.mountpoint));
2274
2275 while (check.length) {
2276 var path = check.pop();
2277 var stat;
2278
2279 try {
2280 stat = FS.stat(path);
2281 } catch (e) {
2282 return callback(e);
2283 }
2284
2285 if (FS.isDir(stat.mode)) {
2286 check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbs olute(path)));
2287 }
2288
2289 entries[path] = { timestamp: stat.mtime };
2290 }
2291
2292 return callback(null, { type: 'local', entries: entries });
2293 },getRemoteSet:function (mount, callback) {
2294 var entries = {};
2295
2296 IDBFS.getDB(mount.mountpoint, function(err, db) {
2297 if (err) return callback(err);
2298
2299 var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
2300 transaction.onerror = function() { callback(this.error); };
2301
2302 var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
2303 var index = store.index('timestamp');
2304
2305 index.openKeyCursor().onsuccess = function(event) {
2306 var cursor = event.target.result;
2307
2308 if (!cursor) {
2309 return callback(null, { type: 'remote', db: db, entries: entries } );
2310 }
2311
2312 entries[cursor.primaryKey] = { timestamp: cursor.key };
2313
2314 cursor.continue();
2315 };
2316 });
2317 },loadLocalEntry:function (path, callback) {
2318 var stat, node;
2319
2320 try {
2321 var lookup = FS.lookupPath(path);
2322 node = lookup.node;
2323 stat = FS.stat(path);
2324 } catch (e) {
2325 return callback(e);
2326 }
2327
2328 if (FS.isDir(stat.mode)) {
2329 return callback(null, { timestamp: stat.mtime, mode: stat.mode });
2330 } else if (FS.isFile(stat.mode)) {
2331 return callback(null, { timestamp: stat.mtime, mode: stat.mode, conten ts: node.contents });
2332 } else {
2333 return callback(new Error('node type not supported'));
2334 }
2335 },storeLocalEntry:function (path, entry, callback) {
2336 try {
2337 if (FS.isDir(entry.mode)) {
2338 FS.mkdir(path, entry.mode);
2339 } else if (FS.isFile(entry.mode)) {
2340 FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: tru e });
2341 } else {
2342 return callback(new Error('node type not supported'));
2343 }
2344
2345 FS.utime(path, entry.timestamp, entry.timestamp);
2346 } catch (e) {
2347 return callback(e);
2348 }
2349
2350 callback(null);
2351 },removeLocalEntry:function (path, callback) {
2352 try {
2353 var lookup = FS.lookupPath(path);
2354 var stat = FS.stat(path);
2355
2356 if (FS.isDir(stat.mode)) {
2357 FS.rmdir(path);
2358 } else if (FS.isFile(stat.mode)) {
2359 FS.unlink(path);
2360 }
2361 } catch (e) {
2362 return callback(e);
2363 }
2364
2365 callback(null);
2366 },loadRemoteEntry:function (store, path, callback) {
2367 var req = store.get(path);
2368 req.onsuccess = function(event) { callback(null, event.target.result); } ;
2369 req.onerror = function() { callback(this.error); };
2370 },storeRemoteEntry:function (store, path, entry, callback) {
2371 var req = store.put(entry, path);
2372 req.onsuccess = function() { callback(null); };
2373 req.onerror = function() { callback(this.error); };
2374 },removeRemoteEntry:function (store, path, callback) {
2375 var req = store.delete(path);
2376 req.onsuccess = function() { callback(null); };
2377 req.onerror = function() { callback(this.error); };
2378 },reconcile:function (src, dst, callback) {
2379 var total = 0;
2380
2381 var create = [];
2382 Object.keys(src.entries).forEach(function (key) {
2383 var e = src.entries[key];
2384 var e2 = dst.entries[key];
2385 if (!e2 || e.timestamp > e2.timestamp) {
2386 create.push(key);
2387 total++;
2388 }
2389 });
2390
2391 var remove = [];
2392 Object.keys(dst.entries).forEach(function (key) {
2393 var e = dst.entries[key];
2394 var e2 = src.entries[key];
2395 if (!e2) {
2396 remove.push(key);
2397 total++;
2398 }
2399 });
2400
2401 if (!total) {
2402 return callback(null);
2403 }
2404
2405 var errored = false;
2406 var completed = 0;
2407 var db = src.type === 'remote' ? src.db : dst.db;
2408 var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');
2409 var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
2410
2411 function done(err) {
2412 if (err) {
2413 if (!done.errored) {
2414 done.errored = true;
2415 return callback(err);
2416 }
2417 return;
2418 }
2419 if (++completed >= total) {
2420 return callback(null);
2421 }
2422 };
2423
2424 transaction.onerror = function() { done(this.error); };
2425
2426 // sort paths in ascending order so directory entries are created
2427 // before the files inside them
2428 create.sort().forEach(function (path) {
2429 if (dst.type === 'local') {
2430 IDBFS.loadRemoteEntry(store, path, function (err, entry) {
2431 if (err) return done(err);
2432 IDBFS.storeLocalEntry(path, entry, done);
2433 });
2434 } else {
2435 IDBFS.loadLocalEntry(path, function (err, entry) {
2436 if (err) return done(err);
2437 IDBFS.storeRemoteEntry(store, path, entry, done);
2438 });
2439 }
2440 });
2441
2442 // sort paths in descending order so files are deleted before their
2443 // parent directories
2444 remove.sort().reverse().forEach(function(path) {
2445 if (dst.type === 'local') {
2446 IDBFS.removeLocalEntry(path, done);
2447 } else {
2448 IDBFS.removeRemoteEntry(store, path, done);
2449 }
2450 });
2451 }};
2452
2453 var NODEFS={isWindows:false,staticInit:function () {
2454 NODEFS.isWindows = !!process.platform.match(/^win/);
2455 },mount:function (mount) {
2456 assert(ENVIRONMENT_IS_NODE);
2457 return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
2458 },createNode:function (parent, name, mode, dev) {
2459 if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
2460 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2461 }
2462 var node = FS.createNode(parent, name, mode);
2463 node.node_ops = NODEFS.node_ops;
2464 node.stream_ops = NODEFS.stream_ops;
2465 return node;
2466 },getMode:function (path) {
2467 var stat;
2468 try {
2469 stat = fs.lstatSync(path);
2470 if (NODEFS.isWindows) {
2471 // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
2472 // propagate write bits to execute bits.
2473 stat.mode = stat.mode | ((stat.mode & 146) >> 1);
2474 }
2475 } catch (e) {
2476 if (!e.code) throw e;
2477 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2478 }
2479 return stat.mode;
2480 },realPath:function (node) {
2481 var parts = [];
2482 while (node.parent !== node) {
2483 parts.push(node.name);
2484 node = node.parent;
2485 }
2486 parts.push(node.mount.opts.root);
2487 parts.reverse();
2488 return PATH.join.apply(null, parts);
2489 },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",1 29:"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:"r s",4098:"rs+"},flagsToPermissionString:function (flags) {
2490 if (flags in NODEFS.flagsToPermissionStringMap) {
2491 return NODEFS.flagsToPermissionStringMap[flags];
2492 } else {
2493 return flags;
2494 }
2495 },node_ops:{getattr:function (node) {
2496 var path = NODEFS.realPath(node);
2497 var stat;
2498 try {
2499 stat = fs.lstatSync(path);
2500 } catch (e) {
2501 if (!e.code) throw e;
2502 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2503 }
2504 // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
2505 // See http://support.microsoft.com/kb/140365
2506 if (NODEFS.isWindows && !stat.blksize) {
2507 stat.blksize = 4096;
2508 }
2509 if (NODEFS.isWindows && !stat.blocks) {
2510 stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
2511 }
2512 return {
2513 dev: stat.dev,
2514 ino: stat.ino,
2515 mode: stat.mode,
2516 nlink: stat.nlink,
2517 uid: stat.uid,
2518 gid: stat.gid,
2519 rdev: stat.rdev,
2520 size: stat.size,
2521 atime: stat.atime,
2522 mtime: stat.mtime,
2523 ctime: stat.ctime,
2524 blksize: stat.blksize,
2525 blocks: stat.blocks
2526 };
2527 },setattr:function (node, attr) {
2528 var path = NODEFS.realPath(node);
2529 try {
2530 if (attr.mode !== undefined) {
2531 fs.chmodSync(path, attr.mode);
2532 // update the common node structure mode as well
2533 node.mode = attr.mode;
2534 }
2535 if (attr.timestamp !== undefined) {
2536 var date = new Date(attr.timestamp);
2537 fs.utimesSync(path, date, date);
2538 }
2539 if (attr.size !== undefined) {
2540 fs.truncateSync(path, attr.size);
2541 }
2542 } catch (e) {
2543 if (!e.code) throw e;
2544 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2545 }
2546 },lookup:function (parent, name) {
2547 var path = PATH.join2(NODEFS.realPath(parent), name);
2548 var mode = NODEFS.getMode(path);
2549 return NODEFS.createNode(parent, name, mode);
2550 },mknod:function (parent, name, mode, dev) {
2551 var node = NODEFS.createNode(parent, name, mode, dev);
2552 // create the backing node for this in the fs root as well
2553 var path = NODEFS.realPath(node);
2554 try {
2555 if (FS.isDir(node.mode)) {
2556 fs.mkdirSync(path, node.mode);
2557 } else {
2558 fs.writeFileSync(path, '', { mode: node.mode });
2559 }
2560 } catch (e) {
2561 if (!e.code) throw e;
2562 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2563 }
2564 return node;
2565 },rename:function (oldNode, newDir, newName) {
2566 var oldPath = NODEFS.realPath(oldNode);
2567 var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
2568 try {
2569 fs.renameSync(oldPath, newPath);
2570 } catch (e) {
2571 if (!e.code) throw e;
2572 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2573 }
2574 },unlink:function (parent, name) {
2575 var path = PATH.join2(NODEFS.realPath(parent), name);
2576 try {
2577 fs.unlinkSync(path);
2578 } catch (e) {
2579 if (!e.code) throw e;
2580 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2581 }
2582 },rmdir:function (parent, name) {
2583 var path = PATH.join2(NODEFS.realPath(parent), name);
2584 try {
2585 fs.rmdirSync(path);
2586 } catch (e) {
2587 if (!e.code) throw e;
2588 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2589 }
2590 },readdir:function (node) {
2591 var path = NODEFS.realPath(node);
2592 try {
2593 return fs.readdirSync(path);
2594 } catch (e) {
2595 if (!e.code) throw e;
2596 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2597 }
2598 },symlink:function (parent, newName, oldPath) {
2599 var newPath = PATH.join2(NODEFS.realPath(parent), newName);
2600 try {
2601 fs.symlinkSync(oldPath, newPath);
2602 } catch (e) {
2603 if (!e.code) throw e;
2604 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2605 }
2606 },readlink:function (node) {
2607 var path = NODEFS.realPath(node);
2608 try {
2609 return fs.readlinkSync(path);
2610 } catch (e) {
2611 if (!e.code) throw e;
2612 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2613 }
2614 }},stream_ops:{open:function (stream) {
2615 var path = NODEFS.realPath(stream.node);
2616 try {
2617 if (FS.isFile(stream.node.mode)) {
2618 stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stre am.flags));
2619 }
2620 } catch (e) {
2621 if (!e.code) throw e;
2622 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2623 }
2624 },close:function (stream) {
2625 try {
2626 if (FS.isFile(stream.node.mode) && stream.nfd) {
2627 fs.closeSync(stream.nfd);
2628 }
2629 } catch (e) {
2630 if (!e.code) throw e;
2631 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2632 }
2633 },read:function (stream, buffer, offset, length, position) {
2634 // FIXME this is terrible.
2635 var nbuffer = new Buffer(length);
2636 var res;
2637 try {
2638 res = fs.readSync(stream.nfd, nbuffer, 0, length, position);
2639 } catch (e) {
2640 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2641 }
2642 if (res > 0) {
2643 for (var i = 0; i < res; i++) {
2644 buffer[offset + i] = nbuffer[i];
2645 }
2646 }
2647 return res;
2648 },write:function (stream, buffer, offset, length, position) {
2649 // FIXME this is terrible.
2650 var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
2651 var res;
2652 try {
2653 res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);
2654 } catch (e) {
2655 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2656 }
2657 return res;
2658 },llseek:function (stream, offset, whence) {
2659 var position = offset;
2660 if (whence === 1) { // SEEK_CUR.
2661 position += stream.position;
2662 } else if (whence === 2) { // SEEK_END.
2663 if (FS.isFile(stream.node.mode)) {
2664 try {
2665 var stat = fs.fstatSync(stream.nfd);
2666 position += stat.size;
2667 } catch (e) {
2668 throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2669 }
2670 }
2671 }
2672
2673 if (position < 0) {
2674 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2675 }
2676
2677 stream.position = position;
2678 return position;
2679 }}};
2680
2681 var _stdin=allocate(1, "i32*", ALLOC_STATIC);
2682
2683 var _stdout=allocate(1, "i32*", ALLOC_STATIC);
2684
2685 var _stderr=allocate(1, "i32*", ALLOC_STATIC);
2686
2687 function _fflush(stream) {
2688 // int fflush(FILE *stream);
2689 // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
2690 // we don't currently perform any user-space buffering of data
2691 }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable :null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,g enericErrors:{},handleFSError:function (e) {
2692 if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
2693 return ___setErrNo(e.errno);
2694 },lookupPath:function (path, opts) {
2695 path = PATH.resolve(FS.cwd(), path);
2696 opts = opts || {};
2697
2698 var defaults = {
2699 follow_mount: true,
2700 recurse_count: 0
2701 };
2702 for (var key in defaults) {
2703 if (opts[key] === undefined) {
2704 opts[key] = defaults[key];
2705 }
2706 }
2707
2708 if (opts.recurse_count > 8) { // max recursive lookup of 8
2709 throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
2710 }
2711
2712 // split the path
2713 var parts = PATH.normalizeArray(path.split('/').filter(function(p) {
2714 return !!p;
2715 }), false);
2716
2717 // start at the root
2718 var current = FS.root;
2719 var current_path = '/';
2720
2721 for (var i = 0; i < parts.length; i++) {
2722 var islast = (i === parts.length-1);
2723 if (islast && opts.parent) {
2724 // stop resolving
2725 break;
2726 }
2727
2728 current = FS.lookupNode(current, parts[i]);
2729 current_path = PATH.join2(current_path, parts[i]);
2730
2731 // jump to the mount's root node if this is a mountpoint
2732 if (FS.isMountpoint(current)) {
2733 if (!islast || (islast && opts.follow_mount)) {
2734 current = current.mounted.root;
2735 }
2736 }
2737
2738 // by default, lookupPath will not follow a symlink if it is the final path component.
2739 // setting opts.follow = true will override this behavior.
2740 if (!islast || opts.follow) {
2741 var count = 0;
2742 while (FS.isLink(current.mode)) {
2743 var link = FS.readlink(current_path);
2744 current_path = PATH.resolve(PATH.dirname(current_path), link);
2745
2746 var lookup = FS.lookupPath(current_path, { recurse_count: opts.rec urse_count });
2747 current = lookup.node;
2748
2749 if (count++ > 40) { // limit max consecutive symlinks to 40 (SYML OOP_MAX).
2750 throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
2751 }
2752 }
2753 }
2754 }
2755
2756 return { path: current_path, node: current };
2757 },getPath:function (node) {
2758 var path;
2759 while (true) {
2760 if (FS.isRoot(node)) {
2761 var mount = node.mount.mountpoint;
2762 if (!path) return mount;
2763 return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;
2764 }
2765 path = path ? node.name + '/' + path : node.name;
2766 node = node.parent;
2767 }
2768 },hashName:function (parentid, name) {
2769 var hash = 0;
2770
2771
2772 for (var i = 0; i < name.length; i++) {
2773 hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
2774 }
2775 return ((parentid + hash) >>> 0) % FS.nameTable.length;
2776 },hashAddNode:function (node) {
2777 var hash = FS.hashName(node.parent.id, node.name);
2778 node.name_next = FS.nameTable[hash];
2779 FS.nameTable[hash] = node;
2780 },hashRemoveNode:function (node) {
2781 var hash = FS.hashName(node.parent.id, node.name);
2782 if (FS.nameTable[hash] === node) {
2783 FS.nameTable[hash] = node.name_next;
2784 } else {
2785 var current = FS.nameTable[hash];
2786 while (current) {
2787 if (current.name_next === node) {
2788 current.name_next = node.name_next;
2789 break;
2790 }
2791 current = current.name_next;
2792 }
2793 }
2794 },lookupNode:function (parent, name) {
2795 var err = FS.mayLookup(parent);
2796 if (err) {
2797 throw new FS.ErrnoError(err);
2798 }
2799 var hash = FS.hashName(parent.id, name);
2800 for (var node = FS.nameTable[hash]; node; node = node.name_next) {
2801 var nodeName = node.name;
2802 if (node.parent.id === parent.id && nodeName === name) {
2803 return node;
2804 }
2805 }
2806 // if we failed to find it in the cache, call into the VFS
2807 return FS.lookup(parent, name);
2808 },createNode:function (parent, name, mode, rdev) {
2809 if (!FS.FSNode) {
2810 FS.FSNode = function(parent, name, mode, rdev) {
2811 if (!parent) {
2812 parent = this; // root node sets parent to itself
2813 }
2814 this.parent = parent;
2815 this.mount = parent.mount;
2816 this.mounted = null;
2817 this.id = FS.nextInode++;
2818 this.name = name;
2819 this.mode = mode;
2820 this.node_ops = {};
2821 this.stream_ops = {};
2822 this.rdev = rdev;
2823 };
2824
2825 FS.FSNode.prototype = {};
2826
2827 // compatibility
2828 var readMode = 292 | 73;
2829 var writeMode = 146;
2830
2831 // NOTE we must use Object.defineProperties instead of individual call s to
2832 // Object.defineProperty in order to make closure compiler happy
2833 Object.defineProperties(FS.FSNode.prototype, {
2834 read: {
2835 get: function() { return (this.mode & readMode) === readMode; },
2836 set: function(val) { val ? this.mode |= readMode : this.mode &= ~r eadMode; }
2837 },
2838 write: {
2839 get: function() { return (this.mode & writeMode) === writeMode; },
2840 set: function(val) { val ? this.mode |= writeMode : this.mode &= ~ writeMode; }
2841 },
2842 isFolder: {
2843 get: function() { return FS.isDir(this.mode); },
2844 },
2845 isDevice: {
2846 get: function() { return FS.isChrdev(this.mode); },
2847 },
2848 });
2849 }
2850
2851 var node = new FS.FSNode(parent, name, mode, rdev);
2852
2853 FS.hashAddNode(node);
2854
2855 return node;
2856 },destroyNode:function (node) {
2857 FS.hashRemoveNode(node);
2858 },isRoot:function (node) {
2859 return node === node.parent;
2860 },isMountpoint:function (node) {
2861 return !!node.mounted;
2862 },isFile:function (mode) {
2863 return (mode & 61440) === 32768;
2864 },isDir:function (mode) {
2865 return (mode & 61440) === 16384;
2866 },isLink:function (mode) {
2867 return (mode & 61440) === 40960;
2868 },isChrdev:function (mode) {
2869 return (mode & 61440) === 8192;
2870 },isBlkdev:function (mode) {
2871 return (mode & 61440) === 24576;
2872 },isFIFO:function (mode) {
2873 return (mode & 61440) === 4096;
2874 },isSocket:function (mode) {
2875 return (mode & 49152) === 49152;
2876 },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) {
2877 var flags = FS.flagModes[str];
2878 if (typeof flags === 'undefined') {
2879 throw new Error('Unknown file open mode: ' + str);
2880 }
2881 return flags;
2882 },flagsToPermissionString:function (flag) {
2883 var accmode = flag & 2097155;
2884 var perms = ['r', 'w', 'rw'][accmode];
2885 if ((flag & 512)) {
2886 perms += 'w';
2887 }
2888 return perms;
2889 },nodePermissions:function (node, perms) {
2890 if (FS.ignorePermissions) {
2891 return 0;
2892 }
2893 // return 0 if any user, group or owner bits are set.
2894 if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
2895 return ERRNO_CODES.EACCES;
2896 } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
2897 return ERRNO_CODES.EACCES;
2898 } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
2899 return ERRNO_CODES.EACCES;
2900 }
2901 return 0;
2902 },mayLookup:function (dir) {
2903 return FS.nodePermissions(dir, 'x');
2904 },mayCreate:function (dir, name) {
2905 try {
2906 var node = FS.lookupNode(dir, name);
2907 return ERRNO_CODES.EEXIST;
2908 } catch (e) {
2909 }
2910 return FS.nodePermissions(dir, 'wx');
2911 },mayDelete:function (dir, name, isdir) {
2912 var node;
2913 try {
2914 node = FS.lookupNode(dir, name);
2915 } catch (e) {
2916 return e.errno;
2917 }
2918 var err = FS.nodePermissions(dir, 'wx');
2919 if (err) {
2920 return err;
2921 }
2922 if (isdir) {
2923 if (!FS.isDir(node.mode)) {
2924 return ERRNO_CODES.ENOTDIR;
2925 }
2926 if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
2927 return ERRNO_CODES.EBUSY;
2928 }
2929 } else {
2930 if (FS.isDir(node.mode)) {
2931 return ERRNO_CODES.EISDIR;
2932 }
2933 }
2934 return 0;
2935 },mayOpen:function (node, flags) {
2936 if (!node) {
2937 return ERRNO_CODES.ENOENT;
2938 }
2939 if (FS.isLink(node.mode)) {
2940 return ERRNO_CODES.ELOOP;
2941 } else if (FS.isDir(node.mode)) {
2942 if ((flags & 2097155) !== 0 || // opening for write
2943 (flags & 512)) {
2944 return ERRNO_CODES.EISDIR;
2945 }
2946 }
2947 return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
2948 },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {
2949 fd_start = fd_start || 0;
2950 fd_end = fd_end || FS.MAX_OPEN_FDS;
2951 for (var fd = fd_start; fd <= fd_end; fd++) {
2952 if (!FS.streams[fd]) {
2953 return fd;
2954 }
2955 }
2956 throw new FS.ErrnoError(ERRNO_CODES.EMFILE);
2957 },getStream:function (fd) {
2958 return FS.streams[fd];
2959 },createStream:function (stream, fd_start, fd_end) {
2960 if (!FS.FSStream) {
2961 FS.FSStream = function(){};
2962 FS.FSStream.prototype = {};
2963 // compatibility
2964 Object.defineProperties(FS.FSStream.prototype, {
2965 object: {
2966 get: function() { return this.node; },
2967 set: function(val) { this.node = val; }
2968 },
2969 isRead: {
2970 get: function() { return (this.flags & 2097155) !== 1; }
2971 },
2972 isWrite: {
2973 get: function() { return (this.flags & 2097155) !== 0; }
2974 },
2975 isAppend: {
2976 get: function() { return (this.flags & 1024); }
2977 }
2978 });
2979 }
2980 if (0) {
2981 // reuse the object
2982 stream.__proto__ = FS.FSStream.prototype;
2983 } else {
2984 var newStream = new FS.FSStream();
2985 for (var p in stream) {
2986 newStream[p] = stream[p];
2987 }
2988 stream = newStream;
2989 }
2990 var fd = FS.nextfd(fd_start, fd_end);
2991 stream.fd = fd;
2992 FS.streams[fd] = stream;
2993 return stream;
2994 },closeStream:function (fd) {
2995 FS.streams[fd] = null;
2996 },getStreamFromPtr:function (ptr) {
2997 return FS.streams[ptr - 1];
2998 },getPtrForStream:function (stream) {
2999 return stream ? stream.fd + 1 : 0;
3000 },chrdev_stream_ops:{open:function (stream) {
3001 var device = FS.getDevice(stream.node.rdev);
3002 // override node's stream ops with the device's
3003 stream.stream_ops = device.stream_ops;
3004 // forward the open call
3005 if (stream.stream_ops.open) {
3006 stream.stream_ops.open(stream);
3007 }
3008 },llseek:function () {
3009 throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3010 }},major:function (dev) {
3011 return ((dev) >> 8);
3012 },minor:function (dev) {
3013 return ((dev) & 0xff);
3014 },makedev:function (ma, mi) {
3015 return ((ma) << 8 | (mi));
3016 },registerDevice:function (dev, ops) {
3017 FS.devices[dev] = { stream_ops: ops };
3018 },getDevice:function (dev) {
3019 return FS.devices[dev];
3020 },getMounts:function (mount) {
3021 var mounts = [];
3022 var check = [mount];
3023
3024 while (check.length) {
3025 var m = check.pop();
3026
3027 mounts.push(m);
3028
3029 check.push.apply(check, m.mounts);
3030 }
3031
3032 return mounts;
3033 },syncfs:function (populate, callback) {
3034 if (typeof(populate) === 'function') {
3035 callback = populate;
3036 populate = false;
3037 }
3038
3039 var mounts = FS.getMounts(FS.root.mount);
3040 var completed = 0;
3041
3042 function done(err) {
3043 if (err) {
3044 if (!done.errored) {
3045 done.errored = true;
3046 return callback(err);
3047 }
3048 return;
3049 }
3050 if (++completed >= mounts.length) {
3051 callback(null);
3052 }
3053 };
3054
3055 // sync all mounts
3056 mounts.forEach(function (mount) {
3057 if (!mount.type.syncfs) {
3058 return done(null);
3059 }
3060 mount.type.syncfs(mount, populate, done);
3061 });
3062 },mount:function (type, opts, mountpoint) {
3063 var root = mountpoint === '/';
3064 var pseudo = !mountpoint;
3065 var node;
3066
3067 if (root && FS.root) {
3068 throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3069 } else if (!root && !pseudo) {
3070 var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
3071
3072 mountpoint = lookup.path; // use the absolute path
3073 node = lookup.node;
3074
3075 if (FS.isMountpoint(node)) {
3076 throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3077 }
3078
3079 if (!FS.isDir(node.mode)) {
3080 throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
3081 }
3082 }
3083
3084 var mount = {
3085 type: type,
3086 opts: opts,
3087 mountpoint: mountpoint,
3088 mounts: []
3089 };
3090
3091 // create a root node for the fs
3092 var mountRoot = type.mount(mount);
3093 mountRoot.mount = mount;
3094 mount.root = mountRoot;
3095
3096 if (root) {
3097 FS.root = mountRoot;
3098 } else if (node) {
3099 // set as a mountpoint
3100 node.mounted = mount;
3101
3102 // add the new mount to the current mount's children
3103 if (node.mount) {
3104 node.mount.mounts.push(mount);
3105 }
3106 }
3107
3108 return mountRoot;
3109 },unmount:function (mountpoint) {
3110 var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
3111
3112 if (!FS.isMountpoint(lookup.node)) {
3113 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3114 }
3115
3116 // destroy the nodes for this mount, and all its child mounts
3117 var node = lookup.node;
3118 var mount = node.mounted;
3119 var mounts = FS.getMounts(mount);
3120
3121 Object.keys(FS.nameTable).forEach(function (hash) {
3122 var current = FS.nameTable[hash];
3123
3124 while (current) {
3125 var next = current.name_next;
3126
3127 if (mounts.indexOf(current.mount) !== -1) {
3128 FS.destroyNode(current);
3129 }
3130
3131 current = next;
3132 }
3133 });
3134
3135 // no longer a mountpoint
3136 node.mounted = null;
3137
3138 // remove this mount from the child mounts
3139 var idx = node.mount.mounts.indexOf(mount);
3140 assert(idx !== -1);
3141 node.mount.mounts.splice(idx, 1);
3142 },lookup:function (parent, name) {
3143 return parent.node_ops.lookup(parent, name);
3144 },mknod:function (path, mode, dev) {
3145 var lookup = FS.lookupPath(path, { parent: true });
3146 var parent = lookup.node;
3147 var name = PATH.basename(path);
3148 var err = FS.mayCreate(parent, name);
3149 if (err) {
3150 throw new FS.ErrnoError(err);
3151 }
3152 if (!parent.node_ops.mknod) {
3153 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3154 }
3155 return parent.node_ops.mknod(parent, name, mode, dev);
3156 },create:function (path, mode) {
3157 mode = mode !== undefined ? mode : 438 /* 0666 */;
3158 mode &= 4095;
3159 mode |= 32768;
3160 return FS.mknod(path, mode, 0);
3161 },mkdir:function (path, mode) {
3162 mode = mode !== undefined ? mode : 511 /* 0777 */;
3163 mode &= 511 | 512;
3164 mode |= 16384;
3165 return FS.mknod(path, mode, 0);
3166 },mkdev:function (path, mode, dev) {
3167 if (typeof(dev) === 'undefined') {
3168 dev = mode;
3169 mode = 438 /* 0666 */;
3170 }
3171 mode |= 8192;
3172 return FS.mknod(path, mode, dev);
3173 },symlink:function (oldpath, newpath) {
3174 var lookup = FS.lookupPath(newpath, { parent: true });
3175 var parent = lookup.node;
3176 var newname = PATH.basename(newpath);
3177 var err = FS.mayCreate(parent, newname);
3178 if (err) {
3179 throw new FS.ErrnoError(err);
3180 }
3181 if (!parent.node_ops.symlink) {
3182 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3183 }
3184 return parent.node_ops.symlink(parent, newname, oldpath);
3185 },rename:function (old_path, new_path) {
3186 var old_dirname = PATH.dirname(old_path);
3187 var new_dirname = PATH.dirname(new_path);
3188 var old_name = PATH.basename(old_path);
3189 var new_name = PATH.basename(new_path);
3190 // parents must exist
3191 var lookup, old_dir, new_dir;
3192 try {
3193 lookup = FS.lookupPath(old_path, { parent: true });
3194 old_dir = lookup.node;
3195 lookup = FS.lookupPath(new_path, { parent: true });
3196 new_dir = lookup.node;
3197 } catch (e) {
3198 throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3199 }
3200 // need to be part of the same mount
3201 if (old_dir.mount !== new_dir.mount) {
3202 throw new FS.ErrnoError(ERRNO_CODES.EXDEV);
3203 }
3204 // source must exist
3205 var old_node = FS.lookupNode(old_dir, old_name);
3206 // old path should not be an ancestor of the new path
3207 var relative = PATH.relative(old_path, new_dirname);
3208 if (relative.charAt(0) !== '.') {
3209 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3210 }
3211 // new path should not be an ancestor of the old path
3212 relative = PATH.relative(new_path, old_dirname);
3213 if (relative.charAt(0) !== '.') {
3214 throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
3215 }
3216 // see if the new path already exists
3217 var new_node;
3218 try {
3219 new_node = FS.lookupNode(new_dir, new_name);
3220 } catch (e) {
3221 // not fatal
3222 }
3223 // early out if nothing needs to change
3224 if (old_node === new_node) {
3225 return;
3226 }
3227 // we'll need to delete the old entry
3228 var isdir = FS.isDir(old_node.mode);
3229 var err = FS.mayDelete(old_dir, old_name, isdir);
3230 if (err) {
3231 throw new FS.ErrnoError(err);
3232 }
3233 // need delete permissions if we'll be overwriting.
3234 // need create permissions if new doesn't already exist.
3235 err = new_node ?
3236 FS.mayDelete(new_dir, new_name, isdir) :
3237 FS.mayCreate(new_dir, new_name);
3238 if (err) {
3239 throw new FS.ErrnoError(err);
3240 }
3241 if (!old_dir.node_ops.rename) {
3242 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3243 }
3244 if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node)) ) {
3245 throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3246 }
3247 // if we are going to change the parent, check write permissions
3248 if (new_dir !== old_dir) {
3249 err = FS.nodePermissions(old_dir, 'w');
3250 if (err) {
3251 throw new FS.ErrnoError(err);
3252 }
3253 }
3254 // remove the node from the lookup hash
3255 FS.hashRemoveNode(old_node);
3256 // do the underlying fs rename
3257 try {
3258 old_dir.node_ops.rename(old_node, new_dir, new_name);
3259 } catch (e) {
3260 throw e;
3261 } finally {
3262 // add the node back to the hash (in case node_ops.rename
3263 // changed its name)
3264 FS.hashAddNode(old_node);
3265 }
3266 },rmdir:function (path) {
3267 var lookup = FS.lookupPath(path, { parent: true });
3268 var parent = lookup.node;
3269 var name = PATH.basename(path);
3270 var node = FS.lookupNode(parent, name);
3271 var err = FS.mayDelete(parent, name, true);
3272 if (err) {
3273 throw new FS.ErrnoError(err);
3274 }
3275 if (!parent.node_ops.rmdir) {
3276 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3277 }
3278 if (FS.isMountpoint(node)) {
3279 throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3280 }
3281 parent.node_ops.rmdir(parent, name);
3282 FS.destroyNode(node);
3283 },readdir:function (path) {
3284 var lookup = FS.lookupPath(path, { follow: true });
3285 var node = lookup.node;
3286 if (!node.node_ops.readdir) {
3287 throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
3288 }
3289 return node.node_ops.readdir(node);
3290 },unlink:function (path) {
3291 var lookup = FS.lookupPath(path, { parent: true });
3292 var parent = lookup.node;
3293 var name = PATH.basename(path);
3294 var node = FS.lookupNode(parent, name);
3295 var err = FS.mayDelete(parent, name, false);
3296 if (err) {
3297 // POSIX says unlink should set EPERM, not EISDIR
3298 if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;
3299 throw new FS.ErrnoError(err);
3300 }
3301 if (!parent.node_ops.unlink) {
3302 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3303 }
3304 if (FS.isMountpoint(node)) {
3305 throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3306 }
3307 parent.node_ops.unlink(parent, name);
3308 FS.destroyNode(node);
3309 },readlink:function (path) {
3310 var lookup = FS.lookupPath(path);
3311 var link = lookup.node;
3312 if (!link.node_ops.readlink) {
3313 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3314 }
3315 return link.node_ops.readlink(link);
3316 },stat:function (path, dontFollow) {
3317 var lookup = FS.lookupPath(path, { follow: !dontFollow });
3318 var node = lookup.node;
3319 if (!node.node_ops.getattr) {
3320 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3321 }
3322 return node.node_ops.getattr(node);
3323 },lstat:function (path) {
3324 return FS.stat(path, true);
3325 },chmod:function (path, mode, dontFollow) {
3326 var node;
3327 if (typeof path === 'string') {
3328 var lookup = FS.lookupPath(path, { follow: !dontFollow });
3329 node = lookup.node;
3330 } else {
3331 node = path;
3332 }
3333 if (!node.node_ops.setattr) {
3334 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3335 }
3336 node.node_ops.setattr(node, {
3337 mode: (mode & 4095) | (node.mode & ~4095),
3338 timestamp: Date.now()
3339 });
3340 },lchmod:function (path, mode) {
3341 FS.chmod(path, mode, true);
3342 },fchmod:function (fd, mode) {
3343 var stream = FS.getStream(fd);
3344 if (!stream) {
3345 throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3346 }
3347 FS.chmod(stream.node, mode);
3348 },chown:function (path, uid, gid, dontFollow) {
3349 var node;
3350 if (typeof path === 'string') {
3351 var lookup = FS.lookupPath(path, { follow: !dontFollow });
3352 node = lookup.node;
3353 } else {
3354 node = path;
3355 }
3356 if (!node.node_ops.setattr) {
3357 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3358 }
3359 node.node_ops.setattr(node, {
3360 timestamp: Date.now()
3361 // we ignore the uid / gid for now
3362 });
3363 },lchown:function (path, uid, gid) {
3364 FS.chown(path, uid, gid, true);
3365 },fchown:function (fd, uid, gid) {
3366 var stream = FS.getStream(fd);
3367 if (!stream) {
3368 throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3369 }
3370 FS.chown(stream.node, uid, gid);
3371 },truncate:function (path, len) {
3372 if (len < 0) {
3373 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3374 }
3375 var node;
3376 if (typeof path === 'string') {
3377 var lookup = FS.lookupPath(path, { follow: true });
3378 node = lookup.node;
3379 } else {
3380 node = path;
3381 }
3382 if (!node.node_ops.setattr) {
3383 throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3384 }
3385 if (FS.isDir(node.mode)) {
3386 throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3387 }
3388 if (!FS.isFile(node.mode)) {
3389 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3390 }
3391 var err = FS.nodePermissions(node, 'w');
3392 if (err) {
3393 throw new FS.ErrnoError(err);
3394 }
3395 node.node_ops.setattr(node, {
3396 size: len,
3397 timestamp: Date.now()
3398 });
3399 },ftruncate:function (fd, len) {
3400 var stream = FS.getStream(fd);
3401 if (!stream) {
3402 throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3403 }
3404 if ((stream.flags & 2097155) === 0) {
3405 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3406 }
3407 FS.truncate(stream.node, len);
3408 },utime:function (path, atime, mtime) {
3409 var lookup = FS.lookupPath(path, { follow: true });
3410 var node = lookup.node;
3411 node.node_ops.setattr(node, {
3412 timestamp: Math.max(atime, mtime)
3413 });
3414 },open:function (path, flags, mode, fd_start, fd_end) {
3415 flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
3416 mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;
3417 if ((flags & 64)) {
3418 mode = (mode & 4095) | 32768;
3419 } else {
3420 mode = 0;
3421 }
3422 var node;
3423 if (typeof path === 'object') {
3424 node = path;
3425 } else {
3426 path = PATH.normalize(path);
3427 try {
3428 var lookup = FS.lookupPath(path, {
3429 follow: !(flags & 131072)
3430 });
3431 node = lookup.node;
3432 } catch (e) {
3433 // ignore
3434 }
3435 }
3436 // perhaps we need to create the node
3437 if ((flags & 64)) {
3438 if (node) {
3439 // if O_CREAT and O_EXCL are set, error out if the node already exis ts
3440 if ((flags & 128)) {
3441 throw new FS.ErrnoError(ERRNO_CODES.EEXIST);
3442 }
3443 } else {
3444 // node doesn't exist, try to create it
3445 node = FS.mknod(path, mode, 0);
3446 }
3447 }
3448 if (!node) {
3449 throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
3450 }
3451 // can't truncate a device
3452 if (FS.isChrdev(node.mode)) {
3453 flags &= ~512;
3454 }
3455 // check permissions
3456 var err = FS.mayOpen(node, flags);
3457 if (err) {
3458 throw new FS.ErrnoError(err);
3459 }
3460 // do truncation if necessary
3461 if ((flags & 512)) {
3462 FS.truncate(node, 0);
3463 }
3464 // we've already handled these, don't pass down to the underlying vfs
3465 flags &= ~(128 | 512);
3466
3467 // register the stream with the filesystem
3468 var stream = FS.createStream({
3469 node: node,
3470 path: FS.getPath(node), // we want the absolute path to the node
3471 flags: flags,
3472 seekable: true,
3473 position: 0,
3474 stream_ops: node.stream_ops,
3475 // used by the file family libc calls (fopen, fwrite, ferror, etc.)
3476 ungotten: [],
3477 error: false
3478 }, fd_start, fd_end);
3479 // call the new stream's open function
3480 if (stream.stream_ops.open) {
3481 stream.stream_ops.open(stream);
3482 }
3483 if (Module['logReadFiles'] && !(flags & 1)) {
3484 if (!FS.readFiles) FS.readFiles = {};
3485 if (!(path in FS.readFiles)) {
3486 FS.readFiles[path] = 1;
3487 Module['printErr']('read file: ' + path);
3488 }
3489 }
3490 return stream;
3491 },close:function (stream) {
3492 try {
3493 if (stream.stream_ops.close) {
3494 stream.stream_ops.close(stream);
3495 }
3496 } catch (e) {
3497 throw e;
3498 } finally {
3499 FS.closeStream(stream.fd);
3500 }
3501 },llseek:function (stream, offset, whence) {
3502 if (!stream.seekable || !stream.stream_ops.llseek) {
3503 throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3504 }
3505 return stream.stream_ops.llseek(stream, offset, whence);
3506 },read:function (stream, buffer, offset, length, position) {
3507 if (length < 0 || position < 0) {
3508 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3509 }
3510 if ((stream.flags & 2097155) === 1) {
3511 throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3512 }
3513 if (FS.isDir(stream.node.mode)) {
3514 throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3515 }
3516 if (!stream.stream_ops.read) {
3517 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3518 }
3519 var seeking = true;
3520 if (typeof position === 'undefined') {
3521 position = stream.position;
3522 seeking = false;
3523 } else if (!stream.seekable) {
3524 throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3525 }
3526 var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, p osition);
3527 if (!seeking) stream.position += bytesRead;
3528 return bytesRead;
3529 },write:function (stream, buffer, offset, length, position, canOwn) {
3530 if (length < 0 || position < 0) {
3531 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3532 }
3533 if ((stream.flags & 2097155) === 0) {
3534 throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3535 }
3536 if (FS.isDir(stream.node.mode)) {
3537 throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3538 }
3539 if (!stream.stream_ops.write) {
3540 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3541 }
3542 var seeking = true;
3543 if (typeof position === 'undefined') {
3544 position = stream.position;
3545 seeking = false;
3546 } else if (!stream.seekable) {
3547 throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3548 }
3549 if (stream.flags & 1024) {
3550 // seek to the end before writing in append mode
3551 FS.llseek(stream, 0, 2);
3552 }
3553 var bytesWritten = stream.stream_ops.write(stream, buffer, offset, lengt h, position, canOwn);
3554 if (!seeking) stream.position += bytesWritten;
3555 return bytesWritten;
3556 },allocate:function (stream, offset, length) {
3557 if (offset < 0 || length <= 0) {
3558 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3559 }
3560 if ((stream.flags & 2097155) === 0) {
3561 throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3562 }
3563 if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {
3564 throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
3565 }
3566 if (!stream.stream_ops.allocate) {
3567 throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
3568 }
3569 stream.stream_ops.allocate(stream, offset, length);
3570 },mmap:function (stream, buffer, offset, length, position, prot, flags) {
3571 // TODO if PROT is PROT_WRITE, make sure we have write access
3572 if ((stream.flags & 2097155) === 1) {
3573 throw new FS.ErrnoError(ERRNO_CODES.EACCES);
3574 }
3575 if (!stream.stream_ops.mmap) {
3576 throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
3577 }
3578 return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
3579 },ioctl:function (stream, cmd, arg) {
3580 if (!stream.stream_ops.ioctl) {
3581 throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);
3582 }
3583 return stream.stream_ops.ioctl(stream, cmd, arg);
3584 },readFile:function (path, opts) {
3585 opts = opts || {};
3586 opts.flags = opts.flags || 'r';
3587 opts.encoding = opts.encoding || 'binary';
3588 if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
3589 throw new Error('Invalid encoding type "' + opts.encoding + '"');
3590 }
3591 var ret;
3592 var stream = FS.open(path, opts.flags);
3593 var stat = FS.stat(path);
3594 var length = stat.size;
3595 var buf = new Uint8Array(length);
3596 FS.read(stream, buf, 0, length, 0);
3597 if (opts.encoding === 'utf8') {
3598 ret = '';
3599 var utf8 = new Runtime.UTF8Processor();
3600 for (var i = 0; i < length; i++) {
3601 ret += utf8.processCChar(buf[i]);
3602 }
3603 } else if (opts.encoding === 'binary') {
3604 ret = buf;
3605 }
3606 FS.close(stream);
3607 return ret;
3608 },writeFile:function (path, data, opts) {
3609 opts = opts || {};
3610 opts.flags = opts.flags || 'w';
3611 opts.encoding = opts.encoding || 'utf8';
3612 if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
3613 throw new Error('Invalid encoding type "' + opts.encoding + '"');
3614 }
3615 var stream = FS.open(path, opts.flags, opts.mode);
3616 if (opts.encoding === 'utf8') {
3617 var utf8 = new Runtime.UTF8Processor();
3618 var buf = new Uint8Array(utf8.processJSString(data));
3619 FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);
3620 } else if (opts.encoding === 'binary') {
3621 FS.write(stream, data, 0, data.length, 0, opts.canOwn);
3622 }
3623 FS.close(stream);
3624 },cwd:function () {
3625 return FS.currentPath;
3626 },chdir:function (path) {
3627 var lookup = FS.lookupPath(path, { follow: true });
3628 if (!FS.isDir(lookup.node.mode)) {
3629 throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
3630 }
3631 var err = FS.nodePermissions(lookup.node, 'x');
3632 if (err) {
3633 throw new FS.ErrnoError(err);
3634 }
3635 FS.currentPath = lookup.path;
3636 },createDefaultDirectories:function () {
3637 FS.mkdir('/tmp');
3638 },createDefaultDevices:function () {
3639 // create /dev
3640 FS.mkdir('/dev');
3641 // setup /dev/null
3642 FS.registerDevice(FS.makedev(1, 3), {
3643 read: function() { return 0; },
3644 write: function() { return 0; }
3645 });
3646 FS.mkdev('/dev/null', FS.makedev(1, 3));
3647 // setup /dev/tty and /dev/tty1
3648 // stderr needs to print output using Module['printErr']
3649 // so we register a second tty just for it.
3650 TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
3651 TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
3652 FS.mkdev('/dev/tty', FS.makedev(5, 0));
3653 FS.mkdev('/dev/tty1', FS.makedev(6, 0));
3654 // we're not going to emulate the actual shm device,
3655 // just create the tmp dirs that reside in it commonly
3656 FS.mkdir('/dev/shm');
3657 FS.mkdir('/dev/shm/tmp');
3658 },createStandardStreams:function () {
3659 // TODO deprecate the old functionality of a single
3660 // input / output callback and that utilizes FS.createDevice
3661 // and instead require a unique set of stream ops
3662
3663 // by default, we symlink the standard streams to the
3664 // default tty devices. however, if the standard streams
3665 // have been overwritten we create a unique device for
3666 // them instead.
3667 if (Module['stdin']) {
3668 FS.createDevice('/dev', 'stdin', Module['stdin']);
3669 } else {
3670 FS.symlink('/dev/tty', '/dev/stdin');
3671 }
3672 if (Module['stdout']) {
3673 FS.createDevice('/dev', 'stdout', null, Module['stdout']);
3674 } else {
3675 FS.symlink('/dev/tty', '/dev/stdout');
3676 }
3677 if (Module['stderr']) {
3678 FS.createDevice('/dev', 'stderr', null, Module['stderr']);
3679 } else {
3680 FS.symlink('/dev/tty1', '/dev/stderr');
3681 }
3682
3683 // open default streams for the stdin, stdout and stderr devices
3684 var stdin = FS.open('/dev/stdin', 'r');
3685 HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);
3686 assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');
3687
3688 var stdout = FS.open('/dev/stdout', 'w');
3689 HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);
3690 assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')') ;
3691
3692 var stderr = FS.open('/dev/stderr', 'w');
3693 HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);
3694 assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')') ;
3695 },ensureErrnoError:function () {
3696 if (FS.ErrnoError) return;
3697 FS.ErrnoError = function ErrnoError(errno) {
3698 this.errno = errno;
3699 for (var key in ERRNO_CODES) {
3700 if (ERRNO_CODES[key] === errno) {
3701 this.code = key;
3702 break;
3703 }
3704 }
3705 this.message = ERRNO_MESSAGES[errno];
3706 };
3707 FS.ErrnoError.prototype = new Error();
3708 FS.ErrnoError.prototype.constructor = FS.ErrnoError;
3709 // Some errors may happen quite a bit, to avoid overhead we reuse them ( and suffer a lack of stack info)
3710 [ERRNO_CODES.ENOENT].forEach(function(code) {
3711 FS.genericErrors[code] = new FS.ErrnoError(code);
3712 FS.genericErrors[code].stack = '<generic error, no stack>';
3713 });
3714 },staticInit:function () {
3715 FS.ensureErrnoError();
3716
3717 FS.nameTable = new Array(4096);
3718
3719 FS.mount(MEMFS, {}, '/');
3720
3721 FS.createDefaultDirectories();
3722 FS.createDefaultDevices();
3723 },init:function (input, output, error) {
3724 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)');
3725 FS.init.initialized = true;
3726
3727 FS.ensureErrnoError();
3728
3729 // Allow Module.stdin etc. to provide defaults, if none explicitly passe d to us here
3730 Module['stdin'] = input || Module['stdin'];
3731 Module['stdout'] = output || Module['stdout'];
3732 Module['stderr'] = error || Module['stderr'];
3733
3734 FS.createStandardStreams();
3735 },quit:function () {
3736 FS.init.initialized = false;
3737 for (var i = 0; i < FS.streams.length; i++) {
3738 var stream = FS.streams[i];
3739 if (!stream) {
3740 continue;
3741 }
3742 FS.close(stream);
3743 }
3744 },getMode:function (canRead, canWrite) {
3745 var mode = 0;
3746 if (canRead) mode |= 292 | 73;
3747 if (canWrite) mode |= 146;
3748 return mode;
3749 },joinPath:function (parts, forceRelative) {
3750 var path = PATH.join.apply(null, parts);
3751 if (forceRelative && path[0] == '/') path = path.substr(1);
3752 return path;
3753 },absolutePath:function (relative, base) {
3754 return PATH.resolve(base, relative);
3755 },standardizePath:function (path) {
3756 return PATH.normalize(path);
3757 },findObject:function (path, dontResolveLastLink) {
3758 var ret = FS.analyzePath(path, dontResolveLastLink);
3759 if (ret.exists) {
3760 return ret.object;
3761 } else {
3762 ___setErrNo(ret.error);
3763 return null;
3764 }
3765 },analyzePath:function (path, dontResolveLastLink) {
3766 // operate from within the context of the symlink's target
3767 try {
3768 var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
3769 path = lookup.path;
3770 } catch (e) {
3771 }
3772 var ret = {
3773 isRoot: false, exists: false, error: 0, name: null, path: null, object : null,
3774 parentExists: false, parentPath: null, parentObject: null
3775 };
3776 try {
3777 var lookup = FS.lookupPath(path, { parent: true });
3778 ret.parentExists = true;
3779 ret.parentPath = lookup.path;
3780 ret.parentObject = lookup.node;
3781 ret.name = PATH.basename(path);
3782 lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
3783 ret.exists = true;
3784 ret.path = lookup.path;
3785 ret.object = lookup.node;
3786 ret.name = lookup.node.name;
3787 ret.isRoot = lookup.path === '/';
3788 } catch (e) {
3789 ret.error = e.errno;
3790 };
3791 return ret;
3792 },createFolder:function (parent, name, canRead, canWrite) {
3793 var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(p arent), name);
3794 var mode = FS.getMode(canRead, canWrite);
3795 return FS.mkdir(path, mode);
3796 },createPath:function (parent, path, canRead, canWrite) {
3797 parent = typeof parent === 'string' ? parent : FS.getPath(parent);
3798 var parts = path.split('/').reverse();
3799 while (parts.length) {
3800 var part = parts.pop();
3801 if (!part) continue;
3802 var current = PATH.join2(parent, part);
3803 try {
3804 FS.mkdir(current);
3805 } catch (e) {
3806 // ignore EEXIST
3807 }
3808 parent = current;
3809 }
3810 return current;
3811 },createFile:function (parent, name, properties, canRead, canWrite) {
3812 var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(p arent), name);
3813 var mode = FS.getMode(canRead, canWrite);
3814 return FS.create(path, mode);
3815 },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {
3816 var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.ge tPath(parent), name) : parent;
3817 var mode = FS.getMode(canRead, canWrite);
3818 var node = FS.create(path, mode);
3819 if (data) {
3820 if (typeof data === 'string') {
3821 var arr = new Array(data.length);
3822 for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charC odeAt(i);
3823 data = arr;
3824 }
3825 // make sure we can write to the file
3826 FS.chmod(node, mode | 146);
3827 var stream = FS.open(node, 'w');
3828 FS.write(stream, data, 0, data.length, 0, canOwn);
3829 FS.close(stream);
3830 FS.chmod(node, mode);
3831 }
3832 return node;
3833 },createDevice:function (parent, name, input, output) {
3834 var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(p arent), name);
3835 var mode = FS.getMode(!!input, !!output);
3836 if (!FS.createDevice.major) FS.createDevice.major = 64;
3837 var dev = FS.makedev(FS.createDevice.major++, 0);
3838 // Create a fake device that a set of stream ops to emulate
3839 // the old behavior.
3840 FS.registerDevice(dev, {
3841 open: function(stream) {
3842 stream.seekable = false;
3843 },
3844 close: function(stream) {
3845 // flush any pending line data
3846 if (output && output.buffer && output.buffer.length) {
3847 output(10);
3848 }
3849 },
3850 read: function(stream, buffer, offset, length, pos /* ignored */) {
3851 var bytesRead = 0;
3852 for (var i = 0; i < length; i++) {
3853 var result;
3854 try {
3855 result = input();
3856 } catch (e) {
3857 throw new FS.ErrnoError(ERRNO_CODES.EIO);
3858 }
3859 if (result === undefined && bytesRead === 0) {
3860 throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
3861 }
3862 if (result === null || result === undefined) break;
3863 bytesRead++;
3864 buffer[offset+i] = result;
3865 }
3866 if (bytesRead) {
3867 stream.node.timestamp = Date.now();
3868 }
3869 return bytesRead;
3870 },
3871 write: function(stream, buffer, offset, length, pos) {
3872 for (var i = 0; i < length; i++) {
3873 try {
3874 output(buffer[offset+i]);
3875 } catch (e) {
3876 throw new FS.ErrnoError(ERRNO_CODES.EIO);
3877 }
3878 }
3879 if (length) {
3880 stream.node.timestamp = Date.now();
3881 }
3882 return i;
3883 }
3884 });
3885 return FS.mkdev(path, mode, dev);
3886 },createLink:function (parent, name, target, canRead, canWrite) {
3887 var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(p arent), name);
3888 return FS.symlink(target, path);
3889 },forceLoadFile:function (obj) {
3890 if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return tru e;
3891 var success = true;
3892 if (typeof XMLHttpRequest !== 'undefined') {
3893 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.");
3894 } else if (Module['read']) {
3895 // Command-line.
3896 try {
3897 // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
3898 // read() will try to parse UTF8.
3899 obj.contents = intArrayFromString(Module['read'](obj.url), true);
3900 } catch (e) {
3901 success = false;
3902 }
3903 } else {
3904 throw new Error('Cannot load without read() or XMLHttpRequest.');
3905 }
3906 if (!success) ___setErrNo(ERRNO_CODES.EIO);
3907 return success;
3908 },createLazyFile:function (parent, name, url, canRead, canWrite) {
3909 // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
3910 function LazyUint8Array() {
3911 this.lengthKnown = false;
3912 this.chunks = []; // Loaded chunks. Index is the chunk number
3913 }
3914 LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
3915 if (idx > this.length-1 || idx < 0) {
3916 return undefined;
3917 }
3918 var chunkOffset = idx % this.chunkSize;
3919 var chunkNum = Math.floor(idx / this.chunkSize);
3920 return this.getter(chunkNum)[chunkOffset];
3921 }
3922 LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setData Getter(getter) {
3923 this.getter = getter;
3924 }
3925 LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLeng th() {
3926 // Find length
3927 var xhr = new XMLHttpRequest();
3928 xhr.open('HEAD', url, false);
3929 xhr.send(null);
3930 if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3931 var datalength = Number(xhr.getResponseHeader("Content-length"));
3932 var header;
3933 var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges" )) && header === "bytes";
3934 var chunkSize = 1024*1024; // Chunk size in bytes
3935
3936 if (!hasByteServing) chunkSize = datalength;
3937
3938 // Function to get a range from the remote URL.
3939 var doXHR = (function(from, to) {
3940 if (from > to) throw new Error("invalid range (" + from + ", " + t o + ") or no bytes requested!");
3941 if (to > datalength-1) throw new Error("only " + datalength + " by tes available! programmer error!");
3942
3943 // TODO: Use mozResponseArrayBuffer, responseStream, etc. if avail able.
3944 var xhr = new XMLHttpRequest();
3945 xhr.open('GET', url, false);
3946 if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes =" + from + "-" + to);
3947
3948 // Some hints to the browser that we want binary data.
3949 if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuf fer';
3950 if (xhr.overrideMimeType) {
3951 xhr.overrideMimeType('text/plain; charset=x-user-defined');
3952 }
3953
3954 xhr.send(null);
3955 if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3956 if (xhr.response !== undefined) {
3957 return new Uint8Array(xhr.response || []);
3958 } else {
3959 return intArrayFromString(xhr.responseText || '', true);
3960 }
3961 });
3962 var lazyArray = this;
3963 lazyArray.setDataGetter(function(chunkNum) {
3964 var start = chunkNum * chunkSize;
3965 var end = (chunkNum+1) * chunkSize - 1; // including this byte
3966 end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
3967 if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
3968 lazyArray.chunks[chunkNum] = doXHR(start, end);
3969 }
3970 if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
3971 return lazyArray.chunks[chunkNum];
3972 });
3973
3974 this._length = datalength;
3975 this._chunkSize = chunkSize;
3976 this.lengthKnown = true;
3977 }
3978 if (typeof XMLHttpRequest !== 'undefined') {
3979 if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs o utside webworkers in modern browsers. Use --embed-file or --preload-file in emcc ';
3980 var lazyArray = new LazyUint8Array();
3981 Object.defineProperty(lazyArray, "length", {
3982 get: function() {
3983 if(!this.lengthKnown) {
3984 this.cacheLength();
3985 }
3986 return this._length;
3987 }
3988 });
3989 Object.defineProperty(lazyArray, "chunkSize", {
3990 get: function() {
3991 if(!this.lengthKnown) {
3992 this.cacheLength();
3993 }
3994 return this._chunkSize;
3995 }
3996 });
3997
3998 var properties = { isDevice: false, contents: lazyArray };
3999 } else {
4000 var properties = { isDevice: false, url: url };
4001 }
4002
4003 var node = FS.createFile(parent, name, properties, canRead, canWrite);
4004 // This is a total hack, but I want to get this lazy file code out of th e
4005 // core of MEMFS. If we want to keep this lazy file concept I feel it sh ould
4006 // be its own thin LAZYFS proxying calls to MEMFS.
4007 if (properties.contents) {
4008 node.contents = properties.contents;
4009 } else if (properties.url) {
4010 node.contents = null;
4011 node.url = properties.url;
4012 }
4013 // override each stream op with one that tries to force load the lazy fi le first
4014 var stream_ops = {};
4015 var keys = Object.keys(node.stream_ops);
4016 keys.forEach(function(key) {
4017 var fn = node.stream_ops[key];
4018 stream_ops[key] = function forceLoadLazyFile() {
4019 if (!FS.forceLoadFile(node)) {
4020 throw new FS.ErrnoError(ERRNO_CODES.EIO);
4021 }
4022 return fn.apply(null, arguments);
4023 };
4024 });
4025 // use a custom read function
4026 stream_ops.read = function stream_ops_read(stream, buffer, offset, lengt h, position) {
4027 if (!FS.forceLoadFile(node)) {
4028 throw new FS.ErrnoError(ERRNO_CODES.EIO);
4029 }
4030 var contents = stream.node.contents;
4031 if (position >= contents.length)
4032 return 0;
4033 var size = Math.min(contents.length - position, length);
4034 assert(size >= 0);
4035 if (contents.slice) { // normal array
4036 for (var i = 0; i < size; i++) {
4037 buffer[offset + i] = contents[position + i];
4038 }
4039 } else {
4040 for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
4041 buffer[offset + i] = contents.get(position + i);
4042 }
4043 }
4044 return size;
4045 };
4046 node.stream_ops = stream_ops;
4047 return node;
4048 },createPreloadedFile:function (parent, name, url, canRead, canWrite, onlo ad, onerror, dontCreateFile, canOwn) {
4049 Browser.init();
4050 // TODO we should allow people to just pass in a complete filename inste ad
4051 // of parent and name being that we just join them anyways
4052 var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
4053 function processData(byteArray) {
4054 function finish(byteArray) {
4055 if (!dontCreateFile) {
4056 FS.createDataFile(parent, name, byteArray, canRead, canWrite, canO wn);
4057 }
4058 if (onload) onload();
4059 removeRunDependency('cp ' + fullname);
4060 }
4061 var handled = false;
4062 Module['preloadPlugins'].forEach(function(plugin) {
4063 if (handled) return;
4064 if (plugin['canHandle'](fullname)) {
4065 plugin['handle'](byteArray, fullname, finish, function() {
4066 if (onerror) onerror();
4067 removeRunDependency('cp ' + fullname);
4068 });
4069 handled = true;
4070 }
4071 });
4072 if (!handled) finish(byteArray);
4073 }
4074 addRunDependency('cp ' + fullname);
4075 if (typeof url == 'string') {
4076 Browser.asyncLoad(url, function(byteArray) {
4077 processData(byteArray);
4078 }, onerror);
4079 } else {
4080 processData(url);
4081 }
4082 },indexedDB:function () {
4083 return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
4084 },DB_NAME:function () {
4085 return 'EM_FS_' + window.location.pathname;
4086 },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, o nload, onerror) {
4087 onload = onload || function(){};
4088 onerror = onerror || function(){};
4089 var indexedDB = FS.indexedDB();
4090 try {
4091 var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
4092 } catch (e) {
4093 return onerror(e);
4094 }
4095 openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
4096 console.log('creating db');
4097 var db = openRequest.result;
4098 db.createObjectStore(FS.DB_STORE_NAME);
4099 };
4100 openRequest.onsuccess = function openRequest_onsuccess() {
4101 var db = openRequest.result;
4102 var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
4103 var files = transaction.objectStore(FS.DB_STORE_NAME);
4104 var ok = 0, fail = 0, total = paths.length;
4105 function finish() {
4106 if (fail == 0) onload(); else onerror();
4107 }
4108 paths.forEach(function(path) {
4109 var putRequest = files.put(FS.analyzePath(path).object.contents, pat h);
4110 putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (o k + fail == total) finish() };
4111 putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
4112 });
4113 transaction.onerror = onerror;
4114 };
4115 openRequest.onerror = onerror;
4116 },loadFilesFromDB:function (paths, onload, onerror) {
4117 onload = onload || function(){};
4118 onerror = onerror || function(){};
4119 var indexedDB = FS.indexedDB();
4120 try {
4121 var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
4122 } catch (e) {
4123 return onerror(e);
4124 }
4125 openRequest.onupgradeneeded = onerror; // no database to load from
4126 openRequest.onsuccess = function openRequest_onsuccess() {
4127 var db = openRequest.result;
4128 try {
4129 var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
4130 } catch(e) {
4131 onerror(e);
4132 return;
4133 }
4134 var files = transaction.objectStore(FS.DB_STORE_NAME);
4135 var ok = 0, fail = 0, total = paths.length;
4136 function finish() {
4137 if (fail == 0) onload(); else onerror();
4138 }
4139 paths.forEach(function(path) {
4140 var getRequest = files.get(path);
4141 getRequest.onsuccess = function getRequest_onsuccess() {
4142 if (FS.analyzePath(path).exists) {
4143 FS.unlink(path);
4144 }
4145 FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequ est.result, true, true, true);
4146 ok++;
4147 if (ok + fail == total) finish();
4148 };
4149 getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
4150 });
4151 transaction.onerror = onerror;
4152 };
4153 openRequest.onerror = onerror;
4154 }};
4155
4156
4157
4158
4159 function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {
4160 return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
4161 },createSocket:function (family, type, protocol) {
4162 var streaming = type == 1;
4163 if (protocol) {
4164 assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp
4165 }
4166
4167 // create our internal socket structure
4168 var sock = {
4169 family: family,
4170 type: type,
4171 protocol: protocol,
4172 server: null,
4173 peers: {},
4174 pending: [],
4175 recv_queue: [],
4176 sock_ops: SOCKFS.websocket_sock_ops
4177 };
4178
4179 // create the filesystem node to store the socket structure
4180 var name = SOCKFS.nextname();
4181 var node = FS.createNode(SOCKFS.root, name, 49152, 0);
4182 node.sock = sock;
4183
4184 // and the wrapping stream that enables library functions such
4185 // as read and write to indirectly interact with the socket
4186 var stream = FS.createStream({
4187 path: name,
4188 node: node,
4189 flags: FS.modeStringToFlags('r+'),
4190 seekable: false,
4191 stream_ops: SOCKFS.stream_ops
4192 });
4193
4194 // map the new stream to the socket structure (sockets have a 1:1
4195 // relationship with a stream)
4196 sock.stream = stream;
4197
4198 return sock;
4199 },getSocket:function (fd) {
4200 var stream = FS.getStream(fd);
4201 if (!stream || !FS.isSocket(stream.node.mode)) {
4202 return null;
4203 }
4204 return stream.node.sock;
4205 },stream_ops:{poll:function (stream) {
4206 var sock = stream.node.sock;
4207 return sock.sock_ops.poll(sock);
4208 },ioctl:function (stream, request, varargs) {
4209 var sock = stream.node.sock;
4210 return sock.sock_ops.ioctl(sock, request, varargs);
4211 },read:function (stream, buffer, offset, length, position /* ignored */) {
4212 var sock = stream.node.sock;
4213 var msg = sock.sock_ops.recvmsg(sock, length);
4214 if (!msg) {
4215 // socket is closed
4216 return 0;
4217 }
4218 buffer.set(msg.buffer, offset);
4219 return msg.buffer.length;
4220 },write:function (stream, buffer, offset, length, position /* ignored */ ) {
4221 var sock = stream.node.sock;
4222 return sock.sock_ops.sendmsg(sock, buffer, offset, length);
4223 },close:function (stream) {
4224 var sock = stream.node.sock;
4225 sock.sock_ops.close(sock);
4226 }},nextname:function () {
4227 if (!SOCKFS.nextname.current) {
4228 SOCKFS.nextname.current = 0;
4229 }
4230 return 'socket[' + (SOCKFS.nextname.current++) + ']';
4231 },websocket_sock_ops:{createPeer:function (sock, addr, port) {
4232 var ws;
4233
4234 if (typeof addr === 'object') {
4235 ws = addr;
4236 addr = null;
4237 port = null;
4238 }
4239
4240 if (ws) {
4241 // for sockets that've already connected (e.g. we're the server)
4242 // we can inspect the _socket property for the address
4243 if (ws._socket) {
4244 addr = ws._socket.remoteAddress;
4245 port = ws._socket.remotePort;
4246 }
4247 // if we're just now initializing a connection to the remote,
4248 // inspect the url property
4249 else {
4250 var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);
4251 if (!result) {
4252 throw new Error('WebSocket URL must be in the format ws(s)://add ress:port');
4253 }
4254 addr = result[1];
4255 port = parseInt(result[2], 10);
4256 }
4257 } else {
4258 // create the actual websocket object and connect
4259 try {
4260 // runtimeConfig gets set to true if WebSocket runtime configurati on is available.
4261 var runtimeConfig = (Module['websocket'] && ('object' === typeof M odule['websocket']));
4262
4263 // The default value is 'ws://' the replace is needed because the compiler replaces "//" comments with '#'
4264 // comments without checking context, so we'd end up with ws:#, th e replace swaps the "#" for "//" again.
4265 var url = 'ws:#'.replace('#', '//');
4266
4267 if (runtimeConfig) {
4268 if ('string' === typeof Module['websocket']['url']) {
4269 url = Module['websocket']['url']; // Fetch runtime WebSocket U RL config.
4270 }
4271 }
4272
4273 if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it.
4274 url = url + addr + ':' + port;
4275 }
4276
4277 // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set.
4278 var subProtocols = 'binary'; // The default value is 'binary'
4279
4280 if (runtimeConfig) {
4281 if ('string' === typeof Module['websocket']['subprotocol']) {
4282 subProtocols = Module['websocket']['subprotocol']; // Fetch ru ntime WebSocket subprotocol config.
4283 }
4284 }
4285
4286 // The regex trims the string (removes spaces at the beginning and end, then splits the string by
4287 // <any space>,<any space> into an Array. Whitespace removal is im portant for Websockify and ws.
4288 subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */);
4289
4290 // The node ws library API for specifying optional subprotocol is slightly different than the browser's.
4291 var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toStrin g()} : subProtocols;
4292
4293 // If node we use the ws library.
4294 var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebS ocket'];
4295 ws = new WebSocket(url, opts);
4296 ws.binaryType = 'arraybuffer';
4297 } catch (e) {
4298 throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);
4299 }
4300 }
4301
4302
4303 var peer = {
4304 addr: addr,
4305 port: port,
4306 socket: ws,
4307 dgram_send_queue: []
4308 };
4309
4310 SOCKFS.websocket_sock_ops.addPeer(sock, peer);
4311 SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);
4312
4313 // if this is a bound dgram socket, send the port number first to allo w
4314 // us to override the ephemeral port reported to us by remotePort on t he
4315 // remote end.
4316 if (sock.type === 2 && typeof sock.sport !== 'undefined') {
4317 peer.dgram_send_queue.push(new Uint8Array([
4318 255, 255, 255, 255,
4319 'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.cha rCodeAt(0),
4320 ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)
4321 ]));
4322 }
4323
4324 return peer;
4325 },getPeer:function (sock, addr, port) {
4326 return sock.peers[addr + ':' + port];
4327 },addPeer:function (sock, peer) {
4328 sock.peers[peer.addr + ':' + peer.port] = peer;
4329 },removePeer:function (sock, peer) {
4330 delete sock.peers[peer.addr + ':' + peer.port];
4331 },handlePeerEvents:function (sock, peer) {
4332 var first = true;
4333
4334 var handleOpen = function () {
4335 try {
4336 var queued = peer.dgram_send_queue.shift();
4337 while (queued) {
4338 peer.socket.send(queued);
4339 queued = peer.dgram_send_queue.shift();
4340 }
4341 } catch (e) {
4342 // not much we can do here in the way of proper error handling as we've already
4343 // lied and said this data was sent. shut it down.
4344 peer.socket.close();
4345 }
4346 };
4347
4348 function handleMessage(data) {
4349 assert(typeof data !== 'string' && data.byteLength !== undefined); // must receive an ArrayBuffer
4350 data = new Uint8Array(data); // make a typed array view on the arra y buffer
4351
4352
4353 // if this is the port message, override the peer's port with it
4354 var wasfirst = first;
4355 first = false;
4356 if (wasfirst &&
4357 data.length === 10 &&
4358 data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&
4359 data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) & & data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {
4360 // update the peer's port and it's key in the peer map
4361 var newport = ((data[8] << 8) | data[9]);
4362 SOCKFS.websocket_sock_ops.removePeer(sock, peer);
4363 peer.port = newport;
4364 SOCKFS.websocket_sock_ops.addPeer(sock, peer);
4365 return;
4366 }
4367
4368 sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });
4369 };
4370
4371 if (ENVIRONMENT_IS_NODE) {
4372 peer.socket.on('open', handleOpen);
4373 peer.socket.on('message', function(data, flags) {
4374 if (!flags.binary) {
4375 return;
4376 }
4377 handleMessage((new Uint8Array(data)).buffer); // copy from node B uffer -> ArrayBuffer
4378 });
4379 peer.socket.on('error', function() {
4380 // don't throw
4381 });
4382 } else {
4383 peer.socket.onopen = handleOpen;
4384 peer.socket.onmessage = function peer_socket_onmessage(event) {
4385 handleMessage(event.data);
4386 };
4387 }
4388 },poll:function (sock) {
4389 if (sock.type === 1 && sock.server) {
4390 // listen sockets should only say they're available for reading
4391 // if there are pending clients.
4392 return sock.pending.length ? (64 | 1) : 0;
4393 }
4394
4395 var mask = 0;
4396 var dest = sock.type === 1 ? // we only care about the socket state f or connection-based sockets
4397 SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :
4398 null;
4399
4400 if (sock.recv_queue.length ||
4401 !dest || // connection-less sockets are always ready to read
4402 (dest && dest.socket.readyState === dest.socket.CLOSING) ||
4403 (dest && dest.socket.readyState === dest.socket.CLOSED)) { // let recv return 0 once closed
4404 mask |= (64 | 1);
4405 }
4406
4407 if (!dest || // connection-less sockets are always ready to write
4408 (dest && dest.socket.readyState === dest.socket.OPEN)) {
4409 mask |= 4;
4410 }
4411
4412 if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||
4413 (dest && dest.socket.readyState === dest.socket.CLOSED)) {
4414 mask |= 16;
4415 }
4416
4417 return mask;
4418 },ioctl:function (sock, request, arg) {
4419 switch (request) {
4420 case 21531:
4421 var bytes = 0;
4422 if (sock.recv_queue.length) {
4423 bytes = sock.recv_queue[0].data.length;
4424 }
4425 HEAP32[((arg)>>2)]=bytes;
4426 return 0;
4427 default:
4428 return ERRNO_CODES.EINVAL;
4429 }
4430 },close:function (sock) {
4431 // if we've spawned a listen server, close it
4432 if (sock.server) {
4433 try {
4434 sock.server.close();
4435 } catch (e) {
4436 }
4437 sock.server = null;
4438 }
4439 // close any peer connections
4440 var peers = Object.keys(sock.peers);
4441 for (var i = 0; i < peers.length; i++) {
4442 var peer = sock.peers[peers[i]];
4443 try {
4444 peer.socket.close();
4445 } catch (e) {
4446 }
4447 SOCKFS.websocket_sock_ops.removePeer(sock, peer);
4448 }
4449 return 0;
4450 },bind:function (sock, addr, port) {
4451 if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefi ned') {
4452 throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already bound
4453 }
4454 sock.saddr = addr;
4455 sock.sport = port || _mkport();
4456 // in order to emulate dgram sockets, we need to launch a listen serve r when
4457 // binding on a connection-less socket
4458 // note: this is only required on the server side
4459 if (sock.type === 2) {
4460 // close the existing server if it exists
4461 if (sock.server) {
4462 sock.server.close();
4463 sock.server = null;
4464 }
4465 // swallow error operation not supported error that occurs when bind ing in the
4466 // browser where this isn't supported
4467 try {
4468 sock.sock_ops.listen(sock, 0);
4469 } catch (e) {
4470 if (!(e instanceof FS.ErrnoError)) throw e;
4471 if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;
4472 }
4473 }
4474 },connect:function (sock, addr, port) {
4475 if (sock.server) {
4476 throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);
4477 }
4478
4479 // TODO autobind
4480 // if (!sock.addr && sock.type == 2) {
4481 // }
4482
4483 // early out if we're already connected / in the middle of connecting
4484 if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefi ned') {
4485 var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock. dport);
4486 if (dest) {
4487 if (dest.socket.readyState === dest.socket.CONNECTING) {
4488 throw new FS.ErrnoError(ERRNO_CODES.EALREADY);
4489 } else {
4490 throw new FS.ErrnoError(ERRNO_CODES.EISCONN);
4491 }
4492 }
4493 }
4494
4495 // add the socket to our peer list and set our
4496 // destination address / port to match
4497 var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
4498 sock.daddr = peer.addr;
4499 sock.dport = peer.port;
4500
4501 // always "fail" in non-blocking mode
4502 throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);
4503 },listen:function (sock, backlog) {
4504 if (!ENVIRONMENT_IS_NODE) {
4505 throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
4506 }
4507 if (sock.server) {
4508 throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already listening
4509 }
4510 var WebSocketServer = require('ws').Server;
4511 var host = sock.saddr;
4512 sock.server = new WebSocketServer({
4513 host: host,
4514 port: sock.sport
4515 // TODO support backlog
4516 });
4517
4518 sock.server.on('connection', function(ws) {
4519 if (sock.type === 1) {
4520 var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.pro tocol);
4521
4522 // create a peer on the new socket
4523 var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);
4524 newsock.daddr = peer.addr;
4525 newsock.dport = peer.port;
4526
4527 // push to queue for accept to pick up
4528 sock.pending.push(newsock);
4529 } else {
4530 // create a peer on the listen socket so calling sendto
4531 // with the listen socket and an address will resolve
4532 // to the correct client
4533 SOCKFS.websocket_sock_ops.createPeer(sock, ws);
4534 }
4535 });
4536 sock.server.on('closed', function() {
4537 sock.server = null;
4538 });
4539 sock.server.on('error', function() {
4540 // don't throw
4541 });
4542 },accept:function (listensock) {
4543 if (!listensock.server) {
4544 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
4545 }
4546 var newsock = listensock.pending.shift();
4547 newsock.stream.flags = listensock.stream.flags;
4548 return newsock;
4549 },getname:function (sock, peer) {
4550 var addr, port;
4551 if (peer) {
4552 if (sock.daddr === undefined || sock.dport === undefined) {
4553 throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
4554 }
4555 addr = sock.daddr;
4556 port = sock.dport;
4557 } else {
4558 // TODO saddr and sport will be set for bind()'d UDP sockets, but wh at
4559 // should we be returning for TCP sockets that've been connect()'d?
4560 addr = sock.saddr || 0;
4561 port = sock.sport || 0;
4562 }
4563 return { addr: addr, port: port };
4564 },sendmsg:function (sock, buffer, offset, length, addr, port) {
4565 if (sock.type === 2) {
4566 // connection-less sockets will honor the message address,
4567 // and otherwise fall back to the bound destination address
4568 if (addr === undefined || port === undefined) {
4569 addr = sock.daddr;
4570 port = sock.dport;
4571 }
4572 // if there was no address to fall back to, error out
4573 if (addr === undefined || port === undefined) {
4574 throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);
4575 }
4576 } else {
4577 // connection-based sockets will only use the bound
4578 addr = sock.daddr;
4579 port = sock.dport;
4580 }
4581
4582 // find the peer for the destination address
4583 var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);
4584
4585 // early out if not connected with a connection-based socket
4586 if (sock.type === 1) {
4587 if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest. socket.readyState === dest.socket.CLOSED) {
4588 throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
4589 } else if (dest.socket.readyState === dest.socket.CONNECTING) {
4590 throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
4591 }
4592 }
4593
4594 // create a copy of the incoming data to send, as the WebSocket API
4595 // doesn't work entirely with an ArrayBufferView, it'll just send
4596 // the entire underlying buffer
4597 var data;
4598 if (buffer instanceof Array || buffer instanceof ArrayBuffer) {
4599 data = buffer.slice(offset, offset + length);
4600 } else { // ArrayBufferView
4601 data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOf fset + offset + length);
4602 }
4603
4604 // if we're emulating a connection-less dgram socket and don't have
4605 // a cached connection, queue the buffer to send upon connect and
4606 // lie, saying the data was sent now.
4607 if (sock.type === 2) {
4608 if (!dest || dest.socket.readyState !== dest.socket.OPEN) {
4609 // if we're not connected, open a new connection
4610 if (!dest || dest.socket.readyState === dest.socket.CLOSING || des t.socket.readyState === dest.socket.CLOSED) {
4611 dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
4612 }
4613 dest.dgram_send_queue.push(data);
4614 return length;
4615 }
4616 }
4617
4618 try {
4619 // send the actual data
4620 dest.socket.send(data);
4621 return length;
4622 } catch (e) {
4623 throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
4624 }
4625 },recvmsg:function (sock, length) {
4626 // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html
4627 if (sock.type === 1 && sock.server) {
4628 // tcp servers should not be recv()'ing on the listen socket
4629 throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
4630 }
4631
4632 var queued = sock.recv_queue.shift();
4633 if (!queued) {
4634 if (sock.type === 1) {
4635 var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, soc k.dport);
4636
4637 if (!dest) {
4638 // if we have a destination address but are not connected, error out
4639 throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
4640 }
4641 else if (dest.socket.readyState === dest.socket.CLOSING || dest.so cket.readyState === dest.socket.CLOSED) {
4642 // return null if the socket has closed
4643 return null;
4644 }
4645 else {
4646 // else, our socket is in a valid state but truly has nothing av ailable
4647 throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
4648 }
4649 } else {
4650 throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
4651 }
4652 }
4653
4654 // queued.data will be an ArrayBuffer if it's unadulterated, but if it 's
4655 // requeued TCP data it'll be an ArrayBufferView
4656 var queuedLength = queued.data.byteLength || queued.data.length;
4657 var queuedOffset = queued.data.byteOffset || 0;
4658 var queuedBuffer = queued.data.buffer || queued.data;
4659 var bytesRead = Math.min(length, queuedLength);
4660 var res = {
4661 buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),
4662 addr: queued.addr,
4663 port: queued.port
4664 };
4665
4666
4667 // push back any unread data for TCP connections
4668 if (sock.type === 1 && bytesRead < queuedLength) {
4669 var bytesRemaining = queuedLength - bytesRead;
4670 queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);
4671 sock.recv_queue.unshift(queued);
4672 }
4673
4674 return res;
4675 }}};function _send(fd, buf, len, flags) {
4676 var sock = SOCKFS.getSocket(fd);
4677 if (!sock) {
4678 ___setErrNo(ERRNO_CODES.EBADF);
4679 return -1;
4680 }
4681 // TODO honor flags
4682 return _write(fd, buf, len);
4683 }
4684
4685 function _pwrite(fildes, buf, nbyte, offset) {
4686 // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset) ;
4687 // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
4688 var stream = FS.getStream(fildes);
4689 if (!stream) {
4690 ___setErrNo(ERRNO_CODES.EBADF);
4691 return -1;
4692 }
4693 try {
4694 var slab = HEAP8;
4695 return FS.write(stream, slab, buf, nbyte, offset);
4696 } catch (e) {
4697 FS.handleFSError(e);
4698 return -1;
4699 }
4700 }function _write(fildes, buf, nbyte) {
4701 // ssize_t write(int fildes, const void *buf, size_t nbyte);
4702 // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
4703 var stream = FS.getStream(fildes);
4704 if (!stream) {
4705 ___setErrNo(ERRNO_CODES.EBADF);
4706 return -1;
4707 }
4708
4709
4710 try {
4711 var slab = HEAP8;
4712 return FS.write(stream, slab, buf, nbyte);
4713 } catch (e) {
4714 FS.handleFSError(e);
4715 return -1;
4716 }
4717 }
4718
4719 function _fileno(stream) {
4720 // int fileno(FILE *stream);
4721 // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html
4722 stream = FS.getStreamFromPtr(stream);
4723 if (!stream) return -1;
4724 return stream.fd;
4725 }function _fwrite(ptr, size, nitems, stream) {
4726 // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FIL E *restrict stream);
4727 // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html
4728 var bytesToWrite = nitems * size;
4729 if (bytesToWrite == 0) return 0;
4730 var fd = _fileno(stream);
4731 var bytesWritten = _write(fd, ptr, bytesToWrite);
4732 if (bytesWritten == -1) {
4733 var streamObj = FS.getStreamFromPtr(stream);
4734 if (streamObj) streamObj.error = true;
4735 return 0;
4736 } else {
4737 return Math.floor(bytesWritten / size);
4738 }
4739 }
4740
4741
4742
4743 Module["_strlen"] = _strlen;
4744
4745 function __reallyNegative(x) {
4746 return x < 0 || (x === 0 && (1/x) === -Infinity);
4747 }function __formatString(format, varargs) {
4748 var textIndex = format;
4749 var argIndex = 0;
4750 function getNextArg(type) {
4751 // NOTE: Explicitly ignoring type safety. Otherwise this fails:
4752 // int x = 4; printf("%c\n", (char)x);
4753 var ret;
4754 if (type === 'double') {
4755 ret = HEAPF64[(((varargs)+(argIndex))>>3)];
4756 } else if (type == 'i64') {
4757 ret = [HEAP32[(((varargs)+(argIndex))>>2)],
4758 HEAP32[(((varargs)+(argIndex+4))>>2)]];
4759
4760 } else {
4761 type = 'i32'; // varargs are always i32, i64, or double
4762 ret = HEAP32[(((varargs)+(argIndex))>>2)];
4763 }
4764 argIndex += Runtime.getNativeFieldSize(type);
4765 return ret;
4766 }
4767
4768 var ret = [];
4769 var curr, next, currArg;
4770 while(1) {
4771 var startTextIndex = textIndex;
4772 curr = HEAP8[(textIndex)];
4773 if (curr === 0) break;
4774 next = HEAP8[((textIndex+1)|0)];
4775 if (curr == 37) {
4776 // Handle flags.
4777 var flagAlwaysSigned = false;
4778 var flagLeftAlign = false;
4779 var flagAlternative = false;
4780 var flagZeroPad = false;
4781 var flagPadSign = false;
4782 flagsLoop: while (1) {
4783 switch (next) {
4784 case 43:
4785 flagAlwaysSigned = true;
4786 break;
4787 case 45:
4788 flagLeftAlign = true;
4789 break;
4790 case 35:
4791 flagAlternative = true;
4792 break;
4793 case 48:
4794 if (flagZeroPad) {
4795 break flagsLoop;
4796 } else {
4797 flagZeroPad = true;
4798 break;
4799 }
4800 case 32:
4801 flagPadSign = true;
4802 break;
4803 default:
4804 break flagsLoop;
4805 }
4806 textIndex++;
4807 next = HEAP8[((textIndex+1)|0)];
4808 }
4809
4810 // Handle width.
4811 var width = 0;
4812 if (next == 42) {
4813 width = getNextArg('i32');
4814 textIndex++;
4815 next = HEAP8[((textIndex+1)|0)];
4816 } else {
4817 while (next >= 48 && next <= 57) {
4818 width = width * 10 + (next - 48);
4819 textIndex++;
4820 next = HEAP8[((textIndex+1)|0)];
4821 }
4822 }
4823
4824 // Handle precision.
4825 var precisionSet = false, precision = -1;
4826 if (next == 46) {
4827 precision = 0;
4828 precisionSet = true;
4829 textIndex++;
4830 next = HEAP8[((textIndex+1)|0)];
4831 if (next == 42) {
4832 precision = getNextArg('i32');
4833 textIndex++;
4834 } else {
4835 while(1) {
4836 var precisionChr = HEAP8[((textIndex+1)|0)];
4837 if (precisionChr < 48 ||
4838 precisionChr > 57) break;
4839 precision = precision * 10 + (precisionChr - 48);
4840 textIndex++;
4841 }
4842 }
4843 next = HEAP8[((textIndex+1)|0)];
4844 }
4845 if (precision < 0) {
4846 precision = 6; // Standard default.
4847 precisionSet = false;
4848 }
4849
4850 // Handle integer sizes. WARNING: These assume a 32-bit architecture!
4851 var argSize;
4852 switch (String.fromCharCode(next)) {
4853 case 'h':
4854 var nextNext = HEAP8[((textIndex+2)|0)];
4855 if (nextNext == 104) {
4856 textIndex++;
4857 argSize = 1; // char (actually i32 in varargs)
4858 } else {
4859 argSize = 2; // short (actually i32 in varargs)
4860 }
4861 break;
4862 case 'l':
4863 var nextNext = HEAP8[((textIndex+2)|0)];
4864 if (nextNext == 108) {
4865 textIndex++;
4866 argSize = 8; // long long
4867 } else {
4868 argSize = 4; // long
4869 }
4870 break;
4871 case 'L': // long long
4872 case 'q': // int64_t
4873 case 'j': // intmax_t
4874 argSize = 8;
4875 break;
4876 case 'z': // size_t
4877 case 't': // ptrdiff_t
4878 case 'I': // signed ptrdiff_t or unsigned size_t
4879 argSize = 4;
4880 break;
4881 default:
4882 argSize = null;
4883 }
4884 if (argSize) textIndex++;
4885 next = HEAP8[((textIndex+1)|0)];
4886
4887 // Handle type specifier.
4888 switch (String.fromCharCode(next)) {
4889 case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p' : {
4890 // Integer.
4891 var signed = next == 100 || next == 105;
4892 argSize = argSize || 4;
4893 var currArg = getNextArg('i' + (argSize * 8));
4894 var argText;
4895 // Flatten i64-1 [low, high] into a (slightly rounded) double
4896 if (argSize == 8) {
4897 currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117 );
4898 }
4899 // Truncate to requested size.
4900 if (argSize <= 4) {
4901 var limit = Math.pow(256, argSize) - 1;
4902 currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);
4903 }
4904 // Format the number.
4905 var currAbsArg = Math.abs(currArg);
4906 var prefix = '';
4907 if (next == 100 || next == 105) {
4908 argText = reSign(currArg, 8 * argSize, 1).toString(10);
4909 } else if (next == 117) {
4910 argText = unSign(currArg, 8 * argSize, 1).toString(10);
4911 currArg = Math.abs(currArg);
4912 } else if (next == 111) {
4913 argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);
4914 } else if (next == 120 || next == 88) {
4915 prefix = (flagAlternative && currArg != 0) ? '0x' : '';
4916 if (currArg < 0) {
4917 // Represent negative numbers in hex as 2's complement.
4918 currArg = -currArg;
4919 argText = (currAbsArg - 1).toString(16);
4920 var buffer = [];
4921 for (var i = 0; i < argText.length; i++) {
4922 buffer.push((0xF - parseInt(argText[i], 16)).toString(16));
4923 }
4924 argText = buffer.join('');
4925 while (argText.length < argSize * 2) argText = 'f' + argText;
4926 } else {
4927 argText = currAbsArg.toString(16);
4928 }
4929 if (next == 88) {
4930 prefix = prefix.toUpperCase();
4931 argText = argText.toUpperCase();
4932 }
4933 } else if (next == 112) {
4934 if (currAbsArg === 0) {
4935 argText = '(nil)';
4936 } else {
4937 prefix = '0x';
4938 argText = currAbsArg.toString(16);
4939 }
4940 }
4941 if (precisionSet) {
4942 while (argText.length < precision) {
4943 argText = '0' + argText;
4944 }
4945 }
4946
4947 // Add sign if needed
4948 if (currArg >= 0) {
4949 if (flagAlwaysSigned) {
4950 prefix = '+' + prefix;
4951 } else if (flagPadSign) {
4952 prefix = ' ' + prefix;
4953 }
4954 }
4955
4956 // Move sign to prefix so we zero-pad after the sign
4957 if (argText.charAt(0) == '-') {
4958 prefix = '-' + prefix;
4959 argText = argText.substr(1);
4960 }
4961
4962 // Add padding.
4963 while (prefix.length + argText.length < width) {
4964 if (flagLeftAlign) {
4965 argText += ' ';
4966 } else {
4967 if (flagZeroPad) {
4968 argText = '0' + argText;
4969 } else {
4970 prefix = ' ' + prefix;
4971 }
4972 }
4973 }
4974
4975 // Insert the result into the buffer.
4976 argText = prefix + argText;
4977 argText.split('').forEach(function(chr) {
4978 ret.push(chr.charCodeAt(0));
4979 });
4980 break;
4981 }
4982 case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {
4983 // Float.
4984 var currArg = getNextArg('double');
4985 var argText;
4986 if (isNaN(currArg)) {
4987 argText = 'nan';
4988 flagZeroPad = false;
4989 } else if (!isFinite(currArg)) {
4990 argText = (currArg < 0 ? '-' : '') + 'inf';
4991 flagZeroPad = false;
4992 } else {
4993 var isGeneral = false;
4994 var effectivePrecision = Math.min(precision, 20);
4995
4996 // Convert g/G to f/F or e/E, as per:
4997 // http://pubs.opengroup.org/onlinepubs/9699919799/functions/pri ntf.html
4998 if (next == 103 || next == 71) {
4999 isGeneral = true;
5000 precision = precision || 1;
5001 var exponent = parseInt(currArg.toExponential(effectivePrecisi on).split('e')[1], 10);
5002 if (precision > exponent && exponent >= -4) {
5003 next = ((next == 103) ? 'f' : 'F').charCodeAt(0);
5004 precision -= exponent + 1;
5005 } else {
5006 next = ((next == 103) ? 'e' : 'E').charCodeAt(0);
5007 precision--;
5008 }
5009 effectivePrecision = Math.min(precision, 20);
5010 }
5011
5012 if (next == 101 || next == 69) {
5013 argText = currArg.toExponential(effectivePrecision);
5014 // Make sure the exponent has at least 2 digits.
5015 if (/[eE][-+]\d$/.test(argText)) {
5016 argText = argText.slice(0, -1) + '0' + argText.slice(-1);
5017 }
5018 } else if (next == 102 || next == 70) {
5019 argText = currArg.toFixed(effectivePrecision);
5020 if (currArg === 0 && __reallyNegative(currArg)) {
5021 argText = '-' + argText;
5022 }
5023 }
5024
5025 var parts = argText.split('e');
5026 if (isGeneral && !flagAlternative) {
5027 // Discard trailing zeros and periods.
5028 while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&
5029 (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.' )) {
5030 parts[0] = parts[0].slice(0, -1);
5031 }
5032 } else {
5033 // Make sure we have a period in alternative mode.
5034 if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';
5035 // Zero pad until required precision.
5036 while (precision > effectivePrecision++) parts[0] += '0';
5037 }
5038 argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');
5039
5040 // Capitalize 'E' if needed.
5041 if (next == 69) argText = argText.toUpperCase();
5042
5043 // Add sign.
5044 if (currArg >= 0) {
5045 if (flagAlwaysSigned) {
5046 argText = '+' + argText;
5047 } else if (flagPadSign) {
5048 argText = ' ' + argText;
5049 }
5050 }
5051 }
5052
5053 // Add padding.
5054 while (argText.length < width) {
5055 if (flagLeftAlign) {
5056 argText += ' ';
5057 } else {
5058 if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {
5059 argText = argText[0] + '0' + argText.slice(1);
5060 } else {
5061 argText = (flagZeroPad ? '0' : ' ') + argText;
5062 }
5063 }
5064 }
5065
5066 // Adjust case.
5067 if (next < 97) argText = argText.toUpperCase();
5068
5069 // Insert the result into the buffer.
5070 argText.split('').forEach(function(chr) {
5071 ret.push(chr.charCodeAt(0));
5072 });
5073 break;
5074 }
5075 case 's': {
5076 // String.
5077 var arg = getNextArg('i8*');
5078 var argLength = arg ? _strlen(arg) : '(null)'.length;
5079 if (precisionSet) argLength = Math.min(argLength, precision);
5080 if (!flagLeftAlign) {
5081 while (argLength < width--) {
5082 ret.push(32);
5083 }
5084 }
5085 if (arg) {
5086 for (var i = 0; i < argLength; i++) {
5087 ret.push(HEAPU8[((arg++)|0)]);
5088 }
5089 } else {
5090 ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength ), true));
5091 }
5092 if (flagLeftAlign) {
5093 while (argLength < width--) {
5094 ret.push(32);
5095 }
5096 }
5097 break;
5098 }
5099 case 'c': {
5100 // Character.
5101 if (flagLeftAlign) ret.push(getNextArg('i8'));
5102 while (--width > 0) {
5103 ret.push(32);
5104 }
5105 if (!flagLeftAlign) ret.push(getNextArg('i8'));
5106 break;
5107 }
5108 case 'n': {
5109 // Write the length written so far to the next parameter.
5110 var ptr = getNextArg('i32*');
5111 HEAP32[((ptr)>>2)]=ret.length;
5112 break;
5113 }
5114 case '%': {
5115 // Literal percent sign.
5116 ret.push(curr);
5117 break;
5118 }
5119 default: {
5120 // Unknown specifiers remain untouched.
5121 for (var i = startTextIndex; i < textIndex + 2; i++) {
5122 ret.push(HEAP8[(i)]);
5123 }
5124 }
5125 }
5126 textIndex += 2;
5127 // TODO: Support a/A (hex float) and m (last error) specifiers.
5128 // TODO: Support %1${specifier} for arg selection.
5129 } else {
5130 ret.push(curr);
5131 textIndex += 1;
5132 }
5133 }
5134 return ret;
5135 }function _fprintf(stream, format, varargs) {
5136 // int fprintf(FILE *restrict stream, const char *restrict format, ...);
5137 // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
5138 var result = __formatString(format, varargs);
5139 var stack = Runtime.stackSave();
5140 var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, s tream);
5141 Runtime.stackRestore(stack);
5142 return ret;
5143 }function _printf(format, varargs) {
5144 // int printf(const char *restrict format, ...);
5145 // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
5146 var stdout = HEAP32[((_stdout)>>2)];
5147 return _fprintf(stdout, format, varargs);
5148 }
5149
5150
5151
5152 function _emscripten_memcpy_big(dest, src, num) {
5153 HEAPU8.set(HEAPU8.subarray(src, src+num), dest);
5154 return dest;
5155 }
5156 Module["_memcpy"] = _memcpy;
5157
5158
5159 function _fputs(s, stream) {
5160 // int fputs(const char *restrict s, FILE *restrict stream);
5161 // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html
5162 var fd = _fileno(stream);
5163 return _write(fd, s, _strlen(s));
5164 }
5165
5166 function _fputc(c, stream) {
5167 // int fputc(int c, FILE *stream);
5168 // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html
5169 var chr = unSign(c & 0xFF);
5170 HEAP8[((_fputc.ret)|0)]=chr;
5171 var fd = _fileno(stream);
5172 var ret = _write(fd, _fputc.ret, 1);
5173 if (ret == -1) {
5174 var streamObj = FS.getStreamFromPtr(stream);
5175 if (streamObj) streamObj.error = true;
5176 return -1;
5177 } else {
5178 return chr;
5179 }
5180 }function _puts(s) {
5181 // int puts(const char *s);
5182 // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html
5183 // NOTE: puts() always writes an extra newline.
5184 var stdout = HEAP32[((_stdout)>>2)];
5185 var ret = _fputs(s, stdout);
5186 if (ret < 0) {
5187 return ret;
5188 } else {
5189 var newlineRet = _fputc(10, stdout);
5190 return (newlineRet < 0) ? -1 : ret + 1;
5191 }
5192 }
5193
5194 function _sbrk(bytes) {
5195 // Implement a Linux-like 'memory area' for our 'process'.
5196 // Changes the size of the memory area by |bytes|; returns the
5197 // address of the previous top ('break') of the memory area
5198 // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP
5199 var self = _sbrk;
5200 if (!self.called) {
5201 DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out alig ned
5202 self.called = true;
5203 assert(Runtime.dynamicAlloc);
5204 self.alloc = Runtime.dynamicAlloc;
5205 Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };
5206 }
5207 var ret = DYNAMICTOP;
5208 if (bytes != 0) self.alloc(bytes);
5209 return ret; // Previous break location.
5210 }
5211
5212 function ___errno_location() {
5213 return ___errno_state;
5214 }
5215
5216 function __ZNSt9exceptionD2Ev() {}
5217
5218 var Browser={mainLoop:{scheduler:null,method:"",shouldPause:false,paused:false ,queue:[],pause:function () {
5219 Browser.mainLoop.shouldPause = true;
5220 },resume:function () {
5221 if (Browser.mainLoop.paused) {
5222 Browser.mainLoop.paused = false;
5223 Browser.mainLoop.scheduler();
5224 }
5225 Browser.mainLoop.shouldPause = false;
5226 },updateStatus:function () {
5227 if (Module['setStatus']) {
5228 var message = Module['statusMessage'] || 'Please wait...';
5229 var remaining = Browser.mainLoop.remainingBlockers;
5230 var expected = Browser.mainLoop.expectedBlockers;
5231 if (remaining) {
5232 if (remaining < expected) {
5233 Module['setStatus'](message + ' (' + (expected - remaining) + '/ ' + expected + ')');
5234 } else {
5235 Module['setStatus'](message);
5236 }
5237 } else {
5238 Module['setStatus']('');
5239 }
5240 }
5241 }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[] ,workers:[],init:function () {
5242 if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs t o exist even in workers
5243
5244 if (Browser.initted || ENVIRONMENT_IS_WORKER) return;
5245 Browser.initted = true;
5246
5247 try {
5248 new Blob();
5249 Browser.hasBlobConstructor = true;
5250 } catch(e) {
5251 Browser.hasBlobConstructor = false;
5252 console.log("warning: no blob constructor, cannot create blobs with mi metypes");
5253 }
5254 Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuil der : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.h asBlobConstructor ? console.log("warning: no BlobBuilder") : null));
5255 Browser.URLObject = typeof window != "undefined" ? (window.URL ? window. URL : window.webkitURL) : undefined;
5256 if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
5257 console.log("warning: Browser does not support creating object URLs. B uilt-in browser image decoding will not be available.");
5258 Module.noImageDecoding = true;
5259 }
5260
5261 // Support for plugins that can process preloaded files. You can add mor e of these to
5262 // your app by creating and appending to Module.preloadPlugins.
5263 //
5264 // Each plugin is asked if it can handle a file based on the file's name . If it can,
5265 // it is given the file's raw data. When it is done, it calls a callback with the file's
5266 // (possibly modified) data. For example, a plugin might decompress a fi le, or it
5267 // might create some side data structure for use later (like an Image el ement, etc.).
5268
5269 var imagePlugin = {};
5270 imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
5271 return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
5272 };
5273 imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onl oad, onerror) {
5274 var b = null;
5275 if (Browser.hasBlobConstructor) {
5276 try {
5277 b = new Blob([byteArray], { type: Browser.getMimetype(name) });
5278 if (b.size !== byteArray.length) { // Safari bug #118630
5279 // Safari's Blob can only take an ArrayBuffer
5280 b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Brows er.getMimetype(name) });
5281 }
5282 } catch(e) {
5283 Runtime.warnOnce('Blob constructor present but fails: ' + e + '; f alling back to blob builder');
5284 }
5285 }
5286 if (!b) {
5287 var bb = new Browser.BlobBuilder();
5288 bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
5289 b = bb.getBlob();
5290 }
5291 var url = Browser.URLObject.createObjectURL(b);
5292 var img = new Image();
5293 img.onload = function img_onload() {
5294 assert(img.complete, 'Image ' + name + ' could not be decoded');
5295 var canvas = document.createElement('canvas');
5296 canvas.width = img.width;
5297 canvas.height = img.height;
5298 var ctx = canvas.getContext('2d');
5299 ctx.drawImage(img, 0, 0);
5300 Module["preloadedImages"][name] = canvas;
5301 Browser.URLObject.revokeObjectURL(url);
5302 if (onload) onload(byteArray);
5303 };
5304 img.onerror = function img_onerror(event) {
5305 console.log('Image ' + url + ' could not be decoded');
5306 if (onerror) onerror();
5307 };
5308 img.src = url;
5309 };
5310 Module['preloadPlugins'].push(imagePlugin);
5311
5312 var audioPlugin = {};
5313 audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
5314 return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wa v': 1, '.mp3': 1 };
5315 };
5316 audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onl oad, onerror) {
5317 var done = false;
5318 function finish(audio) {
5319 if (done) return;
5320 done = true;
5321 Module["preloadedAudios"][name] = audio;
5322 if (onload) onload(byteArray);
5323 }
5324 function fail() {
5325 if (done) return;
5326 done = true;
5327 Module["preloadedAudios"][name] = new Audio(); // empty shim
5328 if (onerror) onerror();
5329 }
5330 if (Browser.hasBlobConstructor) {
5331 try {
5332 var b = new Blob([byteArray], { type: Browser.getMimetype(name) }) ;
5333 } catch(e) {
5334 return fail();
5335 }
5336 var url = Browser.URLObject.createObjectURL(b); // XXX we never revo ke this!
5337 var audio = new Audio();
5338 audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
5339 audio.onerror = function audio_onerror(event) {
5340 if (done) return;
5341 console.log('warning: browser could not fully decode audio ' + nam e + ', trying slower base64 approach');
5342 function encode64(data) {
5343 var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789+/';
5344 var PAD = '=';
5345 var ret = '';
5346 var leftchar = 0;
5347 var leftbits = 0;
5348 for (var i = 0; i < data.length; i++) {
5349 leftchar = (leftchar << 8) | data[i];
5350 leftbits += 8;
5351 while (leftbits >= 6) {
5352 var curr = (leftchar >> (leftbits-6)) & 0x3f;
5353 leftbits -= 6;
5354 ret += BASE[curr];
5355 }
5356 }
5357 if (leftbits == 2) {
5358 ret += BASE[(leftchar&3) << 4];
5359 ret += PAD + PAD;
5360 } else if (leftbits == 4) {
5361 ret += BASE[(leftchar&0xf) << 2];
5362 ret += PAD;
5363 }
5364 return ret;
5365 }
5366 audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encod e64(byteArray);
5367 finish(audio); // we don't wait for confirmation this worked - but it's worth trying
5368 };
5369 audio.src = url;
5370 // workaround for chrome bug 124926 - we do not always get oncanplay through or onerror
5371 Browser.safeSetTimeout(function() {
5372 finish(audio); // try to use it even though it is not necessarily ready to play
5373 }, 10000);
5374 } else {
5375 return fail();
5376 }
5377 };
5378 Module['preloadPlugins'].push(audioPlugin);
5379
5380 // Canvas event setup
5381
5382 var canvas = Module['canvas'];
5383
5384 // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module
5385 // Module['forcedAspectRatio'] = 4 / 3;
5386
5387 canvas.requestPointerLock = canvas['requestPointerLock'] ||
5388 canvas['mozRequestPointerLock'] ||
5389 canvas['webkitRequestPointerLock'] ||
5390 canvas['msRequestPointerLock'] ||
5391 function(){};
5392 canvas.exitPointerLock = document['exitPointerLock'] ||
5393 document['mozExitPointerLock'] ||
5394 document['webkitExitPointerLock'] ||
5395 document['msExitPointerLock'] ||
5396 function(){}; // no-op if function does not exi st
5397 canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
5398
5399 function pointerLockChange() {
5400 Browser.pointerLock = document['pointerLockElement'] === canvas ||
5401 document['mozPointerLockElement'] === canvas ||
5402 document['webkitPointerLockElement'] === canvas ||
5403 document['msPointerLockElement'] === canvas;
5404 }
5405
5406 document.addEventListener('pointerlockchange', pointerLockChange, false) ;
5407 document.addEventListener('mozpointerlockchange', pointerLockChange, fal se);
5408 document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
5409 document.addEventListener('mspointerlockchange', pointerLockChange, fals e);
5410
5411 if (Module['elementPointerLock']) {
5412 canvas.addEventListener("click", function(ev) {
5413 if (!Browser.pointerLock && canvas.requestPointerLock) {
5414 canvas.requestPointerLock();
5415 ev.preventDefault();
5416 }
5417 }, false);
5418 }
5419 },createContext:function (canvas, useWebGL, setInModule, webGLContextAttri butes) {
5420 var ctx;
5421 var errorInfo = '?';
5422 function onContextCreationError(event) {
5423 errorInfo = event.statusMessage || errorInfo;
5424 }
5425 try {
5426 if (useWebGL) {
5427 var contextAttributes = {
5428 antialias: false,
5429 alpha: false
5430 };
5431
5432 if (webGLContextAttributes) {
5433 for (var attribute in webGLContextAttributes) {
5434 contextAttributes[attribute] = webGLContextAttributes[attribute] ;
5435 }
5436 }
5437
5438
5439 canvas.addEventListener('webglcontextcreationerror', onContextCreati onError, false);
5440 try {
5441 ['experimental-webgl', 'webgl'].some(function(webglId) {
5442 return ctx = canvas.getContext(webglId, contextAttributes);
5443 });
5444 } finally {
5445 canvas.removeEventListener('webglcontextcreationerror', onContextC reationError, false);
5446 }
5447 } else {
5448 ctx = canvas.getContext('2d');
5449 }
5450 if (!ctx) throw ':(';
5451 } catch (e) {
5452 Module.print('Could not create canvas: ' + [errorInfo, e]);
5453 return null;
5454 }
5455 if (useWebGL) {
5456 // Set the background of the WebGL canvas to black
5457 canvas.style.backgroundColor = "black";
5458
5459 // Warn on context loss
5460 canvas.addEventListener('webglcontextlost', function(event) {
5461 alert('WebGL context lost. You will need to reload the page.');
5462 }, false);
5463 }
5464 if (setInModule) {
5465 GLctx = Module.ctx = ctx;
5466 Module.useWebGL = useWebGL;
5467 Browser.moduleContextCreatedCallbacks.forEach(function(callback) { cal lback() });
5468 Browser.init();
5469 }
5470 return ctx;
5471 },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHan dlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScr een:function (lockPointer, resizeCanvas) {
5472 Browser.lockPointer = lockPointer;
5473 Browser.resizeCanvas = resizeCanvas;
5474 if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = tr ue;
5475 if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;
5476
5477 var canvas = Module['canvas'];
5478 function fullScreenChange() {
5479 Browser.isFullScreen = false;
5480 var canvasContainer = canvas.parentNode;
5481 if ((document['webkitFullScreenElement'] || document['webkitFullscreen Element'] ||
5482 document['mozFullScreenElement'] || document['mozFullscreenElemen t'] ||
5483 document['fullScreenElement'] || document['fullscreenElement'] ||
5484 document['msFullScreenElement'] || document['msFullscreenElement' ] ||
5485 document['webkitCurrentFullScreenElement']) === canvasContainer) {
5486 canvas.cancelFullScreen = document['cancelFullScreen'] ||
5487 document['mozCancelFullScreen'] ||
5488 document['webkitCancelFullScreen'] ||
5489 document['msExitFullscreen'] ||
5490 document['exitFullscreen'] ||
5491 function() {};
5492 canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
5493 if (Browser.lockPointer) canvas.requestPointerLock();
5494 Browser.isFullScreen = true;
5495 if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
5496 } else {
5497
5498 // remove the full screen specific parent of the canvas again to res tore the HTML structure from before going full screen
5499 canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
5500 canvasContainer.parentNode.removeChild(canvasContainer);
5501
5502 if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();
5503 }
5504 if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScree n);
5505 Browser.updateCanvasDimensions(canvas);
5506 }
5507
5508 if (!Browser.fullScreenHandlersInstalled) {
5509 Browser.fullScreenHandlersInstalled = true;
5510 document.addEventListener('fullscreenchange', fullScreenChange, false) ;
5511 document.addEventListener('mozfullscreenchange', fullScreenChange, fal se);
5512 document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
5513 document.addEventListener('MSFullscreenChange', fullScreenChange, fals e);
5514 }
5515
5516 // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root
5517 var canvasContainer = document.createElement("div");
5518 canvas.parentNode.insertBefore(canvasContainer, canvas);
5519 canvasContainer.appendChild(canvas);
5520
5521 // use parent of canvas as full screen root to allow aspect ratio correc tion (Firefox stretches the root to screen size)
5522 canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||
5523 canvasContainer['mozRequestFullScree n'] ||
5524 canvasContainer['msRequestFullscreen '] ||
5525 (canvasContainer['webkitRequestFullSc reen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_ KEYBOARD_INPUT']) } : null);
5526 canvasContainer.requestFullScreen();
5527 },requestAnimationFrame:function requestAnimationFrame(func) {
5528 if (typeof window === 'undefined') { // Provide fallback to setTimeout i f window is undefined (e.g. in Node.js)
5529 setTimeout(func, 1000/60);
5530 } else {
5531 if (!window.requestAnimationFrame) {
5532 window.requestAnimationFrame = window['requestAnimationFrame'] ||
5533 window['mozRequestAnimationFrame'] ||
5534 window['webkitRequestAnimationFrame'] ||
5535 window['msRequestAnimationFrame'] ||
5536 window['oRequestAnimationFrame'] ||
5537 window['setTimeout'];
5538 }
5539 window.requestAnimationFrame(func);
5540 }
5541 },safeCallback:function (func) {
5542 return function() {
5543 if (!ABORT) return func.apply(null, arguments);
5544 };
5545 },safeRequestAnimationFrame:function (func) {
5546 return Browser.requestAnimationFrame(function() {
5547 if (!ABORT) func();
5548 });
5549 },safeSetTimeout:function (func, timeout) {
5550 return setTimeout(function() {
5551 if (!ABORT) func();
5552 }, timeout);
5553 },safeSetInterval:function (func, timeout) {
5554 return setInterval(function() {
5555 if (!ABORT) func();
5556 }, timeout);
5557 },getMimetype:function (name) {
5558 return {
5559 'jpg': 'image/jpeg',
5560 'jpeg': 'image/jpeg',
5561 'png': 'image/png',
5562 'bmp': 'image/bmp',
5563 'ogg': 'audio/ogg',
5564 'wav': 'audio/wav',
5565 'mp3': 'audio/mpeg'
5566 }[name.substr(name.lastIndexOf('.')+1)];
5567 },getUserMedia:function (func) {
5568 if(!window.getUserMedia) {
5569 window.getUserMedia = navigator['getUserMedia'] ||
5570 navigator['mozGetUserMedia'];
5571 }
5572 window.getUserMedia(func);
5573 },getMovementX:function (event) {
5574 return event['movementX'] ||
5575 event['mozMovementX'] ||
5576 event['webkitMovementX'] ||
5577 0;
5578 },getMovementY:function (event) {
5579 return event['movementY'] ||
5580 event['mozMovementY'] ||
5581 event['webkitMovementY'] ||
5582 0;
5583 },getMouseWheelDelta:function (event) {
5584 return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event. detail : -event.wheelDelta));
5585 },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent: function (event) { // event should be mousemove, mousedown or mouseup
5586 if (Browser.pointerLock) {
5587 // When the pointer is locked, calculate the coordinates
5588 // based on the movement of the mouse.
5589 // Workaround for Firefox bug 764498
5590 if (event.type != 'mousemove' &&
5591 ('mozMovementX' in event)) {
5592 Browser.mouseMovementX = Browser.mouseMovementY = 0;
5593 } else {
5594 Browser.mouseMovementX = Browser.getMovementX(event);
5595 Browser.mouseMovementY = Browser.getMovementY(event);
5596 }
5597
5598 // check if SDL is available
5599 if (typeof SDL != "undefined") {
5600 Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
5601 Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
5602 } else {
5603 // just add the mouse delta to the current absolut mouse position
5604 // FIXME: ideally this should be clamped against the canvas size and zero
5605 Browser.mouseX += Browser.mouseMovementX;
5606 Browser.mouseY += Browser.mouseMovementY;
5607 }
5608 } else {
5609 // Otherwise, calculate the movement based on the changes
5610 // in the coordinates.
5611 var rect = Module["canvas"].getBoundingClientRect();
5612 var x, y;
5613
5614 // Neither .scrollX or .pageXOffset are defined in a spec, but
5615 // we prefer .scrollX because it is currently in a spec draft.
5616 // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)
5617 var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scroll X : window.pageXOffset);
5618 var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scroll Y : window.pageYOffset);
5619 if (event.type == 'touchstart' ||
5620 event.type == 'touchend' ||
5621 event.type == 'touchmove') {
5622 var t = event.touches.item(0);
5623 if (t) {
5624 x = t.pageX - (scrollX + rect.left);
5625 y = t.pageY - (scrollY + rect.top);
5626 } else {
5627 return;
5628 }
5629 } else {
5630 x = event.pageX - (scrollX + rect.left);
5631 y = event.pageY - (scrollY + rect.top);
5632 }
5633
5634 // the canvas might be CSS-scaled compared to its backbuffer;
5635 // SDL-using content will want mouse coordinates in terms
5636 // of backbuffer units.
5637 var cw = Module["canvas"].width;
5638 var ch = Module["canvas"].height;
5639 x = x * (cw / rect.width);
5640 y = y * (ch / rect.height);
5641
5642 Browser.mouseMovementX = x - Browser.mouseX;
5643 Browser.mouseMovementY = y - Browser.mouseY;
5644 Browser.mouseX = x;
5645 Browser.mouseY = y;
5646 }
5647 },xhrLoad:function (url, onload, onerror) {
5648 var xhr = new XMLHttpRequest();
5649 xhr.open('GET', url, true);
5650 xhr.responseType = 'arraybuffer';
5651 xhr.onload = function xhr_onload() {
5652 if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
5653 onload(xhr.response);
5654 } else {
5655 onerror();
5656 }
5657 };
5658 xhr.onerror = onerror;
5659 xhr.send(null);
5660 },asyncLoad:function (url, onload, onerror, noRunDep) {
5661 Browser.xhrLoad(url, function(arrayBuffer) {
5662 assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayB uffer).');
5663 onload(new Uint8Array(arrayBuffer));
5664 if (!noRunDep) removeRunDependency('al ' + url);
5665 }, function(event) {
5666 if (onerror) {
5667 onerror();
5668 } else {
5669 throw 'Loading data file "' + url + '" failed.';
5670 }
5671 });
5672 if (!noRunDep) addRunDependency('al ' + url);
5673 },resizeListeners:[],updateResizeListeners:function () {
5674 var canvas = Module['canvas'];
5675 Browser.resizeListeners.forEach(function(listener) {
5676 listener(canvas.width, canvas.height);
5677 });
5678 },setCanvasSize:function (width, height, noUpdates) {
5679 var canvas = Module['canvas'];
5680 Browser.updateCanvasDimensions(canvas, width, height);
5681 if (!noUpdates) Browser.updateResizeListeners();
5682 },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
5683 // check if SDL is available
5684 if (typeof SDL != "undefined") {
5685 var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
5686 flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
5687 HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
5688 }
5689 Browser.updateResizeListeners();
5690 },setWindowedCanvasSize:function () {
5691 // check if SDL is available
5692 if (typeof SDL != "undefined") {
5693 var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
5694 flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
5695 HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
5696 }
5697 Browser.updateResizeListeners();
5698 },updateCanvasDimensions:function (canvas, wNative, hNative) {
5699 if (wNative && hNative) {
5700 canvas.widthNative = wNative;
5701 canvas.heightNative = hNative;
5702 } else {
5703 wNative = canvas.widthNative;
5704 hNative = canvas.heightNative;
5705 }
5706 var w = wNative;
5707 var h = hNative;
5708 if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {
5709 if (w/h < Module['forcedAspectRatio']) {
5710 w = Math.round(h * Module['forcedAspectRatio']);
5711 } else {
5712 h = Math.round(w / Module['forcedAspectRatio']);
5713 }
5714 }
5715 if (((document['webkitFullScreenElement'] || document['webkitFullscreenE lement'] ||
5716 document['mozFullScreenElement'] || document['mozFullscreenElement' ] ||
5717 document['fullScreenElement'] || document['fullscreenElement'] ||
5718 document['msFullScreenElement'] || document['msFullscreenElement'] ||
5719 document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {
5720 var factor = Math.min(screen.width / w, screen.height / h);
5721 w = Math.round(w * factor);
5722 h = Math.round(h * factor);
5723 }
5724 if (Browser.resizeCanvas) {
5725 if (canvas.width != w) canvas.width = w;
5726 if (canvas.height != h) canvas.height = h;
5727 if (typeof canvas.style != 'undefined') {
5728 canvas.style.removeProperty( "width");
5729 canvas.style.removeProperty("height");
5730 }
5731 } else {
5732 if (canvas.width != wNative) canvas.width = wNative;
5733 if (canvas.height != hNative) canvas.height = hNative;
5734 if (typeof canvas.style != 'undefined') {
5735 if (w != wNative || h != hNative) {
5736 canvas.style.setProperty( "width", w + "px", "important");
5737 canvas.style.setProperty("height", h + "px", "important");
5738 } else {
5739 canvas.style.removeProperty( "width");
5740 canvas.style.removeProperty("height");
5741 }
5742 }
5743 }
5744 }};
5745
5746 function _time(ptr) {
5747 var ret = Math.floor(Date.now()/1000);
5748 if (ptr) {
5749 HEAP32[((ptr)>>2)]=ret;
5750 }
5751 return ret;
5752 }
5753
5754
5755 function _malloc(bytes) {
5756 /* Over-allocate to make sure it is byte-aligned by 8.
5757 * This will leak memory, but this is only the dummy
5758 * implementation (replaced by dlmalloc normally) so
5759 * not an issue.
5760 */
5761 var ptr = Runtime.dynamicAlloc(bytes + 8);
5762 return (ptr+8) & 0xFFFFFFF8;
5763 }
5764 Module["_malloc"] = _malloc;function ___cxa_allocate_exception(size) {
5765 var ptr = _malloc(size + ___cxa_exception_header_size);
5766 return ptr + ___cxa_exception_header_size;
5767 }
5768
5769 var __ZTISt9exception=allocate([allocate([1,0,0,0,0,0,0], "i8", ALLOC_STATIC)+ 8, 0], "i32", ALLOC_STATIC);
5770
5771 function __ZTVN10__cxxabiv120__si_class_type_infoE() {
5772 Module['printErr']('missing function: _ZTVN10__cxxabiv120__si_class_type_infoE '); abort(-1);
5773 }
5774 ___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;
5775 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.crea tePath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloade dFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile ;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDe vice;
5776 __ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();
5777 if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); }
5778 __ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });
5779 _fputc.ret = allocate([0], "i8", ALLOC_STATIC);
5780 Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, res izeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
5781 Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
5782 Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdat es) { Browser.setCanvasSize(width, height, noUpdates) };
5783 Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.p ause() };
5784 Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop .resume() };
5785 Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia () }
5786 STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
5787
5788 staticSealed = true; // seal the static portion of memory
5789
5790 STACK_MAX = STACK_BASE + 5242880;
5791
5792 DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);
5793
5794 assert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack");
5795
5796
5797 var Math_min = Math.min;
5798 function invoke_ii(index,a1) {
5799 try {
5800 return Module["dynCall_ii"](index,a1);
5801 } catch(e) {
5802 if (typeof e !== 'number' && e !== 'longjmp') throw e;
5803 asm["setThrew"](1, 0);
5804 }
5805 }
5806
5807 function invoke_vi(index,a1) {
5808 try {
5809 Module["dynCall_vi"](index,a1);
5810 } catch(e) {
5811 if (typeof e !== 'number' && e !== 'longjmp') throw e;
5812 asm["setThrew"](1, 0);
5813 }
5814 }
5815
5816 function invoke_v(index) {
5817 try {
5818 Module["dynCall_v"](index);
5819 } catch(e) {
5820 if (typeof e !== 'number' && e !== 'longjmp') throw e;
5821 asm["setThrew"](1, 0);
5822 }
5823 }
5824
5825 function asmPrintInt(x, y) {
5826 Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);
5827 }
5828 function asmPrintFloat(x, y) {
5829 Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);
5830 }
5831 // EMSCRIPTEN_START_ASM
5832 var asm = (function(global, env, buffer) {
5833 'use asm';
5834 var HEAP8 = new global.Int8Array(buffer);
5835 var HEAP16 = new global.Int16Array(buffer);
5836 var HEAP32 = new global.Int32Array(buffer);
5837 var HEAPU8 = new global.Uint8Array(buffer);
5838 var HEAPU16 = new global.Uint16Array(buffer);
5839 var HEAPU32 = new global.Uint32Array(buffer);
5840 var HEAPF32 = new global.Float32Array(buffer);
5841 var HEAPF64 = new global.Float64Array(buffer);
5842
5843 var STACKTOP=env.STACKTOP|0;
5844 var STACK_MAX=env.STACK_MAX|0;
5845 var tempDoublePtr=env.tempDoublePtr|0;
5846 var ABORT=env.ABORT|0;
5847 var __ZTISt9exception=env.__ZTISt9exception|0;
5848 var __ZTVN10__cxxabiv120__si_class_type_infoE=env.__ZTVN10__cxxabiv120__si_cla ss_type_infoE|0;
5849
5850 var __THREW__ = 0;
5851 var threwValue = 0;
5852 var setjmpId = 0;
5853 var undef = 0;
5854 var nan = +env.NaN, inf = +env.Infinity;
5855 var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0;
5856
5857 var tempRet0 = 0;
5858 var tempRet1 = 0;
5859 var tempRet2 = 0;
5860 var tempRet3 = 0;
5861 var tempRet4 = 0;
5862 var tempRet5 = 0;
5863 var tempRet6 = 0;
5864 var tempRet7 = 0;
5865 var tempRet8 = 0;
5866 var tempRet9 = 0;
5867 var Math_floor=global.Math.floor;
5868 var Math_abs=global.Math.abs;
5869 var Math_sqrt=global.Math.sqrt;
5870 var Math_pow=global.Math.pow;
5871 var Math_cos=global.Math.cos;
5872 var Math_sin=global.Math.sin;
5873 var Math_tan=global.Math.tan;
5874 var Math_acos=global.Math.acos;
5875 var Math_asin=global.Math.asin;
5876 var Math_atan=global.Math.atan;
5877 var Math_atan2=global.Math.atan2;
5878 var Math_exp=global.Math.exp;
5879 var Math_log=global.Math.log;
5880 var Math_ceil=global.Math.ceil;
5881 var Math_imul=global.Math.imul;
5882 var abort=env.abort;
5883 var assert=env.assert;
5884 var asmPrintInt=env.asmPrintInt;
5885 var asmPrintFloat=env.asmPrintFloat;
5886 var Math_min=env.min;
5887 var invoke_ii=env.invoke_ii;
5888 var invoke_vi=env.invoke_vi;
5889 var invoke_v=env.invoke_v;
5890 var _send=env._send;
5891 var ___setErrNo=env.___setErrNo;
5892 var ___cxa_is_number_type=env.___cxa_is_number_type;
5893 var ___cxa_allocate_exception=env.___cxa_allocate_exception;
5894 var ___cxa_find_matching_catch=env.___cxa_find_matching_catch;
5895 var _fflush=env._fflush;
5896 var _time=env._time;
5897 var _pwrite=env._pwrite;
5898 var __reallyNegative=env.__reallyNegative;
5899 var _sbrk=env._sbrk;
5900 var _emscripten_memcpy_big=env._emscripten_memcpy_big;
5901 var _fileno=env._fileno;
5902 var ___resumeException=env.___resumeException;
5903 var __ZSt18uncaught_exceptionv=env.__ZSt18uncaught_exceptionv;
5904 var _sysconf=env._sysconf;
5905 var _puts=env._puts;
5906 var _mkport=env._mkport;
5907 var _write=env._write;
5908 var ___errno_location=env.___errno_location;
5909 var __ZNSt9exceptionD2Ev=env.__ZNSt9exceptionD2Ev;
5910 var _fputc=env._fputc;
5911 var ___cxa_throw=env.___cxa_throw;
5912 var _abort=env._abort;
5913 var _fwrite=env._fwrite;
5914 var ___cxa_does_inherit=env.___cxa_does_inherit;
5915 var _fprintf=env._fprintf;
5916 var __formatString=env.__formatString;
5917 var _fputs=env._fputs;
5918 var _printf=env._printf;
5919 var tempFloat = 0.0;
5920
5921 // EMSCRIPTEN_START_FUNCS
5922 function _malloc(i12) {
5923 i12 = i12 | 0;
5924 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i2 0 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i 29 = 0, i30 = 0, i31 = 0, i32 = 0;
5925 i1 = STACKTOP;
5926 do {
5927 if (i12 >>> 0 < 245) {
5928 if (i12 >>> 0 < 11) {
5929 i12 = 16;
5930 } else {
5931 i12 = i12 + 11 & -8;
5932 }
5933 i20 = i12 >>> 3;
5934 i18 = HEAP32[146] | 0;
5935 i21 = i18 >>> i20;
5936 if ((i21 & 3 | 0) != 0) {
5937 i6 = (i21 & 1 ^ 1) + i20 | 0;
5938 i5 = i6 << 1;
5939 i3 = 624 + (i5 << 2) | 0;
5940 i5 = 624 + (i5 + 2 << 2) | 0;
5941 i7 = HEAP32[i5 >> 2] | 0;
5942 i2 = i7 + 8 | 0;
5943 i4 = HEAP32[i2 >> 2] | 0;
5944 do {
5945 if ((i3 | 0) != (i4 | 0)) {
5946 if (i4 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
5947 _abort();
5948 }
5949 i8 = i4 + 12 | 0;
5950 if ((HEAP32[i8 >> 2] | 0) == (i7 | 0)) {
5951 HEAP32[i8 >> 2] = i3;
5952 HEAP32[i5 >> 2] = i4;
5953 break;
5954 } else {
5955 _abort();
5956 }
5957 } else {
5958 HEAP32[146] = i18 & ~(1 << i6);
5959 }
5960 } while (0);
5961 i32 = i6 << 3;
5962 HEAP32[i7 + 4 >> 2] = i32 | 3;
5963 i32 = i7 + (i32 | 4) | 0;
5964 HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
5965 i32 = i2;
5966 STACKTOP = i1;
5967 return i32 | 0;
5968 }
5969 if (i12 >>> 0 > (HEAP32[592 >> 2] | 0) >>> 0) {
5970 if ((i21 | 0) != 0) {
5971 i7 = 2 << i20;
5972 i7 = i21 << i20 & (i7 | 0 - i7);
5973 i7 = (i7 & 0 - i7) + -1 | 0;
5974 i2 = i7 >>> 12 & 16;
5975 i7 = i7 >>> i2;
5976 i6 = i7 >>> 5 & 8;
5977 i7 = i7 >>> i6;
5978 i5 = i7 >>> 2 & 4;
5979 i7 = i7 >>> i5;
5980 i4 = i7 >>> 1 & 2;
5981 i7 = i7 >>> i4;
5982 i3 = i7 >>> 1 & 1;
5983 i3 = (i6 | i2 | i5 | i4 | i3) + (i7 >>> i3) | 0;
5984 i7 = i3 << 1;
5985 i4 = 624 + (i7 << 2) | 0;
5986 i7 = 624 + (i7 + 2 << 2) | 0;
5987 i5 = HEAP32[i7 >> 2] | 0;
5988 i2 = i5 + 8 | 0;
5989 i6 = HEAP32[i2 >> 2] | 0;
5990 do {
5991 if ((i4 | 0) != (i6 | 0)) {
5992 if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
5993 _abort();
5994 }
5995 i8 = i6 + 12 | 0;
5996 if ((HEAP32[i8 >> 2] | 0) == (i5 | 0)) {
5997 HEAP32[i8 >> 2] = i4;
5998 HEAP32[i7 >> 2] = i6;
5999 break;
6000 } else {
6001 _abort();
6002 }
6003 } else {
6004 HEAP32[146] = i18 & ~(1 << i3);
6005 }
6006 } while (0);
6007 i6 = i3 << 3;
6008 i4 = i6 - i12 | 0;
6009 HEAP32[i5 + 4 >> 2] = i12 | 3;
6010 i3 = i5 + i12 | 0;
6011 HEAP32[i5 + (i12 | 4) >> 2] = i4 | 1;
6012 HEAP32[i5 + i6 >> 2] = i4;
6013 i6 = HEAP32[592 >> 2] | 0;
6014 if ((i6 | 0) != 0) {
6015 i5 = HEAP32[604 >> 2] | 0;
6016 i8 = i6 >>> 3;
6017 i9 = i8 << 1;
6018 i6 = 624 + (i9 << 2) | 0;
6019 i7 = HEAP32[146] | 0;
6020 i8 = 1 << i8;
6021 if ((i7 & i8 | 0) != 0) {
6022 i7 = 624 + (i9 + 2 << 2) | 0;
6023 i8 = HEAP32[i7 >> 2] | 0;
6024 if (i8 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6025 _abort();
6026 } else {
6027 i28 = i7;
6028 i27 = i8;
6029 }
6030 } else {
6031 HEAP32[146] = i7 | i8;
6032 i28 = 624 + (i9 + 2 << 2) | 0;
6033 i27 = i6;
6034 }
6035 HEAP32[i28 >> 2] = i5;
6036 HEAP32[i27 + 12 >> 2] = i5;
6037 HEAP32[i5 + 8 >> 2] = i27;
6038 HEAP32[i5 + 12 >> 2] = i6;
6039 }
6040 HEAP32[592 >> 2] = i4;
6041 HEAP32[604 >> 2] = i3;
6042 i32 = i2;
6043 STACKTOP = i1;
6044 return i32 | 0;
6045 }
6046 i18 = HEAP32[588 >> 2] | 0;
6047 if ((i18 | 0) != 0) {
6048 i2 = (i18 & 0 - i18) + -1 | 0;
6049 i31 = i2 >>> 12 & 16;
6050 i2 = i2 >>> i31;
6051 i30 = i2 >>> 5 & 8;
6052 i2 = i2 >>> i30;
6053 i32 = i2 >>> 2 & 4;
6054 i2 = i2 >>> i32;
6055 i6 = i2 >>> 1 & 2;
6056 i2 = i2 >>> i6;
6057 i3 = i2 >>> 1 & 1;
6058 i3 = HEAP32[888 + ((i30 | i31 | i32 | i6 | i3) + (i2 >>> i3) << 2) >> 2] | 0;
6059 i2 = (HEAP32[i3 + 4 >> 2] & -8) - i12 | 0;
6060 i6 = i3;
6061 while (1) {
6062 i5 = HEAP32[i6 + 16 >> 2] | 0;
6063 if ((i5 | 0) == 0) {
6064 i5 = HEAP32[i6 + 20 >> 2] | 0;
6065 if ((i5 | 0) == 0) {
6066 break;
6067 }
6068 }
6069 i6 = (HEAP32[i5 + 4 >> 2] & -8) - i12 | 0;
6070 i4 = i6 >>> 0 < i2 >>> 0;
6071 i2 = i4 ? i6 : i2;
6072 i6 = i5;
6073 i3 = i4 ? i5 : i3;
6074 }
6075 i6 = HEAP32[600 >> 2] | 0;
6076 if (i3 >>> 0 < i6 >>> 0) {
6077 _abort();
6078 }
6079 i4 = i3 + i12 | 0;
6080 if (!(i3 >>> 0 < i4 >>> 0)) {
6081 _abort();
6082 }
6083 i5 = HEAP32[i3 + 24 >> 2] | 0;
6084 i7 = HEAP32[i3 + 12 >> 2] | 0;
6085 do {
6086 if ((i7 | 0) == (i3 | 0)) {
6087 i8 = i3 + 20 | 0;
6088 i7 = HEAP32[i8 >> 2] | 0;
6089 if ((i7 | 0) == 0) {
6090 i8 = i3 + 16 | 0;
6091 i7 = HEAP32[i8 >> 2] | 0;
6092 if ((i7 | 0) == 0) {
6093 i26 = 0;
6094 break;
6095 }
6096 }
6097 while (1) {
6098 i10 = i7 + 20 | 0;
6099 i9 = HEAP32[i10 >> 2] | 0;
6100 if ((i9 | 0) != 0) {
6101 i7 = i9;
6102 i8 = i10;
6103 continue;
6104 }
6105 i10 = i7 + 16 | 0;
6106 i9 = HEAP32[i10 >> 2] | 0;
6107 if ((i9 | 0) == 0) {
6108 break;
6109 } else {
6110 i7 = i9;
6111 i8 = i10;
6112 }
6113 }
6114 if (i8 >>> 0 < i6 >>> 0) {
6115 _abort();
6116 } else {
6117 HEAP32[i8 >> 2] = 0;
6118 i26 = i7;
6119 break;
6120 }
6121 } else {
6122 i8 = HEAP32[i3 + 8 >> 2] | 0;
6123 if (i8 >>> 0 < i6 >>> 0) {
6124 _abort();
6125 }
6126 i6 = i8 + 12 | 0;
6127 if ((HEAP32[i6 >> 2] | 0) != (i3 | 0)) {
6128 _abort();
6129 }
6130 i9 = i7 + 8 | 0;
6131 if ((HEAP32[i9 >> 2] | 0) == (i3 | 0)) {
6132 HEAP32[i6 >> 2] = i7;
6133 HEAP32[i9 >> 2] = i8;
6134 i26 = i7;
6135 break;
6136 } else {
6137 _abort();
6138 }
6139 }
6140 } while (0);
6141 do {
6142 if ((i5 | 0) != 0) {
6143 i7 = HEAP32[i3 + 28 >> 2] | 0;
6144 i6 = 888 + (i7 << 2) | 0;
6145 if ((i3 | 0) == (HEAP32[i6 >> 2] | 0)) {
6146 HEAP32[i6 >> 2] = i26;
6147 if ((i26 | 0) == 0) {
6148 HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i7);
6149 break;
6150 }
6151 } else {
6152 if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6153 _abort();
6154 }
6155 i6 = i5 + 16 | 0;
6156 if ((HEAP32[i6 >> 2] | 0) == (i3 | 0)) {
6157 HEAP32[i6 >> 2] = i26;
6158 } else {
6159 HEAP32[i5 + 20 >> 2] = i26;
6160 }
6161 if ((i26 | 0) == 0) {
6162 break;
6163 }
6164 }
6165 if (i26 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6166 _abort();
6167 }
6168 HEAP32[i26 + 24 >> 2] = i5;
6169 i5 = HEAP32[i3 + 16 >> 2] | 0;
6170 do {
6171 if ((i5 | 0) != 0) {
6172 if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6173 _abort();
6174 } else {
6175 HEAP32[i26 + 16 >> 2] = i5;
6176 HEAP32[i5 + 24 >> 2] = i26;
6177 break;
6178 }
6179 }
6180 } while (0);
6181 i5 = HEAP32[i3 + 20 >> 2] | 0;
6182 if ((i5 | 0) != 0) {
6183 if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6184 _abort();
6185 } else {
6186 HEAP32[i26 + 20 >> 2] = i5;
6187 HEAP32[i5 + 24 >> 2] = i26;
6188 break;
6189 }
6190 }
6191 }
6192 } while (0);
6193 if (i2 >>> 0 < 16) {
6194 i32 = i2 + i12 | 0;
6195 HEAP32[i3 + 4 >> 2] = i32 | 3;
6196 i32 = i3 + (i32 + 4) | 0;
6197 HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
6198 } else {
6199 HEAP32[i3 + 4 >> 2] = i12 | 3;
6200 HEAP32[i3 + (i12 | 4) >> 2] = i2 | 1;
6201 HEAP32[i3 + (i2 + i12) >> 2] = i2;
6202 i6 = HEAP32[592 >> 2] | 0;
6203 if ((i6 | 0) != 0) {
6204 i5 = HEAP32[604 >> 2] | 0;
6205 i8 = i6 >>> 3;
6206 i9 = i8 << 1;
6207 i6 = 624 + (i9 << 2) | 0;
6208 i7 = HEAP32[146] | 0;
6209 i8 = 1 << i8;
6210 if ((i7 & i8 | 0) != 0) {
6211 i7 = 624 + (i9 + 2 << 2) | 0;
6212 i8 = HEAP32[i7 >> 2] | 0;
6213 if (i8 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6214 _abort();
6215 } else {
6216 i25 = i7;
6217 i24 = i8;
6218 }
6219 } else {
6220 HEAP32[146] = i7 | i8;
6221 i25 = 624 + (i9 + 2 << 2) | 0;
6222 i24 = i6;
6223 }
6224 HEAP32[i25 >> 2] = i5;
6225 HEAP32[i24 + 12 >> 2] = i5;
6226 HEAP32[i5 + 8 >> 2] = i24;
6227 HEAP32[i5 + 12 >> 2] = i6;
6228 }
6229 HEAP32[592 >> 2] = i2;
6230 HEAP32[604 >> 2] = i4;
6231 }
6232 i32 = i3 + 8 | 0;
6233 STACKTOP = i1;
6234 return i32 | 0;
6235 }
6236 }
6237 } else {
6238 if (!(i12 >>> 0 > 4294967231)) {
6239 i24 = i12 + 11 | 0;
6240 i12 = i24 & -8;
6241 i26 = HEAP32[588 >> 2] | 0;
6242 if ((i26 | 0) != 0) {
6243 i25 = 0 - i12 | 0;
6244 i24 = i24 >>> 8;
6245 if ((i24 | 0) != 0) {
6246 if (i12 >>> 0 > 16777215) {
6247 i27 = 31;
6248 } else {
6249 i31 = (i24 + 1048320 | 0) >>> 16 & 8;
6250 i32 = i24 << i31;
6251 i30 = (i32 + 520192 | 0) >>> 16 & 4;
6252 i32 = i32 << i30;
6253 i27 = (i32 + 245760 | 0) >>> 16 & 2;
6254 i27 = 14 - (i30 | i31 | i27) + (i32 << i27 >>> 15) | 0;
6255 i27 = i12 >>> (i27 + 7 | 0) & 1 | i27 << 1;
6256 }
6257 } else {
6258 i27 = 0;
6259 }
6260 i30 = HEAP32[888 + (i27 << 2) >> 2] | 0;
6261 L126 : do {
6262 if ((i30 | 0) == 0) {
6263 i29 = 0;
6264 i24 = 0;
6265 } else {
6266 if ((i27 | 0) == 31) {
6267 i24 = 0;
6268 } else {
6269 i24 = 25 - (i27 >>> 1) | 0;
6270 }
6271 i29 = 0;
6272 i28 = i12 << i24;
6273 i24 = 0;
6274 while (1) {
6275 i32 = HEAP32[i30 + 4 >> 2] & -8;
6276 i31 = i32 - i12 | 0;
6277 if (i31 >>> 0 < i25 >>> 0) {
6278 if ((i32 | 0) == (i12 | 0)) {
6279 i25 = i31;
6280 i29 = i30;
6281 i24 = i30;
6282 break L126;
6283 } else {
6284 i25 = i31;
6285 i24 = i30;
6286 }
6287 }
6288 i31 = HEAP32[i30 + 20 >> 2] | 0;
6289 i30 = HEAP32[i30 + (i28 >>> 31 << 2) + 16 >> 2] | 0;
6290 i29 = (i31 | 0) == 0 | (i31 | 0) == (i30 | 0) ? i29 : i31;
6291 if ((i30 | 0) == 0) {
6292 break;
6293 } else {
6294 i28 = i28 << 1;
6295 }
6296 }
6297 }
6298 } while (0);
6299 if ((i29 | 0) == 0 & (i24 | 0) == 0) {
6300 i32 = 2 << i27;
6301 i26 = i26 & (i32 | 0 - i32);
6302 if ((i26 | 0) == 0) {
6303 break;
6304 }
6305 i32 = (i26 & 0 - i26) + -1 | 0;
6306 i28 = i32 >>> 12 & 16;
6307 i32 = i32 >>> i28;
6308 i27 = i32 >>> 5 & 8;
6309 i32 = i32 >>> i27;
6310 i30 = i32 >>> 2 & 4;
6311 i32 = i32 >>> i30;
6312 i31 = i32 >>> 1 & 2;
6313 i32 = i32 >>> i31;
6314 i29 = i32 >>> 1 & 1;
6315 i29 = HEAP32[888 + ((i27 | i28 | i30 | i31 | i29) + (i32 >>> i29) << 2) >> 2] | 0;
6316 }
6317 if ((i29 | 0) != 0) {
6318 while (1) {
6319 i27 = (HEAP32[i29 + 4 >> 2] & -8) - i12 | 0;
6320 i26 = i27 >>> 0 < i25 >>> 0;
6321 i25 = i26 ? i27 : i25;
6322 i24 = i26 ? i29 : i24;
6323 i26 = HEAP32[i29 + 16 >> 2] | 0;
6324 if ((i26 | 0) != 0) {
6325 i29 = i26;
6326 continue;
6327 }
6328 i29 = HEAP32[i29 + 20 >> 2] | 0;
6329 if ((i29 | 0) == 0) {
6330 break;
6331 }
6332 }
6333 }
6334 if ((i24 | 0) != 0 ? i25 >>> 0 < ((HEAP32[592 >> 2] | 0) - i12 | 0) >>> 0 : 0) {
6335 i4 = HEAP32[600 >> 2] | 0;
6336 if (i24 >>> 0 < i4 >>> 0) {
6337 _abort();
6338 }
6339 i2 = i24 + i12 | 0;
6340 if (!(i24 >>> 0 < i2 >>> 0)) {
6341 _abort();
6342 }
6343 i3 = HEAP32[i24 + 24 >> 2] | 0;
6344 i6 = HEAP32[i24 + 12 >> 2] | 0;
6345 do {
6346 if ((i6 | 0) == (i24 | 0)) {
6347 i6 = i24 + 20 | 0;
6348 i5 = HEAP32[i6 >> 2] | 0;
6349 if ((i5 | 0) == 0) {
6350 i6 = i24 + 16 | 0;
6351 i5 = HEAP32[i6 >> 2] | 0;
6352 if ((i5 | 0) == 0) {
6353 i22 = 0;
6354 break;
6355 }
6356 }
6357 while (1) {
6358 i8 = i5 + 20 | 0;
6359 i7 = HEAP32[i8 >> 2] | 0;
6360 if ((i7 | 0) != 0) {
6361 i5 = i7;
6362 i6 = i8;
6363 continue;
6364 }
6365 i7 = i5 + 16 | 0;
6366 i8 = HEAP32[i7 >> 2] | 0;
6367 if ((i8 | 0) == 0) {
6368 break;
6369 } else {
6370 i5 = i8;
6371 i6 = i7;
6372 }
6373 }
6374 if (i6 >>> 0 < i4 >>> 0) {
6375 _abort();
6376 } else {
6377 HEAP32[i6 >> 2] = 0;
6378 i22 = i5;
6379 break;
6380 }
6381 } else {
6382 i5 = HEAP32[i24 + 8 >> 2] | 0;
6383 if (i5 >>> 0 < i4 >>> 0) {
6384 _abort();
6385 }
6386 i7 = i5 + 12 | 0;
6387 if ((HEAP32[i7 >> 2] | 0) != (i24 | 0)) {
6388 _abort();
6389 }
6390 i4 = i6 + 8 | 0;
6391 if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
6392 HEAP32[i7 >> 2] = i6;
6393 HEAP32[i4 >> 2] = i5;
6394 i22 = i6;
6395 break;
6396 } else {
6397 _abort();
6398 }
6399 }
6400 } while (0);
6401 do {
6402 if ((i3 | 0) != 0) {
6403 i4 = HEAP32[i24 + 28 >> 2] | 0;
6404 i5 = 888 + (i4 << 2) | 0;
6405 if ((i24 | 0) == (HEAP32[i5 >> 2] | 0)) {
6406 HEAP32[i5 >> 2] = i22;
6407 if ((i22 | 0) == 0) {
6408 HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i4);
6409 break;
6410 }
6411 } else {
6412 if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6413 _abort();
6414 }
6415 i4 = i3 + 16 | 0;
6416 if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
6417 HEAP32[i4 >> 2] = i22;
6418 } else {
6419 HEAP32[i3 + 20 >> 2] = i22;
6420 }
6421 if ((i22 | 0) == 0) {
6422 break;
6423 }
6424 }
6425 if (i22 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6426 _abort();
6427 }
6428 HEAP32[i22 + 24 >> 2] = i3;
6429 i3 = HEAP32[i24 + 16 >> 2] | 0;
6430 do {
6431 if ((i3 | 0) != 0) {
6432 if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6433 _abort();
6434 } else {
6435 HEAP32[i22 + 16 >> 2] = i3;
6436 HEAP32[i3 + 24 >> 2] = i22;
6437 break;
6438 }
6439 }
6440 } while (0);
6441 i3 = HEAP32[i24 + 20 >> 2] | 0;
6442 if ((i3 | 0) != 0) {
6443 if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6444 _abort();
6445 } else {
6446 HEAP32[i22 + 20 >> 2] = i3;
6447 HEAP32[i3 + 24 >> 2] = i22;
6448 break;
6449 }
6450 }
6451 }
6452 } while (0);
6453 L204 : do {
6454 if (!(i25 >>> 0 < 16)) {
6455 HEAP32[i24 + 4 >> 2] = i12 | 3;
6456 HEAP32[i24 + (i12 | 4) >> 2] = i25 | 1;
6457 HEAP32[i24 + (i25 + i12) >> 2] = i25;
6458 i4 = i25 >>> 3;
6459 if (i25 >>> 0 < 256) {
6460 i6 = i4 << 1;
6461 i3 = 624 + (i6 << 2) | 0;
6462 i5 = HEAP32[146] | 0;
6463 i4 = 1 << i4;
6464 if ((i5 & i4 | 0) != 0) {
6465 i5 = 624 + (i6 + 2 << 2) | 0;
6466 i4 = HEAP32[i5 >> 2] | 0;
6467 if (i4 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6468 _abort();
6469 } else {
6470 i21 = i5;
6471 i20 = i4;
6472 }
6473 } else {
6474 HEAP32[146] = i5 | i4;
6475 i21 = 624 + (i6 + 2 << 2) | 0;
6476 i20 = i3;
6477 }
6478 HEAP32[i21 >> 2] = i2;
6479 HEAP32[i20 + 12 >> 2] = i2;
6480 HEAP32[i24 + (i12 + 8) >> 2] = i20;
6481 HEAP32[i24 + (i12 + 12) >> 2] = i3;
6482 break;
6483 }
6484 i3 = i25 >>> 8;
6485 if ((i3 | 0) != 0) {
6486 if (i25 >>> 0 > 16777215) {
6487 i3 = 31;
6488 } else {
6489 i31 = (i3 + 1048320 | 0) >>> 16 & 8;
6490 i32 = i3 << i31;
6491 i30 = (i32 + 520192 | 0) >>> 16 & 4;
6492 i32 = i32 << i30;
6493 i3 = (i32 + 245760 | 0) >>> 16 & 2;
6494 i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
6495 i3 = i25 >>> (i3 + 7 | 0) & 1 | i3 << 1;
6496 }
6497 } else {
6498 i3 = 0;
6499 }
6500 i6 = 888 + (i3 << 2) | 0;
6501 HEAP32[i24 + (i12 + 28) >> 2] = i3;
6502 HEAP32[i24 + (i12 + 20) >> 2] = 0;
6503 HEAP32[i24 + (i12 + 16) >> 2] = 0;
6504 i4 = HEAP32[588 >> 2] | 0;
6505 i5 = 1 << i3;
6506 if ((i4 & i5 | 0) == 0) {
6507 HEAP32[588 >> 2] = i4 | i5;
6508 HEAP32[i6 >> 2] = i2;
6509 HEAP32[i24 + (i12 + 24) >> 2] = i6;
6510 HEAP32[i24 + (i12 + 12) >> 2] = i2;
6511 HEAP32[i24 + (i12 + 8) >> 2] = i2;
6512 break;
6513 }
6514 i4 = HEAP32[i6 >> 2] | 0;
6515 if ((i3 | 0) == 31) {
6516 i3 = 0;
6517 } else {
6518 i3 = 25 - (i3 >>> 1) | 0;
6519 }
6520 L225 : do {
6521 if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i25 | 0)) {
6522 i3 = i25 << i3;
6523 while (1) {
6524 i6 = i4 + (i3 >>> 31 << 2) + 16 | 0;
6525 i5 = HEAP32[i6 >> 2] | 0;
6526 if ((i5 | 0) == 0) {
6527 break;
6528 }
6529 if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i25 | 0)) {
6530 i18 = i5;
6531 break L225;
6532 } else {
6533 i3 = i3 << 1;
6534 i4 = i5;
6535 }
6536 }
6537 if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6538 _abort();
6539 } else {
6540 HEAP32[i6 >> 2] = i2;
6541 HEAP32[i24 + (i12 + 24) >> 2] = i4;
6542 HEAP32[i24 + (i12 + 12) >> 2] = i2;
6543 HEAP32[i24 + (i12 + 8) >> 2] = i2;
6544 break L204;
6545 }
6546 } else {
6547 i18 = i4;
6548 }
6549 } while (0);
6550 i4 = i18 + 8 | 0;
6551 i3 = HEAP32[i4 >> 2] | 0;
6552 i5 = HEAP32[600 >> 2] | 0;
6553 if (i18 >>> 0 < i5 >>> 0) {
6554 _abort();
6555 }
6556 if (i3 >>> 0 < i5 >>> 0) {
6557 _abort();
6558 } else {
6559 HEAP32[i3 + 12 >> 2] = i2;
6560 HEAP32[i4 >> 2] = i2;
6561 HEAP32[i24 + (i12 + 8) >> 2] = i3;
6562 HEAP32[i24 + (i12 + 12) >> 2] = i18;
6563 HEAP32[i24 + (i12 + 24) >> 2] = 0;
6564 break;
6565 }
6566 } else {
6567 i32 = i25 + i12 | 0;
6568 HEAP32[i24 + 4 >> 2] = i32 | 3;
6569 i32 = i24 + (i32 + 4) | 0;
6570 HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
6571 }
6572 } while (0);
6573 i32 = i24 + 8 | 0;
6574 STACKTOP = i1;
6575 return i32 | 0;
6576 }
6577 }
6578 } else {
6579 i12 = -1;
6580 }
6581 }
6582 } while (0);
6583 i18 = HEAP32[592 >> 2] | 0;
6584 if (!(i12 >>> 0 > i18 >>> 0)) {
6585 i3 = i18 - i12 | 0;
6586 i2 = HEAP32[604 >> 2] | 0;
6587 if (i3 >>> 0 > 15) {
6588 HEAP32[604 >> 2] = i2 + i12;
6589 HEAP32[592 >> 2] = i3;
6590 HEAP32[i2 + (i12 + 4) >> 2] = i3 | 1;
6591 HEAP32[i2 + i18 >> 2] = i3;
6592 HEAP32[i2 + 4 >> 2] = i12 | 3;
6593 } else {
6594 HEAP32[592 >> 2] = 0;
6595 HEAP32[604 >> 2] = 0;
6596 HEAP32[i2 + 4 >> 2] = i18 | 3;
6597 i32 = i2 + (i18 + 4) | 0;
6598 HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
6599 }
6600 i32 = i2 + 8 | 0;
6601 STACKTOP = i1;
6602 return i32 | 0;
6603 }
6604 i18 = HEAP32[596 >> 2] | 0;
6605 if (i12 >>> 0 < i18 >>> 0) {
6606 i31 = i18 - i12 | 0;
6607 HEAP32[596 >> 2] = i31;
6608 i32 = HEAP32[608 >> 2] | 0;
6609 HEAP32[608 >> 2] = i32 + i12;
6610 HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
6611 HEAP32[i32 + 4 >> 2] = i12 | 3;
6612 i32 = i32 + 8 | 0;
6613 STACKTOP = i1;
6614 return i32 | 0;
6615 }
6616 do {
6617 if ((HEAP32[264] | 0) == 0) {
6618 i18 = _sysconf(30) | 0;
6619 if ((i18 + -1 & i18 | 0) == 0) {
6620 HEAP32[1064 >> 2] = i18;
6621 HEAP32[1060 >> 2] = i18;
6622 HEAP32[1068 >> 2] = -1;
6623 HEAP32[1072 >> 2] = -1;
6624 HEAP32[1076 >> 2] = 0;
6625 HEAP32[1028 >> 2] = 0;
6626 HEAP32[264] = (_time(0) | 0) & -16 ^ 1431655768;
6627 break;
6628 } else {
6629 _abort();
6630 }
6631 }
6632 } while (0);
6633 i20 = i12 + 48 | 0;
6634 i25 = HEAP32[1064 >> 2] | 0;
6635 i21 = i12 + 47 | 0;
6636 i22 = i25 + i21 | 0;
6637 i25 = 0 - i25 | 0;
6638 i18 = i22 & i25;
6639 if (!(i18 >>> 0 > i12 >>> 0)) {
6640 i32 = 0;
6641 STACKTOP = i1;
6642 return i32 | 0;
6643 }
6644 i24 = HEAP32[1024 >> 2] | 0;
6645 if ((i24 | 0) != 0 ? (i31 = HEAP32[1016 >> 2] | 0, i32 = i31 + i18 | 0, i32 >>> 0 <= i31 >>> 0 | i32 >>> 0 > i24 >>> 0) : 0) {
6646 i32 = 0;
6647 STACKTOP = i1;
6648 return i32 | 0;
6649 }
6650 L269 : do {
6651 if ((HEAP32[1028 >> 2] & 4 | 0) == 0) {
6652 i26 = HEAP32[608 >> 2] | 0;
6653 L271 : do {
6654 if ((i26 | 0) != 0) {
6655 i24 = 1032 | 0;
6656 while (1) {
6657 i27 = HEAP32[i24 >> 2] | 0;
6658 if (!(i27 >>> 0 > i26 >>> 0) ? (i23 = i24 + 4 | 0, (i27 + (HEAP32[i23 >> 2 ] | 0) | 0) >>> 0 > i26 >>> 0) : 0) {
6659 break;
6660 }
6661 i24 = HEAP32[i24 + 8 >> 2] | 0;
6662 if ((i24 | 0) == 0) {
6663 i13 = 182;
6664 break L271;
6665 }
6666 }
6667 if ((i24 | 0) != 0) {
6668 i25 = i22 - (HEAP32[596 >> 2] | 0) & i25;
6669 if (i25 >>> 0 < 2147483647) {
6670 i13 = _sbrk(i25 | 0) | 0;
6671 i26 = (i13 | 0) == ((HEAP32[i24 >> 2] | 0) + (HEAP32[i23 >> 2] | 0) | 0);
6672 i22 = i13;
6673 i24 = i25;
6674 i23 = i26 ? i13 : -1;
6675 i25 = i26 ? i25 : 0;
6676 i13 = 191;
6677 } else {
6678 i25 = 0;
6679 }
6680 } else {
6681 i13 = 182;
6682 }
6683 } else {
6684 i13 = 182;
6685 }
6686 } while (0);
6687 do {
6688 if ((i13 | 0) == 182) {
6689 i23 = _sbrk(0) | 0;
6690 if ((i23 | 0) != (-1 | 0)) {
6691 i24 = i23;
6692 i22 = HEAP32[1060 >> 2] | 0;
6693 i25 = i22 + -1 | 0;
6694 if ((i25 & i24 | 0) == 0) {
6695 i25 = i18;
6696 } else {
6697 i25 = i18 - i24 + (i25 + i24 & 0 - i22) | 0;
6698 }
6699 i24 = HEAP32[1016 >> 2] | 0;
6700 i26 = i24 + i25 | 0;
6701 if (i25 >>> 0 > i12 >>> 0 & i25 >>> 0 < 2147483647) {
6702 i22 = HEAP32[1024 >> 2] | 0;
6703 if ((i22 | 0) != 0 ? i26 >>> 0 <= i24 >>> 0 | i26 >>> 0 > i22 >>> 0 : 0) {
6704 i25 = 0;
6705 break;
6706 }
6707 i22 = _sbrk(i25 | 0) | 0;
6708 i13 = (i22 | 0) == (i23 | 0);
6709 i24 = i25;
6710 i23 = i13 ? i23 : -1;
6711 i25 = i13 ? i25 : 0;
6712 i13 = 191;
6713 } else {
6714 i25 = 0;
6715 }
6716 } else {
6717 i25 = 0;
6718 }
6719 }
6720 } while (0);
6721 L291 : do {
6722 if ((i13 | 0) == 191) {
6723 i13 = 0 - i24 | 0;
6724 if ((i23 | 0) != (-1 | 0)) {
6725 i17 = i23;
6726 i14 = i25;
6727 i13 = 202;
6728 break L269;
6729 }
6730 do {
6731 if ((i22 | 0) != (-1 | 0) & i24 >>> 0 < 2147483647 & i24 >>> 0 < i20 >>> 0 ? (i19 = HEAP32[1064 >> 2] | 0, i19 = i21 - i24 + i19 & 0 - i19, i19 >>> 0 < 21 47483647) : 0) {
6732 if ((_sbrk(i19 | 0) | 0) == (-1 | 0)) {
6733 _sbrk(i13 | 0) | 0;
6734 break L291;
6735 } else {
6736 i24 = i19 + i24 | 0;
6737 break;
6738 }
6739 }
6740 } while (0);
6741 if ((i22 | 0) != (-1 | 0)) {
6742 i17 = i22;
6743 i14 = i24;
6744 i13 = 202;
6745 break L269;
6746 }
6747 }
6748 } while (0);
6749 HEAP32[1028 >> 2] = HEAP32[1028 >> 2] | 4;
6750 i13 = 199;
6751 } else {
6752 i25 = 0;
6753 i13 = 199;
6754 }
6755 } while (0);
6756 if ((((i13 | 0) == 199 ? i18 >>> 0 < 2147483647 : 0) ? (i17 = _sbrk(i18 | 0) | 0, i16 = _sbrk(0) | 0, (i16 | 0) != (-1 | 0) & (i17 | 0) != (-1 | 0) & i17 >>> 0 < i16 >>> 0) : 0) ? (i15 = i16 - i17 | 0, i14 = i15 >>> 0 > (i12 + 40 | 0) >>> 0, i14) : 0) {
6757 i14 = i14 ? i15 : i25;
6758 i13 = 202;
6759 }
6760 if ((i13 | 0) == 202) {
6761 i15 = (HEAP32[1016 >> 2] | 0) + i14 | 0;
6762 HEAP32[1016 >> 2] = i15;
6763 if (i15 >>> 0 > (HEAP32[1020 >> 2] | 0) >>> 0) {
6764 HEAP32[1020 >> 2] = i15;
6765 }
6766 i15 = HEAP32[608 >> 2] | 0;
6767 L311 : do {
6768 if ((i15 | 0) != 0) {
6769 i21 = 1032 | 0;
6770 while (1) {
6771 i16 = HEAP32[i21 >> 2] | 0;
6772 i19 = i21 + 4 | 0;
6773 i20 = HEAP32[i19 >> 2] | 0;
6774 if ((i17 | 0) == (i16 + i20 | 0)) {
6775 i13 = 214;
6776 break;
6777 }
6778 i18 = HEAP32[i21 + 8 >> 2] | 0;
6779 if ((i18 | 0) == 0) {
6780 break;
6781 } else {
6782 i21 = i18;
6783 }
6784 }
6785 if (((i13 | 0) == 214 ? (HEAP32[i21 + 12 >> 2] & 8 | 0) == 0 : 0) ? i15 >>> 0 >= i16 >>> 0 & i15 >>> 0 < i17 >>> 0 : 0) {
6786 HEAP32[i19 >> 2] = i20 + i14;
6787 i2 = (HEAP32[596 >> 2] | 0) + i14 | 0;
6788 i3 = i15 + 8 | 0;
6789 if ((i3 & 7 | 0) == 0) {
6790 i3 = 0;
6791 } else {
6792 i3 = 0 - i3 & 7;
6793 }
6794 i32 = i2 - i3 | 0;
6795 HEAP32[608 >> 2] = i15 + i3;
6796 HEAP32[596 >> 2] = i32;
6797 HEAP32[i15 + (i3 + 4) >> 2] = i32 | 1;
6798 HEAP32[i15 + (i2 + 4) >> 2] = 40;
6799 HEAP32[612 >> 2] = HEAP32[1072 >> 2];
6800 break;
6801 }
6802 if (i17 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6803 HEAP32[600 >> 2] = i17;
6804 }
6805 i19 = i17 + i14 | 0;
6806 i16 = 1032 | 0;
6807 while (1) {
6808 if ((HEAP32[i16 >> 2] | 0) == (i19 | 0)) {
6809 i13 = 224;
6810 break;
6811 }
6812 i18 = HEAP32[i16 + 8 >> 2] | 0;
6813 if ((i18 | 0) == 0) {
6814 break;
6815 } else {
6816 i16 = i18;
6817 }
6818 }
6819 if ((i13 | 0) == 224 ? (HEAP32[i16 + 12 >> 2] & 8 | 0) == 0 : 0) {
6820 HEAP32[i16 >> 2] = i17;
6821 i6 = i16 + 4 | 0;
6822 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i14;
6823 i6 = i17 + 8 | 0;
6824 if ((i6 & 7 | 0) == 0) {
6825 i6 = 0;
6826 } else {
6827 i6 = 0 - i6 & 7;
6828 }
6829 i7 = i17 + (i14 + 8) | 0;
6830 if ((i7 & 7 | 0) == 0) {
6831 i13 = 0;
6832 } else {
6833 i13 = 0 - i7 & 7;
6834 }
6835 i15 = i17 + (i13 + i14) | 0;
6836 i8 = i6 + i12 | 0;
6837 i7 = i17 + i8 | 0;
6838 i10 = i15 - (i17 + i6) - i12 | 0;
6839 HEAP32[i17 + (i6 + 4) >> 2] = i12 | 3;
6840 L348 : do {
6841 if ((i15 | 0) != (HEAP32[608 >> 2] | 0)) {
6842 if ((i15 | 0) == (HEAP32[604 >> 2] | 0)) {
6843 i32 = (HEAP32[592 >> 2] | 0) + i10 | 0;
6844 HEAP32[592 >> 2] = i32;
6845 HEAP32[604 >> 2] = i7;
6846 HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
6847 HEAP32[i17 + (i32 + i8) >> 2] = i32;
6848 break;
6849 }
6850 i12 = i14 + 4 | 0;
6851 i18 = HEAP32[i17 + (i12 + i13) >> 2] | 0;
6852 if ((i18 & 3 | 0) == 1) {
6853 i11 = i18 & -8;
6854 i16 = i18 >>> 3;
6855 do {
6856 if (!(i18 >>> 0 < 256)) {
6857 i9 = HEAP32[i17 + ((i13 | 24) + i14) >> 2] | 0;
6858 i19 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
6859 do {
6860 if ((i19 | 0) == (i15 | 0)) {
6861 i19 = i13 | 16;
6862 i18 = i17 + (i12 + i19) | 0;
6863 i16 = HEAP32[i18 >> 2] | 0;
6864 if ((i16 | 0) == 0) {
6865 i18 = i17 + (i19 + i14) | 0;
6866 i16 = HEAP32[i18 >> 2] | 0;
6867 if ((i16 | 0) == 0) {
6868 i5 = 0;
6869 break;
6870 }
6871 }
6872 while (1) {
6873 i20 = i16 + 20 | 0;
6874 i19 = HEAP32[i20 >> 2] | 0;
6875 if ((i19 | 0) != 0) {
6876 i16 = i19;
6877 i18 = i20;
6878 continue;
6879 }
6880 i19 = i16 + 16 | 0;
6881 i20 = HEAP32[i19 >> 2] | 0;
6882 if ((i20 | 0) == 0) {
6883 break;
6884 } else {
6885 i16 = i20;
6886 i18 = i19;
6887 }
6888 }
6889 if (i18 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6890 _abort();
6891 } else {
6892 HEAP32[i18 >> 2] = 0;
6893 i5 = i16;
6894 break;
6895 }
6896 } else {
6897 i18 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
6898 if (i18 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6899 _abort();
6900 }
6901 i16 = i18 + 12 | 0;
6902 if ((HEAP32[i16 >> 2] | 0) != (i15 | 0)) {
6903 _abort();
6904 }
6905 i20 = i19 + 8 | 0;
6906 if ((HEAP32[i20 >> 2] | 0) == (i15 | 0)) {
6907 HEAP32[i16 >> 2] = i19;
6908 HEAP32[i20 >> 2] = i18;
6909 i5 = i19;
6910 break;
6911 } else {
6912 _abort();
6913 }
6914 }
6915 } while (0);
6916 if ((i9 | 0) != 0) {
6917 i16 = HEAP32[i17 + (i14 + 28 + i13) >> 2] | 0;
6918 i18 = 888 + (i16 << 2) | 0;
6919 if ((i15 | 0) == (HEAP32[i18 >> 2] | 0)) {
6920 HEAP32[i18 >> 2] = i5;
6921 if ((i5 | 0) == 0) {
6922 HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i16);
6923 break;
6924 }
6925 } else {
6926 if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6927 _abort();
6928 }
6929 i16 = i9 + 16 | 0;
6930 if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
6931 HEAP32[i16 >> 2] = i5;
6932 } else {
6933 HEAP32[i9 + 20 >> 2] = i5;
6934 }
6935 if ((i5 | 0) == 0) {
6936 break;
6937 }
6938 }
6939 if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6940 _abort();
6941 }
6942 HEAP32[i5 + 24 >> 2] = i9;
6943 i15 = i13 | 16;
6944 i9 = HEAP32[i17 + (i15 + i14) >> 2] | 0;
6945 do {
6946 if ((i9 | 0) != 0) {
6947 if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6948 _abort();
6949 } else {
6950 HEAP32[i5 + 16 >> 2] = i9;
6951 HEAP32[i9 + 24 >> 2] = i5;
6952 break;
6953 }
6954 }
6955 } while (0);
6956 i9 = HEAP32[i17 + (i12 + i15) >> 2] | 0;
6957 if ((i9 | 0) != 0) {
6958 if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6959 _abort();
6960 } else {
6961 HEAP32[i5 + 20 >> 2] = i9;
6962 HEAP32[i9 + 24 >> 2] = i5;
6963 break;
6964 }
6965 }
6966 }
6967 } else {
6968 i5 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
6969 i12 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
6970 i18 = 624 + (i16 << 1 << 2) | 0;
6971 if ((i5 | 0) != (i18 | 0)) {
6972 if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6973 _abort();
6974 }
6975 if ((HEAP32[i5 + 12 >> 2] | 0) != (i15 | 0)) {
6976 _abort();
6977 }
6978 }
6979 if ((i12 | 0) == (i5 | 0)) {
6980 HEAP32[146] = HEAP32[146] & ~(1 << i16);
6981 break;
6982 }
6983 if ((i12 | 0) != (i18 | 0)) {
6984 if (i12 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
6985 _abort();
6986 }
6987 i16 = i12 + 8 | 0;
6988 if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
6989 i9 = i16;
6990 } else {
6991 _abort();
6992 }
6993 } else {
6994 i9 = i12 + 8 | 0;
6995 }
6996 HEAP32[i5 + 12 >> 2] = i12;
6997 HEAP32[i9 >> 2] = i5;
6998 }
6999 } while (0);
7000 i15 = i17 + ((i11 | i13) + i14) | 0;
7001 i10 = i11 + i10 | 0;
7002 }
7003 i5 = i15 + 4 | 0;
7004 HEAP32[i5 >> 2] = HEAP32[i5 >> 2] & -2;
7005 HEAP32[i17 + (i8 + 4) >> 2] = i10 | 1;
7006 HEAP32[i17 + (i10 + i8) >> 2] = i10;
7007 i5 = i10 >>> 3;
7008 if (i10 >>> 0 < 256) {
7009 i10 = i5 << 1;
7010 i2 = 624 + (i10 << 2) | 0;
7011 i9 = HEAP32[146] | 0;
7012 i5 = 1 << i5;
7013 if ((i9 & i5 | 0) != 0) {
7014 i9 = 624 + (i10 + 2 << 2) | 0;
7015 i5 = HEAP32[i9 >> 2] | 0;
7016 if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7017 _abort();
7018 } else {
7019 i3 = i9;
7020 i4 = i5;
7021 }
7022 } else {
7023 HEAP32[146] = i9 | i5;
7024 i3 = 624 + (i10 + 2 << 2) | 0;
7025 i4 = i2;
7026 }
7027 HEAP32[i3 >> 2] = i7;
7028 HEAP32[i4 + 12 >> 2] = i7;
7029 HEAP32[i17 + (i8 + 8) >> 2] = i4;
7030 HEAP32[i17 + (i8 + 12) >> 2] = i2;
7031 break;
7032 }
7033 i3 = i10 >>> 8;
7034 if ((i3 | 0) != 0) {
7035 if (i10 >>> 0 > 16777215) {
7036 i3 = 31;
7037 } else {
7038 i31 = (i3 + 1048320 | 0) >>> 16 & 8;
7039 i32 = i3 << i31;
7040 i30 = (i32 + 520192 | 0) >>> 16 & 4;
7041 i32 = i32 << i30;
7042 i3 = (i32 + 245760 | 0) >>> 16 & 2;
7043 i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
7044 i3 = i10 >>> (i3 + 7 | 0) & 1 | i3 << 1;
7045 }
7046 } else {
7047 i3 = 0;
7048 }
7049 i4 = 888 + (i3 << 2) | 0;
7050 HEAP32[i17 + (i8 + 28) >> 2] = i3;
7051 HEAP32[i17 + (i8 + 20) >> 2] = 0;
7052 HEAP32[i17 + (i8 + 16) >> 2] = 0;
7053 i9 = HEAP32[588 >> 2] | 0;
7054 i5 = 1 << i3;
7055 if ((i9 & i5 | 0) == 0) {
7056 HEAP32[588 >> 2] = i9 | i5;
7057 HEAP32[i4 >> 2] = i7;
7058 HEAP32[i17 + (i8 + 24) >> 2] = i4;
7059 HEAP32[i17 + (i8 + 12) >> 2] = i7;
7060 HEAP32[i17 + (i8 + 8) >> 2] = i7;
7061 break;
7062 }
7063 i4 = HEAP32[i4 >> 2] | 0;
7064 if ((i3 | 0) == 31) {
7065 i3 = 0;
7066 } else {
7067 i3 = 25 - (i3 >>> 1) | 0;
7068 }
7069 L444 : do {
7070 if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i10 | 0)) {
7071 i3 = i10 << i3;
7072 while (1) {
7073 i5 = i4 + (i3 >>> 31 << 2) + 16 | 0;
7074 i9 = HEAP32[i5 >> 2] | 0;
7075 if ((i9 | 0) == 0) {
7076 break;
7077 }
7078 if ((HEAP32[i9 + 4 >> 2] & -8 | 0) == (i10 | 0)) {
7079 i2 = i9;
7080 break L444;
7081 } else {
7082 i3 = i3 << 1;
7083 i4 = i9;
7084 }
7085 }
7086 if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7087 _abort();
7088 } else {
7089 HEAP32[i5 >> 2] = i7;
7090 HEAP32[i17 + (i8 + 24) >> 2] = i4;
7091 HEAP32[i17 + (i8 + 12) >> 2] = i7;
7092 HEAP32[i17 + (i8 + 8) >> 2] = i7;
7093 break L348;
7094 }
7095 } else {
7096 i2 = i4;
7097 }
7098 } while (0);
7099 i4 = i2 + 8 | 0;
7100 i3 = HEAP32[i4 >> 2] | 0;
7101 i5 = HEAP32[600 >> 2] | 0;
7102 if (i2 >>> 0 < i5 >>> 0) {
7103 _abort();
7104 }
7105 if (i3 >>> 0 < i5 >>> 0) {
7106 _abort();
7107 } else {
7108 HEAP32[i3 + 12 >> 2] = i7;
7109 HEAP32[i4 >> 2] = i7;
7110 HEAP32[i17 + (i8 + 8) >> 2] = i3;
7111 HEAP32[i17 + (i8 + 12) >> 2] = i2;
7112 HEAP32[i17 + (i8 + 24) >> 2] = 0;
7113 break;
7114 }
7115 } else {
7116 i32 = (HEAP32[596 >> 2] | 0) + i10 | 0;
7117 HEAP32[596 >> 2] = i32;
7118 HEAP32[608 >> 2] = i7;
7119 HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
7120 }
7121 } while (0);
7122 i32 = i17 + (i6 | 8) | 0;
7123 STACKTOP = i1;
7124 return i32 | 0;
7125 }
7126 i3 = 1032 | 0;
7127 while (1) {
7128 i2 = HEAP32[i3 >> 2] | 0;
7129 if (!(i2 >>> 0 > i15 >>> 0) ? (i11 = HEAP32[i3 + 4 >> 2] | 0, i10 = i2 + i1 1 | 0, i10 >>> 0 > i15 >>> 0) : 0) {
7130 break;
7131 }
7132 i3 = HEAP32[i3 + 8 >> 2] | 0;
7133 }
7134 i3 = i2 + (i11 + -39) | 0;
7135 if ((i3 & 7 | 0) == 0) {
7136 i3 = 0;
7137 } else {
7138 i3 = 0 - i3 & 7;
7139 }
7140 i2 = i2 + (i11 + -47 + i3) | 0;
7141 i2 = i2 >>> 0 < (i15 + 16 | 0) >>> 0 ? i15 : i2;
7142 i3 = i2 + 8 | 0;
7143 i4 = i17 + 8 | 0;
7144 if ((i4 & 7 | 0) == 0) {
7145 i4 = 0;
7146 } else {
7147 i4 = 0 - i4 & 7;
7148 }
7149 i32 = i14 + -40 - i4 | 0;
7150 HEAP32[608 >> 2] = i17 + i4;
7151 HEAP32[596 >> 2] = i32;
7152 HEAP32[i17 + (i4 + 4) >> 2] = i32 | 1;
7153 HEAP32[i17 + (i14 + -36) >> 2] = 40;
7154 HEAP32[612 >> 2] = HEAP32[1072 >> 2];
7155 HEAP32[i2 + 4 >> 2] = 27;
7156 HEAP32[i3 + 0 >> 2] = HEAP32[1032 >> 2];
7157 HEAP32[i3 + 4 >> 2] = HEAP32[1036 >> 2];
7158 HEAP32[i3 + 8 >> 2] = HEAP32[1040 >> 2];
7159 HEAP32[i3 + 12 >> 2] = HEAP32[1044 >> 2];
7160 HEAP32[1032 >> 2] = i17;
7161 HEAP32[1036 >> 2] = i14;
7162 HEAP32[1044 >> 2] = 0;
7163 HEAP32[1040 >> 2] = i3;
7164 i4 = i2 + 28 | 0;
7165 HEAP32[i4 >> 2] = 7;
7166 if ((i2 + 32 | 0) >>> 0 < i10 >>> 0) {
7167 while (1) {
7168 i3 = i4 + 4 | 0;
7169 HEAP32[i3 >> 2] = 7;
7170 if ((i4 + 8 | 0) >>> 0 < i10 >>> 0) {
7171 i4 = i3;
7172 } else {
7173 break;
7174 }
7175 }
7176 }
7177 if ((i2 | 0) != (i15 | 0)) {
7178 i2 = i2 - i15 | 0;
7179 i3 = i15 + (i2 + 4) | 0;
7180 HEAP32[i3 >> 2] = HEAP32[i3 >> 2] & -2;
7181 HEAP32[i15 + 4 >> 2] = i2 | 1;
7182 HEAP32[i15 + i2 >> 2] = i2;
7183 i3 = i2 >>> 3;
7184 if (i2 >>> 0 < 256) {
7185 i4 = i3 << 1;
7186 i2 = 624 + (i4 << 2) | 0;
7187 i5 = HEAP32[146] | 0;
7188 i3 = 1 << i3;
7189 if ((i5 & i3 | 0) != 0) {
7190 i4 = 624 + (i4 + 2 << 2) | 0;
7191 i3 = HEAP32[i4 >> 2] | 0;
7192 if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7193 _abort();
7194 } else {
7195 i7 = i4;
7196 i8 = i3;
7197 }
7198 } else {
7199 HEAP32[146] = i5 | i3;
7200 i7 = 624 + (i4 + 2 << 2) | 0;
7201 i8 = i2;
7202 }
7203 HEAP32[i7 >> 2] = i15;
7204 HEAP32[i8 + 12 >> 2] = i15;
7205 HEAP32[i15 + 8 >> 2] = i8;
7206 HEAP32[i15 + 12 >> 2] = i2;
7207 break;
7208 }
7209 i3 = i2 >>> 8;
7210 if ((i3 | 0) != 0) {
7211 if (i2 >>> 0 > 16777215) {
7212 i3 = 31;
7213 } else {
7214 i31 = (i3 + 1048320 | 0) >>> 16 & 8;
7215 i32 = i3 << i31;
7216 i30 = (i32 + 520192 | 0) >>> 16 & 4;
7217 i32 = i32 << i30;
7218 i3 = (i32 + 245760 | 0) >>> 16 & 2;
7219 i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
7220 i3 = i2 >>> (i3 + 7 | 0) & 1 | i3 << 1;
7221 }
7222 } else {
7223 i3 = 0;
7224 }
7225 i7 = 888 + (i3 << 2) | 0;
7226 HEAP32[i15 + 28 >> 2] = i3;
7227 HEAP32[i15 + 20 >> 2] = 0;
7228 HEAP32[i15 + 16 >> 2] = 0;
7229 i4 = HEAP32[588 >> 2] | 0;
7230 i5 = 1 << i3;
7231 if ((i4 & i5 | 0) == 0) {
7232 HEAP32[588 >> 2] = i4 | i5;
7233 HEAP32[i7 >> 2] = i15;
7234 HEAP32[i15 + 24 >> 2] = i7;
7235 HEAP32[i15 + 12 >> 2] = i15;
7236 HEAP32[i15 + 8 >> 2] = i15;
7237 break;
7238 }
7239 i4 = HEAP32[i7 >> 2] | 0;
7240 if ((i3 | 0) == 31) {
7241 i3 = 0;
7242 } else {
7243 i3 = 25 - (i3 >>> 1) | 0;
7244 }
7245 L499 : do {
7246 if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i2 | 0)) {
7247 i3 = i2 << i3;
7248 while (1) {
7249 i7 = i4 + (i3 >>> 31 << 2) + 16 | 0;
7250 i5 = HEAP32[i7 >> 2] | 0;
7251 if ((i5 | 0) == 0) {
7252 break;
7253 }
7254 if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i2 | 0)) {
7255 i6 = i5;
7256 break L499;
7257 } else {
7258 i3 = i3 << 1;
7259 i4 = i5;
7260 }
7261 }
7262 if (i7 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7263 _abort();
7264 } else {
7265 HEAP32[i7 >> 2] = i15;
7266 HEAP32[i15 + 24 >> 2] = i4;
7267 HEAP32[i15 + 12 >> 2] = i15;
7268 HEAP32[i15 + 8 >> 2] = i15;
7269 break L311;
7270 }
7271 } else {
7272 i6 = i4;
7273 }
7274 } while (0);
7275 i4 = i6 + 8 | 0;
7276 i3 = HEAP32[i4 >> 2] | 0;
7277 i2 = HEAP32[600 >> 2] | 0;
7278 if (i6 >>> 0 < i2 >>> 0) {
7279 _abort();
7280 }
7281 if (i3 >>> 0 < i2 >>> 0) {
7282 _abort();
7283 } else {
7284 HEAP32[i3 + 12 >> 2] = i15;
7285 HEAP32[i4 >> 2] = i15;
7286 HEAP32[i15 + 8 >> 2] = i3;
7287 HEAP32[i15 + 12 >> 2] = i6;
7288 HEAP32[i15 + 24 >> 2] = 0;
7289 break;
7290 }
7291 }
7292 } else {
7293 i32 = HEAP32[600 >> 2] | 0;
7294 if ((i32 | 0) == 0 | i17 >>> 0 < i32 >>> 0) {
7295 HEAP32[600 >> 2] = i17;
7296 }
7297 HEAP32[1032 >> 2] = i17;
7298 HEAP32[1036 >> 2] = i14;
7299 HEAP32[1044 >> 2] = 0;
7300 HEAP32[620 >> 2] = HEAP32[264];
7301 HEAP32[616 >> 2] = -1;
7302 i2 = 0;
7303 do {
7304 i32 = i2 << 1;
7305 i31 = 624 + (i32 << 2) | 0;
7306 HEAP32[624 + (i32 + 3 << 2) >> 2] = i31;
7307 HEAP32[624 + (i32 + 2 << 2) >> 2] = i31;
7308 i2 = i2 + 1 | 0;
7309 } while ((i2 | 0) != 32);
7310 i2 = i17 + 8 | 0;
7311 if ((i2 & 7 | 0) == 0) {
7312 i2 = 0;
7313 } else {
7314 i2 = 0 - i2 & 7;
7315 }
7316 i32 = i14 + -40 - i2 | 0;
7317 HEAP32[608 >> 2] = i17 + i2;
7318 HEAP32[596 >> 2] = i32;
7319 HEAP32[i17 + (i2 + 4) >> 2] = i32 | 1;
7320 HEAP32[i17 + (i14 + -36) >> 2] = 40;
7321 HEAP32[612 >> 2] = HEAP32[1072 >> 2];
7322 }
7323 } while (0);
7324 i2 = HEAP32[596 >> 2] | 0;
7325 if (i2 >>> 0 > i12 >>> 0) {
7326 i31 = i2 - i12 | 0;
7327 HEAP32[596 >> 2] = i31;
7328 i32 = HEAP32[608 >> 2] | 0;
7329 HEAP32[608 >> 2] = i32 + i12;
7330 HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
7331 HEAP32[i32 + 4 >> 2] = i12 | 3;
7332 i32 = i32 + 8 | 0;
7333 STACKTOP = i1;
7334 return i32 | 0;
7335 }
7336 }
7337 HEAP32[(___errno_location() | 0) >> 2] = 12;
7338 i32 = 0;
7339 STACKTOP = i1;
7340 return i32 | 0;
7341 }
7342 function _free(i7) {
7343 i7 = i7 | 0;
7344 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i1 1 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i 20 = 0, i21 = 0;
7345 i1 = STACKTOP;
7346 if ((i7 | 0) == 0) {
7347 STACKTOP = i1;
7348 return;
7349 }
7350 i15 = i7 + -8 | 0;
7351 i16 = HEAP32[600 >> 2] | 0;
7352 if (i15 >>> 0 < i16 >>> 0) {
7353 _abort();
7354 }
7355 i13 = HEAP32[i7 + -4 >> 2] | 0;
7356 i12 = i13 & 3;
7357 if ((i12 | 0) == 1) {
7358 _abort();
7359 }
7360 i8 = i13 & -8;
7361 i6 = i7 + (i8 + -8) | 0;
7362 do {
7363 if ((i13 & 1 | 0) == 0) {
7364 i19 = HEAP32[i15 >> 2] | 0;
7365 if ((i12 | 0) == 0) {
7366 STACKTOP = i1;
7367 return;
7368 }
7369 i15 = -8 - i19 | 0;
7370 i13 = i7 + i15 | 0;
7371 i12 = i19 + i8 | 0;
7372 if (i13 >>> 0 < i16 >>> 0) {
7373 _abort();
7374 }
7375 if ((i13 | 0) == (HEAP32[604 >> 2] | 0)) {
7376 i2 = i7 + (i8 + -4) | 0;
7377 if ((HEAP32[i2 >> 2] & 3 | 0) != 3) {
7378 i2 = i13;
7379 i11 = i12;
7380 break;
7381 }
7382 HEAP32[592 >> 2] = i12;
7383 HEAP32[i2 >> 2] = HEAP32[i2 >> 2] & -2;
7384 HEAP32[i7 + (i15 + 4) >> 2] = i12 | 1;
7385 HEAP32[i6 >> 2] = i12;
7386 STACKTOP = i1;
7387 return;
7388 }
7389 i18 = i19 >>> 3;
7390 if (i19 >>> 0 < 256) {
7391 i2 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
7392 i11 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
7393 i14 = 624 + (i18 << 1 << 2) | 0;
7394 if ((i2 | 0) != (i14 | 0)) {
7395 if (i2 >>> 0 < i16 >>> 0) {
7396 _abort();
7397 }
7398 if ((HEAP32[i2 + 12 >> 2] | 0) != (i13 | 0)) {
7399 _abort();
7400 }
7401 }
7402 if ((i11 | 0) == (i2 | 0)) {
7403 HEAP32[146] = HEAP32[146] & ~(1 << i18);
7404 i2 = i13;
7405 i11 = i12;
7406 break;
7407 }
7408 if ((i11 | 0) != (i14 | 0)) {
7409 if (i11 >>> 0 < i16 >>> 0) {
7410 _abort();
7411 }
7412 i14 = i11 + 8 | 0;
7413 if ((HEAP32[i14 >> 2] | 0) == (i13 | 0)) {
7414 i17 = i14;
7415 } else {
7416 _abort();
7417 }
7418 } else {
7419 i17 = i11 + 8 | 0;
7420 }
7421 HEAP32[i2 + 12 >> 2] = i11;
7422 HEAP32[i17 >> 2] = i2;
7423 i2 = i13;
7424 i11 = i12;
7425 break;
7426 }
7427 i17 = HEAP32[i7 + (i15 + 24) >> 2] | 0;
7428 i18 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
7429 do {
7430 if ((i18 | 0) == (i13 | 0)) {
7431 i19 = i7 + (i15 + 20) | 0;
7432 i18 = HEAP32[i19 >> 2] | 0;
7433 if ((i18 | 0) == 0) {
7434 i19 = i7 + (i15 + 16) | 0;
7435 i18 = HEAP32[i19 >> 2] | 0;
7436 if ((i18 | 0) == 0) {
7437 i14 = 0;
7438 break;
7439 }
7440 }
7441 while (1) {
7442 i21 = i18 + 20 | 0;
7443 i20 = HEAP32[i21 >> 2] | 0;
7444 if ((i20 | 0) != 0) {
7445 i18 = i20;
7446 i19 = i21;
7447 continue;
7448 }
7449 i20 = i18 + 16 | 0;
7450 i21 = HEAP32[i20 >> 2] | 0;
7451 if ((i21 | 0) == 0) {
7452 break;
7453 } else {
7454 i18 = i21;
7455 i19 = i20;
7456 }
7457 }
7458 if (i19 >>> 0 < i16 >>> 0) {
7459 _abort();
7460 } else {
7461 HEAP32[i19 >> 2] = 0;
7462 i14 = i18;
7463 break;
7464 }
7465 } else {
7466 i19 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
7467 if (i19 >>> 0 < i16 >>> 0) {
7468 _abort();
7469 }
7470 i16 = i19 + 12 | 0;
7471 if ((HEAP32[i16 >> 2] | 0) != (i13 | 0)) {
7472 _abort();
7473 }
7474 i20 = i18 + 8 | 0;
7475 if ((HEAP32[i20 >> 2] | 0) == (i13 | 0)) {
7476 HEAP32[i16 >> 2] = i18;
7477 HEAP32[i20 >> 2] = i19;
7478 i14 = i18;
7479 break;
7480 } else {
7481 _abort();
7482 }
7483 }
7484 } while (0);
7485 if ((i17 | 0) != 0) {
7486 i18 = HEAP32[i7 + (i15 + 28) >> 2] | 0;
7487 i16 = 888 + (i18 << 2) | 0;
7488 if ((i13 | 0) == (HEAP32[i16 >> 2] | 0)) {
7489 HEAP32[i16 >> 2] = i14;
7490 if ((i14 | 0) == 0) {
7491 HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i18);
7492 i2 = i13;
7493 i11 = i12;
7494 break;
7495 }
7496 } else {
7497 if (i17 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7498 _abort();
7499 }
7500 i16 = i17 + 16 | 0;
7501 if ((HEAP32[i16 >> 2] | 0) == (i13 | 0)) {
7502 HEAP32[i16 >> 2] = i14;
7503 } else {
7504 HEAP32[i17 + 20 >> 2] = i14;
7505 }
7506 if ((i14 | 0) == 0) {
7507 i2 = i13;
7508 i11 = i12;
7509 break;
7510 }
7511 }
7512 if (i14 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7513 _abort();
7514 }
7515 HEAP32[i14 + 24 >> 2] = i17;
7516 i16 = HEAP32[i7 + (i15 + 16) >> 2] | 0;
7517 do {
7518 if ((i16 | 0) != 0) {
7519 if (i16 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7520 _abort();
7521 } else {
7522 HEAP32[i14 + 16 >> 2] = i16;
7523 HEAP32[i16 + 24 >> 2] = i14;
7524 break;
7525 }
7526 }
7527 } while (0);
7528 i15 = HEAP32[i7 + (i15 + 20) >> 2] | 0;
7529 if ((i15 | 0) != 0) {
7530 if (i15 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7531 _abort();
7532 } else {
7533 HEAP32[i14 + 20 >> 2] = i15;
7534 HEAP32[i15 + 24 >> 2] = i14;
7535 i2 = i13;
7536 i11 = i12;
7537 break;
7538 }
7539 } else {
7540 i2 = i13;
7541 i11 = i12;
7542 }
7543 } else {
7544 i2 = i13;
7545 i11 = i12;
7546 }
7547 } else {
7548 i2 = i15;
7549 i11 = i8;
7550 }
7551 } while (0);
7552 if (!(i2 >>> 0 < i6 >>> 0)) {
7553 _abort();
7554 }
7555 i12 = i7 + (i8 + -4) | 0;
7556 i13 = HEAP32[i12 >> 2] | 0;
7557 if ((i13 & 1 | 0) == 0) {
7558 _abort();
7559 }
7560 if ((i13 & 2 | 0) == 0) {
7561 if ((i6 | 0) == (HEAP32[608 >> 2] | 0)) {
7562 i21 = (HEAP32[596 >> 2] | 0) + i11 | 0;
7563 HEAP32[596 >> 2] = i21;
7564 HEAP32[608 >> 2] = i2;
7565 HEAP32[i2 + 4 >> 2] = i21 | 1;
7566 if ((i2 | 0) != (HEAP32[604 >> 2] | 0)) {
7567 STACKTOP = i1;
7568 return;
7569 }
7570 HEAP32[604 >> 2] = 0;
7571 HEAP32[592 >> 2] = 0;
7572 STACKTOP = i1;
7573 return;
7574 }
7575 if ((i6 | 0) == (HEAP32[604 >> 2] | 0)) {
7576 i21 = (HEAP32[592 >> 2] | 0) + i11 | 0;
7577 HEAP32[592 >> 2] = i21;
7578 HEAP32[604 >> 2] = i2;
7579 HEAP32[i2 + 4 >> 2] = i21 | 1;
7580 HEAP32[i2 + i21 >> 2] = i21;
7581 STACKTOP = i1;
7582 return;
7583 }
7584 i11 = (i13 & -8) + i11 | 0;
7585 i12 = i13 >>> 3;
7586 do {
7587 if (!(i13 >>> 0 < 256)) {
7588 i10 = HEAP32[i7 + (i8 + 16) >> 2] | 0;
7589 i15 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
7590 do {
7591 if ((i15 | 0) == (i6 | 0)) {
7592 i13 = i7 + (i8 + 12) | 0;
7593 i12 = HEAP32[i13 >> 2] | 0;
7594 if ((i12 | 0) == 0) {
7595 i13 = i7 + (i8 + 8) | 0;
7596 i12 = HEAP32[i13 >> 2] | 0;
7597 if ((i12 | 0) == 0) {
7598 i9 = 0;
7599 break;
7600 }
7601 }
7602 while (1) {
7603 i14 = i12 + 20 | 0;
7604 i15 = HEAP32[i14 >> 2] | 0;
7605 if ((i15 | 0) != 0) {
7606 i12 = i15;
7607 i13 = i14;
7608 continue;
7609 }
7610 i14 = i12 + 16 | 0;
7611 i15 = HEAP32[i14 >> 2] | 0;
7612 if ((i15 | 0) == 0) {
7613 break;
7614 } else {
7615 i12 = i15;
7616 i13 = i14;
7617 }
7618 }
7619 if (i13 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7620 _abort();
7621 } else {
7622 HEAP32[i13 >> 2] = 0;
7623 i9 = i12;
7624 break;
7625 }
7626 } else {
7627 i13 = HEAP32[i7 + i8 >> 2] | 0;
7628 if (i13 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7629 _abort();
7630 }
7631 i14 = i13 + 12 | 0;
7632 if ((HEAP32[i14 >> 2] | 0) != (i6 | 0)) {
7633 _abort();
7634 }
7635 i12 = i15 + 8 | 0;
7636 if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
7637 HEAP32[i14 >> 2] = i15;
7638 HEAP32[i12 >> 2] = i13;
7639 i9 = i15;
7640 break;
7641 } else {
7642 _abort();
7643 }
7644 }
7645 } while (0);
7646 if ((i10 | 0) != 0) {
7647 i12 = HEAP32[i7 + (i8 + 20) >> 2] | 0;
7648 i13 = 888 + (i12 << 2) | 0;
7649 if ((i6 | 0) == (HEAP32[i13 >> 2] | 0)) {
7650 HEAP32[i13 >> 2] = i9;
7651 if ((i9 | 0) == 0) {
7652 HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i12);
7653 break;
7654 }
7655 } else {
7656 if (i10 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7657 _abort();
7658 }
7659 i12 = i10 + 16 | 0;
7660 if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
7661 HEAP32[i12 >> 2] = i9;
7662 } else {
7663 HEAP32[i10 + 20 >> 2] = i9;
7664 }
7665 if ((i9 | 0) == 0) {
7666 break;
7667 }
7668 }
7669 if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7670 _abort();
7671 }
7672 HEAP32[i9 + 24 >> 2] = i10;
7673 i6 = HEAP32[i7 + (i8 + 8) >> 2] | 0;
7674 do {
7675 if ((i6 | 0) != 0) {
7676 if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7677 _abort();
7678 } else {
7679 HEAP32[i9 + 16 >> 2] = i6;
7680 HEAP32[i6 + 24 >> 2] = i9;
7681 break;
7682 }
7683 }
7684 } while (0);
7685 i6 = HEAP32[i7 + (i8 + 12) >> 2] | 0;
7686 if ((i6 | 0) != 0) {
7687 if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7688 _abort();
7689 } else {
7690 HEAP32[i9 + 20 >> 2] = i6;
7691 HEAP32[i6 + 24 >> 2] = i9;
7692 break;
7693 }
7694 }
7695 }
7696 } else {
7697 i9 = HEAP32[i7 + i8 >> 2] | 0;
7698 i7 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
7699 i8 = 624 + (i12 << 1 << 2) | 0;
7700 if ((i9 | 0) != (i8 | 0)) {
7701 if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7702 _abort();
7703 }
7704 if ((HEAP32[i9 + 12 >> 2] | 0) != (i6 | 0)) {
7705 _abort();
7706 }
7707 }
7708 if ((i7 | 0) == (i9 | 0)) {
7709 HEAP32[146] = HEAP32[146] & ~(1 << i12);
7710 break;
7711 }
7712 if ((i7 | 0) != (i8 | 0)) {
7713 if (i7 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7714 _abort();
7715 }
7716 i8 = i7 + 8 | 0;
7717 if ((HEAP32[i8 >> 2] | 0) == (i6 | 0)) {
7718 i10 = i8;
7719 } else {
7720 _abort();
7721 }
7722 } else {
7723 i10 = i7 + 8 | 0;
7724 }
7725 HEAP32[i9 + 12 >> 2] = i7;
7726 HEAP32[i10 >> 2] = i9;
7727 }
7728 } while (0);
7729 HEAP32[i2 + 4 >> 2] = i11 | 1;
7730 HEAP32[i2 + i11 >> 2] = i11;
7731 if ((i2 | 0) == (HEAP32[604 >> 2] | 0)) {
7732 HEAP32[592 >> 2] = i11;
7733 STACKTOP = i1;
7734 return;
7735 }
7736 } else {
7737 HEAP32[i12 >> 2] = i13 & -2;
7738 HEAP32[i2 + 4 >> 2] = i11 | 1;
7739 HEAP32[i2 + i11 >> 2] = i11;
7740 }
7741 i6 = i11 >>> 3;
7742 if (i11 >>> 0 < 256) {
7743 i7 = i6 << 1;
7744 i3 = 624 + (i7 << 2) | 0;
7745 i8 = HEAP32[146] | 0;
7746 i6 = 1 << i6;
7747 if ((i8 & i6 | 0) != 0) {
7748 i6 = 624 + (i7 + 2 << 2) | 0;
7749 i7 = HEAP32[i6 >> 2] | 0;
7750 if (i7 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7751 _abort();
7752 } else {
7753 i4 = i6;
7754 i5 = i7;
7755 }
7756 } else {
7757 HEAP32[146] = i8 | i6;
7758 i4 = 624 + (i7 + 2 << 2) | 0;
7759 i5 = i3;
7760 }
7761 HEAP32[i4 >> 2] = i2;
7762 HEAP32[i5 + 12 >> 2] = i2;
7763 HEAP32[i2 + 8 >> 2] = i5;
7764 HEAP32[i2 + 12 >> 2] = i3;
7765 STACKTOP = i1;
7766 return;
7767 }
7768 i4 = i11 >>> 8;
7769 if ((i4 | 0) != 0) {
7770 if (i11 >>> 0 > 16777215) {
7771 i4 = 31;
7772 } else {
7773 i20 = (i4 + 1048320 | 0) >>> 16 & 8;
7774 i21 = i4 << i20;
7775 i19 = (i21 + 520192 | 0) >>> 16 & 4;
7776 i21 = i21 << i19;
7777 i4 = (i21 + 245760 | 0) >>> 16 & 2;
7778 i4 = 14 - (i19 | i20 | i4) + (i21 << i4 >>> 15) | 0;
7779 i4 = i11 >>> (i4 + 7 | 0) & 1 | i4 << 1;
7780 }
7781 } else {
7782 i4 = 0;
7783 }
7784 i5 = 888 + (i4 << 2) | 0;
7785 HEAP32[i2 + 28 >> 2] = i4;
7786 HEAP32[i2 + 20 >> 2] = 0;
7787 HEAP32[i2 + 16 >> 2] = 0;
7788 i7 = HEAP32[588 >> 2] | 0;
7789 i6 = 1 << i4;
7790 L199 : do {
7791 if ((i7 & i6 | 0) != 0) {
7792 i5 = HEAP32[i5 >> 2] | 0;
7793 if ((i4 | 0) == 31) {
7794 i4 = 0;
7795 } else {
7796 i4 = 25 - (i4 >>> 1) | 0;
7797 }
7798 L204 : do {
7799 if ((HEAP32[i5 + 4 >> 2] & -8 | 0) != (i11 | 0)) {
7800 i4 = i11 << i4;
7801 i7 = i5;
7802 while (1) {
7803 i6 = i7 + (i4 >>> 31 << 2) + 16 | 0;
7804 i5 = HEAP32[i6 >> 2] | 0;
7805 if ((i5 | 0) == 0) {
7806 break;
7807 }
7808 if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i11 | 0)) {
7809 i3 = i5;
7810 break L204;
7811 } else {
7812 i4 = i4 << 1;
7813 i7 = i5;
7814 }
7815 }
7816 if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) {
7817 _abort();
7818 } else {
7819 HEAP32[i6 >> 2] = i2;
7820 HEAP32[i2 + 24 >> 2] = i7;
7821 HEAP32[i2 + 12 >> 2] = i2;
7822 HEAP32[i2 + 8 >> 2] = i2;
7823 break L199;
7824 }
7825 } else {
7826 i3 = i5;
7827 }
7828 } while (0);
7829 i5 = i3 + 8 | 0;
7830 i4 = HEAP32[i5 >> 2] | 0;
7831 i6 = HEAP32[600 >> 2] | 0;
7832 if (i3 >>> 0 < i6 >>> 0) {
7833 _abort();
7834 }
7835 if (i4 >>> 0 < i6 >>> 0) {
7836 _abort();
7837 } else {
7838 HEAP32[i4 + 12 >> 2] = i2;
7839 HEAP32[i5 >> 2] = i2;
7840 HEAP32[i2 + 8 >> 2] = i4;
7841 HEAP32[i2 + 12 >> 2] = i3;
7842 HEAP32[i2 + 24 >> 2] = 0;
7843 break;
7844 }
7845 } else {
7846 HEAP32[588 >> 2] = i7 | i6;
7847 HEAP32[i5 >> 2] = i2;
7848 HEAP32[i2 + 24 >> 2] = i5;
7849 HEAP32[i2 + 12 >> 2] = i2;
7850 HEAP32[i2 + 8 >> 2] = i2;
7851 }
7852 } while (0);
7853 i21 = (HEAP32[616 >> 2] | 0) + -1 | 0;
7854 HEAP32[616 >> 2] = i21;
7855 if ((i21 | 0) == 0) {
7856 i2 = 1040 | 0;
7857 } else {
7858 STACKTOP = i1;
7859 return;
7860 }
7861 while (1) {
7862 i2 = HEAP32[i2 >> 2] | 0;
7863 if ((i2 | 0) == 0) {
7864 break;
7865 } else {
7866 i2 = i2 + 8 | 0;
7867 }
7868 }
7869 HEAP32[616 >> 2] = -1;
7870 STACKTOP = i1;
7871 return;
7872 }
7873 function _main(i7, i8) {
7874 i7 = i7 | 0;
7875 i8 = i8 | 0;
7876 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, d9 = 0.0, d10 = 0.0;
7877 i2 = STACKTOP;
7878 STACKTOP = STACKTOP + 4272 | 0;
7879 i3 = i2;
7880 i5 = i2 + 4248 | 0;
7881 i4 = i2 + 2128 | 0;
7882 i1 = i2 + 8 | 0;
7883 L1 : do {
7884 if ((i7 | 0) > 1) {
7885 i7 = HEAP8[HEAP32[i8 + 4 >> 2] | 0] | 0;
7886 switch (i7 | 0) {
7887 case 50:
7888 {
7889 i3 = 95e5;
7890 break L1;
7891 }
7892 case 51:
7893 {
7894 i6 = 4;
7895 break L1;
7896 }
7897 case 52:
7898 {
7899 i3 = 95e6;
7900 break L1;
7901 }
7902 case 53:
7903 {
7904 i3 = 19e7;
7905 break L1;
7906 }
7907 case 49:
7908 {
7909 i3 = 95e4;
7910 break L1;
7911 }
7912 case 48:
7913 {
7914 i8 = 0;
7915 STACKTOP = i2;
7916 return i8 | 0;
7917 }
7918 default:
7919 {
7920 HEAP32[i3 >> 2] = i7 + -48;
7921 _printf(280, i3 | 0) | 0;
7922 i8 = -1;
7923 STACKTOP = i2;
7924 return i8 | 0;
7925 }
7926 }
7927 } else {
7928 i6 = 4;
7929 }
7930 } while (0);
7931 if ((i6 | 0) == 4) {
7932 i3 = 19e6;
7933 }
7934 HEAP32[i5 + 8 >> 2] = 0;
7935 HEAP32[i5 + 4 >> 2] = 287;
7936 i8 = __Znaj(347) | 0;
7937 HEAP32[i5 >> 2] = i8;
7938 _memcpy(i8 | 0, 296, 287) | 0;
7939 i8 = i8 + 287 | 0;
7940 i7 = 296 | 0;
7941 i6 = i8 + 60 | 0;
7942 do {
7943 HEAP8[i8] = HEAP8[i7] | 0;
7944 i8 = i8 + 1 | 0;
7945 i7 = i7 + 1 | 0;
7946 } while ((i8 | 0) < (i6 | 0));
7947 i7 = i3 << 1;
7948 while (1) {
7949 i6 = i7 >>> 0 < 60 ? i7 : 60;
7950 __ZN14RotatingString5writeEj(i5, i6);
7951 if ((i7 | 0) == (i6 | 0)) {
7952 break;
7953 } else {
7954 i7 = i7 - i6 | 0;
7955 }
7956 }
7957 i5 = HEAP32[i5 >> 2] | 0;
7958 if ((i5 | 0) != 0) {
7959 __ZdaPv(i5);
7960 }
7961 if ((HEAP32[6] | 0) == 0) {
7962 i6 = 24;
7963 i5 = 0;
7964 } else {
7965 i5 = 24;
7966 d9 = 0.0;
7967 while (1) {
7968 i6 = i5 + 4 | 0;
7969 d9 = d9 + +HEAPF32[i6 >> 2];
7970 d10 = d9 < 1.0 ? d9 : 1.0;
7971 HEAPF32[i6 >> 2] = d10;
7972 HEAP32[i5 + 8 >> 2] = ~~(d10 * 512.0) >>> 0;
7973 i5 = i5 + 12 | 0;
7974 if ((HEAP32[i5 >> 2] | 0) == 0) {
7975 i6 = 24;
7976 i5 = 0;
7977 break;
7978 }
7979 }
7980 }
7981 do {
7982 while (1) {
7983 i8 = HEAP32[i6 + 8 >> 2] | 0;
7984 if (i5 >>> 0 > i8 >>> 0 & (i8 | 0) != 0) {
7985 i6 = i6 + 12 | 0;
7986 } else {
7987 break;
7988 }
7989 }
7990 HEAP32[i4 + (i5 << 2) >> 2] = i6;
7991 i5 = i5 + 1 | 0;
7992 } while ((i5 | 0) != 513);
7993 HEAP32[i4 + 2116 >> 2] = 0;
7994 __Z9makeFastaI10RandomizedEvPKcS2_jRT_(0, 0, i3 * 3 | 0, i4);
7995 if ((HEAP32[54] | 0) == 0) {
7996 i5 = 216;
7997 i4 = 0;
7998 } else {
7999 i5 = 216;
8000 d9 = 0.0;
8001 while (1) {
8002 i4 = i5 + 4 | 0;
8003 d9 = d9 + +HEAPF32[i4 >> 2];
8004 d10 = d9 < 1.0 ? d9 : 1.0;
8005 HEAPF32[i4 >> 2] = d10;
8006 HEAP32[i5 + 8 >> 2] = ~~(d10 * 512.0) >>> 0;
8007 i5 = i5 + 12 | 0;
8008 if ((HEAP32[i5 >> 2] | 0) == 0) {
8009 i5 = 216;
8010 i4 = 0;
8011 break;
8012 }
8013 }
8014 }
8015 do {
8016 while (1) {
8017 i8 = HEAP32[i5 + 8 >> 2] | 0;
8018 if (i4 >>> 0 > i8 >>> 0 & (i8 | 0) != 0) {
8019 i5 = i5 + 12 | 0;
8020 } else {
8021 break;
8022 }
8023 }
8024 HEAP32[i1 + (i4 << 2) >> 2] = i5;
8025 i4 = i4 + 1 | 0;
8026 } while ((i4 | 0) != 513);
8027 HEAP32[i1 + 2116 >> 2] = 0;
8028 __Z9makeFastaI10RandomizedEvPKcS2_jRT_(0, 0, i3 * 5 | 0, i1);
8029 i8 = 0;
8030 STACKTOP = i2;
8031 return i8 | 0;
8032 }
8033 function __Z9makeFastaI10RandomizedEvPKcS2_jRT_(i3, i2, i6, i1) {
8034 i3 = i3 | 0;
8035 i2 = i2 | 0;
8036 i6 = i6 | 0;
8037 i1 = i1 | 0;
8038 var i4 = 0, i5 = 0, i7 = 0, d8 = 0.0, i9 = 0;
8039 i2 = STACKTOP;
8040 if ((i6 | 0) == 0) {
8041 STACKTOP = i2;
8042 return;
8043 }
8044 i4 = i1 + 2116 | 0;
8045 i3 = i1 + 2052 | 0;
8046 while (1) {
8047 i5 = i6 >>> 0 < 60 ? i6 : 60;
8048 if ((i5 | 0) != 0) {
8049 i7 = 0;
8050 do {
8051 i9 = ((((HEAP32[4] | 0) * 3877 | 0) + 29573 | 0) >>> 0) % 139968 | 0;
8052 HEAP32[4] = i9;
8053 d8 = +(i9 >>> 0) / 139968.0;
8054 i9 = HEAP32[i1 + (~~(d8 * 512.0) >>> 0 << 2) >> 2] | 0;
8055 while (1) {
8056 if (+HEAPF32[i9 + 4 >> 2] < d8) {
8057 i9 = i9 + 12 | 0;
8058 } else {
8059 break;
8060 }
8061 }
8062 HEAP8[i1 + i7 + 2052 | 0] = HEAP32[i9 >> 2];
8063 i7 = i7 + 1 | 0;
8064 } while ((i7 | 0) != (i5 | 0));
8065 }
8066 HEAP8[i1 + i5 + 2052 | 0] = 10;
8067 i9 = i5 + 1 | 0;
8068 HEAP8[i1 + i9 + 2052 | 0] = 0;
8069 HEAP32[i4 >> 2] = i9;
8070 i9 = _strlen(i3 | 0) | 0;
8071 i7 = HEAP32[2] | 0;
8072 if ((i9 | 0) > (i7 | 0)) {
8073 if ((i7 | 0) > 0) {
8074 HEAP8[i1 + i7 + 2052 | 0] = 0;
8075 _puts(i3 | 0) | 0;
8076 HEAP8[i1 + (HEAP32[2] | 0) + 2052 | 0] = 122;
8077 HEAP32[2] = 0;
8078 }
8079 } else {
8080 _puts(i3 | 0) | 0;
8081 HEAP32[2] = (HEAP32[2] | 0) - i9;
8082 }
8083 if ((i6 | 0) == (i5 | 0)) {
8084 break;
8085 } else {
8086 i6 = i6 - i5 | 0;
8087 }
8088 }
8089 STACKTOP = i2;
8090 return;
8091 }
8092 function __ZN14RotatingString5writeEj(i3, i4) {
8093 i3 = i3 | 0;
8094 i4 = i4 | 0;
8095 var i1 = 0, i2 = 0, i5 = 0, i6 = 0, i7 = 0;
8096 i1 = STACKTOP;
8097 i5 = __Znaj(i4 + 2 | 0) | 0;
8098 i2 = i3 + 8 | 0;
8099 _memcpy(i5 | 0, (HEAP32[i3 >> 2] | 0) + (HEAP32[i2 >> 2] | 0) | 0, i4 | 0) | 0;
8100 HEAP8[i5 + i4 | 0] = 0;
8101 i7 = _strlen(i5 | 0) | 0;
8102 i6 = HEAP32[2] | 0;
8103 if ((i7 | 0) > (i6 | 0)) {
8104 if ((i6 | 0) > 0) {
8105 HEAP8[i5 + i6 | 0] = 0;
8106 _puts(i5 | 0) | 0;
8107 HEAP32[2] = 0;
8108 i6 = 6;
8109 } else {
8110 i6 = 5;
8111 }
8112 } else {
8113 _puts(i5 | 0) | 0;
8114 HEAP32[2] = (HEAP32[2] | 0) - i7;
8115 i6 = 5;
8116 }
8117 if ((i6 | 0) == 5 ? (i5 | 0) != 0 : 0) {
8118 i6 = 6;
8119 }
8120 if ((i6 | 0) == 6) {
8121 __ZdlPv(i5);
8122 }
8123 i4 = (HEAP32[i2 >> 2] | 0) + i4 | 0;
8124 HEAP32[i2 >> 2] = i4;
8125 i3 = HEAP32[i3 + 4 >> 2] | 0;
8126 if (!(i4 >>> 0 > i3 >>> 0)) {
8127 STACKTOP = i1;
8128 return;
8129 }
8130 HEAP32[i2 >> 2] = i4 - i3;
8131 STACKTOP = i1;
8132 return;
8133 }
8134 function _memcpy(i3, i2, i1) {
8135 i3 = i3 | 0;
8136 i2 = i2 | 0;
8137 i1 = i1 | 0;
8138 var i4 = 0;
8139 if ((i1 | 0) >= 4096) return _emscripten_memcpy_big(i3 | 0, i2 | 0, i1 | 0) | 0 ;
8140 i4 = i3 | 0;
8141 if ((i3 & 3) == (i2 & 3)) {
8142 while (i3 & 3) {
8143 if ((i1 | 0) == 0) return i4 | 0;
8144 HEAP8[i3] = HEAP8[i2] | 0;
8145 i3 = i3 + 1 | 0;
8146 i2 = i2 + 1 | 0;
8147 i1 = i1 - 1 | 0;
8148 }
8149 while ((i1 | 0) >= 4) {
8150 HEAP32[i3 >> 2] = HEAP32[i2 >> 2];
8151 i3 = i3 + 4 | 0;
8152 i2 = i2 + 4 | 0;
8153 i1 = i1 - 4 | 0;
8154 }
8155 }
8156 while ((i1 | 0) > 0) {
8157 HEAP8[i3] = HEAP8[i2] | 0;
8158 i3 = i3 + 1 | 0;
8159 i2 = i2 + 1 | 0;
8160 i1 = i1 - 1 | 0;
8161 }
8162 return i4 | 0;
8163 }
8164 function _memset(i1, i4, i3) {
8165 i1 = i1 | 0;
8166 i4 = i4 | 0;
8167 i3 = i3 | 0;
8168 var i2 = 0, i5 = 0, i6 = 0, i7 = 0;
8169 i2 = i1 + i3 | 0;
8170 if ((i3 | 0) >= 20) {
8171 i4 = i4 & 255;
8172 i7 = i1 & 3;
8173 i6 = i4 | i4 << 8 | i4 << 16 | i4 << 24;
8174 i5 = i2 & ~3;
8175 if (i7) {
8176 i7 = i1 + 4 - i7 | 0;
8177 while ((i1 | 0) < (i7 | 0)) {
8178 HEAP8[i1] = i4;
8179 i1 = i1 + 1 | 0;
8180 }
8181 }
8182 while ((i1 | 0) < (i5 | 0)) {
8183 HEAP32[i1 >> 2] = i6;
8184 i1 = i1 + 4 | 0;
8185 }
8186 }
8187 while ((i1 | 0) < (i2 | 0)) {
8188 HEAP8[i1] = i4;
8189 i1 = i1 + 1 | 0;
8190 }
8191 return i1 - i3 | 0;
8192 }
8193 function __Znwj(i2) {
8194 i2 = i2 | 0;
8195 var i1 = 0, i3 = 0;
8196 i1 = STACKTOP;
8197 i2 = (i2 | 0) == 0 ? 1 : i2;
8198 while (1) {
8199 i3 = _malloc(i2) | 0;
8200 if ((i3 | 0) != 0) {
8201 i2 = 6;
8202 break;
8203 }
8204 i3 = HEAP32[270] | 0;
8205 HEAP32[270] = i3 + 0;
8206 if ((i3 | 0) == 0) {
8207 i2 = 5;
8208 break;
8209 }
8210 FUNCTION_TABLE_v[i3 & 0]();
8211 }
8212 if ((i2 | 0) == 5) {
8213 i3 = ___cxa_allocate_exception(4) | 0;
8214 HEAP32[i3 >> 2] = 1096;
8215 ___cxa_throw(i3 | 0, 1144, 1);
8216 } else if ((i2 | 0) == 6) {
8217 STACKTOP = i1;
8218 return i3 | 0;
8219 }
8220 return 0;
8221 }
8222 function copyTempDouble(i1) {
8223 i1 = i1 | 0;
8224 HEAP8[tempDoublePtr] = HEAP8[i1];
8225 HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
8226 HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
8227 HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
8228 HEAP8[tempDoublePtr + 4 | 0] = HEAP8[i1 + 4 | 0];
8229 HEAP8[tempDoublePtr + 5 | 0] = HEAP8[i1 + 5 | 0];
8230 HEAP8[tempDoublePtr + 6 | 0] = HEAP8[i1 + 6 | 0];
8231 HEAP8[tempDoublePtr + 7 | 0] = HEAP8[i1 + 7 | 0];
8232 }
8233 function copyTempFloat(i1) {
8234 i1 = i1 | 0;
8235 HEAP8[tempDoublePtr] = HEAP8[i1];
8236 HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
8237 HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
8238 HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
8239 }
8240 function __ZNSt9bad_allocD0Ev(i1) {
8241 i1 = i1 | 0;
8242 var i2 = 0;
8243 i2 = STACKTOP;
8244 __ZNSt9exceptionD2Ev(i1 | 0);
8245 __ZdlPv(i1);
8246 STACKTOP = i2;
8247 return;
8248 }
8249 function stackAlloc(i1) {
8250 i1 = i1 | 0;
8251 var i2 = 0;
8252 i2 = STACKTOP;
8253 STACKTOP = STACKTOP + i1 | 0;
8254 STACKTOP = STACKTOP + 7 & -8;
8255 return i2 | 0;
8256 }
8257 function __ZNSt9bad_allocD2Ev(i1) {
8258 i1 = i1 | 0;
8259 var i2 = 0;
8260 i2 = STACKTOP;
8261 __ZNSt9exceptionD2Ev(i1 | 0);
8262 STACKTOP = i2;
8263 return;
8264 }
8265 function __ZdlPv(i1) {
8266 i1 = i1 | 0;
8267 var i2 = 0;
8268 i2 = STACKTOP;
8269 if ((i1 | 0) != 0) {
8270 _free(i1);
8271 }
8272 STACKTOP = i2;
8273 return;
8274 }
8275 function _strlen(i1) {
8276 i1 = i1 | 0;
8277 var i2 = 0;
8278 i2 = i1;
8279 while (HEAP8[i2] | 0) {
8280 i2 = i2 + 1 | 0;
8281 }
8282 return i2 - i1 | 0;
8283 }
8284 function setThrew(i1, i2) {
8285 i1 = i1 | 0;
8286 i2 = i2 | 0;
8287 if ((__THREW__ | 0) == 0) {
8288 __THREW__ = i1;
8289 threwValue = i2;
8290 }
8291 }
8292 function __Znaj(i1) {
8293 i1 = i1 | 0;
8294 var i2 = 0;
8295 i2 = STACKTOP;
8296 i1 = __Znwj(i1) | 0;
8297 STACKTOP = i2;
8298 return i1 | 0;
8299 }
8300 function runPostSets() {
8301 HEAP32[286] = __ZTVN10__cxxabiv120__si_class_type_infoE;
8302 HEAP32[288] = __ZTISt9exception;
8303 }
8304 function dynCall_ii(i2, i1) {
8305 i2 = i2 | 0;
8306 i1 = i1 | 0;
8307 return FUNCTION_TABLE_ii[i2 & 1](i1 | 0) | 0;
8308 }
8309 function __ZdaPv(i1) {
8310 i1 = i1 | 0;
8311 var i2 = 0;
8312 i2 = STACKTOP;
8313 __ZdlPv(i1);
8314 STACKTOP = i2;
8315 return;
8316 }
8317 function dynCall_vi(i2, i1) {
8318 i2 = i2 | 0;
8319 i1 = i1 | 0;
8320 FUNCTION_TABLE_vi[i2 & 3](i1 | 0);
8321 }
8322 function dynCall_v(i1) {
8323 i1 = i1 | 0;
8324 FUNCTION_TABLE_v[i1 & 0]();
8325 }
8326 function __ZNKSt9bad_alloc4whatEv(i1) {
8327 i1 = i1 | 0;
8328 return 1112;
8329 }
8330 function stackRestore(i1) {
8331 i1 = i1 | 0;
8332 STACKTOP = i1;
8333 }
8334 function setTempRet9(i1) {
8335 i1 = i1 | 0;
8336 tempRet9 = i1;
8337 }
8338 function setTempRet8(i1) {
8339 i1 = i1 | 0;
8340 tempRet8 = i1;
8341 }
8342 function setTempRet7(i1) {
8343 i1 = i1 | 0;
8344 tempRet7 = i1;
8345 }
8346 function setTempRet6(i1) {
8347 i1 = i1 | 0;
8348 tempRet6 = i1;
8349 }
8350 function setTempRet5(i1) {
8351 i1 = i1 | 0;
8352 tempRet5 = i1;
8353 }
8354 function setTempRet4(i1) {
8355 i1 = i1 | 0;
8356 tempRet4 = i1;
8357 }
8358 function setTempRet3(i1) {
8359 i1 = i1 | 0;
8360 tempRet3 = i1;
8361 }
8362 function setTempRet2(i1) {
8363 i1 = i1 | 0;
8364 tempRet2 = i1;
8365 }
8366 function setTempRet1(i1) {
8367 i1 = i1 | 0;
8368 tempRet1 = i1;
8369 }
8370 function setTempRet0(i1) {
8371 i1 = i1 | 0;
8372 tempRet0 = i1;
8373 }
8374 function b0(i1) {
8375 i1 = i1 | 0;
8376 abort(0);
8377 return 0;
8378 }
8379 function stackSave() {
8380 return STACKTOP | 0;
8381 }
8382 function b1(i1) {
8383 i1 = i1 | 0;
8384 abort(1);
8385 }
8386 function b2() {
8387 abort(2);
8388 }
8389
8390 // EMSCRIPTEN_END_FUNCS
8391 var FUNCTION_TABLE_ii = [b0,__ZNKSt9bad_alloc4whatEv];
8392 var FUNCTION_TABLE_vi = [b1,__ZNSt9bad_allocD2Ev,__ZNSt9bad_allocD0Ev,b1];
8393 var FUNCTION_TABLE_v = [b2];
8394
8395 return { _strlen: _strlen, _free: _free, _main: _main, _memset: _memset, _mall oc: _malloc, _memcpy: _memcpy, runPostSets: runPostSets, stackAlloc: stackAlloc, stackSave: stackSave, stackRestore: stackRestore, setThrew: setThrew, setTempRe t0: setTempRet0, setTempRet1: setTempRet1, setTempRet2: setTempRet2, setTempRet3 : setTempRet3, setTempRet4: setTempRet4, setTempRet5: setTempRet5, setTempRet6: setTempRet6, setTempRet7: setTempRet7, setTempRet8: setTempRet8, setTempRet9: se tTempRet9, dynCall_ii: dynCall_ii, dynCall_vi: dynCall_vi, dynCall_v: dynCall_v };
8396 })
8397 // EMSCRIPTEN_END_ASM
8398 ({ "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array" : Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array }, { " abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": as mPrintFloat, "min": Math_min, "invoke_ii": invoke_ii, "invoke_vi": invoke_vi, "i nvoke_v": invoke_v, "_send": _send, "___setErrNo": ___setErrNo, "___cxa_is_numbe r_type": ___cxa_is_number_type, "___cxa_allocate_exception": ___cxa_allocate_exc eption, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_fflush": _ff lush, "_time": _time, "_pwrite": _pwrite, "__reallyNegative": __reallyNegative, "_sbrk": _sbrk, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_fileno": _fi leno, "___resumeException": ___resumeException, "__ZSt18uncaught_exceptionv": __ ZSt18uncaught_exceptionv, "_sysconf": _sysconf, "_puts": _puts, "_mkport": _mkpo rt, "_write": _write, "___errno_location": ___errno_location, "__ZNSt9exceptionD 2Ev": __ZNSt9exceptionD2Ev, "_fputc": _fputc, "___cxa_throw": ___cxa_throw, "_ab ort": _abort, "_fwrite": _fwrite, "___cxa_does_inherit": ___cxa_does_inherit, "_ fprintf": _fprintf, "__formatString": __formatString, "_fputs": _fputs, "_printf ": _printf, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempD oublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity, "__ZTISt9exception": __ZTISt9exception, "__ZTVN10__cxxabiv120__si_class_type_infoE": __ZTVN10__cxxab iv120__si_class_type_infoE }, buffer);
8399 var _strlen = Module["_strlen"] = asm["_strlen"];
8400 var _free = Module["_free"] = asm["_free"];
8401 var _main = Module["_main"] = asm["_main"];
8402 var _memset = Module["_memset"] = asm["_memset"];
8403 var _malloc = Module["_malloc"] = asm["_malloc"];
8404 var _memcpy = Module["_memcpy"] = asm["_memcpy"];
8405 var runPostSets = Module["runPostSets"] = asm["runPostSets"];
8406 var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"];
8407 var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"];
8408 var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"];
8409
8410 Runtime.stackAlloc = function(size) { return asm['stackAlloc'](size) };
8411 Runtime.stackSave = function() { return asm['stackSave']() };
8412 Runtime.stackRestore = function(top) { asm['stackRestore'](top) };
8413
8414
8415 // Warning: printing of i64 values may be slightly rounded! No deep i64 math use d, so precise i64 code not included
8416 var i64Math = null;
8417
8418 // === Auto-generated postamble setup entry stuff ===
8419
8420 if (memoryInitializer) {
8421 if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
8422 var data = Module['readBinary'](memoryInitializer);
8423 HEAPU8.set(data, STATIC_BASE);
8424 } else {
8425 addRunDependency('memory initializer');
8426 Browser.asyncLoad(memoryInitializer, function(data) {
8427 HEAPU8.set(data, STATIC_BASE);
8428 removeRunDependency('memory initializer');
8429 }, function(data) {
8430 throw 'could not load memory initializer ' + memoryInitializer;
8431 });
8432 }
8433 }
8434
8435 function ExitStatus(status) {
8436 this.name = "ExitStatus";
8437 this.message = "Program terminated with exit(" + status + ")";
8438 this.status = status;
8439 };
8440 ExitStatus.prototype = new Error();
8441 ExitStatus.prototype.constructor = ExitStatus;
8442
8443 var initialStackTop;
8444 var preloadStartTime = null;
8445 var calledMain = false;
8446
8447 dependenciesFulfilled = function runCaller() {
8448 // If run has never been called, and we should call run (INVOKE_RUN is true, a nd Module.noInitialRun is not false)
8449 if (!Module['calledRun'] && shouldRunNow) run([].concat(Module["arguments"]));
8450 if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
8451 }
8452
8453 Module['callMain'] = Module.callMain = function callMain(args) {
8454 assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');
8455 assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remai n to be called');
8456
8457 args = args || [];
8458
8459 ensureInitRuntime();
8460
8461 var argc = args.length+1;
8462 function pad() {
8463 for (var i = 0; i < 4-1; i++) {
8464 argv.push(0);
8465 }
8466 }
8467 var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORM AL) ];
8468 pad();
8469 for (var i = 0; i < argc-1; i = i + 1) {
8470 argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));
8471 pad();
8472 }
8473 argv.push(0);
8474 argv = allocate(argv, 'i32', ALLOC_NORMAL);
8475
8476 initialStackTop = STACKTOP;
8477
8478 try {
8479
8480 var ret = Module['_main'](argc, argv, 0);
8481
8482
8483 // if we're not running an evented main loop, it's time to exit
8484 if (!Module['noExitRuntime']) {
8485 exit(ret);
8486 }
8487 }
8488 catch(e) {
8489 if (e instanceof ExitStatus) {
8490 // exit() throws this once it's done to make sure execution
8491 // has been stopped completely
8492 return;
8493 } else if (e == 'SimulateInfiniteLoop') {
8494 // running an evented main loop, don't immediately exit
8495 Module['noExitRuntime'] = true;
8496 return;
8497 } else {
8498 if (e && typeof e === 'object' && e.stack) Module.printErr('exception thro wn: ' + [e, e.stack]);
8499 throw e;
8500 }
8501 } finally {
8502 calledMain = true;
8503 }
8504 }
8505
8506
8507
8508
8509 function run(args) {
8510 args = args || Module['arguments'];
8511
8512 if (preloadStartTime === null) preloadStartTime = Date.now();
8513
8514 if (runDependencies > 0) {
8515 Module.printErr('run() called, but dependencies remain, so not running');
8516 return;
8517 }
8518
8519 preRun();
8520
8521 if (runDependencies > 0) return; // a preRun added a dependency, run will be c alled later
8522 if (Module['calledRun']) return; // run may have just been called through depe ndencies being fulfilled just in this very frame
8523
8524 function doRun() {
8525 if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening
8526 Module['calledRun'] = true;
8527
8528 ensureInitRuntime();
8529
8530 preMain();
8531
8532 if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {
8533 Module.printErr('pre-main prep time: ' + (Date.now() - preloadStartTime) + ' ms');
8534 }
8535
8536 if (Module['_main'] && shouldRunNow) {
8537 Module['callMain'](args);
8538 }
8539
8540 postRun();
8541 }
8542
8543 if (Module['setStatus']) {
8544 Module['setStatus']('Running...');
8545 setTimeout(function() {
8546 setTimeout(function() {
8547 Module['setStatus']('');
8548 }, 1);
8549 if (!ABORT) doRun();
8550 }, 1);
8551 } else {
8552 doRun();
8553 }
8554 }
8555 Module['run'] = Module.run = run;
8556
8557 function exit(status) {
8558 ABORT = true;
8559 EXITSTATUS = status;
8560 STACKTOP = initialStackTop;
8561
8562 // exit the runtime
8563 exitRuntime();
8564
8565 // TODO We should handle this differently based on environment.
8566 // In the browser, the best we can do is throw an exception
8567 // to halt execution, but in node we could process.exit and
8568 // I'd imagine SM shell would have something equivalent.
8569 // This would let us set a proper exit status (which
8570 // would be great for checking test exit statuses).
8571 // https://github.com/kripken/emscripten/issues/1371
8572
8573 // throw an exception to halt the current execution
8574 throw new ExitStatus(status);
8575 }
8576 Module['exit'] = Module.exit = exit;
8577
8578 function abort(text) {
8579 if (text) {
8580 Module.print(text);
8581 Module.printErr(text);
8582 }
8583
8584 ABORT = true;
8585 EXITSTATUS = 1;
8586
8587 var extra = '\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';
8588
8589 throw 'abort() at ' + stackTrace() + extra;
8590 }
8591 Module['abort'] = Module.abort = abort;
8592
8593 // {{PRE_RUN_ADDITIONS}}
8594
8595 if (Module['preInit']) {
8596 if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preIn it']];
8597 while (Module['preInit'].length > 0) {
8598 Module['preInit'].pop()();
8599 }
8600 }
8601
8602 // shouldRunNow refers to calling main(), not run().
8603 var shouldRunNow = true;
8604 if (Module['noInitialRun']) {
8605 shouldRunNow = false;
8606 }
8607
8608
8609 run([].concat(Module["arguments"]));
OLDNEW
« no previous file with comments | « test/mjsunit/asm/embenchen/fannkuch.js ('k') | test/mjsunit/asm/embenchen/memops.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698