blob: ba0b1a089ccd904657379a07ff58c17a036e290b [file] [log] [blame]
Chinthakayala,Sheshashailavas(sc2914)8f6a6c42018-06-27 16:11:44 +00001"no use strict";
2!(function(window) {
3if (typeof window.window != "undefined" && window.document)
4 return;
5if (window.require && window.define)
6 return;
7
8if (!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}
18window.window = window;
19window.ace = window;
20
21window.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
32window.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
52window.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};
82function 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}
100window.require.modules = {};
101window.require.tlns = {};
102
103window.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};
155window.define.amd = {};
156require.tlns = {};
157window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
158 for (var i in topLevelNamespaces)
159 require.tlns[i] = topLevelNamespaces[i];
160};
161
162window.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
194var main = window.main = null;
195var sender = window.sender = null;
196
197window.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
220define("ace/lib/oop",["require","exports","module"], function(require, exports, module) {
221"use strict";
222
223exports.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
235exports.mixin = function(obj, mixin) {
236 for (var key in mixin) {
237 obj[key] = mixin[key];
238 }
239 return obj;
240};
241
242exports.implement = function(proto, mixin) {
243 exports.mixin(proto, mixin);
244};
245
246});
247
248define("ace/lib/lang",["require","exports","module"], function(require, exports, module) {
249"use strict";
250
251exports.last = function(a) {
252 return a[a.length - 1];
253};
254
255exports.stringReverse = function(string) {
256 return string.split("").reverse().join("");
257};
258
259exports.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
271var trimBeginRegexp = /^\s\s*/;
272var trimEndRegexp = /\s\s*$/;
273
274exports.stringTrimLeft = function (string) {
275 return string.replace(trimBeginRegexp, '');
276};
277
278exports.stringTrimRight = function (string) {
279 return string.replace(trimEndRegexp, '');
280};
281
282exports.copyObject = function(obj) {
283 var copy = {};
284 for (var key in obj) {
285 copy[key] = obj[key];
286 }
287 return copy;
288};
289
290exports.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
301exports.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
321exports.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
330exports.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};
337exports.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
345exports.escapeRegExp = function(str) {
346 return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
347};
348
349exports.escapeHTML = function(str) {
350 return str.replace(/&/g, "&#38;").replace(/"/g, "&#34;").replace(/'/g, "&#39;").replace(/</g, "&#60;");
351};
352
353exports.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};
365exports.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
400exports.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
436define("ace/range",["require","exports","module"], function(require, exports, module) {
437"use strict";
438var comparePoints = function(p1, p2) {
439 return p1.row - p2.row || p1.column - p2.column;
440};
441var 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);
662Range.fromPoints = function(start, end) {
663 return new Range(start.row, start.column, end.row, end.column);
664};
665Range.comparePoints = comparePoints;
666
667Range.comparePoints = function(p1, p2) {
668 return p1.row - p2.row || p1.column - p2.column;
669};
670
671
672exports.Range = Range;
673});
674
675define("ace/apply_delta",["require","exports","module"], function(require, exports, module) {
676"use strict";
677
678function throwDeltaError(delta, errorText){
679 console.log("Invalid Delta:", delta);
680 throw "Invalid Delta: " + errorText;
681}
682
683function positionInDocument(docLines, position) {
684 return position.row >= 0 && position.row < docLines.length &&
685 position.column >= 0 && position.column <= docLines[position.row].length;
686}
687
688function 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
707exports.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
740define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
741"use strict";
742
743var EventEmitter = {};
744var stopPropagation = function() { this.propagationStopped = true; };
745var preventDefault = function() { this.defaultPrevented = true; };
746
747EventEmitter._emit =
748EventEmitter._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
779EventEmitter._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
788EventEmitter.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
797EventEmitter.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};
814EventEmitter.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
831EventEmitter.on =
832EventEmitter.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
844EventEmitter.off =
845EventEmitter.removeListener =
846EventEmitter.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
858EventEmitter.removeAllListeners = function(eventName) {
859 if (this._eventRegistry) this._eventRegistry[eventName] = [];
860};
861
862exports.EventEmitter = EventEmitter;
863
864});
865
866define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
867"use strict";
868
869var oop = require("./lib/oop");
870var EventEmitter = require("./lib/event_emitter").EventEmitter;
871
872var 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
991define("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
994var oop = require("./lib/oop");
995var applyDelta = require("./apply_delta").applyDelta;
996var EventEmitter = require("./lib/event_emitter").EventEmitter;
997var Range = require("./range").Range;
998var Anchor = require("./anchor").Anchor;
999
1000var 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
1344exports.Document = Document;
1345});
1346
1347define("ace/worker/mirror",["require","exports","module","ace/range","ace/document","ace/lib/lang"], function(require, exports, module) {
1348"use strict";
1349
1350var Range = require("../range").Range;
1351var Document = require("../document").Document;
1352var lang = require("../lib/lang");
1353
1354var 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
1409define("ace/mode/html/saxparser",["require","exports","module"], function(require, exports, module) {
1410module.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})({
14111:[function(_dereq_,module,exports){
1412function 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
1437function 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
1443function 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
1448function 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
1455function 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
1460function isButtonScopeMarker(node) {
1461 return isScopeMarker(node)
1462 || (node.namespaceURI === "http://www.w3.org/1999/xhtml" && node.localName === 'button');
1463}
1464
1465function 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}
1469function ElementStack() {
1470 this.elements = [];
1471 this.rootNode = null;
1472 this.headElement = null;
1473 this.bodyElement = null;
1474}
1475ElementStack.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};
1484ElementStack.prototype.push = function(item) {
1485 this.elements.push(item);
1486};
1487ElementStack.prototype.pushHtmlElement = function(item) {
1488 this.rootNode = item.node;
1489 this.push(item);
1490};
1491ElementStack.prototype.pushHeadElement = function(item) {
1492 this.headElement = item.node;
1493 this.push(item);
1494};
1495ElementStack.prototype.pushBodyElement = function(item) {
1496 this.bodyElement = item.node;
1497 this.push(item);
1498};
1499ElementStack.prototype.pop = function() {
1500 return this.elements.pop();
1501};
1502ElementStack.prototype.remove = function(item) {
1503 this.elements.splice(this.elements.indexOf(item), 1);
1504};
1505ElementStack.prototype.popUntilPopped = function(localName) {
1506 var element;
1507 do {
1508 element = this.pop();
1509 } while (element.localName != localName);
1510};
1511
1512ElementStack.prototype.popUntilTableScopeMarker = function() {
1513 while (!isTableScopeMarker(this.top))
1514 this.pop();
1515};
1516
1517ElementStack.prototype.popUntilTableBodyScopeMarker = function() {
1518 while (!isTableBodyScopeMarker(this.top))
1519 this.pop();
1520};
1521
1522ElementStack.prototype.popUntilTableRowScopeMarker = function() {
1523 while (!isTableRowScopeMarker(this.top))
1524 this.pop();
1525};
1526ElementStack.prototype.item = function(index) {
1527 return this.elements[index];
1528};
1529ElementStack.prototype.contains = function(element) {
1530 return this.elements.indexOf(element) !== -1;
1531};
1532ElementStack.prototype.inScope = function(localName) {
1533 return this._inScope(localName, isScopeMarker);
1534};
1535ElementStack.prototype.inListItemScope = function(localName) {
1536 return this._inScope(localName, isListItemScopeMarker);
1537};
1538ElementStack.prototype.inTableScope = function(localName) {
1539 return this._inScope(localName, isTableScopeMarker);
1540};
1541ElementStack.prototype.inButtonScope = function(localName) {
1542 return this._inScope(localName, isButtonScopeMarker);
1543};
1544ElementStack.prototype.inSelectScope = function(localName) {
1545 return this._inScope(localName, isSelectScopeMarker);
1546};
1547ElementStack.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};
1556ElementStack.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};
1567ElementStack.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
1575ElementStack.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
1585Object.defineProperty(ElementStack.prototype, 'top', {
1586 get: function() {
1587 return this.elements[this.elements.length - 1];
1588 }
1589});
1590
1591Object.defineProperty(ElementStack.prototype, 'length', {
1592 get: function() {
1593 return this.elements.length;
1594 }
1595});
1596
1597exports.ElementStack = ElementStack;
1598
1599},
1600{}],
16012:[function(_dereq_,module,exports){
1602var entities = _dereq_('html5-entities');
1603var InputStream = _dereq_('./InputStream').InputStream;
1604
1605var namedEntityPrefixes = {};
1606Object.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
1612function isAlphaNumeric(c) {
1613 return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
1614}
1615
1616function isHexDigit(c) {
1617 return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
1618}
1619
1620function isDecimalDigit(c) {
1621 return (c >= '0' && c <= '9');
1622}
1623
1624var EntityParser = {};
1625
1626EntityParser.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
1724EntityParser.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
1779exports.EntityParser = EntityParser;
1780
1781},
1782{"./InputStream":3,"html5-entities":12}],
17833:[function(_dereq_,module,exports){
1784function 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
1792InputStream.EOF = -1;
1793
1794InputStream.DRAIN = -2;
1795
1796InputStream.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
1892exports.InputStream = InputStream;
1893
1894},
1895{}],
18964:[function(_dereq_,module,exports){
1897var 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
1998function StackItem(namespaceURI, localName, attributes, node) {
1999 this.localName = localName;
2000 this.namespaceURI = namespaceURI;
2001 this.attributes = attributes;
2002 this.node = node;
2003}
2004StackItem.prototype.isSpecial = function() {
2005 return this.namespaceURI in SpecialElements &&
2006 SpecialElements[this.namespaceURI].indexOf(this.localName) > -1;
2007};
2008
2009StackItem.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
2020StackItem.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
2032StackItem.prototype.isForeign = function() {
2033 return this.namespaceURI != "http://www.w3.org/1999/xhtml";
2034};
2035
2036function 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
2044StackItem.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
2062StackItem.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
2073exports.StackItem = StackItem;
2074
2075},
2076{}],
20775:[function(_dereq_,module,exports){
2078var InputStream = _dereq_('./InputStream').InputStream;
2079var EntityParser = _dereq_('./EntityParser').EntityParser;
2080
2081function isWhitespace(c){
2082 return c === " " || c === "\n" || c === "\t" || c === "\r" || c === "\f";
2083}
2084
2085function isAlpha(c) {
2086 return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
2087}
2088function 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
2097Tokenizer.prototype._parseError = function(code, args) {
2098 this._tokenHandler.parseError(code, args);
2099};
2100
2101Tokenizer.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
2121Tokenizer.prototype._emitCurrentToken = function() {
2122 this._state = Tokenizer.DATA;
2123 this._emitToken(this._currentToken);
2124};
2125
2126Tokenizer.prototype._currentAttribute = function() {
2127 return this._currentToken.data[this._currentToken.data.length - 1];
2128};
2129
2130Tokenizer.prototype.setState = function(state) {
2131 this._state = state;
2132};
2133
2134Tokenizer.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
3589Object.defineProperty(Tokenizer.prototype, 'lineNumber', {
3590 get: function() {
3591 return this._inputStream.location().line;
3592 }
3593});
3594
3595Object.defineProperty(Tokenizer.prototype, 'columnNumber', {
3596 get: function() {
3597 return this._inputStream.location().column;
3598 }
3599});
3600
3601exports.Tokenizer = Tokenizer;
3602
3603},
3604{"./EntityParser":2,"./InputStream":3}],
36056:[function(_dereq_,module,exports){
3606var assert = _dereq_('assert');
3607
3608var messages = _dereq_('./messages.json');
3609var constants = _dereq_('./constants');
3610
3611var EventEmitter = _dereq_('events').EventEmitter;
3612
3613var Tokenizer = _dereq_('./Tokenizer').Tokenizer;
3614var ElementStack = _dereq_('./ElementStack').ElementStack;
3615var StackItem = _dereq_('./StackItem').StackItem;
3616
3617var Marker = {};
3618
3619function isWhitespace(ch) {
3620 return ch === " " || ch === "\n" || ch === "\t" || ch === "\r" || ch === "\f";
3621}
3622
3623function isWhitespaceOrReplacementCharacter(ch) {
3624 return isWhitespace(ch) || ch === '\uFFFD';
3625}
3626
3627function 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
3636function 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
3645function 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
3655function CharacterBuffer(characters) {
3656 this.characters = characters;
3657 this.current = 0;
3658 this.end = this.characters.length;
3659}
3660
3661CharacterBuffer.prototype.skipAtMostOneLeadingNewline = function() {
3662 if (this.characters[this.current] === '\n')
3663 this.current++;
3664};
3665
3666CharacterBuffer.prototype.skipLeadingWhitespace = function() {
3667 while (isWhitespace(this.characters[this.current])) {
3668 if (++this.current == this.end)
3669 return;
3670 }
3671};
3672
3673CharacterBuffer.prototype.skipLeadingNonWhitespace = function() {
3674 while (!isWhitespace(this.characters[this.current])) {
3675 if (++this.current == this.end)
3676 return;
3677 }
3678};
3679
3680CharacterBuffer.prototype.takeRemaining = function() {
3681 return this.characters.substring(this.current);
3682};
3683
3684CharacterBuffer.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
3692Object.defineProperty(CharacterBuffer.prototype, 'length', {
3693 get: function(){
3694 return this.end - this.current;
3695 }
3696});
3697function 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
6005TreeBuilder.prototype.setInsertionMode = function(name) {
6006 this.insertionMode = this.insertionModes[name];
6007 this.insertionModeName = name;
6008};
6009TreeBuilder.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
6105TreeBuilder.prototype.start = function() {
6106 throw "Not mplemented";
6107};
6108
6109TreeBuilder.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
6148TreeBuilder.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};
6194TreeBuilder.prototype.isCdataSectionAllowed = function() {
6195 return this.openElements.length > 0 && this.currentStackItem().isForeign();
6196};
6197TreeBuilder.prototype.isSelfClosingFlagAcknowledged = function() {
6198 return this.selfClosingFlagAcknowledged;
6199};
6200
6201TreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {
6202 throw new Error("Not implemented");
6203};
6204
6205TreeBuilder.prototype.attachNode = function(child, parent) {
6206 throw new Error("Not implemented");
6207};
6208
6209TreeBuilder.prototype.attachNodeToFosterParent = function(child, table, stackParent) {
6210 throw new Error("Not implemented");
6211};
6212
6213TreeBuilder.prototype.detachFromParent = function(node) {
6214 throw new Error("Not implemented");
6215};
6216
6217TreeBuilder.prototype.addAttributesToElement = function(element, attributes) {
6218 throw new Error("Not implemented");
6219};
6220
6221TreeBuilder.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
6228TreeBuilder.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
6236TreeBuilder.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
6243TreeBuilder.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
6251TreeBuilder.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
6263TreeBuilder.prototype.insertFormattingElement = function(name, attributes) {
6264 this.insertElement(name, attributes, "http://www.w3.org/1999/xhtml");
6265 this.appendElementToActiveFormattingElements(this.currentStackItem());
6266};
6267
6268TreeBuilder.prototype.insertSelfClosingElement = function(name, attributes) {
6269 this.selfClosingFlagAcknowledged = true;
6270 this.insertElement(name, attributes, "http://www.w3.org/1999/xhtml", true);
6271};
6272
6273TreeBuilder.prototype.insertForeignElement = function(name, attributes, namespaceURI, selfClosing) {
6274 if (selfClosing)
6275 this.selfClosingFlagAcknowledged = true;
6276 this.insertElement(name, attributes, namespaceURI, selfClosing);
6277};
6278
6279TreeBuilder.prototype.insertComment = function(data, parent) {
6280 throw new Error("Not implemented");
6281};
6282
6283TreeBuilder.prototype.insertDoctype = function(name, publicId, systemId) {
6284 throw new Error("Not implemented");
6285};
6286
6287TreeBuilder.prototype.insertText = function(data) {
6288 throw new Error("Not implemented");
6289};
6290TreeBuilder.prototype.currentStackItem = function() {
6291 return this.openElements.top;
6292};
6293TreeBuilder.prototype.popElement = function() {
6294 return this.openElements.pop();
6295};
6296TreeBuilder.prototype.shouldFosterParent = function() {
6297 return this.redirectAttachToFosterParent && this.currentStackItem().isFosterParenting();
6298};
6299TreeBuilder.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};
6306TreeBuilder.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};
6332TreeBuilder.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};
6370TreeBuilder.prototype.appendElementToActiveFormattingElements = function(item) {
6371 this.ensureNoahsArkCondition(item);
6372 this.activeFormattingElements.push(item);
6373};
6374TreeBuilder.prototype.removeElementFromActiveFormattingElements = function(item) {
6375 var index = this.activeFormattingElements.indexOf(item);
6376 if (index >= 0)
6377 this.activeFormattingElements.splice(index, 1);
6378};
6379
6380TreeBuilder.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
6389TreeBuilder.prototype.clearActiveFormattingElements = function() {
6390 while (!(this.activeFormattingElements.length === 0 || this.activeFormattingElements.pop() == Marker));
6391};
6392
6393TreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {
6394 throw new Error("Not implemented");
6395};
6396TreeBuilder.prototype.setFragmentContext = function(context) {
6397 this.context = context;
6398};
6399TreeBuilder.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};
6405TreeBuilder.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
6449TreeBuilder.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
6456TreeBuilder.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
6463TreeBuilder.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
6472TreeBuilder.prototype.adjustSVGTagNameCase = function(name) {
6473 return constants.SVGTagMap[name] || name;
6474};
6475
6476TreeBuilder.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
6485TreeBuilder.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
6498function 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
6504exports.TreeBuilder = TreeBuilder;
6505
6506},
6507{"./ElementStack":1,"./StackItem":4,"./Tokenizer":5,"./constants":7,"./messages.json":8,"assert":13,"events":16}],
65087:[function(_dereq_,module,exports){
6509exports.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
6548exports.MATHMLAttributeMap = {
6549 definitionurl: 'definitionURL'
6550};
6551
6552exports.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
6617exports.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{}],
66338:[function(_dereq_,module,exports){
6634module.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{}],
68949:[function(_dereq_,module,exports){
6895var SAXTreeBuilder = _dereq_('./SAXTreeBuilder').SAXTreeBuilder;
6896var Tokenizer = _dereq_('../Tokenizer').Tokenizer;
6897var TreeParser = _dereq_('./TreeParser').TreeParser;
6898
6899function 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
6907SAXParser.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
6915SAXParser.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
6924Object.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
6934Object.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
6944exports.SAXParser = SAXParser;
6945
6946},
6947{"../Tokenizer":5,"./SAXTreeBuilder":10,"./TreeParser":11}],
694810:[function(_dereq_,module,exports){
6949var util = _dereq_('util');
6950var TreeBuilder = _dereq_('../TreeBuilder').TreeBuilder;
6951
6952function SAXTreeBuilder() {
6953 TreeBuilder.call(this);
6954}
6955
6956util.inherits(SAXTreeBuilder, TreeBuilder);
6957
6958SAXTreeBuilder.prototype.start = function(tokenizer) {
6959 this.document = new Document(this.tokenizer);
6960};
6961
6962SAXTreeBuilder.prototype.end = function() {
6963 this.document.endLocator = this.tokenizer;
6964};
6965
6966SAXTreeBuilder.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
6972SAXTreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {
6973 var element = new Element(this.tokenizer, namespaceURI, localName, localName, attributes || []);
6974 return element;
6975};
6976
6977SAXTreeBuilder.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
6984SAXTreeBuilder.prototype.appendCharacters = function(parent, data) {
6985 var text = new Characters(this.tokenizer, data);
6986 parent.appendChild(text);
6987};
6988
6989SAXTreeBuilder.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
7010SAXTreeBuilder.prototype.attachNode = function(node, parent) {
7011 parent.appendChild(node);
7012};
7013
7014SAXTreeBuilder.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
7022SAXTreeBuilder.prototype.detachFromParent = function(element) {
7023 element.detach();
7024};
7025
7026SAXTreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {
7027 newParent.appendChildren(oldParent.firstChild);
7028};
7029
7030SAXTreeBuilder.prototype.getFragment = function() {
7031 var fragment = new DocumentFragment();
7032 this.reparentChildren(this.openElements.rootNode, fragment);
7033 return fragment;
7034};
7035
7036function 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
7044SAXTreeBuilder.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
7052var 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};
7065function 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}
7077Node.prototype.visit = function(treeParser) {
7078 throw new Error("Not Implemented");
7079};
7080Node.prototype.revisit = function(treeParser) {
7081 return;
7082};
7083Node.prototype.detach = function() {
7084 if (this.parentNode !== null) {
7085 this.parentNode.removeChild(this);
7086 this.parentNode = null;
7087 }
7088};
7089
7090Object.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
7105function ParentNode(locator) {
7106 Node.call(this, locator);
7107 this.lastChild = null;
7108 this._endLocator = null;
7109}
7110
7111ParentNode.prototype = Object.create(Node.prototype);
7112ParentNode.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
7134ParentNode.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};
7148ParentNode.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};
7159ParentNode.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};
7177ParentNode.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
7199Object.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});
7210function Document (locator) {
7211 ParentNode.call(this, locator);
7212 this.nodeType = NodeType.DOCUMENT;
7213}
7214
7215Document.prototype = Object.create(ParentNode.prototype);
7216Document.prototype.visit = function(treeParser) {
7217 treeParser.startDocument(this);
7218};
7219Document.prototype.revisit = function(treeParser) {
7220 treeParser.endDocument(this.endLocator);
7221};
7222function DocumentFragment() {
7223 ParentNode.call(this, new Locator());
7224 this.nodeType = NodeType.DOCUMENT_FRAGMENT;
7225}
7226
7227DocumentFragment.prototype = Object.create(ParentNode.prototype);
7228DocumentFragment.prototype.visit = function(treeParser) {
7229};
7230function 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
7240Element.prototype = Object.create(ParentNode.prototype);
7241Element.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};
7251Element.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};
7260function Characters(locator, data){
7261 Node.call(this, locator);
7262 this.data = data;
7263 this.nodeType = NodeType.CHARACTERS;
7264}
7265
7266Characters.prototype = Object.create(Node.prototype);
7267Characters.prototype.visit = function (treeParser) {
7268 treeParser.characters(this.data, 0, this.data.length, this);
7269};
7270function IgnorableWhitespace(locator, data) {
7271 Node.call(this, locator);
7272 this.data = data;
7273 this.nodeType = NodeType.IGNORABLE_WHITESPACE;
7274}
7275
7276IgnorableWhitespace.prototype = Object.create(Node.prototype);
7277IgnorableWhitespace.prototype.visit = function(treeParser) {
7278 treeParser.ignorableWhitespace(this.data, 0, this.data.length, this);
7279};
7280function Comment(locator, data) {
7281 Node.call(this, locator);
7282 this.data = data;
7283 this.nodeType = NodeType.COMMENT;
7284}
7285
7286Comment.prototype = Object.create(Node.prototype);
7287Comment.prototype.visit = function(treeParser) {
7288 treeParser.comment(this.data, 0, this.data.length, this);
7289};
7290function CDATA(locator) {
7291 ParentNode.call(this, locator);
7292 this.nodeType = NodeType.CDATA;
7293}
7294
7295CDATA.prototype = Object.create(ParentNode.prototype);
7296CDATA.prototype.visit = function(treeParser) {
7297 treeParser.startCDATA(this);
7298};
7299CDATA.prototype.revisit = function(treeParser) {
7300 treeParser.endCDATA(this.endLocator);
7301};
7302function Entity(name) {
7303 ParentNode.call(this);
7304 this.name = name;
7305 this.nodeType = NodeType.ENTITY;
7306}
7307
7308Entity.prototype = Object.create(ParentNode.prototype);
7309Entity.prototype.visit = function(treeParser) {
7310 treeParser.startEntity(this.name, this);
7311};
7312Entity.prototype.revisit = function(treeParser) {
7313 treeParser.endEntity(this.name);
7314};
7315
7316function SkippedEntity(name) {
7317 Node.call(this);
7318 this.name = name;
7319 this.nodeType = NodeType.SKIPPED_ENTITY;
7320}
7321
7322SkippedEntity.prototype = Object.create(Node.prototype);
7323SkippedEntity.prototype.visit = function(treeParser) {
7324 treeParser.skippedEntity(this.name, this);
7325};
7326function ProcessingInstruction(target, data) {
7327 Node.call(this);
7328 this.target = target;
7329 this.data = data;
7330}
7331
7332ProcessingInstruction.prototype = Object.create(Node.prototype);
7333ProcessingInstruction.prototype.visit = function(treeParser) {
7334 treeParser.processingInstruction(this.target, this.data, this);
7335};
7336ProcessingInstruction.prototype.getNodeType = function() {
7337 return NodeType.PROCESSING_INSTRUCTION;
7338};
7339function 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
7347DTD.prototype = Object.create(ParentNode.prototype);
7348DTD.prototype.visit = function(treeParser) {
7349 treeParser.startDTD(this.name, this.publicIdentifier, this.systemIdentifier, this);
7350};
7351DTD.prototype.revisit = function(treeParser) {
7352 treeParser.endDTD();
7353};
7354
7355exports.SAXTreeBuilder = SAXTreeBuilder;
7356
7357},
7358{"../TreeBuilder":6,"util":20}],
735911:[function(_dereq_,module,exports){
7360function 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}
7375TreeParser.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};
7398TreeParser.prototype.characters = function(ch, start, length, locator) {
7399 this.locatorDelegate = locator;
7400 this.contentHandler.characters(ch, start, length);
7401};
7402TreeParser.prototype.endDocument = function(locator) {
7403 this.locatorDelegate = locator;
7404 this.contentHandler.endDocument();
7405};
7406TreeParser.prototype.endElement = function(uri, localName, qName, locator) {
7407 this.locatorDelegate = locator;
7408 this.contentHandler.endElement(uri, localName, qName);
7409};
7410TreeParser.prototype.endPrefixMapping = function(prefix, locator) {
7411 this.locatorDelegate = locator;
7412 this.contentHandler.endPrefixMapping(prefix);
7413};
7414TreeParser.prototype.ignorableWhitespace = function(ch, start, length, locator) {
7415 this.locatorDelegate = locator;
7416 this.contentHandler.ignorableWhitespace(ch, start, length);
7417};
7418TreeParser.prototype.processingInstruction = function(target, data, locator) {
7419 this.locatorDelegate = locator;
7420 this.contentHandler.processingInstruction(target, data);
7421};
7422TreeParser.prototype.skippedEntity = function(name, locator) {
7423 this.locatorDelegate = locator;
7424 this.contentHandler.skippedEntity(name);
7425};
7426TreeParser.prototype.startDocument = function(locator) {
7427 this.locatorDelegate = locator;
7428 this.contentHandler.startDocument();
7429};
7430TreeParser.prototype.startElement = function(uri, localName, qName, atts, locator) {
7431 this.locatorDelegate = locator;
7432 this.contentHandler.startElement(uri, localName, qName, atts);
7433};
7434TreeParser.prototype.startPrefixMapping = function(prefix, uri, locator) {
7435 this.locatorDelegate = locator;
7436 this.contentHandler.startPrefixMapping(prefix, uri);
7437};
7438TreeParser.prototype.comment = function(ch, start, length, locator) {
7439 this.locatorDelegate = locator;
7440 this.lexicalHandler.comment(ch, start, length);
7441};
7442TreeParser.prototype.endCDATA = function(locator) {
7443 this.locatorDelegate = locator;
7444 this.lexicalHandler.endCDATA();
7445};
7446TreeParser.prototype.endDTD = function(locator) {
7447 this.locatorDelegate = locator;
7448 this.lexicalHandler.endDTD();
7449};
7450TreeParser.prototype.endEntity = function(name, locator) {
7451 this.locatorDelegate = locator;
7452 this.lexicalHandler.endEntity(name);
7453};
7454TreeParser.prototype.startCDATA = function(locator) {
7455 this.locatorDelegate = locator;
7456 this.lexicalHandler.startCDATA();
7457};
7458TreeParser.prototype.startDTD = function(name, publicId, systemId, locator) {
7459 this.locatorDelegate = locator;
7460 this.lexicalHandler.startDTD(name, publicId, systemId);
7461};
7462TreeParser.prototype.startEntity = function(name, locator) {
7463 this.locatorDelegate = locator;
7464 this.lexicalHandler.startEntity(name);
7465};
7466
7467Object.defineProperty(TreeParser.prototype, 'columnNumber', {
7468 get: function() {
7469 if (!this.locatorDelegate)
7470 return -1;
7471 else
7472 return this.locatorDelegate.columnNumber;
7473 }
7474});
7475
7476Object.defineProperty(TreeParser.prototype, 'lineNumber', {
7477 get: function() {
7478 if (!this.locatorDelegate)
7479 return -1;
7480 else
7481 return this.locatorDelegate.lineNumber;
7482 }
7483});
7484function NullLexicalHandler() {
7485
7486}
7487
7488NullLexicalHandler.prototype.comment = function() {};
7489NullLexicalHandler.prototype.endCDATA = function() {};
7490NullLexicalHandler.prototype.endDTD = function() {};
7491NullLexicalHandler.prototype.endEntity = function() {};
7492NullLexicalHandler.prototype.startCDATA = function() {};
7493NullLexicalHandler.prototype.startDTD = function() {};
7494NullLexicalHandler.prototype.startEntity = function() {};
7495
7496exports.TreeParser = TreeParser;
7497
7498},
7499{}],
750012:[function(_dereq_,module,exports){
7501module.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{}],
973713:[function(_dereq_,module,exports){
9738var util = _dereq_('util/');
9739
9740var pSlice = Array.prototype.slice;
9741var hasOwn = Object.prototype.hasOwnProperty;
9742
9743var assert = module.exports = ok;
9744
9745assert.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};
9777util.inherits(assert.AssertionError, Error);
9778
9779function 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
9792function 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
9800function getMessage(self) {
9801 return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
9802 self.operator + ' ' +
9803 truncate(JSON.stringify(self.expected, replacer), 128);
9804}
9805
9806function 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}
9815assert.fail = fail;
9816
9817function ok(value, message) {
9818 if (!value) fail(value, true, message, '==', assert.ok);
9819}
9820assert.ok = ok;
9821
9822assert.equal = function equal(actual, expected, message) {
9823 if (actual != expected) fail(actual, expected, message, '==', assert.equal);
9824};
9825
9826assert.notEqual = function notEqual(actual, expected, message) {
9827 if (actual == expected) {
9828 fail(actual, expected, message, '!=', assert.notEqual);
9829 }
9830};
9831
9832assert.deepEqual = function deepEqual(actual, expected, message) {
9833 if (!_deepEqual(actual, expected)) {
9834 fail(actual, expected, message, 'deepEqual', assert.deepEqual);
9835 }
9836};
9837
9838function _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
9865function isArguments(object) {
9866 return Object.prototype.toString.call(object) == '[object Arguments]';
9867}
9868
9869function 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
9903assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
9904 if (_deepEqual(actual, expected)) {
9905 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
9906 }
9907};
9908
9909assert.strictEqual = function strictEqual(actual, expected, message) {
9910 if (actual !== expected) {
9911 fail(actual, expected, message, '===', assert.strictEqual);
9912 }
9913};
9914
9915assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
9916 if (actual === expected) {
9917 fail(actual, expected, message, '!==', assert.notStrictEqual);
9918 }
9919};
9920
9921function 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
9937function _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
9968assert.throws = function(block, /*optional*/error, /*optional*/message) {
9969 _throws.apply(this, [true].concat(pSlice.call(arguments)));
9970};
9971assert.doesNotThrow = function(block, /*optional*/message) {
9972 _throws.apply(this, [false].concat(pSlice.call(arguments)));
9973};
9974
9975assert.ifError = function(err) { if (err) {throw err;}};
9976
9977var 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}],
998714:[function(_dereq_,module,exports){
9988module.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{}],
999615:[function(_dereq_,module,exports){
9997(function (process,global){
9998
9999var formatRegExp = /%[sdj%]/g;
10000exports.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};
10037exports.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
10067var debugs = {};
10068var debugEnviron;
10069exports.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};
10086function 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}
10105exports.inspect = inspect;
10106inspect.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};
10121inspect.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
10133function 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
10145function stylizeNoColor(str, styleType) {
10146 return str;
10147}
10148
10149
10150function arrayToHash(array) {
10151 var hash = {};
10152
10153 array.forEach(function(val, idx) {
10154 hash[val] = true;
10155 });
10156
10157 return hash;
10158}
10159
10160
10161function 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
10251function 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
10269function formatError(value) {
10270 return '[' + Error.prototype.toString.call(value) + ']';
10271}
10272
10273
10274function 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
10294function 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
10353function 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}
10372function isArray(ar) {
10373 return Array.isArray(ar);
10374}
10375exports.isArray = isArray;
10376
10377function isBoolean(arg) {
10378 return typeof arg === 'boolean';
10379}
10380exports.isBoolean = isBoolean;
10381
10382function isNull(arg) {
10383 return arg === null;
10384}
10385exports.isNull = isNull;
10386
10387function isNullOrUndefined(arg) {
10388 return arg == null;
10389}
10390exports.isNullOrUndefined = isNullOrUndefined;
10391
10392function isNumber(arg) {
10393 return typeof arg === 'number';
10394}
10395exports.isNumber = isNumber;
10396
10397function isString(arg) {
10398 return typeof arg === 'string';
10399}
10400exports.isString = isString;
10401
10402function isSymbol(arg) {
10403 return typeof arg === 'symbol';
10404}
10405exports.isSymbol = isSymbol;
10406
10407function isUndefined(arg) {
10408 return arg === void 0;
10409}
10410exports.isUndefined = isUndefined;
10411
10412function isRegExp(re) {
10413 return isObject(re) && objectToString(re) === '[object RegExp]';
10414}
10415exports.isRegExp = isRegExp;
10416
10417function isObject(arg) {
10418 return typeof arg === 'object' && arg !== null;
10419}
10420exports.isObject = isObject;
10421
10422function isDate(d) {
10423 return isObject(d) && objectToString(d) === '[object Date]';
10424}
10425exports.isDate = isDate;
10426
10427function isError(e) {
10428 return isObject(e) &&
10429 (objectToString(e) === '[object Error]' || e instanceof Error);
10430}
10431exports.isError = isError;
10432
10433function isFunction(arg) {
10434 return typeof arg === 'function';
10435}
10436exports.isFunction = isFunction;
10437
10438function 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}
10446exports.isPrimitive = isPrimitive;
10447
10448exports.isBuffer = _dereq_('./support/isBuffer');
10449
10450function objectToString(o) {
10451 return Object.prototype.toString.call(o);
10452}
10453
10454
10455function pad(n) {
10456 return n < 10 ? '0' + n.toString(10) : n.toString(10);
10457}
10458
10459
10460var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
10461 'Oct', 'Nov', 'Dec'];
10462function 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}
10469exports.log = function() {
10470 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
10471};
10472exports.inherits = _dereq_('inherits');
10473
10474exports._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
10485function 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}],
1049216:[function(_dereq_,module,exports){
10493
10494function EventEmitter() {
10495 this._events = this._events || {};
10496 this._maxListeners = this._maxListeners || undefined;
10497}
10498module.exports = EventEmitter;
10499EventEmitter.EventEmitter = EventEmitter;
10500
10501EventEmitter.prototype._events = undefined;
10502EventEmitter.prototype._maxListeners = undefined;
10503EventEmitter.defaultMaxListeners = 10;
10504EventEmitter.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
10511EventEmitter.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
10567EventEmitter.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
10607EventEmitter.prototype.on = EventEmitter.prototype.addListener;
10608
10609EventEmitter.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};
10629EventEmitter.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
10674EventEmitter.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
10709EventEmitter.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
10720EventEmitter.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
10731function isFunction(arg) {
10732 return typeof arg === 'function';
10733}
10734
10735function isNumber(arg) {
10736 return typeof arg === 'number';
10737}
10738
10739function isObject(arg) {
10740 return typeof arg === 'object' && arg !== null;
10741}
10742
10743function isUndefined(arg) {
10744 return arg === void 0;
10745}
10746
10747},
10748{}],
1074917:[function(_dereq_,module,exports){
10750if (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{}],
1077418:[function(_dereq_,module,exports){
10775
10776var process = module.exports = {};
10777
10778process.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
10813process.title = 'browser';
10814process.browser = true;
10815process.env = {};
10816process.argv = [];
10817
10818function noop() {}
10819
10820process.on = noop;
10821process.once = noop;
10822process.off = noop;
10823process.emit = noop;
10824
10825process.binding = function (name) {
10826 throw new Error('process.binding is not supported');
10827}
10828process.cwd = function () { return '/' };
10829process.chdir = function (dir) {
10830 throw new Error('process.chdir is not supported');
10831};
10832
10833},
10834{}],
1083519:[function(_dereq_,module,exports){
10836module.exports=_dereq_(14)
10837},
10838{}],
1083920:[function(_dereq_,module,exports){
10840module.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
10847define("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
10850var oop = require("../lib/oop");
10851var lang = require("../lib/lang");
10852var Mirror = require("../worker/mirror").Mirror;
10853var SAXParser = require("./html/saxparser").SAXParser;
10854
10855var errorTypes = {
10856 "expected-doctype-but-got-start-tag": "info",
10857 "expected-doctype-but-got-chars": "info",
10858 "non-html-root": "info"
10859};
10860
10861var Worker = exports.Worker = function(sender) {
10862 Mirror.call(this, sender);
10863 this.setTimeout(400);
10864 this.context = null;
10865};
10866
10867oop.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
10910define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) {
10911
10912function Empty() {}
10913
10914if (!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}
10951var call = Function.prototype.call;
10952var prototypeOfArray = Array.prototype;
10953var prototypeOfObject = Object.prototype;
10954var slice = prototypeOfArray.slice;
10955var _toString = call.bind(prototypeOfObject.toString);
10956var owns = call.bind(prototypeOfObject.hasOwnProperty);
10957var defineGetter;
10958var defineSetter;
10959var lookupGetter;
10960var lookupSetter;
10961var supportsAccessors;
10962if ((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}
10968if ([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}
11053if (!Array.isArray) {
11054 Array.isArray = function isArray(obj) {
11055 return _toString(obj) == "[object Array]";
11056 };
11057}
11058var boxedString = Object("a"),
11059 splitString = boxedString[0] != "a" || !(0 in boxedString);
11060
11061if (!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}
11081if (!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}
11101if (!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}
11126if (!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}
11146if (!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}
11166if (!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}
11205if (!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}
11243if (!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}
11267if (!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}
11290if (!Object.getPrototypeOf) {
11291 Object.getPrototypeOf = function getPrototypeOf(object) {
11292 return object.__proto__ || (
11293 object.constructor ?
11294 object.constructor.prototype :
11295 prototypeOfObject
11296 );
11297 };
11298}
11299if (!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}
11328if (!Object.getOwnPropertyNames) {
11329 Object.getOwnPropertyNames = function getOwnPropertyNames(object) {
11330 return Object.keys(object);
11331 };
11332}
11333if (!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
11374function doesDefinePropertyWork(object) {
11375 try {
11376 Object.defineProperty(object, "sentinel", {});
11377 return "sentinel" in object;
11378 } catch (exception) {
11379 }
11380}
11381if (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
11390if (!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}
11432if (!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}
11441if (!Object.seal) {
11442 Object.seal = function seal(object) {
11443 return object;
11444 };
11445}
11446if (!Object.freeze) {
11447 Object.freeze = function freeze(object) {
11448 return object;
11449 };
11450}
11451try {
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}
11464if (!Object.preventExtensions) {
11465 Object.preventExtensions = function preventExtensions(object) {
11466 return object;
11467 };
11468}
11469if (!Object.isSealed) {
11470 Object.isSealed = function isSealed(object) {
11471 return false;
11472 };
11473}
11474if (!Object.isFrozen) {
11475 Object.isFrozen = function isFrozen(object) {
11476 return false;
11477 };
11478}
11479if (!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}
11494if (!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}
11539if (!Date.now) {
11540 Date.now = function now() {
11541 return new Date().getTime();
11542 };
11543}
11544var 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";
11547if (!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
11556function 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
11566function 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
11577function 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}
11598var 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});