corrade-nucleus-nucleons – Blame information for rev 20

Subversion Repositories:
Rev:
Rev Author Line No. Line
20 office 1 "no use strict";
2 ;(function(window) {
3 if (typeof window.window != "undefined" && window.document)
4 return;
5 if (window.require && window.define)
6 return;
7  
8 if (!window.console) {
9 window.console = function() {
10 var msgs = Array.prototype.slice.call(arguments, 0);
11 postMessage({type: "log", data: msgs});
12 };
13 window.console.error =
14 window.console.warn =
15 window.console.log =
16 window.console.trace = window.console;
17 }
18 window.window = window;
19 window.ace = window;
20  
21 window.onerror = function(message, file, line, col, err) {
22 postMessage({type: "error", data: {
23 message: message,
24 data: err.data,
25 file: file,
26 line: line,
27 col: col,
28 stack: err.stack
29 }});
30 };
31  
32 window.normalizeModule = function(parentId, moduleName) {
33 // normalize plugin requires
34 if (moduleName.indexOf("!") !== -1) {
35 var chunks = moduleName.split("!");
36 return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);
37 }
38 // normalize relative requires
39 if (moduleName.charAt(0) == ".") {
40 var base = parentId.split("/").slice(0, -1).join("/");
41 moduleName = (base ? base + "/" : "") + moduleName;
42  
43 while (moduleName.indexOf(".") !== -1 && previous != moduleName) {
44 var previous = moduleName;
45 moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
46 }
47 }
48  
49 return moduleName;
50 };
51  
52 window.require = function require(parentId, id) {
53 if (!id) {
54 id = parentId;
55 parentId = null;
56 }
57 if (!id.charAt)
58 throw new Error("worker.js require() accepts only (parentId, id) as arguments");
59  
60 id = window.normalizeModule(parentId, id);
61  
62 var module = window.require.modules[id];
63 if (module) {
64 if (!module.initialized) {
65 module.initialized = true;
66 module.exports = module.factory().exports;
67 }
68 return module.exports;
69 }
70  
71 if (!window.require.tlns)
72 return console.log("unable to load " + id);
73  
74 var path = resolveModuleId(id, window.require.tlns);
75 if (path.slice(-3) != ".js") path += ".js";
76  
77 window.require.id = id;
78 window.require.modules[id] = {}; // prevent infinite loop on broken modules
79 importScripts(path);
80 return window.require(parentId, id);
81 };
82 function resolveModuleId(id, paths) {
83 var testPath = id, tail = "";
84 while (testPath) {
85 var alias = paths[testPath];
86 if (typeof alias == "string") {
87 return alias + tail;
88 } else if (alias) {
89 return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name);
90 } else if (alias === false) {
91 return "";
92 }
93 var i = testPath.lastIndexOf("/");
94 if (i === -1) break;
95 tail = testPath.substr(i) + tail;
96 testPath = testPath.slice(0, i);
97 }
98 return id;
99 }
100 window.require.modules = {};
101 window.require.tlns = {};
102  
103 window.define = function(id, deps, factory) {
104 if (arguments.length == 2) {
105 factory = deps;
106 if (typeof id != "string") {
107 deps = id;
108 id = window.require.id;
109 }
110 } else if (arguments.length == 1) {
111 factory = id;
112 deps = [];
113 id = window.require.id;
114 }
115  
116 if (typeof factory != "function") {
117 window.require.modules[id] = {
118 exports: factory,
119 initialized: true
120 };
121 return;
122 }
123  
124 if (!deps.length)
125 // If there is no dependencies, we inject "require", "exports" and
126 // "module" as dependencies, to provide CommonJS compatibility.
127 deps = ["require", "exports", "module"];
128  
129 var req = function(childId) {
130 return window.require(id, childId);
131 };
132  
133 window.require.modules[id] = {
134 exports: {},
135 factory: function() {
136 var module = this;
137 var returnExports = factory.apply(this, deps.map(function(dep) {
138 switch (dep) {
139 // Because "require", "exports" and "module" aren't actual
140 // dependencies, we must handle them seperately.
141 case "require": return req;
142 case "exports": return module.exports;
143 case "module": return module;
144 // But for all other dependencies, we can just go ahead and
145 // require them.
146 default: return req(dep);
147 }
148 }));
149 if (returnExports)
150 module.exports = returnExports;
151 return module;
152 }
153 };
154 };
155 window.define.amd = {};
156 require.tlns = {};
157 window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
158 for (var i in topLevelNamespaces)
159 require.tlns[i] = topLevelNamespaces[i];
160 };
161  
162 window.initSender = function initSender() {
163  
164 var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;
165 var oop = window.require("ace/lib/oop");
166  
167 var Sender = function() {};
168  
169 (function() {
170  
171 oop.implement(this, EventEmitter);
172  
173 this.callback = function(data, callbackId) {
174 postMessage({
175 type: "call",
176 id: callbackId,
177 data: data
178 });
179 };
180  
181 this.emit = function(name, data) {
182 postMessage({
183 type: "event",
184 name: name,
185 data: data
186 });
187 };
188  
189 }).call(Sender.prototype);
190  
191 return new Sender();
192 };
193  
194 var main = window.main = null;
195 var sender = window.sender = null;
196  
197 window.onmessage = function(e) {
198 var msg = e.data;
199 if (msg.event && sender) {
200 sender._signal(msg.event, msg.data);
201 }
202 else if (msg.command) {
203 if (main[msg.command])
204 main[msg.command].apply(main, msg.args);
205 else if (window[msg.command])
206 window[msg.command].apply(window, msg.args);
207 else
208 throw new Error("Unknown command:" + msg.command);
209 }
210 else if (msg.init) {
211 window.initBaseUrls(msg.tlns);
212 require("ace/lib/es5-shim");
213 sender = window.sender = window.initSender();
214 var clazz = require(msg.module)[msg.classname];
215 main = window.main = new clazz(sender);
216 }
217 };
218 })(this);
219  
220 ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) {
221 "use strict";
222  
223 exports.inherits = function(ctor, superCtor) {
224 ctor.super_ = superCtor;
225 ctor.prototype = Object.create(superCtor.prototype, {
226 constructor: {
227 value: ctor,
228 enumerable: false,
229 writable: true,
230 configurable: true
231 }
232 });
233 };
234  
235 exports.mixin = function(obj, mixin) {
236 for (var key in mixin) {
237 obj[key] = mixin[key];
238 }
239 return obj;
240 };
241  
242 exports.implement = function(proto, mixin) {
243 exports.mixin(proto, mixin);
244 };
245  
246 });
247  
248 ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) {
249 "use strict";
250  
251 exports.last = function(a) {
252 return a[a.length - 1];
253 };
254  
255 exports.stringReverse = function(string) {
256 return string.split("").reverse().join("");
257 };
258  
259 exports.stringRepeat = function (string, count) {
260 var result = '';
261 while (count > 0) {
262 if (count & 1)
263 result += string;
264  
265 if (count >>= 1)
266 string += string;
267 }
268 return result;
269 };
270  
271 var trimBeginRegexp = /^\s\s*/;
272 var trimEndRegexp = /\s\s*$/;
273  
274 exports.stringTrimLeft = function (string) {
275 return string.replace(trimBeginRegexp, '');
276 };
277  
278 exports.stringTrimRight = function (string) {
279 return string.replace(trimEndRegexp, '');
280 };
281  
282 exports.copyObject = function(obj) {
283 var copy = {};
284 for (var key in obj) {
285 copy[key] = obj[key];
286 }
287 return copy;
288 };
289  
290 exports.copyArray = function(array){
291 var copy = [];
292 for (var i=0, l=array.length; i<l; i++) {
293 if (array[i] && typeof array[i] == "object")
294 copy[i] = this.copyObject(array[i]);
295 else
296 copy[i] = array[i];
297 }
298 return copy;
299 };
300  
301 exports.deepCopy = function deepCopy(obj) {
302 if (typeof obj !== "object" || !obj)
303 return obj;
304 var copy;
305 if (Array.isArray(obj)) {
306 copy = [];
307 for (var key = 0; key < obj.length; key++) {
308 copy[key] = deepCopy(obj[key]);
309 }
310 return copy;
311 }
312 if (Object.prototype.toString.call(obj) !== "[object Object]")
313 return obj;
314  
315 copy = {};
316 for (var key in obj)
317 copy[key] = deepCopy(obj[key]);
318 return copy;
319 };
320  
321 exports.arrayToMap = function(arr) {
322 var map = {};
323 for (var i=0; i<arr.length; i++) {
324 map[arr[i]] = 1;
325 }
326 return map;
327  
328 };
329  
330 exports.createMap = function(props) {
331 var map = Object.create(null);
332 for (var i in props) {
333 map[i] = props[i];
334 }
335 return map;
336 };
337 exports.arrayRemove = function(array, value) {
338 for (var i = 0; i <= array.length; i++) {
339 if (value === array[i]) {
340 array.splice(i, 1);
341 }
342 }
343 };
344  
345 exports.escapeRegExp = function(str) {
346 return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
347 };
348  
349 exports.escapeHTML = function(str) {
350 return str.replace(/&/g, "&#38;").replace(/"/g, "&#34;").replace(/'/g, "&#39;").replace(/g, "&#60;");
351 };
352  
353 exports.getMatchOffsets = function(string, regExp) {
354 var matches = [];
355  
356 string.replace(regExp, function(str) {
357 matches.push({
358 offset: arguments[arguments.length-2],
359 length: str.length
360 });
361 });
362  
363 return matches;
364 };
365 exports.deferredCall = function(fcn) {
366 var timer = null;
367 var callback = function() {
368 timer = null;
369 fcn();
370 };
371  
372 var deferred = function(timeout) {
373 deferred.cancel();
374 timer = setTimeout(callback, timeout || 0);
375 return deferred;
376 };
377  
378 deferred.schedule = deferred;
379  
380 deferred.call = function() {
381 this.cancel();
382 fcn();
383 return deferred;
384 };
385  
386 deferred.cancel = function() {
387 clearTimeout(timer);
388 timer = null;
389 return deferred;
390 };
391  
392 deferred.isPending = function() {
393 return timer;
394 };
395  
396 return deferred;
397 };
398  
399  
400 exports.delayedCall = function(fcn, defaultTimeout) {
401 var timer = null;
402 var callback = function() {
403 timer = null;
404 fcn();
405 };
406  
407 var _self = function(timeout) {
408 if (timer == null)
409 timer = setTimeout(callback, timeout || defaultTimeout);
410 };
411  
412 _self.delay = function(timeout) {
413 timer && clearTimeout(timer);
414 timer = setTimeout(callback, timeout || defaultTimeout);
415 };
416 _self.schedule = _self;
417  
418 _self.call = function() {
419 this.cancel();
420 fcn();
421 };
422  
423 _self.cancel = function() {
424 timer && clearTimeout(timer);
425 timer = null;
426 };
427  
428 _self.isPending = function() {
429 return timer;
430 };
431  
432 return _self;
433 };
434 });
435  
436 ace.define("ace/range",["require","exports","module"], function(require, exports, module) {
437 "use strict";
438 var comparePoints = function(p1, p2) {
439 return p1.row - p2.row || p1.column - p2.column;
440 };
441 var Range = function(startRow, startColumn, endRow, endColumn) {
442 this.start = {
443 row: startRow,
444 column: startColumn
445 };
446  
447 this.end = {
448 row: endRow,
449 column: endColumn
450 };
451 };
452  
453 (function() {
454 this.isEqual = function(range) {
455 return this.start.row === range.start.row &&
456 this.end.row === range.end.row &&
457 this.start.column === range.start.column &&
458 this.end.column === range.end.column;
459 };
460 this.toString = function() {
461 return ("Range: [" + this.start.row + "/" + this.start.column +
462 "] -> [" + this.end.row + "/" + this.end.column + "]");
463 };
464  
465 this.contains = function(row, column) {
466 return this.compare(row, column) == 0;
467 };
468 this.compareRange = function(range) {
469 var cmp,
470 end = range.end,
471 start = range.start;
472  
473 cmp = this.compare(end.row, end.column);
474 if (cmp == 1) {
475 cmp = this.compare(start.row, start.column);
476 if (cmp == 1) {
477 return 2;
478 } else if (cmp == 0) {
479 return 1;
480 } else {
481 return 0;
482 }
483 } else if (cmp == -1) {
484 return -2;
485 } else {
486 cmp = this.compare(start.row, start.column);
487 if (cmp == -1) {
488 return -1;
489 } else if (cmp == 1) {
490 return 42;
491 } else {
492 return 0;
493 }
494 }
495 };
496 this.comparePoint = function(p) {
497 return this.compare(p.row, p.column);
498 };
499 this.containsRange = function(range) {
500 return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
501 };
502 this.intersects = function(range) {
503 var cmp = this.compareRange(range);
504 return (cmp == -1 || cmp == 0 || cmp == 1);
505 };
506 this.isEnd = function(row, column) {
507 return this.end.row == row && this.end.column == column;
508 };
509 this.isStart = function(row, column) {
510 return this.start.row == row && this.start.column == column;
511 };
512 this.setStart = function(row, column) {
513 if (typeof row == "object") {
514 this.start.column = row.column;
515 this.start.row = row.row;
516 } else {
517 this.start.row = row;
518 this.start.column = column;
519 }
520 };
521 this.setEnd = function(row, column) {
522 if (typeof row == "object") {
523 this.end.column = row.column;
524 this.end.row = row.row;
525 } else {
526 this.end.row = row;
527 this.end.column = column;
528 }
529 };
530 this.inside = function(row, column) {
531 if (this.compare(row, column) == 0) {
532 if (this.isEnd(row, column) || this.isStart(row, column)) {
533 return false;
534 } else {
535 return true;
536 }
537 }
538 return false;
539 };
540 this.insideStart = function(row, column) {
541 if (this.compare(row, column) == 0) {
542 if (this.isEnd(row, column)) {
543 return false;
544 } else {
545 return true;
546 }
547 }
548 return false;
549 };
550 this.insideEnd = function(row, column) {
551 if (this.compare(row, column) == 0) {
552 if (this.isStart(row, column)) {
553 return false;
554 } else {
555 return true;
556 }
557 }
558 return false;
559 };
560 this.compare = function(row, column) {
561 if (!this.isMultiLine()) {
562 if (row === this.start.row) {
563 return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);
564 }
565 }
566  
567 if (row < this.start.row)
568 return -1;
569  
570 if (row > this.end.row)
571 return 1;
572  
573 if (this.start.row === row)
574 return column >= this.start.column ? 0 : -1;
575  
576 if (this.end.row === row)
577 return column <= this.end.column ? 0 : 1;
578  
579 return 0;
580 };
581 this.compareStart = function(row, column) {
582 if (this.start.row == row && this.start.column == column) {
583 return -1;
584 } else {
585 return this.compare(row, column);
586 }
587 };
588 this.compareEnd = function(row, column) {
589 if (this.end.row == row && this.end.column == column) {
590 return 1;
591 } else {
592 return this.compare(row, column);
593 }
594 };
595 this.compareInside = function(row, column) {
596 if (this.end.row == row && this.end.column == column) {
597 return 1;
598 } else if (this.start.row == row && this.start.column == column) {
599 return -1;
600 } else {
601 return this.compare(row, column);
602 }
603 };
604 this.clipRows = function(firstRow, lastRow) {
605 if (this.end.row > lastRow)
606 var end = {row: lastRow + 1, column: 0};
607 else if (this.end.row < firstRow)
608 var end = {row: firstRow, column: 0};
609  
610 if (this.start.row > lastRow)
611 var start = {row: lastRow + 1, column: 0};
612 else if (this.start.row < firstRow)
613 var start = {row: firstRow, column: 0};
614  
615 return Range.fromPoints(start || this.start, end || this.end);
616 };
617 this.extend = function(row, column) {
618 var cmp = this.compare(row, column);
619  
620 if (cmp == 0)
621 return this;
622 else if (cmp == -1)
623 var start = {row: row, column: column};
624 else
625 var end = {row: row, column: column};
626  
627 return Range.fromPoints(start || this.start, end || this.end);
628 };
629  
630 this.isEmpty = function() {
631 return (this.start.row === this.end.row && this.start.column === this.end.column);
632 };
633 this.isMultiLine = function() {
634 return (this.start.row !== this.end.row);
635 };
636 this.clone = function() {
637 return Range.fromPoints(this.start, this.end);
638 };
639 this.collapseRows = function() {
640 if (this.end.column == 0)
641 return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)
642 else
643 return new Range(this.start.row, 0, this.end.row, 0)
644 };
645 this.toScreenRange = function(session) {
646 var screenPosStart = session.documentToScreenPosition(this.start);
647 var screenPosEnd = session.documentToScreenPosition(this.end);
648  
649 return new Range(
650 screenPosStart.row, screenPosStart.column,
651 screenPosEnd.row, screenPosEnd.column
652 );
653 };
654 this.moveBy = function(row, column) {
655 this.start.row += row;
656 this.start.column += column;
657 this.end.row += row;
658 this.end.column += column;
659 };
660  
661 }).call(Range.prototype);
662 Range.fromPoints = function(start, end) {
663 return new Range(start.row, start.column, end.row, end.column);
664 };
665 Range.comparePoints = comparePoints;
666  
667 Range.comparePoints = function(p1, p2) {
668 return p1.row - p2.row || p1.column - p2.column;
669 };
670  
671  
672 exports.Range = Range;
673 });
674  
675 ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) {
676 "use strict";
677  
678 function throwDeltaError(delta, errorText){
679 console.log("Invalid Delta:", delta);
680 throw "Invalid Delta: " + errorText;
681 }
682  
683 function positionInDocument(docLines, position) {
684 return position.row >= 0 && position.row < docLines.length &&
685 position.column >= 0 && position.column <= docLines[position.row].length;
686 }
687  
688 function validateDelta(docLines, delta) {
689 if (delta.action != "insert" && delta.action != "remove")
690 throwDeltaError(delta, "delta.action must be 'insert' or 'remove'");
691 if (!(delta.lines instanceof Array))
692 throwDeltaError(delta, "delta.lines must be an Array");
693 if (!delta.start || !delta.end)
694 throwDeltaError(delta, "delta.start/end must be an present");
695 var start = delta.start;
696 if (!positionInDocument(docLines, delta.start))
697 throwDeltaError(delta, "delta.start must be contained in document");
698 var end = delta.end;
699 if (delta.action == "remove" && !positionInDocument(docLines, end))
700 throwDeltaError(delta, "delta.end must contained in document for 'remove' actions");
701 var numRangeRows = end.row - start.row;
702 var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));
703 if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)
704 throwDeltaError(delta, "delta.range must match delta lines");
705 }
706  
707 exports.applyDelta = function(docLines, delta, doNotValidate) {
708  
709 var row = delta.start.row;
710 var startColumn = delta.start.column;
711 var line = docLines[row] || "";
712 switch (delta.action) {
713 case "insert":
714 var lines = delta.lines;
715 if (lines.length === 1) {
716 docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
717 } else {
718 var args = [row, 1].concat(delta.lines);
719 docLines.splice.apply(docLines, args);
720 docLines[row] = line.substring(0, startColumn) + docLines[row];
721 docLines[row + delta.lines.length - 1] += line.substring(startColumn);
722 }
723 break;
724 case "remove":
725 var endColumn = delta.end.column;
726 var endRow = delta.end.row;
727 if (row === endRow) {
728 docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
729 } else {
730 docLines.splice(
731 row, endRow - row + 1,
732 line.substring(0, startColumn) + docLines[endRow].substring(endColumn)
733 );
734 }
735 break;
736 }
737 }
738 });
739  
740 ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
741 "use strict";
742  
743 var EventEmitter = {};
744 var stopPropagation = function() { this.propagationStopped = true; };
745 var preventDefault = function() { this.defaultPrevented = true; };
746  
747 EventEmitter._emit =
748 EventEmitter._dispatchEvent = function(eventName, e) {
749 this._eventRegistry || (this._eventRegistry = {});
750 this._defaultHandlers || (this._defaultHandlers = {});
751  
752 var listeners = this._eventRegistry[eventName] || [];
753 var defaultHandler = this._defaultHandlers[eventName];
754 if (!listeners.length && !defaultHandler)
755 return;
756  
757 if (typeof e != "object" || !e)
758 e = {};
759  
760 if (!e.type)
761 e.type = eventName;
762 if (!e.stopPropagation)
763 e.stopPropagation = stopPropagation;
764 if (!e.preventDefault)
765 e.preventDefault = preventDefault;
766  
767 listeners = listeners.slice();
768 for (var i=0; i<listeners.length; i++) {
769 listeners[i](e, this);
770 if (e.propagationStopped)
771 break;
772 }
773  
774 if (defaultHandler && !e.defaultPrevented)
775 return defaultHandler(e, this);
776 };
777  
778  
779 EventEmitter._signal = function(eventName, e) {
780 var listeners = (this._eventRegistry || {})[eventName];
781 if (!listeners)
782 return;
783 listeners = listeners.slice();
784 for (var i=0; i<listeners.length; i++)
785 listeners[i](e, this);
786 };
787  
788 EventEmitter.once = function(eventName, callback) {
789 var _self = this;
790 callback && this.addEventListener(eventName, function newCallback() {
791 _self.removeEventListener(eventName, newCallback);
792 callback.apply(null, arguments);
793 });
794 };
795  
796  
797 EventEmitter.setDefaultHandler = function(eventName, callback) {
798 var handlers = this._defaultHandlers
799 if (!handlers)
800 handlers = this._defaultHandlers = {_disabled_: {}};
801  
802 if (handlers[eventName]) {
803 var old = handlers[eventName];
804 var disabled = handlers._disabled_[eventName];
805 if (!disabled)
806 handlers._disabled_[eventName] = disabled = [];
807 disabled.push(old);
808 var i = disabled.indexOf(callback);
809 if (i != -1)
810 disabled.splice(i, 1);
811 }
812 handlers[eventName] = callback;
813 };
814 EventEmitter.removeDefaultHandler = function(eventName, callback) {
815 var handlers = this._defaultHandlers
816 if (!handlers)
817 return;
818 var disabled = handlers._disabled_[eventName];
819  
820 if (handlers[eventName] == callback) {
821 var old = handlers[eventName];
822 if (disabled)
823 this.setDefaultHandler(eventName, disabled.pop());
824 } else if (disabled) {
825 var i = disabled.indexOf(callback);
826 if (i != -1)
827 disabled.splice(i, 1);
828 }
829 };
830  
831 EventEmitter.on =
832 EventEmitter.addEventListener = function(eventName, callback, capturing) {
833 this._eventRegistry = this._eventRegistry || {};
834  
835 var listeners = this._eventRegistry[eventName];
836 if (!listeners)
837 listeners = this._eventRegistry[eventName] = [];
838  
839 if (listeners.indexOf(callback) == -1)
840 listeners[capturing ? "unshift" : "push"](callback);
841 return callback;
842 };
843  
844 EventEmitter.off =
845 EventEmitter.removeListener =
846 EventEmitter.removeEventListener = function(eventName, callback) {
847 this._eventRegistry = this._eventRegistry || {};
848  
849 var listeners = this._eventRegistry[eventName];
850 if (!listeners)
851 return;
852  
853 var index = listeners.indexOf(callback);
854 if (index !== -1)
855 listeners.splice(index, 1);
856 };
857  
858 EventEmitter.removeAllListeners = function(eventName) {
859 if (this._eventRegistry) this._eventRegistry[eventName] = [];
860 };
861  
862 exports.EventEmitter = EventEmitter;
863  
864 });
865  
866 ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
867 "use strict";
868  
869 var oop = require("./lib/oop");
870 var EventEmitter = require("./lib/event_emitter").EventEmitter;
871  
872 var Anchor = exports.Anchor = function(doc, row, column) {
873 this.$onChange = this.onChange.bind(this);
874 this.attach(doc);
875  
876 if (typeof column == "undefined")
877 this.setPosition(row.row, row.column);
878 else
879 this.setPosition(row, column);
880 };
881  
882 (function() {
883  
884 oop.implement(this, EventEmitter);
885 this.getPosition = function() {
886 return this.$clipPositionToDocument(this.row, this.column);
887 };
888 this.getDocument = function() {
889 return this.document;
890 };
891 this.$insertRight = false;
892 this.onChange = function(delta) {
893 if (delta.start.row == delta.end.row && delta.start.row != this.row)
894 return;
895  
896 if (delta.start.row > this.row)
897 return;
898  
899 var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);
900 this.setPosition(point.row, point.column, true);
901 };
902  
903 function $pointsInOrder(point1, point2, equalPointsInOrder) {
904 var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;
905 return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);
906 }
907  
908 function $getTransformedPoint(delta, point, moveIfEqual) {
909 var deltaIsInsert = delta.action == "insert";
910 var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);
911 var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);
912 var deltaStart = delta.start;
913 var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.
914 if ($pointsInOrder(point, deltaStart, moveIfEqual)) {
915 return {
916 row: point.row,
917 column: point.column
918 };
919 }
920 if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {
921 return {
922 row: point.row + deltaRowShift,
923 column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)
924 };
925 }
926  
927 return {
928 row: deltaStart.row,
929 column: deltaStart.column
930 };
931 }
932 this.setPosition = function(row, column, noClip) {
933 var pos;
934 if (noClip) {
935 pos = {
936 row: row,
937 column: column
938 };
939 } else {
940 pos = this.$clipPositionToDocument(row, column);
941 }
942  
943 if (this.row == pos.row && this.column == pos.column)
944 return;
945  
946 var old = {
947 row: this.row,
948 column: this.column
949 };
950  
951 this.row = pos.row;
952 this.column = pos.column;
953 this._signal("change", {
954 old: old,
955 value: pos
956 });
957 };
958 this.detach = function() {
959 this.document.removeEventListener("change", this.$onChange);
960 };
961 this.attach = function(doc) {
962 this.document = doc || this.document;
963 this.document.on("change", this.$onChange);
964 };
965 this.$clipPositionToDocument = function(row, column) {
966 var pos = {};
967  
968 if (row >= this.document.getLength()) {
969 pos.row = Math.max(0, this.document.getLength() - 1);
970 pos.column = this.document.getLine(pos.row).length;
971 }
972 else if (row < 0) {
973 pos.row = 0;
974 pos.column = 0;
975 }
976 else {
977 pos.row = row;
978 pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));
979 }
980  
981 if (column < 0)
982 pos.column = 0;
983  
984 return pos;
985 };
986  
987 }).call(Anchor.prototype);
988  
989 });
990  
991 ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) {
992 "use strict";
993  
994 var oop = require("./lib/oop");
995 var applyDelta = require("./apply_delta").applyDelta;
996 var EventEmitter = require("./lib/event_emitter").EventEmitter;
997 var Range = require("./range").Range;
998 var Anchor = require("./anchor").Anchor;
999  
1000 var Document = function(textOrLines) {
1001 this.$lines = [""];
1002 if (textOrLines.length === 0) {
1003 this.$lines = [""];
1004 } else if (Array.isArray(textOrLines)) {
1005 this.insertMergedLines({row: 0, column: 0}, textOrLines);
1006 } else {
1007 this.insert({row: 0, column:0}, textOrLines);
1008 }
1009 };
1010  
1011 (function() {
1012  
1013 oop.implement(this, EventEmitter);
1014 this.setValue = function(text) {
1015 var len = this.getLength() - 1;
1016 this.remove(new Range(0, 0, len, this.getLine(len).length));
1017 this.insert({row: 0, column: 0}, text);
1018 };
1019 this.getValue = function() {
1020 return this.getAllLines().join(this.getNewLineCharacter());
1021 };
1022 this.createAnchor = function(row, column) {
1023 return new Anchor(this, row, column);
1024 };
1025 if ("aaa".split(/a/).length === 0) {
1026 this.$split = function(text) {
1027 return text.replace(/\r\n|\r/g, "\n").split("\n");
1028 };
1029 } else {
1030 this.$split = function(text) {
1031 return text.split(/\r\n|\r|\n/);
1032 };
1033 }
1034  
1035  
1036 this.$detectNewLine = function(text) {
1037 var match = text.match(/^.*?(\r\n|\r|\n)/m);
1038 this.$autoNewLine = match ? match[1] : "\n";
1039 this._signal("changeNewLineMode");
1040 };
1041 this.getNewLineCharacter = function() {
1042 switch (this.$newLineMode) {
1043 case "windows":
1044 return "\r\n";
1045 case "unix":
1046 return "\n";
1047 default:
1048 return this.$autoNewLine || "\n";
1049 }
1050 };
1051  
1052 this.$autoNewLine = "";
1053 this.$newLineMode = "auto";
1054 this.setNewLineMode = function(newLineMode) {
1055 if (this.$newLineMode === newLineMode)
1056 return;
1057  
1058 this.$newLineMode = newLineMode;
1059 this._signal("changeNewLineMode");
1060 };
1061 this.getNewLineMode = function() {
1062 return this.$newLineMode;
1063 };
1064 this.isNewLine = function(text) {
1065 return (text == "\r\n" || text == "\r" || text == "\n");
1066 };
1067 this.getLine = function(row) {
1068 return this.$lines[row] || "";
1069 };
1070 this.getLines = function(firstRow, lastRow) {
1071 return this.$lines.slice(firstRow, lastRow + 1);
1072 };
1073 this.getAllLines = function() {
1074 return this.getLines(0, this.getLength());
1075 };
1076 this.getLength = function() {
1077 return this.$lines.length;
1078 };
1079 this.getTextRange = function(range) {
1080 return this.getLinesForRange(range).join(this.getNewLineCharacter());
1081 };
1082 this.getLinesForRange = function(range) {
1083 var lines;
1084 if (range.start.row === range.end.row) {
1085 lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
1086 } else {
1087 lines = this.getLines(range.start.row, range.end.row);
1088 lines[0] = (lines[0] || "").substring(range.start.column);
1089 var l = lines.length - 1;
1090 if (range.end.row - range.start.row == l)
1091 lines[l] = lines[l].substring(0, range.end.column);
1092 }
1093 return lines;
1094 };
1095 this.insertLines = function(row, lines) {
1096 console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead.");
1097 return this.insertFullLines(row, lines);
1098 };
1099 this.removeLines = function(firstRow, lastRow) {
1100 console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead.");
1101 return this.removeFullLines(firstRow, lastRow);
1102 };
1103 this.insertNewLine = function(position) {
1104 console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.");
1105 return this.insertMergedLines(position, ["", ""]);
1106 };
1107 this.insert = function(position, text) {
1108 if (this.getLength() <= 1)
1109 this.$detectNewLine(text);
1110  
1111 return this.insertMergedLines(position, this.$split(text));
1112 };
1113 this.insertInLine = function(position, text) {
1114 var start = this.clippedPos(position.row, position.column);
1115 var end = this.pos(position.row, position.column + text.length);
1116  
1117 this.applyDelta({
1118 start: start,
1119 end: end,
1120 action: "insert",
1121 lines: [text]
1122 }, true);
1123  
1124 return this.clonePos(end);
1125 };
1126  
1127 this.clippedPos = function(row, column) {
1128 var length = this.getLength();
1129 if (row === undefined) {
1130 row = length;
1131 } else if (row < 0) {
1132 row = 0;
1133 } else if (row >= length) {
1134 row = length - 1;
1135 column = undefined;
1136 }
1137 var line = this.getLine(row);
1138 if (column == undefined)
1139 column = line.length;
1140 column = Math.min(Math.max(column, 0), line.length);
1141 return {row: row, column: column};
1142 };
1143  
1144 this.clonePos = function(pos) {
1145 return {row: pos.row, column: pos.column};
1146 };
1147  
1148 this.pos = function(row, column) {
1149 return {row: row, column: column};
1150 };
1151  
1152 this.$clipPosition = function(position) {
1153 var length = this.getLength();
1154 if (position.row >= length) {
1155 position.row = Math.max(0, length - 1);
1156 position.column = this.getLine(length - 1).length;
1157 } else {
1158 position.row = Math.max(0, position.row);
1159 position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);
1160 }
1161 return position;
1162 };
1163 this.insertFullLines = function(row, lines) {
1164 row = Math.min(Math.max(row, 0), this.getLength());
1165 var column = 0;
1166 if (row < this.getLength()) {
1167 lines = lines.concat([""]);
1168 column = 0;
1169 } else {
1170 lines = [""].concat(lines);
1171 row--;
1172 column = this.$lines[row].length;
1173 }
1174 this.insertMergedLines({row: row, column: column}, lines);
1175 };
1176 this.insertMergedLines = function(position, lines) {
1177 var start = this.clippedPos(position.row, position.column);
1178 var end = {
1179 row: start.row + lines.length - 1,
1180 column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length
1181 };
1182  
1183 this.applyDelta({
1184 start: start,
1185 end: end,
1186 action: "insert",
1187 lines: lines
1188 });
1189  
1190 return this.clonePos(end);
1191 };
1192 this.remove = function(range) {
1193 var start = this.clippedPos(range.start.row, range.start.column);
1194 var end = this.clippedPos(range.end.row, range.end.column);
1195 this.applyDelta({
1196 start: start,
1197 end: end,
1198 action: "remove",
1199 lines: this.getLinesForRange({start: start, end: end})
1200 });
1201 return this.clonePos(start);
1202 };
1203 this.removeInLine = function(row, startColumn, endColumn) {
1204 var start = this.clippedPos(row, startColumn);
1205 var end = this.clippedPos(row, endColumn);
1206  
1207 this.applyDelta({
1208 start: start,
1209 end: end,
1210 action: "remove",
1211 lines: this.getLinesForRange({start: start, end: end})
1212 }, true);
1213  
1214 return this.clonePos(start);
1215 };
1216 this.removeFullLines = function(firstRow, lastRow) {
1217 firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);
1218 lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);
1219 var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;
1220 var deleteLastNewLine = lastRow < this.getLength() - 1;
1221 var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );
1222 var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );
1223 var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );
1224 var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length );
1225 var range = new Range(startRow, startCol, endRow, endCol);
1226 var deletedLines = this.$lines.slice(firstRow, lastRow + 1);
1227  
1228 this.applyDelta({
1229 start: range.start,
1230 end: range.end,
1231 action: "remove",
1232 lines: this.getLinesForRange(range)
1233 });
1234 return deletedLines;
1235 };
1236 this.removeNewLine = function(row) {
1237 if (row < this.getLength() - 1 && row >= 0) {
1238 this.applyDelta({
1239 start: this.pos(row, this.getLine(row).length),
1240 end: this.pos(row + 1, 0),
1241 action: "remove",
1242 lines: ["", ""]
1243 });
1244 }
1245 };
1246 this.replace = function(range, text) {
1247 if (!(range instanceof Range))
1248 range = Range.fromPoints(range.start, range.end);
1249 if (text.length === 0 && range.isEmpty())
1250 return range.start;
1251 if (text == this.getTextRange(range))
1252 return range.end;
1253  
1254 this.remove(range);
1255 var end;
1256 if (text) {
1257 end = this.insert(range.start, text);
1258 }
1259 else {
1260 end = range.start;
1261 }
1262  
1263 return end;
1264 };
1265 this.applyDeltas = function(deltas) {
1266 for (var i=0; i<deltas.length; i++) {
1267 this.applyDelta(deltas[i]);
1268 }
1269 };
1270 this.revertDeltas = function(deltas) {
1271 for (var i=deltas.length-1; i>=0; i--) {
1272 this.revertDelta(deltas[i]);
1273 }
1274 };
1275 this.applyDelta = function(delta, doNotValidate) {
1276 var isInsert = delta.action == "insert";
1277 if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]
1278 : !Range.comparePoints(delta.start, delta.end)) {
1279 return;
1280 }
1281  
1282 if (isInsert && delta.lines.length > 20000)
1283 this.$splitAndapplyLargeDelta(delta, 20000);
1284 applyDelta(this.$lines, delta, doNotValidate);
1285 this._signal("change", delta);
1286 };
1287  
1288 this.$splitAndapplyLargeDelta = function(delta, MAX) {
1289 var lines = delta.lines;
1290 var l = lines.length;
1291 var row = delta.start.row;
1292 var column = delta.start.column;
1293 var from = 0, to = 0;
1294 do {
1295 from = to;
1296 to += MAX - 1;
1297 var chunk = lines.slice(from, to);
1298 if (to > l) {
1299 delta.lines = chunk;
1300 delta.start.row = row + from;
1301 delta.start.column = column;
1302 break;
1303 }
1304 chunk.push("");
1305 this.applyDelta({
1306 start: this.pos(row + from, column),
1307 end: this.pos(row + to, column = 0),
1308 action: delta.action,
1309 lines: chunk
1310 }, true);
1311 } while(true);
1312 };
1313 this.revertDelta = function(delta) {
1314 this.applyDelta({
1315 start: this.clonePos(delta.start),
1316 end: this.clonePos(delta.end),
1317 action: (delta.action == "insert" ? "remove" : "insert"),
1318 lines: delta.lines.slice()
1319 });
1320 };
1321 this.indexToPosition = function(index, startRow) {
1322 var lines = this.$lines || this.getAllLines();
1323 var newlineLength = this.getNewLineCharacter().length;
1324 for (var i = startRow || 0, l = lines.length; i < l; i++) {
1325 index -= lines[i].length + newlineLength;
1326 if (index < 0)
1327 return {row: i, column: index + lines[i].length + newlineLength};
1328 }
1329 return {row: l-1, column: lines[l-1].length};
1330 };
1331 this.positionToIndex = function(pos, startRow) {
1332 var lines = this.$lines || this.getAllLines();
1333 var newlineLength = this.getNewLineCharacter().length;
1334 var index = 0;
1335 var row = Math.min(pos.row, lines.length);
1336 for (var i = startRow || 0; i < row; ++i)
1337 index += lines[i].length + newlineLength;
1338  
1339 return index + pos.column;
1340 };
1341  
1342 }).call(Document.prototype);
1343  
1344 exports.Document = Document;
1345 });
1346  
1347 ace.define("ace/worker/mirror",["require","exports","module","ace/range","ace/document","ace/lib/lang"], function(require, exports, module) {
1348 "use strict";
1349  
1350 var Range = require("../range").Range;
1351 var Document = require("../document").Document;
1352 var lang = require("../lib/lang");
1353  
1354 var Mirror = exports.Mirror = function(sender) {
1355 this.sender = sender;
1356 var doc = this.doc = new Document("");
1357  
1358 var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));
1359  
1360 var _self = this;
1361 sender.on("change", function(e) {
1362 var data = e.data;
1363 if (data[0].start) {
1364 doc.applyDeltas(data);
1365 } else {
1366 for (var i = 0; i < data.length; i += 2) {
1367 if (Array.isArray(data[i+1])) {
1368 var d = {action: "insert", start: data[i], lines: data[i+1]};
1369 } else {
1370 var d = {action: "remove", start: data[i], end: data[i+1]};
1371 }
1372 doc.applyDelta(d, true);
1373 }
1374 }
1375 if (_self.$timeout)
1376 return deferredUpdate.schedule(_self.$timeout);
1377 _self.onUpdate();
1378 });
1379 };
1380  
1381 (function() {
1382  
1383 this.$timeout = 500;
1384  
1385 this.setTimeout = function(timeout) {
1386 this.$timeout = timeout;
1387 };
1388  
1389 this.setValue = function(value) {
1390 this.doc.setValue(value);
1391 this.deferredUpdate.schedule(this.$timeout);
1392 };
1393  
1394 this.getValue = function(callbackId) {
1395 this.sender.callback(this.doc.getValue(), callbackId);
1396 };
1397  
1398 this.onUpdate = function() {
1399 };
1400  
1401 this.isPending = function() {
1402 return this.deferredUpdate.isPending();
1403 };
1404  
1405 }).call(Mirror.prototype);
1406  
1407 });
1408  
1409 ace.define("ace/mode/html/saxparser",["require","exports","module"], function(require, exports, module) {
1410 module.exports = (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({
1411 1:[function(_dereq_,module,exports){
1412 function isScopeMarker(node) {
1413 if (node.namespaceURI === "http://www.w3.org/1999/xhtml") {
1414 return node.localName === "applet"
1415 || node.localName === "caption"
1416 || node.localName === "marquee"
1417 || node.localName === "object"
1418 || node.localName === "table"
1419 || node.localName === "td"
1420 || node.localName === "th";
1421 }
1422 if (node.namespaceURI === "http://www.w3.org/1998/Math/MathML") {
1423 return node.localName === "mi"
1424 || node.localName === "mo"
1425 || node.localName === "mn"
1426 || node.localName === "ms"
1427 || node.localName === "mtext"
1428 || node.localName === "annotation-xml";
1429 }
1430 if (node.namespaceURI === "http://www.w3.org/2000/svg") {
1431 return node.localName === "foreignObject"
1432 || node.localName === "desc"
1433 || node.localName === "title";
1434 }
1435 }
1436  
1437 function isListItemScopeMarker(node) {
1438 return isScopeMarker(node)
1439 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'ol')
1440 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'ul');
1441 }
1442  
1443 function isTableScopeMarker(node) {
1444 return (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'table')
1445 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'html');
1446 }
1447  
1448 function isTableBodyScopeMarker(node) {
1449 return (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'tbody')
1450 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'tfoot')
1451 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'thead')
1452 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'html');
1453 }
1454  
1455 function isTableRowScopeMarker(node) {
1456 return (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'tr')
1457 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'html');
1458 }
1459  
1460 function isButtonScopeMarker(node) {
1461 return isScopeMarker(node)
1462 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'button');
1463 }
1464  
1465 function isSelectScopeMarker(node) {
1466 return !(node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'optgroup')
1467 && !(node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'option');
1468 }
1469 function ElementStack() {
1470 this.elements = [];
1471 this.rootNode = null;
1472 this.headElement = null;
1473 this.bodyElement = null;
1474 }
1475 ElementStack.prototype._inScope = function(localName, isMarker) {
1476 for (var i = this.elements.length - 1; i >= 0; i--) {
1477 var node = this.elements[i];
1478 if (node.localName === localName)
1479 return true;
1480 if (isMarker(node))
1481 return false;
1482 }
1483 };
1484 ElementStack.prototype.push = function(item) {
1485 this.elements.push(item);
1486 };
1487 ElementStack.prototype.pushHtmlElement = function(item) {
1488 this.rootNode = item.node;
1489 this.push(item);
1490 };
1491 ElementStack.prototype.pushHeadElement = function(item) {
1492 this.headElement = item.node;
1493 this.push(item);
1494 };
1495 ElementStack.prototype.pushBodyElement = function(item) {
1496 this.bodyElement = item.node;
1497 this.push(item);
1498 };
1499 ElementStack.prototype.pop = function() {
1500 return this.elements.pop();
1501 };
1502 ElementStack.prototype.remove = function(item) {
1503 this.elements.splice(this.elements.indexOf(item), 1);
1504 };
1505 ElementStack.prototype.popUntilPopped = function(localName) {
1506 var element;
1507 do {
1508 element = this.pop();
1509 } while (element.localName != localName);
1510 };
1511  
1512 ElementStack.prototype.popUntilTableScopeMarker = function() {
1513 while (!isTableScopeMarker(this.top))
1514 this.pop();
1515 };
1516  
1517 ElementStack.prototype.popUntilTableBodyScopeMarker = function() {
1518 while (!isTableBodyScopeMarker(this.top))
1519 this.pop();
1520 };
1521  
1522 ElementStack.prototype.popUntilTableRowScopeMarker = function() {
1523 while (!isTableRowScopeMarker(this.top))
1524 this.pop();
1525 };
1526 ElementStack.prototype.item = function(index) {
1527 return this.elements[index];
1528 };
1529 ElementStack.prototype.contains = function(element) {
1530 return this.elements.indexOf(element) !== -1;
1531 };
1532 ElementStack.prototype.inScope = function(localName) {
1533 return this._inScope(localName, isScopeMarker);
1534 };
1535 ElementStack.prototype.inListItemScope = function(localName) {
1536 return this._inScope(localName, isListItemScopeMarker);
1537 };
1538 ElementStack.prototype.inTableScope = function(localName) {
1539 return this._inScope(localName, isTableScopeMarker);
1540 };
1541 ElementStack.prototype.inButtonScope = function(localName) {
1542 return this._inScope(localName, isButtonScopeMarker);
1543 };
1544 ElementStack.prototype.inSelectScope = function(localName) {
1545 return this._inScope(localName, isSelectScopeMarker);
1546 };
1547 ElementStack.prototype.hasNumberedHeaderElementInScope = function() {
1548 for (var i = this.elements.length - 1; i >= 0; i--) {
1549 var node = this.elements[i];
1550 if (node.isNumberedHeader())
1551 return true;
1552 if (isScopeMarker(node))
1553 return false;
1554 }
1555 };
1556 ElementStack.prototype.furthestBlockForFormattingElement = function(element) {
1557 var furthestBlock = null;
1558 for (var i = this.elements.length - 1; i >= 0; i--) {
1559 var node = this.elements[i];
1560 if (node.node === element)
1561 break;
1562 if (node.isSpecial())
1563 furthestBlock = node;
1564 }
1565 return furthestBlock;
1566 };
1567 ElementStack.prototype.findIndex = function(localName) {
1568 for (var i = this.elements.length - 1; i >= 0; i--) {
1569 if (this.elements[i].localName == localName)
1570 return i;
1571 }
1572 return -1;
1573 };
1574  
1575 ElementStack.prototype.remove_openElements_until = function(callback) {
1576 var finished = false;
1577 var element;
1578 while (!finished) {
1579 element = this.elements.pop();
1580 finished = callback(element);
1581 }
1582 return element;
1583 };
1584  
1585 Object.defineProperty(ElementStack.prototype, 'top', {
1586 get: function() {
1587 return this.elements[this.elements.length - 1];
1588 }
1589 });
1590  
1591 Object.defineProperty(ElementStack.prototype, 'length', {
1592 get: function() {
1593 return this.elements.length;
1594 }
1595 });
1596  
1597 exports.ElementStack = ElementStack;
1598  
1599 },
1600 {}],
1601 2:[function(_dereq_,module,exports){
1602 var entities = _dereq_('html5-entities');
1603 var InputStream = _dereq_('./InputStream').InputStream;
1604  
1605 var namedEntityPrefixes = {};
1606 Object.keys(entities).forEach(function (entityKey) {
1607 for (var i = 0; i < entityKey.length; i++) {
1608 namedEntityPrefixes[entityKey.substring(0, i + 1)] = true;
1609 }
1610 });
1611  
1612 function isAlphaNumeric(c) {
1613 return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
1614 }
1615  
1616 function isHexDigit(c) {
1617 return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
1618 }
1619  
1620 function isDecimalDigit(c) {
1621 return (c >= '0' && c <= '9');
1622 }
1623  
1624 var EntityParser = {};
1625  
1626 EntityParser.consumeEntity = function(buffer, tokenizer, additionalAllowedCharacter) {
1627 var decodedCharacter = '';
1628 var consumedCharacters = '';
1629 var ch = buffer.char();
1630 if (ch === InputStream.EOF)
1631 return false;
1632 consumedCharacters += ch;
1633 if (ch == '\t' || ch == '\n' || ch == '\v' || ch == ' ' || ch == '<' || ch == '&') {
1634 buffer.unget(consumedCharacters);
1635 return false;
1636 }
1637 if (additionalAllowedCharacter === ch) {
1638 buffer.unget(consumedCharacters);
1639 return false;
1640 }
1641 if (ch == '#') {
1642 ch = buffer.shift(1);
1643 if (ch === InputStream.EOF) {
1644 tokenizer._parseError("expected-numeric-entity-but-got-eof");
1645 buffer.unget(consumedCharacters);
1646 return false;
1647 }
1648 consumedCharacters += ch;
1649 var radix = 10;
1650 var isDigit = isDecimalDigit;
1651 if (ch == 'x' || ch == 'X') {
1652 radix = 16;
1653 isDigit = isHexDigit;
1654 ch = buffer.shift(1);
1655 if (ch === InputStream.EOF) {
1656 tokenizer._parseError("expected-numeric-entity-but-got-eof");
1657 buffer.unget(consumedCharacters);
1658 return false;
1659 }
1660 consumedCharacters += ch;
1661 }
1662 if (isDigit(ch)) {
1663 var code = '';
1664 while (ch !== InputStream.EOF && isDigit(ch)) {
1665 code += ch;
1666 ch = buffer.char();
1667 }
1668 code = parseInt(code, radix);
1669 var replacement = this.replaceEntityNumbers(code);
1670 if (replacement) {
1671 tokenizer._parseError("invalid-numeric-entity-replaced");
1672 code = replacement;
1673 }
1674 if (code > 0xFFFF && code <= 0x10FFFF) {
1675 code -= 0x10000;
1676 var first = ((0xffc00 & code) >> 10) + 0xD800;
1677 var second = (0x3ff & code) + 0xDC00;
1678 decodedCharacter = String.fromCharCode(first, second);
1679 } else
1680 decodedCharacter = String.fromCharCode(code);
1681 if (ch !== ';') {
1682 tokenizer._parseError("numeric-entity-without-semicolon");
1683 buffer.unget(ch);
1684 }
1685 return decodedCharacter;
1686 }
1687 buffer.unget(consumedCharacters);
1688 tokenizer._parseError("expected-numeric-entity");
1689 return false;
1690 }
1691 if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
1692 var mostRecentMatch = '';
1693 while (namedEntityPrefixes[consumedCharacters]) {
1694 if (entities[consumedCharacters]) {
1695 mostRecentMatch = consumedCharacters;
1696 }
1697 if (ch == ';')
1698 break;
1699 ch = buffer.char();
1700 if (ch === InputStream.EOF)
1701 break;
1702 consumedCharacters += ch;
1703 }
1704 if (!mostRecentMatch) {
1705 tokenizer._parseError("expected-named-entity");
1706 buffer.unget(consumedCharacters);
1707 return false;
1708 }
1709 decodedCharacter = entities[mostRecentMatch];
1710 if (ch === ';' || !additionalAllowedCharacter || !(isAlphaNumeric(ch) || ch === '=')) {
1711 if (consumedCharacters.length > mostRecentMatch.length) {
1712 buffer.unget(consumedCharacters.substring(mostRecentMatch.length));
1713 }
1714 if (ch !== ';') {
1715 tokenizer._parseError("named-entity-without-semicolon");
1716 }
1717 return decodedCharacter;
1718 }
1719 buffer.unget(consumedCharacters);
1720 return false;
1721 }
1722 };
1723  
1724 EntityParser.replaceEntityNumbers = function(c) {
1725 switch(c) {
1726 case 0x00: return 0xFFFD; // REPLACEMENT CHARACTER
1727 case 0x13: return 0x0010; // Carriage return
1728 case 0x80: return 0x20AC; // EURO SIGN
1729 case 0x81: return 0x0081; // <control>
1730 case 0x82: return 0x201A; // SINGLE LOW-9 QUOTATION MARK
1731 case 0x83: return 0x0192; // LATIN SMALL LETTER F WITH HOOK
1732 case 0x84: return 0x201E; // DOUBLE LOW-9 QUOTATION MARK
1733 case 0x85: return 0x2026; // HORIZONTAL ELLIPSIS
1734 case 0x86: return 0x2020; // DAGGER
1735 case 0x87: return 0x2021; // DOUBLE DAGGER
1736 case 0x88: return 0x02C6; // MODIFIER LETTER CIRCUMFLEX ACCENT
1737 case 0x89: return 0x2030; // PER MILLE SIGN
1738 case 0x8A: return 0x0160; // LATIN CAPITAL LETTER S WITH CARON
1739 case 0x8B: return 0x2039; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
1740 case 0x8C: return 0x0152; // LATIN CAPITAL LIGATURE OE
1741 case 0x8D: return 0x008D; // <control>
1742 case 0x8E: return 0x017D; // LATIN CAPITAL LETTER Z WITH CARON
1743 case 0x8F: return 0x008F; // <control>
1744 case 0x90: return 0x0090; // <control>
1745 case 0x91: return 0x2018; // LEFT SINGLE QUOTATION MARK
1746 case 0x92: return 0x2019; // RIGHT SINGLE QUOTATION MARK
1747 case 0x93: return 0x201C; // LEFT DOUBLE QUOTATION MARK
1748 case 0x94: return 0x201D; // RIGHT DOUBLE QUOTATION MARK
1749 case 0x95: return 0x2022; // BULLET
1750 case 0x96: return 0x2013; // EN DASH
1751 case 0x97: return 0x2014; // EM DASH
1752 case 0x98: return 0x02DC; // SMALL TILDE
1753 case 0x99: return 0x2122; // TRADE MARK SIGN
1754 case 0x9A: return 0x0161; // LATIN SMALL LETTER S WITH CARON
1755 case 0x9B: return 0x203A; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
1756 case 0x9C: return 0x0153; // LATIN SMALL LIGATURE OE
1757 case 0x9D: return 0x009D; // <control>
1758 case 0x9E: return 0x017E; // LATIN SMALL LETTER Z WITH CARON
1759 case 0x9F: return 0x0178; // LATIN CAPITAL LETTER Y WITH DIAERESIS
1760 default:
1761 if ((c >= 0xD800 && c <= 0xDFFF) || c > 0x10FFFF) {
1762 return 0xFFFD;
1763 } else if ((c >= 0x0001 && c <= 0x0008) || (c >= 0x000E && c <= 0x001F) ||
1764 (c >= 0x007F && c <= 0x009F) || (c >= 0xFDD0 && c <= 0xFDEF) ||
1765 c == 0x000B || c == 0xFFFE || c == 0x1FFFE || c == 0x2FFFFE ||
1766 c == 0x2FFFF || c == 0x3FFFE || c == 0x3FFFF || c == 0x4FFFE ||
1767 c == 0x4FFFF || c == 0x5FFFE || c == 0x5FFFF || c == 0x6FFFE ||
1768 c == 0x6FFFF || c == 0x7FFFE || c == 0x7FFFF || c == 0x8FFFE ||
1769 c == 0x8FFFF || c == 0x9FFFE || c == 0x9FFFF || c == 0xAFFFE ||
1770 c == 0xAFFFF || c == 0xBFFFE || c == 0xBFFFF || c == 0xCFFFE ||
1771 c == 0xCFFFF || c == 0xDFFFE || c == 0xDFFFF || c == 0xEFFFE ||
1772 c == 0xEFFFF || c == 0xFFFFE || c == 0xFFFFF || c == 0x10FFFE ||
1773 c == 0x10FFFF) {
1774 return c;
1775 }
1776 }
1777 };
1778  
1779 exports.EntityParser = EntityParser;
1780  
1781 },
1782 {"./InputStream":3,"html5-entities":12}],
1783 3:[function(_dereq_,module,exports){
1784 function InputStream() {
1785 this.data = '';
1786 this.start = 0;
1787 this.committed = 0;
1788 this.eof = false;
1789 this.lastLocation = {line: 0, column: 0};
1790 }
1791  
1792 InputStream.EOF = -1;
1793  
1794 InputStream.DRAIN = -2;
1795  
1796 InputStream.prototype = {
1797 slice: function() {
1798 if(this.start >= this.data.length) {
1799 if(!this.eof) throw InputStream.DRAIN;
1800 return InputStream.EOF;
1801 }
1802 return this.data.slice(this.start, this.data.length);
1803 },
1804 char: function() {
1805 if(!this.eof && this.start >= this.data.length - 1) throw InputStream.DRAIN;
1806 if(this.start >= this.data.length) {
1807 return InputStream.EOF;
1808 }
1809 var ch = this.data[this.start++];
1810 if (ch === '\r')
1811 ch = '\n';
1812 return ch;
1813 },
1814 advance: function(amount) {
1815 this.start += amount;
1816 if(this.start >= this.data.length) {
1817 if(!this.eof) throw InputStream.DRAIN;
1818 return InputStream.EOF;
1819 } else {
1820 if(this.committed > this.data.length / 2) {
1821 this.lastLocation = this.location();
1822 this.data = this.data.slice(this.committed);
1823 this.start = this.start - this.committed;
1824 this.committed = 0;
1825 }
1826 }
1827 },
1828 matchWhile: function(re) {
1829 if(this.eof && this.start >= this.data.length ) return '';
1830 var r = new RegExp("^"+re+"+");
1831 var m = r.exec(this.slice());
1832 if(m) {
1833 if(!this.eof && m[0].length == this.data.length - this.start) throw InputStream.DRAIN;
1834 this.advance(m[0].length);
1835 return m[0];
1836 } else {
1837 return '';
1838 }
1839 },
1840 matchUntil: function(re) {
1841 var m, s;
1842 s = this.slice();
1843 if(s === InputStream.EOF) {
1844 return '';
1845 } else if(m = new RegExp(re + (this.eof ? "|$" : "")).exec(s)) {
1846 var t = this.data.slice(this.start, this.start + m.index);
1847 this.advance(m.index);
1848 return t.replace(/\r/g, '\n').replace(/\n{2,}/g, '\n');
1849 } else {
1850 throw InputStream.DRAIN;
1851 }
1852 },
1853 append: function(data) {
1854 this.data += data;
1855 },
1856 shift: function(n) {
1857 if(!this.eof && this.start + n >= this.data.length) throw InputStream.DRAIN;
1858 if(this.eof && this.start >= this.data.length) return InputStream.EOF;
1859 var d = this.data.slice(this.start, this.start + n).toString();
1860 this.advance(Math.min(n, this.data.length - this.start));
1861 return d;
1862 },
1863 peek: function(n) {
1864 if(!this.eof && this.start + n >= this.data.length) throw InputStream.DRAIN;
1865 if(this.eof && this.start >= this.data.length) return InputStream.EOF;
1866 return this.data.slice(this.start, Math.min(this.start + n, this.data.length)).toString();
1867 },
1868 length: function() {
1869 return this.data.length - this.start - 1;
1870 },
1871 unget: function(d) {
1872 if(d === InputStream.EOF) return;
1873 this.start -= (d.length);
1874 },
1875 undo: function() {
1876 this.start = this.committed;
1877 },
1878 commit: function() {
1879 this.committed = this.start;
1880 },
1881 location: function() {
1882 var lastLine = this.lastLocation.line;
1883 var lastColumn = this.lastLocation.column;
1884 var read = this.data.slice(0, this.committed);
1885 var newlines = read.match(/\n/g);
1886 var line = newlines ? lastLine + newlines.length : lastLine;
1887 var column = newlines ? read.length - read.lastIndexOf('\n') - 1 : lastColumn + read.length;
1888 return {line: line, column: column};
1889 }
1890 };
1891  
1892 exports.InputStream = InputStream;
1893  
1894 },
1895 {}],
1896 4:[function(_dereq_,module,exports){
1897 var SpecialElements = {
1898 "http://www.w3.org/1999/xhtml": [
1899 'address',
1900 'applet',
1901 'area',
1902 'article',
1903 'aside',
1904 'base',
1905 'basefont',
1906 'bgsound',
1907 'blockquote',
1908 'body',
1909 'br',
1910 'button',
1911 'caption',
1912 'center',
1913 'col',
1914 'colgroup',
1915 'dd',
1916 'details',
1917 'dir',
1918 'div',
1919 'dl',
1920 'dt',
1921 'embed',
1922 'fieldset',
1923 'figcaption',
1924 'figure',
1925 'footer',
1926 'form',
1927 'frame',
1928 'frameset',
1929 'h1',
1930 'h2',
1931 'h3',
1932 'h4',
1933 'h5',
1934 'h6',
1935 'head',
1936 'header',
1937 'hgroup',
1938 'hr',
1939 'html',
1940 'iframe',
1941 'img',
1942 'input',
1943 'isindex',
1944 'li',
1945 'link',
1946 'listing',
1947 'main',
1948 'marquee',
1949 'menu',
1950 'menuitem',
1951 'meta',
1952 'nav',
1953 'noembed',
1954 'noframes',
1955 'noscript',
1956 'object',
1957 'ol',
1958 'p',
1959 'param',
1960 'plaintext',
1961 'pre',
1962 'script',
1963 'section',
1964 'select',
1965 'source',
1966 'style',
1967 'summary',
1968 'table',
1969 'tbody',
1970 'td',
1971 'textarea',
1972 'tfoot',
1973 'th',
1974 'thead',
1975 'title',
1976 'tr',
1977 'track',
1978 'ul',
1979 'wbr',
1980 'xmp'
1981 ],
1982 "http://www.w3.org/1998/Math/MathML": [
1983 'mi',
1984 'mo',
1985 'mn',
1986 'ms',
1987 'mtext',
1988 'annotation-xml'
1989 ],
1990 "http://www.w3.org/2000/svg": [
1991 'foreignObject',
1992 'desc',
1993 'title'
1994 ]
1995 };
1996  
1997  
1998 function StackItem(namespaceURI, localName, attributes, node) {
1999 this.localName = localName;
2000 this.namespaceURI = namespaceURI;
2001 this.attributes = attributes;
2002 this.node = node;
2003 }
2004 StackItem.prototype.isSpecial = function() {
2005 return this.namespaceURI in SpecialElements &&
2006 SpecialElements[this.namespaceURI].indexOf(this.localName) > -1;
2007 };
2008  
2009 StackItem.prototype.isFosterParenting = function() {
2010 if (this.namespaceURI === "http://www.w3.org/1999/xhtml") {
2011 return this.localName === 'table' ||
2012 this.localName === 'tbody' ||
2013 this.localName === 'tfoot' ||
2014 this.localName === 'thead' ||
2015 this.localName === 'tr';
2016 }
2017 return false;
2018 };
2019  
2020 StackItem.prototype.isNumberedHeader = function() {
2021 if (this.namespaceURI === "http://www.w3.org/1999/xhtml") {
2022 return this.localName === 'h1' ||
2023 this.localName === 'h2' ||
2024 this.localName === 'h3' ||
2025 this.localName === 'h4' ||
2026 this.localName === 'h5' ||
2027 this.localName === 'h6';
2028 }
2029 return false;
2030 };
2031  
2032 StackItem.prototype.isForeign = function() {
2033 return this.namespaceURI != "http://www.w3.org/1999/xhtml";
2034 };
2035  
2036 function getAttribute(item, name) {
2037 for (var i = 0; i < item.attributes.length; i++) {
2038 if (item.attributes[i].nodeName == name)
2039 return item.attributes[i].nodeValue;
2040 }
2041 return null;
2042 }
2043  
2044 StackItem.prototype.isHtmlIntegrationPoint = function() {
2045 if (this.namespaceURI === "http://www.w3.org/1998/Math/MathML") {
2046 if (this.localName !== "annotation-xml")
2047 return false;
2048 var encoding = getAttribute(this, 'encoding');
2049 if (!encoding)
2050 return false;
2051 encoding = encoding.toLowerCase();
2052 return encoding === "text/html" || encoding === "application/xhtml+xml";
2053 }
2054 if (this.namespaceURI === "http://www.w3.org/2000/svg") {
2055 return this.localName === "foreignObject"
2056 || this.localName === "desc"
2057 || this.localName === "title";
2058 }
2059 return false;
2060 };
2061  
2062 StackItem.prototype.isMathMLTextIntegrationPoint = function() {
2063 if (this.namespaceURI === "http://www.w3.org/1998/Math/MathML") {
2064 return this.localName === "mi"
2065 || this.localName === "mo"
2066 || this.localName === "mn"
2067 || this.localName === "ms"
2068 || this.localName === "mtext";
2069 }
2070 return false;
2071 };
2072  
2073 exports.StackItem = StackItem;
2074  
2075 },
2076 {}],
2077 5:[function(_dereq_,module,exports){
2078 var InputStream = _dereq_('./InputStream').InputStream;
2079 var EntityParser = _dereq_('./EntityParser').EntityParser;
2080  
2081 function isWhitespace(c){
2082 return c === " " || c === "\n" || c === "\t" || c === "\r" || c === "\f";
2083 }
2084  
2085 function isAlpha(c) {
2086 return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
2087 }
2088 function Tokenizer(tokenHandler) {
2089 this._tokenHandler = tokenHandler;
2090 this._state = Tokenizer.DATA;
2091 this._inputStream = new InputStream();
2092 this._currentToken = null;
2093 this._temporaryBuffer = '';
2094 this._additionalAllowedCharacter = '';
2095 }
2096  
2097 Tokenizer.prototype._parseError = function(code, args) {
2098 this._tokenHandler.parseError(code, args);
2099 };
2100  
2101 Tokenizer.prototype._emitToken = function(token) {
2102 if (token.type === 'StartTag') {
2103 for (var i = 1; i < token.data.length; i++) {
2104 if (!token.data[i].nodeName)
2105 token.data.splice(i--, 1);
2106 }
2107 } else if (token.type === 'EndTag') {
2108 if (token.selfClosing) {
2109 this._parseError('self-closing-flag-on-end-tag');
2110 }
2111 if (token.data.length !== 0) {
2112 this._parseError('attributes-in-end-tag');
2113 }
2114 }
2115 this._tokenHandler.processToken(token);
2116 if (token.type === 'StartTag' && token.selfClosing && !this._tokenHandler.isSelfClosingFlagAcknowledged()) {
2117 this._parseError('non-void-element-with-trailing-solidus', {name: token.name});
2118 }
2119 };
2120  
2121 Tokenizer.prototype._emitCurrentToken = function() {
2122 this._state = Tokenizer.DATA;
2123 this._emitToken(this._currentToken);
2124 };
2125  
2126 Tokenizer.prototype._currentAttribute = function() {
2127 return this._currentToken.data[this._currentToken.data.length - 1];
2128 };
2129  
2130 Tokenizer.prototype.setState = function(state) {
2131 this._state = state;
2132 };
2133  
2134 Tokenizer.prototype.tokenize = function(source) {
2135 Tokenizer.DATA = data_state;
2136 Tokenizer.RCDATA = rcdata_state;
2137 Tokenizer.RAWTEXT = rawtext_state;
2138 Tokenizer.SCRIPT_DATA = script_data_state;
2139 Tokenizer.PLAINTEXT = plaintext_state;
2140  
2141  
2142 this._state = Tokenizer.DATA;
2143  
2144 this._inputStream.append(source);
2145  
2146 this._tokenHandler.startTokenization(this);
2147  
2148 this._inputStream.eof = true;
2149  
2150 var tokenizer = this;
2151  
2152 while (this._state.call(this, this._inputStream));
2153  
2154  
2155 function data_state(buffer) {
2156 var data = buffer.char();
2157 if (data === InputStream.EOF) {
2158 tokenizer._emitToken({type: 'EOF', data: null});
2159 return false;
2160 } else if (data === '&') {
2161 tokenizer.setState(character_reference_in_data_state);
2162 } else if (data === '<') {
2163 tokenizer.setState(tag_open_state);
2164 } else if (data === '\u0000') {
2165 tokenizer._emitToken({type: 'Characters', data: data});
2166 buffer.commit();
2167 } else {
2168 var chars = buffer.matchUntil("&|<|\u0000");
2169 tokenizer._emitToken({type: 'Characters', data: data + chars});
2170 buffer.commit();
2171 }
2172 return true;
2173 }
2174  
2175 function character_reference_in_data_state(buffer) {
2176 var character = EntityParser.consumeEntity(buffer, tokenizer);
2177 tokenizer.setState(data_state);
2178 tokenizer._emitToken({type: 'Characters', data: character || '&'});
2179 return true;
2180 }
2181  
2182 function rcdata_state(buffer) {
2183 var data = buffer.char();
2184 if (data === InputStream.EOF) {
2185 tokenizer._emitToken({type: 'EOF', data: null});
2186 return false;
2187 } else if (data === '&') {
2188 tokenizer.setState(character_reference_in_rcdata_state);
2189 } else if (data === '<') {
2190 tokenizer.setState(rcdata_less_than_sign_state);
2191 } else if (data === "\u0000") {
2192 tokenizer._parseError("invalid-codepoint");
2193 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2194 buffer.commit();
2195 } else {
2196 var chars = buffer.matchUntil("&|<|\u0000");
2197 tokenizer._emitToken({type: 'Characters', data: data + chars});
2198 buffer.commit();
2199 }
2200 return true;
2201 }
2202  
2203 function character_reference_in_rcdata_state(buffer) {
2204 var character = EntityParser.consumeEntity(buffer, tokenizer);
2205 tokenizer.setState(rcdata_state);
2206 tokenizer._emitToken({type: 'Characters', data: character || '&'});
2207 return true;
2208 }
2209  
2210 function rawtext_state(buffer) {
2211 var data = buffer.char();
2212 if (data === InputStream.EOF) {
2213 tokenizer._emitToken({type: 'EOF', data: null});
2214 return false;
2215 } else if (data === '<') {
2216 tokenizer.setState(rawtext_less_than_sign_state);
2217 } else if (data === "\u0000") {
2218 tokenizer._parseError("invalid-codepoint");
2219 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2220 buffer.commit();
2221 } else {
2222 var chars = buffer.matchUntil("<|\u0000");
2223 tokenizer._emitToken({type: 'Characters', data: data + chars});
2224 }
2225 return true;
2226 }
2227  
2228 function plaintext_state(buffer) {
2229 var data = buffer.char();
2230 if (data === InputStream.EOF) {
2231 tokenizer._emitToken({type: 'EOF', data: null});
2232 return false;
2233 } else if (data === "\u0000") {
2234 tokenizer._parseError("invalid-codepoint");
2235 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2236 buffer.commit();
2237 } else {
2238 var chars = buffer.matchUntil("\u0000");
2239 tokenizer._emitToken({type: 'Characters', data: data + chars});
2240 }
2241 return true;
2242 }
2243  
2244  
2245 function script_data_state(buffer) {
2246 var data = buffer.char();
2247 if (data === InputStream.EOF) {
2248 tokenizer._emitToken({type: 'EOF', data: null});
2249 return false;
2250 } else if (data === '<') {
2251 tokenizer.setState(script_data_less_than_sign_state);
2252 } else if (data === '\u0000') {
2253 tokenizer._parseError("invalid-codepoint");
2254 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2255 buffer.commit();
2256 } else {
2257 var chars = buffer.matchUntil("<|\u0000");
2258 tokenizer._emitToken({type: 'Characters', data: data + chars});
2259 }
2260 return true;
2261 }
2262  
2263 function rcdata_less_than_sign_state(buffer) {
2264 var data = buffer.char();
2265 if (data === "/") {
2266 this._temporaryBuffer = '';
2267 tokenizer.setState(rcdata_end_tag_open_state);
2268 } else {
2269 tokenizer._emitToken({type: 'Characters', data: '<'});
2270 buffer.unget(data);
2271 tokenizer.setState(rcdata_state);
2272 }
2273 return true;
2274 }
2275  
2276 function rcdata_end_tag_open_state(buffer) {
2277 var data = buffer.char();
2278 if (isAlpha(data)) {
2279 this._temporaryBuffer += data;
2280 tokenizer.setState(rcdata_end_tag_name_state);
2281 } else {
2282 tokenizer._emitToken({type: 'Characters', data: '</'});
2283 buffer.unget(data);
2284 tokenizer.setState(rcdata_state);
2285 }
2286 return true;
2287 }
2288  
2289 function rcdata_end_tag_name_state(buffer) {
2290 var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
2291 var data = buffer.char();
2292 if (isWhitespace(data) && appropriate) {
2293 tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
2294 tokenizer.setState(before_attribute_name_state);
2295 } else if (data === '/' && appropriate) {
2296 tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
2297 tokenizer.setState(self_closing_tag_state);
2298 } else if (data === '>' && appropriate) {
2299 tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
2300 tokenizer._emitCurrentToken();
2301 tokenizer.setState(data_state);
2302 } else if (isAlpha(data)) {
2303 this._temporaryBuffer += data;
2304 buffer.commit();
2305 } else {
2306 tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
2307 buffer.unget(data);
2308 tokenizer.setState(rcdata_state);
2309 }
2310 return true;
2311 }
2312  
2313 function rawtext_less_than_sign_state(buffer) {
2314 var data = buffer.char();
2315 if (data === "/") {
2316 this._temporaryBuffer = '';
2317 tokenizer.setState(rawtext_end_tag_open_state);
2318 } else {
2319 tokenizer._emitToken({type: 'Characters', data: '<'});
2320 buffer.unget(data);
2321 tokenizer.setState(rawtext_state);
2322 }
2323 return true;
2324 }
2325  
2326 function rawtext_end_tag_open_state(buffer) {
2327 var data = buffer.char();
2328 if (isAlpha(data)) {
2329 this._temporaryBuffer += data;
2330 tokenizer.setState(rawtext_end_tag_name_state);
2331 } else {
2332 tokenizer._emitToken({type: 'Characters', data: '</'});
2333 buffer.unget(data);
2334 tokenizer.setState(rawtext_state);
2335 }
2336 return true;
2337 }
2338  
2339 function rawtext_end_tag_name_state(buffer) {
2340 var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
2341 var data = buffer.char();
2342 if (isWhitespace(data) && appropriate) {
2343 tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
2344 tokenizer.setState(before_attribute_name_state);
2345 } else if (data === '/' && appropriate) {
2346 tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
2347 tokenizer.setState(self_closing_tag_state);
2348 } else if (data === '>' && appropriate) {
2349 tokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};
2350 tokenizer._emitCurrentToken();
2351 tokenizer.setState(data_state);
2352 } else if (isAlpha(data)) {
2353 this._temporaryBuffer += data;
2354 buffer.commit();
2355 } else {
2356 tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
2357 buffer.unget(data);
2358 tokenizer.setState(rawtext_state);
2359 }
2360 return true;
2361 }
2362  
2363 function script_data_less_than_sign_state(buffer) {
2364 var data = buffer.char();
2365 if (data === "/") {
2366 this._temporaryBuffer = '';
2367 tokenizer.setState(script_data_end_tag_open_state);
2368 } else if (data === '!') {
2369 tokenizer._emitToken({type: 'Characters', data: '<!'});
2370 tokenizer.setState(script_data_escape_start_state);
2371 } else {
2372 tokenizer._emitToken({type: 'Characters', data: '<'});
2373 buffer.unget(data);
2374 tokenizer.setState(script_data_state);
2375 }
2376 return true;
2377 }
2378  
2379 function script_data_end_tag_open_state(buffer) {
2380 var data = buffer.char();
2381 if (isAlpha(data)) {
2382 this._temporaryBuffer += data;
2383 tokenizer.setState(script_data_end_tag_name_state);
2384 } else {
2385 tokenizer._emitToken({type: 'Characters', data: '</'});
2386 buffer.unget(data);
2387 tokenizer.setState(script_data_state);
2388 }
2389 return true;
2390 }
2391  
2392 function script_data_end_tag_name_state(buffer) {
2393 var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
2394 var data = buffer.char();
2395 if (isWhitespace(data) && appropriate) {
2396 tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
2397 tokenizer.setState(before_attribute_name_state);
2398 } else if (data === '/' && appropriate) {
2399 tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
2400 tokenizer.setState(self_closing_tag_state);
2401 } else if (data === '>' && appropriate) {
2402 tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
2403 tokenizer._emitCurrentToken();
2404 } else if (isAlpha(data)) {
2405 this._temporaryBuffer += data;
2406 buffer.commit();
2407 } else {
2408 tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
2409 buffer.unget(data);
2410 tokenizer.setState(script_data_state);
2411 }
2412 return true;
2413 }
2414  
2415 function script_data_escape_start_state(buffer) {
2416 var data = buffer.char();
2417 if (data === '-') {
2418 tokenizer._emitToken({type: 'Characters', data: '-'});
2419 tokenizer.setState(script_data_escape_start_dash_state);
2420 } else {
2421 buffer.unget(data);
2422 tokenizer.setState(script_data_state);
2423 }
2424 return true;
2425 }
2426  
2427 function script_data_escape_start_dash_state(buffer) {
2428 var data = buffer.char();
2429 if (data === '-') {
2430 tokenizer._emitToken({type: 'Characters', data: '-'});
2431 tokenizer.setState(script_data_escaped_dash_dash_state);
2432 } else {
2433 buffer.unget(data);
2434 tokenizer.setState(script_data_state);
2435 }
2436 return true;
2437 }
2438  
2439 function script_data_escaped_state(buffer) {
2440 var data = buffer.char();
2441 if (data === InputStream.EOF) {
2442 buffer.unget(data);
2443 tokenizer.setState(data_state);
2444 } else if (data === '-') {
2445 tokenizer._emitToken({type: 'Characters', data: '-'});
2446 tokenizer.setState(script_data_escaped_dash_state);
2447 } else if (data === '<') {
2448 tokenizer.setState(script_data_escaped_less_then_sign_state);
2449 } else if (data === '\u0000') {
2450 tokenizer._parseError("invalid-codepoint");
2451 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2452 buffer.commit();
2453 } else {
2454 var chars = buffer.matchUntil('<|-|\u0000');
2455 tokenizer._emitToken({type: 'Characters', data: data + chars});
2456 }
2457 return true;
2458 }
2459  
2460 function script_data_escaped_dash_state(buffer) {
2461 var data = buffer.char();
2462 if (data === InputStream.EOF) {
2463 buffer.unget(data);
2464 tokenizer.setState(data_state);
2465 } else if (data === '-') {
2466 tokenizer._emitToken({type: 'Characters', data: '-'});
2467 tokenizer.setState(script_data_escaped_dash_dash_state);
2468 } else if (data === '<') {
2469 tokenizer.setState(script_data_escaped_less_then_sign_state);
2470 } else if (data === '\u0000') {
2471 tokenizer._parseError("invalid-codepoint");
2472 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2473 tokenizer.setState(script_data_escaped_state);
2474 } else {
2475 tokenizer._emitToken({type: 'Characters', data: data});
2476 tokenizer.setState(script_data_escaped_state);
2477 }
2478 return true;
2479 }
2480  
2481 function script_data_escaped_dash_dash_state(buffer) {
2482 var data = buffer.char();
2483 if (data === InputStream.EOF) {
2484 tokenizer._parseError('eof-in-script');
2485 buffer.unget(data);
2486 tokenizer.setState(data_state);
2487 } else if (data === '<') {
2488 tokenizer.setState(script_data_escaped_less_then_sign_state);
2489 } else if (data === '>') {
2490 tokenizer._emitToken({type: 'Characters', data: '>'});
2491 tokenizer.setState(script_data_state);
2492 } else if (data === '\u0000') {
2493 tokenizer._parseError("invalid-codepoint");
2494 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2495 tokenizer.setState(script_data_escaped_state);
2496 } else {
2497 tokenizer._emitToken({type: 'Characters', data: data});
2498 tokenizer.setState(script_data_escaped_state);
2499 }
2500 return true;
2501 }
2502  
2503 function script_data_escaped_less_then_sign_state(buffer) {
2504 var data = buffer.char();
2505 if (data === '/') {
2506 this._temporaryBuffer = '';
2507 tokenizer.setState(script_data_escaped_end_tag_open_state);
2508 } else if (isAlpha(data)) {
2509 tokenizer._emitToken({type: 'Characters', data: '<' + data});
2510 this._temporaryBuffer = data;
2511 tokenizer.setState(script_data_double_escape_start_state);
2512 } else {
2513 tokenizer._emitToken({type: 'Characters', data: '<'});
2514 buffer.unget(data);
2515 tokenizer.setState(script_data_escaped_state);
2516 }
2517 return true;
2518 }
2519  
2520 function script_data_escaped_end_tag_open_state(buffer) {
2521 var data = buffer.char();
2522 if (isAlpha(data)) {
2523 this._temporaryBuffer = data;
2524 tokenizer.setState(script_data_escaped_end_tag_name_state);
2525 } else {
2526 tokenizer._emitToken({type: 'Characters', data: '</'});
2527 buffer.unget(data);
2528 tokenizer.setState(script_data_escaped_state);
2529 }
2530 return true;
2531 }
2532  
2533 function script_data_escaped_end_tag_name_state(buffer) {
2534 var appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());
2535 var data = buffer.char();
2536 if (isWhitespace(data) && appropriate) {
2537 tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
2538 tokenizer.setState(before_attribute_name_state);
2539 } else if (data === '/' && appropriate) {
2540 tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
2541 tokenizer.setState(self_closing_tag_state);
2542 } else if (data === '>' && appropriate) {
2543 tokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};
2544 tokenizer.setState(data_state);
2545 tokenizer._emitCurrentToken();
2546 } else if (isAlpha(data)) {
2547 this._temporaryBuffer += data;
2548 buffer.commit();
2549 } else {
2550 tokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});
2551 buffer.unget(data);
2552 tokenizer.setState(script_data_escaped_state);
2553 }
2554 return true;
2555 }
2556  
2557 function script_data_double_escape_start_state(buffer) {
2558 var data = buffer.char();
2559 if (isWhitespace(data) || data === '/' || data === '>') {
2560 tokenizer._emitToken({type: 'Characters', data: data});
2561 if (this._temporaryBuffer.toLowerCase() === 'script')
2562 tokenizer.setState(script_data_double_escaped_state);
2563 else
2564 tokenizer.setState(script_data_escaped_state);
2565 } else if (isAlpha(data)) {
2566 tokenizer._emitToken({type: 'Characters', data: data});
2567 this._temporaryBuffer += data;
2568 buffer.commit();
2569 } else {
2570 buffer.unget(data);
2571 tokenizer.setState(script_data_escaped_state);
2572 }
2573 return true;
2574 }
2575  
2576 function script_data_double_escaped_state(buffer) {
2577 var data = buffer.char();
2578 if (data === InputStream.EOF) {
2579 tokenizer._parseError('eof-in-script');
2580 buffer.unget(data);
2581 tokenizer.setState(data_state);
2582 } else if (data === '-') {
2583 tokenizer._emitToken({type: 'Characters', data: '-'});
2584 tokenizer.setState(script_data_double_escaped_dash_state);
2585 } else if (data === '<') {
2586 tokenizer._emitToken({type: 'Characters', data: '<'});
2587 tokenizer.setState(script_data_double_escaped_less_than_sign_state);
2588 } else if (data === '\u0000') {
2589 tokenizer._parseError('invalid-codepoint');
2590 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2591 buffer.commit();
2592 } else {
2593 tokenizer._emitToken({type: 'Characters', data: data});
2594 buffer.commit();
2595 }
2596 return true;
2597 }
2598  
2599 function script_data_double_escaped_dash_state(buffer) {
2600 var data = buffer.char();
2601 if (data === InputStream.EOF) {
2602 tokenizer._parseError('eof-in-script');
2603 buffer.unget(data);
2604 tokenizer.setState(data_state);
2605 } else if (data === '-') {
2606 tokenizer._emitToken({type: 'Characters', data: '-'});
2607 tokenizer.setState(script_data_double_escaped_dash_dash_state);
2608 } else if (data === '<') {
2609 tokenizer._emitToken({type: 'Characters', data: '<'});
2610 tokenizer.setState(script_data_double_escaped_less_than_sign_state);
2611 } else if (data === '\u0000') {
2612 tokenizer._parseError('invalid-codepoint');
2613 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2614 tokenizer.setState(script_data_double_escaped_state);
2615 } else {
2616 tokenizer._emitToken({type: 'Characters', data: data});
2617 tokenizer.setState(script_data_double_escaped_state);
2618 }
2619 return true;
2620 }
2621  
2622 function script_data_double_escaped_dash_dash_state(buffer) {
2623 var data = buffer.char();
2624 if (data === InputStream.EOF) {
2625 tokenizer._parseError('eof-in-script');
2626 buffer.unget(data);
2627 tokenizer.setState(data_state);
2628 } else if (data === '-') {
2629 tokenizer._emitToken({type: 'Characters', data: '-'});
2630 buffer.commit();
2631 } else if (data === '<') {
2632 tokenizer._emitToken({type: 'Characters', data: '<'});
2633 tokenizer.setState(script_data_double_escaped_less_than_sign_state);
2634 } else if (data === '>') {
2635 tokenizer._emitToken({type: 'Characters', data: '>'});
2636 tokenizer.setState(script_data_state);
2637 } else if (data === '\u0000') {
2638 tokenizer._parseError('invalid-codepoint');
2639 tokenizer._emitToken({type: 'Characters', data: '\uFFFD'});
2640 tokenizer.setState(script_data_double_escaped_state);
2641 } else {
2642 tokenizer._emitToken({type: 'Characters', data: data});
2643 tokenizer.setState(script_data_double_escaped_state);
2644 }
2645 return true;
2646 }
2647  
2648 function script_data_double_escaped_less_than_sign_state(buffer) {
2649 var data = buffer.char();
2650 if (data === '/') {
2651 tokenizer._emitToken({type: 'Characters', data: '/'});
2652 this._temporaryBuffer = '';
2653 tokenizer.setState(script_data_double_escape_end_state);
2654 } else {
2655 buffer.unget(data);
2656 tokenizer.setState(script_data_double_escaped_state);
2657 }
2658 return true;
2659 }
2660  
2661 function script_data_double_escape_end_state(buffer) {
2662 var data = buffer.char();
2663 if (isWhitespace(data) || data === '/' || data === '>') {
2664 tokenizer._emitToken({type: 'Characters', data: data});
2665 if (this._temporaryBuffer.toLowerCase() === 'script')
2666 tokenizer.setState(script_data_escaped_state);
2667 else
2668 tokenizer.setState(script_data_double_escaped_state);
2669 } else if (isAlpha(data)) {
2670 tokenizer._emitToken({type: 'Characters', data: data});
2671 this._temporaryBuffer += data;
2672 buffer.commit();
2673 } else {
2674 buffer.unget(data);
2675 tokenizer.setState(script_data_double_escaped_state);
2676 }
2677 return true;
2678 }
2679  
2680 function tag_open_state(buffer) {
2681 var data = buffer.char();
2682 if (data === InputStream.EOF) {
2683 tokenizer._parseError("bare-less-than-sign-at-eof");
2684 tokenizer._emitToken({type: 'Characters', data: '<'});
2685 buffer.unget(data);
2686 tokenizer.setState(data_state);
2687 } else if (isAlpha(data)) {
2688 tokenizer._currentToken = {type: 'StartTag', name: data.toLowerCase(), data: []};
2689 tokenizer.setState(tag_name_state);
2690 } else if (data === '!') {
2691 tokenizer.setState(markup_declaration_open_state);
2692 } else if (data === '/') {
2693 tokenizer.setState(close_tag_open_state);
2694 } else if (data === '>') {
2695 tokenizer._parseError("expected-tag-name-but-got-right-bracket");
2696 tokenizer._emitToken({type: 'Characters', data: "<>"});
2697 tokenizer.setState(data_state);
2698 } else if (data === '?') {
2699 tokenizer._parseError("expected-tag-name-but-got-question-mark");
2700 buffer.unget(data);
2701 tokenizer.setState(bogus_comment_state);
2702 } else {
2703 tokenizer._parseError("expected-tag-name");
2704 tokenizer._emitToken({type: 'Characters', data: "<"});
2705 buffer.unget(data);
2706 tokenizer.setState(data_state);
2707 }
2708 return true;
2709 }
2710  
2711 function close_tag_open_state(buffer) {
2712 var data = buffer.char();
2713 if (data === InputStream.EOF) {
2714 tokenizer._parseError("expected-closing-tag-but-got-eof");
2715 tokenizer._emitToken({type: 'Characters', data: '</'});
2716 buffer.unget(data);
2717 tokenizer.setState(data_state);
2718 } else if (isAlpha(data)) {
2719 tokenizer._currentToken = {type: 'EndTag', name: data.toLowerCase(), data: []};
2720 tokenizer.setState(tag_name_state);
2721 } else if (data === '>') {
2722 tokenizer._parseError("expected-closing-tag-but-got-right-bracket");
2723 tokenizer.setState(data_state);
2724 } else {
2725 tokenizer._parseError("expected-closing-tag-but-got-char", {data: data}); // param 1 is datavars:
2726 buffer.unget(data);
2727 tokenizer.setState(bogus_comment_state);
2728 }
2729 return true;
2730 }
2731  
2732 function tag_name_state(buffer) {
2733 var data = buffer.char();
2734 if (data === InputStream.EOF) {
2735 tokenizer._parseError('eof-in-tag-name');
2736 buffer.unget(data);
2737 tokenizer.setState(data_state);
2738 } else if (isWhitespace(data)) {
2739 tokenizer.setState(before_attribute_name_state);
2740 } else if (isAlpha(data)) {
2741 tokenizer._currentToken.name += data.toLowerCase();
2742 } else if (data === '>') {
2743 tokenizer._emitCurrentToken();
2744 } else if (data === '/') {
2745 tokenizer.setState(self_closing_tag_state);
2746 } else if (data === '\u0000') {
2747 tokenizer._parseError("invalid-codepoint");
2748 tokenizer._currentToken.name += "\uFFFD";
2749 } else {
2750 tokenizer._currentToken.name += data;
2751 }
2752 buffer.commit();
2753  
2754 return true;
2755 }
2756  
2757 function before_attribute_name_state(buffer) {
2758 var data = buffer.char();
2759 if (data === InputStream.EOF) {
2760 tokenizer._parseError("expected-attribute-name-but-got-eof");
2761 buffer.unget(data);
2762 tokenizer.setState(data_state);
2763 } else if (isWhitespace(data)) {
2764 return true;
2765 } else if (isAlpha(data)) {
2766 tokenizer._currentToken.data.push({nodeName: data.toLowerCase(), nodeValue: ""});
2767 tokenizer.setState(attribute_name_state);
2768 } else if (data === '>') {
2769 tokenizer._emitCurrentToken();
2770 } else if (data === '/') {
2771 tokenizer.setState(self_closing_tag_state);
2772 } else if (data === "'" || data === '"' || data === '=' || data === '<') {
2773 tokenizer._parseError("invalid-character-in-attribute-name");
2774 tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
2775 tokenizer.setState(attribute_name_state);
2776 } else if (data === '\u0000') {
2777 tokenizer._parseError("invalid-codepoint");
2778 tokenizer._currentToken.data.push({nodeName: "\uFFFD", nodeValue: ""});
2779 } else {
2780 tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
2781 tokenizer.setState(attribute_name_state);
2782 }
2783 return true;
2784 }
2785  
2786 function attribute_name_state(buffer) {
2787 var data = buffer.char();
2788 var leavingThisState = true;
2789 var shouldEmit = false;
2790 if (data === InputStream.EOF) {
2791 tokenizer._parseError("eof-in-attribute-name");
2792 buffer.unget(data);
2793 tokenizer.setState(data_state);
2794 shouldEmit = true;
2795 } else if (data === '=') {
2796 tokenizer.setState(before_attribute_value_state);
2797 } else if (isAlpha(data)) {
2798 tokenizer._currentAttribute().nodeName += data.toLowerCase();
2799 leavingThisState = false;
2800 } else if (data === '>') {
2801 shouldEmit = true;
2802 } else if (isWhitespace(data)) {
2803 tokenizer.setState(after_attribute_name_state);
2804 } else if (data === '/') {
2805 tokenizer.setState(self_closing_tag_state);
2806 } else if (data === "'" || data === '"') {
2807 tokenizer._parseError("invalid-character-in-attribute-name");
2808 tokenizer._currentAttribute().nodeName += data;
2809 leavingThisState = false;
2810 } else if (data === '\u0000') {
2811 tokenizer._parseError("invalid-codepoint");
2812 tokenizer._currentAttribute().nodeName += "\uFFFD";
2813 } else {
2814 tokenizer._currentAttribute().nodeName += data;
2815 leavingThisState = false;
2816 }
2817  
2818 if (leavingThisState) {
2819 var attributes = tokenizer._currentToken.data;
2820 var currentAttribute = attributes[attributes.length - 1];
2821 for (var i = attributes.length - 2; i >= 0; i--) {
2822 if (currentAttribute.nodeName === attributes[i].nodeName) {
2823 tokenizer._parseError("duplicate-attribute", {name: currentAttribute.nodeName});
2824 currentAttribute.nodeName = null;
2825 break;
2826 }
2827 }
2828 if (shouldEmit)
2829 tokenizer._emitCurrentToken();
2830 } else {
2831 buffer.commit();
2832 }
2833 return true;
2834 }
2835  
2836 function after_attribute_name_state(buffer) {
2837 var data = buffer.char();
2838 if (data === InputStream.EOF) {
2839 tokenizer._parseError("expected-end-of-tag-but-got-eof");
2840 buffer.unget(data);
2841 tokenizer.setState(data_state);
2842 } else if (isWhitespace(data)) {
2843 return true;
2844 } else if (data === '=') {
2845 tokenizer.setState(before_attribute_value_state);
2846 } else if (data === '>') {
2847 tokenizer._emitCurrentToken();
2848 } else if (isAlpha(data)) {
2849 tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
2850 tokenizer.setState(attribute_name_state);
2851 } else if (data === '/') {
2852 tokenizer.setState(self_closing_tag_state);
2853 } else if (data === "'" || data === '"' || data === '<') {
2854 tokenizer._parseError("invalid-character-after-attribute-name");
2855 tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
2856 tokenizer.setState(attribute_name_state);
2857 } else if (data === '\u0000') {
2858 tokenizer._parseError("invalid-codepoint");
2859 tokenizer._currentToken.data.push({nodeName: "\uFFFD", nodeValue: ""});
2860 } else {
2861 tokenizer._currentToken.data.push({nodeName: data, nodeValue: ""});
2862 tokenizer.setState(attribute_name_state);
2863 }
2864 return true;
2865 }
2866  
2867 function before_attribute_value_state(buffer) {
2868 var data = buffer.char();
2869 if (data === InputStream.EOF) {
2870 tokenizer._parseError("expected-attribute-value-but-got-eof");
2871 buffer.unget(data);
2872 tokenizer.setState(data_state);
2873 } else if (isWhitespace(data)) {
2874 return true;
2875 } else if (data === '"') {
2876 tokenizer.setState(attribute_value_double_quoted_state);
2877 } else if (data === '&') {
2878 tokenizer.setState(attribute_value_unquoted_state);
2879 buffer.unget(data);
2880 } else if (data === "'") {
2881 tokenizer.setState(attribute_value_single_quoted_state);
2882 } else if (data === '>') {
2883 tokenizer._parseError("expected-attribute-value-but-got-right-bracket");
2884 tokenizer._emitCurrentToken();
2885 } else if (data === '=' || data === '<' || data === '`') {
2886 tokenizer._parseError("unexpected-character-in-unquoted-attribute-value");
2887 tokenizer._currentAttribute().nodeValue += data;
2888 tokenizer.setState(attribute_value_unquoted_state);
2889 } else if (data === '\u0000') {
2890 tokenizer._parseError("invalid-codepoint");
2891 tokenizer._currentAttribute().nodeValue += "\uFFFD";
2892 } else {
2893 tokenizer._currentAttribute().nodeValue += data;
2894 tokenizer.setState(attribute_value_unquoted_state);
2895 }
2896  
2897 return true;
2898 }
2899  
2900 function attribute_value_double_quoted_state(buffer) {
2901 var data = buffer.char();
2902 if (data === InputStream.EOF) {
2903 tokenizer._parseError("eof-in-attribute-value-double-quote");
2904 buffer.unget(data);
2905 tokenizer.setState(data_state);
2906 } else if (data === '"') {
2907 tokenizer.setState(after_attribute_value_state);
2908 } else if (data === '&') {
2909 this._additionalAllowedCharacter = '"';
2910 tokenizer.setState(character_reference_in_attribute_value_state);
2911 } else if (data === '\u0000') {
2912 tokenizer._parseError("invalid-codepoint");
2913 tokenizer._currentAttribute().nodeValue += "\uFFFD";
2914 } else {
2915 var s = buffer.matchUntil('[\0"&]');
2916 data = data + s;
2917 tokenizer._currentAttribute().nodeValue += data;
2918 }
2919 return true;
2920 }
2921  
2922 function attribute_value_single_quoted_state(buffer) {
2923 var data = buffer.char();
2924 if (data === InputStream.EOF) {
2925 tokenizer._parseError("eof-in-attribute-value-single-quote");
2926 buffer.unget(data);
2927 tokenizer.setState(data_state);
2928 } else if (data === "'") {
2929 tokenizer.setState(after_attribute_value_state);
2930 } else if (data === '&') {
2931 this._additionalAllowedCharacter = "'";
2932 tokenizer.setState(character_reference_in_attribute_value_state);
2933 } else if (data === '\u0000') {
2934 tokenizer._parseError("invalid-codepoint");
2935 tokenizer._currentAttribute().nodeValue += "\uFFFD";
2936 } else {
2937 tokenizer._currentAttribute().nodeValue += data + buffer.matchUntil("\u0000|['&]");
2938 }
2939 return true;
2940 }
2941  
2942 function attribute_value_unquoted_state(buffer) {
2943 var data = buffer.char();
2944 if (data === InputStream.EOF) {
2945 tokenizer._parseError("eof-after-attribute-value");
2946 buffer.unget(data);
2947 tokenizer.setState(data_state);
2948 } else if (isWhitespace(data)) {
2949 tokenizer.setState(before_attribute_name_state);
2950 } else if (data === '&') {
2951 this._additionalAllowedCharacter = ">";
2952 tokenizer.setState(character_reference_in_attribute_value_state);
2953 } else if (data === '>') {
2954 tokenizer._emitCurrentToken();
2955 } else if (data === '"' || data === "'" || data === '=' || data === '`' || data === '<') {
2956 tokenizer._parseError("unexpected-character-in-unquoted-attribute-value");
2957 tokenizer._currentAttribute().nodeValue += data;
2958 buffer.commit();
2959 } else if (data === '\u0000') {
2960 tokenizer._parseError("invalid-codepoint");
2961 tokenizer._currentAttribute().nodeValue += "\uFFFD";
2962 } else {
2963 var o = buffer.matchUntil("\u0000|["+ "\t\n\v\f\x20\r" + "&<>\"'=`" +"]");
2964 if (o === InputStream.EOF) {
2965 tokenizer._parseError("eof-in-attribute-value-no-quotes");
2966 tokenizer._emitCurrentToken();
2967 }
2968 buffer.commit();
2969 tokenizer._currentAttribute().nodeValue += data + o;
2970 }
2971 return true;
2972 }
2973  
2974 function character_reference_in_attribute_value_state(buffer) {
2975 var character = EntityParser.consumeEntity(buffer, tokenizer, this._additionalAllowedCharacter);
2976 this._currentAttribute().nodeValue += character || '&';
2977 if (this._additionalAllowedCharacter === '"')
2978 tokenizer.setState(attribute_value_double_quoted_state);
2979 else if (this._additionalAllowedCharacter === '\'')
2980 tokenizer.setState(attribute_value_single_quoted_state);
2981 else if (this._additionalAllowedCharacter === '>')
2982 tokenizer.setState(attribute_value_unquoted_state);
2983 return true;
2984 }
2985  
2986 function after_attribute_value_state(buffer) {
2987 var data = buffer.char();
2988 if (data === InputStream.EOF) {
2989 tokenizer._parseError("eof-after-attribute-value");
2990 buffer.unget(data);
2991 tokenizer.setState(data_state);
2992 } else if (isWhitespace(data)) {
2993 tokenizer.setState(before_attribute_name_state);
2994 } else if (data === '>') {
2995 tokenizer.setState(data_state);
2996 tokenizer._emitCurrentToken();
2997 } else if (data === '/') {
2998 tokenizer.setState(self_closing_tag_state);
2999 } else {
3000 tokenizer._parseError("unexpected-character-after-attribute-value");
3001 buffer.unget(data);
3002 tokenizer.setState(before_attribute_name_state);
3003 }
3004 return true;
3005 }
3006  
3007 function self_closing_tag_state(buffer) {
3008 var c = buffer.char();
3009 if (c === InputStream.EOF) {
3010 tokenizer._parseError("unexpected-eof-after-solidus-in-tag");
3011 buffer.unget(c);
3012 tokenizer.setState(data_state);
3013 } else if (c === '>') {
3014 tokenizer._currentToken.selfClosing = true;
3015 tokenizer.setState(data_state);
3016 tokenizer._emitCurrentToken();
3017 } else {
3018 tokenizer._parseError("unexpected-character-after-solidus-in-tag");
3019 buffer.unget(c);
3020 tokenizer.setState(before_attribute_name_state);
3021 }
3022 return true;
3023 }
3024  
3025 function bogus_comment_state(buffer) {
3026 var data = buffer.matchUntil('>');
3027 data = data.replace(/\u0000/g, "\uFFFD");
3028 buffer.char();
3029 tokenizer._emitToken({type: 'Comment', data: data});
3030 tokenizer.setState(data_state);
3031 return true;
3032 }
3033  
3034 function markup_declaration_open_state(buffer) {
3035 var chars = buffer.shift(2);
3036 if (chars === '--') {
3037 tokenizer._currentToken = {type: 'Comment', data: ''};
3038 tokenizer.setState(comment_start_state);
3039 } else {
3040 var newchars = buffer.shift(5);
3041 if (newchars === InputStream.EOF || chars === InputStream.EOF) {
3042 tokenizer._parseError("expected-dashes-or-doctype");
3043 tokenizer.setState(bogus_comment_state);
3044 buffer.unget(chars);
3045 return true;
3046 }
3047  
3048 chars += newchars;
3049 if (chars.toUpperCase() === 'DOCTYPE') {
3050 tokenizer._currentToken = {type: 'Doctype', name: '', publicId: null, systemId: null, forceQuirks: false};
3051 tokenizer.setState(doctype_state);
3052 } else if (tokenizer._tokenHandler.isCdataSectionAllowed() && chars === '[CDATA[') {
3053 tokenizer.setState(cdata_section_state);
3054 } else {
3055 tokenizer._parseError("expected-dashes-or-doctype");
3056 buffer.unget(chars);
3057 tokenizer.setState(bogus_comment_state);
3058 }
3059 }
3060 return true;
3061 }
3062  
3063 function cdata_section_state(buffer) {
3064 var data = buffer.matchUntil(']]>');
3065 buffer.shift(3);
3066 if (data) {
3067 tokenizer._emitToken({type: 'Characters', data: data});
3068 }
3069 tokenizer.setState(data_state);
3070 return true;
3071 }
3072  
3073 function comment_start_state(buffer) {
3074 var data = buffer.char();
3075 if (data === InputStream.EOF) {
3076 tokenizer._parseError("eof-in-comment");
3077 tokenizer._emitToken(tokenizer._currentToken);
3078 buffer.unget(data);
3079 tokenizer.setState(data_state);
3080 } else if (data === '-') {
3081 tokenizer.setState(comment_start_dash_state);
3082 } else if (data === '>') {
3083 tokenizer._parseError("incorrect-comment");
3084 tokenizer._emitToken(tokenizer._currentToken);
3085 tokenizer.setState(data_state);
3086 } else if (data === '\u0000') {
3087 tokenizer._parseError("invalid-codepoint");
3088 tokenizer._currentToken.data += "\uFFFD";
3089 } else {
3090 tokenizer._currentToken.data += data;
3091 tokenizer.setState(comment_state);
3092 }
3093 return true;
3094 }
3095  
3096 function comment_start_dash_state(buffer) {
3097 var data = buffer.char();
3098 if (data === InputStream.EOF) {
3099 tokenizer._parseError("eof-in-comment");
3100 tokenizer._emitToken(tokenizer._currentToken);
3101 buffer.unget(data);
3102 tokenizer.setState(data_state);
3103 } else if (data === '-') {
3104 tokenizer.setState(comment_end_state);
3105 } else if (data === '>') {
3106 tokenizer._parseError("incorrect-comment");
3107 tokenizer._emitToken(tokenizer._currentToken);
3108 tokenizer.setState(data_state);
3109 } else if (data === '\u0000') {
3110 tokenizer._parseError("invalid-codepoint");
3111 tokenizer._currentToken.data += "\uFFFD";
3112 } else {
3113 tokenizer._currentToken.data += '-' + data;
3114 tokenizer.setState(comment_state);
3115 }
3116 return true;
3117 }
3118  
3119 function comment_state(buffer) {
3120 var data = buffer.char();
3121 if (data === InputStream.EOF) {
3122 tokenizer._parseError("eof-in-comment");
3123 tokenizer._emitToken(tokenizer._currentToken);
3124 buffer.unget(data);
3125 tokenizer.setState(data_state);
3126 } else if (data === '-') {
3127 tokenizer.setState(comment_end_dash_state);
3128 } else if (data === '\u0000') {
3129 tokenizer._parseError("invalid-codepoint");
3130 tokenizer._currentToken.data += "\uFFFD";
3131 } else {
3132 tokenizer._currentToken.data += data;
3133 buffer.commit();
3134 }
3135 return true;
3136 }
3137  
3138 function comment_end_dash_state(buffer) {
3139 var data = buffer.char();
3140 if (data === InputStream.EOF) {
3141 tokenizer._parseError("eof-in-comment-end-dash");
3142 tokenizer._emitToken(tokenizer._currentToken);
3143 buffer.unget(data);
3144 tokenizer.setState(data_state);
3145 } else if (data === '-') {
3146 tokenizer.setState(comment_end_state);
3147 } else if (data === '\u0000') {
3148 tokenizer._parseError("invalid-codepoint");
3149 tokenizer._currentToken.data += "-\uFFFD";
3150 tokenizer.setState(comment_state);
3151 } else {
3152 tokenizer._currentToken.data += '-' + data + buffer.matchUntil('\u0000|-');
3153 buffer.char();
3154 }
3155 return true;
3156 }
3157  
3158 function comment_end_state(buffer) {
3159 var data = buffer.char();
3160 if (data === InputStream.EOF) {
3161 tokenizer._parseError("eof-in-comment-double-dash");
3162 tokenizer._emitToken(tokenizer._currentToken);
3163 buffer.unget(data);
3164 tokenizer.setState(data_state);
3165 } else if (data === '>') {
3166 tokenizer._emitToken(tokenizer._currentToken);
3167 tokenizer.setState(data_state);
3168 } else if (data === '!') {
3169 tokenizer._parseError("unexpected-bang-after-double-dash-in-comment");
3170 tokenizer.setState(comment_end_bang_state);
3171 } else if (data === '-') {
3172 tokenizer._parseError("unexpected-dash-after-double-dash-in-comment");
3173 tokenizer._currentToken.data += data;
3174 } else if (data === '\u0000') {
3175 tokenizer._parseError("invalid-codepoint");
3176 tokenizer._currentToken.data += "--\uFFFD";
3177 tokenizer.setState(comment_state);
3178 } else {
3179 tokenizer._parseError("unexpected-char-in-comment");
3180 tokenizer._currentToken.data += '--' + data;
3181 tokenizer.setState(comment_state);
3182 }
3183 return true;
3184 }
3185  
3186 function comment_end_bang_state(buffer) {
3187 var data = buffer.char();
3188 if (data === InputStream.EOF) {
3189 tokenizer._parseError("eof-in-comment-end-bang-state");
3190 tokenizer._emitToken(tokenizer._currentToken);
3191 buffer.unget(data);
3192 tokenizer.setState(data_state);
3193 } else if (data === '>') {
3194 tokenizer._emitToken(tokenizer._currentToken);
3195 tokenizer.setState(data_state);
3196 } else if (data === '-') {
3197 tokenizer._currentToken.data += '--!';
3198 tokenizer.setState(comment_end_dash_state);
3199 } else {
3200 tokenizer._currentToken.data += '--!' + data;
3201 tokenizer.setState(comment_state);
3202 }
3203 return true;
3204 }
3205  
3206 function doctype_state(buffer) {
3207 var data = buffer.char();
3208 if (data === InputStream.EOF) {
3209 tokenizer._parseError("expected-doctype-name-but-got-eof");
3210 tokenizer._currentToken.forceQuirks = true;
3211 buffer.unget(data);
3212 tokenizer.setState(data_state);
3213 tokenizer._emitCurrentToken();
3214 } else if (isWhitespace(data)) {
3215 tokenizer.setState(before_doctype_name_state);
3216 } else {
3217 tokenizer._parseError("need-space-after-doctype");
3218 buffer.unget(data);
3219 tokenizer.setState(before_doctype_name_state);
3220 }
3221 return true;
3222 }
3223  
3224 function before_doctype_name_state(buffer) {
3225 var data = buffer.char();
3226 if (data === InputStream.EOF) {
3227 tokenizer._parseError("expected-doctype-name-but-got-eof");
3228 tokenizer._currentToken.forceQuirks = true;
3229 buffer.unget(data);
3230 tokenizer.setState(data_state);
3231 tokenizer._emitCurrentToken();
3232 } else if (isWhitespace(data)) {
3233 } else if (data === '>') {
3234 tokenizer._parseError("expected-doctype-name-but-got-right-bracket");
3235 tokenizer._currentToken.forceQuirks = true;
3236 tokenizer.setState(data_state);
3237 tokenizer._emitCurrentToken();
3238 } else {
3239 if (isAlpha(data))
3240 data = data.toLowerCase();
3241 tokenizer._currentToken.name = data;
3242 tokenizer.setState(doctype_name_state);
3243 }
3244 return true;
3245 }
3246  
3247 function doctype_name_state(buffer) {
3248 var data = buffer.char();
3249 if (data === InputStream.EOF) {
3250 tokenizer._currentToken.forceQuirks = true;
3251 buffer.unget(data);
3252 tokenizer._parseError("eof-in-doctype-name");
3253 tokenizer.setState(data_state);
3254 tokenizer._emitCurrentToken();
3255 } else if (isWhitespace(data)) {
3256 tokenizer.setState(after_doctype_name_state);
3257 } else if (data === '>') {
3258 tokenizer.setState(data_state);
3259 tokenizer._emitCurrentToken();
3260 } else {
3261 if (isAlpha(data))
3262 data = data.toLowerCase();
3263 tokenizer._currentToken.name += data;
3264 buffer.commit();
3265 }
3266 return true;
3267 }
3268  
3269 function after_doctype_name_state(buffer) {
3270 var data = buffer.char();
3271 if (data === InputStream.EOF) {
3272 tokenizer._currentToken.forceQuirks = true;
3273 buffer.unget(data);
3274 tokenizer._parseError("eof-in-doctype");
3275 tokenizer.setState(data_state);
3276 tokenizer._emitCurrentToken();
3277 } else if (isWhitespace(data)) {
3278 } else if (data === '>') {
3279 tokenizer.setState(data_state);
3280 tokenizer._emitCurrentToken();
3281 } else {
3282 if (['p', 'P'].indexOf(data) > -1) {
3283 var expected = [['u', 'U'], ['b', 'B'], ['l', 'L'], ['i', 'I'], ['c', 'C']];
3284 var matched = expected.every(function(expected){
3285 data = buffer.char();
3286 return expected.indexOf(data) > -1;
3287 });
3288 if (matched) {
3289 tokenizer.setState(after_doctype_public_keyword_state);
3290 return true;
3291 }
3292 } else if (['s', 'S'].indexOf(data) > -1) {
3293 var expected = [['y', 'Y'], ['s', 'S'], ['t', 'T'], ['e', 'E'], ['m', 'M']];
3294 var matched = expected.every(function(expected){
3295 data = buffer.char();
3296 return expected.indexOf(data) > -1;
3297 });
3298 if (matched) {
3299 tokenizer.setState(after_doctype_system_keyword_state);
3300 return true;
3301 }
3302 }
3303 buffer.unget(data);
3304 tokenizer._currentToken.forceQuirks = true;
3305  
3306 if (data === InputStream.EOF) {
3307 tokenizer._parseError("eof-in-doctype");
3308 buffer.unget(data);
3309 tokenizer.setState(data_state);
3310 tokenizer._emitCurrentToken();
3311 } else {
3312 tokenizer._parseError("expected-space-or-right-bracket-in-doctype", {data: data});
3313 tokenizer.setState(bogus_doctype_state);
3314 }
3315 }
3316 return true;
3317 }
3318  
3319 function after_doctype_public_keyword_state(buffer) {
3320 var data = buffer.char();
3321 if (data === InputStream.EOF) {
3322 tokenizer._parseError("eof-in-doctype");
3323 tokenizer._currentToken.forceQuirks = true;
3324 buffer.unget(data);
3325 tokenizer.setState(data_state);
3326 tokenizer._emitCurrentToken();
3327 } else if (isWhitespace(data)) {
3328 tokenizer.setState(before_doctype_public_identifier_state);
3329 } else if (data === "'" || data === '"') {
3330 tokenizer._parseError("unexpected-char-in-doctype");
3331 buffer.unget(data);
3332 tokenizer.setState(before_doctype_public_identifier_state);
3333 } else {
3334 buffer.unget(data);
3335 tokenizer.setState(before_doctype_public_identifier_state);
3336 }
3337 return true;
3338 }
3339  
3340 function before_doctype_public_identifier_state(buffer) {
3341 var data = buffer.char();
3342 if (data === InputStream.EOF) {
3343 tokenizer._parseError("eof-in-doctype");
3344 tokenizer._currentToken.forceQuirks = true;
3345 buffer.unget(data);
3346 tokenizer.setState(data_state);
3347 tokenizer._emitCurrentToken();
3348 } else if (isWhitespace(data)) {
3349 } else if (data === '"') {
3350 tokenizer._currentToken.publicId = '';
3351 tokenizer.setState(doctype_public_identifier_double_quoted_state);
3352 } else if (data === "'") {
3353 tokenizer._currentToken.publicId = '';
3354 tokenizer.setState(doctype_public_identifier_single_quoted_state);
3355 } else if (data === '>') {
3356 tokenizer._parseError("unexpected-end-of-doctype");
3357 tokenizer._currentToken.forceQuirks = true;
3358 tokenizer.setState(data_state);
3359 tokenizer._emitCurrentToken();
3360 } else {
3361 tokenizer._parseError("unexpected-char-in-doctype");
3362 tokenizer._currentToken.forceQuirks = true;
3363 tokenizer.setState(bogus_doctype_state);
3364 }
3365 return true;
3366 }
3367  
3368 function doctype_public_identifier_double_quoted_state(buffer) {
3369 var data = buffer.char();
3370 if (data === InputStream.EOF) {
3371 tokenizer._parseError("eof-in-doctype");
3372 tokenizer._currentToken.forceQuirks = true;
3373 buffer.unget(data);
3374 tokenizer.setState(data_state);
3375 tokenizer._emitCurrentToken();
3376 } else if (data === '"') {
3377 tokenizer.setState(after_doctype_public_identifier_state);
3378 } else if (data === '>') {
3379 tokenizer._parseError("unexpected-end-of-doctype");
3380 tokenizer._currentToken.forceQuirks = true;
3381 tokenizer.setState(data_state);
3382 tokenizer._emitCurrentToken();
3383 } else {
3384 tokenizer._currentToken.publicId += data;
3385 }
3386 return true;
3387 }
3388  
3389 function doctype_public_identifier_single_quoted_state(buffer) {
3390 var data = buffer.char();
3391 if (data === InputStream.EOF) {
3392 tokenizer._parseError("eof-in-doctype");
3393 tokenizer._currentToken.forceQuirks = true;
3394 buffer.unget(data);
3395 tokenizer.setState(data_state);
3396 tokenizer._emitCurrentToken();
3397 } else if (data === "'") {
3398 tokenizer.setState(after_doctype_public_identifier_state);
3399 } else if (data === '>') {
3400 tokenizer._parseError("unexpected-end-of-doctype");
3401 tokenizer._currentToken.forceQuirks = true;
3402 tokenizer.setState(data_state);
3403 tokenizer._emitCurrentToken();
3404 } else {
3405 tokenizer._currentToken.publicId += data;
3406 }
3407 return true;
3408 }
3409  
3410 function after_doctype_public_identifier_state(buffer) {
3411 var data = buffer.char();
3412 if (data === InputStream.EOF) {
3413 tokenizer._parseError("eof-in-doctype");
3414 tokenizer._currentToken.forceQuirks = true;
3415 tokenizer._emitCurrentToken();
3416 buffer.unget(data);
3417 tokenizer.setState(data_state);
3418 } else if (isWhitespace(data)) {
3419 tokenizer.setState(between_doctype_public_and_system_identifiers_state);
3420 } else if (data === '>') {
3421 tokenizer.setState(data_state);
3422 tokenizer._emitCurrentToken();
3423 } else if (data === '"') {
3424 tokenizer._parseError("unexpected-char-in-doctype");
3425 tokenizer._currentToken.systemId = '';
3426 tokenizer.setState(doctype_system_identifier_double_quoted_state);
3427 } else if (data === "'") {
3428 tokenizer._parseError("unexpected-char-in-doctype");
3429 tokenizer._currentToken.systemId = '';
3430 tokenizer.setState(doctype_system_identifier_single_quoted_state);
3431 } else {
3432 tokenizer._parseError("unexpected-char-in-doctype");
3433 tokenizer._currentToken.forceQuirks = true;
3434 tokenizer.setState(bogus_doctype_state);
3435 }
3436 return true;
3437 }
3438  
3439 function between_doctype_public_and_system_identifiers_state(buffer) {
3440 var data = buffer.char();
3441 if (data === InputStream.EOF) {
3442 tokenizer._parseError("eof-in-doctype");
3443 tokenizer._currentToken.forceQuirks = true;
3444 tokenizer._emitCurrentToken();
3445 buffer.unget(data);
3446 tokenizer.setState(data_state);
3447 } else if (isWhitespace(data)) {
3448 } else if (data === '>') {
3449 tokenizer._emitCurrentToken();
3450 tokenizer.setState(data_state);
3451 } else if (data === '"') {
3452 tokenizer._currentToken.systemId = '';
3453 tokenizer.setState(doctype_system_identifier_double_quoted_state);
3454 } else if (data === "'") {
3455 tokenizer._currentToken.systemId = '';
3456 tokenizer.setState(doctype_system_identifier_single_quoted_state);
3457 } else {
3458 tokenizer._parseError("unexpected-char-in-doctype");
3459 tokenizer._currentToken.forceQuirks = true;
3460 tokenizer.setState(bogus_doctype_state);
3461 }
3462 return true;
3463 }
3464  
3465 function after_doctype_system_keyword_state(buffer) {
3466 var data = buffer.char();
3467 if (data === InputStream.EOF) {
3468 tokenizer._parseError("eof-in-doctype");
3469 tokenizer._currentToken.forceQuirks = true;
3470 tokenizer._emitCurrentToken();
3471 buffer.unget(data);
3472 tokenizer.setState(data_state);
3473 } else if (isWhitespace(data)) {
3474 tokenizer.setState(before_doctype_system_identifier_state);
3475 } else if (data === "'" || data === '"') {
3476 tokenizer._parseError("unexpected-char-in-doctype");
3477 buffer.unget(data);
3478 tokenizer.setState(before_doctype_system_identifier_state);
3479 } else {
3480 buffer.unget(data);
3481 tokenizer.setState(before_doctype_system_identifier_state);
3482 }
3483 return true;
3484 }
3485  
3486 function before_doctype_system_identifier_state(buffer) {
3487 var data = buffer.char();
3488 if (data === InputStream.EOF) {
3489 tokenizer._parseError("eof-in-doctype");
3490 tokenizer._currentToken.forceQuirks = true;
3491 tokenizer._emitCurrentToken();
3492 buffer.unget(data);
3493 tokenizer.setState(data_state);
3494 } else if (isWhitespace(data)) {
3495 } else if (data === '"') {
3496 tokenizer._currentToken.systemId = '';
3497 tokenizer.setState(doctype_system_identifier_double_quoted_state);
3498 } else if (data === "'") {
3499 tokenizer._currentToken.systemId = '';
3500 tokenizer.setState(doctype_system_identifier_single_quoted_state);
3501 } else if (data === '>') {
3502 tokenizer._parseError("unexpected-end-of-doctype");
3503 tokenizer._currentToken.forceQuirks = true;
3504 tokenizer._emitCurrentToken();
3505 tokenizer.setState(data_state);
3506 } else {
3507 tokenizer._parseError("unexpected-char-in-doctype");
3508 tokenizer._currentToken.forceQuirks = true;
3509 tokenizer.setState(bogus_doctype_state);
3510 }
3511 return true;
3512 }
3513  
3514 function doctype_system_identifier_double_quoted_state(buffer) {
3515 var data = buffer.char();
3516 if (data === InputStream.EOF) {
3517 tokenizer._parseError("eof-in-doctype");
3518 tokenizer._currentToken.forceQuirks = true;
3519 tokenizer._emitCurrentToken();
3520 buffer.unget(data);
3521 tokenizer.setState(data_state);
3522 } else if (data === '"') {
3523 tokenizer.setState(after_doctype_system_identifier_state);
3524 } else if (data === '>') {
3525 tokenizer._parseError("unexpected-end-of-doctype");
3526 tokenizer._currentToken.forceQuirks = true;
3527 tokenizer._emitCurrentToken();
3528 tokenizer.setState(data_state);
3529 } else {
3530 tokenizer._currentToken.systemId += data;
3531 }
3532 return true;
3533 }
3534  
3535 function doctype_system_identifier_single_quoted_state(buffer) {
3536 var data = buffer.char();
3537 if (data === InputStream.EOF) {
3538 tokenizer._parseError("eof-in-doctype");
3539 tokenizer._currentToken.forceQuirks = true;
3540 tokenizer._emitCurrentToken();
3541 buffer.unget(data);
3542 tokenizer.setState(data_state);
3543 } else if (data === "'") {
3544 tokenizer.setState(after_doctype_system_identifier_state);
3545 } else if (data === '>') {
3546 tokenizer._parseError("unexpected-end-of-doctype");
3547 tokenizer._currentToken.forceQuirks = true;
3548 tokenizer._emitCurrentToken();
3549 tokenizer.setState(data_state);
3550 } else {
3551 tokenizer._currentToken.systemId += data;
3552 }
3553 return true;
3554 }
3555  
3556 function after_doctype_system_identifier_state(buffer) {
3557 var data = buffer.char();
3558 if (data === InputStream.EOF) {
3559 tokenizer._parseError("eof-in-doctype");
3560 tokenizer._currentToken.forceQuirks = true;
3561 tokenizer._emitCurrentToken();
3562 buffer.unget(data);
3563 tokenizer.setState(data_state);
3564 } else if (isWhitespace(data)) {
3565 } else if (data === '>') {
3566 tokenizer._emitCurrentToken();
3567 tokenizer.setState(data_state);
3568 } else {
3569 tokenizer._parseError("unexpected-char-in-doctype");
3570 tokenizer.setState(bogus_doctype_state);
3571 }
3572 return true;
3573 }
3574  
3575 function bogus_doctype_state(buffer) {
3576 var data = buffer.char();
3577 if (data === InputStream.EOF) {
3578 buffer.unget(data);
3579 tokenizer._emitCurrentToken();
3580 tokenizer.setState(data_state);
3581 } else if (data === '>') {
3582 tokenizer._emitCurrentToken();
3583 tokenizer.setState(data_state);
3584 }
3585 return true;
3586 }
3587 };
3588  
3589 Object.defineProperty(Tokenizer.prototype, 'lineNumber', {
3590 get: function() {
3591 return this._inputStream.location().line;
3592 }
3593 });
3594  
3595 Object.defineProperty(Tokenizer.prototype, 'columnNumber', {
3596 get: function() {
3597 return this._inputStream.location().column;
3598 }
3599 });
3600  
3601 exports.Tokenizer = Tokenizer;
3602  
3603 },
3604 {"./EntityParser":2,"./InputStream":3}],
3605 6:[function(_dereq_,module,exports){
3606 var assert = _dereq_('assert');
3607  
3608 var messages = _dereq_('./messages.json');
3609 var constants = _dereq_('./constants');
3610  
3611 var EventEmitter = _dereq_('events').EventEmitter;
3612  
3613 var Tokenizer = _dereq_('./Tokenizer').Tokenizer;
3614 var ElementStack = _dereq_('./ElementStack').ElementStack;
3615 var StackItem = _dereq_('./StackItem').StackItem;
3616  
3617 var Marker = {};
3618  
3619 function isWhitespace(ch) {
3620 return ch === " " || ch === "\n" || ch === "\t" || ch === "\r" || ch === "\f";
3621 }
3622  
3623 function isWhitespaceOrReplacementCharacter(ch) {
3624 return isWhitespace(ch) || ch === '\uFFFD';
3625 }
3626  
3627 function isAllWhitespace(characters) {
3628 for (var i = 0; i < characters.length; i++) {
3629 var ch = characters[i];
3630 if (!isWhitespace(ch))
3631 return false;
3632 }
3633 return true;
3634 }
3635  
3636 function isAllWhitespaceOrReplacementCharacters(characters) {
3637 for (var i = 0; i < characters.length; i++) {
3638 var ch = characters[i];
3639 if (!isWhitespaceOrReplacementCharacter(ch))
3640 return false;
3641 }
3642 return true;
3643 }
3644  
3645 function getAttribute(node, name) {
3646 for (var i = 0; i < node.attributes.length; i++) {
3647 var attribute = node.attributes[i];
3648 if (attribute.nodeName === name) {
3649 return attribute;
3650 }
3651 }
3652 return null;
3653 }
3654  
3655 function CharacterBuffer(characters) {
3656 this.characters = characters;
3657 this.current = 0;
3658 this.end = this.characters.length;
3659 }
3660  
3661 CharacterBuffer.prototype.skipAtMostOneLeadingNewline = function() {
3662 if (this.characters[this.current] === '\n')
3663 this.current++;
3664 };
3665  
3666 CharacterBuffer.prototype.skipLeadingWhitespace = function() {
3667 while (isWhitespace(this.characters[this.current])) {
3668 if (++this.current == this.end)
3669 return;
3670 }
3671 };
3672  
3673 CharacterBuffer.prototype.skipLeadingNonWhitespace = function() {
3674 while (!isWhitespace(this.characters[this.current])) {
3675 if (++this.current == this.end)
3676 return;
3677 }
3678 };
3679  
3680 CharacterBuffer.prototype.takeRemaining = function() {
3681 return this.characters.substring(this.current);
3682 };
3683  
3684 CharacterBuffer.prototype.takeLeadingWhitespace = function() {
3685 var start = this.current;
3686 this.skipLeadingWhitespace();
3687 if (start === this.current)
3688 return "";
3689 return this.characters.substring(start, this.current - start);
3690 };
3691  
3692 Object.defineProperty(CharacterBuffer.prototype, 'length', {
3693 get: function(){
3694 return this.end - this.current;
3695 }
3696 });
3697 function TreeBuilder() {
3698 this.tokenizer = null;
3699 this.errorHandler = null;
3700 this.scriptingEnabled = false;
3701 this.document = null;
3702 this.head = null;
3703 this.form = null;
3704 this.openElements = new ElementStack();
3705 this.activeFormattingElements = [];
3706 this.insertionMode = null;
3707 this.insertionModeName = "";
3708 this.originalInsertionMode = "";
3709 this.inQuirksMode = false; // TODO quirks mode
3710 this.compatMode = "no quirks";
3711 this.framesetOk = true;
3712 this.redirectAttachToFosterParent = false;
3713 this.selfClosingFlagAcknowledged = false;
3714 this.context = "";
3715 this.pendingTableCharacters = [];
3716 this.shouldSkipLeadingNewline = false;
3717  
3718 var tree = this;
3719 var modes = this.insertionModes = {};
3720 modes.base = {
3721 end_tag_handlers: {"-default": 'endTagOther'},
3722 start_tag_handlers: {"-default": 'startTagOther'},
3723 processEOF: function() {
3724 tree.generateImpliedEndTags();
3725 if (tree.openElements.length > 2) {
3726 tree.parseError('expected-closing-tag-but-got-eof');
3727 } else if (tree.openElements.length == 2 &&
3728 tree.openElements.item(1).localName != 'body') {
3729 tree.parseError('expected-closing-tag-but-got-eof');
3730 } else if (tree.context && tree.openElements.length > 1) {
3731 }
3732 },
3733 processComment: function(data) {
3734 tree.insertComment(data, tree.currentStackItem().node);
3735 },
3736 processDoctype: function(name, publicId, systemId, forceQuirks) {
3737 tree.parseError('unexpected-doctype');
3738 },
3739 processStartTag: function(name, attributes, selfClosing) {
3740 if (this[this.start_tag_handlers[name]]) {
3741 this[this.start_tag_handlers[name]](name, attributes, selfClosing);
3742 } else if (this[this.start_tag_handlers["-default"]]) {
3743 this[this.start_tag_handlers["-default"]](name, attributes, selfClosing);
3744 } else {
3745 throw(new Error("No handler found for "+name));
3746 }
3747 },
3748 processEndTag: function(name) {
3749 if (this[this.end_tag_handlers[name]]) {
3750 this[this.end_tag_handlers[name]](name);
3751 } else if (this[this.end_tag_handlers["-default"]]) {
3752 this[this.end_tag_handlers["-default"]](name);
3753 } else {
3754 throw(new Error("No handler found for "+name));
3755 }
3756 },
3757 startTagHtml: function(name, attributes) {
3758 modes.inBody.startTagHtml(name, attributes);
3759 }
3760 };
3761  
3762 modes.initial = Object.create(modes.base);
3763  
3764 modes.initial.processEOF = function() {
3765 tree.parseError("expected-doctype-but-got-eof");
3766 this.anythingElse();
3767 tree.insertionMode.processEOF();
3768 };
3769  
3770 modes.initial.processComment = function(data) {
3771 tree.insertComment(data, tree.document);
3772 };
3773  
3774 modes.initial.processDoctype = function(name, publicId, systemId, forceQuirks) {
3775 tree.insertDoctype(name || '', publicId || '', systemId || '');
3776  
3777 if (forceQuirks || name != 'html' || (publicId != null && ([
3778 "+//silmaril//dtd html pro v0r11 19970101//",
3779 "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
3780 "-//as//dtd html 3.0 aswedit + extensions//",
3781 "-//ietf//dtd html 2.0 level 1//",
3782 "-//ietf//dtd html 2.0 level 2//",
3783 "-//ietf//dtd html 2.0 strict level 1//",
3784 "-//ietf//dtd html 2.0 strict level 2//",
3785 "-//ietf//dtd html 2.0 strict//",
3786 "-//ietf//dtd html 2.0//",
3787 "-//ietf//dtd html 2.1e//",
3788 "-//ietf//dtd html 3.0//",
3789 "-//ietf//dtd html 3.0//",
3790 "-//ietf//dtd html 3.2 final//",
3791 "-//ietf//dtd html 3.2//",
3792 "-//ietf//dtd html 3//",
3793 "-//ietf//dtd html level 0//",
3794 "-//ietf//dtd html level 0//",
3795 "-//ietf//dtd html level 1//",
3796 "-//ietf//dtd html level 1//",
3797 "-//ietf//dtd html level 2//",
3798 "-//ietf//dtd html level 2//",
3799 "-//ietf//dtd html level 3//",
3800 "-//ietf//dtd html level 3//",
3801 "-//ietf//dtd html strict level 0//",
3802 "-//ietf//dtd html strict level 0//",
3803 "-//ietf//dtd html strict level 1//",
3804 "-//ietf//dtd html strict level 1//",
3805 "-//ietf//dtd html strict level 2//",
3806 "-//ietf//dtd html strict level 2//",
3807 "-//ietf//dtd html strict level 3//",
3808 "-//ietf//dtd html strict level 3//",
3809 "-//ietf//dtd html strict//",
3810 "-//ietf//dtd html strict//",
3811 "-//ietf//dtd html strict//",
3812 "-//ietf//dtd html//",
3813 "-//ietf//dtd html//",
3814 "-//ietf//dtd html//",
3815 "-//metrius//dtd metrius presentational//",
3816 "-//microsoft//dtd internet explorer 2.0 html strict//",
3817 "-//microsoft//dtd internet explorer 2.0 html//",
3818 "-//microsoft//dtd internet explorer 2.0 tables//",
3819 "-//microsoft//dtd internet explorer 3.0 html strict//",
3820 "-//microsoft//dtd internet explorer 3.0 html//",
3821 "-//microsoft//dtd internet explorer 3.0 tables//",
3822 "-//netscape comm. corp.//dtd html//",
3823 "-//netscape comm. corp.//dtd strict html//",
3824 "-//o'reilly and associates//dtd html 2.0//",
3825 "-//o'reilly and associates//dtd html extended 1.0//",
3826 "-//spyglass//dtd html 2.0 extended//",
3827 "-//sq//dtd html 2.0 hotmetal + extensions//",
3828 "-//sun microsystems corp.//dtd hotjava html//",
3829 "-//sun microsystems corp.//dtd hotjava strict html//",
3830 "-//w3c//dtd html 3 1995-03-24//",
3831 "-//w3c//dtd html 3.2 draft//",
3832 "-//w3c//dtd html 3.2 final//",
3833 "-//w3c//dtd html 3.2//",
3834 "-//w3c//dtd html 3.2s draft//",
3835 "-//w3c//dtd html 4.0 frameset//",
3836 "-//w3c//dtd html 4.0 transitional//",
3837 "-//w3c//dtd html experimental 19960712//",
3838 "-//w3c//dtd html experimental 970421//",
3839 "-//w3c//dtd w3 html//",
3840 "-//w3o//dtd w3 html 3.0//",
3841 "-//webtechs//dtd mozilla html 2.0//",
3842 "-//webtechs//dtd mozilla html//",
3843 "html"
3844 ].some(publicIdStartsWith)
3845 || [
3846 "-//w3o//dtd w3 html strict 3.0//en//",
3847 "-/w3c/dtd html 4.0 transitional/en",
3848 "html"
3849 ].indexOf(publicId.toLowerCase()) > -1
3850 || (systemId == null && [
3851 "-//w3c//dtd html 4.01 transitional//",
3852 "-//w3c//dtd html 4.01 frameset//"
3853 ].some(publicIdStartsWith)))
3854 )
3855 || (systemId != null && (systemId.toLowerCase() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"))
3856 ) {
3857 tree.compatMode = "quirks";
3858 tree.parseError("quirky-doctype");
3859 } else if (publicId != null && ([
3860 "-//w3c//dtd xhtml 1.0 transitional//",
3861 "-//w3c//dtd xhtml 1.0 frameset//"
3862 ].some(publicIdStartsWith)
3863 || (systemId != null && [
3864 "-//w3c//dtd html 4.01 transitional//",
3865 "-//w3c//dtd html 4.01 frameset//"
3866 ].indexOf(publicId.toLowerCase()) > -1))
3867 ) {
3868 tree.compatMode = "limited quirks";
3869 tree.parseError("almost-standards-doctype");
3870 } else {
3871 if ((publicId == "-//W3C//DTD HTML 4.0//EN" && (systemId == null || systemId == "http://www.w3.org/TR/REC-html40/strict.dtd"))
3872 || (publicId == "-//W3C//DTD HTML 4.01//EN" && (systemId == null || systemId == "http://www.w3.org/TR/html4/strict.dtd"))
3873 || (publicId == "-//W3C//DTD XHTML 1.0 Strict//EN" && (systemId == "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"))
3874 || (publicId == "-//W3C//DTD XHTML 1.1//EN" && (systemId == "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"))
3875 ) {
3876 } else if (!((systemId == null || systemId == "about:legacy-compat") && publicId == null)) {
3877 tree.parseError("unknown-doctype");
3878 }
3879 }
3880 tree.setInsertionMode('beforeHTML');
3881 function publicIdStartsWith(string) {
3882 return publicId.toLowerCase().indexOf(string) === 0;
3883 }
3884 };
3885  
3886 modes.initial.processCharacters = function(buffer) {
3887 buffer.skipLeadingWhitespace();
3888 if (!buffer.length)
3889 return;
3890 tree.parseError('expected-doctype-but-got-chars');
3891 this.anythingElse();
3892 tree.insertionMode.processCharacters(buffer);
3893 };
3894  
3895 modes.initial.processStartTag = function(name, attributes, selfClosing) {
3896 tree.parseError('expected-doctype-but-got-start-tag', {name: name});
3897 this.anythingElse();
3898 tree.insertionMode.processStartTag(name, attributes, selfClosing);
3899 };
3900  
3901 modes.initial.processEndTag = function(name) {
3902 tree.parseError('expected-doctype-but-got-end-tag', {name: name});
3903 this.anythingElse();
3904 tree.insertionMode.processEndTag(name);
3905 };
3906  
3907 modes.initial.anythingElse = function() {
3908 tree.compatMode = 'quirks';
3909 tree.setInsertionMode('beforeHTML');
3910 };
3911  
3912 modes.beforeHTML = Object.create(modes.base);
3913  
3914 modes.beforeHTML.start_tag_handlers = {
3915 html: 'startTagHtml',
3916 '-default': 'startTagOther'
3917 };
3918  
3919 modes.beforeHTML.processEOF = function() {
3920 this.anythingElse();
3921 tree.insertionMode.processEOF();
3922 };
3923  
3924 modes.beforeHTML.processComment = function(data) {
3925 tree.insertComment(data, tree.document);
3926 };
3927  
3928 modes.beforeHTML.processCharacters = function(buffer) {
3929 buffer.skipLeadingWhitespace();
3930 if (!buffer.length)
3931 return;
3932 this.anythingElse();
3933 tree.insertionMode.processCharacters(buffer);
3934 };
3935  
3936 modes.beforeHTML.startTagHtml = function(name, attributes, selfClosing) {
3937 tree.insertHtmlElement(attributes);
3938 tree.setInsertionMode('beforeHead');
3939 };
3940  
3941 modes.beforeHTML.startTagOther = function(name, attributes, selfClosing) {
3942 this.anythingElse();
3943 tree.insertionMode.processStartTag(name, attributes, selfClosing);
3944 };
3945  
3946 modes.beforeHTML.processEndTag = function(name) {
3947 this.anythingElse();
3948 tree.insertionMode.processEndTag(name);
3949 };
3950  
3951 modes.beforeHTML.anythingElse = function() {
3952 tree.insertHtmlElement();
3953 tree.setInsertionMode('beforeHead');
3954 };
3955  
3956 modes.afterAfterBody = Object.create(modes.base);
3957  
3958 modes.afterAfterBody.start_tag_handlers = {
3959 html: 'startTagHtml',
3960 '-default': 'startTagOther'
3961 };
3962  
3963 modes.afterAfterBody.processComment = function(data) {
3964 tree.insertComment(data, tree.document);
3965 };
3966  
3967 modes.afterAfterBody.processDoctype = function(data) {
3968 modes.inBody.processDoctype(data);
3969 };
3970  
3971 modes.afterAfterBody.startTagHtml = function(data, attributes) {
3972 modes.inBody.startTagHtml(data, attributes);
3973 };
3974  
3975 modes.afterAfterBody.startTagOther = function(name, attributes, selfClosing) {
3976 tree.parseError('unexpected-start-tag', {name: name});
3977 tree.setInsertionMode('inBody');
3978 tree.insertionMode.processStartTag(name, attributes, selfClosing);
3979 };
3980  
3981 modes.afterAfterBody.endTagOther = function(name) {
3982 tree.parseError('unexpected-end-tag', {name: name});
3983 tree.setInsertionMode('inBody');
3984 tree.insertionMode.processEndTag(name);
3985 };
3986  
3987 modes.afterAfterBody.processCharacters = function(data) {
3988 if (!isAllWhitespace(data.characters)) {
3989 tree.parseError('unexpected-char-after-body');
3990 tree.setInsertionMode('inBody');
3991 return tree.insertionMode.processCharacters(data);
3992 }
3993 modes.inBody.processCharacters(data);
3994 };
3995  
3996 modes.afterBody = Object.create(modes.base);
3997  
3998 modes.afterBody.end_tag_handlers = {
3999 html: 'endTagHtml',
4000 '-default': 'endTagOther'
4001 };
4002  
4003 modes.afterBody.processComment = function(data) {
4004 tree.insertComment(data, tree.openElements.rootNode);
4005 };
4006  
4007 modes.afterBody.processCharacters = function(data) {
4008 if (!isAllWhitespace(data.characters)) {
4009 tree.parseError('unexpected-char-after-body');
4010 tree.setInsertionMode('inBody');
4011 return tree.insertionMode.processCharacters(data);
4012 }
4013 modes.inBody.processCharacters(data);
4014 };
4015  
4016 modes.afterBody.processStartTag = function(name, attributes, selfClosing) {
4017 tree.parseError('unexpected-start-tag-after-body', {name: name});
4018 tree.setInsertionMode('inBody');
4019 tree.insertionMode.processStartTag(name, attributes, selfClosing);
4020 };
4021  
4022 modes.afterBody.endTagHtml = function(name) {
4023 if (tree.context) {
4024 tree.parseError('end-html-in-innerhtml');
4025 } else {
4026 tree.setInsertionMode('afterAfterBody');
4027 }
4028 };
4029  
4030 modes.afterBody.endTagOther = function(name) {
4031 tree.parseError('unexpected-end-tag-after-body', {name: name});
4032 tree.setInsertionMode('inBody');
4033 tree.insertionMode.processEndTag(name);
4034 };
4035  
4036 modes.afterFrameset = Object.create(modes.base);
4037  
4038 modes.afterFrameset.start_tag_handlers = {
4039 html: 'startTagHtml',
4040 noframes: 'startTagNoframes',
4041 '-default': 'startTagOther'
4042 };
4043  
4044 modes.afterFrameset.end_tag_handlers = {
4045 html: 'endTagHtml',
4046 '-default': 'endTagOther'
4047 };
4048  
4049 modes.afterFrameset.processCharacters = function(buffer) {
4050 var characters = buffer.takeRemaining();
4051 var whitespace = "";
4052 for (var i = 0; i < characters.length; i++) {
4053 var ch = characters[i];
4054 if (isWhitespace(ch))
4055 whitespace += ch;
4056 }
4057 if (whitespace) {
4058 tree.insertText(whitespace);
4059 }
4060 if (whitespace.length < characters.length)
4061 tree.parseError('expected-eof-but-got-char');
4062 };
4063  
4064 modes.afterFrameset.startTagNoframes = function(name, attributes) {
4065 modes.inHead.processStartTag(name, attributes);
4066 };
4067  
4068 modes.afterFrameset.startTagOther = function(name, attributes) {
4069 tree.parseError("unexpected-start-tag-after-frameset", {name: name});
4070 };
4071  
4072 modes.afterFrameset.endTagHtml = function(name) {
4073 tree.setInsertionMode('afterAfterFrameset');
4074 };
4075  
4076 modes.afterFrameset.endTagOther = function(name) {
4077 tree.parseError("unexpected-end-tag-after-frameset", {name: name});
4078 };
4079  
4080 modes.beforeHead = Object.create(modes.base);
4081  
4082 modes.beforeHead.start_tag_handlers = {
4083 html: 'startTagHtml',
4084 head: 'startTagHead',
4085 '-default': 'startTagOther'
4086 };
4087  
4088 modes.beforeHead.end_tag_handlers = {
4089 html: 'endTagImplyHead',
4090 head: 'endTagImplyHead',
4091 body: 'endTagImplyHead',
4092 br: 'endTagImplyHead',
4093 '-default': 'endTagOther'
4094 };
4095  
4096 modes.beforeHead.processEOF = function() {
4097 this.startTagHead('head', []);
4098 tree.insertionMode.processEOF();
4099 };
4100  
4101 modes.beforeHead.processCharacters = function(buffer) {
4102 buffer.skipLeadingWhitespace();
4103 if (!buffer.length)
4104 return;
4105 this.startTagHead('head', []);
4106 tree.insertionMode.processCharacters(buffer);
4107 };
4108  
4109 modes.beforeHead.startTagHead = function(name, attributes) {
4110 tree.insertHeadElement(attributes);
4111 tree.setInsertionMode('inHead');
4112 };
4113  
4114 modes.beforeHead.startTagOther = function(name, attributes, selfClosing) {
4115 this.startTagHead('head', []);
4116 tree.insertionMode.processStartTag(name, attributes, selfClosing);
4117 };
4118  
4119 modes.beforeHead.endTagImplyHead = function(name) {
4120 this.startTagHead('head', []);
4121 tree.insertionMode.processEndTag(name);
4122 };
4123  
4124 modes.beforeHead.endTagOther = function(name) {
4125 tree.parseError('end-tag-after-implied-root', {name: name});
4126 };
4127  
4128 modes.inHead = Object.create(modes.base);
4129  
4130 modes.inHead.start_tag_handlers = {
4131 html: 'startTagHtml',
4132 head: 'startTagHead',
4133 title: 'startTagTitle',
4134 script: 'startTagScript',
4135 style: 'startTagNoFramesStyle',
4136 noscript: 'startTagNoScript',
4137 noframes: 'startTagNoFramesStyle',
4138 base: 'startTagBaseBasefontBgsoundLink',
4139 basefont: 'startTagBaseBasefontBgsoundLink',
4140 bgsound: 'startTagBaseBasefontBgsoundLink',
4141 link: 'startTagBaseBasefontBgsoundLink',
4142 meta: 'startTagMeta',
4143 "-default": 'startTagOther'
4144 };
4145  
4146 modes.inHead.end_tag_handlers = {
4147 head: 'endTagHead',
4148 html: 'endTagHtmlBodyBr',
4149 body: 'endTagHtmlBodyBr',
4150 br: 'endTagHtmlBodyBr',
4151 "-default": 'endTagOther'
4152 };
4153  
4154 modes.inHead.processEOF = function() {
4155 var name = tree.currentStackItem().localName;
4156 if (['title', 'style', 'script'].indexOf(name) != -1) {
4157 tree.parseError("expected-named-closing-tag-but-got-eof", {name: name});
4158 tree.popElement();
4159 }
4160  
4161 this.anythingElse();
4162  
4163 tree.insertionMode.processEOF();
4164 };
4165  
4166 modes.inHead.processCharacters = function(buffer) {
4167 var leadingWhitespace = buffer.takeLeadingWhitespace();
4168 if (leadingWhitespace)
4169 tree.insertText(leadingWhitespace);
4170 if (!buffer.length)
4171 return;
4172 this.anythingElse();
4173 tree.insertionMode.processCharacters(buffer);
4174 };
4175  
4176 modes.inHead.startTagHtml = function(name, attributes) {
4177 modes.inBody.processStartTag(name, attributes);
4178 };
4179  
4180 modes.inHead.startTagHead = function(name, attributes) {
4181 tree.parseError('two-heads-are-not-better-than-one');
4182 };
4183  
4184 modes.inHead.startTagTitle = function(name, attributes) {
4185 tree.processGenericRCDATAStartTag(name, attributes);
4186 };
4187  
4188 modes.inHead.startTagNoScript = function(name, attributes) {
4189 if (tree.scriptingEnabled)
4190 return tree.processGenericRawTextStartTag(name, attributes);
4191 tree.insertElement(name, attributes);
4192 tree.setInsertionMode('inHeadNoscript');
4193 };
4194  
4195 modes.inHead.startTagNoFramesStyle = function(name, attributes) {
4196 tree.processGenericRawTextStartTag(name, attributes);
4197 };
4198  
4199 modes.inHead.startTagScript = function(name, attributes) {
4200 tree.insertElement(name, attributes);
4201 tree.tokenizer.setState(Tokenizer.SCRIPT_DATA);
4202 tree.originalInsertionMode = tree.insertionModeName;
4203 tree.setInsertionMode('text');
4204 };
4205  
4206 modes.inHead.startTagBaseBasefontBgsoundLink = function(name, attributes) {
4207 tree.insertSelfClosingElement(name, attributes);
4208 };
4209  
4210 modes.inHead.startTagMeta = function(name, attributes) {
4211 tree.insertSelfClosingElement(name, attributes);
4212 };
4213  
4214 modes.inHead.startTagOther = function(name, attributes, selfClosing) {
4215 this.anythingElse();
4216 tree.insertionMode.processStartTag(name, attributes, selfClosing);
4217 };
4218  
4219 modes.inHead.endTagHead = function(name) {
4220 if (tree.openElements.item(tree.openElements.length - 1).localName == 'head') {
4221 tree.openElements.pop();
4222 } else {
4223 tree.parseError('unexpected-end-tag', {name: 'head'});
4224 }
4225 tree.setInsertionMode('afterHead');
4226 };
4227  
4228 modes.inHead.endTagHtmlBodyBr = function(name) {
4229 this.anythingElse();
4230 tree.insertionMode.processEndTag(name);
4231 };
4232  
4233 modes.inHead.endTagOther = function(name) {
4234 tree.parseError('unexpected-end-tag', {name: name});
4235 };
4236  
4237 modes.inHead.anythingElse = function() {
4238 this.endTagHead('head');
4239 };
4240  
4241 modes.afterHead = Object.create(modes.base);
4242  
4243 modes.afterHead.start_tag_handlers = {
4244 html: 'startTagHtml',
4245 head: 'startTagHead',
4246 body: 'startTagBody',
4247 frameset: 'startTagFrameset',
4248 base: 'startTagFromHead',
4249 link: 'startTagFromHead',
4250 meta: 'startTagFromHead',
4251 script: 'startTagFromHead',
4252 style: 'startTagFromHead',
4253 title: 'startTagFromHead',
4254 "-default": 'startTagOther'
4255 };
4256  
4257 modes.afterHead.end_tag_handlers = {
4258 body: 'endTagBodyHtmlBr',
4259 html: 'endTagBodyHtmlBr',
4260 br: 'endTagBodyHtmlBr',
4261 "-default": 'endTagOther'
4262 };
4263  
4264 modes.afterHead.processEOF = function() {
4265 this.anythingElse();
4266 tree.insertionMode.processEOF();
4267 };
4268  
4269 modes.afterHead.processCharacters = function(buffer) {
4270 var leadingWhitespace = buffer.takeLeadingWhitespace();
4271 if (leadingWhitespace)
4272 tree.insertText(leadingWhitespace);
4273 if (!buffer.length)
4274 return;
4275 this.anythingElse();
4276 tree.insertionMode.processCharacters(buffer);
4277 };
4278  
4279 modes.afterHead.startTagHtml = function(name, attributes) {
4280 modes.inBody.processStartTag(name, attributes);
4281 };
4282  
4283 modes.afterHead.startTagBody = function(name, attributes) {
4284 tree.framesetOk = false;
4285 tree.insertBodyElement(attributes);
4286 tree.setInsertionMode('inBody');
4287 };
4288  
4289 modes.afterHead.startTagFrameset = function(name, attributes) {
4290 tree.insertElement(name, attributes);
4291 tree.setInsertionMode('inFrameset');
4292 };
4293  
4294 modes.afterHead.startTagFromHead = function(name, attributes, selfClosing) {
4295 tree.parseError("unexpected-start-tag-out-of-my-head", {name: name});
4296 tree.openElements.push(tree.head);
4297 modes.inHead.processStartTag(name, attributes, selfClosing);
4298 tree.openElements.remove(tree.head);
4299 };
4300  
4301 modes.afterHead.startTagHead = function(name, attributes, selfClosing) {
4302 tree.parseError('unexpected-start-tag', {name: name});
4303 };
4304  
4305 modes.afterHead.startTagOther = function(name, attributes, selfClosing) {
4306 this.anythingElse();
4307 tree.insertionMode.processStartTag(name, attributes, selfClosing);
4308 };
4309  
4310 modes.afterHead.endTagBodyHtmlBr = function(name) {
4311 this.anythingElse();
4312 tree.insertionMode.processEndTag(name);
4313 };
4314  
4315 modes.afterHead.endTagOther = function(name) {
4316 tree.parseError('unexpected-end-tag', {name: name});
4317 };
4318  
4319 modes.afterHead.anythingElse = function() {
4320 tree.insertBodyElement([]);
4321 tree.setInsertionMode('inBody');
4322 tree.framesetOk = true;
4323 }
4324  
4325 modes.inBody = Object.create(modes.base);
4326  
4327 modes.inBody.start_tag_handlers = {
4328 html: 'startTagHtml',
4329 head: 'startTagMisplaced',
4330 base: 'startTagProcessInHead',
4331 basefont: 'startTagProcessInHead',
4332 bgsound: 'startTagProcessInHead',
4333 link: 'startTagProcessInHead',
4334 meta: 'startTagProcessInHead',
4335 noframes: 'startTagProcessInHead',
4336 script: 'startTagProcessInHead',
4337 style: 'startTagProcessInHead',
4338 title: 'startTagProcessInHead',
4339 body: 'startTagBody',
4340 form: 'startTagForm',
4341 plaintext: 'startTagPlaintext',
4342 a: 'startTagA',
4343 button: 'startTagButton',
4344 xmp: 'startTagXmp',
4345 table: 'startTagTable',
4346 hr: 'startTagHr',
4347 image: 'startTagImage',
4348 input: 'startTagInput',
4349 textarea: 'startTagTextarea',
4350 select: 'startTagSelect',
4351 isindex: 'startTagIsindex',
4352 applet: 'startTagAppletMarqueeObject',
4353 marquee: 'startTagAppletMarqueeObject',
4354 object: 'startTagAppletMarqueeObject',
4355 li: 'startTagListItem',
4356 dd: 'startTagListItem',
4357 dt: 'startTagListItem',
4358 address: 'startTagCloseP',
4359 article: 'startTagCloseP',
4360 aside: 'startTagCloseP',
4361 blockquote: 'startTagCloseP',
4362 center: 'startTagCloseP',
4363 details: 'startTagCloseP',
4364 dir: 'startTagCloseP',
4365 div: 'startTagCloseP',
4366 dl: 'startTagCloseP',
4367 fieldset: 'startTagCloseP',
4368 figcaption: 'startTagCloseP',
4369 figure: 'startTagCloseP',
4370 footer: 'startTagCloseP',
4371 header: 'startTagCloseP',
4372 hgroup: 'startTagCloseP',
4373 main: 'startTagCloseP',
4374 menu: 'startTagCloseP',
4375 nav: 'startTagCloseP',
4376 ol: 'startTagCloseP',
4377 p: 'startTagCloseP',
4378 section: 'startTagCloseP',
4379 summary: 'startTagCloseP',
4380 ul: 'startTagCloseP',
4381 listing: 'startTagPreListing',
4382 pre: 'startTagPreListing',
4383 b: 'startTagFormatting',
4384 big: 'startTagFormatting',
4385 code: 'startTagFormatting',
4386 em: 'startTagFormatting',
4387 font: 'startTagFormatting',
4388 i: 'startTagFormatting',
4389 s: 'startTagFormatting',
4390 small: 'startTagFormatting',
4391 strike: 'startTagFormatting',
4392 strong: 'startTagFormatting',
4393 tt: 'startTagFormatting',
4394 u: 'startTagFormatting',
4395 nobr: 'startTagNobr',
4396 area: 'startTagVoidFormatting',
4397 br: 'startTagVoidFormatting',
4398 embed: 'startTagVoidFormatting',
4399 img: 'startTagVoidFormatting',
4400 keygen: 'startTagVoidFormatting',
4401 wbr: 'startTagVoidFormatting',
4402 param: 'startTagParamSourceTrack',
4403 source: 'startTagParamSourceTrack',
4404 track: 'startTagParamSourceTrack',
4405 iframe: 'startTagIFrame',
4406 noembed: 'startTagRawText',
4407 noscript: 'startTagRawText',
4408 h1: 'startTagHeading',
4409 h2: 'startTagHeading',
4410 h3: 'startTagHeading',
4411 h4: 'startTagHeading',
4412 h5: 'startTagHeading',
4413 h6: 'startTagHeading',
4414 caption: 'startTagMisplaced',
4415 col: 'startTagMisplaced',
4416 colgroup: 'startTagMisplaced',
4417 frame: 'startTagMisplaced',
4418 frameset: 'startTagFrameset',
4419 tbody: 'startTagMisplaced',
4420 td: 'startTagMisplaced',
4421 tfoot: 'startTagMisplaced',
4422 th: 'startTagMisplaced',
4423 thead: 'startTagMisplaced',
4424 tr: 'startTagMisplaced',
4425 option: 'startTagOptionOptgroup',
4426 optgroup: 'startTagOptionOptgroup',
4427 math: 'startTagMath',
4428 svg: 'startTagSVG',
4429 rt: 'startTagRpRt',
4430 rp: 'startTagRpRt',
4431 "-default": 'startTagOther'
4432 };
4433  
4434 modes.inBody.end_tag_handlers = {
4435 p: 'endTagP',
4436 body: 'endTagBody',
4437 html: 'endTagHtml',
4438 address: 'endTagBlock',
4439 article: 'endTagBlock',
4440 aside: 'endTagBlock',
4441 blockquote: 'endTagBlock',
4442 button: 'endTagBlock',
4443 center: 'endTagBlock',
4444 details: 'endTagBlock',
4445 dir: 'endTagBlock',
4446 div: 'endTagBlock',
4447 dl: 'endTagBlock',
4448 fieldset: 'endTagBlock',
4449 figcaption: 'endTagBlock',
4450 figure: 'endTagBlock',
4451 footer: 'endTagBlock',
4452 header: 'endTagBlock',
4453 hgroup: 'endTagBlock',
4454 listing: 'endTagBlock',
4455 main: 'endTagBlock',
4456 menu: 'endTagBlock',
4457 nav: 'endTagBlock',
4458 ol: 'endTagBlock',
4459 pre: 'endTagBlock',
4460 section: 'endTagBlock',
4461 summary: 'endTagBlock',
4462 ul: 'endTagBlock',
4463 form: 'endTagForm',
4464 applet: 'endTagAppletMarqueeObject',
4465 marquee: 'endTagAppletMarqueeObject',
4466 object: 'endTagAppletMarqueeObject',
4467 dd: 'endTagListItem',
4468 dt: 'endTagListItem',
4469 li: 'endTagListItem',
4470 h1: 'endTagHeading',
4471 h2: 'endTagHeading',
4472 h3: 'endTagHeading',
4473 h4: 'endTagHeading',
4474 h5: 'endTagHeading',
4475 h6: 'endTagHeading',
4476 a: 'endTagFormatting',
4477 b: 'endTagFormatting',
4478 big: 'endTagFormatting',
4479 code: 'endTagFormatting',
4480 em: 'endTagFormatting',
4481 font: 'endTagFormatting',
4482 i: 'endTagFormatting',
4483 nobr: 'endTagFormatting',
4484 s: 'endTagFormatting',
4485 small: 'endTagFormatting',
4486 strike: 'endTagFormatting',
4487 strong: 'endTagFormatting',
4488 tt: 'endTagFormatting',
4489 u: 'endTagFormatting',
4490 br: 'endTagBr',
4491 "-default": 'endTagOther'
4492 };
4493  
4494 modes.inBody.processCharacters = function(buffer) {
4495 if (tree.shouldSkipLeadingNewline) {
4496 tree.shouldSkipLeadingNewline = false;
4497 buffer.skipAtMostOneLeadingNewline();
4498 }
4499 tree.reconstructActiveFormattingElements();
4500 var characters = buffer.takeRemaining();
4501 characters = characters.replace(/\u0000/g, function(match, index){
4502 tree.parseError("invalid-codepoint");
4503 return '';
4504 });
4505 if (!characters)
4506 return;
4507 tree.insertText(characters);
4508 if (tree.framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))
4509 tree.framesetOk = false;
4510 };
4511  
4512 modes.inBody.startTagHtml = function(name, attributes) {
4513 tree.parseError('non-html-root');
4514 tree.addAttributesToElement(tree.openElements.rootNode, attributes);
4515 };
4516  
4517 modes.inBody.startTagProcessInHead = function(name, attributes) {
4518 modes.inHead.processStartTag(name, attributes);
4519 };
4520  
4521 modes.inBody.startTagBody = function(name, attributes) {
4522 tree.parseError('unexpected-start-tag', {name: 'body'});
4523 if (tree.openElements.length == 1 ||
4524 tree.openElements.item(1).localName != 'body') {
4525 assert.ok(tree.context);
4526 } else {
4527 tree.framesetOk = false;
4528 tree.addAttributesToElement(tree.openElements.bodyElement, attributes);
4529 }
4530 };
4531  
4532 modes.inBody.startTagFrameset = function(name, attributes) {
4533 tree.parseError('unexpected-start-tag', {name: 'frameset'});
4534 if (tree.openElements.length == 1 ||
4535 tree.openElements.item(1).localName != 'body') {
4536 assert.ok(tree.context);
4537 } else if (tree.framesetOk) {
4538 tree.detachFromParent(tree.openElements.bodyElement);
4539 while (tree.openElements.length > 1)
4540 tree.openElements.pop();
4541 tree.insertElement(name, attributes);
4542 tree.setInsertionMode('inFrameset');
4543 }
4544 };
4545  
4546 modes.inBody.startTagCloseP = function(name, attributes) {
4547 if (tree.openElements.inButtonScope('p'))
4548 this.endTagP('p');
4549 tree.insertElement(name, attributes);
4550 };
4551  
4552 modes.inBody.startTagPreListing = function(name, attributes) {
4553 if (tree.openElements.inButtonScope('p'))
4554 this.endTagP('p');
4555 tree.insertElement(name, attributes);
4556 tree.framesetOk = false;
4557 tree.shouldSkipLeadingNewline = true;
4558 };
4559  
4560 modes.inBody.startTagForm = function(name, attributes) {
4561 if (tree.form) {
4562 tree.parseError('unexpected-start-tag', {name: name});
4563 } else {
4564 if (tree.openElements.inButtonScope('p'))
4565 this.endTagP('p');
4566 tree.insertElement(name, attributes);
4567 tree.form = tree.currentStackItem();
4568 }
4569 };
4570  
4571 modes.inBody.startTagRpRt = function(name, attributes) {
4572 if (tree.openElements.inScope('ruby')) {
4573 tree.generateImpliedEndTags();
4574 if (tree.currentStackItem().localName != 'ruby') {
4575 tree.parseError('unexpected-start-tag', {name: name});
4576 }
4577 }
4578 tree.insertElement(name, attributes);
4579 };
4580  
4581 modes.inBody.startTagListItem = function(name, attributes) {
4582 var stopNames = {li: ['li'], dd: ['dd', 'dt'], dt: ['dd', 'dt']};
4583 var stopName = stopNames[name];
4584  
4585 var els = tree.openElements;
4586 for (var i = els.length - 1; i >= 0; i--) {
4587 var node = els.item(i);
4588 if (stopName.indexOf(node.localName) != -1) {
4589 tree.insertionMode.processEndTag(node.localName);
4590 break;
4591 }
4592 if (node.isSpecial() && node.localName !== 'p' && node.localName !== 'address' && node.localName !== 'div')
4593 break;
4594 }
4595 if (tree.openElements.inButtonScope('p'))
4596 this.endTagP('p');
4597 tree.insertElement(name, attributes);
4598 tree.framesetOk = false;
4599 };
4600  
4601 modes.inBody.startTagPlaintext = function(name, attributes) {
4602 if (tree.openElements.inButtonScope('p'))
4603 this.endTagP('p');
4604 tree.insertElement(name, attributes);
4605 tree.tokenizer.setState(Tokenizer.PLAINTEXT);
4606 };
4607  
4608 modes.inBody.startTagHeading = function(name, attributes) {
4609 if (tree.openElements.inButtonScope('p'))
4610 this.endTagP('p');
4611 if (tree.currentStackItem().isNumberedHeader()) {
4612 tree.parseError('unexpected-start-tag', {name: name});
4613 tree.popElement();
4614 }
4615 tree.insertElement(name, attributes);
4616 };
4617  
4618 modes.inBody.startTagA = function(name, attributes) {
4619 var activeA = tree.elementInActiveFormattingElements('a');
4620 if (activeA) {
4621 tree.parseError("unexpected-start-tag-implies-end-tag", {startName: "a", endName: "a"});
4622 tree.adoptionAgencyEndTag('a');
4623 if (tree.openElements.contains(activeA))
4624 tree.openElements.remove(activeA);
4625 tree.removeElementFromActiveFormattingElements(activeA);
4626 }
4627 tree.reconstructActiveFormattingElements();
4628 tree.insertFormattingElement(name, attributes);
4629 };
4630  
4631 modes.inBody.startTagFormatting = function(name, attributes) {
4632 tree.reconstructActiveFormattingElements();
4633 tree.insertFormattingElement(name, attributes);
4634 };
4635  
4636 modes.inBody.startTagNobr = function(name, attributes) {
4637 tree.reconstructActiveFormattingElements();
4638 if (tree.openElements.inScope('nobr')) {
4639 tree.parseError("unexpected-start-tag-implies-end-tag", {startName: 'nobr', endName: 'nobr'});
4640 this.processEndTag('nobr');
4641 tree.reconstructActiveFormattingElements();
4642 }
4643 tree.insertFormattingElement(name, attributes);
4644 };
4645  
4646 modes.inBody.startTagButton = function(name, attributes) {
4647 if (tree.openElements.inScope('button')) {
4648 tree.parseError('unexpected-start-tag-implies-end-tag', {startName: 'button', endName: 'button'});
4649 this.processEndTag('button');
4650 tree.insertionMode.processStartTag(name, attributes);
4651 } else {
4652 tree.framesetOk = false;
4653 tree.reconstructActiveFormattingElements();
4654 tree.insertElement(name, attributes);
4655 }
4656 };
4657  
4658 modes.inBody.startTagAppletMarqueeObject = function(name, attributes) {
4659 tree.reconstructActiveFormattingElements();
4660 tree.insertElement(name, attributes);
4661 tree.activeFormattingElements.push(Marker);
4662 tree.framesetOk = false;
4663 };
4664  
4665 modes.inBody.endTagAppletMarqueeObject = function(name) {
4666 if (!tree.openElements.inScope(name)) {
4667 tree.parseError("unexpected-end-tag", {name: name});
4668 } else {
4669 tree.generateImpliedEndTags();
4670 if (tree.currentStackItem().localName != name) {
4671 tree.parseError('end-tag-too-early', {name: name});
4672 }
4673 tree.openElements.popUntilPopped(name);
4674 tree.clearActiveFormattingElements();
4675 }
4676 };
4677  
4678 modes.inBody.startTagXmp = function(name, attributes) {
4679 if (tree.openElements.inButtonScope('p'))
4680 this.processEndTag('p');
4681 tree.reconstructActiveFormattingElements();
4682 tree.processGenericRawTextStartTag(name, attributes);
4683 tree.framesetOk = false;
4684 };
4685  
4686 modes.inBody.startTagTable = function(name, attributes) {
4687 if (tree.compatMode !== "quirks")
4688 if (tree.openElements.inButtonScope('p'))
4689 this.processEndTag('p');
4690 tree.insertElement(name, attributes);
4691 tree.setInsertionMode('inTable');
4692 tree.framesetOk = false;
4693 };
4694  
4695 modes.inBody.startTagVoidFormatting = function(name, attributes) {
4696 tree.reconstructActiveFormattingElements();
4697 tree.insertSelfClosingElement(name, attributes);
4698 tree.framesetOk = false;
4699 };
4700  
4701 modes.inBody.startTagParamSourceTrack = function(name, attributes) {
4702 tree.insertSelfClosingElement(name, attributes);
4703 };
4704  
4705 modes.inBody.startTagHr = function(name, attributes) {
4706 if (tree.openElements.inButtonScope('p'))
4707 this.endTagP('p');
4708 tree.insertSelfClosingElement(name, attributes);
4709 tree.framesetOk = false;
4710 };
4711  
4712 modes.inBody.startTagImage = function(name, attributes) {
4713 tree.parseError('unexpected-start-tag-treated-as', {originalName: 'image', newName: 'img'});
4714 this.processStartTag('img', attributes);
4715 };
4716  
4717 modes.inBody.startTagInput = function(name, attributes) {
4718 var currentFramesetOk = tree.framesetOk;
4719 this.startTagVoidFormatting(name, attributes);
4720 for (var key in attributes) {
4721 if (attributes[key].nodeName == 'type') {
4722 if (attributes[key].nodeValue.toLowerCase() == 'hidden')
4723 tree.framesetOk = currentFramesetOk;
4724 break;
4725 }
4726 }
4727 };
4728  
4729 modes.inBody.startTagIsindex = function(name, attributes) {
4730 tree.parseError('deprecated-tag', {name: 'isindex'});
4731 tree.selfClosingFlagAcknowledged = true;
4732 if (tree.form)
4733 return;
4734 var formAttributes = [];
4735 var inputAttributes = [];
4736 var prompt = "This is a searchable index. Enter search keywords: ";
4737 for (var key in attributes) {
4738 switch (attributes[key].nodeName) {
4739 case 'action':
4740 formAttributes.push({nodeName: 'action',
4741 nodeValue: attributes[key].nodeValue});
4742 break;
4743 case 'prompt':
4744 prompt = attributes[key].nodeValue;
4745 break;
4746 case 'name':
4747 break;
4748 default:
4749 inputAttributes.push({nodeName: attributes[key].nodeName,
4750 nodeValue: attributes[key].nodeValue});
4751 }
4752 }
4753 inputAttributes.push({nodeName: 'name', nodeValue: 'isindex'});
4754 this.processStartTag('form', formAttributes);
4755 this.processStartTag('hr');
4756 this.processStartTag('label');
4757 this.processCharacters(new CharacterBuffer(prompt));
4758 this.processStartTag('input', inputAttributes);
4759 this.processEndTag('label');
4760 this.processStartTag('hr');
4761 this.processEndTag('form');
4762 };
4763  
4764 modes.inBody.startTagTextarea = function(name, attributes) {
4765 tree.insertElement(name, attributes);
4766 tree.tokenizer.setState(Tokenizer.RCDATA);
4767 tree.originalInsertionMode = tree.insertionModeName;
4768 tree.shouldSkipLeadingNewline = true;
4769 tree.framesetOk = false;
4770 tree.setInsertionMode('text');
4771 };
4772  
4773 modes.inBody.startTagIFrame = function(name, attributes) {
4774 tree.framesetOk = false;
4775 this.startTagRawText(name, attributes);
4776 };
4777  
4778 modes.inBody.startTagRawText = function(name, attributes) {
4779 tree.processGenericRawTextStartTag(name, attributes);
4780 };
4781  
4782 modes.inBody.startTagSelect = function(name, attributes) {
4783 tree.reconstructActiveFormattingElements();
4784 tree.insertElement(name, attributes);
4785 tree.framesetOk = false;
4786 var insertionModeName = tree.insertionModeName;
4787 if (insertionModeName == 'inTable' ||
4788 insertionModeName == 'inCaption' ||
4789 insertionModeName == 'inColumnGroup' ||
4790 insertionModeName == 'inTableBody' ||
4791 insertionModeName == 'inRow' ||
4792 insertionModeName == 'inCell') {
4793 tree.setInsertionMode('inSelectInTable');
4794 } else {
4795 tree.setInsertionMode('inSelect');
4796 }
4797 };
4798  
4799 modes.inBody.startTagMisplaced = function(name, attributes) {
4800 tree.parseError('unexpected-start-tag-ignored', {name: name});
4801 };
4802  
4803 modes.inBody.endTagMisplaced = function(name) {
4804 tree.parseError("unexpected-end-tag", {name: name});
4805 };
4806  
4807 modes.inBody.endTagBr = function(name) {
4808 tree.parseError("unexpected-end-tag-treated-as", {originalName: "br", newName: "br element"});
4809 tree.reconstructActiveFormattingElements();
4810 tree.insertElement(name, []);
4811 tree.popElement();
4812 };
4813  
4814 modes.inBody.startTagOptionOptgroup = function(name, attributes) {
4815 if (tree.currentStackItem().localName == 'option')
4816 tree.popElement();
4817 tree.reconstructActiveFormattingElements();
4818 tree.insertElement(name, attributes);
4819 };
4820  
4821 modes.inBody.startTagOther = function(name, attributes) {
4822 tree.reconstructActiveFormattingElements();
4823 tree.insertElement(name, attributes);
4824 };
4825  
4826 modes.inBody.endTagOther = function(name) {
4827 var node;
4828 for (var i = tree.openElements.length - 1; i > 0; i--) {
4829 node = tree.openElements.item(i);
4830 if (node.localName == name) {
4831 tree.generateImpliedEndTags(name);
4832 if (tree.currentStackItem().localName != name)
4833 tree.parseError('unexpected-end-tag', {name: name});
4834 tree.openElements.remove_openElements_until(function(x) {return x === node;});
4835 break;
4836 }
4837 if (node.isSpecial()) {
4838 tree.parseError('unexpected-end-tag', {name: name});
4839 break;
4840 }
4841 }
4842 };
4843  
4844 modes.inBody.startTagMath = function(name, attributes, selfClosing) {
4845 tree.reconstructActiveFormattingElements();
4846 attributes = tree.adjustMathMLAttributes(attributes);
4847 attributes = tree.adjustForeignAttributes(attributes);
4848 tree.insertForeignElement(name, attributes, "http://www.w3.org/1998/Math/MathML", selfClosing);
4849 };
4850  
4851 modes.inBody.startTagSVG = function(name, attributes, selfClosing) {
4852 tree.reconstructActiveFormattingElements();
4853 attributes = tree.adjustSVGAttributes(attributes);
4854 attributes = tree.adjustForeignAttributes(attributes);
4855 tree.insertForeignElement(name, attributes, "http://www.w3.org/2000/svg", selfClosing);
4856 };
4857  
4858 modes.inBody.endTagP = function(name) {
4859 if (!tree.openElements.inButtonScope('p')) {
4860 tree.parseError('unexpected-end-tag', {name: 'p'});
4861 this.startTagCloseP('p', []);
4862 this.endTagP('p');
4863 } else {
4864 tree.generateImpliedEndTags('p');
4865 if (tree.currentStackItem().localName != 'p')
4866 tree.parseError('unexpected-implied-end-tag', {name: 'p'});
4867 tree.openElements.popUntilPopped(name);
4868 }
4869 };
4870  
4871 modes.inBody.endTagBody = function(name) {
4872 if (!tree.openElements.inScope('body')) {
4873 tree.parseError('unexpected-end-tag', {name: name});
4874 return;
4875 }
4876 if (tree.currentStackItem().localName != 'body') {
4877 tree.parseError('expected-one-end-tag-but-got-another', {
4878 expectedName: tree.currentStackItem().localName,
4879 gotName: name
4880 });
4881 }
4882 tree.setInsertionMode('afterBody');
4883 };
4884  
4885 modes.inBody.endTagHtml = function(name) {
4886 if (!tree.openElements.inScope('body')) {
4887 tree.parseError('unexpected-end-tag', {name: name});
4888 return;
4889 }
4890 if (tree.currentStackItem().localName != 'body') {
4891 tree.parseError('expected-one-end-tag-but-got-another', {
4892 expectedName: tree.currentStackItem().localName,
4893 gotName: name
4894 });
4895 }
4896 tree.setInsertionMode('afterBody');
4897 tree.insertionMode.processEndTag(name);
4898 };
4899  
4900 modes.inBody.endTagBlock = function(name) {
4901 if (!tree.openElements.inScope(name)) {
4902 tree.parseError('unexpected-end-tag', {name: name});
4903 } else {
4904 tree.generateImpliedEndTags();
4905 if (tree.currentStackItem().localName != name) {
4906 tree.parseError('end-tag-too-early', {name: name});
4907 }
4908 tree.openElements.popUntilPopped(name);
4909 }
4910 };
4911  
4912 modes.inBody.endTagForm = function(name) {
4913 var node = tree.form;
4914 tree.form = null;
4915 if (!node || !tree.openElements.inScope(name)) {
4916 tree.parseError('unexpected-end-tag', {name: name});
4917 } else {
4918 tree.generateImpliedEndTags();
4919 if (tree.currentStackItem() != node) {
4920 tree.parseError('end-tag-too-early-ignored', {name: 'form'});
4921 }
4922 tree.openElements.remove(node);
4923 }
4924 };
4925  
4926 modes.inBody.endTagListItem = function(name) {
4927 if (!tree.openElements.inListItemScope(name)) {
4928 tree.parseError('unexpected-end-tag', {name: name});
4929 } else {
4930 tree.generateImpliedEndTags(name);
4931 if (tree.currentStackItem().localName != name)
4932 tree.parseError('end-tag-too-early', {name: name});
4933 tree.openElements.popUntilPopped(name);
4934 }
4935 };
4936  
4937 modes.inBody.endTagHeading = function(name) {
4938 if (!tree.openElements.hasNumberedHeaderElementInScope()) {
4939 tree.parseError('unexpected-end-tag', {name: name});
4940 return;
4941 }
4942 tree.generateImpliedEndTags();
4943 if (tree.currentStackItem().localName != name)
4944 tree.parseError('end-tag-too-early', {name: name});
4945  
4946 tree.openElements.remove_openElements_until(function(e) {
4947 return e.isNumberedHeader();
4948 });
4949 };
4950  
4951 modes.inBody.endTagFormatting = function(name, attributes) {
4952 if (!tree.adoptionAgencyEndTag(name))
4953 this.endTagOther(name, attributes);
4954 };
4955  
4956 modes.inCaption = Object.create(modes.base);
4957  
4958 modes.inCaption.start_tag_handlers = {
4959 html: 'startTagHtml',
4960 caption: 'startTagTableElement',
4961 col: 'startTagTableElement',
4962 colgroup: 'startTagTableElement',
4963 tbody: 'startTagTableElement',
4964 td: 'startTagTableElement',
4965 tfoot: 'startTagTableElement',
4966 thead: 'startTagTableElement',
4967 tr: 'startTagTableElement',
4968 '-default': 'startTagOther'
4969 };
4970  
4971 modes.inCaption.end_tag_handlers = {
4972 caption: 'endTagCaption',
4973 table: 'endTagTable',
4974 body: 'endTagIgnore',
4975 col: 'endTagIgnore',
4976 colgroup: 'endTagIgnore',
4977 html: 'endTagIgnore',
4978 tbody: 'endTagIgnore',
4979 td: 'endTagIgnore',
4980 tfood: 'endTagIgnore',
4981 thead: 'endTagIgnore',
4982 tr: 'endTagIgnore',
4983 '-default': 'endTagOther'
4984 };
4985  
4986 modes.inCaption.processCharacters = function(data) {
4987 modes.inBody.processCharacters(data);
4988 };
4989  
4990 modes.inCaption.startTagTableElement = function(name, attributes) {
4991 tree.parseError('unexpected-end-tag', {name: name});
4992 var ignoreEndTag = !tree.openElements.inTableScope('caption');
4993 tree.insertionMode.processEndTag('caption');
4994 if (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes);
4995 };
4996  
4997 modes.inCaption.startTagOther = function(name, attributes, selfClosing) {
4998 modes.inBody.processStartTag(name, attributes, selfClosing);
4999 };
5000  
5001 modes.inCaption.endTagCaption = function(name) {
5002 if (!tree.openElements.inTableScope('caption')) {
5003 assert.ok(tree.context);
5004 tree.parseError('unexpected-end-tag', {name: name});
5005 } else {
5006 tree.generateImpliedEndTags();
5007 if (tree.currentStackItem().localName != 'caption') {
5008 tree.parseError('expected-one-end-tag-but-got-another', {
5009 gotName: "caption",
5010 expectedName: tree.currentStackItem().localName
5011 });
5012 }
5013 tree.openElements.popUntilPopped('caption');
5014 tree.clearActiveFormattingElements();
5015 tree.setInsertionMode('inTable');
5016 }
5017 };
5018  
5019 modes.inCaption.endTagTable = function(name) {
5020 tree.parseError("unexpected-end-table-in-caption");
5021 var ignoreEndTag = !tree.openElements.inTableScope('caption');
5022 tree.insertionMode.processEndTag('caption');
5023 if (!ignoreEndTag) tree.insertionMode.processEndTag(name);
5024 };
5025  
5026 modes.inCaption.endTagIgnore = function(name) {
5027 tree.parseError('unexpected-end-tag', {name: name});
5028 };
5029  
5030 modes.inCaption.endTagOther = function(name) {
5031 modes.inBody.processEndTag(name);
5032 };
5033  
5034 modes.inCell = Object.create(modes.base);
5035  
5036 modes.inCell.start_tag_handlers = {
5037 html: 'startTagHtml',
5038 caption: 'startTagTableOther',
5039 col: 'startTagTableOther',
5040 colgroup: 'startTagTableOther',
5041 tbody: 'startTagTableOther',
5042 td: 'startTagTableOther',
5043 tfoot: 'startTagTableOther',
5044 th: 'startTagTableOther',
5045 thead: 'startTagTableOther',
5046 tr: 'startTagTableOther',
5047 '-default': 'startTagOther'
5048 };
5049  
5050 modes.inCell.end_tag_handlers = {
5051 td: 'endTagTableCell',
5052 th: 'endTagTableCell',
5053 body: 'endTagIgnore',
5054 caption: 'endTagIgnore',
5055 col: 'endTagIgnore',
5056 colgroup: 'endTagIgnore',
5057 html: 'endTagIgnore',
5058 table: 'endTagImply',
5059 tbody: 'endTagImply',
5060 tfoot: 'endTagImply',
5061 thead: 'endTagImply',
5062 tr: 'endTagImply',
5063 '-default': 'endTagOther'
5064 };
5065  
5066 modes.inCell.processCharacters = function(data) {
5067 modes.inBody.processCharacters(data);
5068 };
5069  
5070 modes.inCell.startTagTableOther = function(name, attributes, selfClosing) {
5071 if (tree.openElements.inTableScope('td') || tree.openElements.inTableScope('th')) {
5072 this.closeCell();
5073 tree.insertionMode.processStartTag(name, attributes, selfClosing);
5074 } else {
5075 tree.parseError('unexpected-start-tag', {name: name});
5076 }
5077 };
5078  
5079 modes.inCell.startTagOther = function(name, attributes, selfClosing) {
5080 modes.inBody.processStartTag(name, attributes, selfClosing);
5081 };
5082  
5083 modes.inCell.endTagTableCell = function(name) {
5084 if (tree.openElements.inTableScope(name)) {
5085 tree.generateImpliedEndTags(name);
5086 if (tree.currentStackItem().localName != name.toLowerCase()) {
5087 tree.parseError('unexpected-cell-end-tag', {name: name});
5088 tree.openElements.popUntilPopped(name);
5089 } else {
5090 tree.popElement();
5091 }
5092 tree.clearActiveFormattingElements();
5093 tree.setInsertionMode('inRow');
5094 } else {
5095 tree.parseError('unexpected-end-tag', {name: name});
5096 }
5097 };
5098  
5099 modes.inCell.endTagIgnore = function(name) {
5100 tree.parseError('unexpected-end-tag', {name: name});
5101 };
5102  
5103 modes.inCell.endTagImply = function(name) {
5104 if (tree.openElements.inTableScope(name)) {
5105 this.closeCell();
5106 tree.insertionMode.processEndTag(name);
5107 } else {
5108 tree.parseError('unexpected-end-tag', {name: name});
5109 }
5110 };
5111  
5112 modes.inCell.endTagOther = function(name) {
5113 modes.inBody.processEndTag(name);
5114 };
5115  
5116 modes.inCell.closeCell = function() {
5117 if (tree.openElements.inTableScope('td')) {
5118 this.endTagTableCell('td');
5119 } else if (tree.openElements.inTableScope('th')) {
5120 this.endTagTableCell('th');
5121 }
5122 };
5123  
5124  
5125 modes.inColumnGroup = Object.create(modes.base);
5126  
5127 modes.inColumnGroup.start_tag_handlers = {
5128 html: 'startTagHtml',
5129 col: 'startTagCol',
5130 '-default': 'startTagOther'
5131 };
5132  
5133 modes.inColumnGroup.end_tag_handlers = {
5134 colgroup: 'endTagColgroup',
5135 col: 'endTagCol',
5136 '-default': 'endTagOther'
5137 };
5138  
5139 modes.inColumnGroup.ignoreEndTagColgroup = function() {
5140 return tree.currentStackItem().localName == 'html';
5141 };
5142  
5143 modes.inColumnGroup.processCharacters = function(buffer) {
5144 var leadingWhitespace = buffer.takeLeadingWhitespace();
5145 if (leadingWhitespace)
5146 tree.insertText(leadingWhitespace);
5147 if (!buffer.length)
5148 return;
5149 var ignoreEndTag = this.ignoreEndTagColgroup();
5150 this.endTagColgroup('colgroup');
5151 if (!ignoreEndTag) tree.insertionMode.processCharacters(buffer);
5152 };
5153  
5154 modes.inColumnGroup.startTagCol = function(name, attributes) {
5155 tree.insertSelfClosingElement(name, attributes);
5156 };
5157  
5158 modes.inColumnGroup.startTagOther = function(name, attributes, selfClosing) {
5159 var ignoreEndTag = this.ignoreEndTagColgroup();
5160 this.endTagColgroup('colgroup');
5161 if (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes, selfClosing);
5162 };
5163  
5164 modes.inColumnGroup.endTagColgroup = function(name) {
5165 if (this.ignoreEndTagColgroup()) {
5166 assert.ok(tree.context);
5167 tree.parseError('unexpected-end-tag', {name: name});
5168 } else {
5169 tree.popElement();
5170 tree.setInsertionMode('inTable');
5171 }
5172 };
5173  
5174 modes.inColumnGroup.endTagCol = function(name) {
5175 tree.parseError("no-end-tag", {name: 'col'});
5176 };
5177  
5178 modes.inColumnGroup.endTagOther = function(name) {
5179 var ignoreEndTag = this.ignoreEndTagColgroup();
5180 this.endTagColgroup('colgroup');
5181 if (!ignoreEndTag) tree.insertionMode.processEndTag(name) ;
5182 };
5183  
5184 modes.inForeignContent = Object.create(modes.base);
5185  
5186 modes.inForeignContent.processStartTag = function(name, attributes, selfClosing) {
5187 if (['b', 'big', 'blockquote', 'body', 'br', 'center', 'code', 'dd', 'div', 'dl', 'dt', 'em', 'embed', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'i', 'img', 'li', 'listing', 'menu', 'meta', 'nobr', 'ol', 'p', 'pre', 'ruby', 's', 'small', 'span', 'strong', 'strike', 'sub', 'sup', 'table', 'tt', 'u', 'ul', 'var'].indexOf(name) != -1
5188 || (name == 'font' && attributes.some(function(attr){ return ['color', 'face', 'size'].indexOf(attr.nodeName) >= 0 }))) {
5189 tree.parseError('unexpected-html-element-in-foreign-content', {name: name});
5190 while (tree.currentStackItem().isForeign()
5191 && !tree.currentStackItem().isHtmlIntegrationPoint()
5192 && !tree.currentStackItem().isMathMLTextIntegrationPoint()) {
5193 tree.openElements.pop();
5194 }
5195 tree.insertionMode.processStartTag(name, attributes, selfClosing);
5196 return;
5197 }
5198 if (tree.currentStackItem().namespaceURI == "http://www.w3.org/1998/Math/MathML") {
5199 attributes = tree.adjustMathMLAttributes(attributes);
5200 }
5201 if (tree.currentStackItem().namespaceURI == "http://www.w3.org/2000/svg") {
5202 name = tree.adjustSVGTagNameCase(name);
5203 attributes = tree.adjustSVGAttributes(attributes);
5204 }
5205 attributes = tree.adjustForeignAttributes(attributes);
5206 tree.insertForeignElement(name, attributes, tree.currentStackItem().namespaceURI, selfClosing);
5207 };
5208  
5209 modes.inForeignContent.processEndTag = function(name) {
5210 var node = tree.currentStackItem();
5211 var index = tree.openElements.length - 1;
5212 if (node.localName.toLowerCase() != name)
5213 tree.parseError("unexpected-end-tag", {name: name});
5214  
5215 while (true) {
5216 if (index === 0)
5217 break;
5218 if (node.localName.toLowerCase() == name) {
5219 while (tree.openElements.pop() != node);
5220 break;
5221 }
5222 index -= 1;
5223 node = tree.openElements.item(index);
5224 if (node.isForeign()) {
5225 continue;
5226 } else {
5227 tree.insertionMode.processEndTag(name);
5228 break;
5229 }
5230 }
5231 };
5232  
5233 modes.inForeignContent.processCharacters = function(buffer) {
5234 var characters = buffer.takeRemaining();
5235 characters = characters.replace(/\u0000/g, function(match, index){
5236 tree.parseError('invalid-codepoint');
5237 return '\uFFFD';
5238 });
5239 if (tree.framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))
5240 tree.framesetOk = false;
5241 tree.insertText(characters);
5242 };
5243  
5244 modes.inHeadNoscript = Object.create(modes.base);
5245  
5246 modes.inHeadNoscript.start_tag_handlers = {
5247 html: 'startTagHtml',
5248 basefont: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
5249 bgsound: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
5250 link: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
5251 meta: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
5252 noframes: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
5253 style: 'startTagBasefontBgsoundLinkMetaNoframesStyle',
5254 head: 'startTagHeadNoscript',
5255 noscript: 'startTagHeadNoscript',
5256 "-default": 'startTagOther'
5257 };
5258  
5259 modes.inHeadNoscript.end_tag_handlers = {
5260 noscript: 'endTagNoscript',
5261 br: 'endTagBr',
5262 '-default': 'endTagOther'
5263 };
5264  
5265 modes.inHeadNoscript.processCharacters = function(buffer) {
5266 var leadingWhitespace = buffer.takeLeadingWhitespace();
5267 if (leadingWhitespace)
5268 tree.insertText(leadingWhitespace);
5269 if (!buffer.length)
5270 return;
5271 tree.parseError("unexpected-char-in-frameset");
5272 this.anythingElse();
5273 tree.insertionMode.processCharacters(buffer);
5274 };
5275  
5276 modes.inHeadNoscript.processComment = function(data) {
5277 modes.inHead.processComment(data);
5278 };
5279  
5280 modes.inHeadNoscript.startTagBasefontBgsoundLinkMetaNoframesStyle = function(name, attributes) {
5281 modes.inHead.processStartTag(name, attributes);
5282 };
5283  
5284 modes.inHeadNoscript.startTagHeadNoscript = function(name, attributes) {
5285 tree.parseError("unexpected-start-tag-in-frameset", {name: name});
5286 };
5287  
5288 modes.inHeadNoscript.startTagOther = function(name, attributes) {
5289 tree.parseError("unexpected-start-tag-in-frameset", {name: name});
5290 this.anythingElse();
5291 tree.insertionMode.processStartTag(name, attributes);
5292 };
5293  
5294 modes.inHeadNoscript.endTagBr = function(name, attributes) {
5295 tree.parseError("unexpected-end-tag-in-frameset", {name: name});
5296 this.anythingElse();
5297 tree.insertionMode.processEndTag(name, attributes);
5298 };
5299  
5300 modes.inHeadNoscript.endTagNoscript = function(name, attributes) {
5301 tree.popElement();
5302 tree.setInsertionMode('inHead');
5303 };
5304  
5305 modes.inHeadNoscript.endTagOther = function(name, attributes) {
5306 tree.parseError("unexpected-end-tag-in-frameset", {name: name});
5307 };
5308  
5309 modes.inHeadNoscript.anythingElse = function() {
5310 tree.popElement();
5311 tree.setInsertionMode('inHead');
5312 };
5313  
5314  
5315 modes.inFrameset = Object.create(modes.base);
5316  
5317 modes.inFrameset.start_tag_handlers = {
5318 html: 'startTagHtml',
5319 frameset: 'startTagFrameset',
5320 frame: 'startTagFrame',
5321 noframes: 'startTagNoframes',
5322 "-default": 'startTagOther'
5323 };
5324  
5325 modes.inFrameset.end_tag_handlers = {
5326 frameset: 'endTagFrameset',
5327 noframes: 'endTagNoframes',
5328 '-default': 'endTagOther'
5329 };
5330  
5331 modes.inFrameset.processCharacters = function(data) {
5332 tree.parseError("unexpected-char-in-frameset");
5333 };
5334  
5335 modes.inFrameset.startTagFrameset = function(name, attributes) {
5336 tree.insertElement(name, attributes);
5337 };
5338  
5339 modes.inFrameset.startTagFrame = function(name, attributes) {
5340 tree.insertSelfClosingElement(name, attributes);
5341 };
5342  
5343 modes.inFrameset.startTagNoframes = function(name, attributes) {
5344 modes.inBody.processStartTag(name, attributes);
5345 };
5346  
5347 modes.inFrameset.startTagOther = function(name, attributes) {
5348 tree.parseError("unexpected-start-tag-in-frameset", {name: name});
5349 };
5350  
5351 modes.inFrameset.endTagFrameset = function(name, attributes) {
5352 if (tree.currentStackItem().localName == 'html') {
5353 tree.parseError("unexpected-frameset-in-frameset-innerhtml");
5354 } else {
5355 tree.popElement();
5356 }
5357  
5358 if (!tree.context && tree.currentStackItem().localName != 'frameset') {
5359 tree.setInsertionMode('afterFrameset');
5360 }
5361 };
5362  
5363 modes.inFrameset.endTagNoframes = function(name) {
5364 modes.inBody.processEndTag(name);
5365 };
5366  
5367 modes.inFrameset.endTagOther = function(name) {
5368 tree.parseError("unexpected-end-tag-in-frameset", {name: name});
5369 };
5370  
5371 modes.inTable = Object.create(modes.base);
5372  
5373 modes.inTable.start_tag_handlers = {
5374 html: 'startTagHtml',
5375 caption: 'startTagCaption',
5376 colgroup: 'startTagColgroup',
5377 col: 'startTagCol',
5378 table: 'startTagTable',
5379 tbody: 'startTagRowGroup',
5380 tfoot: 'startTagRowGroup',
5381 thead: 'startTagRowGroup',
5382 td: 'startTagImplyTbody',
5383 th: 'startTagImplyTbody',
5384 tr: 'startTagImplyTbody',
5385 style: 'startTagStyleScript',
5386 script: 'startTagStyleScript',
5387 input: 'startTagInput',
5388 form: 'startTagForm',
5389 '-default': 'startTagOther'
5390 };
5391  
5392 modes.inTable.end_tag_handlers = {
5393 table: 'endTagTable',
5394 body: 'endTagIgnore',
5395 caption: 'endTagIgnore',
5396 col: 'endTagIgnore',
5397 colgroup: 'endTagIgnore',
5398 html: 'endTagIgnore',
5399 tbody: 'endTagIgnore',
5400 td: 'endTagIgnore',
5401 tfoot: 'endTagIgnore',
5402 th: 'endTagIgnore',
5403 thead: 'endTagIgnore',
5404 tr: 'endTagIgnore',
5405 '-default': 'endTagOther'
5406 };
5407  
5408 modes.inTable.processCharacters = function(data) {
5409 if (tree.currentStackItem().isFosterParenting()) {
5410 var originalInsertionMode = tree.insertionModeName;
5411 tree.setInsertionMode('inTableText');
5412 tree.originalInsertionMode = originalInsertionMode;
5413 tree.insertionMode.processCharacters(data);
5414 } else {
5415 tree.redirectAttachToFosterParent = true;
5416 modes.inBody.processCharacters(data);
5417 tree.redirectAttachToFosterParent = false;
5418 }
5419 };
5420  
5421 modes.inTable.startTagCaption = function(name, attributes) {
5422 tree.openElements.popUntilTableScopeMarker();
5423 tree.activeFormattingElements.push(Marker);
5424 tree.insertElement(name, attributes);
5425 tree.setInsertionMode('inCaption');
5426 };
5427  
5428 modes.inTable.startTagColgroup = function(name, attributes) {
5429 tree.openElements.popUntilTableScopeMarker();
5430 tree.insertElement(name, attributes);
5431 tree.setInsertionMode('inColumnGroup');
5432 };
5433  
5434 modes.inTable.startTagCol = function(name, attributes) {
5435 this.startTagColgroup('colgroup', []);
5436 tree.insertionMode.processStartTag(name, attributes);
5437 };
5438  
5439 modes.inTable.startTagRowGroup = function(name, attributes) {
5440 tree.openElements.popUntilTableScopeMarker();
5441 tree.insertElement(name, attributes);
5442 tree.setInsertionMode('inTableBody');
5443 };
5444  
5445 modes.inTable.startTagImplyTbody = function(name, attributes) {
5446 this.startTagRowGroup('tbody', []);
5447 tree.insertionMode.processStartTag(name, attributes);
5448 };
5449  
5450 modes.inTable.startTagTable = function(name, attributes) {
5451 tree.parseError("unexpected-start-tag-implies-end-tag",
5452 {startName: "table", endName: "table"});
5453 tree.insertionMode.processEndTag('table');
5454 if (!tree.context) tree.insertionMode.processStartTag(name, attributes);
5455 };
5456  
5457 modes.inTable.startTagStyleScript = function(name, attributes) {
5458 modes.inHead.processStartTag(name, attributes);
5459 };
5460  
5461 modes.inTable.startTagInput = function(name, attributes) {
5462 for (var key in attributes) {
5463 if (attributes[key].nodeName.toLowerCase() == 'type') {
5464 if (attributes[key].nodeValue.toLowerCase() == 'hidden') {
5465 tree.parseError("unexpected-hidden-input-in-table");
5466 tree.insertElement(name, attributes);
5467 tree.openElements.pop();
5468 return;
5469 }
5470 break;
5471 }
5472 }
5473 this.startTagOther(name, attributes);
5474 };
5475  
5476 modes.inTable.startTagForm = function(name, attributes) {
5477 tree.parseError("unexpected-form-in-table");
5478 if (!tree.form) {
5479 tree.insertElement(name, attributes);
5480 tree.form = tree.currentStackItem();
5481 tree.openElements.pop();
5482 }
5483 };
5484  
5485 modes.inTable.startTagOther = function(name, attributes, selfClosing) {
5486 tree.parseError("unexpected-start-tag-implies-table-voodoo", {name: name});
5487 tree.redirectAttachToFosterParent = true;
5488 modes.inBody.processStartTag(name, attributes, selfClosing);
5489 tree.redirectAttachToFosterParent = false;
5490 };
5491  
5492 modes.inTable.endTagTable = function(name) {
5493 if (tree.openElements.inTableScope(name)) {
5494 tree.generateImpliedEndTags();
5495 if (tree.currentStackItem().localName != name) {
5496 tree.parseError("end-tag-too-early-named", {gotName: 'table', expectedName: tree.currentStackItem().localName});
5497 }
5498  
5499 tree.openElements.popUntilPopped('table');
5500 tree.resetInsertionMode();
5501 } else {
5502 assert.ok(tree.context);
5503 tree.parseError('unexpected-end-tag', {name: name});
5504 }
5505 };
5506  
5507 modes.inTable.endTagIgnore = function(name) {
5508 tree.parseError("unexpected-end-tag", {name: name});
5509 };
5510  
5511 modes.inTable.endTagOther = function(name) {
5512 tree.parseError("unexpected-end-tag-implies-table-voodoo", {name: name});
5513 tree.redirectAttachToFosterParent = true;
5514 modes.inBody.processEndTag(name);
5515 tree.redirectAttachToFosterParent = false;
5516 };
5517  
5518 modes.inTableText = Object.create(modes.base);
5519  
5520 modes.inTableText.flushCharacters = function() {
5521 var characters = tree.pendingTableCharacters.join('');
5522 if (!isAllWhitespace(characters)) {
5523 tree.redirectAttachToFosterParent = true;
5524 tree.reconstructActiveFormattingElements();
5525 tree.insertText(characters);
5526 tree.framesetOk = false;
5527 tree.redirectAttachToFosterParent = false;
5528 } else {
5529 tree.insertText(characters);
5530 }
5531 tree.pendingTableCharacters = [];
5532 };
5533  
5534 modes.inTableText.processComment = function(data) {
5535 this.flushCharacters();
5536 tree.setInsertionMode(tree.originalInsertionMode);
5537 tree.insertionMode.processComment(data);
5538 };
5539  
5540 modes.inTableText.processEOF = function(data) {
5541 this.flushCharacters();
5542 tree.setInsertionMode(tree.originalInsertionMode);
5543 tree.insertionMode.processEOF();
5544 };
5545  
5546 modes.inTableText.processCharacters = function(buffer) {
5547 var characters = buffer.takeRemaining();
5548 characters = characters.replace(/\u0000/g, function(match, index){
5549 tree.parseError("invalid-codepoint");
5550 return '';
5551 });
5552 if (!characters)
5553 return;
5554 tree.pendingTableCharacters.push(characters);
5555 };
5556  
5557 modes.inTableText.processStartTag = function(name, attributes, selfClosing) {
5558 this.flushCharacters();
5559 tree.setInsertionMode(tree.originalInsertionMode);
5560 tree.insertionMode.processStartTag(name, attributes, selfClosing);
5561 };
5562  
5563 modes.inTableText.processEndTag = function(name, attributes) {
5564 this.flushCharacters();
5565 tree.setInsertionMode(tree.originalInsertionMode);
5566 tree.insertionMode.processEndTag(name, attributes);
5567 };
5568  
5569 modes.inTableBody = Object.create(modes.base);
5570  
5571 modes.inTableBody.start_tag_handlers = {
5572 html: 'startTagHtml',
5573 tr: 'startTagTr',
5574 td: 'startTagTableCell',
5575 th: 'startTagTableCell',
5576 caption: 'startTagTableOther',
5577 col: 'startTagTableOther',
5578 colgroup: 'startTagTableOther',
5579 tbody: 'startTagTableOther',
5580 tfoot: 'startTagTableOther',
5581 thead: 'startTagTableOther',
5582 '-default': 'startTagOther'
5583 };
5584  
5585 modes.inTableBody.end_tag_handlers = {
5586 table: 'endTagTable',
5587 tbody: 'endTagTableRowGroup',
5588 tfoot: 'endTagTableRowGroup',
5589 thead: 'endTagTableRowGroup',
5590 body: 'endTagIgnore',
5591 caption: 'endTagIgnore',
5592 col: 'endTagIgnore',
5593 colgroup: 'endTagIgnore',
5594 html: 'endTagIgnore',
5595 td: 'endTagIgnore',
5596 th: 'endTagIgnore',
5597 tr: 'endTagIgnore',
5598 '-default': 'endTagOther'
5599 };
5600  
5601 modes.inTableBody.processCharacters = function(data) {
5602 modes.inTable.processCharacters(data);
5603 };
5604  
5605 modes.inTableBody.startTagTr = function(name, attributes) {
5606 tree.openElements.popUntilTableBodyScopeMarker();
5607 tree.insertElement(name, attributes);
5608 tree.setInsertionMode('inRow');
5609 };
5610  
5611 modes.inTableBody.startTagTableCell = function(name, attributes) {
5612 tree.parseError("unexpected-cell-in-table-body", {name: name});
5613 this.startTagTr('tr', []);
5614 tree.insertionMode.processStartTag(name, attributes);
5615 };
5616  
5617 modes.inTableBody.startTagTableOther = function(name, attributes) {
5618 if (tree.openElements.inTableScope('tbody') || tree.openElements.inTableScope('thead') || tree.openElements.inTableScope('tfoot')) {
5619 tree.openElements.popUntilTableBodyScopeMarker();
5620 this.endTagTableRowGroup(tree.currentStackItem().localName);
5621 tree.insertionMode.processStartTag(name, attributes);
5622 } else {
5623 tree.parseError('unexpected-start-tag', {name: name});
5624 }
5625 };
5626  
5627 modes.inTableBody.startTagOther = function(name, attributes) {
5628 modes.inTable.processStartTag(name, attributes);
5629 };
5630  
5631 modes.inTableBody.endTagTableRowGroup = function(name) {
5632 if (tree.openElements.inTableScope(name)) {
5633 tree.openElements.popUntilTableBodyScopeMarker();
5634 tree.popElement();
5635 tree.setInsertionMode('inTable');
5636 } else {
5637 tree.parseError('unexpected-end-tag-in-table-body', {name: name});
5638 }
5639 };
5640  
5641 modes.inTableBody.endTagTable = function(name) {
5642 if (tree.openElements.inTableScope('tbody') || tree.openElements.inTableScope('thead') || tree.openElements.inTableScope('tfoot')) {
5643 tree.openElements.popUntilTableBodyScopeMarker();
5644 this.endTagTableRowGroup(tree.currentStackItem().localName);
5645 tree.insertionMode.processEndTag(name);
5646 } else {
5647 tree.parseError('unexpected-end-tag', {name: name});
5648 }
5649 };
5650  
5651 modes.inTableBody.endTagIgnore = function(name) {
5652 tree.parseError("unexpected-end-tag-in-table-body", {name: name});
5653 };
5654  
5655 modes.inTableBody.endTagOther = function(name) {
5656 modes.inTable.processEndTag(name);
5657 };
5658  
5659 modes.inSelect = Object.create(modes.base);
5660  
5661 modes.inSelect.start_tag_handlers = {
5662 html: 'startTagHtml',
5663 option: 'startTagOption',
5664 optgroup: 'startTagOptgroup',
5665 select: 'startTagSelect',
5666 input: 'startTagInput',
5667 keygen: 'startTagInput',
5668 textarea: 'startTagInput',
5669 script: 'startTagScript',
5670 '-default': 'startTagOther'
5671 };
5672  
5673 modes.inSelect.end_tag_handlers = {
5674 option: 'endTagOption',
5675 optgroup: 'endTagOptgroup',
5676 select: 'endTagSelect',
5677 caption: 'endTagTableElements',
5678 table: 'endTagTableElements',
5679 tbody: 'endTagTableElements',
5680 tfoot: 'endTagTableElements',
5681 thead: 'endTagTableElements',
5682 tr: 'endTagTableElements',
5683 td: 'endTagTableElements',
5684 th: 'endTagTableElements',
5685 '-default': 'endTagOther'
5686 };
5687  
5688 modes.inSelect.processCharacters = function(buffer) {
5689 var data = buffer.takeRemaining();
5690 data = data.replace(/\u0000/g, function(match, index){
5691 tree.parseError("invalid-codepoint");
5692 return '';
5693 });
5694 if (!data)
5695 return;
5696 tree.insertText(data);
5697 };
5698  
5699 modes.inSelect.startTagOption = function(name, attributes) {
5700 if (tree.currentStackItem().localName == 'option')
5701 tree.popElement();
5702 tree.insertElement(name, attributes);
5703 };
5704  
5705 modes.inSelect.startTagOptgroup = function(name, attributes) {
5706 if (tree.currentStackItem().localName == 'option')
5707 tree.popElement();
5708 if (tree.currentStackItem().localName == 'optgroup')
5709 tree.popElement();
5710 tree.insertElement(name, attributes);
5711 };
5712  
5713 modes.inSelect.endTagOption = function(name) {
5714 if (tree.currentStackItem().localName !== 'option') {
5715 tree.parseError('unexpected-end-tag-in-select', {name: name});
5716 return;
5717 }
5718 tree.popElement();
5719 };
5720  
5721 modes.inSelect.endTagOptgroup = function(name) {
5722 if (tree.currentStackItem().localName == 'option' && tree.openElements.item(tree.openElements.length - 2).localName == 'optgroup') {
5723 tree.popElement();
5724 }
5725 if (tree.currentStackItem().localName == 'optgroup') {
5726 tree.popElement();
5727 } else {
5728 tree.parseError('unexpected-end-tag-in-select', {name: 'optgroup'});
5729 }
5730 };
5731  
5732 modes.inSelect.startTagSelect = function(name) {
5733 tree.parseError("unexpected-select-in-select");
5734 this.endTagSelect('select');
5735 };
5736  
5737 modes.inSelect.endTagSelect = function(name) {
5738 if (tree.openElements.inTableScope('select')) {
5739 tree.openElements.popUntilPopped('select');
5740 tree.resetInsertionMode();
5741 } else {
5742 tree.parseError('unexpected-end-tag', {name: name});
5743 }
5744 };
5745  
5746 modes.inSelect.startTagInput = function(name, attributes) {
5747 tree.parseError("unexpected-input-in-select");
5748 if (tree.openElements.inSelectScope('select')) {
5749 this.endTagSelect('select');
5750 tree.insertionMode.processStartTag(name, attributes);
5751 }
5752 };
5753  
5754 modes.inSelect.startTagScript = function(name, attributes) {
5755 modes.inHead.processStartTag(name, attributes);
5756 };
5757  
5758 modes.inSelect.endTagTableElements = function(name) {
5759 tree.parseError('unexpected-end-tag-in-select', {name: name});
5760 if (tree.openElements.inTableScope(name)) {
5761 this.endTagSelect('select');
5762 tree.insertionMode.processEndTag(name);
5763 }
5764 };
5765  
5766 modes.inSelect.startTagOther = function(name, attributes) {
5767 tree.parseError("unexpected-start-tag-in-select", {name: name});
5768 };
5769  
5770 modes.inSelect.endTagOther = function(name) {
5771 tree.parseError('unexpected-end-tag-in-select', {name: name});
5772 };
5773  
5774 modes.inSelectInTable = Object.create(modes.base);
5775  
5776 modes.inSelectInTable.start_tag_handlers = {
5777 caption: 'startTagTable',
5778 table: 'startTagTable',
5779 tbody: 'startTagTable',
5780 tfoot: 'startTagTable',
5781 thead: 'startTagTable',
5782 tr: 'startTagTable',
5783 td: 'startTagTable',
5784 th: 'startTagTable',
5785 '-default': 'startTagOther'
5786 };
5787  
5788 modes.inSelectInTable.end_tag_handlers = {
5789 caption: 'endTagTable',
5790 table: 'endTagTable',
5791 tbody: 'endTagTable',
5792 tfoot: 'endTagTable',
5793 thead: 'endTagTable',
5794 tr: 'endTagTable',
5795 td: 'endTagTable',
5796 th: 'endTagTable',
5797 '-default': 'endTagOther'
5798 };
5799  
5800 modes.inSelectInTable.processCharacters = function(data) {
5801 modes.inSelect.processCharacters(data);
5802 };
5803  
5804 modes.inSelectInTable.startTagTable = function(name, attributes) {
5805 tree.parseError("unexpected-table-element-start-tag-in-select-in-table", {name: name});
5806 this.endTagOther("select");
5807 tree.insertionMode.processStartTag(name, attributes);
5808 };
5809  
5810 modes.inSelectInTable.startTagOther = function(name, attributes, selfClosing) {
5811 modes.inSelect.processStartTag(name, attributes, selfClosing);
5812 };
5813  
5814 modes.inSelectInTable.endTagTable = function(name) {
5815 tree.parseError("unexpected-table-element-end-tag-in-select-in-table", {name: name});
5816 if (tree.openElements.inTableScope(name)) {
5817 this.endTagOther("select");
5818 tree.insertionMode.processEndTag(name);
5819 }
5820 };
5821  
5822 modes.inSelectInTable.endTagOther = function(name) {
5823 modes.inSelect.processEndTag(name);
5824 };
5825  
5826 modes.inRow = Object.create(modes.base);
5827  
5828 modes.inRow.start_tag_handlers = {
5829 html: 'startTagHtml',
5830 td: 'startTagTableCell',
5831 th: 'startTagTableCell',
5832 caption: 'startTagTableOther',
5833 col: 'startTagTableOther',
5834 colgroup: 'startTagTableOther',
5835 tbody: 'startTagTableOther',
5836 tfoot: 'startTagTableOther',
5837 thead: 'startTagTableOther',
5838 tr: 'startTagTableOther',
5839 '-default': 'startTagOther'
5840 };
5841  
5842 modes.inRow.end_tag_handlers = {
5843 tr: 'endTagTr',
5844 table: 'endTagTable',
5845 tbody: 'endTagTableRowGroup',
5846 tfoot: 'endTagTableRowGroup',
5847 thead: 'endTagTableRowGroup',
5848 body: 'endTagIgnore',
5849 caption: 'endTagIgnore',
5850 col: 'endTagIgnore',
5851 colgroup: 'endTagIgnore',
5852 html: 'endTagIgnore',
5853 td: 'endTagIgnore',
5854 th: 'endTagIgnore',
5855 '-default': 'endTagOther'
5856 };
5857  
5858 modes.inRow.processCharacters = function(data) {
5859 modes.inTable.processCharacters(data);
5860 };
5861  
5862 modes.inRow.startTagTableCell = function(name, attributes) {
5863 tree.openElements.popUntilTableRowScopeMarker();
5864 tree.insertElement(name, attributes);
5865 tree.setInsertionMode('inCell');
5866 tree.activeFormattingElements.push(Marker);
5867 };
5868  
5869 modes.inRow.startTagTableOther = function(name, attributes) {
5870 var ignoreEndTag = this.ignoreEndTagTr();
5871 this.endTagTr('tr');
5872 if (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes);
5873 };
5874  
5875 modes.inRow.startTagOther = function(name, attributes, selfClosing) {
5876 modes.inTable.processStartTag(name, attributes, selfClosing);
5877 };
5878  
5879 modes.inRow.endTagTr = function(name) {
5880 if (this.ignoreEndTagTr()) {
5881 assert.ok(tree.context);
5882 tree.parseError('unexpected-end-tag', {name: name});
5883 } else {
5884 tree.openElements.popUntilTableRowScopeMarker();
5885 tree.popElement();
5886 tree.setInsertionMode('inTableBody');
5887 }
5888 };
5889  
5890 modes.inRow.endTagTable = function(name) {
5891 var ignoreEndTag = this.ignoreEndTagTr();
5892 this.endTagTr('tr');
5893 if (!ignoreEndTag) tree.insertionMode.processEndTag(name);
5894 };
5895  
5896 modes.inRow.endTagTableRowGroup = function(name) {
5897 if (tree.openElements.inTableScope(name)) {
5898 this.endTagTr('tr');
5899 tree.insertionMode.processEndTag(name);
5900 } else {
5901 tree.parseError('unexpected-end-tag', {name: name});
5902 }
5903 };
5904  
5905 modes.inRow.endTagIgnore = function(name) {
5906 tree.parseError("unexpected-end-tag-in-table-row", {name: name});
5907 };
5908  
5909 modes.inRow.endTagOther = function(name) {
5910 modes.inTable.processEndTag(name);
5911 };
5912  
5913 modes.inRow.ignoreEndTagTr = function() {
5914 return !tree.openElements.inTableScope('tr');
5915 };
5916  
5917 modes.afterAfterFrameset = Object.create(modes.base);
5918  
5919 modes.afterAfterFrameset.start_tag_handlers = {
5920 html: 'startTagHtml',
5921 noframes: 'startTagNoFrames',
5922 '-default': 'startTagOther'
5923 };
5924  
5925 modes.afterAfterFrameset.processEOF = function() {};
5926  
5927 modes.afterAfterFrameset.processComment = function(data) {
5928 tree.insertComment(data, tree.document);
5929 };
5930  
5931 modes.afterAfterFrameset.processCharacters = function(buffer) {
5932 var characters = buffer.takeRemaining();
5933 var whitespace = "";
5934 for (var i = 0; i < characters.length; i++) {
5935 var ch = characters[i];
5936 if (isWhitespace(ch))
5937 whitespace += ch;
5938 }
5939 if (whitespace) {
5940 tree.reconstructActiveFormattingElements();
5941 tree.insertText(whitespace);
5942 }
5943 if (whitespace.length < characters.length)
5944 tree.parseError('expected-eof-but-got-char');
5945 };
5946  
5947 modes.afterAfterFrameset.startTagNoFrames = function(name, attributes) {
5948 modes.inHead.processStartTag(name, attributes);
5949 };
5950  
5951 modes.afterAfterFrameset.startTagOther = function(name, attributes, selfClosing) {
5952 tree.parseError('expected-eof-but-got-start-tag', {name: name});
5953 };
5954  
5955 modes.afterAfterFrameset.processEndTag = function(name, attributes) {
5956 tree.parseError('expected-eof-but-got-end-tag', {name: name});
5957 };
5958  
5959 modes.text = Object.create(modes.base);
5960  
5961 modes.text.start_tag_handlers = {
5962 '-default': 'startTagOther'
5963 };
5964  
5965 modes.text.end_tag_handlers = {
5966 script: 'endTagScript',
5967 '-default': 'endTagOther'
5968 };
5969  
5970 modes.text.processCharacters = function(buffer) {
5971 if (tree.shouldSkipLeadingNewline) {
5972 tree.shouldSkipLeadingNewline = false;
5973 buffer.skipAtMostOneLeadingNewline();
5974 }
5975 var data = buffer.takeRemaining();
5976 if (!data)
5977 return;
5978 tree.insertText(data);
5979 };
5980  
5981 modes.text.processEOF = function() {
5982 tree.parseError("expected-named-closing-tag-but-got-eof",
5983 {name: tree.currentStackItem().localName});
5984 tree.openElements.pop();
5985 tree.setInsertionMode(tree.originalInsertionMode);
5986 tree.insertionMode.processEOF();
5987 };
5988  
5989 modes.text.startTagOther = function(name) {
5990 throw "Tried to process start tag " + name + " in RCDATA/RAWTEXT mode";
5991 };
5992  
5993 modes.text.endTagScript = function(name) {
5994 var node = tree.openElements.pop();
5995 assert.ok(node.localName == 'script');
5996 tree.setInsertionMode(tree.originalInsertionMode);
5997 };
5998  
5999 modes.text.endTagOther = function(name) {
6000 tree.openElements.pop();
6001 tree.setInsertionMode(tree.originalInsertionMode);
6002 };
6003 }
6004  
6005 TreeBuilder.prototype.setInsertionMode = function(name) {
6006 this.insertionMode = this.insertionModes[name];
6007 this.insertionModeName = name;
6008 };
6009 TreeBuilder.prototype.adoptionAgencyEndTag = function(name) {
6010 var outerIterationLimit = 8;
6011 var innerIterationLimit = 3;
6012 var formattingElement;
6013  
6014 function isActiveFormattingElement(el) {
6015 return el === formattingElement;
6016 }
6017  
6018 var outerLoopCounter = 0;
6019  
6020 while (outerLoopCounter++ < outerIterationLimit) {
6021 formattingElement = this.elementInActiveFormattingElements(name);
6022  
6023 if (!formattingElement || (this.openElements.contains(formattingElement) && !this.openElements.inScope(formattingElement.localName))) {
6024 this.parseError('adoption-agency-1.1', {name: name});
6025 return false;
6026 }
6027 if (!this.openElements.contains(formattingElement)) {
6028 this.parseError('adoption-agency-1.2', {name: name});
6029 this.removeElementFromActiveFormattingElements(formattingElement);
6030 return true;
6031 }
6032 if (!this.openElements.inScope(formattingElement.localName)) {
6033 this.parseError('adoption-agency-4.4', {name: name});
6034 }
6035  
6036 if (formattingElement != this.currentStackItem()) {
6037 this.parseError('adoption-agency-1.3', {name: name});
6038 }
6039 var furthestBlock = this.openElements.furthestBlockForFormattingElement(formattingElement.node);
6040  
6041 if (!furthestBlock) {
6042 this.openElements.remove_openElements_until(isActiveFormattingElement);
6043 this.removeElementFromActiveFormattingElements(formattingElement);
6044 return true;
6045 }
6046  
6047 var afeIndex = this.openElements.elements.indexOf(formattingElement);
6048 var commonAncestor = this.openElements.item(afeIndex - 1);
6049  
6050 var bookmark = this.activeFormattingElements.indexOf(formattingElement);
6051  
6052 var node = furthestBlock;
6053 var lastNode = furthestBlock;
6054 var index = this.openElements.elements.indexOf(node);
6055  
6056 var innerLoopCounter = 0;
6057 while (innerLoopCounter++ < innerIterationLimit) {
6058 index -= 1;
6059 node = this.openElements.item(index);
6060 if (this.activeFormattingElements.indexOf(node) < 0) {
6061 this.openElements.elements.splice(index, 1);
6062 continue;
6063 }
6064 if (node == formattingElement)
6065 break;
6066  
6067 if (lastNode == furthestBlock)
6068 bookmark = this.activeFormattingElements.indexOf(node) + 1;
6069  
6070 var clone = this.createElement(node.namespaceURI, node.localName, node.attributes);
6071 var newNode = new StackItem(node.namespaceURI, node.localName, node.attributes, clone);
6072  
6073 this.activeFormattingElements[this.activeFormattingElements.indexOf(node)] = newNode;
6074 this.openElements.elements[this.openElements.elements.indexOf(node)] = newNode;
6075  
6076 node = newNode;
6077 this.detachFromParent(lastNode.node);
6078 this.attachNode(lastNode.node, node.node);
6079 lastNode = node;
6080 }
6081  
6082 this.detachFromParent(lastNode.node);
6083 if (commonAncestor.isFosterParenting()) {
6084 this.insertIntoFosterParent(lastNode.node);
6085 } else {
6086 this.attachNode(lastNode.node, commonAncestor.node);
6087 }
6088  
6089 var clone = this.createElement("http://www.w3.org/1999/xhtml", formattingElement.localName, formattingElement.attributes);
6090 var formattingClone = new StackItem(formattingElement.namespaceURI, formattingElement.localName, formattingElement.attributes, clone);
6091  
6092 this.reparentChildren(furthestBlock.node, clone);
6093 this.attachNode(clone, furthestBlock.node);
6094  
6095 this.removeElementFromActiveFormattingElements(formattingElement);
6096 this.activeFormattingElements.splice(Math.min(bookmark, this.activeFormattingElements.length), 0, formattingClone);
6097  
6098 this.openElements.remove(formattingElement);
6099 this.openElements.elements.splice(this.openElements.elements.indexOf(furthestBlock) + 1, 0, formattingClone);
6100 }
6101  
6102 return true;
6103 };
6104  
6105 TreeBuilder.prototype.start = function() {
6106 throw "Not mplemented";
6107 };
6108  
6109 TreeBuilder.prototype.startTokenization = function(tokenizer) {
6110 this.tokenizer = tokenizer;
6111 this.compatMode = "no quirks";
6112 this.originalInsertionMode = "initial";
6113 this.framesetOk = true;
6114 this.openElements = new ElementStack();
6115 this.activeFormattingElements = [];
6116 this.start();
6117 if (this.context) {
6118 switch(this.context) {
6119 case 'title':
6120 case 'textarea':
6121 this.tokenizer.setState(Tokenizer.RCDATA);
6122 break;
6123 case 'style':
6124 case 'xmp':
6125 case 'iframe':
6126 case 'noembed':
6127 case 'noframes':
6128 this.tokenizer.setState(Tokenizer.RAWTEXT);
6129 break;
6130 case 'script':
6131 this.tokenizer.setState(Tokenizer.SCRIPT_DATA);
6132 break;
6133 case 'noscript':
6134 if (this.scriptingEnabled)
6135 this.tokenizer.setState(Tokenizer.RAWTEXT);
6136 break;
6137 case 'plaintext':
6138 this.tokenizer.setState(Tokenizer.PLAINTEXT);
6139 break;
6140 }
6141 this.insertHtmlElement();
6142 this.resetInsertionMode();
6143 } else {
6144 this.setInsertionMode('initial');
6145 }
6146 };
6147  
6148 TreeBuilder.prototype.processToken = function(token) {
6149 this.selfClosingFlagAcknowledged = false;
6150  
6151 var currentNode = this.openElements.top || null;
6152 var insertionMode;
6153 if (!currentNode || !currentNode.isForeign() ||
6154 (currentNode.isMathMLTextIntegrationPoint() &&
6155 ((token.type == 'StartTag' &&
6156 !(token.name in {mglyph:0, malignmark:0})) ||
6157 (token.type === 'Characters'))
6158 ) ||
6159 (currentNode.namespaceURI == "http://www.w3.org/1998/Math/MathML" &&
6160 currentNode.localName == 'annotation-xml' &&
6161 token.type == 'StartTag' && token.name == 'svg'
6162 ) ||
6163 (currentNode.isHtmlIntegrationPoint() &&
6164 token.type in {StartTag:0, Characters:0}
6165 ) ||
6166 token.type == 'EOF'
6167 ) {
6168 insertionMode = this.insertionMode;
6169 } else {
6170 insertionMode = this.insertionModes.inForeignContent;
6171 }
6172 switch(token.type) {
6173 case 'Characters':
6174 var buffer = new CharacterBuffer(token.data);
6175 insertionMode.processCharacters(buffer);
6176 break;
6177 case 'Comment':
6178 insertionMode.processComment(token.data);
6179 break;
6180 case 'StartTag':
6181 insertionMode.processStartTag(token.name, token.data, token.selfClosing);
6182 break;
6183 case 'EndTag':
6184 insertionMode.processEndTag(token.name);
6185 break;
6186 case 'Doctype':
6187 insertionMode.processDoctype(token.name, token.publicId, token.systemId, token.forceQuirks);
6188 break;
6189 case 'EOF':
6190 insertionMode.processEOF();
6191 break;
6192 }
6193 };
6194 TreeBuilder.prototype.isCdataSectionAllowed = function() {
6195 return this.openElements.length > 0 && this.currentStackItem().isForeign();
6196 };
6197 TreeBuilder.prototype.isSelfClosingFlagAcknowledged = function() {
6198 return this.selfClosingFlagAcknowledged;
6199 };
6200  
6201 TreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {
6202 throw new Error("Not implemented");
6203 };
6204  
6205 TreeBuilder.prototype.attachNode = function(child, parent) {
6206 throw new Error("Not implemented");
6207 };
6208  
6209 TreeBuilder.prototype.attachNodeToFosterParent = function(child, table, stackParent) {
6210 throw new Error("Not implemented");
6211 };
6212  
6213 TreeBuilder.prototype.detachFromParent = function(node) {
6214 throw new Error("Not implemented");
6215 };
6216  
6217 TreeBuilder.prototype.addAttributesToElement = function(element, attributes) {
6218 throw new Error("Not implemented");
6219 };
6220  
6221 TreeBuilder.prototype.insertHtmlElement = function(attributes) {
6222 var root = this.createElement("http://www.w3.org/1999/xhtml", 'html', attributes);
6223 this.attachNode(root, this.document);
6224 this.openElements.pushHtmlElement(new StackItem("http://www.w3.org/1999/xhtml", 'html', attributes, root));
6225 return root;
6226 };
6227  
6228 TreeBuilder.prototype.insertHeadElement = function(attributes) {
6229 var element = this.createElement("http://www.w3.org/1999/xhtml", "head", attributes);
6230 this.head = new StackItem("http://www.w3.org/1999/xhtml", "head", attributes, element);
6231 this.attachNode(element, this.openElements.top.node);
6232 this.openElements.pushHeadElement(this.head);
6233 return element;
6234 };
6235  
6236 TreeBuilder.prototype.insertBodyElement = function(attributes) {
6237 var element = this.createElement("http://www.w3.org/1999/xhtml", "body", attributes);
6238 this.attachNode(element, this.openElements.top.node);
6239 this.openElements.pushBodyElement(new StackItem("http://www.w3.org/1999/xhtml", "body", attributes, element));
6240 return element;
6241 };
6242  
6243 TreeBuilder.prototype.insertIntoFosterParent = function(node) {
6244 var tableIndex = this.openElements.findIndex('table');
6245 var tableElement = this.openElements.item(tableIndex).node;
6246 if (tableIndex === 0)
6247 return this.attachNode(node, tableElement);
6248 this.attachNodeToFosterParent(node, tableElement, this.openElements.item(tableIndex - 1).node);
6249 };
6250  
6251 TreeBuilder.prototype.insertElement = function(name, attributes, namespaceURI, selfClosing) {
6252 if (!namespaceURI)
6253 namespaceURI = "http://www.w3.org/1999/xhtml";
6254 var element = this.createElement(namespaceURI, name, attributes);
6255 if (this.shouldFosterParent())
6256 this.insertIntoFosterParent(element);
6257 else
6258 this.attachNode(element, this.openElements.top.node);
6259 if (!selfClosing)
6260 this.openElements.push(new StackItem(namespaceURI, name, attributes, element));
6261 };
6262  
6263 TreeBuilder.prototype.insertFormattingElement = function(name, attributes) {
6264 this.insertElement(name, attributes, "http://www.w3.org/1999/xhtml");
6265 this.appendElementToActiveFormattingElements(this.currentStackItem());
6266 };
6267  
6268 TreeBuilder.prototype.insertSelfClosingElement = function(name, attributes) {
6269 this.selfClosingFlagAcknowledged = true;
6270 this.insertElement(name, attributes, "http://www.w3.org/1999/xhtml", true);
6271 };
6272  
6273 TreeBuilder.prototype.insertForeignElement = function(name, attributes, namespaceURI, selfClosing) {
6274 if (selfClosing)
6275 this.selfClosingFlagAcknowledged = true;
6276 this.insertElement(name, attributes, namespaceURI, selfClosing);
6277 };
6278  
6279 TreeBuilder.prototype.insertComment = function(data, parent) {
6280 throw new Error("Not implemented");
6281 };
6282  
6283 TreeBuilder.prototype.insertDoctype = function(name, publicId, systemId) {
6284 throw new Error("Not implemented");
6285 };
6286  
6287 TreeBuilder.prototype.insertText = function(data) {
6288 throw new Error("Not implemented");
6289 };
6290 TreeBuilder.prototype.currentStackItem = function() {
6291 return this.openElements.top;
6292 };
6293 TreeBuilder.prototype.popElement = function() {
6294 return this.openElements.pop();
6295 };
6296 TreeBuilder.prototype.shouldFosterParent = function() {
6297 return this.redirectAttachToFosterParent && this.currentStackItem().isFosterParenting();
6298 };
6299 TreeBuilder.prototype.generateImpliedEndTags = function(exclude) {
6300 var name = this.openElements.top.localName;
6301 if (['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'].indexOf(name) != -1 && name != exclude) {
6302 this.popElement();
6303 this.generateImpliedEndTags(exclude);
6304 }
6305 };
6306 TreeBuilder.prototype.reconstructActiveFormattingElements = function() {
6307 if (this.activeFormattingElements.length === 0)
6308 return;
6309 var i = this.activeFormattingElements.length - 1;
6310 var entry = this.activeFormattingElements[i];
6311 if (entry == Marker || this.openElements.contains(entry))
6312 return;
6313  
6314 while (entry != Marker && !this.openElements.contains(entry)) {
6315 i -= 1;
6316 entry = this.activeFormattingElements[i];
6317 if (!entry)
6318 break;
6319 }
6320  
6321 while (true) {
6322 i += 1;
6323 entry = this.activeFormattingElements[i];
6324 this.insertElement(entry.localName, entry.attributes);
6325 var element = this.currentStackItem();
6326 this.activeFormattingElements[i] = element;
6327 if (element == this.activeFormattingElements[this.activeFormattingElements.length -1])
6328 break;
6329 }
6330  
6331 };
6332 TreeBuilder.prototype.ensureNoahsArkCondition = function(item) {
6333 var kNoahsArkCapacity = 3;
6334 if (this.activeFormattingElements.length < kNoahsArkCapacity)
6335 return;
6336 var candidates = [];
6337 var newItemAttributeCount = item.attributes.length;
6338 for (var i = this.activeFormattingElements.length - 1; i >= 0; i--) {
6339 var candidate = this.activeFormattingElements[i];
6340 if (candidate === Marker)
6341 break;
6342 if (item.localName !== candidate.localName || item.namespaceURI !== candidate.namespaceURI)
6343 continue;
6344 if (candidate.attributes.length != newItemAttributeCount)
6345 continue;
6346 candidates.push(candidate);
6347 }
6348 if (candidates.length < kNoahsArkCapacity)
6349 return;
6350  
6351 var remainingCandidates = [];
6352 var attributes = item.attributes;
6353 for (var i = 0; i < attributes.length; i++) {
6354 var attribute = attributes[i];
6355  
6356 for (var j = 0; j < candidates.length; j++) {
6357 var candidate = candidates[j];
6358 var candidateAttribute = getAttribute(candidate, attribute.nodeName);
6359 if (candidateAttribute && candidateAttribute.nodeValue === attribute.nodeValue)
6360 remainingCandidates.push(candidate);
6361 }
6362 if (remainingCandidates.length < kNoahsArkCapacity)
6363 return;
6364 candidates = remainingCandidates;
6365 remainingCandidates = [];
6366 }
6367 for (var i = kNoahsArkCapacity - 1; i < candidates.length; i++)
6368 this.removeElementFromActiveFormattingElements(candidates[i]);
6369 };
6370 TreeBuilder.prototype.appendElementToActiveFormattingElements = function(item) {
6371 this.ensureNoahsArkCondition(item);
6372 this.activeFormattingElements.push(item);
6373 };
6374 TreeBuilder.prototype.removeElementFromActiveFormattingElements = function(item) {
6375 var index = this.activeFormattingElements.indexOf(item);
6376 if (index >= 0)
6377 this.activeFormattingElements.splice(index, 1);
6378 };
6379  
6380 TreeBuilder.prototype.elementInActiveFormattingElements = function(name) {
6381 var els = this.activeFormattingElements;
6382 for (var i = els.length - 1; i >= 0; i--) {
6383 if (els[i] == Marker) break;
6384 if (els[i].localName == name) return els[i];
6385 }
6386 return false;
6387 };
6388  
6389 TreeBuilder.prototype.clearActiveFormattingElements = function() {
6390 while (!(this.activeFormattingElements.length === 0 || this.activeFormattingElements.pop() == Marker));
6391 };
6392  
6393 TreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {
6394 throw new Error("Not implemented");
6395 };
6396 TreeBuilder.prototype.setFragmentContext = function(context) {
6397 this.context = context;
6398 };
6399 TreeBuilder.prototype.parseError = function(code, args) {
6400 if (!this.errorHandler)
6401 return;
6402 var message = formatMessage(messages[code], args);
6403 this.errorHandler.error(message, this.tokenizer._inputStream.location(), code);
6404 };
6405 TreeBuilder.prototype.resetInsertionMode = function() {
6406 var last = false;
6407 var node = null;
6408 for (var i = this.openElements.length - 1; i >= 0; i--) {
6409 node = this.openElements.item(i);
6410 if (i === 0) {
6411 assert.ok(this.context);
6412 last = true;
6413 node = new StackItem("http://www.w3.org/1999/xhtml", this.context, [], null);
6414 }
6415  
6416 if (node.namespaceURI === "http://www.w3.org/1999/xhtml") {
6417 if (node.localName === 'select')
6418 return this.setInsertionMode('inSelect');
6419 if (node.localName === 'td' || node.localName === 'th')
6420 return this.setInsertionMode('inCell');
6421 if (node.localName === 'tr')
6422 return this.setInsertionMode('inRow');
6423 if (node.localName === 'tbody' || node.localName === 'thead' || node.localName === 'tfoot')
6424 return this.setInsertionMode('inTableBody');
6425 if (node.localName === 'caption')
6426 return this.setInsertionMode('inCaption');
6427 if (node.localName === 'colgroup')
6428 return this.setInsertionMode('inColumnGroup');
6429 if (node.localName === 'table')
6430 return this.setInsertionMode('inTable');
6431 if (node.localName === 'head' && !last)
6432 return this.setInsertionMode('inHead');
6433 if (node.localName === 'body')
6434 return this.setInsertionMode('inBody');
6435 if (node.localName === 'frameset')
6436 return this.setInsertionMode('inFrameset');
6437 if (node.localName === 'html')
6438 if (!this.openElements.headElement)
6439 return this.setInsertionMode('beforeHead');
6440 else
6441 return this.setInsertionMode('afterHead');
6442 }
6443  
6444 if (last)
6445 return this.setInsertionMode('inBody');
6446 }
6447 };
6448  
6449 TreeBuilder.prototype.processGenericRCDATAStartTag = function(name, attributes) {
6450 this.insertElement(name, attributes);
6451 this.tokenizer.setState(Tokenizer.RCDATA);
6452 this.originalInsertionMode = this.insertionModeName;
6453 this.setInsertionMode('text');
6454 };
6455  
6456 TreeBuilder.prototype.processGenericRawTextStartTag = function(name, attributes) {
6457 this.insertElement(name, attributes);
6458 this.tokenizer.setState(Tokenizer.RAWTEXT);
6459 this.originalInsertionMode = this.insertionModeName;
6460 this.setInsertionMode('text');
6461 };
6462  
6463 TreeBuilder.prototype.adjustMathMLAttributes = function(attributes) {
6464 attributes.forEach(function(a) {
6465 a.namespaceURI = "http://www.w3.org/1998/Math/MathML";
6466 if (constants.MATHMLAttributeMap[a.nodeName])
6467 a.nodeName = constants.MATHMLAttributeMap[a.nodeName];
6468 });
6469 return attributes;
6470 };
6471  
6472 TreeBuilder.prototype.adjustSVGTagNameCase = function(name) {
6473 return constants.SVGTagMap[name] || name;
6474 };
6475  
6476 TreeBuilder.prototype.adjustSVGAttributes = function(attributes) {
6477 attributes.forEach(function(a) {
6478 a.namespaceURI = "http://www.w3.org/2000/svg";
6479 if (constants.SVGAttributeMap[a.nodeName])
6480 a.nodeName = constants.SVGAttributeMap[a.nodeName];
6481 });
6482 return attributes;
6483 };
6484  
6485 TreeBuilder.prototype.adjustForeignAttributes = function(attributes) {
6486 for (var i = 0; i < attributes.length; i++) {
6487 var attribute = attributes[i];
6488 var adjusted = constants.ForeignAttributeMap[attribute.nodeName];
6489 if (adjusted) {
6490 attribute.nodeName = adjusted.localName;
6491 attribute.prefix = adjusted.prefix;
6492 attribute.namespaceURI = adjusted.namespaceURI;
6493 }
6494 }
6495 return attributes;
6496 };
6497  
6498 function formatMessage(format, args) {
6499 return format.replace(new RegExp('{[0-9a-z-]+}', 'gi'), function(match) {
6500 return args[match.slice(1, -1)] || match;
6501 });
6502 }
6503  
6504 exports.TreeBuilder = TreeBuilder;
6505  
6506 },
6507 {"./ElementStack":1,"./StackItem":4,"./Tokenizer":5,"./constants":7,"./messages.json":8,"assert":13,"events":16}],
6508 7:[function(_dereq_,module,exports){
6509 exports.SVGTagMap = {
6510 "altglyph": "altGlyph",
6511 "altglyphdef": "altGlyphDef",
6512 "altglyphitem": "altGlyphItem",
6513 "animatecolor": "animateColor",
6514 "animatemotion": "animateMotion",
6515 "animatetransform": "animateTransform",
6516 "clippath": "clipPath",
6517 "feblend": "feBlend",
6518 "fecolormatrix": "feColorMatrix",
6519 "fecomponenttransfer": "feComponentTransfer",
6520 "fecomposite": "feComposite",
6521 "feconvolvematrix": "feConvolveMatrix",
6522 "fediffuselighting": "feDiffuseLighting",
6523 "fedisplacementmap": "feDisplacementMap",
6524 "fedistantlight": "feDistantLight",
6525 "feflood": "feFlood",
6526 "fefunca": "feFuncA",
6527 "fefuncb": "feFuncB",
6528 "fefuncg": "feFuncG",
6529 "fefuncr": "feFuncR",
6530 "fegaussianblur": "feGaussianBlur",
6531 "feimage": "feImage",
6532 "femerge": "feMerge",
6533 "femergenode": "feMergeNode",
6534 "femorphology": "feMorphology",
6535 "feoffset": "feOffset",
6536 "fepointlight": "fePointLight",
6537 "fespecularlighting": "feSpecularLighting",
6538 "fespotlight": "feSpotLight",
6539 "fetile": "feTile",
6540 "feturbulence": "feTurbulence",
6541 "foreignobject": "foreignObject",
6542 "glyphref": "glyphRef",
6543 "lineargradient": "linearGradient",
6544 "radialgradient": "radialGradient",
6545 "textpath": "textPath"
6546 };
6547  
6548 exports.MATHMLAttributeMap = {
6549 definitionurl: 'definitionURL'
6550 };
6551  
6552 exports.SVGAttributeMap = {
6553 attributename: 'attributeName',
6554 attributetype: 'attributeType',
6555 basefrequency: 'baseFrequency',
6556 baseprofile: 'baseProfile',
6557 calcmode: 'calcMode',
6558 clippathunits: 'clipPathUnits',
6559 contentscripttype: 'contentScriptType',
6560 contentstyletype: 'contentStyleType',
6561 diffuseconstant: 'diffuseConstant',
6562 edgemode: 'edgeMode',
6563 externalresourcesrequired: 'externalResourcesRequired',
6564 filterres: 'filterRes',
6565 filterunits: 'filterUnits',
6566 glyphref: 'glyphRef',
6567 gradienttransform: 'gradientTransform',
6568 gradientunits: 'gradientUnits',
6569 kernelmatrix: 'kernelMatrix',
6570 kernelunitlength: 'kernelUnitLength',
6571 keypoints: 'keyPoints',
6572 keysplines: 'keySplines',
6573 keytimes: 'keyTimes',
6574 lengthadjust: 'lengthAdjust',
6575 limitingconeangle: 'limitingConeAngle',
6576 markerheight: 'markerHeight',
6577 markerunits: 'markerUnits',
6578 markerwidth: 'markerWidth',
6579 maskcontentunits: 'maskContentUnits',
6580 maskunits: 'maskUnits',
6581 numoctaves: 'numOctaves',
6582 pathlength: 'pathLength',
6583 patterncontentunits: 'patternContentUnits',
6584 patterntransform: 'patternTransform',
6585 patternunits: 'patternUnits',
6586 pointsatx: 'pointsAtX',
6587 pointsaty: 'pointsAtY',
6588 pointsatz: 'pointsAtZ',
6589 preservealpha: 'preserveAlpha',
6590 preserveaspectratio: 'preserveAspectRatio',
6591 primitiveunits: 'primitiveUnits',
6592 refx: 'refX',
6593 refy: 'refY',
6594 repeatcount: 'repeatCount',
6595 repeatdur: 'repeatDur',
6596 requiredextensions: 'requiredExtensions',
6597 requiredfeatures: 'requiredFeatures',
6598 specularconstant: 'specularConstant',
6599 specularexponent: 'specularExponent',
6600 spreadmethod: 'spreadMethod',
6601 startoffset: 'startOffset',
6602 stddeviation: 'stdDeviation',
6603 stitchtiles: 'stitchTiles',
6604 surfacescale: 'surfaceScale',
6605 systemlanguage: 'systemLanguage',
6606 tablevalues: 'tableValues',
6607 targetx: 'targetX',
6608 targety: 'targetY',
6609 textlength: 'textLength',
6610 viewbox: 'viewBox',
6611 viewtarget: 'viewTarget',
6612 xchannelselector: 'xChannelSelector',
6613 ychannelselector: 'yChannelSelector',
6614 zoomandpan: 'zoomAndPan'
6615 };
6616  
6617 exports.ForeignAttributeMap = {
6618 "xlink:actuate": {prefix: "xlink", localName: "actuate", namespaceURI: "http://www.w3.org/1999/xlink"},
6619 "xlink:arcrole": {prefix: "xlink", localName: "arcrole", namespaceURI: "http://www.w3.org/1999/xlink"},
6620 "xlink:href": {prefix: "xlink", localName: "href", namespaceURI: "http://www.w3.org/1999/xlink"},
6621 "xlink:role": {prefix: "xlink", localName: "role", namespaceURI: "http://www.w3.org/1999/xlink"},
6622 "xlink:show": {prefix: "xlink", localName: "show", namespaceURI: "http://www.w3.org/1999/xlink"},
6623 "xlink:title": {prefix: "xlink", localName: "title", namespaceURI: "http://www.w3.org/1999/xlink"},
6624 "xlink:type": {prefix: "xlink", localName: "title", namespaceURI: "http://www.w3.org/1999/xlink"},
6625 "xml:base": {prefix: "xml", localName: "base", namespaceURI: "http://www.w3.org/XML/1998/namespace"},
6626 "xml:lang": {prefix: "xml", localName: "lang", namespaceURI: "http://www.w3.org/XML/1998/namespace"},
6627 "xml:space": {prefix: "xml", localName: "space", namespaceURI: "http://www.w3.org/XML/1998/namespace"},
6628 "xmlns": {prefix: null, localName: "xmlns", namespaceURI: "http://www.w3.org/2000/xmlns/"},
6629 "xmlns:xlink": {prefix: "xmlns", localName: "xlink", namespaceURI: "http://www.w3.org/2000/xmlns/"},
6630 };
6631 },
6632 {}],
6633 8:[function(_dereq_,module,exports){
6634 module.exports={
6635 "null-character":
6636 "Null character in input stream, replaced with U+FFFD.",
6637 "invalid-codepoint":
6638 "Invalid codepoint in stream",
6639 "incorrectly-placed-solidus":
6640 "Solidus (/) incorrectly placed in tag.",
6641 "incorrect-cr-newline-entity":
6642 "Incorrect CR newline entity, replaced with LF.",
6643 "illegal-windows-1252-entity":
6644 "Entity used with illegal number (windows-1252 reference).",
6645 "cant-convert-numeric-entity":
6646 "Numeric entity couldn't be converted to character (codepoint U+{charAsInt}).",
6647 "invalid-numeric-entity-replaced":
6648 "Numeric entity represents an illegal codepoint. Expanded to the C1 controls range.",
6649 "numeric-entity-without-semicolon":
6650 "Numeric entity didn't end with ';'.",
6651 "expected-numeric-entity-but-got-eof":
6652 "Numeric entity expected. Got end of file instead.",
6653 "expected-numeric-entity":
6654 "Numeric entity expected but none found.",
6655 "named-entity-without-semicolon":
6656 "Named entity didn't end with ';'.",
6657 "expected-named-entity":
6658 "Named entity expected. Got none.",
6659 "attributes-in-end-tag":
6660 "End tag contains unexpected attributes.",
6661 "self-closing-flag-on-end-tag":
6662 "End tag contains unexpected self-closing flag.",
6663 "bare-less-than-sign-at-eof":
6664 "End of file after <.",
6665 "expected-tag-name-but-got-right-bracket":
6666 "Expected tag name. Got '>' instead.",
6667 "expected-tag-name-but-got-question-mark":
6668 "Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)",
6669 "expected-tag-name":
6670 "Expected tag name. Got something else instead.",
6671 "expected-closing-tag-but-got-right-bracket":
6672 "Expected closing tag. Got '>' instead. Ignoring '</>'.",
6673 "expected-closing-tag-but-got-eof":
6674 "Expected closing tag. Unexpected end of file.",
6675 "expected-closing-tag-but-got-char":
6676 "Expected closing tag. Unexpected character '{data}' found.",
6677 "eof-in-tag-name":
6678 "Unexpected end of file in the tag name.",
6679 "expected-attribute-name-but-got-eof":
6680 "Unexpected end of file. Expected attribute name instead.",
6681 "eof-in-attribute-name":
6682 "Unexpected end of file in attribute name.",
6683 "invalid-character-in-attribute-name":
6684 "Invalid character in attribute name.",
6685 "duplicate-attribute":
6686 "Dropped duplicate attribute '{name}' on tag.",
6687 "expected-end-of-tag-but-got-eof":
6688 "Unexpected end of file. Expected = or end of tag.",
6689 "expected-attribute-value-but-got-eof":
6690 "Unexpected end of file. Expected attribute value.",
6691 "expected-attribute-value-but-got-right-bracket":
6692 "Expected attribute value. Got '>' instead.",
6693 "unexpected-character-in-unquoted-attribute-value":
6694 "Unexpected character in unquoted attribute",
6695 "invalid-character-after-attribute-name":
6696 "Unexpected character after attribute name.",
6697 "unexpected-character-after-attribute-value":
6698 "Unexpected character after attribute value.",
6699 "eof-in-attribute-value-double-quote":
6700 "Unexpected end of file in attribute value (\").",
6701 "eof-in-attribute-value-single-quote":
6702 "Unexpected end of file in attribute value (').",
6703 "eof-in-attribute-value-no-quotes":
6704 "Unexpected end of file in attribute value.",
6705 "eof-after-attribute-value":
6706 "Unexpected end of file after attribute value.",
6707 "unexpected-eof-after-solidus-in-tag":
6708 "Unexpected end of file in tag. Expected >.",
6709 "unexpected-character-after-solidus-in-tag":
6710 "Unexpected character after / in tag. Expected >.",
6711 "expected-dashes-or-doctype":
6712 "Expected '--' or 'DOCTYPE'. Not found.",
6713 "unexpected-bang-after-double-dash-in-comment":
6714 "Unexpected ! after -- in comment.",
6715 "incorrect-comment":
6716 "Incorrect comment.",
6717 "eof-in-comment":
6718 "Unexpected end of file in comment.",
6719 "eof-in-comment-end-dash":
6720 "Unexpected end of file in comment (-).",
6721 "unexpected-dash-after-double-dash-in-comment":
6722 "Unexpected '-' after '--' found in comment.",
6723 "eof-in-comment-double-dash":
6724 "Unexpected end of file in comment (--).",
6725 "eof-in-comment-end-bang-state":
6726 "Unexpected end of file in comment.",
6727 "unexpected-char-in-comment":
6728 "Unexpected character in comment found.",
6729 "need-space-after-doctype":
6730 "No space after literal string 'DOCTYPE'.",
6731 "expected-doctype-name-but-got-right-bracket":
6732 "Unexpected > character. Expected DOCTYPE name.",
6733 "expected-doctype-name-but-got-eof":
6734 "Unexpected end of file. Expected DOCTYPE name.",
6735 "eof-in-doctype-name":
6736 "Unexpected end of file in DOCTYPE name.",
6737 "eof-in-doctype":
6738 "Unexpected end of file in DOCTYPE.",
6739 "expected-space-or-right-bracket-in-doctype":
6740 "Expected space or '>'. Got '{data}'.",
6741 "unexpected-end-of-doctype":
6742 "Unexpected end of DOCTYPE.",
6743 "unexpected-char-in-doctype":
6744 "Unexpected character in DOCTYPE.",
6745 "eof-in-bogus-doctype":
6746 "Unexpected end of file in bogus doctype.",
6747 "eof-in-innerhtml":
6748 "Unexpected EOF in inner html mode.",
6749 "unexpected-doctype":
6750 "Unexpected DOCTYPE. Ignored.",
6751 "non-html-root":
6752 "html needs to be the first start tag.",
6753 "expected-doctype-but-got-eof":
6754 "Unexpected End of file. Expected DOCTYPE.",
6755 "unknown-doctype":
6756 "Erroneous DOCTYPE. Expected <!DOCTYPE html>.",
6757 "quirky-doctype":
6758 "Quirky doctype. Expected <!DOCTYPE html>.",
6759 "almost-standards-doctype":
6760 "Almost standards mode doctype. Expected <!DOCTYPE html>.",
6761 "obsolete-doctype":
6762 "Obsolete doctype. Expected <!DOCTYPE html>.",
6763 "expected-doctype-but-got-chars":
6764 "Non-space characters found without seeing a doctype first. Expected e.g. <!DOCTYPE html>.",
6765 "expected-doctype-but-got-start-tag":
6766 "Start tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.",
6767 "expected-doctype-but-got-end-tag":
6768 "End tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.",
6769 "end-tag-after-implied-root":
6770 "Unexpected end tag ({name}) after the (implied) root element.",
6771 "expected-named-closing-tag-but-got-eof":
6772 "Unexpected end of file. Expected end tag ({name}).",
6773 "two-heads-are-not-better-than-one":
6774 "Unexpected start tag head in existing head. Ignored.",
6775 "unexpected-end-tag":
6776 "Unexpected end tag ({name}). Ignored.",
6777 "unexpected-implied-end-tag":
6778 "End tag {name} implied, but there were open elements.",
6779 "unexpected-start-tag-out-of-my-head":
6780 "Unexpected start tag ({name}) that can be in head. Moved.",
6781 "unexpected-start-tag":
6782 "Unexpected start tag ({name}).",
6783 "missing-end-tag":
6784 "Missing end tag ({name}).",
6785 "missing-end-tags":
6786 "Missing end tags ({name}).",
6787 "unexpected-start-tag-implies-end-tag":
6788 "Unexpected start tag ({startName}) implies end tag ({endName}).",
6789 "unexpected-start-tag-treated-as":
6790 "Unexpected start tag ({originalName}). Treated as {newName}.",
6791 "deprecated-tag":
6792 "Unexpected start tag {name}. Don't use it!",
6793 "unexpected-start-tag-ignored":
6794 "Unexpected start tag {name}. Ignored.",
6795 "expected-one-end-tag-but-got-another":
6796 "Unexpected end tag ({gotName}). Missing end tag ({expectedName}).",
6797 "end-tag-too-early":
6798 "End tag ({name}) seen too early. Expected other end tag.",
6799 "end-tag-too-early-named":
6800 "Unexpected end tag ({gotName}). Expected end tag ({expectedName}.",
6801 "end-tag-too-early-ignored":
6802 "End tag ({name}) seen too early. Ignored.",
6803 "adoption-agency-1.1":
6804 "End tag ({name}) violates step 1, paragraph 1 of the adoption agency algorithm.",
6805 "adoption-agency-1.2":
6806 "End tag ({name}) violates step 1, paragraph 2 of the adoption agency algorithm.",
6807 "adoption-agency-1.3":
6808 "End tag ({name}) violates step 1, paragraph 3 of the adoption agency algorithm.",
6809 "adoption-agency-4.4":
6810 "End tag ({name}) violates step 4, paragraph 4 of the adoption agency algorithm.",
6811 "unexpected-end-tag-treated-as":
6812 "Unexpected end tag ({originalName}). Treated as {newName}.",
6813 "no-end-tag":
6814 "This element ({name}) has no end tag.",
6815 "unexpected-implied-end-tag-in-table":
6816 "Unexpected implied end tag ({name}) in the table phase.",
6817 "unexpected-implied-end-tag-in-table-body":
6818 "Unexpected implied end tag ({name}) in the table body phase.",
6819 "unexpected-char-implies-table-voodoo":
6820 "Unexpected non-space characters in table context caused voodoo mode.",
6821 "unexpected-hidden-input-in-table":
6822 "Unexpected input with type hidden in table context.",
6823 "unexpected-form-in-table":
6824 "Unexpected form in table context.",
6825 "unexpected-start-tag-implies-table-voodoo":
6826 "Unexpected start tag ({name}) in table context caused voodoo mode.",
6827 "unexpected-end-tag-implies-table-voodoo":
6828 "Unexpected end tag ({name}) in table context caused voodoo mode.",
6829 "unexpected-cell-in-table-body":
6830 "Unexpected table cell start tag ({name}) in the table body phase.",
6831 "unexpected-cell-end-tag":
6832 "Got table cell end tag ({name}) while required end tags are missing.",
6833 "unexpected-end-tag-in-table-body":
6834 "Unexpected end tag ({name}) in the table body phase. Ignored.",
6835 "unexpected-implied-end-tag-in-table-row":
6836 "Unexpected implied end tag ({name}) in the table row phase.",
6837 "unexpected-end-tag-in-table-row":
6838 "Unexpected end tag ({name}) in the table row phase. Ignored.",
6839 "unexpected-select-in-select":
6840 "Unexpected select start tag in the select phase treated as select end tag.",
6841 "unexpected-input-in-select":
6842 "Unexpected input start tag in the select phase.",
6843 "unexpected-start-tag-in-select":
6844 "Unexpected start tag token ({name}) in the select phase. Ignored.",
6845 "unexpected-end-tag-in-select":
6846 "Unexpected end tag ({name}) in the select phase. Ignored.",
6847 "unexpected-table-element-start-tag-in-select-in-table":
6848 "Unexpected table element start tag ({name}) in the select in table phase.",
6849 "unexpected-table-element-end-tag-in-select-in-table":
6850 "Unexpected table element end tag ({name}) in the select in table phase.",
6851 "unexpected-char-after-body":
6852 "Unexpected non-space characters in the after body phase.",
6853 "unexpected-start-tag-after-body":
6854 "Unexpected start tag token ({name}) in the after body phase.",
6855 "unexpected-end-tag-after-body":
6856 "Unexpected end tag token ({name}) in the after body phase.",
6857 "unexpected-char-in-frameset":
6858 "Unepxected characters in the frameset phase. Characters ignored.",
6859 "unexpected-start-tag-in-frameset":
6860 "Unexpected start tag token ({name}) in the frameset phase. Ignored.",
6861 "unexpected-frameset-in-frameset-innerhtml":
6862 "Unexpected end tag token (frameset in the frameset phase (innerHTML).",
6863 "unexpected-end-tag-in-frameset":
6864 "Unexpected end tag token ({name}) in the frameset phase. Ignored.",
6865 "unexpected-char-after-frameset":
6866 "Unexpected non-space characters in the after frameset phase. Ignored.",
6867 "unexpected-start-tag-after-frameset":
6868 "Unexpected start tag ({name}) in the after frameset phase. Ignored.",
6869 "unexpected-end-tag-after-frameset":
6870 "Unexpected end tag ({name}) in the after frameset phase. Ignored.",
6871 "expected-eof-but-got-char":
6872 "Unexpected non-space characters. Expected end of file.",
6873 "expected-eof-but-got-start-tag":
6874 "Unexpected start tag ({name}). Expected end of file.",
6875 "expected-eof-but-got-end-tag":
6876 "Unexpected end tag ({name}). Expected end of file.",
6877 "unexpected-end-table-in-caption":
6878 "Unexpected end table tag in caption. Generates implied end caption.",
6879 "end-html-in-innerhtml":
6880 "Unexpected html end tag in inner html mode.",
6881 "eof-in-table":
6882 "Unexpected end of file. Expected table content.",
6883 "eof-in-script":
6884 "Unexpected end of file. Expected script content.",
6885 "non-void-element-with-trailing-solidus":
6886 "Trailing solidus not allowed on element {name}.",
6887 "unexpected-html-element-in-foreign-content":
6888 "HTML start tag \"{name}\" in a foreign namespace context.",
6889 "unexpected-start-tag-in-table":
6890 "Unexpected {name}. Expected table content."
6891 }
6892 },
6893 {}],
6894 9:[function(_dereq_,module,exports){
6895 var SAXTreeBuilder = _dereq_('./SAXTreeBuilder').SAXTreeBuilder;
6896 var Tokenizer = _dereq_('../Tokenizer').Tokenizer;
6897 var TreeParser = _dereq_('./TreeParser').TreeParser;
6898  
6899 function SAXParser() {
6900 this.contentHandler = null;
6901 this._errorHandler = null;
6902 this._treeBuilder = new SAXTreeBuilder();
6903 this._tokenizer = new Tokenizer(this._treeBuilder);
6904 this._scriptingEnabled = false;
6905 }
6906  
6907 SAXParser.prototype.parse = function(source) {
6908 this._tokenizer.tokenize(source);
6909 var document = this._treeBuilder.document;
6910 if (document) {
6911 new TreeParser(this.contentHandler).parse(document);
6912 }
6913 };
6914  
6915 SAXParser.prototype.parseFragment = function(source, context) {
6916 this._treeBuilder.setFragmentContext(context);
6917 this._tokenizer.tokenize(source);
6918 var fragment = this._treeBuilder.getFragment();
6919 if (fragment) {
6920 new TreeParser(this.contentHandler).parse(fragment);
6921 }
6922 };
6923  
6924 Object.defineProperty(SAXParser.prototype, 'scriptingEnabled', {
6925 get: function() {
6926 return this._scriptingEnabled;
6927 },
6928 set: function(value) {
6929 this._scriptingEnabled = value;
6930 this._treeBuilder.scriptingEnabled = value;
6931 }
6932 });
6933  
6934 Object.defineProperty(SAXParser.prototype, 'errorHandler', {
6935 get: function() {
6936 return this._errorHandler;
6937 },
6938 set: function(value) {
6939 this._errorHandler = value;
6940 this._treeBuilder.errorHandler = value;
6941 }
6942 });
6943  
6944 exports.SAXParser = SAXParser;
6945  
6946 },
6947 {"../Tokenizer":5,"./SAXTreeBuilder":10,"./TreeParser":11}],
6948 10:[function(_dereq_,module,exports){
6949 var util = _dereq_('util');
6950 var TreeBuilder = _dereq_('../TreeBuilder').TreeBuilder;
6951  
6952 function SAXTreeBuilder() {
6953 TreeBuilder.call(this);
6954 }
6955  
6956 util.inherits(SAXTreeBuilder, TreeBuilder);
6957  
6958 SAXTreeBuilder.prototype.start = function(tokenizer) {
6959 this.document = new Document(this.tokenizer);
6960 };
6961  
6962 SAXTreeBuilder.prototype.end = function() {
6963 this.document.endLocator = this.tokenizer;
6964 };
6965  
6966 SAXTreeBuilder.prototype.insertDoctype = function(name, publicId, systemId) {
6967 var doctype = new DTD(this.tokenizer, name, publicId, systemId);
6968 doctype.endLocator = this.tokenizer;
6969 this.document.appendChild(doctype);
6970 };
6971  
6972 SAXTreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {
6973 var element = new Element(this.tokenizer, namespaceURI, localName, localName, attributes || []);
6974 return element;
6975 };
6976  
6977 SAXTreeBuilder.prototype.insertComment = function(data, parent) {
6978 if (!parent)
6979 parent = this.currentStackItem();
6980 var comment = new Comment(this.tokenizer, data);
6981 parent.appendChild(comment);
6982 };
6983  
6984 SAXTreeBuilder.prototype.appendCharacters = function(parent, data) {
6985 var text = new Characters(this.tokenizer, data);
6986 parent.appendChild(text);
6987 };
6988  
6989 SAXTreeBuilder.prototype.insertText = function(data) {
6990 if (this.redirectAttachToFosterParent && this.openElements.top.isFosterParenting()) {
6991 var tableIndex = this.openElements.findIndex('table');
6992 var tableItem = this.openElements.item(tableIndex);
6993 var table = tableItem.node;
6994 if (tableIndex === 0) {
6995 return this.appendCharacters(table, data);
6996 }
6997 var text = new Characters(this.tokenizer, data);
6998 var parent = table.parentNode;
6999 if (parent) {
7000 parent.insertBetween(text, table.previousSibling, table);
7001 return;
7002 }
7003 var stackParent = this.openElements.item(tableIndex - 1).node;
7004 stackParent.appendChild(text);
7005 return;
7006 }
7007 this.appendCharacters(this.currentStackItem().node, data);
7008 };
7009  
7010 SAXTreeBuilder.prototype.attachNode = function(node, parent) {
7011 parent.appendChild(node);
7012 };
7013  
7014 SAXTreeBuilder.prototype.attachNodeToFosterParent = function(child, table, stackParent) {
7015 var parent = table.parentNode;
7016 if (parent)
7017 parent.insertBetween(child, table.previousSibling, table);
7018 else
7019 stackParent.appendChild(child);
7020 };
7021  
7022 SAXTreeBuilder.prototype.detachFromParent = function(element) {
7023 element.detach();
7024 };
7025  
7026 SAXTreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {
7027 newParent.appendChildren(oldParent.firstChild);
7028 };
7029  
7030 SAXTreeBuilder.prototype.getFragment = function() {
7031 var fragment = new DocumentFragment();
7032 this.reparentChildren(this.openElements.rootNode, fragment);
7033 return fragment;
7034 };
7035  
7036 function getAttribute(node, name) {
7037 for (var i = 0; i < node.attributes.length; i++) {
7038 var attribute = node.attributes[i];
7039 if (attribute.nodeName === name)
7040 return attribute.nodeValue;
7041 }
7042 }
7043  
7044 SAXTreeBuilder.prototype.addAttributesToElement = function(element, attributes) {
7045 for (var i = 0; i < attributes.length; i++) {
7046 var attribute = attributes[i];
7047 if (!getAttribute(element, attribute.nodeName))
7048 element.attributes.push(attribute);
7049 }
7050 };
7051  
7052 var NodeType = {
7053 CDATA: 1,
7054 CHARACTERS: 2,
7055 COMMENT: 3,
7056 DOCUMENT: 4,
7057 DOCUMENT_FRAGMENT: 5,
7058 DTD: 6,
7059 ELEMENT: 7,
7060 ENTITY: 8,
7061 IGNORABLE_WHITESPACE: 9,
7062 PROCESSING_INSTRUCTION: 10,
7063 SKIPPED_ENTITY: 11
7064 };
7065 function Node(locator) {
7066 if (!locator) {
7067 this.columnNumber = -1;
7068 this.lineNumber = -1;
7069 } else {
7070 this.columnNumber = locator.columnNumber;
7071 this.lineNumber = locator.lineNumber;
7072 }
7073 this.parentNode = null;
7074 this.nextSibling = null;
7075 this.firstChild = null;
7076 }
7077 Node.prototype.visit = function(treeParser) {
7078 throw new Error("Not Implemented");
7079 };
7080 Node.prototype.revisit = function(treeParser) {
7081 return;
7082 };
7083 Node.prototype.detach = function() {
7084 if (this.parentNode !== null) {
7085 this.parentNode.removeChild(this);
7086 this.parentNode = null;
7087 }
7088 };
7089  
7090 Object.defineProperty(Node.prototype, 'previousSibling', {
7091 get: function() {
7092 var prev = null;
7093 var next = this.parentNode.firstChild;
7094 for(;;) {
7095 if (this == next) {
7096 return prev;
7097 }
7098 prev = next;
7099 next = next.nextSibling;
7100 }
7101 }
7102 });
7103  
7104  
7105 function ParentNode(locator) {
7106 Node.call(this, locator);
7107 this.lastChild = null;
7108 this._endLocator = null;
7109 }
7110  
7111 ParentNode.prototype = Object.create(Node.prototype);
7112 ParentNode.prototype.insertBefore = function(child, sibling) {
7113 if (!sibling) {
7114 return this.appendChild(child);
7115 }
7116 child.detach();
7117 child.parentNode = this;
7118 if (this.firstChild == sibling) {
7119 child.nextSibling = sibling;
7120 this.firstChild = child;
7121 } else {
7122 var prev = this.firstChild;
7123 var next = this.firstChild.nextSibling;
7124 while (next != sibling) {
7125 prev = next;
7126 next = next.nextSibling;
7127 }
7128 prev.nextSibling = child;
7129 child.nextSibling = next;
7130 }
7131 return child;
7132 };
7133  
7134 ParentNode.prototype.insertBetween = function(child, prev, next) {
7135 if (!next) {
7136 return this.appendChild(child);
7137 }
7138 child.detach();
7139 child.parentNode = this;
7140 child.nextSibling = next;
7141 if (!prev) {
7142 firstChild = child;
7143 } else {
7144 prev.nextSibling = child;
7145 }
7146 return child;
7147 };
7148 ParentNode.prototype.appendChild = function(child) {
7149 child.detach();
7150 child.parentNode = this;
7151 if (!this.firstChild) {
7152 this.firstChild = child;
7153 } else {
7154 this.lastChild.nextSibling = child;
7155 }
7156 this.lastChild = child;
7157 return child;
7158 };
7159 ParentNode.prototype.appendChildren = function(parent) {
7160 var child = parent.firstChild;
7161 if (!child) {
7162 return;
7163 }
7164 var another = parent;
7165 if (!this.firstChild) {
7166 this.firstChild = child;
7167 } else {
7168 this.lastChild.nextSibling = child;
7169 }
7170 this.lastChild = another.lastChild;
7171 do {
7172 child.parentNode = this;
7173 } while ((child = child.nextSibling));
7174 another.firstChild = null;
7175 another.lastChild = null;
7176 };
7177 ParentNode.prototype.removeChild = function(node) {
7178 if (this.firstChild == node) {
7179 this.firstChild = node.nextSibling;
7180 if (this.lastChild == node) {
7181 this.lastChild = null;
7182 }
7183 } else {
7184 var prev = this.firstChild;
7185 var next = this.firstChild.nextSibling;
7186 while (next != node) {
7187 prev = next;
7188 next = next.nextSibling;
7189 }
7190 prev.nextSibling = node.nextSibling;
7191 if (this.lastChild == node) {
7192 this.lastChild = prev;
7193 }
7194 }
7195 node.parentNode = null;
7196 return node;
7197 };
7198  
7199 Object.defineProperty(ParentNode.prototype, 'endLocator', {
7200 get: function() {
7201 return this._endLocator;
7202 },
7203 set: function(endLocator) {
7204 this._endLocator = {
7205 lineNumber: endLocator.lineNumber,
7206 columnNumber: endLocator.columnNumber
7207 };
7208 }
7209 });
7210 function Document (locator) {
7211 ParentNode.call(this, locator);
7212 this.nodeType = NodeType.DOCUMENT;
7213 }
7214  
7215 Document.prototype = Object.create(ParentNode.prototype);
7216 Document.prototype.visit = function(treeParser) {
7217 treeParser.startDocument(this);
7218 };
7219 Document.prototype.revisit = function(treeParser) {
7220 treeParser.endDocument(this.endLocator);
7221 };
7222 function DocumentFragment() {
7223 ParentNode.call(this, new Locator());
7224 this.nodeType = NodeType.DOCUMENT_FRAGMENT;
7225 }
7226  
7227 DocumentFragment.prototype = Object.create(ParentNode.prototype);
7228 DocumentFragment.prototype.visit = function(treeParser) {
7229 };
7230 function Element(locator, uri, localName, qName, atts, prefixMappings) {
7231 ParentNode.call(this, locator);
7232 this.uri = uri;
7233 this.localName = localName;
7234 this.qName = qName;
7235 this.attributes = atts;
7236 this.prefixMappings = prefixMappings;
7237 this.nodeType = NodeType.ELEMENT;
7238 }
7239  
7240 Element.prototype = Object.create(ParentNode.prototype);
7241 Element.prototype.visit = function(treeParser) {
7242 if (this.prefixMappings) {
7243 for (var key in prefixMappings) {
7244 var mapping = prefixMappings[key];
7245 treeParser.startPrefixMapping(mapping.getPrefix(),
7246 mapping.getUri(), this);
7247 }
7248 }
7249 treeParser.startElement(this.uri, this.localName, this.qName, this.attributes, this);
7250 };
7251 Element.prototype.revisit = function(treeParser) {
7252 treeParser.endElement(this.uri, this.localName, this.qName, this.endLocator);
7253 if (this.prefixMappings) {
7254 for (var key in prefixMappings) {
7255 var mapping = prefixMappings[key];
7256 treeParser.endPrefixMapping(mapping.getPrefix(), this.endLocator);
7257 }
7258 }
7259 };
7260 function Characters(locator, data){
7261 Node.call(this, locator);
7262 this.data = data;
7263 this.nodeType = NodeType.CHARACTERS;
7264 }
7265  
7266 Characters.prototype = Object.create(Node.prototype);
7267 Characters.prototype.visit = function (treeParser) {
7268 treeParser.characters(this.data, 0, this.data.length, this);
7269 };
7270 function IgnorableWhitespace(locator, data) {
7271 Node.call(this, locator);
7272 this.data = data;
7273 this.nodeType = NodeType.IGNORABLE_WHITESPACE;
7274 }
7275  
7276 IgnorableWhitespace.prototype = Object.create(Node.prototype);
7277 IgnorableWhitespace.prototype.visit = function(treeParser) {
7278 treeParser.ignorableWhitespace(this.data, 0, this.data.length, this);
7279 };
7280 function Comment(locator, data) {
7281 Node.call(this, locator);
7282 this.data = data;
7283 this.nodeType = NodeType.COMMENT;
7284 }
7285  
7286 Comment.prototype = Object.create(Node.prototype);
7287 Comment.prototype.visit = function(treeParser) {
7288 treeParser.comment(this.data, 0, this.data.length, this);
7289 };
7290 function CDATA(locator) {
7291 ParentNode.call(this, locator);
7292 this.nodeType = NodeType.CDATA;
7293 }
7294  
7295 CDATA.prototype = Object.create(ParentNode.prototype);
7296 CDATA.prototype.visit = function(treeParser) {
7297 treeParser.startCDATA(this);
7298 };
7299 CDATA.prototype.revisit = function(treeParser) {
7300 treeParser.endCDATA(this.endLocator);
7301 };
7302 function Entity(name) {
7303 ParentNode.call(this);
7304 this.name = name;
7305 this.nodeType = NodeType.ENTITY;
7306 }
7307  
7308 Entity.prototype = Object.create(ParentNode.prototype);
7309 Entity.prototype.visit = function(treeParser) {
7310 treeParser.startEntity(this.name, this);
7311 };
7312 Entity.prototype.revisit = function(treeParser) {
7313 treeParser.endEntity(this.name);
7314 };
7315  
7316 function SkippedEntity(name) {
7317 Node.call(this);
7318 this.name = name;
7319 this.nodeType = NodeType.SKIPPED_ENTITY;
7320 }
7321  
7322 SkippedEntity.prototype = Object.create(Node.prototype);
7323 SkippedEntity.prototype.visit = function(treeParser) {
7324 treeParser.skippedEntity(this.name, this);
7325 };
7326 function ProcessingInstruction(target, data) {
7327 Node.call(this);
7328 this.target = target;
7329 this.data = data;
7330 }
7331  
7332 ProcessingInstruction.prototype = Object.create(Node.prototype);
7333 ProcessingInstruction.prototype.visit = function(treeParser) {
7334 treeParser.processingInstruction(this.target, this.data, this);
7335 };
7336 ProcessingInstruction.prototype.getNodeType = function() {
7337 return NodeType.PROCESSING_INSTRUCTION;
7338 };
7339 function DTD(name, publicIdentifier, systemIdentifier) {
7340 ParentNode.call(this);
7341 this.name = name;
7342 this.publicIdentifier = publicIdentifier;
7343 this.systemIdentifier = systemIdentifier;
7344 this.nodeType = NodeType.DTD;
7345 }
7346  
7347 DTD.prototype = Object.create(ParentNode.prototype);
7348 DTD.prototype.visit = function(treeParser) {
7349 treeParser.startDTD(this.name, this.publicIdentifier, this.systemIdentifier, this);
7350 };
7351 DTD.prototype.revisit = function(treeParser) {
7352 treeParser.endDTD();
7353 };
7354  
7355 exports.SAXTreeBuilder = SAXTreeBuilder;
7356  
7357 },
7358 {"../TreeBuilder":6,"util":20}],
7359 11:[function(_dereq_,module,exports){
7360 function TreeParser(contentHandler, lexicalHandler){
7361 this.contentHandler;
7362 this.lexicalHandler;
7363 this.locatorDelegate;
7364  
7365 if (!contentHandler) {
7366 throw new IllegalArgumentException("contentHandler was null.");
7367 }
7368 this.contentHandler = contentHandler;
7369 if (!lexicalHandler) {
7370 this.lexicalHandler = new NullLexicalHandler();
7371 } else {
7372 this.lexicalHandler = lexicalHandler;
7373 }
7374 }
7375 TreeParser.prototype.parse = function(node) {
7376 this.contentHandler.documentLocator = this;
7377 var current = node;
7378 var next;
7379 for (;;) {
7380 current.visit(this);
7381 if (next = current.firstChild) {
7382 current = next;
7383 continue;
7384 }
7385 for (;;) {
7386 current.revisit(this);
7387 if (current == node) {
7388 return;
7389 }
7390 if (next = current.nextSibling) {
7391 current = next;
7392 break;
7393 }
7394 current = current.parentNode;
7395 }
7396 }
7397 };
7398 TreeParser.prototype.characters = function(ch, start, length, locator) {
7399 this.locatorDelegate = locator;
7400 this.contentHandler.characters(ch, start, length);
7401 };
7402 TreeParser.prototype.endDocument = function(locator) {
7403 this.locatorDelegate = locator;
7404 this.contentHandler.endDocument();
7405 };
7406 TreeParser.prototype.endElement = function(uri, localName, qName, locator) {
7407 this.locatorDelegate = locator;
7408 this.contentHandler.endElement(uri, localName, qName);
7409 };
7410 TreeParser.prototype.endPrefixMapping = function(prefix, locator) {
7411 this.locatorDelegate = locator;
7412 this.contentHandler.endPrefixMapping(prefix);
7413 };
7414 TreeParser.prototype.ignorableWhitespace = function(ch, start, length, locator) {
7415 this.locatorDelegate = locator;
7416 this.contentHandler.ignorableWhitespace(ch, start, length);
7417 };
7418 TreeParser.prototype.processingInstruction = function(target, data, locator) {
7419 this.locatorDelegate = locator;
7420 this.contentHandler.processingInstruction(target, data);
7421 };
7422 TreeParser.prototype.skippedEntity = function(name, locator) {
7423 this.locatorDelegate = locator;
7424 this.contentHandler.skippedEntity(name);
7425 };
7426 TreeParser.prototype.startDocument = function(locator) {
7427 this.locatorDelegate = locator;
7428 this.contentHandler.startDocument();
7429 };
7430 TreeParser.prototype.startElement = function(uri, localName, qName, atts, locator) {
7431 this.locatorDelegate = locator;
7432 this.contentHandler.startElement(uri, localName, qName, atts);
7433 };
7434 TreeParser.prototype.startPrefixMapping = function(prefix, uri, locator) {
7435 this.locatorDelegate = locator;
7436 this.contentHandler.startPrefixMapping(prefix, uri);
7437 };
7438 TreeParser.prototype.comment = function(ch, start, length, locator) {
7439 this.locatorDelegate = locator;
7440 this.lexicalHandler.comment(ch, start, length);
7441 };
7442 TreeParser.prototype.endCDATA = function(locator) {
7443 this.locatorDelegate = locator;
7444 this.lexicalHandler.endCDATA();
7445 };
7446 TreeParser.prototype.endDTD = function(locator) {
7447 this.locatorDelegate = locator;
7448 this.lexicalHandler.endDTD();
7449 };
7450 TreeParser.prototype.endEntity = function(name, locator) {
7451 this.locatorDelegate = locator;
7452 this.lexicalHandler.endEntity(name);
7453 };
7454 TreeParser.prototype.startCDATA = function(locator) {
7455 this.locatorDelegate = locator;
7456 this.lexicalHandler.startCDATA();
7457 };
7458 TreeParser.prototype.startDTD = function(name, publicId, systemId, locator) {
7459 this.locatorDelegate = locator;
7460 this.lexicalHandler.startDTD(name, publicId, systemId);
7461 };
7462 TreeParser.prototype.startEntity = function(name, locator) {
7463 this.locatorDelegate = locator;
7464 this.lexicalHandler.startEntity(name);
7465 };
7466  
7467 Object.defineProperty(TreeParser.prototype, 'columnNumber', {
7468 get: function() {
7469 if (!this.locatorDelegate)
7470 return -1;
7471 else
7472 return this.locatorDelegate.columnNumber;
7473 }
7474 });
7475  
7476 Object.defineProperty(TreeParser.prototype, 'lineNumber', {
7477 get: function() {
7478 if (!this.locatorDelegate)
7479 return -1;
7480 else
7481 return this.locatorDelegate.lineNumber;
7482 }
7483 });
7484 function NullLexicalHandler() {
7485  
7486 }
7487  
7488 NullLexicalHandler.prototype.comment = function() {};
7489 NullLexicalHandler.prototype.endCDATA = function() {};
7490 NullLexicalHandler.prototype.endDTD = function() {};
7491 NullLexicalHandler.prototype.endEntity = function() {};
7492 NullLexicalHandler.prototype.startCDATA = function() {};
7493 NullLexicalHandler.prototype.startDTD = function() {};
7494 NullLexicalHandler.prototype.startEntity = function() {};
7495  
7496 exports.TreeParser = TreeParser;
7497  
7498 },
7499 {}],
7500 12:[function(_dereq_,module,exports){
7501 module.exports = {
7502 "Aacute;": "\u00C1",
7503 "Aacute": "\u00C1",
7504 "aacute;": "\u00E1",
7505 "aacute": "\u00E1",
7506 "Abreve;": "\u0102",
7507 "abreve;": "\u0103",
7508 "ac;": "\u223E",
7509 "acd;": "\u223F",
7510 "acE;": "\u223E\u0333",
7511 "Acirc;": "\u00C2",
7512 "Acirc": "\u00C2",
7513 "acirc;": "\u00E2",
7514 "acirc": "\u00E2",
7515 "acute;": "\u00B4",
7516 "acute": "\u00B4",
7517 "Acy;": "\u0410",
7518 "acy;": "\u0430",
7519 "AElig;": "\u00C6",
7520 "AElig": "\u00C6",
7521 "aelig;": "\u00E6",
7522 "aelig": "\u00E6",
7523 "af;": "\u2061",
7524 "Afr;": "\uD835\uDD04",
7525 "afr;": "\uD835\uDD1E",
7526 "Agrave;": "\u00C0",
7527 "Agrave": "\u00C0",
7528 "agrave;": "\u00E0",
7529 "agrave": "\u00E0",
7530 "alefsym;": "\u2135",
7531 "aleph;": "\u2135",
7532 "Alpha;": "\u0391",
7533 "alpha;": "\u03B1",
7534 "Amacr;": "\u0100",
7535 "amacr;": "\u0101",
7536 "amalg;": "\u2A3F",
7537 "amp;": "\u0026",
7538 "amp": "\u0026",
7539 "AMP;": "\u0026",
7540 "AMP": "\u0026",
7541 "andand;": "\u2A55",
7542 "And;": "\u2A53",
7543 "and;": "\u2227",
7544 "andd;": "\u2A5C",
7545 "andslope;": "\u2A58",
7546 "andv;": "\u2A5A",
7547 "ang;": "\u2220",
7548 "ange;": "\u29A4",
7549 "angle;": "\u2220",
7550 "angmsdaa;": "\u29A8",
7551 "angmsdab;": "\u29A9",
7552 "angmsdac;": "\u29AA",
7553 "angmsdad;": "\u29AB",
7554 "angmsdae;": "\u29AC",
7555 "angmsdaf;": "\u29AD",
7556 "angmsdag;": "\u29AE",
7557 "angmsdah;": "\u29AF",
7558 "angmsd;": "\u2221",
7559 "angrt;": "\u221F",
7560 "angrtvb;": "\u22BE",
7561 "angrtvbd;": "\u299D",
7562 "angsph;": "\u2222",
7563 "angst;": "\u00C5",
7564 "angzarr;": "\u237C",
7565 "Aogon;": "\u0104",
7566 "aogon;": "\u0105",
7567 "Aopf;": "\uD835\uDD38",
7568 "aopf;": "\uD835\uDD52",
7569 "apacir;": "\u2A6F",
7570 "ap;": "\u2248",
7571 "apE;": "\u2A70",
7572 "ape;": "\u224A",
7573 "apid;": "\u224B",
7574 "apos;": "\u0027",
7575 "ApplyFunction;": "\u2061",
7576 "approx;": "\u2248",
7577 "approxeq;": "\u224A",
7578 "Aring;": "\u00C5",
7579 "Aring": "\u00C5",
7580 "aring;": "\u00E5",
7581 "aring": "\u00E5",
7582 "Ascr;": "\uD835\uDC9C",
7583 "ascr;": "\uD835\uDCB6",
7584 "Assign;": "\u2254",
7585 "ast;": "\u002A",
7586 "asymp;": "\u2248",
7587 "asympeq;": "\u224D",
7588 "Atilde;": "\u00C3",
7589 "Atilde": "\u00C3",
7590 "atilde;": "\u00E3",
7591 "atilde": "\u00E3",
7592 "Auml;": "\u00C4",
7593 "Auml": "\u00C4",
7594 "auml;": "\u00E4",
7595 "auml": "\u00E4",
7596 "awconint;": "\u2233",
7597 "awint;": "\u2A11",
7598 "backcong;": "\u224C",
7599 "backepsilon;": "\u03F6",
7600 "backprime;": "\u2035",
7601 "backsim;": "\u223D",
7602 "backsimeq;": "\u22CD",
7603 "Backslash;": "\u2216",
7604 "Barv;": "\u2AE7",
7605 "barvee;": "\u22BD",
7606 "barwed;": "\u2305",
7607 "Barwed;": "\u2306",
7608 "barwedge;": "\u2305",
7609 "bbrk;": "\u23B5",
7610 "bbrktbrk;": "\u23B6",
7611 "bcong;": "\u224C",
7612 "Bcy;": "\u0411",
7613 "bcy;": "\u0431",
7614 "bdquo;": "\u201E",
7615 "becaus;": "\u2235",
7616 "because;": "\u2235",
7617 "Because;": "\u2235",
7618 "bemptyv;": "\u29B0",
7619 "bepsi;": "\u03F6",
7620 "bernou;": "\u212C",
7621 "Bernoullis;": "\u212C",
7622 "Beta;": "\u0392",
7623 "beta;": "\u03B2",
7624 "beth;": "\u2136",
7625 "between;": "\u226C",
7626 "Bfr;": "\uD835\uDD05",
7627 "bfr;": "\uD835\uDD1F",
7628 "bigcap;": "\u22C2",
7629 "bigcirc;": "\u25EF",
7630 "bigcup;": "\u22C3",
7631 "bigodot;": "\u2A00",
7632 "bigoplus;": "\u2A01",
7633 "bigotimes;": "\u2A02",
7634 "bigsqcup;": "\u2A06",
7635 "bigstar;": "\u2605",
7636 "bigtriangledown;": "\u25BD",
7637 "bigtriangleup;": "\u25B3",
7638 "biguplus;": "\u2A04",
7639 "bigvee;": "\u22C1",
7640 "bigwedge;": "\u22C0",
7641 "bkarow;": "\u290D",
7642 "blacklozenge;": "\u29EB",
7643 "blacksquare;": "\u25AA",
7644 "blacktriangle;": "\u25B4",
7645 "blacktriangledown;": "\u25BE",
7646 "blacktriangleleft;": "\u25C2",
7647 "blacktriangleright;": "\u25B8",
7648 "blank;": "\u2423",
7649 "blk12;": "\u2592",
7650 "blk14;": "\u2591",
7651 "blk34;": "\u2593",
7652 "block;": "\u2588",
7653 "bne;": "\u003D\u20E5",
7654 "bnequiv;": "\u2261\u20E5",
7655 "bNot;": "\u2AED",
7656 "bnot;": "\u2310",
7657 "Bopf;": "\uD835\uDD39",
7658 "bopf;": "\uD835\uDD53",
7659 "bot;": "\u22A5",
7660 "bottom;": "\u22A5",
7661 "bowtie;": "\u22C8",
7662 "boxbox;": "\u29C9",
7663 "boxdl;": "\u2510",
7664 "boxdL;": "\u2555",
7665 "boxDl;": "\u2556",
7666 "boxDL;": "\u2557",
7667 "boxdr;": "\u250C",
7668 "boxdR;": "\u2552",
7669 "boxDr;": "\u2553",
7670 "boxDR;": "\u2554",
7671 "boxh;": "\u2500",
7672 "boxH;": "\u2550",
7673 "boxhd;": "\u252C",
7674 "boxHd;": "\u2564",
7675 "boxhD;": "\u2565",
7676 "boxHD;": "\u2566",
7677 "boxhu;": "\u2534",
7678 "boxHu;": "\u2567",
7679 "boxhU;": "\u2568",
7680 "boxHU;": "\u2569",
7681 "boxminus;": "\u229F",
7682 "boxplus;": "\u229E",
7683 "boxtimes;": "\u22A0",
7684 "boxul;": "\u2518",
7685 "boxuL;": "\u255B",
7686 "boxUl;": "\u255C",
7687 "boxUL;": "\u255D",
7688 "boxur;": "\u2514",
7689 "boxuR;": "\u2558",
7690 "boxUr;": "\u2559",
7691 "boxUR;": "\u255A",
7692 "boxv;": "\u2502",
7693 "boxV;": "\u2551",
7694 "boxvh;": "\u253C",
7695 "boxvH;": "\u256A",
7696 "boxVh;": "\u256B",
7697 "boxVH;": "\u256C",
7698 "boxvl;": "\u2524",
7699 "boxvL;": "\u2561",
7700 "boxVl;": "\u2562",
7701 "boxVL;": "\u2563",
7702 "boxvr;": "\u251C",
7703 "boxvR;": "\u255E",
7704 "boxVr;": "\u255F",
7705 "boxVR;": "\u2560",
7706 "bprime;": "\u2035",
7707 "breve;": "\u02D8",
7708 "Breve;": "\u02D8",
7709 "brvbar;": "\u00A6",
7710 "brvbar": "\u00A6",
7711 "bscr;": "\uD835\uDCB7",
7712 "Bscr;": "\u212C",
7713 "bsemi;": "\u204F",
7714 "bsim;": "\u223D",
7715 "bsime;": "\u22CD",
7716 "bsolb;": "\u29C5",
7717 "bsol;": "\u005C",
7718 "bsolhsub;": "\u27C8",
7719 "bull;": "\u2022",
7720 "bullet;": "\u2022",
7721 "bump;": "\u224E",
7722 "bumpE;": "\u2AAE",
7723 "bumpe;": "\u224F",
7724 "Bumpeq;": "\u224E",
7725 "bumpeq;": "\u224F",
7726 "Cacute;": "\u0106",
7727 "cacute;": "\u0107",
7728 "capand;": "\u2A44",
7729 "capbrcup;": "\u2A49",
7730 "capcap;": "\u2A4B",
7731 "cap;": "\u2229",
7732 "Cap;": "\u22D2",
7733 "capcup;": "\u2A47",
7734 "capdot;": "\u2A40",
7735 "CapitalDifferentialD;": "\u2145",
7736 "caps;": "\u2229\uFE00",
7737 "caret;": "\u2041",
7738 "caron;": "\u02C7",
7739 "Cayleys;": "\u212D",
7740 "ccaps;": "\u2A4D",
7741 "Ccaron;": "\u010C",
7742 "ccaron;": "\u010D",
7743 "Ccedil;": "\u00C7",
7744 "Ccedil": "\u00C7",
7745 "ccedil;": "\u00E7",
7746 "ccedil": "\u00E7",
7747 "Ccirc;": "\u0108",
7748 "ccirc;": "\u0109",
7749 "Cconint;": "\u2230",
7750 "ccups;": "\u2A4C",
7751 "ccupssm;": "\u2A50",
7752 "Cdot;": "\u010A",
7753 "cdot;": "\u010B",
7754 "cedil;": "\u00B8",
7755 "cedil": "\u00B8",
7756 "Cedilla;": "\u00B8",
7757 "cemptyv;": "\u29B2",
7758 "cent;": "\u00A2",
7759 "cent": "\u00A2",
7760 "centerdot;": "\u00B7",
7761 "CenterDot;": "\u00B7",
7762 "cfr;": "\uD835\uDD20",
7763 "Cfr;": "\u212D",
7764 "CHcy;": "\u0427",
7765 "chcy;": "\u0447",
7766 "check;": "\u2713",
7767 "checkmark;": "\u2713",
7768 "Chi;": "\u03A7",
7769 "chi;": "\u03C7",
7770 "circ;": "\u02C6",
7771 "circeq;": "\u2257",
7772 "circlearrowleft;": "\u21BA",
7773 "circlearrowright;": "\u21BB",
7774 "circledast;": "\u229B",
7775 "circledcirc;": "\u229A",
7776 "circleddash;": "\u229D",
7777 "CircleDot;": "\u2299",
7778 "circledR;": "\u00AE",
7779 "circledS;": "\u24C8",
7780 "CircleMinus;": "\u2296",
7781 "CirclePlus;": "\u2295",
7782 "CircleTimes;": "\u2297",
7783 "cir;": "\u25CB",
7784 "cirE;": "\u29C3",
7785 "cire;": "\u2257",
7786 "cirfnint;": "\u2A10",
7787 "cirmid;": "\u2AEF",
7788 "cirscir;": "\u29C2",
7789 "ClockwiseContourIntegral;": "\u2232",
7790 "CloseCurlyDoubleQuote;": "\u201D",
7791 "CloseCurlyQuote;": "\u2019",
7792 "clubs;": "\u2663",
7793 "clubsuit;": "\u2663",
7794 "colon;": "\u003A",
7795 "Colon;": "\u2237",
7796 "Colone;": "\u2A74",
7797 "colone;": "\u2254",
7798 "coloneq;": "\u2254",
7799 "comma;": "\u002C",
7800 "commat;": "\u0040",
7801 "comp;": "\u2201",
7802 "compfn;": "\u2218",
7803 "complement;": "\u2201",
7804 "complexes;": "\u2102",
7805 "cong;": "\u2245",
7806 "congdot;": "\u2A6D",
7807 "Congruent;": "\u2261",
7808 "conint;": "\u222E",
7809 "Conint;": "\u222F",
7810 "ContourIntegral;": "\u222E",
7811 "copf;": "\uD835\uDD54",
7812 "Copf;": "\u2102",
7813 "coprod;": "\u2210",
7814 "Coproduct;": "\u2210",
7815 "copy;": "\u00A9",
7816 "copy": "\u00A9",
7817 "COPY;": "\u00A9",
7818 "COPY": "\u00A9",
7819 "copysr;": "\u2117",
7820 "CounterClockwiseContourIntegral;": "\u2233",
7821 "crarr;": "\u21B5",
7822 "cross;": "\u2717",
7823 "Cross;": "\u2A2F",
7824 "Cscr;": "\uD835\uDC9E",
7825 "cscr;": "\uD835\uDCB8",
7826 "csub;": "\u2ACF",
7827 "csube;": "\u2AD1",
7828 "csup;": "\u2AD0",
7829 "csupe;": "\u2AD2",
7830 "ctdot;": "\u22EF",
7831 "cudarrl;": "\u2938",
7832 "cudarrr;": "\u2935",
7833 "cuepr;": "\u22DE",
7834 "cuesc;": "\u22DF",
7835 "cularr;": "\u21B6",
7836 "cularrp;": "\u293D",
7837 "cupbrcap;": "\u2A48",
7838 "cupcap;": "\u2A46",
7839 "CupCap;": "\u224D",
7840 "cup;": "\u222A",
7841 "Cup;": "\u22D3",
7842 "cupcup;": "\u2A4A",
7843 "cupdot;": "\u228D",
7844 "cupor;": "\u2A45",
7845 "cups;": "\u222A\uFE00",
7846 "curarr;": "\u21B7",
7847 "curarrm;": "\u293C",
7848 "curlyeqprec;": "\u22DE",
7849 "curlyeqsucc;": "\u22DF",
7850 "curlyvee;": "\u22CE",
7851 "curlywedge;": "\u22CF",
7852 "curren;": "\u00A4",
7853 "curren": "\u00A4",
7854 "curvearrowleft;": "\u21B6",
7855 "curvearrowright;": "\u21B7",
7856 "cuvee;": "\u22CE",
7857 "cuwed;": "\u22CF",
7858 "cwconint;": "\u2232",
7859 "cwint;": "\u2231",
7860 "cylcty;": "\u232D",
7861 "dagger;": "\u2020",
7862 "Dagger;": "\u2021",
7863 "daleth;": "\u2138",
7864 "darr;": "\u2193",
7865 "Darr;": "\u21A1",
7866 "dArr;": "\u21D3",
7867 "dash;": "\u2010",
7868 "Dashv;": "\u2AE4",
7869 "dashv;": "\u22A3",
7870 "dbkarow;": "\u290F",
7871 "dblac;": "\u02DD",
7872 "Dcaron;": "\u010E",
7873 "dcaron;": "\u010F",
7874 "Dcy;": "\u0414",
7875 "dcy;": "\u0434",
7876 "ddagger;": "\u2021",
7877 "ddarr;": "\u21CA",
7878 "DD;": "\u2145",
7879 "dd;": "\u2146",
7880 "DDotrahd;": "\u2911",
7881 "ddotseq;": "\u2A77",
7882 "deg;": "\u00B0",
7883 "deg": "\u00B0",
7884 "Del;": "\u2207",
7885 "Delta;": "\u0394",
7886 "delta;": "\u03B4",
7887 "demptyv;": "\u29B1",
7888 "dfisht;": "\u297F",
7889 "Dfr;": "\uD835\uDD07",
7890 "dfr;": "\uD835\uDD21",
7891 "dHar;": "\u2965",
7892 "dharl;": "\u21C3",
7893 "dharr;": "\u21C2",
7894 "DiacriticalAcute;": "\u00B4",
7895 "DiacriticalDot;": "\u02D9",
7896 "DiacriticalDoubleAcute;": "\u02DD",
7897 "DiacriticalGrave;": "\u0060",
7898 "DiacriticalTilde;": "\u02DC",
7899 "diam;": "\u22C4",
7900 "diamond;": "\u22C4",
7901 "Diamond;": "\u22C4",
7902 "diamondsuit;": "\u2666",
7903 "diams;": "\u2666",
7904 "die;": "\u00A8",
7905 "DifferentialD;": "\u2146",
7906 "digamma;": "\u03DD",
7907 "disin;": "\u22F2",
7908 "div;": "\u00F7",
7909 "divide;": "\u00F7",
7910 "divide": "\u00F7",
7911 "divideontimes;": "\u22C7",
7912 "divonx;": "\u22C7",
7913 "DJcy;": "\u0402",
7914 "djcy;": "\u0452",
7915 "dlcorn;": "\u231E",
7916 "dlcrop;": "\u230D",
7917 "dollar;": "\u0024",
7918 "Dopf;": "\uD835\uDD3B",
7919 "dopf;": "\uD835\uDD55",
7920 "Dot;": "\u00A8",
7921 "dot;": "\u02D9",
7922 "DotDot;": "\u20DC",
7923 "doteq;": "\u2250",
7924 "doteqdot;": "\u2251",
7925 "DotEqual;": "\u2250",
7926 "dotminus;": "\u2238",
7927 "dotplus;": "\u2214",
7928 "dotsquare;": "\u22A1",
7929 "doublebarwedge;": "\u2306",
7930 "DoubleContourIntegral;": "\u222F",
7931 "DoubleDot;": "\u00A8",
7932 "DoubleDownArrow;": "\u21D3",
7933 "DoubleLeftArrow;": "\u21D0",
7934 "DoubleLeftRightArrow;": "\u21D4",
7935 "DoubleLeftTee;": "\u2AE4",
7936 "DoubleLongLeftArrow;": "\u27F8",
7937 "DoubleLongLeftRightArrow;": "\u27FA",
7938 "DoubleLongRightArrow;": "\u27F9",
7939 "DoubleRightArrow;": "\u21D2",
7940 "DoubleRightTee;": "\u22A8",
7941 "DoubleUpArrow;": "\u21D1",
7942 "DoubleUpDownArrow;": "\u21D5",
7943 "DoubleVerticalBar;": "\u2225",
7944 "DownArrowBar;": "\u2913",
7945 "downarrow;": "\u2193",
7946 "DownArrow;": "\u2193",
7947 "Downarrow;": "\u21D3",
7948 "DownArrowUpArrow;": "\u21F5",
7949 "DownBreve;": "\u0311",
7950 "downdownarrows;": "\u21CA",
7951 "downharpoonleft;": "\u21C3",
7952 "downharpoonright;": "\u21C2",
7953 "DownLeftRightVector;": "\u2950",
7954 "DownLeftTeeVector;": "\u295E",
7955 "DownLeftVectorBar;": "\u2956",
7956 "DownLeftVector;": "\u21BD",
7957 "DownRightTeeVector;": "\u295F",
7958 "DownRightVectorBar;": "\u2957",
7959 "DownRightVector;": "\u21C1",
7960 "DownTeeArrow;": "\u21A7",
7961 "DownTee;": "\u22A4",
7962 "drbkarow;": "\u2910",
7963 "drcorn;": "\u231F",
7964 "drcrop;": "\u230C",
7965 "Dscr;": "\uD835\uDC9F",
7966 "dscr;": "\uD835\uDCB9",
7967 "DScy;": "\u0405",
7968 "dscy;": "\u0455",
7969 "dsol;": "\u29F6",
7970 "Dstrok;": "\u0110",
7971 "dstrok;": "\u0111",
7972 "dtdot;": "\u22F1",
7973 "dtri;": "\u25BF",
7974 "dtrif;": "\u25BE",
7975 "duarr;": "\u21F5",
7976 "duhar;": "\u296F",
7977 "dwangle;": "\u29A6",
7978 "DZcy;": "\u040F",
7979 "dzcy;": "\u045F",
7980 "dzigrarr;": "\u27FF",
7981 "Eacute;": "\u00C9",
7982 "Eacute": "\u00C9",
7983 "eacute;": "\u00E9",
7984 "eacute": "\u00E9",
7985 "easter;": "\u2A6E",
7986 "Ecaron;": "\u011A",
7987 "ecaron;": "\u011B",
7988 "Ecirc;": "\u00CA",
7989 "Ecirc": "\u00CA",
7990 "ecirc;": "\u00EA",
7991 "ecirc": "\u00EA",
7992 "ecir;": "\u2256",
7993 "ecolon;": "\u2255",
7994 "Ecy;": "\u042D",
7995 "ecy;": "\u044D",
7996 "eDDot;": "\u2A77",
7997 "Edot;": "\u0116",
7998 "edot;": "\u0117",
7999 "eDot;": "\u2251",
8000 "ee;": "\u2147",
8001 "efDot;": "\u2252",
8002 "Efr;": "\uD835\uDD08",
8003 "efr;": "\uD835\uDD22",
8004 "eg;": "\u2A9A",
8005 "Egrave;": "\u00C8",
8006 "Egrave": "\u00C8",
8007 "egrave;": "\u00E8",
8008 "egrave": "\u00E8",
8009 "egs;": "\u2A96",
8010 "egsdot;": "\u2A98",
8011 "el;": "\u2A99",
8012 "Element;": "\u2208",
8013 "elinters;": "\u23E7",
8014 "ell;": "\u2113",
8015 "els;": "\u2A95",
8016 "elsdot;": "\u2A97",
8017 "Emacr;": "\u0112",
8018 "emacr;": "\u0113",
8019 "empty;": "\u2205",
8020 "emptyset;": "\u2205",
8021 "EmptySmallSquare;": "\u25FB",
8022 "emptyv;": "\u2205",
8023 "EmptyVerySmallSquare;": "\u25AB",
8024 "emsp13;": "\u2004",
8025 "emsp14;": "\u2005",
8026 "emsp;": "\u2003",
8027 "ENG;": "\u014A",
8028 "eng;": "\u014B",
8029 "ensp;": "\u2002",
8030 "Eogon;": "\u0118",
8031 "eogon;": "\u0119",
8032 "Eopf;": "\uD835\uDD3C",
8033 "eopf;": "\uD835\uDD56",
8034 "epar;": "\u22D5",
8035 "eparsl;": "\u29E3",
8036 "eplus;": "\u2A71",
8037 "epsi;": "\u03B5",
8038 "Epsilon;": "\u0395",
8039 "epsilon;": "\u03B5",
8040 "epsiv;": "\u03F5",
8041 "eqcirc;": "\u2256",
8042 "eqcolon;": "\u2255",
8043 "eqsim;": "\u2242",
8044 "eqslantgtr;": "\u2A96",
8045 "eqslantless;": "\u2A95",
8046 "Equal;": "\u2A75",
8047 "equals;": "\u003D",
8048 "EqualTilde;": "\u2242",
8049 "equest;": "\u225F",
8050 "Equilibrium;": "\u21CC",
8051 "equiv;": "\u2261",
8052 "equivDD;": "\u2A78",
8053 "eqvparsl;": "\u29E5",
8054 "erarr;": "\u2971",
8055 "erDot;": "\u2253",
8056 "escr;": "\u212F",
8057 "Escr;": "\u2130",
8058 "esdot;": "\u2250",
8059 "Esim;": "\u2A73",
8060 "esim;": "\u2242",
8061 "Eta;": "\u0397",
8062 "eta;": "\u03B7",
8063 "ETH;": "\u00D0",
8064 "ETH": "\u00D0",
8065 "eth;": "\u00F0",
8066 "eth": "\u00F0",
8067 "Euml;": "\u00CB",
8068 "Euml": "\u00CB",
8069 "euml;": "\u00EB",
8070 "euml": "\u00EB",
8071 "euro;": "\u20AC",
8072 "excl;": "\u0021",
8073 "exist;": "\u2203",
8074 "Exists;": "\u2203",
8075 "expectation;": "\u2130",
8076 "exponentiale;": "\u2147",
8077 "ExponentialE;": "\u2147",
8078 "fallingdotseq;": "\u2252",
8079 "Fcy;": "\u0424",
8080 "fcy;": "\u0444",
8081 "female;": "\u2640",
8082 "ffilig;": "\uFB03",
8083 "fflig;": "\uFB00",
8084 "ffllig;": "\uFB04",
8085 "Ffr;": "\uD835\uDD09",
8086 "ffr;": "\uD835\uDD23",
8087 "filig;": "\uFB01",
8088 "FilledSmallSquare;": "\u25FC",
8089 "FilledVerySmallSquare;": "\u25AA",
8090 "fjlig;": "\u0066\u006A",
8091 "flat;": "\u266D",
8092 "fllig;": "\uFB02",
8093 "fltns;": "\u25B1",
8094 "fnof;": "\u0192",
8095 "Fopf;": "\uD835\uDD3D",
8096 "fopf;": "\uD835\uDD57",
8097 "forall;": "\u2200",
8098 "ForAll;": "\u2200",
8099 "fork;": "\u22D4",
8100 "forkv;": "\u2AD9",
8101 "Fouriertrf;": "\u2131",
8102 "fpartint;": "\u2A0D",
8103 "frac12;": "\u00BD",
8104 "frac12": "\u00BD",
8105 "frac13;": "\u2153",
8106 "frac14;": "\u00BC",
8107 "frac14": "\u00BC",
8108 "frac15;": "\u2155",
8109 "frac16;": "\u2159",
8110 "frac18;": "\u215B",
8111 "frac23;": "\u2154",
8112 "frac25;": "\u2156",
8113 "frac34;": "\u00BE",
8114 "frac34": "\u00BE",
8115 "frac35;": "\u2157",
8116 "frac38;": "\u215C",
8117 "frac45;": "\u2158",
8118 "frac56;": "\u215A",
8119 "frac58;": "\u215D",
8120 "frac78;": "\u215E",
8121 "frasl;": "\u2044",
8122 "frown;": "\u2322",
8123 "fscr;": "\uD835\uDCBB",
8124 "Fscr;": "\u2131",
8125 "gacute;": "\u01F5",
8126 "Gamma;": "\u0393",
8127 "gamma;": "\u03B3",
8128 "Gammad;": "\u03DC",
8129 "gammad;": "\u03DD",
8130 "gap;": "\u2A86",
8131 "Gbreve;": "\u011E",
8132 "gbreve;": "\u011F",
8133 "Gcedil;": "\u0122",
8134 "Gcirc;": "\u011C",
8135 "gcirc;": "\u011D",
8136 "Gcy;": "\u0413",
8137 "gcy;": "\u0433",
8138 "Gdot;": "\u0120",
8139 "gdot;": "\u0121",
8140 "ge;": "\u2265",
8141 "gE;": "\u2267",
8142 "gEl;": "\u2A8C",
8143 "gel;": "\u22DB",
8144 "geq;": "\u2265",
8145 "geqq;": "\u2267",
8146 "geqslant;": "\u2A7E",
8147 "gescc;": "\u2AA9",
8148 "ges;": "\u2A7E",
8149 "gesdot;": "\u2A80",
8150 "gesdoto;": "\u2A82",
8151 "gesdotol;": "\u2A84",
8152 "gesl;": "\u22DB\uFE00",
8153 "gesles;": "\u2A94",
8154 "Gfr;": "\uD835\uDD0A",
8155 "gfr;": "\uD835\uDD24",
8156 "gg;": "\u226B",
8157 "Gg;": "\u22D9",
8158 "ggg;": "\u22D9",
8159 "gimel;": "\u2137",
8160 "GJcy;": "\u0403",
8161 "gjcy;": "\u0453",
8162 "gla;": "\u2AA5",
8163 "gl;": "\u2277",
8164 "glE;": "\u2A92",
8165 "glj;": "\u2AA4",
8166 "gnap;": "\u2A8A",
8167 "gnapprox;": "\u2A8A",
8168 "gne;": "\u2A88",
8169 "gnE;": "\u2269",
8170 "gneq;": "\u2A88",
8171 "gneqq;": "\u2269",
8172 "gnsim;": "\u22E7",
8173 "Gopf;": "\uD835\uDD3E",
8174 "gopf;": "\uD835\uDD58",
8175 "grave;": "\u0060",
8176 "GreaterEqual;": "\u2265",
8177 "GreaterEqualLess;": "\u22DB",
8178 "GreaterFullEqual;": "\u2267",
8179 "GreaterGreater;": "\u2AA2",
8180 "GreaterLess;": "\u2277",
8181 "GreaterSlantEqual;": "\u2A7E",
8182 "GreaterTilde;": "\u2273",
8183 "Gscr;": "\uD835\uDCA2",
8184 "gscr;": "\u210A",
8185 "gsim;": "\u2273",
8186 "gsime;": "\u2A8E",
8187 "gsiml;": "\u2A90",
8188 "gtcc;": "\u2AA7",
8189 "gtcir;": "\u2A7A",
8190 "gt;": "\u003E",
8191 "gt": "\u003E",
8192 "GT;": "\u003E",
8193 "GT": "\u003E",
8194 "Gt;": "\u226B",
8195 "gtdot;": "\u22D7",
8196 "gtlPar;": "\u2995",
8197 "gtquest;": "\u2A7C",
8198 "gtrapprox;": "\u2A86",
8199 "gtrarr;": "\u2978",
8200 "gtrdot;": "\u22D7",
8201 "gtreqless;": "\u22DB",
8202 "gtreqqless;": "\u2A8C",
8203 "gtrless;": "\u2277",
8204 "gtrsim;": "\u2273",
8205 "gvertneqq;": "\u2269\uFE00",
8206 "gvnE;": "\u2269\uFE00",
8207 "Hacek;": "\u02C7",
8208 "hairsp;": "\u200A",
8209 "half;": "\u00BD",
8210 "hamilt;": "\u210B",
8211 "HARDcy;": "\u042A",
8212 "hardcy;": "\u044A",
8213 "harrcir;": "\u2948",
8214 "harr;": "\u2194",
8215 "hArr;": "\u21D4",
8216 "harrw;": "\u21AD",
8217 "Hat;": "\u005E",
8218 "hbar;": "\u210F",
8219 "Hcirc;": "\u0124",
8220 "hcirc;": "\u0125",
8221 "hearts;": "\u2665",
8222 "heartsuit;": "\u2665",
8223 "hellip;": "\u2026",
8224 "hercon;": "\u22B9",
8225 "hfr;": "\uD835\uDD25",
8226 "Hfr;": "\u210C",
8227 "HilbertSpace;": "\u210B",
8228 "hksearow;": "\u2925",
8229 "hkswarow;": "\u2926",
8230 "hoarr;": "\u21FF",
8231 "homtht;": "\u223B",
8232 "hookleftarrow;": "\u21A9",
8233 "hookrightarrow;": "\u21AA",
8234 "hopf;": "\uD835\uDD59",
8235 "Hopf;": "\u210D",
8236 "horbar;": "\u2015",
8237 "HorizontalLine;": "\u2500",
8238 "hscr;": "\uD835\uDCBD",
8239 "Hscr;": "\u210B",
8240 "hslash;": "\u210F",
8241 "Hstrok;": "\u0126",
8242 "hstrok;": "\u0127",
8243 "HumpDownHump;": "\u224E",
8244 "HumpEqual;": "\u224F",
8245 "hybull;": "\u2043",
8246 "hyphen;": "\u2010",
8247 "Iacute;": "\u00CD",
8248 "Iacute": "\u00CD",
8249 "iacute;": "\u00ED",
8250 "iacute": "\u00ED",
8251 "ic;": "\u2063",
8252 "Icirc;": "\u00CE",
8253 "Icirc": "\u00CE",
8254 "icirc;": "\u00EE",
8255 "icirc": "\u00EE",
8256 "Icy;": "\u0418",
8257 "icy;": "\u0438",
8258 "Idot;": "\u0130",
8259 "IEcy;": "\u0415",
8260 "iecy;": "\u0435",
8261 "iexcl;": "\u00A1",
8262 "iexcl": "\u00A1",
8263 "iff;": "\u21D4",
8264 "ifr;": "\uD835\uDD26",
8265 "Ifr;": "\u2111",
8266 "Igrave;": "\u00CC",
8267 "Igrave": "\u00CC",
8268 "igrave;": "\u00EC",
8269 "igrave": "\u00EC",
8270 "ii;": "\u2148",
8271 "iiiint;": "\u2A0C",
8272 "iiint;": "\u222D",
8273 "iinfin;": "\u29DC",
8274 "iiota;": "\u2129",
8275 "IJlig;": "\u0132",
8276 "ijlig;": "\u0133",
8277 "Imacr;": "\u012A",
8278 "imacr;": "\u012B",
8279 "image;": "\u2111",
8280 "ImaginaryI;": "\u2148",
8281 "imagline;": "\u2110",
8282 "imagpart;": "\u2111",
8283 "imath;": "\u0131",
8284 "Im;": "\u2111",
8285 "imof;": "\u22B7",
8286 "imped;": "\u01B5",
8287 "Implies;": "\u21D2",
8288 "incare;": "\u2105",
8289 "in;": "\u2208",
8290 "infin;": "\u221E",
8291 "infintie;": "\u29DD",
8292 "inodot;": "\u0131",
8293 "intcal;": "\u22BA",
8294 "int;": "\u222B",
8295 "Int;": "\u222C",
8296 "integers;": "\u2124",
8297 "Integral;": "\u222B",
8298 "intercal;": "\u22BA",
8299 "Intersection;": "\u22C2",
8300 "intlarhk;": "\u2A17",
8301 "intprod;": "\u2A3C",
8302 "InvisibleComma;": "\u2063",
8303 "InvisibleTimes;": "\u2062",
8304 "IOcy;": "\u0401",
8305 "iocy;": "\u0451",
8306 "Iogon;": "\u012E",
8307 "iogon;": "\u012F",
8308 "Iopf;": "\uD835\uDD40",
8309 "iopf;": "\uD835\uDD5A",
8310 "Iota;": "\u0399",
8311 "iota;": "\u03B9",
8312 "iprod;": "\u2A3C",
8313 "iquest;": "\u00BF",
8314 "iquest": "\u00BF",
8315 "iscr;": "\uD835\uDCBE",
8316 "Iscr;": "\u2110",
8317 "isin;": "\u2208",
8318 "isindot;": "\u22F5",
8319 "isinE;": "\u22F9",
8320 "isins;": "\u22F4",
8321 "isinsv;": "\u22F3",
8322 "isinv;": "\u2208",
8323 "it;": "\u2062",
8324 "Itilde;": "\u0128",
8325 "itilde;": "\u0129",
8326 "Iukcy;": "\u0406",
8327 "iukcy;": "\u0456",
8328 "Iuml;": "\u00CF",
8329 "Iuml": "\u00CF",
8330 "iuml;": "\u00EF",
8331 "iuml": "\u00EF",
8332 "Jcirc;": "\u0134",
8333 "jcirc;": "\u0135",
8334 "Jcy;": "\u0419",
8335 "jcy;": "\u0439",
8336 "Jfr;": "\uD835\uDD0D",
8337 "jfr;": "\uD835\uDD27",
8338 "jmath;": "\u0237",
8339 "Jopf;": "\uD835\uDD41",
8340 "jopf;": "\uD835\uDD5B",
8341 "Jscr;": "\uD835\uDCA5",
8342 "jscr;": "\uD835\uDCBF",
8343 "Jsercy;": "\u0408",
8344 "jsercy;": "\u0458",
8345 "Jukcy;": "\u0404",
8346 "jukcy;": "\u0454",
8347 "Kappa;": "\u039A",
8348 "kappa;": "\u03BA",
8349 "kappav;": "\u03F0",
8350 "Kcedil;": "\u0136",
8351 "kcedil;": "\u0137",
8352 "Kcy;": "\u041A",
8353 "kcy;": "\u043A",
8354 "Kfr;": "\uD835\uDD0E",
8355 "kfr;": "\uD835\uDD28",
8356 "kgreen;": "\u0138",
8357 "KHcy;": "\u0425",
8358 "khcy;": "\u0445",
8359 "KJcy;": "\u040C",
8360 "kjcy;": "\u045C",
8361 "Kopf;": "\uD835\uDD42",
8362 "kopf;": "\uD835\uDD5C",
8363 "Kscr;": "\uD835\uDCA6",
8364 "kscr;": "\uD835\uDCC0",
8365 "lAarr;": "\u21DA",
8366 "Lacute;": "\u0139",
8367 "lacute;": "\u013A",
8368 "laemptyv;": "\u29B4",
8369 "lagran;": "\u2112",
8370 "Lambda;": "\u039B",
8371 "lambda;": "\u03BB",
8372 "lang;": "\u27E8",
8373 "Lang;": "\u27EA",
8374 "langd;": "\u2991",
8375 "langle;": "\u27E8",
8376 "lap;": "\u2A85",
8377 "Laplacetrf;": "\u2112",
8378 "laquo;": "\u00AB",
8379 "laquo": "\u00AB",
8380 "larrb;": "\u21E4",
8381 "larrbfs;": "\u291F",
8382 "larr;": "\u2190",
8383 "Larr;": "\u219E",
8384 "lArr;": "\u21D0",
8385 "larrfs;": "\u291D",
8386 "larrhk;": "\u21A9",
8387 "larrlp;": "\u21AB",
8388 "larrpl;": "\u2939",
8389 "larrsim;": "\u2973",
8390 "larrtl;": "\u21A2",
8391 "latail;": "\u2919",
8392 "lAtail;": "\u291B",
8393 "lat;": "\u2AAB",
8394 "late;": "\u2AAD",
8395 "lates;": "\u2AAD\uFE00",
8396 "lbarr;": "\u290C",
8397 "lBarr;": "\u290E",
8398 "lbbrk;": "\u2772",
8399 "lbrace;": "\u007B",
8400 "lbrack;": "\u005B",
8401 "lbrke;": "\u298B",
8402 "lbrksld;": "\u298F",
8403 "lbrkslu;": "\u298D",
8404 "Lcaron;": "\u013D",
8405 "lcaron;": "\u013E",
8406 "Lcedil;": "\u013B",
8407 "lcedil;": "\u013C",
8408 "lceil;": "\u2308",
8409 "lcub;": "\u007B",
8410 "Lcy;": "\u041B",
8411 "lcy;": "\u043B",
8412 "ldca;": "\u2936",
8413 "ldquo;": "\u201C",
8414 "ldquor;": "\u201E",
8415 "ldrdhar;": "\u2967",
8416 "ldrushar;": "\u294B",
8417 "ldsh;": "\u21B2",
8418 "le;": "\u2264",
8419 "lE;": "\u2266",
8420 "LeftAngleBracket;": "\u27E8",
8421 "LeftArrowBar;": "\u21E4",
8422 "leftarrow;": "\u2190",
8423 "LeftArrow;": "\u2190",
8424 "Leftarrow;": "\u21D0",
8425 "LeftArrowRightArrow;": "\u21C6",
8426 "leftarrowtail;": "\u21A2",
8427 "LeftCeiling;": "\u2308",
8428 "LeftDoubleBracket;": "\u27E6",
8429 "LeftDownTeeVector;": "\u2961",
8430 "LeftDownVectorBar;": "\u2959",
8431 "LeftDownVector;": "\u21C3",
8432 "LeftFloor;": "\u230A",
8433 "leftharpoondown;": "\u21BD",
8434 "leftharpoonup;": "\u21BC",
8435 "leftleftarrows;": "\u21C7",
8436 "leftrightarrow;": "\u2194",
8437 "LeftRightArrow;": "\u2194",
8438 "Leftrightarrow;": "\u21D4",
8439 "leftrightarrows;": "\u21C6",
8440 "leftrightharpoons;": "\u21CB",
8441 "leftrightsquigarrow;": "\u21AD",
8442 "LeftRightVector;": "\u294E",
8443 "LeftTeeArrow;": "\u21A4",
8444 "LeftTee;": "\u22A3",
8445 "LeftTeeVector;": "\u295A",
8446 "leftthreetimes;": "\u22CB",
8447 "LeftTriangleBar;": "\u29CF",
8448 "LeftTriangle;": "\u22B2",
8449 "LeftTriangleEqual;": "\u22B4",
8450 "LeftUpDownVector;": "\u2951",
8451 "LeftUpTeeVector;": "\u2960",
8452 "LeftUpVectorBar;": "\u2958",
8453 "LeftUpVector;": "\u21BF",
8454 "LeftVectorBar;": "\u2952",
8455 "LeftVector;": "\u21BC",
8456 "lEg;": "\u2A8B",
8457 "leg;": "\u22DA",
8458 "leq;": "\u2264",
8459 "leqq;": "\u2266",
8460 "leqslant;": "\u2A7D",
8461 "lescc;": "\u2AA8",
8462 "les;": "\u2A7D",
8463 "lesdot;": "\u2A7F",
8464 "lesdoto;": "\u2A81",
8465 "lesdotor;": "\u2A83",
8466 "lesg;": "\u22DA\uFE00",
8467 "lesges;": "\u2A93",
8468 "lessapprox;": "\u2A85",
8469 "lessdot;": "\u22D6",
8470 "lesseqgtr;": "\u22DA",
8471 "lesseqqgtr;": "\u2A8B",
8472 "LessEqualGreater;": "\u22DA",
8473 "LessFullEqual;": "\u2266",
8474 "LessGreater;": "\u2276",
8475 "lessgtr;": "\u2276",
8476 "LessLess;": "\u2AA1",
8477 "lesssim;": "\u2272",
8478 "LessSlantEqual;": "\u2A7D",
8479 "LessTilde;": "\u2272",
8480 "lfisht;": "\u297C",
8481 "lfloor;": "\u230A",
8482 "Lfr;": "\uD835\uDD0F",
8483 "lfr;": "\uD835\uDD29",
8484 "lg;": "\u2276",
8485 "lgE;": "\u2A91",
8486 "lHar;": "\u2962",
8487 "lhard;": "\u21BD",
8488 "lharu;": "\u21BC",
8489 "lharul;": "\u296A",
8490 "lhblk;": "\u2584",
8491 "LJcy;": "\u0409",
8492 "ljcy;": "\u0459",
8493 "llarr;": "\u21C7",
8494 "ll;": "\u226A",
8495 "Ll;": "\u22D8",
8496 "llcorner;": "\u231E",
8497 "Lleftarrow;": "\u21DA",
8498 "llhard;": "\u296B",
8499 "lltri;": "\u25FA",
8500 "Lmidot;": "\u013F",
8501 "lmidot;": "\u0140",
8502 "lmoustache;": "\u23B0",
8503 "lmoust;": "\u23B0",
8504 "lnap;": "\u2A89",
8505 "lnapprox;": "\u2A89",
8506 "lne;": "\u2A87",
8507 "lnE;": "\u2268",
8508 "lneq;": "\u2A87",
8509 "lneqq;": "\u2268",
8510 "lnsim;": "\u22E6",
8511 "loang;": "\u27EC",
8512 "loarr;": "\u21FD",
8513 "lobrk;": "\u27E6",
8514 "longleftarrow;": "\u27F5",
8515 "LongLeftArrow;": "\u27F5",
8516 "Longleftarrow;": "\u27F8",
8517 "longleftrightarrow;": "\u27F7",
8518 "LongLeftRightArrow;": "\u27F7",
8519 "Longleftrightarrow;": "\u27FA",
8520 "longmapsto;": "\u27FC",
8521 "longrightarrow;": "\u27F6",
8522 "LongRightArrow;": "\u27F6",
8523 "Longrightarrow;": "\u27F9",
8524 "looparrowleft;": "\u21AB",
8525 "looparrowright;": "\u21AC",
8526 "lopar;": "\u2985",
8527 "Lopf;": "\uD835\uDD43",
8528 "lopf;": "\uD835\uDD5D",
8529 "loplus;": "\u2A2D",
8530 "lotimes;": "\u2A34",
8531 "lowast;": "\u2217",
8532 "lowbar;": "\u005F",
8533 "LowerLeftArrow;": "\u2199",
8534 "LowerRightArrow;": "\u2198",
8535 "loz;": "\u25CA",
8536 "lozenge;": "\u25CA",
8537 "lozf;": "\u29EB",
8538 "lpar;": "\u0028",
8539 "lparlt;": "\u2993",
8540 "lrarr;": "\u21C6",
8541 "lrcorner;": "\u231F",
8542 "lrhar;": "\u21CB",
8543 "lrhard;": "\u296D",
8544 "lrm;": "\u200E",
8545 "lrtri;": "\u22BF",
8546 "lsaquo;": "\u2039",
8547 "lscr;": "\uD835\uDCC1",
8548 "Lscr;": "\u2112",
8549 "lsh;": "\u21B0",
8550 "Lsh;": "\u21B0",
8551 "lsim;": "\u2272",
8552 "lsime;": "\u2A8D",
8553 "lsimg;": "\u2A8F",
8554 "lsqb;": "\u005B",
8555 "lsquo;": "\u2018",
8556 "lsquor;": "\u201A",
8557 "Lstrok;": "\u0141",
8558 "lstrok;": "\u0142",
8559 "ltcc;": "\u2AA6",
8560 "ltcir;": "\u2A79",
8561 "lt;": "\u003C",
8562 "lt": "\u003C",
8563 "LT;": "\u003C",
8564 "LT": "\u003C",
8565 "Lt;": "\u226A",
8566 "ltdot;": "\u22D6",
8567 "lthree;": "\u22CB",
8568 "ltimes;": "\u22C9",
8569 "ltlarr;": "\u2976",
8570 "ltquest;": "\u2A7B",
8571 "ltri;": "\u25C3",
8572 "ltrie;": "\u22B4",
8573 "ltrif;": "\u25C2",
8574 "ltrPar;": "\u2996",
8575 "lurdshar;": "\u294A",
8576 "luruhar;": "\u2966",
8577 "lvertneqq;": "\u2268\uFE00",
8578 "lvnE;": "\u2268\uFE00",
8579 "macr;": "\u00AF",
8580 "macr": "\u00AF",
8581 "male;": "\u2642",
8582 "malt;": "\u2720",
8583 "maltese;": "\u2720",
8584 "Map;": "\u2905",
8585 "map;": "\u21A6",
8586 "mapsto;": "\u21A6",
8587 "mapstodown;": "\u21A7",
8588 "mapstoleft;": "\u21A4",
8589 "mapstoup;": "\u21A5",
8590 "marker;": "\u25AE",
8591 "mcomma;": "\u2A29",
8592 "Mcy;": "\u041C",
8593 "mcy;": "\u043C",
8594 "mdash;": "\u2014",
8595 "mDDot;": "\u223A",
8596 "measuredangle;": "\u2221",
8597 "MediumSpace;": "\u205F",
8598 "Mellintrf;": "\u2133",
8599 "Mfr;": "\uD835\uDD10",
8600 "mfr;": "\uD835\uDD2A",
8601 "mho;": "\u2127",
8602 "micro;": "\u00B5",
8603 "micro": "\u00B5",
8604 "midast;": "\u002A",
8605 "midcir;": "\u2AF0",
8606 "mid;": "\u2223",
8607 "middot;": "\u00B7",
8608 "middot": "\u00B7",
8609 "minusb;": "\u229F",
8610 "minus;": "\u2212",
8611 "minusd;": "\u2238",
8612 "minusdu;": "\u2A2A",
8613 "MinusPlus;": "\u2213",
8614 "mlcp;": "\u2ADB",
8615 "mldr;": "\u2026",
8616 "mnplus;": "\u2213",
8617 "models;": "\u22A7",
8618 "Mopf;": "\uD835\uDD44",
8619 "mopf;": "\uD835\uDD5E",
8620 "mp;": "\u2213",
8621 "mscr;": "\uD835\uDCC2",
8622 "Mscr;": "\u2133",
8623 "mstpos;": "\u223E",
8624 "Mu;": "\u039C",
8625 "mu;": "\u03BC",
8626 "multimap;": "\u22B8",
8627 "mumap;": "\u22B8",
8628 "nabla;": "\u2207",
8629 "Nacute;": "\u0143",
8630 "nacute;": "\u0144",
8631 "nang;": "\u2220\u20D2",
8632 "nap;": "\u2249",
8633 "napE;": "\u2A70\u0338",
8634 "napid;": "\u224B\u0338",
8635 "napos;": "\u0149",
8636 "napprox;": "\u2249",
8637 "natural;": "\u266E",
8638 "naturals;": "\u2115",
8639 "natur;": "\u266E",
8640 "nbsp;": "\u00A0",
8641 "nbsp": "\u00A0",
8642 "nbump;": "\u224E\u0338",
8643 "nbumpe;": "\u224F\u0338",
8644 "ncap;": "\u2A43",
8645 "Ncaron;": "\u0147",
8646 "ncaron;": "\u0148",
8647 "Ncedil;": "\u0145",
8648 "ncedil;": "\u0146",
8649 "ncong;": "\u2247",
8650 "ncongdot;": "\u2A6D\u0338",
8651 "ncup;": "\u2A42",
8652 "Ncy;": "\u041D",
8653 "ncy;": "\u043D",
8654 "ndash;": "\u2013",
8655 "nearhk;": "\u2924",
8656 "nearr;": "\u2197",
8657 "neArr;": "\u21D7",
8658 "nearrow;": "\u2197",
8659 "ne;": "\u2260",
8660 "nedot;": "\u2250\u0338",
8661 "NegativeMediumSpace;": "\u200B",
8662 "NegativeThickSpace;": "\u200B",
8663 "NegativeThinSpace;": "\u200B",
8664 "NegativeVeryThinSpace;": "\u200B",
8665 "nequiv;": "\u2262",
8666 "nesear;": "\u2928",
8667 "nesim;": "\u2242\u0338",
8668 "NestedGreaterGreater;": "\u226B",
8669 "NestedLessLess;": "\u226A",
8670 "NewLine;": "\u000A",
8671 "nexist;": "\u2204",
8672 "nexists;": "\u2204",
8673 "Nfr;": "\uD835\uDD11",
8674 "nfr;": "\uD835\uDD2B",
8675 "ngE;": "\u2267\u0338",
8676 "nge;": "\u2271",
8677 "ngeq;": "\u2271",
8678 "ngeqq;": "\u2267\u0338",
8679 "ngeqslant;": "\u2A7E\u0338",
8680 "nges;": "\u2A7E\u0338",
8681 "nGg;": "\u22D9\u0338",
8682 "ngsim;": "\u2275",
8683 "nGt;": "\u226B\u20D2",
8684 "ngt;": "\u226F",
8685 "ngtr;": "\u226F",
8686 "nGtv;": "\u226B\u0338",
8687 "nharr;": "\u21AE",
8688 "nhArr;": "\u21CE",
8689 "nhpar;": "\u2AF2",
8690 "ni;": "\u220B",
8691 "nis;": "\u22FC",
8692 "nisd;": "\u22FA",
8693 "niv;": "\u220B",
8694 "NJcy;": "\u040A",
8695 "njcy;": "\u045A",
8696 "nlarr;": "\u219A",
8697 "nlArr;": "\u21CD",
8698 "nldr;": "\u2025",
8699 "nlE;": "\u2266\u0338",
8700 "nle;": "\u2270",
8701 "nleftarrow;": "\u219A",
8702 "nLeftarrow;": "\u21CD",
8703 "nleftrightarrow;": "\u21AE",
8704 "nLeftrightarrow;": "\u21CE",
8705 "nleq;": "\u2270",
8706 "nleqq;": "\u2266\u0338",
8707 "nleqslant;": "\u2A7D\u0338",
8708 "nles;": "\u2A7D\u0338",
8709 "nless;": "\u226E",
8710 "nLl;": "\u22D8\u0338",
8711 "nlsim;": "\u2274",
8712 "nLt;": "\u226A\u20D2",
8713 "nlt;": "\u226E",
8714 "nltri;": "\u22EA",
8715 "nltrie;": "\u22EC",
8716 "nLtv;": "\u226A\u0338",
8717 "nmid;": "\u2224",
8718 "NoBreak;": "\u2060",
8719 "NonBreakingSpace;": "\u00A0",
8720 "nopf;": "\uD835\uDD5F",
8721 "Nopf;": "\u2115",
8722 "Not;": "\u2AEC",
8723 "not;": "\u00AC",
8724 "not": "\u00AC",
8725 "NotCongruent;": "\u2262",
8726 "NotCupCap;": "\u226D",
8727 "NotDoubleVerticalBar;": "\u2226",
8728 "NotElement;": "\u2209",
8729 "NotEqual;": "\u2260",
8730 "NotEqualTilde;": "\u2242\u0338",
8731 "NotExists;": "\u2204",
8732 "NotGreater;": "\u226F",
8733 "NotGreaterEqual;": "\u2271",
8734 "NotGreaterFullEqual;": "\u2267\u0338",
8735 "NotGreaterGreater;": "\u226B\u0338",
8736 "NotGreaterLess;": "\u2279",
8737 "NotGreaterSlantEqual;": "\u2A7E\u0338",
8738 "NotGreaterTilde;": "\u2275",
8739 "NotHumpDownHump;": "\u224E\u0338",
8740 "NotHumpEqual;": "\u224F\u0338",
8741 "notin;": "\u2209",
8742 "notindot;": "\u22F5\u0338",
8743 "notinE;": "\u22F9\u0338",
8744 "notinva;": "\u2209",
8745 "notinvb;": "\u22F7",
8746 "notinvc;": "\u22F6",
8747 "NotLeftTriangleBar;": "\u29CF\u0338",
8748 "NotLeftTriangle;": "\u22EA",
8749 "NotLeftTriangleEqual;": "\u22EC",
8750 "NotLess;": "\u226E",
8751 "NotLessEqual;": "\u2270",
8752 "NotLessGreater;": "\u2278",
8753 "NotLessLess;": "\u226A\u0338",
8754 "NotLessSlantEqual;": "\u2A7D\u0338",
8755 "NotLessTilde;": "\u2274",
8756 "NotNestedGreaterGreater;": "\u2AA2\u0338",
8757 "NotNestedLessLess;": "\u2AA1\u0338",
8758 "notni;": "\u220C",
8759 "notniva;": "\u220C",
8760 "notnivb;": "\u22FE",
8761 "notnivc;": "\u22FD",
8762 "NotPrecedes;": "\u2280",
8763 "NotPrecedesEqual;": "\u2AAF\u0338",
8764 "NotPrecedesSlantEqual;": "\u22E0",
8765 "NotReverseElement;": "\u220C",
8766 "NotRightTriangleBar;": "\u29D0\u0338",
8767 "NotRightTriangle;": "\u22EB",
8768 "NotRightTriangleEqual;": "\u22ED",
8769 "NotSquareSubset;": "\u228F\u0338",
8770 "NotSquareSubsetEqual;": "\u22E2",
8771 "NotSquareSuperset;": "\u2290\u0338",
8772 "NotSquareSupersetEqual;": "\u22E3",
8773 "NotSubset;": "\u2282\u20D2",
8774 "NotSubsetEqual;": "\u2288",
8775 "NotSucceeds;": "\u2281",
8776 "NotSucceedsEqual;": "\u2AB0\u0338",
8777 "NotSucceedsSlantEqual;": "\u22E1",
8778 "NotSucceedsTilde;": "\u227F\u0338",
8779 "NotSuperset;": "\u2283\u20D2",
8780 "NotSupersetEqual;": "\u2289",
8781 "NotTilde;": "\u2241",
8782 "NotTildeEqual;": "\u2244",
8783 "NotTildeFullEqual;": "\u2247",
8784 "NotTildeTilde;": "\u2249",
8785 "NotVerticalBar;": "\u2224",
8786 "nparallel;": "\u2226",
8787 "npar;": "\u2226",
8788 "nparsl;": "\u2AFD\u20E5",
8789 "npart;": "\u2202\u0338",
8790 "npolint;": "\u2A14",
8791 "npr;": "\u2280",
8792 "nprcue;": "\u22E0",
8793 "nprec;": "\u2280",
8794 "npreceq;": "\u2AAF\u0338",
8795 "npre;": "\u2AAF\u0338",
8796 "nrarrc;": "\u2933\u0338",
8797 "nrarr;": "\u219B",
8798 "nrArr;": "\u21CF",
8799 "nrarrw;": "\u219D\u0338",
8800 "nrightarrow;": "\u219B",
8801 "nRightarrow;": "\u21CF",
8802 "nrtri;": "\u22EB",
8803 "nrtrie;": "\u22ED",
8804 "nsc;": "\u2281",
8805 "nsccue;": "\u22E1",
8806 "nsce;": "\u2AB0\u0338",
8807 "Nscr;": "\uD835\uDCA9",
8808 "nscr;": "\uD835\uDCC3",
8809 "nshortmid;": "\u2224",
8810 "nshortparallel;": "\u2226",
8811 "nsim;": "\u2241",
8812 "nsime;": "\u2244",
8813 "nsimeq;": "\u2244",
8814 "nsmid;": "\u2224",
8815 "nspar;": "\u2226",
8816 "nsqsube;": "\u22E2",
8817 "nsqsupe;": "\u22E3",
8818 "nsub;": "\u2284",
8819 "nsubE;": "\u2AC5\u0338",
8820 "nsube;": "\u2288",
8821 "nsubset;": "\u2282\u20D2",
8822 "nsubseteq;": "\u2288",
8823 "nsubseteqq;": "\u2AC5\u0338",
8824 "nsucc;": "\u2281",
8825 "nsucceq;": "\u2AB0\u0338",
8826 "nsup;": "\u2285",
8827 "nsupE;": "\u2AC6\u0338",
8828 "nsupe;": "\u2289",
8829 "nsupset;": "\u2283\u20D2",
8830 "nsupseteq;": "\u2289",
8831 "nsupseteqq;": "\u2AC6\u0338",
8832 "ntgl;": "\u2279",
8833 "Ntilde;": "\u00D1",
8834 "Ntilde": "\u00D1",
8835 "ntilde;": "\u00F1",
8836 "ntilde": "\u00F1",
8837 "ntlg;": "\u2278",
8838 "ntriangleleft;": "\u22EA",
8839 "ntrianglelefteq;": "\u22EC",
8840 "ntriangleright;": "\u22EB",
8841 "ntrianglerighteq;": "\u22ED",
8842 "Nu;": "\u039D",
8843 "nu;": "\u03BD",
8844 "num;": "\u0023",
8845 "numero;": "\u2116",
8846 "numsp;": "\u2007",
8847 "nvap;": "\u224D\u20D2",
8848 "nvdash;": "\u22AC",
8849 "nvDash;": "\u22AD",
8850 "nVdash;": "\u22AE",
8851 "nVDash;": "\u22AF",
8852 "nvge;": "\u2265\u20D2",
8853 "nvgt;": "\u003E\u20D2",
8854 "nvHarr;": "\u2904",
8855 "nvinfin;": "\u29DE",
8856 "nvlArr;": "\u2902",
8857 "nvle;": "\u2264\u20D2",
8858 "nvlt;": "\u003C\u20D2",
8859 "nvltrie;": "\u22B4\u20D2",
8860 "nvrArr;": "\u2903",
8861 "nvrtrie;": "\u22B5\u20D2",
8862 "nvsim;": "\u223C\u20D2",
8863 "nwarhk;": "\u2923",
8864 "nwarr;": "\u2196",
8865 "nwArr;": "\u21D6",
8866 "nwarrow;": "\u2196",
8867 "nwnear;": "\u2927",
8868 "Oacute;": "\u00D3",
8869 "Oacute": "\u00D3",
8870 "oacute;": "\u00F3",
8871 "oacute": "\u00F3",
8872 "oast;": "\u229B",
8873 "Ocirc;": "\u00D4",
8874 "Ocirc": "\u00D4",
8875 "ocirc;": "\u00F4",
8876 "ocirc": "\u00F4",
8877 "ocir;": "\u229A",
8878 "Ocy;": "\u041E",
8879 "ocy;": "\u043E",
8880 "odash;": "\u229D",
8881 "Odblac;": "\u0150",
8882 "odblac;": "\u0151",
8883 "odiv;": "\u2A38",
8884 "odot;": "\u2299",
8885 "odsold;": "\u29BC",
8886 "OElig;": "\u0152",
8887 "oelig;": "\u0153",
8888 "ofcir;": "\u29BF",
8889 "Ofr;": "\uD835\uDD12",
8890 "ofr;": "\uD835\uDD2C",
8891 "ogon;": "\u02DB",
8892 "Ograve;": "\u00D2",
8893 "Ograve": "\u00D2",
8894 "ograve;": "\u00F2",
8895 "ograve": "\u00F2",
8896 "ogt;": "\u29C1",
8897 "ohbar;": "\u29B5",
8898 "ohm;": "\u03A9",
8899 "oint;": "\u222E",
8900 "olarr;": "\u21BA",
8901 "olcir;": "\u29BE",
8902 "olcross;": "\u29BB",
8903 "oline;": "\u203E",
8904 "olt;": "\u29C0",
8905 "Omacr;": "\u014C",
8906 "omacr;": "\u014D",
8907 "Omega;": "\u03A9",
8908 "omega;": "\u03C9",
8909 "Omicron;": "\u039F",
8910 "omicron;": "\u03BF",
8911 "omid;": "\u29B6",
8912 "ominus;": "\u2296",
8913 "Oopf;": "\uD835\uDD46",
8914 "oopf;": "\uD835\uDD60",
8915 "opar;": "\u29B7",
8916 "OpenCurlyDoubleQuote;": "\u201C",
8917 "OpenCurlyQuote;": "\u2018",
8918 "operp;": "\u29B9",
8919 "oplus;": "\u2295",
8920 "orarr;": "\u21BB",
8921 "Or;": "\u2A54",
8922 "or;": "\u2228",
8923 "ord;": "\u2A5D",
8924 "order;": "\u2134",
8925 "orderof;": "\u2134",
8926 "ordf;": "\u00AA",
8927 "ordf": "\u00AA",
8928 "ordm;": "\u00BA",
8929 "ordm": "\u00BA",
8930 "origof;": "\u22B6",
8931 "oror;": "\u2A56",
8932 "orslope;": "\u2A57",
8933 "orv;": "\u2A5B",
8934 "oS;": "\u24C8",
8935 "Oscr;": "\uD835\uDCAA",
8936 "oscr;": "\u2134",
8937 "Oslash;": "\u00D8",
8938 "Oslash": "\u00D8",
8939 "oslash;": "\u00F8",
8940 "oslash": "\u00F8",
8941 "osol;": "\u2298",
8942 "Otilde;": "\u00D5",
8943 "Otilde": "\u00D5",
8944 "otilde;": "\u00F5",
8945 "otilde": "\u00F5",
8946 "otimesas;": "\u2A36",
8947 "Otimes;": "\u2A37",
8948 "otimes;": "\u2297",
8949 "Ouml;": "\u00D6",
8950 "Ouml": "\u00D6",
8951 "ouml;": "\u00F6",
8952 "ouml": "\u00F6",
8953 "ovbar;": "\u233D",
8954 "OverBar;": "\u203E",
8955 "OverBrace;": "\u23DE",
8956 "OverBracket;": "\u23B4",
8957 "OverParenthesis;": "\u23DC",
8958 "para;": "\u00B6",
8959 "para": "\u00B6",
8960 "parallel;": "\u2225",
8961 "par;": "\u2225",
8962 "parsim;": "\u2AF3",
8963 "parsl;": "\u2AFD",
8964 "part;": "\u2202",
8965 "PartialD;": "\u2202",
8966 "Pcy;": "\u041F",
8967 "pcy;": "\u043F",
8968 "percnt;": "\u0025",
8969 "period;": "\u002E",
8970 "permil;": "\u2030",
8971 "perp;": "\u22A5",
8972 "pertenk;": "\u2031",
8973 "Pfr;": "\uD835\uDD13",
8974 "pfr;": "\uD835\uDD2D",
8975 "Phi;": "\u03A6",
8976 "phi;": "\u03C6",
8977 "phiv;": "\u03D5",
8978 "phmmat;": "\u2133",
8979 "phone;": "\u260E",
8980 "Pi;": "\u03A0",
8981 "pi;": "\u03C0",
8982 "pitchfork;": "\u22D4",
8983 "piv;": "\u03D6",
8984 "planck;": "\u210F",
8985 "planckh;": "\u210E",
8986 "plankv;": "\u210F",
8987 "plusacir;": "\u2A23",
8988 "plusb;": "\u229E",
8989 "pluscir;": "\u2A22",
8990 "plus;": "\u002B",
8991 "plusdo;": "\u2214",
8992 "plusdu;": "\u2A25",
8993 "pluse;": "\u2A72",
8994 "PlusMinus;": "\u00B1",
8995 "plusmn;": "\u00B1",
8996 "plusmn": "\u00B1",
8997 "plussim;": "\u2A26",
8998 "plustwo;": "\u2A27",
8999 "pm;": "\u00B1",
9000 "Poincareplane;": "\u210C",
9001 "pointint;": "\u2A15",
9002 "popf;": "\uD835\uDD61",
9003 "Popf;": "\u2119",
9004 "pound;": "\u00A3",
9005 "pound": "\u00A3",
9006 "prap;": "\u2AB7",
9007 "Pr;": "\u2ABB",
9008 "pr;": "\u227A",
9009 "prcue;": "\u227C",
9010 "precapprox;": "\u2AB7",
9011 "prec;": "\u227A",
9012 "preccurlyeq;": "\u227C",
9013 "Precedes;": "\u227A",
9014 "PrecedesEqual;": "\u2AAF",
9015 "PrecedesSlantEqual;": "\u227C",
9016 "PrecedesTilde;": "\u227E",
9017 "preceq;": "\u2AAF",
9018 "precnapprox;": "\u2AB9",
9019 "precneqq;": "\u2AB5",
9020 "precnsim;": "\u22E8",
9021 "pre;": "\u2AAF",
9022 "prE;": "\u2AB3",
9023 "precsim;": "\u227E",
9024 "prime;": "\u2032",
9025 "Prime;": "\u2033",
9026 "primes;": "\u2119",
9027 "prnap;": "\u2AB9",
9028 "prnE;": "\u2AB5",
9029 "prnsim;": "\u22E8",
9030 "prod;": "\u220F",
9031 "Product;": "\u220F",
9032 "profalar;": "\u232E",
9033 "profline;": "\u2312",
9034 "profsurf;": "\u2313",
9035 "prop;": "\u221D",
9036 "Proportional;": "\u221D",
9037 "Proportion;": "\u2237",
9038 "propto;": "\u221D",
9039 "prsim;": "\u227E",
9040 "prurel;": "\u22B0",
9041 "Pscr;": "\uD835\uDCAB",
9042 "pscr;": "\uD835\uDCC5",
9043 "Psi;": "\u03A8",
9044 "psi;": "\u03C8",
9045 "puncsp;": "\u2008",
9046 "Qfr;": "\uD835\uDD14",
9047 "qfr;": "\uD835\uDD2E",
9048 "qint;": "\u2A0C",
9049 "qopf;": "\uD835\uDD62",
9050 "Qopf;": "\u211A",
9051 "qprime;": "\u2057",
9052 "Qscr;": "\uD835\uDCAC",
9053 "qscr;": "\uD835\uDCC6",
9054 "quaternions;": "\u210D",
9055 "quatint;": "\u2A16",
9056 "quest;": "\u003F",
9057 "questeq;": "\u225F",
9058 "quot;": "\u0022",
9059 "quot": "\u0022",
9060 "QUOT;": "\u0022",
9061 "QUOT": "\u0022",
9062 "rAarr;": "\u21DB",
9063 "race;": "\u223D\u0331",
9064 "Racute;": "\u0154",
9065 "racute;": "\u0155",
9066 "radic;": "\u221A",
9067 "raemptyv;": "\u29B3",
9068 "rang;": "\u27E9",
9069 "Rang;": "\u27EB",
9070 "rangd;": "\u2992",
9071 "range;": "\u29A5",
9072 "rangle;": "\u27E9",
9073 "raquo;": "\u00BB",
9074 "raquo": "\u00BB",
9075 "rarrap;": "\u2975",
9076 "rarrb;": "\u21E5",
9077 "rarrbfs;": "\u2920",
9078 "rarrc;": "\u2933",
9079 "rarr;": "\u2192",
9080 "Rarr;": "\u21A0",
9081 "rArr;": "\u21D2",
9082 "rarrfs;": "\u291E",
9083 "rarrhk;": "\u21AA",
9084 "rarrlp;": "\u21AC",
9085 "rarrpl;": "\u2945",
9086 "rarrsim;": "\u2974",
9087 "Rarrtl;": "\u2916",
9088 "rarrtl;": "\u21A3",
9089 "rarrw;": "\u219D",
9090 "ratail;": "\u291A",
9091 "rAtail;": "\u291C",
9092 "ratio;": "\u2236",
9093 "rationals;": "\u211A",
9094 "rbarr;": "\u290D",
9095 "rBarr;": "\u290F",
9096 "RBarr;": "\u2910",
9097 "rbbrk;": "\u2773",
9098 "rbrace;": "\u007D",
9099 "rbrack;": "\u005D",
9100 "rbrke;": "\u298C",
9101 "rbrksld;": "\u298E",
9102 "rbrkslu;": "\u2990",
9103 "Rcaron;": "\u0158",
9104 "rcaron;": "\u0159",
9105 "Rcedil;": "\u0156",
9106 "rcedil;": "\u0157",
9107 "rceil;": "\u2309",
9108 "rcub;": "\u007D",
9109 "Rcy;": "\u0420",
9110 "rcy;": "\u0440",
9111 "rdca;": "\u2937",
9112 "rdldhar;": "\u2969",
9113 "rdquo;": "\u201D",
9114 "rdquor;": "\u201D",
9115 "rdsh;": "\u21B3",
9116 "real;": "\u211C",
9117 "realine;": "\u211B",
9118 "realpart;": "\u211C",
9119 "reals;": "\u211D",
9120 "Re;": "\u211C",
9121 "rect;": "\u25AD",
9122 "reg;": "\u00AE",
9123 "reg": "\u00AE",
9124 "REG;": "\u00AE",
9125 "REG": "\u00AE",
9126 "ReverseElement;": "\u220B",
9127 "ReverseEquilibrium;": "\u21CB",
9128 "ReverseUpEquilibrium;": "\u296F",
9129 "rfisht;": "\u297D",
9130 "rfloor;": "\u230B",
9131 "rfr;": "\uD835\uDD2F",
9132 "Rfr;": "\u211C",
9133 "rHar;": "\u2964",
9134 "rhard;": "\u21C1",
9135 "rharu;": "\u21C0",
9136 "rharul;": "\u296C",
9137 "Rho;": "\u03A1",
9138 "rho;": "\u03C1",
9139 "rhov;": "\u03F1",
9140 "RightAngleBracket;": "\u27E9",
9141 "RightArrowBar;": "\u21E5",
9142 "rightarrow;": "\u2192",
9143 "RightArrow;": "\u2192",
9144 "Rightarrow;": "\u21D2",
9145 "RightArrowLeftArrow;": "\u21C4",
9146 "rightarrowtail;": "\u21A3",
9147 "RightCeiling;": "\u2309",
9148 "RightDoubleBracket;": "\u27E7",
9149 "RightDownTeeVector;": "\u295D",
9150 "RightDownVectorBar;": "\u2955",
9151 "RightDownVector;": "\u21C2",
9152 "RightFloor;": "\u230B",
9153 "rightharpoondown;": "\u21C1",
9154 "rightharpoonup;": "\u21C0",
9155 "rightleftarrows;": "\u21C4",
9156 "rightleftharpoons;": "\u21CC",
9157 "rightrightarrows;": "\u21C9",
9158 "rightsquigarrow;": "\u219D",
9159 "RightTeeArrow;": "\u21A6",
9160 "RightTee;": "\u22A2",
9161 "RightTeeVector;": "\u295B",
9162 "rightthreetimes;": "\u22CC",
9163 "RightTriangleBar;": "\u29D0",
9164 "RightTriangle;": "\u22B3",
9165 "RightTriangleEqual;": "\u22B5",
9166 "RightUpDownVector;": "\u294F",
9167 "RightUpTeeVector;": "\u295C",
9168 "RightUpVectorBar;": "\u2954",
9169 "RightUpVector;": "\u21BE",
9170 "RightVectorBar;": "\u2953",
9171 "RightVector;": "\u21C0",
9172 "ring;": "\u02DA",
9173 "risingdotseq;": "\u2253",
9174 "rlarr;": "\u21C4",
9175 "rlhar;": "\u21CC",
9176 "rlm;": "\u200F",
9177 "rmoustache;": "\u23B1",
9178 "rmoust;": "\u23B1",
9179 "rnmid;": "\u2AEE",
9180 "roang;": "\u27ED",
9181 "roarr;": "\u21FE",
9182 "robrk;": "\u27E7",
9183 "ropar;": "\u2986",
9184 "ropf;": "\uD835\uDD63",
9185 "Ropf;": "\u211D",
9186 "roplus;": "\u2A2E",
9187 "rotimes;": "\u2A35",
9188 "RoundImplies;": "\u2970",
9189 "rpar;": "\u0029",
9190 "rpargt;": "\u2994",
9191 "rppolint;": "\u2A12",
9192 "rrarr;": "\u21C9",
9193 "Rrightarrow;": "\u21DB",
9194 "rsaquo;": "\u203A",
9195 "rscr;": "\uD835\uDCC7",
9196 "Rscr;": "\u211B",
9197 "rsh;": "\u21B1",
9198 "Rsh;": "\u21B1",
9199 "rsqb;": "\u005D",
9200 "rsquo;": "\u2019",
9201 "rsquor;": "\u2019",
9202 "rthree;": "\u22CC",
9203 "rtimes;": "\u22CA",
9204 "rtri;": "\u25B9",
9205 "rtrie;": "\u22B5",
9206 "rtrif;": "\u25B8",
9207 "rtriltri;": "\u29CE",
9208 "RuleDelayed;": "\u29F4",
9209 "ruluhar;": "\u2968",
9210 "rx;": "\u211E",
9211 "Sacute;": "\u015A",
9212 "sacute;": "\u015B",
9213 "sbquo;": "\u201A",
9214 "scap;": "\u2AB8",
9215 "Scaron;": "\u0160",
9216 "scaron;": "\u0161",
9217 "Sc;": "\u2ABC",
9218 "sc;": "\u227B",
9219 "sccue;": "\u227D",
9220 "sce;": "\u2AB0",
9221 "scE;": "\u2AB4",
9222 "Scedil;": "\u015E",
9223 "scedil;": "\u015F",
9224 "Scirc;": "\u015C",
9225 "scirc;": "\u015D",
9226 "scnap;": "\u2ABA",
9227 "scnE;": "\u2AB6",
9228 "scnsim;": "\u22E9",
9229 "scpolint;": "\u2A13",
9230 "scsim;": "\u227F",
9231 "Scy;": "\u0421",
9232 "scy;": "\u0441",
9233 "sdotb;": "\u22A1",
9234 "sdot;": "\u22C5",
9235 "sdote;": "\u2A66",
9236 "searhk;": "\u2925",
9237 "searr;": "\u2198",
9238 "seArr;": "\u21D8",
9239 "searrow;": "\u2198",
9240 "sect;": "\u00A7",
9241 "sect": "\u00A7",
9242 "semi;": "\u003B",
9243 "seswar;": "\u2929",
9244 "setminus;": "\u2216",
9245 "setmn;": "\u2216",
9246 "sext;": "\u2736",
9247 "Sfr;": "\uD835\uDD16",
9248 "sfr;": "\uD835\uDD30",
9249 "sfrown;": "\u2322",
9250 "sharp;": "\u266F",
9251 "SHCHcy;": "\u0429",
9252 "shchcy;": "\u0449",
9253 "SHcy;": "\u0428",
9254 "shcy;": "\u0448",
9255 "ShortDownArrow;": "\u2193",
9256 "ShortLeftArrow;": "\u2190",
9257 "shortmid;": "\u2223",
9258 "shortparallel;": "\u2225",
9259 "ShortRightArrow;": "\u2192",
9260 "ShortUpArrow;": "\u2191",
9261 "shy;": "\u00AD",
9262 "shy": "\u00AD",
9263 "Sigma;": "\u03A3",
9264 "sigma;": "\u03C3",
9265 "sigmaf;": "\u03C2",
9266 "sigmav;": "\u03C2",
9267 "sim;": "\u223C",
9268 "simdot;": "\u2A6A",
9269 "sime;": "\u2243",
9270 "simeq;": "\u2243",
9271 "simg;": "\u2A9E",
9272 "simgE;": "\u2AA0",
9273 "siml;": "\u2A9D",
9274 "simlE;": "\u2A9F",
9275 "simne;": "\u2246",
9276 "simplus;": "\u2A24",
9277 "simrarr;": "\u2972",
9278 "slarr;": "\u2190",
9279 "SmallCircle;": "\u2218",
9280 "smallsetminus;": "\u2216",
9281 "smashp;": "\u2A33",
9282 "smeparsl;": "\u29E4",
9283 "smid;": "\u2223",
9284 "smile;": "\u2323",
9285 "smt;": "\u2AAA",
9286 "smte;": "\u2AAC",
9287 "smtes;": "\u2AAC\uFE00",
9288 "SOFTcy;": "\u042C",
9289 "softcy;": "\u044C",
9290 "solbar;": "\u233F",
9291 "solb;": "\u29C4",
9292 "sol;": "\u002F",
9293 "Sopf;": "\uD835\uDD4A",
9294 "sopf;": "\uD835\uDD64",
9295 "spades;": "\u2660",
9296 "spadesuit;": "\u2660",
9297 "spar;": "\u2225",
9298 "sqcap;": "\u2293",
9299 "sqcaps;": "\u2293\uFE00",
9300 "sqcup;": "\u2294",
9301 "sqcups;": "\u2294\uFE00",
9302 "Sqrt;": "\u221A",
9303 "sqsub;": "\u228F",
9304 "sqsube;": "\u2291",
9305 "sqsubset;": "\u228F",
9306 "sqsubseteq;": "\u2291",
9307 "sqsup;": "\u2290",
9308 "sqsupe;": "\u2292",
9309 "sqsupset;": "\u2290",
9310 "sqsupseteq;": "\u2292",
9311 "square;": "\u25A1",
9312 "Square;": "\u25A1",
9313 "SquareIntersection;": "\u2293",
9314 "SquareSubset;": "\u228F",
9315 "SquareSubsetEqual;": "\u2291",
9316 "SquareSuperset;": "\u2290",
9317 "SquareSupersetEqual;": "\u2292",
9318 "SquareUnion;": "\u2294",
9319 "squarf;": "\u25AA",
9320 "squ;": "\u25A1",
9321 "squf;": "\u25AA",
9322 "srarr;": "\u2192",
9323 "Sscr;": "\uD835\uDCAE",
9324 "sscr;": "\uD835\uDCC8",
9325 "ssetmn;": "\u2216",
9326 "ssmile;": "\u2323",
9327 "sstarf;": "\u22C6",
9328 "Star;": "\u22C6",
9329 "star;": "\u2606",
9330 "starf;": "\u2605",
9331 "straightepsilon;": "\u03F5",
9332 "straightphi;": "\u03D5",
9333 "strns;": "\u00AF",
9334 "sub;": "\u2282",
9335 "Sub;": "\u22D0",
9336 "subdot;": "\u2ABD",
9337 "subE;": "\u2AC5",
9338 "sube;": "\u2286",
9339 "subedot;": "\u2AC3",
9340 "submult;": "\u2AC1",
9341 "subnE;": "\u2ACB",
9342 "subne;": "\u228A",
9343 "subplus;": "\u2ABF",
9344 "subrarr;": "\u2979",
9345 "subset;": "\u2282",
9346 "Subset;": "\u22D0",
9347 "subseteq;": "\u2286",
9348 "subseteqq;": "\u2AC5",
9349 "SubsetEqual;": "\u2286",
9350 "subsetneq;": "\u228A",
9351 "subsetneqq;": "\u2ACB",
9352 "subsim;": "\u2AC7",
9353 "subsub;": "\u2AD5",
9354 "subsup;": "\u2AD3",
9355 "succapprox;": "\u2AB8",
9356 "succ;": "\u227B",
9357 "succcurlyeq;": "\u227D",
9358 "Succeeds;": "\u227B",
9359 "SucceedsEqual;": "\u2AB0",
9360 "SucceedsSlantEqual;": "\u227D",
9361 "SucceedsTilde;": "\u227F",
9362 "succeq;": "\u2AB0",
9363 "succnapprox;": "\u2ABA",
9364 "succneqq;": "\u2AB6",
9365 "succnsim;": "\u22E9",
9366 "succsim;": "\u227F",
9367 "SuchThat;": "\u220B",
9368 "sum;": "\u2211",
9369 "Sum;": "\u2211",
9370 "sung;": "\u266A",
9371 "sup1;": "\u00B9",
9372 "sup1": "\u00B9",
9373 "sup2;": "\u00B2",
9374 "sup2": "\u00B2",
9375 "sup3;": "\u00B3",
9376 "sup3": "\u00B3",
9377 "sup;": "\u2283",
9378 "Sup;": "\u22D1",
9379 "supdot;": "\u2ABE",
9380 "supdsub;": "\u2AD8",
9381 "supE;": "\u2AC6",
9382 "supe;": "\u2287",
9383 "supedot;": "\u2AC4",
9384 "Superset;": "\u2283",
9385 "SupersetEqual;": "\u2287",
9386 "suphsol;": "\u27C9",
9387 "suphsub;": "\u2AD7",
9388 "suplarr;": "\u297B",
9389 "supmult;": "\u2AC2",
9390 "supnE;": "\u2ACC",
9391 "supne;": "\u228B",
9392 "supplus;": "\u2AC0",
9393 "supset;": "\u2283",
9394 "Supset;": "\u22D1",
9395 "supseteq;": "\u2287",
9396 "supseteqq;": "\u2AC6",
9397 "supsetneq;": "\u228B",
9398 "supsetneqq;": "\u2ACC",
9399 "supsim;": "\u2AC8",
9400 "supsub;": "\u2AD4",
9401 "supsup;": "\u2AD6",
9402 "swarhk;": "\u2926",
9403 "swarr;": "\u2199",
9404 "swArr;": "\u21D9",
9405 "swarrow;": "\u2199",
9406 "swnwar;": "\u292A",
9407 "szlig;": "\u00DF",
9408 "szlig": "\u00DF",
9409 "Tab;": "\u0009",
9410 "target;": "\u2316",
9411 "Tau;": "\u03A4",
9412 "tau;": "\u03C4",
9413 "tbrk;": "\u23B4",
9414 "Tcaron;": "\u0164",
9415 "tcaron;": "\u0165",
9416 "Tcedil;": "\u0162",
9417 "tcedil;": "\u0163",
9418 "Tcy;": "\u0422",
9419 "tcy;": "\u0442",
9420 "tdot;": "\u20DB",
9421 "telrec;": "\u2315",
9422 "Tfr;": "\uD835\uDD17",
9423 "tfr;": "\uD835\uDD31",
9424 "there4;": "\u2234",
9425 "therefore;": "\u2234",
9426 "Therefore;": "\u2234",
9427 "Theta;": "\u0398",
9428 "theta;": "\u03B8",
9429 "thetasym;": "\u03D1",
9430 "thetav;": "\u03D1",
9431 "thickapprox;": "\u2248",
9432 "thicksim;": "\u223C",
9433 "ThickSpace;": "\u205F\u200A",
9434 "ThinSpace;": "\u2009",
9435 "thinsp;": "\u2009",
9436 "thkap;": "\u2248",
9437 "thksim;": "\u223C",
9438 "THORN;": "\u00DE",
9439 "THORN": "\u00DE",
9440 "thorn;": "\u00FE",
9441 "thorn": "\u00FE",
9442 "tilde;": "\u02DC",
9443 "Tilde;": "\u223C",
9444 "TildeEqual;": "\u2243",
9445 "TildeFullEqual;": "\u2245",
9446 "TildeTilde;": "\u2248",
9447 "timesbar;": "\u2A31",
9448 "timesb;": "\u22A0",
9449 "times;": "\u00D7",
9450 "times": "\u00D7",
9451 "timesd;": "\u2A30",
9452 "tint;": "\u222D",
9453 "toea;": "\u2928",
9454 "topbot;": "\u2336",
9455 "topcir;": "\u2AF1",
9456 "top;": "\u22A4",
9457 "Topf;": "\uD835\uDD4B",
9458 "topf;": "\uD835\uDD65",
9459 "topfork;": "\u2ADA",
9460 "tosa;": "\u2929",
9461 "tprime;": "\u2034",
9462 "trade;": "\u2122",
9463 "TRADE;": "\u2122",
9464 "triangle;": "\u25B5",
9465 "triangledown;": "\u25BF",
9466 "triangleleft;": "\u25C3",
9467 "trianglelefteq;": "\u22B4",
9468 "triangleq;": "\u225C",
9469 "triangleright;": "\u25B9",
9470 "trianglerighteq;": "\u22B5",
9471 "tridot;": "\u25EC",
9472 "trie;": "\u225C",
9473 "triminus;": "\u2A3A",
9474 "TripleDot;": "\u20DB",
9475 "triplus;": "\u2A39",
9476 "trisb;": "\u29CD",
9477 "tritime;": "\u2A3B",
9478 "trpezium;": "\u23E2",
9479 "Tscr;": "\uD835\uDCAF",
9480 "tscr;": "\uD835\uDCC9",
9481 "TScy;": "\u0426",
9482 "tscy;": "\u0446",
9483 "TSHcy;": "\u040B",
9484 "tshcy;": "\u045B",
9485 "Tstrok;": "\u0166",
9486 "tstrok;": "\u0167",
9487 "twixt;": "\u226C",
9488 "twoheadleftarrow;": "\u219E",
9489 "twoheadrightarrow;": "\u21A0",
9490 "Uacute;": "\u00DA",
9491 "Uacute": "\u00DA",
9492 "uacute;": "\u00FA",
9493 "uacute": "\u00FA",
9494 "uarr;": "\u2191",
9495 "Uarr;": "\u219F",
9496 "uArr;": "\u21D1",
9497 "Uarrocir;": "\u2949",
9498 "Ubrcy;": "\u040E",
9499 "ubrcy;": "\u045E",
9500 "Ubreve;": "\u016C",
9501 "ubreve;": "\u016D",
9502 "Ucirc;": "\u00DB",
9503 "Ucirc": "\u00DB",
9504 "ucirc;": "\u00FB",
9505 "ucirc": "\u00FB",
9506 "Ucy;": "\u0423",
9507 "ucy;": "\u0443",
9508 "udarr;": "\u21C5",
9509 "Udblac;": "\u0170",
9510 "udblac;": "\u0171",
9511 "udhar;": "\u296E",
9512 "ufisht;": "\u297E",
9513 "Ufr;": "\uD835\uDD18",
9514 "ufr;": "\uD835\uDD32",
9515 "Ugrave;": "\u00D9",
9516 "Ugrave": "\u00D9",
9517 "ugrave;": "\u00F9",
9518 "ugrave": "\u00F9",
9519 "uHar;": "\u2963",
9520 "uharl;": "\u21BF",
9521 "uharr;": "\u21BE",
9522 "uhblk;": "\u2580",
9523 "ulcorn;": "\u231C",
9524 "ulcorner;": "\u231C",
9525 "ulcrop;": "\u230F",
9526 "ultri;": "\u25F8",
9527 "Umacr;": "\u016A",
9528 "umacr;": "\u016B",
9529 "uml;": "\u00A8",
9530 "uml": "\u00A8",
9531 "UnderBar;": "\u005F",
9532 "UnderBrace;": "\u23DF",
9533 "UnderBracket;": "\u23B5",
9534 "UnderParenthesis;": "\u23DD",
9535 "Union;": "\u22C3",
9536 "UnionPlus;": "\u228E",
9537 "Uogon;": "\u0172",
9538 "uogon;": "\u0173",
9539 "Uopf;": "\uD835\uDD4C",
9540 "uopf;": "\uD835\uDD66",
9541 "UpArrowBar;": "\u2912",
9542 "uparrow;": "\u2191",
9543 "UpArrow;": "\u2191",
9544 "Uparrow;": "\u21D1",
9545 "UpArrowDownArrow;": "\u21C5",
9546 "updownarrow;": "\u2195",
9547 "UpDownArrow;": "\u2195",
9548 "Updownarrow;": "\u21D5",
9549 "UpEquilibrium;": "\u296E",
9550 "upharpoonleft;": "\u21BF",
9551 "upharpoonright;": "\u21BE",
9552 "uplus;": "\u228E",
9553 "UpperLeftArrow;": "\u2196",
9554 "UpperRightArrow;": "\u2197",
9555 "upsi;": "\u03C5",
9556 "Upsi;": "\u03D2",
9557 "upsih;": "\u03D2",
9558 "Upsilon;": "\u03A5",
9559 "upsilon;": "\u03C5",
9560 "UpTeeArrow;": "\u21A5",
9561 "UpTee;": "\u22A5",
9562 "upuparrows;": "\u21C8",
9563 "urcorn;": "\u231D",
9564 "urcorner;": "\u231D",
9565 "urcrop;": "\u230E",
9566 "Uring;": "\u016E",
9567 "uring;": "\u016F",
9568 "urtri;": "\u25F9",
9569 "Uscr;": "\uD835\uDCB0",
9570 "uscr;": "\uD835\uDCCA",
9571 "utdot;": "\u22F0",
9572 "Utilde;": "\u0168",
9573 "utilde;": "\u0169",
9574 "utri;": "\u25B5",
9575 "utrif;": "\u25B4",
9576 "uuarr;": "\u21C8",
9577 "Uuml;": "\u00DC",
9578 "Uuml": "\u00DC",
9579 "uuml;": "\u00FC",
9580 "uuml": "\u00FC",
9581 "uwangle;": "\u29A7",
9582 "vangrt;": "\u299C",
9583 "varepsilon;": "\u03F5",
9584 "varkappa;": "\u03F0",
9585 "varnothing;": "\u2205",
9586 "varphi;": "\u03D5",
9587 "varpi;": "\u03D6",
9588 "varpropto;": "\u221D",
9589 "varr;": "\u2195",
9590 "vArr;": "\u21D5",
9591 "varrho;": "\u03F1",
9592 "varsigma;": "\u03C2",
9593 "varsubsetneq;": "\u228A\uFE00",
9594 "varsubsetneqq;": "\u2ACB\uFE00",
9595 "varsupsetneq;": "\u228B\uFE00",
9596 "varsupsetneqq;": "\u2ACC\uFE00",
9597 "vartheta;": "\u03D1",
9598 "vartriangleleft;": "\u22B2",
9599 "vartriangleright;": "\u22B3",
9600 "vBar;": "\u2AE8",
9601 "Vbar;": "\u2AEB",
9602 "vBarv;": "\u2AE9",
9603 "Vcy;": "\u0412",
9604 "vcy;": "\u0432",
9605 "vdash;": "\u22A2",
9606 "vDash;": "\u22A8",
9607 "Vdash;": "\u22A9",
9608 "VDash;": "\u22AB",
9609 "Vdashl;": "\u2AE6",
9610 "veebar;": "\u22BB",
9611 "vee;": "\u2228",
9612 "Vee;": "\u22C1",
9613 "veeeq;": "\u225A",
9614 "vellip;": "\u22EE",
9615 "verbar;": "\u007C",
9616 "Verbar;": "\u2016",
9617 "vert;": "\u007C",
9618 "Vert;": "\u2016",
9619 "VerticalBar;": "\u2223",
9620 "VerticalLine;": "\u007C",
9621 "VerticalSeparator;": "\u2758",
9622 "VerticalTilde;": "\u2240",
9623 "VeryThinSpace;": "\u200A",
9624 "Vfr;": "\uD835\uDD19",
9625 "vfr;": "\uD835\uDD33",
9626 "vltri;": "\u22B2",
9627 "vnsub;": "\u2282\u20D2",
9628 "vnsup;": "\u2283\u20D2",
9629 "Vopf;": "\uD835\uDD4D",
9630 "vopf;": "\uD835\uDD67",
9631 "vprop;": "\u221D",
9632 "vrtri;": "\u22B3",
9633 "Vscr;": "\uD835\uDCB1",
9634 "vscr;": "\uD835\uDCCB",
9635 "vsubnE;": "\u2ACB\uFE00",
9636 "vsubne;": "\u228A\uFE00",
9637 "vsupnE;": "\u2ACC\uFE00",
9638 "vsupne;": "\u228B\uFE00",
9639 "Vvdash;": "\u22AA",
9640 "vzigzag;": "\u299A",
9641 "Wcirc;": "\u0174",
9642 "wcirc;": "\u0175",
9643 "wedbar;": "\u2A5F",
9644 "wedge;": "\u2227",
9645 "Wedge;": "\u22C0",
9646 "wedgeq;": "\u2259",
9647 "weierp;": "\u2118",
9648 "Wfr;": "\uD835\uDD1A",
9649 "wfr;": "\uD835\uDD34",
9650 "Wopf;": "\uD835\uDD4E",
9651 "wopf;": "\uD835\uDD68",
9652 "wp;": "\u2118",
9653 "wr;": "\u2240",
9654 "wreath;": "\u2240",
9655 "Wscr;": "\uD835\uDCB2",
9656 "wscr;": "\uD835\uDCCC",
9657 "xcap;": "\u22C2",
9658 "xcirc;": "\u25EF",
9659 "xcup;": "\u22C3",
9660 "xdtri;": "\u25BD",
9661 "Xfr;": "\uD835\uDD1B",
9662 "xfr;": "\uD835\uDD35",
9663 "xharr;": "\u27F7",
9664 "xhArr;": "\u27FA",
9665 "Xi;": "\u039E",
9666 "xi;": "\u03BE",
9667 "xlarr;": "\u27F5",
9668 "xlArr;": "\u27F8",
9669 "xmap;": "\u27FC",
9670 "xnis;": "\u22FB",
9671 "xodot;": "\u2A00",
9672 "Xopf;": "\uD835\uDD4F",
9673 "xopf;": "\uD835\uDD69",
9674 "xoplus;": "\u2A01",
9675 "xotime;": "\u2A02",
9676 "xrarr;": "\u27F6",
9677 "xrArr;": "\u27F9",
9678 "Xscr;": "\uD835\uDCB3",
9679 "xscr;": "\uD835\uDCCD",
9680 "xsqcup;": "\u2A06",
9681 "xuplus;": "\u2A04",
9682 "xutri;": "\u25B3",
9683 "xvee;": "\u22C1",
9684 "xwedge;": "\u22C0",
9685 "Yacute;": "\u00DD",
9686 "Yacute": "\u00DD",
9687 "yacute;": "\u00FD",
9688 "yacute": "\u00FD",
9689 "YAcy;": "\u042F",
9690 "yacy;": "\u044F",
9691 "Ycirc;": "\u0176",
9692 "ycirc;": "\u0177",
9693 "Ycy;": "\u042B",
9694 "ycy;": "\u044B",
9695 "yen;": "\u00A5",
9696 "yen": "\u00A5",
9697 "Yfr;": "\uD835\uDD1C",
9698 "yfr;": "\uD835\uDD36",
9699 "YIcy;": "\u0407",
9700 "yicy;": "\u0457",
9701 "Yopf;": "\uD835\uDD50",
9702 "yopf;": "\uD835\uDD6A",
9703 "Yscr;": "\uD835\uDCB4",
9704 "yscr;": "\uD835\uDCCE",
9705 "YUcy;": "\u042E",
9706 "yucy;": "\u044E",
9707 "yuml;": "\u00FF",
9708 "yuml": "\u00FF",
9709 "Yuml;": "\u0178",
9710 "Zacute;": "\u0179",
9711 "zacute;": "\u017A",
9712 "Zcaron;": "\u017D",
9713 "zcaron;": "\u017E",
9714 "Zcy;": "\u0417",
9715 "zcy;": "\u0437",
9716 "Zdot;": "\u017B",
9717 "zdot;": "\u017C",
9718 "zeetrf;": "\u2128",
9719 "ZeroWidthSpace;": "\u200B",
9720 "Zeta;": "\u0396",
9721 "zeta;": "\u03B6",
9722 "zfr;": "\uD835\uDD37",
9723 "Zfr;": "\u2128",
9724 "ZHcy;": "\u0416",
9725 "zhcy;": "\u0436",
9726 "zigrarr;": "\u21DD",
9727 "zopf;": "\uD835\uDD6B",
9728 "Zopf;": "\u2124",
9729 "Zscr;": "\uD835\uDCB5",
9730 "zscr;": "\uD835\uDCCF",
9731 "zwj;": "\u200D",
9732 "zwnj;": "\u200C"
9733 };
9734  
9735 },
9736 {}],
9737 13:[function(_dereq_,module,exports){
9738 var util = _dereq_('util/');
9739  
9740 var pSlice = Array.prototype.slice;
9741 var hasOwn = Object.prototype.hasOwnProperty;
9742  
9743 var assert = module.exports = ok;
9744  
9745 assert.AssertionError = function AssertionError(options) {
9746 this.name = 'AssertionError';
9747 this.actual = options.actual;
9748 this.expected = options.expected;
9749 this.operator = options.operator;
9750 if (options.message) {
9751 this.message = options.message;
9752 this.generatedMessage = false;
9753 } else {
9754 this.message = getMessage(this);
9755 this.generatedMessage = true;
9756 }
9757 var stackStartFunction = options.stackStartFunction || fail;
9758  
9759 if (Error.captureStackTrace) {
9760 Error.captureStackTrace(this, stackStartFunction);
9761 }
9762 else {
9763 var err = new Error();
9764 if (err.stack) {
9765 var out = err.stack;
9766 var fn_name = stackStartFunction.name;
9767 var idx = out.indexOf('\n' + fn_name);
9768 if (idx >= 0) {
9769 var next_line = out.indexOf('\n', idx + 1);
9770 out = out.substring(next_line + 1);
9771 }
9772  
9773 this.stack = out;
9774 }
9775 }
9776 };
9777 util.inherits(assert.AssertionError, Error);
9778  
9779 function replacer(key, value) {
9780 if (util.isUndefined(value)) {
9781 return '' + value;
9782 }
9783 if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) {
9784 return value.toString();
9785 }
9786 if (util.isFunction(value) || util.isRegExp(value)) {
9787 return value.toString();
9788 }
9789 return value;
9790 }
9791  
9792 function truncate(s, n) {
9793 if (util.isString(s)) {
9794 return s.length < n ? s : s.slice(0, n);
9795 } else {
9796 return s;
9797 }
9798 }
9799  
9800 function getMessage(self) {
9801 return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
9802 self.operator + ' ' +
9803 truncate(JSON.stringify(self.expected, replacer), 128);
9804 }
9805  
9806 function fail(actual, expected, message, operator, stackStartFunction) {
9807 throw new assert.AssertionError({
9808 message: message,
9809 actual: actual,
9810 expected: expected,
9811 operator: operator,
9812 stackStartFunction: stackStartFunction
9813 });
9814 }
9815 assert.fail = fail;
9816  
9817 function ok(value, message) {
9818 if (!value) fail(value, true, message, '==', assert.ok);
9819 }
9820 assert.ok = ok;
9821  
9822 assert.equal = function equal(actual, expected, message) {
9823 if (actual != expected) fail(actual, expected, message, '==', assert.equal);
9824 };
9825  
9826 assert.notEqual = function notEqual(actual, expected, message) {
9827 if (actual == expected) {
9828 fail(actual, expected, message, '!=', assert.notEqual);
9829 }
9830 };
9831  
9832 assert.deepEqual = function deepEqual(actual, expected, message) {
9833 if (!_deepEqual(actual, expected)) {
9834 fail(actual, expected, message, 'deepEqual', assert.deepEqual);
9835 }
9836 };
9837  
9838 function _deepEqual(actual, expected) {
9839 if (actual === expected) {
9840 return true;
9841  
9842 } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
9843 if (actual.length != expected.length) return false;
9844  
9845 for (var i = 0; i < actual.length; i++) {
9846 if (actual[i] !== expected[i]) return false;
9847 }
9848  
9849 return true;
9850 } else if (util.isDate(actual) && util.isDate(expected)) {
9851 return actual.getTime() === expected.getTime();
9852 } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
9853 return actual.source === expected.source &&
9854 actual.global === expected.global &&
9855 actual.multiline === expected.multiline &&
9856 actual.lastIndex === expected.lastIndex &&
9857 actual.ignoreCase === expected.ignoreCase;
9858 } else if (!util.isObject(actual) && !util.isObject(expected)) {
9859 return actual == expected;
9860 } else {
9861 return objEquiv(actual, expected);
9862 }
9863 }
9864  
9865 function isArguments(object) {
9866 return Object.prototype.toString.call(object) == '[object Arguments]';
9867 }
9868  
9869 function objEquiv(a, b) {
9870 if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
9871 return false;
9872 if (a.prototype !== b.prototype) return false;
9873 if (isArguments(a)) {
9874 if (!isArguments(b)) {
9875 return false;
9876 }
9877 a = pSlice.call(a);
9878 b = pSlice.call(b);
9879 return _deepEqual(a, b);
9880 }
9881 try {
9882 var ka = objectKeys(a),
9883 kb = objectKeys(b),
9884 key, i;
9885 } catch (e) {//happens when one is a string literal and the other isn't
9886 return false;
9887 }
9888 if (ka.length != kb.length)
9889 return false;
9890 ka.sort();
9891 kb.sort();
9892 for (i = ka.length - 1; i >= 0; i--) {
9893 if (ka[i] != kb[i])
9894 return false;
9895 }
9896 for (i = ka.length - 1; i >= 0; i--) {
9897 key = ka[i];
9898 if (!_deepEqual(a[key], b[key])) return false;
9899 }
9900 return true;
9901 }
9902  
9903 assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
9904 if (_deepEqual(actual, expected)) {
9905 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
9906 }
9907 };
9908  
9909 assert.strictEqual = function strictEqual(actual, expected, message) {
9910 if (actual !== expected) {
9911 fail(actual, expected, message, '===', assert.strictEqual);
9912 }
9913 };
9914  
9915 assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
9916 if (actual === expected) {
9917 fail(actual, expected, message, '!==', assert.notStrictEqual);
9918 }
9919 };
9920  
9921 function expectedException(actual, expected) {
9922 if (!actual || !expected) {
9923 return false;
9924 }
9925  
9926 if (Object.prototype.toString.call(expected) == '[object RegExp]') {
9927 return expected.test(actual);
9928 } else if (actual instanceof expected) {
9929 return true;
9930 } else if (expected.call({}, actual) === true) {
9931 return true;
9932 }
9933  
9934 return false;
9935 }
9936  
9937 function _throws(shouldThrow, block, expected, message) {
9938 var actual;
9939  
9940 if (util.isString(expected)) {
9941 message = expected;
9942 expected = null;
9943 }
9944  
9945 try {
9946 block();
9947 } catch (e) {
9948 actual = e;
9949 }
9950  
9951 message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
9952 (message ? ' ' + message : '.');
9953  
9954 if (shouldThrow && !actual) {
9955 fail(actual, expected, 'Missing expected exception' + message);
9956 }
9957  
9958 if (!shouldThrow && expectedException(actual, expected)) {
9959 fail(actual, expected, 'Got unwanted exception' + message);
9960 }
9961  
9962 if ((shouldThrow && actual && expected &&
9963 !expectedException(actual, expected)) || (!shouldThrow && actual)) {
9964 throw actual;
9965 }
9966 }
9967  
9968 assert.throws = function(block, /*optional*/error, /*optional*/message) {
9969 _throws.apply(this, [true].concat(pSlice.call(arguments)));
9970 };
9971 assert.doesNotThrow = function(block, /*optional*/message) {
9972 _throws.apply(this, [false].concat(pSlice.call(arguments)));
9973 };
9974  
9975 assert.ifError = function(err) { if (err) {throw err;}};
9976  
9977 var objectKeys = Object.keys || function (obj) {
9978 var keys = [];
9979 for (var key in obj) {
9980 if (hasOwn.call(obj, key)) keys.push(key);
9981 }
9982 return keys;
9983 };
9984  
9985 },
9986 {"util/":15}],
9987 14:[function(_dereq_,module,exports){
9988 module.exports = function isBuffer(arg) {
9989 return arg && typeof arg === 'object'
9990 && typeof arg.copy === 'function'
9991 && typeof arg.fill === 'function'
9992 && typeof arg.readUInt8 === 'function';
9993 }
9994 },
9995 {}],
9996 15:[function(_dereq_,module,exports){
9997 (function (process,global){
9998  
9999 var formatRegExp = /%[sdj%]/g;
10000 exports.format = function(f) {
10001 if (!isString(f)) {
10002 var objects = [];
10003 for (var i = 0; i < arguments.length; i++) {
10004 objects.push(inspect(arguments[i]));
10005 }
10006 return objects.join(' ');
10007 }
10008  
10009 var i = 1;
10010 var args = arguments;
10011 var len = args.length;
10012 var str = String(f).replace(formatRegExp, function(x) {
10013 if (x === '%%') return '%';
10014 if (i >= len) return x;
10015 switch (x) {
10016 case '%s': return String(args[i++]);
10017 case '%d': return Number(args[i++]);
10018 case '%j':
10019 try {
10020 return JSON.stringify(args[i++]);
10021 } catch (_) {
10022 return '[Circular]';
10023 }
10024 default:
10025 return x;
10026 }
10027 });
10028 for (var x = args[i]; i < len; x = args[++i]) {
10029 if (isNull(x) || !isObject(x)) {
10030 str += ' ' + x;
10031 } else {
10032 str += ' ' + inspect(x);
10033 }
10034 }
10035 return str;
10036 };
10037 exports.deprecate = function(fn, msg) {
10038 if (isUndefined(global.process)) {
10039 return function() {
10040 return exports.deprecate(fn, msg).apply(this, arguments);
10041 };
10042 }
10043  
10044 if (process.noDeprecation === true) {
10045 return fn;
10046 }
10047  
10048 var warned = false;
10049 function deprecated() {
10050 if (!warned) {
10051 if (process.throwDeprecation) {
10052 throw new Error(msg);
10053 } else if (process.traceDeprecation) {
10054 console.trace(msg);
10055 } else {
10056 console.error(msg);
10057 }
10058 warned = true;
10059 }
10060 return fn.apply(this, arguments);
10061 }
10062  
10063 return deprecated;
10064 };
10065  
10066  
10067 var debugs = {};
10068 var debugEnviron;
10069 exports.debuglog = function(set) {
10070 if (isUndefined(debugEnviron))
10071 debugEnviron = process.env.NODE_DEBUG || '';
10072 set = set.toUpperCase();
10073 if (!debugs[set]) {
10074 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
10075 var pid = process.pid;
10076 debugs[set] = function() {
10077 var msg = exports.format.apply(exports, arguments);
10078 console.error('%s %d: %s', set, pid, msg);
10079 };
10080 } else {
10081 debugs[set] = function() {};
10082 }
10083 }
10084 return debugs[set];
10085 };
10086 function inspect(obj, opts) {
10087 var ctx = {
10088 seen: [],
10089 stylize: stylizeNoColor
10090 };
10091 if (arguments.length >= 3) ctx.depth = arguments[2];
10092 if (arguments.length >= 4) ctx.colors = arguments[3];
10093 if (isBoolean(opts)) {
10094 ctx.showHidden = opts;
10095 } else if (opts) {
10096 exports._extend(ctx, opts);
10097 }
10098 if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
10099 if (isUndefined(ctx.depth)) ctx.depth = 2;
10100 if (isUndefined(ctx.colors)) ctx.colors = false;
10101 if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
10102 if (ctx.colors) ctx.stylize = stylizeWithColor;
10103 return formatValue(ctx, obj, ctx.depth);
10104 }
10105 exports.inspect = inspect;
10106 inspect.colors = {
10107 'bold' : [1, 22],
10108 'italic' : [3, 23],
10109 'underline' : [4, 24],
10110 'inverse' : [7, 27],
10111 'white' : [37, 39],
10112 'grey' : [90, 39],
10113 'black' : [30, 39],
10114 'blue' : [34, 39],
10115 'cyan' : [36, 39],
10116 'green' : [32, 39],
10117 'magenta' : [35, 39],
10118 'red' : [31, 39],
10119 'yellow' : [33, 39]
10120 };
10121 inspect.styles = {
10122 'special': 'cyan',
10123 'number': 'yellow',
10124 'boolean': 'yellow',
10125 'undefined': 'grey',
10126 'null': 'bold',
10127 'string': 'green',
10128 'date': 'magenta',
10129 'regexp': 'red'
10130 };
10131  
10132  
10133 function stylizeWithColor(str, styleType) {
10134 var style = inspect.styles[styleType];
10135  
10136 if (style) {
10137 return '\u001b[' + inspect.colors[style][0] + 'm' + str +
10138 '\u001b[' + inspect.colors[style][1] + 'm';
10139 } else {
10140 return str;
10141 }
10142 }
10143  
10144  
10145 function stylizeNoColor(str, styleType) {
10146 return str;
10147 }
10148  
10149  
10150 function arrayToHash(array) {
10151 var hash = {};
10152  
10153 array.forEach(function(val, idx) {
10154 hash[val] = true;
10155 });
10156  
10157 return hash;
10158 }
10159  
10160  
10161 function formatValue(ctx, value, recurseTimes) {
10162 if (ctx.customInspect &&
10163 value &&
10164 isFunction(value.inspect) &&
10165 value.inspect !== exports.inspect &&
10166 !(value.constructor && value.constructor.prototype === value)) {
10167 var ret = value.inspect(recurseTimes, ctx);
10168 if (!isString(ret)) {
10169 ret = formatValue(ctx, ret, recurseTimes);
10170 }
10171 return ret;
10172 }
10173 var primitive = formatPrimitive(ctx, value);
10174 if (primitive) {
10175 return primitive;
10176 }
10177 var keys = Object.keys(value);
10178 var visibleKeys = arrayToHash(keys);
10179  
10180 if (ctx.showHidden) {
10181 keys = Object.getOwnPropertyNames(value);
10182 }
10183 if (isError(value)
10184 && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
10185 return formatError(value);
10186 }
10187 if (keys.length === 0) {
10188 if (isFunction(value)) {
10189 var name = value.name ? ': ' + value.name : '';
10190 return ctx.stylize('[Function' + name + ']', 'special');
10191 }
10192 if (isRegExp(value)) {
10193 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
10194 }
10195 if (isDate(value)) {
10196 return ctx.stylize(Date.prototype.toString.call(value), 'date');
10197 }
10198 if (isError(value)) {
10199 return formatError(value);
10200 }
10201 }
10202  
10203 var base = '', array = false, braces = ['{', '}'];
10204 if (isArray(value)) {
10205 array = true;
10206 braces = ['[', ']'];
10207 }
10208 if (isFunction(value)) {
10209 var n = value.name ? ': ' + value.name : '';
10210 base = ' [Function' + n + ']';
10211 }
10212 if (isRegExp(value)) {
10213 base = ' ' + RegExp.prototype.toString.call(value);
10214 }
10215 if (isDate(value)) {
10216 base = ' ' + Date.prototype.toUTCString.call(value);
10217 }
10218 if (isError(value)) {
10219 base = ' ' + formatError(value);
10220 }
10221  
10222 if (keys.length === 0 && (!array || value.length == 0)) {
10223 return braces[0] + base + braces[1];
10224 }
10225  
10226 if (recurseTimes < 0) {
10227 if (isRegExp(value)) {
10228 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
10229 } else {
10230 return ctx.stylize('[Object]', 'special');
10231 }
10232 }
10233  
10234 ctx.seen.push(value);
10235  
10236 var output;
10237 if (array) {
10238 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
10239 } else {
10240 output = keys.map(function(key) {
10241 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
10242 });
10243 }
10244  
10245 ctx.seen.pop();
10246  
10247 return reduceToSingleString(output, base, braces);
10248 }
10249  
10250  
10251 function formatPrimitive(ctx, value) {
10252 if (isUndefined(value))
10253 return ctx.stylize('undefined', 'undefined');
10254 if (isString(value)) {
10255 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
10256 .replace(/'/g, "\\'")
10257 .replace(/\\"/g, '"') + '\'';
10258 return ctx.stylize(simple, 'string');
10259 }
10260 if (isNumber(value))
10261 return ctx.stylize('' + value, 'number');
10262 if (isBoolean(value))
10263 return ctx.stylize('' + value, 'boolean');
10264 if (isNull(value))
10265 return ctx.stylize('null', 'null');
10266 }
10267  
10268  
10269 function formatError(value) {
10270 return '[' + Error.prototype.toString.call(value) + ']';
10271 }
10272  
10273  
10274 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
10275 var output = [];
10276 for (var i = 0, l = value.length; i < l; ++i) {
10277 if (hasOwnProperty(value, String(i))) {
10278 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
10279 String(i), true));
10280 } else {
10281 output.push('');
10282 }
10283 }
10284 keys.forEach(function(key) {
10285 if (!key.match(/^\d+$/)) {
10286 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
10287 key, true));
10288 }
10289 });
10290 return output;
10291 }
10292  
10293  
10294 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
10295 var name, str, desc;
10296 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
10297 if (desc.get) {
10298 if (desc.set) {
10299 str = ctx.stylize('[Getter/Setter]', 'special');
10300 } else {
10301 str = ctx.stylize('[Getter]', 'special');
10302 }
10303 } else {
10304 if (desc.set) {
10305 str = ctx.stylize('[Setter]', 'special');
10306 }
10307 }
10308 if (!hasOwnProperty(visibleKeys, key)) {
10309 name = '[' + key + ']';
10310 }
10311 if (!str) {
10312 if (ctx.seen.indexOf(desc.value) < 0) {
10313 if (isNull(recurseTimes)) {
10314 str = formatValue(ctx, desc.value, null);
10315 } else {
10316 str = formatValue(ctx, desc.value, recurseTimes - 1);
10317 }
10318 if (str.indexOf('\n') > -1) {
10319 if (array) {
10320 str = str.split('\n').map(function(line) {
10321 return ' ' + line;
10322 }).join('\n').substr(2);
10323 } else {
10324 str = '\n' + str.split('\n').map(function(line) {
10325 return ' ' + line;
10326 }).join('\n');
10327 }
10328 }
10329 } else {
10330 str = ctx.stylize('[Circular]', 'special');
10331 }
10332 }
10333 if (isUndefined(name)) {
10334 if (array && key.match(/^\d+$/)) {
10335 return str;
10336 }
10337 name = JSON.stringify('' + key);
10338 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
10339 name = name.substr(1, name.length - 2);
10340 name = ctx.stylize(name, 'name');
10341 } else {
10342 name = name.replace(/'/g, "\\'")
10343 .replace(/\\"/g, '"')
10344 .replace(/(^"|"$)/g, "'");
10345 name = ctx.stylize(name, 'string');
10346 }
10347 }
10348  
10349 return name + ': ' + str;
10350 }
10351  
10352  
10353 function reduceToSingleString(output, base, braces) {
10354 var numLinesEst = 0;
10355 var length = output.reduce(function(prev, cur) {
10356 numLinesEst++;
10357 if (cur.indexOf('\n') >= 0) numLinesEst++;
10358 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
10359 }, 0);
10360  
10361 if (length > 60) {
10362 return braces[0] +
10363 (base === '' ? '' : base + '\n ') +
10364 ' ' +
10365 output.join(',\n ') +
10366 ' ' +
10367 braces[1];
10368 }
10369  
10370 return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
10371 }
10372 function isArray(ar) {
10373 return Array.isArray(ar);
10374 }
10375 exports.isArray = isArray;
10376  
10377 function isBoolean(arg) {
10378 return typeof arg === 'boolean';
10379 }
10380 exports.isBoolean = isBoolean;
10381  
10382 function isNull(arg) {
10383 return arg === null;
10384 }
10385 exports.isNull = isNull;
10386  
10387 function isNullOrUndefined(arg) {
10388 return arg == null;
10389 }
10390 exports.isNullOrUndefined = isNullOrUndefined;
10391  
10392 function isNumber(arg) {
10393 return typeof arg === 'number';
10394 }
10395 exports.isNumber = isNumber;
10396  
10397 function isString(arg) {
10398 return typeof arg === 'string';
10399 }
10400 exports.isString = isString;
10401  
10402 function isSymbol(arg) {
10403 return typeof arg === 'symbol';
10404 }
10405 exports.isSymbol = isSymbol;
10406  
10407 function isUndefined(arg) {
10408 return arg === void 0;
10409 }
10410 exports.isUndefined = isUndefined;
10411  
10412 function isRegExp(re) {
10413 return isObject(re) && objectToString(re) === '[object RegExp]';
10414 }
10415 exports.isRegExp = isRegExp;
10416  
10417 function isObject(arg) {
10418 return typeof arg === 'object' && arg !== null;
10419 }
10420 exports.isObject = isObject;
10421  
10422 function isDate(d) {
10423 return isObject(d) && objectToString(d) === '[object Date]';
10424 }
10425 exports.isDate = isDate;
10426  
10427 function isError(e) {
10428 return isObject(e) &&
10429 (objectToString(e) === '[object Error]' || e instanceof Error);
10430 }
10431 exports.isError = isError;
10432  
10433 function isFunction(arg) {
10434 return typeof arg === 'function';
10435 }
10436 exports.isFunction = isFunction;
10437  
10438 function isPrimitive(arg) {
10439 return arg === null ||
10440 typeof arg === 'boolean' ||
10441 typeof arg === 'number' ||
10442 typeof arg === 'string' ||
10443 typeof arg === 'symbol' || // ES6 symbol
10444 typeof arg === 'undefined';
10445 }
10446 exports.isPrimitive = isPrimitive;
10447  
10448 exports.isBuffer = _dereq_('./support/isBuffer');
10449  
10450 function objectToString(o) {
10451 return Object.prototype.toString.call(o);
10452 }
10453  
10454  
10455 function pad(n) {
10456 return n < 10 ? '0' + n.toString(10) : n.toString(10);
10457 }
10458  
10459  
10460 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
10461 'Oct', 'Nov', 'Dec'];
10462 function timestamp() {
10463 var d = new Date();
10464 var time = [pad(d.getHours()),
10465 pad(d.getMinutes()),
10466 pad(d.getSeconds())].join(':');
10467 return [d.getDate(), months[d.getMonth()], time].join(' ');
10468 }
10469 exports.log = function() {
10470 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
10471 };
10472 exports.inherits = _dereq_('inherits');
10473  
10474 exports._extend = function(origin, add) {
10475 if (!add || !isObject(add)) return origin;
10476  
10477 var keys = Object.keys(add);
10478 var i = keys.length;
10479 while (i--) {
10480 origin[keys[i]] = add[keys[i]];
10481 }
10482 return origin;
10483 };
10484  
10485 function hasOwnProperty(obj, prop) {
10486 return Object.prototype.hasOwnProperty.call(obj, prop);
10487 }
10488  
10489 }).call(this,_dereq_("/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
10490 },
10491 {"./support/isBuffer":14,"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":18,"inherits":17}],
10492 16:[function(_dereq_,module,exports){
10493  
10494 function EventEmitter() {
10495 this._events = this._events || {};
10496 this._maxListeners = this._maxListeners || undefined;
10497 }
10498 module.exports = EventEmitter;
10499 EventEmitter.EventEmitter = EventEmitter;
10500  
10501 EventEmitter.prototype._events = undefined;
10502 EventEmitter.prototype._maxListeners = undefined;
10503 EventEmitter.defaultMaxListeners = 10;
10504 EventEmitter.prototype.setMaxListeners = function(n) {
10505 if (!isNumber(n) || n < 0 || isNaN(n))
10506 throw TypeError('n must be a positive number');
10507 this._maxListeners = n;
10508 return this;
10509 };
10510  
10511 EventEmitter.prototype.emit = function(type) {
10512 var er, handler, len, args, i, listeners;
10513  
10514 if (!this._events)
10515 this._events = {};
10516 if (type === 'error') {
10517 if (!this._events.error ||
10518 (isObject(this._events.error) && !this._events.error.length)) {
10519 er = arguments[1];
10520 if (er instanceof Error) {
10521 throw er; // Unhandled 'error' event
10522 } else {
10523 throw TypeError('Uncaught, unspecified "error" event.');
10524 }
10525 return false;
10526 }
10527 }
10528  
10529 handler = this._events[type];
10530  
10531 if (isUndefined(handler))
10532 return false;
10533  
10534 if (isFunction(handler)) {
10535 switch (arguments.length) {
10536 case 1:
10537 handler.call(this);
10538 break;
10539 case 2:
10540 handler.call(this, arguments[1]);
10541 break;
10542 case 3:
10543 handler.call(this, arguments[1], arguments[2]);
10544 break;
10545 default:
10546 len = arguments.length;
10547 args = new Array(len - 1);
10548 for (i = 1; i < len; i++)
10549 args[i - 1] = arguments[i];
10550 handler.apply(this, args);
10551 }
10552 } else if (isObject(handler)) {
10553 len = arguments.length;
10554 args = new Array(len - 1);
10555 for (i = 1; i < len; i++)
10556 args[i - 1] = arguments[i];
10557  
10558 listeners = handler.slice();
10559 len = listeners.length;
10560 for (i = 0; i < len; i++)
10561 listeners[i].apply(this, args);
10562 }
10563  
10564 return true;
10565 };
10566  
10567 EventEmitter.prototype.addListener = function(type, listener) {
10568 var m;
10569  
10570 if (!isFunction(listener))
10571 throw TypeError('listener must be a function');
10572  
10573 if (!this._events)
10574 this._events = {};
10575 if (this._events.newListener)
10576 this.emit('newListener', type,
10577 isFunction(listener.listener) ?
10578 listener.listener : listener);
10579  
10580 if (!this._events[type])
10581 this._events[type] = listener;
10582 else if (isObject(this._events[type]))
10583 this._events[type].push(listener);
10584 else
10585 this._events[type] = [this._events[type], listener];
10586 if (isObject(this._events[type]) && !this._events[type].warned) {
10587 var m;
10588 if (!isUndefined(this._maxListeners)) {
10589 m = this._maxListeners;
10590 } else {
10591 m = EventEmitter.defaultMaxListeners;
10592 }
10593  
10594 if (m && m > 0 && this._events[type].length > m) {
10595 this._events[type].warned = true;
10596 console.error('(node) warning: possible EventEmitter memory ' +
10597 'leak detected. %d listeners added. ' +
10598 'Use emitter.setMaxListeners() to increase limit.',
10599 this._events[type].length);
10600 console.trace();
10601 }
10602 }
10603  
10604 return this;
10605 };
10606  
10607 EventEmitter.prototype.on = EventEmitter.prototype.addListener;
10608  
10609 EventEmitter.prototype.once = function(type, listener) {
10610 if (!isFunction(listener))
10611 throw TypeError('listener must be a function');
10612  
10613 var fired = false;
10614  
10615 function g() {
10616 this.removeListener(type, g);
10617  
10618 if (!fired) {
10619 fired = true;
10620 listener.apply(this, arguments);
10621 }
10622 }
10623  
10624 g.listener = listener;
10625 this.on(type, g);
10626  
10627 return this;
10628 };
10629 EventEmitter.prototype.removeListener = function(type, listener) {
10630 var list, position, length, i;
10631  
10632 if (!isFunction(listener))
10633 throw TypeError('listener must be a function');
10634  
10635 if (!this._events || !this._events[type])
10636 return this;
10637  
10638 list = this._events[type];
10639 length = list.length;
10640 position = -1;
10641  
10642 if (list === listener ||
10643 (isFunction(list.listener) && list.listener === listener)) {
10644 delete this._events[type];
10645 if (this._events.removeListener)
10646 this.emit('removeListener', type, listener);
10647  
10648 } else if (isObject(list)) {
10649 for (i = length; i-- > 0;) {
10650 if (list[i] === listener ||
10651 (list[i].listener && list[i].listener === listener)) {
10652 position = i;
10653 break;
10654 }
10655 }
10656  
10657 if (position < 0)
10658 return this;
10659  
10660 if (list.length === 1) {
10661 list.length = 0;
10662 delete this._events[type];
10663 } else {
10664 list.splice(position, 1);
10665 }
10666  
10667 if (this._events.removeListener)
10668 this.emit('removeListener', type, listener);
10669 }
10670  
10671 return this;
10672 };
10673  
10674 EventEmitter.prototype.removeAllListeners = function(type) {
10675 var key, listeners;
10676  
10677 if (!this._events)
10678 return this;
10679 if (!this._events.removeListener) {
10680 if (arguments.length === 0)
10681 this._events = {};
10682 else if (this._events[type])
10683 delete this._events[type];
10684 return this;
10685 }
10686 if (arguments.length === 0) {
10687 for (key in this._events) {
10688 if (key === 'removeListener') continue;
10689 this.removeAllListeners(key);
10690 }
10691 this.removeAllListeners('removeListener');
10692 this._events = {};
10693 return this;
10694 }
10695  
10696 listeners = this._events[type];
10697  
10698 if (isFunction(listeners)) {
10699 this.removeListener(type, listeners);
10700 } else {
10701 while (listeners.length)
10702 this.removeListener(type, listeners[listeners.length - 1]);
10703 }
10704 delete this._events[type];
10705  
10706 return this;
10707 };
10708  
10709 EventEmitter.prototype.listeners = function(type) {
10710 var ret;
10711 if (!this._events || !this._events[type])
10712 ret = [];
10713 else if (isFunction(this._events[type]))
10714 ret = [this._events[type]];
10715 else
10716 ret = this._events[type].slice();
10717 return ret;
10718 };
10719  
10720 EventEmitter.listenerCount = function(emitter, type) {
10721 var ret;
10722 if (!emitter._events || !emitter._events[type])
10723 ret = 0;
10724 else if (isFunction(emitter._events[type]))
10725 ret = 1;
10726 else
10727 ret = emitter._events[type].length;
10728 return ret;
10729 };
10730  
10731 function isFunction(arg) {
10732 return typeof arg === 'function';
10733 }
10734  
10735 function isNumber(arg) {
10736 return typeof arg === 'number';
10737 }
10738  
10739 function isObject(arg) {
10740 return typeof arg === 'object' && arg !== null;
10741 }
10742  
10743 function isUndefined(arg) {
10744 return arg === void 0;
10745 }
10746  
10747 },
10748 {}],
10749 17:[function(_dereq_,module,exports){
10750 if (typeof Object.create === 'function') {
10751 module.exports = function inherits(ctor, superCtor) {
10752 ctor.super_ = superCtor
10753 ctor.prototype = Object.create(superCtor.prototype, {
10754 constructor: {
10755 value: ctor,
10756 enumerable: false,
10757 writable: true,
10758 configurable: true
10759 }
10760 });
10761 };
10762 } else {
10763 module.exports = function inherits(ctor, superCtor) {
10764 ctor.super_ = superCtor
10765 var TempCtor = function () {}
10766 TempCtor.prototype = superCtor.prototype
10767 ctor.prototype = new TempCtor()
10768 ctor.prototype.constructor = ctor
10769 }
10770 }
10771  
10772 },
10773 {}],
10774 18:[function(_dereq_,module,exports){
10775  
10776 var process = module.exports = {};
10777  
10778 process.nextTick = (function () {
10779 var canSetImmediate = typeof window !== 'undefined'
10780 && window.setImmediate;
10781 var canPost = typeof window !== 'undefined'
10782 && window.postMessage && window.addEventListener
10783 ;
10784  
10785 if (canSetImmediate) {
10786 return function (f) { return window.setImmediate(f) };
10787 }
10788  
10789 if (canPost) {
10790 var queue = [];
10791 window.addEventListener('message', function (ev) {
10792 var source = ev.source;
10793 if ((source === window || source === null) && ev.data === 'process-tick') {
10794 ev.stopPropagation();
10795 if (queue.length > 0) {
10796 var fn = queue.shift();
10797 fn();
10798 }
10799 }
10800 }, true);
10801  
10802 return function nextTick(fn) {
10803 queue.push(fn);
10804 window.postMessage('process-tick', '*');
10805 };
10806 }
10807  
10808 return function nextTick(fn) {
10809 setTimeout(fn, 0);
10810 };
10811 })();
10812  
10813 process.title = 'browser';
10814 process.browser = true;
10815 process.env = {};
10816 process.argv = [];
10817  
10818 function noop() {}
10819  
10820 process.on = noop;
10821 process.once = noop;
10822 process.off = noop;
10823 process.emit = noop;
10824  
10825 process.binding = function (name) {
10826 throw new Error('process.binding is not supported');
10827 }
10828 process.cwd = function () { return '/' };
10829 process.chdir = function (dir) {
10830 throw new Error('process.chdir is not supported');
10831 };
10832  
10833 },
10834 {}],
10835 19:[function(_dereq_,module,exports){
10836 module.exports=_dereq_(14)
10837 },
10838 {}],
10839 20:[function(_dereq_,module,exports){
10840 module.exports=_dereq_(15)
10841 },
10842 {"./support/isBuffer":19,"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":18,"inherits":17}]},{},[9])
10843 (9)
10844  
10845 });
10846  
10847 ace.define("ace/mode/html_worker",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/worker/mirror","ace/mode/html/saxparser"], function(require, exports, module) {
10848 "use strict";
10849  
10850 var oop = require("../lib/oop");
10851 var lang = require("../lib/lang");
10852 var Mirror = require("../worker/mirror").Mirror;
10853 var SAXParser = require("./html/saxparser").SAXParser;
10854  
10855 var errorTypes = {
10856 "expected-doctype-but-got-start-tag": "info",
10857 "expected-doctype-but-got-chars": "info",
10858 "non-html-root": "info"
10859 }
10860  
10861 var Worker = exports.Worker = function(sender) {
10862 Mirror.call(this, sender);
10863 this.setTimeout(400);
10864 this.context = null;
10865 };
10866  
10867 oop.inherits(Worker, Mirror);
10868  
10869 (function() {
10870  
10871 this.setOptions = function(options) {
10872 this.context = options.context;
10873 };
10874  
10875 this.onUpdate = function() {
10876 var value = this.doc.getValue();
10877 if (!value)
10878 return;
10879 var parser = new SAXParser();
10880 var errors = [];
10881 var noop = function(){};
10882 parser.contentHandler = {
10883 startDocument: noop,
10884 endDocument: noop,
10885 startElement: noop,
10886 endElement: noop,
10887 characters: noop
10888 };
10889 parser.errorHandler = {
10890 error: function(message, location, code) {
10891 errors.push({
10892 row: location.line,
10893 column: location.column,
10894 text: message,
10895 type: errorTypes[code] || "error"
10896 });
10897 }
10898 };
10899 if (this.context)
10900 parser.parseFragment(value, this.context);
10901 else
10902 parser.parse(value);
10903 this.sender.emit("error", errors);
10904 };
10905  
10906 }).call(Worker.prototype);
10907  
10908 });
10909  
10910 ace.define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) {
10911  
10912 function Empty() {}
10913  
10914 if (!Function.prototype.bind) {
10915 Function.prototype.bind = function bind(that) { // .length is 1
10916 var target = this;
10917 if (typeof target != "function") {
10918 throw new TypeError("Function.prototype.bind called on incompatible " + target);
10919 }
10920 var args = slice.call(arguments, 1); // for normal call
10921 var bound = function () {
10922  
10923 if (this instanceof bound) {
10924  
10925 var result = target.apply(
10926 this,
10927 args.concat(slice.call(arguments))
10928 );
10929 if (Object(result) === result) {
10930 return result;
10931 }
10932 return this;
10933  
10934 } else {
10935 return target.apply(
10936 that,
10937 args.concat(slice.call(arguments))
10938 );
10939  
10940 }
10941  
10942 };
10943 if(target.prototype) {
10944 Empty.prototype = target.prototype;
10945 bound.prototype = new Empty();
10946 Empty.prototype = null;
10947 }
10948 return bound;
10949 };
10950 }
10951 var call = Function.prototype.call;
10952 var prototypeOfArray = Array.prototype;
10953 var prototypeOfObject = Object.prototype;
10954 var slice = prototypeOfArray.slice;
10955 var _toString = call.bind(prototypeOfObject.toString);
10956 var owns = call.bind(prototypeOfObject.hasOwnProperty);
10957 var defineGetter;
10958 var defineSetter;
10959 var lookupGetter;
10960 var lookupSetter;
10961 var supportsAccessors;
10962 if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) {
10963 defineGetter = call.bind(prototypeOfObject.__defineGetter__);
10964 defineSetter = call.bind(prototypeOfObject.__defineSetter__);
10965 lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);
10966 lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);
10967 }
10968 if ([1,2].splice(0).length != 2) {
10969 if(function() { // test IE < 9 to splice bug - see issue #138
10970 function makeArray(l) {
10971 var a = new Array(l+2);
10972 a[0] = a[1] = 0;
10973 return a;
10974 }
10975 var array = [], lengthBefore;
10976  
10977 array.splice.apply(array, makeArray(20));
10978 array.splice.apply(array, makeArray(26));
10979  
10980 lengthBefore = array.length; //46
10981 array.splice(5, 0, "XXX"); // add one element
10982  
10983 lengthBefore + 1 == array.length
10984  
10985 if (lengthBefore + 1 == array.length) {
10986 return true;// has right splice implementation without bugs
10987 }
10988 }()) {//IE 6/7
10989 var array_splice = Array.prototype.splice;
10990 Array.prototype.splice = function(start, deleteCount) {
10991 if (!arguments.length) {
10992 return [];
10993 } else {
10994 return array_splice.apply(this, [
10995 start === void 0 ? 0 : start,
10996 deleteCount === void 0 ? (this.length - start) : deleteCount
10997 ].concat(slice.call(arguments, 2)))
10998 }
10999 };
11000 } else {//IE8
11001 Array.prototype.splice = function(pos, removeCount){
11002 var length = this.length;
11003 if (pos > 0) {
11004 if (pos > length)
11005 pos = length;
11006 } else if (pos == void 0) {
11007 pos = 0;
11008 } else if (pos < 0) {
11009 pos = Math.max(length + pos, 0);
11010 }
11011  
11012 if (!(pos+removeCount < length))
11013 removeCount = length - pos;
11014  
11015 var removed = this.slice(pos, pos+removeCount);
11016 var insert = slice.call(arguments, 2);
11017 var add = insert.length;
11018 if (pos === length) {
11019 if (add) {
11020 this.push.apply(this, insert);
11021 }
11022 } else {
11023 var remove = Math.min(removeCount, length - pos);
11024 var tailOldPos = pos + remove;
11025 var tailNewPos = tailOldPos + add - remove;
11026 var tailCount = length - tailOldPos;
11027 var lengthAfterRemove = length - remove;
11028  
11029 if (tailNewPos < tailOldPos) { // case A
11030 for (var i = 0; i < tailCount; ++i) {
11031 this[tailNewPos+i] = this[tailOldPos+i];
11032 }
11033 } else if (tailNewPos > tailOldPos) { // case B
11034 for (i = tailCount; i--; ) {
11035 this[tailNewPos+i] = this[tailOldPos+i];
11036 }
11037 } // else, add == remove (nothing to do)
11038  
11039 if (add && pos === lengthAfterRemove) {
11040 this.length = lengthAfterRemove; // truncate array
11041 this.push.apply(this, insert);
11042 } else {
11043 this.length = lengthAfterRemove + add; // reserves space
11044 for (i = 0; i < add; ++i) {
11045 this[pos+i] = insert[i];
11046 }
11047 }
11048 }
11049 return removed;
11050 };
11051 }
11052 }
11053 if (!Array.isArray) {
11054 Array.isArray = function isArray(obj) {
11055 return _toString(obj) == "[object Array]";
11056 };
11057 }
11058 var boxedString = Object("a"),
11059 splitString = boxedString[0] != "a" || !(0 in boxedString);
11060  
11061 if (!Array.prototype.forEach) {
11062 Array.prototype.forEach = function forEach(fun /*, thisp*/) {
11063 var object = toObject(this),
11064 self = splitString && _toString(this) == "[object String]" ?
11065 this.split("") :
11066 object,
11067 thisp = arguments[1],
11068 i = -1,
11069 length = self.length >>> 0;
11070 if (_toString(fun) != "[object Function]") {
11071 throw new TypeError(); // TODO message
11072 }
11073  
11074 while (++i < length) {
11075 if (i in self) {
11076 fun.call(thisp, self[i], i, object);
11077 }
11078 }
11079 };
11080 }
11081 if (!Array.prototype.map) {
11082 Array.prototype.map = function map(fun /*, thisp*/) {
11083 var object = toObject(this),
11084 self = splitString && _toString(this) == "[object String]" ?
11085 this.split("") :
11086 object,
11087 length = self.length >>> 0,
11088 result = Array(length),
11089 thisp = arguments[1];
11090 if (_toString(fun) != "[object Function]") {
11091 throw new TypeError(fun + " is not a function");
11092 }
11093  
11094 for (var i = 0; i < length; i++) {
11095 if (i in self)
11096 result[i] = fun.call(thisp, self[i], i, object);
11097 }
11098 return result;
11099 };
11100 }
11101 if (!Array.prototype.filter) {
11102 Array.prototype.filter = function filter(fun /*, thisp */) {
11103 var object = toObject(this),
11104 self = splitString && _toString(this) == "[object String]" ?
11105 this.split("") :
11106 object,
11107 length = self.length >>> 0,
11108 result = [],
11109 value,
11110 thisp = arguments[1];
11111 if (_toString(fun) != "[object Function]") {
11112 throw new TypeError(fun + " is not a function");
11113 }
11114  
11115 for (var i = 0; i < length; i++) {
11116 if (i in self) {
11117 value = self[i];
11118 if (fun.call(thisp, value, i, object)) {
11119 result.push(value);
11120 }
11121 }
11122 }
11123 return result;
11124 };
11125 }
11126 if (!Array.prototype.every) {
11127 Array.prototype.every = function every(fun /*, thisp */) {
11128 var object = toObject(this),
11129 self = splitString && _toString(this) == "[object String]" ?
11130 this.split("") :
11131 object,
11132 length = self.length >>> 0,
11133 thisp = arguments[1];
11134 if (_toString(fun) != "[object Function]") {
11135 throw new TypeError(fun + " is not a function");
11136 }
11137  
11138 for (var i = 0; i < length; i++) {
11139 if (i in self && !fun.call(thisp, self[i], i, object)) {
11140 return false;
11141 }
11142 }
11143 return true;
11144 };
11145 }
11146 if (!Array.prototype.some) {
11147 Array.prototype.some = function some(fun /*, thisp */) {
11148 var object = toObject(this),
11149 self = splitString && _toString(this) == "[object String]" ?
11150 this.split("") :
11151 object,
11152 length = self.length >>> 0,
11153 thisp = arguments[1];
11154 if (_toString(fun) != "[object Function]") {
11155 throw new TypeError(fun + " is not a function");
11156 }
11157  
11158 for (var i = 0; i < length; i++) {
11159 if (i in self && fun.call(thisp, self[i], i, object)) {
11160 return true;
11161 }
11162 }
11163 return false;
11164 };
11165 }
11166 if (!Array.prototype.reduce) {
11167 Array.prototype.reduce = function reduce(fun /*, initial*/) {
11168 var object = toObject(this),
11169 self = splitString && _toString(this) == "[object String]" ?
11170 this.split("") :
11171 object,
11172 length = self.length >>> 0;
11173 if (_toString(fun) != "[object Function]") {
11174 throw new TypeError(fun + " is not a function");
11175 }
11176 if (!length && arguments.length == 1) {
11177 throw new TypeError("reduce of empty array with no initial value");
11178 }
11179  
11180 var i = 0;
11181 var result;
11182 if (arguments.length >= 2) {
11183 result = arguments[1];
11184 } else {
11185 do {
11186 if (i in self) {
11187 result = self[i++];
11188 break;
11189 }
11190 if (++i >= length) {
11191 throw new TypeError("reduce of empty array with no initial value");
11192 }
11193 } while (true);
11194 }
11195  
11196 for (; i < length; i++) {
11197 if (i in self) {
11198 result = fun.call(void 0, result, self[i], i, object);
11199 }
11200 }
11201  
11202 return result;
11203 };
11204 }
11205 if (!Array.prototype.reduceRight) {
11206 Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {
11207 var object = toObject(this),
11208 self = splitString && _toString(this) == "[object String]" ?
11209 this.split("") :
11210 object,
11211 length = self.length >>> 0;
11212 if (_toString(fun) != "[object Function]") {
11213 throw new TypeError(fun + " is not a function");
11214 }
11215 if (!length && arguments.length == 1) {
11216 throw new TypeError("reduceRight of empty array with no initial value");
11217 }
11218  
11219 var result, i = length - 1;
11220 if (arguments.length >= 2) {
11221 result = arguments[1];
11222 } else {
11223 do {
11224 if (i in self) {
11225 result = self[i--];
11226 break;
11227 }
11228 if (--i < 0) {
11229 throw new TypeError("reduceRight of empty array with no initial value");
11230 }
11231 } while (true);
11232 }
11233  
11234 do {
11235 if (i in this) {
11236 result = fun.call(void 0, result, self[i], i, object);
11237 }
11238 } while (i--);
11239  
11240 return result;
11241 };
11242 }
11243 if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {
11244 Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {
11245 var self = splitString && _toString(this) == "[object String]" ?
11246 this.split("") :
11247 toObject(this),
11248 length = self.length >>> 0;
11249  
11250 if (!length) {
11251 return -1;
11252 }
11253  
11254 var i = 0;
11255 if (arguments.length > 1) {
11256 i = toInteger(arguments[1]);
11257 }
11258 i = i >= 0 ? i : Math.max(0, length + i);
11259 for (; i < length; i++) {
11260 if (i in self && self[i] === sought) {
11261 return i;
11262 }
11263 }
11264 return -1;
11265 };
11266 }
11267 if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {
11268 Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {
11269 var self = splitString && _toString(this) == "[object String]" ?
11270 this.split("") :
11271 toObject(this),
11272 length = self.length >>> 0;
11273  
11274 if (!length) {
11275 return -1;
11276 }
11277 var i = length - 1;
11278 if (arguments.length > 1) {
11279 i = Math.min(i, toInteger(arguments[1]));
11280 }
11281 i = i >= 0 ? i : length - Math.abs(i);
11282 for (; i >= 0; i--) {
11283 if (i in self && sought === self[i]) {
11284 return i;
11285 }
11286 }
11287 return -1;
11288 };
11289 }
11290 if (!Object.getPrototypeOf) {
11291 Object.getPrototypeOf = function getPrototypeOf(object) {
11292 return object.__proto__ || (
11293 object.constructor ?
11294 object.constructor.prototype :
11295 prototypeOfObject
11296 );
11297 };
11298 }
11299 if (!Object.getOwnPropertyDescriptor) {
11300 var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " +
11301 "non-object: ";
11302 Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {
11303 if ((typeof object != "object" && typeof object != "function") || object === null)
11304 throw new TypeError(ERR_NON_OBJECT + object);
11305 if (!owns(object, property))
11306 return;
11307  
11308 var descriptor, getter, setter;
11309 descriptor = { enumerable: true, configurable: true };
11310 if (supportsAccessors) {
11311 var prototype = object.__proto__;
11312 object.__proto__ = prototypeOfObject;
11313  
11314 var getter = lookupGetter(object, property);
11315 var setter = lookupSetter(object, property);
11316 object.__proto__ = prototype;
11317  
11318 if (getter || setter) {
11319 if (getter) descriptor.get = getter;
11320 if (setter) descriptor.set = setter;
11321 return descriptor;
11322 }
11323 }
11324 descriptor.value = object[property];
11325 return descriptor;
11326 };
11327 }
11328 if (!Object.getOwnPropertyNames) {
11329 Object.getOwnPropertyNames = function getOwnPropertyNames(object) {
11330 return Object.keys(object);
11331 };
11332 }
11333 if (!Object.create) {
11334 var createEmpty;
11335 if (Object.prototype.__proto__ === null) {
11336 createEmpty = function () {
11337 return { "__proto__": null };
11338 };
11339 } else {
11340 createEmpty = function () {
11341 var empty = {};
11342 for (var i in empty)
11343 empty[i] = null;
11344 empty.constructor =
11345 empty.hasOwnProperty =
11346 empty.propertyIsEnumerable =
11347 empty.isPrototypeOf =
11348 empty.toLocaleString =
11349 empty.toString =
11350 empty.valueOf =
11351 empty.__proto__ = null;
11352 return empty;
11353 }
11354 }
11355  
11356 Object.create = function create(prototype, properties) {
11357 var object;
11358 if (prototype === null) {
11359 object = createEmpty();
11360 } else {
11361 if (typeof prototype != "object")
11362 throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'");
11363 var Type = function () {};
11364 Type.prototype = prototype;
11365 object = new Type();
11366 object.__proto__ = prototype;
11367 }
11368 if (properties !== void 0)
11369 Object.defineProperties(object, properties);
11370 return object;
11371 };
11372 }
11373  
11374 function doesDefinePropertyWork(object) {
11375 try {
11376 Object.defineProperty(object, "sentinel", {});
11377 return "sentinel" in object;
11378 } catch (exception) {
11379 }
11380 }
11381 if (Object.defineProperty) {
11382 var definePropertyWorksOnObject = doesDefinePropertyWork({});
11383 var definePropertyWorksOnDom = typeof document == "undefined" ||
11384 doesDefinePropertyWork(document.createElement("div"));
11385 if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {
11386 var definePropertyFallback = Object.defineProperty;
11387 }
11388 }
11389  
11390 if (!Object.defineProperty || definePropertyFallback) {
11391 var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: ";
11392 var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: "
11393 var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " +
11394 "on this javascript engine";
11395  
11396 Object.defineProperty = function defineProperty(object, property, descriptor) {
11397 if ((typeof object != "object" && typeof object != "function") || object === null)
11398 throw new TypeError(ERR_NON_OBJECT_TARGET + object);
11399 if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null)
11400 throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);
11401 if (definePropertyFallback) {
11402 try {
11403 return definePropertyFallback.call(Object, object, property, descriptor);
11404 } catch (exception) {
11405 }
11406 }
11407 if (owns(descriptor, "value")) {
11408  
11409 if (supportsAccessors && (lookupGetter(object, property) ||
11410 lookupSetter(object, property)))
11411 {
11412 var prototype = object.__proto__;
11413 object.__proto__ = prototypeOfObject;
11414 delete object[property];
11415 object[property] = descriptor.value;
11416 object.__proto__ = prototype;
11417 } else {
11418 object[property] = descriptor.value;
11419 }
11420 } else {
11421 if (!supportsAccessors)
11422 throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
11423 if (owns(descriptor, "get"))
11424 defineGetter(object, property, descriptor.get);
11425 if (owns(descriptor, "set"))
11426 defineSetter(object, property, descriptor.set);
11427 }
11428  
11429 return object;
11430 };
11431 }
11432 if (!Object.defineProperties) {
11433 Object.defineProperties = function defineProperties(object, properties) {
11434 for (var property in properties) {
11435 if (owns(properties, property))
11436 Object.defineProperty(object, property, properties[property]);
11437 }
11438 return object;
11439 };
11440 }
11441 if (!Object.seal) {
11442 Object.seal = function seal(object) {
11443 return object;
11444 };
11445 }
11446 if (!Object.freeze) {
11447 Object.freeze = function freeze(object) {
11448 return object;
11449 };
11450 }
11451 try {
11452 Object.freeze(function () {});
11453 } catch (exception) {
11454 Object.freeze = (function freeze(freezeObject) {
11455 return function freeze(object) {
11456 if (typeof object == "function") {
11457 return object;
11458 } else {
11459 return freezeObject(object);
11460 }
11461 };
11462 })(Object.freeze);
11463 }
11464 if (!Object.preventExtensions) {
11465 Object.preventExtensions = function preventExtensions(object) {
11466 return object;
11467 };
11468 }
11469 if (!Object.isSealed) {
11470 Object.isSealed = function isSealed(object) {
11471 return false;
11472 };
11473 }
11474 if (!Object.isFrozen) {
11475 Object.isFrozen = function isFrozen(object) {
11476 return false;
11477 };
11478 }
11479 if (!Object.isExtensible) {
11480 Object.isExtensible = function isExtensible(object) {
11481 if (Object(object) === object) {
11482 throw new TypeError(); // TODO message
11483 }
11484 var name = '';
11485 while (owns(object, name)) {
11486 name += '?';
11487 }
11488 object[name] = true;
11489 var returnValue = owns(object, name);
11490 delete object[name];
11491 return returnValue;
11492 };
11493 }
11494 if (!Object.keys) {
11495 var hasDontEnumBug = true,
11496 dontEnums = [
11497 "toString",
11498 "toLocaleString",
11499 "valueOf",
11500 "hasOwnProperty",
11501 "isPrototypeOf",
11502 "propertyIsEnumerable",
11503 "constructor"
11504 ],
11505 dontEnumsLength = dontEnums.length;
11506  
11507 for (var key in {"toString": null}) {
11508 hasDontEnumBug = false;
11509 }
11510  
11511 Object.keys = function keys(object) {
11512  
11513 if (
11514 (typeof object != "object" && typeof object != "function") ||
11515 object === null
11516 ) {
11517 throw new TypeError("Object.keys called on a non-object");
11518 }
11519  
11520 var keys = [];
11521 for (var name in object) {
11522 if (owns(object, name)) {
11523 keys.push(name);
11524 }
11525 }
11526  
11527 if (hasDontEnumBug) {
11528 for (var i = 0, ii = dontEnumsLength; i < ii; i++) {
11529 var dontEnum = dontEnums[i];
11530 if (owns(object, dontEnum)) {
11531 keys.push(dontEnum);
11532 }
11533 }
11534 }
11535 return keys;
11536 };
11537  
11538 }
11539 if (!Date.now) {
11540 Date.now = function now() {
11541 return new Date().getTime();
11542 };
11543 }
11544 var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
11545 "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
11546 "\u2029\uFEFF";
11547 if (!String.prototype.trim || ws.trim()) {
11548 ws = "[" + ws + "]";
11549 var trimBeginRegexp = new RegExp("^" + ws + ws + "*"),
11550 trimEndRegexp = new RegExp(ws + ws + "*$");
11551 String.prototype.trim = function trim() {
11552 return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
11553 };
11554 }
11555  
11556 function toInteger(n) {
11557 n = +n;
11558 if (n !== n) { // isNaN
11559 n = 0;
11560 } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {
11561 n = (n > 0 || -1) * Math.floor(Math.abs(n));
11562 }
11563 return n;
11564 }
11565  
11566 function isPrimitive(input) {
11567 var type = typeof input;
11568 return (
11569 input === null ||
11570 type === "undefined" ||
11571 type === "boolean" ||
11572 type === "number" ||
11573 type === "string"
11574 );
11575 }
11576  
11577 function toPrimitive(input) {
11578 var val, valueOf, toString;
11579 if (isPrimitive(input)) {
11580 return input;
11581 }
11582 valueOf = input.valueOf;
11583 if (typeof valueOf === "function") {
11584 val = valueOf.call(input);
11585 if (isPrimitive(val)) {
11586 return val;
11587 }
11588 }
11589 toString = input.toString;
11590 if (typeof toString === "function") {
11591 val = toString.call(input);
11592 if (isPrimitive(val)) {
11593 return val;
11594 }
11595 }
11596 throw new TypeError();
11597 }
11598 var toObject = function (o) {
11599 if (o == null) { // this matches both null and undefined
11600 throw new TypeError("can't convert "+o+" to object");
11601 }
11602 return Object(o);
11603 };
11604  
11605 });