• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1(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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.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})({1:[function(require,module,exports){
2'use strict';
3
4//Const
5var VALID_DOCTYPE_NAME = 'html',
6    QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd',
7    QUIRKS_MODE_PUBLIC_ID_PREFIXES = [
8        "+//silmaril//dtd html pro v0r11 19970101//en",
9        "-//advasoft ltd//dtd html 3.0 aswedit + extensions//en",
10        "-//as//dtd html 3.0 aswedit + extensions//en",
11        "-//ietf//dtd html 2.0 level 1//en",
12        "-//ietf//dtd html 2.0 level 2//en",
13        "-//ietf//dtd html 2.0 strict level 1//en",
14        "-//ietf//dtd html 2.0 strict level 2//en",
15        "-//ietf//dtd html 2.0 strict//en",
16        "-//ietf//dtd html 2.0//en",
17        "-//ietf//dtd html 2.1e//en",
18        "-//ietf//dtd html 3.0//en",
19        "-//ietf//dtd html 3.0//en//",
20        "-//ietf//dtd html 3.2 final//en",
21        "-//ietf//dtd html 3.2//en",
22        "-//ietf//dtd html 3//en",
23        "-//ietf//dtd html level 0//en",
24        "-//ietf//dtd html level 0//en//2.0",
25        "-//ietf//dtd html level 1//en",
26        "-//ietf//dtd html level 1//en//2.0",
27        "-//ietf//dtd html level 2//en",
28        "-//ietf//dtd html level 2//en//2.0",
29        "-//ietf//dtd html level 3//en",
30        "-//ietf//dtd html level 3//en//3.0",
31        "-//ietf//dtd html strict level 0//en",
32        "-//ietf//dtd html strict level 0//en//2.0",
33        "-//ietf//dtd html strict level 1//en",
34        "-//ietf//dtd html strict level 1//en//2.0",
35        "-//ietf//dtd html strict level 2//en",
36        "-//ietf//dtd html strict level 2//en//2.0",
37        "-//ietf//dtd html strict level 3//en",
38        "-//ietf//dtd html strict level 3//en//3.0",
39        "-//ietf//dtd html strict//en",
40        "-//ietf//dtd html strict//en//2.0",
41        "-//ietf//dtd html strict//en//3.0",
42        "-//ietf//dtd html//en",
43        "-//ietf//dtd html//en//2.0",
44        "-//ietf//dtd html//en//3.0",
45        "-//metrius//dtd metrius presentational//en",
46        "-//microsoft//dtd internet explorer 2.0 html strict//en",
47        "-//microsoft//dtd internet explorer 2.0 html//en",
48        "-//microsoft//dtd internet explorer 2.0 tables//en",
49        "-//microsoft//dtd internet explorer 3.0 html strict//en",
50        "-//microsoft//dtd internet explorer 3.0 html//en",
51        "-//microsoft//dtd internet explorer 3.0 tables//en",
52        "-//netscape comm. corp.//dtd html//en",
53        "-//netscape comm. corp.//dtd strict html//en",
54        "-//o'reilly and associates//dtd html 2.0//en",
55        "-//o'reilly and associates//dtd html extended 1.0//en",
56        "-//spyglass//dtd html 2.0 extended//en",
57        "-//sq//dtd html 2.0 hotmetal + extensions//en",
58        "-//sun microsystems corp.//dtd hotjava html//en",
59        "-//sun microsystems corp.//dtd hotjava strict html//en",
60        "-//w3c//dtd html 3 1995-03-24//en",
61        "-//w3c//dtd html 3.2 draft//en",
62        "-//w3c//dtd html 3.2 final//en",
63        "-//w3c//dtd html 3.2//en",
64        "-//w3c//dtd html 3.2s draft//en",
65        "-//w3c//dtd html 4.0 frameset//en",
66        "-//w3c//dtd html 4.0 transitional//en",
67        "-//w3c//dtd html experimental 19960712//en",
68        "-//w3c//dtd html experimental 970421//en",
69        "-//w3c//dtd w3 html//en",
70        "-//w3o//dtd w3 html 3.0//en",
71        "-//w3o//dtd w3 html 3.0//en//",
72        "-//webtechs//dtd mozilla html 2.0//en",
73        "-//webtechs//dtd mozilla html//en"
74    ],
75    QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [
76        '-//w3c//dtd html 4.01 frameset//',
77        '-//w3c//dtd html 4.01 transitional//'
78    ],
79    QUIRKS_MODE_PUBLIC_IDS = [
80        '-//w3o//dtd w3 html strict 3.0//en//',
81        '-/w3c/dtd html 4.0 transitional/en',
82        'html'
83    ];
84
85
86//Utils
87function enquoteDoctypeId(id) {
88    var quote = id.indexOf('"') !== -1 ? '\'' : '"';
89
90    return quote + id + quote;
91}
92
93
94//API
95exports.isQuirks = function (name, publicId, systemId) {
96    if (name !== VALID_DOCTYPE_NAME)
97        return true;
98
99    if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID)
100        return true;
101
102    if (publicId !== null) {
103        publicId = publicId.toLowerCase();
104
105        if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1)
106            return true;
107
108        var prefixes = QUIRKS_MODE_PUBLIC_ID_PREFIXES;
109
110        if (systemId === null)
111            prefixes = prefixes.concat(QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES);
112
113        for (var i = 0; i < prefixes.length; i++) {
114            if (publicId.indexOf(prefixes[i]) === 0)
115                return true;
116        }
117    }
118
119    return false;
120};
121
122exports.serializeContent = function (name, publicId, systemId) {
123    var str = '!DOCTYPE ' + name;
124
125    if (publicId !== null)
126        str += ' PUBLIC ' + enquoteDoctypeId(publicId);
127
128    else if (systemId !== null)
129        str += ' SYSTEM';
130
131    if (systemId !== null)
132        str += ' ' + enquoteDoctypeId(systemId);
133
134    return str;
135};
136
137},{}],2:[function(require,module,exports){
138'use strict';
139
140var Tokenizer = require('../tokenization/tokenizer'),
141    HTML = require('./html');
142
143//Aliases
144var $ = HTML.TAG_NAMES,
145    NS = HTML.NAMESPACES,
146    ATTRS = HTML.ATTRS;
147
148
149//MIME types
150var MIME_TYPES = {
151    TEXT_HTML: 'text/html',
152    APPLICATION_XML: 'application/xhtml+xml'
153};
154
155//Attributes
156var DEFINITION_URL_ATTR = 'definitionurl',
157    ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL',
158    SVG_ATTRS_ADJUSTMENT_MAP = {
159        'attributename': 'attributeName',
160        'attributetype': 'attributeType',
161        'basefrequency': 'baseFrequency',
162        'baseprofile': 'baseProfile',
163        'calcmode': 'calcMode',
164        'clippathunits': 'clipPathUnits',
165        'contentscripttype': 'contentScriptType',
166        'contentstyletype': 'contentStyleType',
167        'diffuseconstant': 'diffuseConstant',
168        'edgemode': 'edgeMode',
169        'externalresourcesrequired': 'externalResourcesRequired',
170        'filterres': 'filterRes',
171        'filterunits': 'filterUnits',
172        'glyphref': 'glyphRef',
173        'gradienttransform': 'gradientTransform',
174        'gradientunits': 'gradientUnits',
175        'kernelmatrix': 'kernelMatrix',
176        'kernelunitlength': 'kernelUnitLength',
177        'keypoints': 'keyPoints',
178        'keysplines': 'keySplines',
179        'keytimes': 'keyTimes',
180        'lengthadjust': 'lengthAdjust',
181        'limitingconeangle': 'limitingConeAngle',
182        'markerheight': 'markerHeight',
183        'markerunits': 'markerUnits',
184        'markerwidth': 'markerWidth',
185        'maskcontentunits': 'maskContentUnits',
186        'maskunits': 'maskUnits',
187        'numoctaves': 'numOctaves',
188        'pathlength': 'pathLength',
189        'patterncontentunits': 'patternContentUnits',
190        'patterntransform': 'patternTransform',
191        'patternunits': 'patternUnits',
192        'pointsatx': 'pointsAtX',
193        'pointsaty': 'pointsAtY',
194        'pointsatz': 'pointsAtZ',
195        'preservealpha': 'preserveAlpha',
196        'preserveaspectratio': 'preserveAspectRatio',
197        'primitiveunits': 'primitiveUnits',
198        'refx': 'refX',
199        'refy': 'refY',
200        'repeatcount': 'repeatCount',
201        'repeatdur': 'repeatDur',
202        'requiredextensions': 'requiredExtensions',
203        'requiredfeatures': 'requiredFeatures',
204        'specularconstant': 'specularConstant',
205        'specularexponent': 'specularExponent',
206        'spreadmethod': 'spreadMethod',
207        'startoffset': 'startOffset',
208        'stddeviation': 'stdDeviation',
209        'stitchtiles': 'stitchTiles',
210        'surfacescale': 'surfaceScale',
211        'systemlanguage': 'systemLanguage',
212        'tablevalues': 'tableValues',
213        'targetx': 'targetX',
214        'targety': 'targetY',
215        'textlength': 'textLength',
216        'viewbox': 'viewBox',
217        'viewtarget': 'viewTarget',
218        'xchannelselector': 'xChannelSelector',
219        'ychannelselector': 'yChannelSelector',
220        'zoomandpan': 'zoomAndPan'
221    },
222    XML_ATTRS_ADJUSTMENT_MAP = {
223        'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.XLINK},
224        'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK},
225        'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.XLINK},
226        'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.XLINK},
227        'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.XLINK},
228        'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.XLINK},
229        'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.XLINK},
230        'xml:base': {prefix: 'xml', name: 'base', namespace: NS.XML},
231        'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.XML},
232        'xml:space': {prefix: 'xml', name: 'space', namespace: NS.XML},
233        'xmlns': {prefix: '', name: 'xmlns', namespace: NS.XMLNS},
234        'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS}
235
236    };
237
238//SVG tag names adjustment map
239var SVG_TAG_NAMES_ADJUSTMENT_MAP = {
240    'altglyph': 'altGlyph',
241    'altglyphdef': 'altGlyphDef',
242    'altglyphitem': 'altGlyphItem',
243    'animatecolor': 'animateColor',
244    'animatemotion': 'animateMotion',
245    'animatetransform': 'animateTransform',
246    'clippath': 'clipPath',
247    'feblend': 'feBlend',
248    'fecolormatrix': 'feColorMatrix',
249    'fecomponenttransfer': 'feComponentTransfer',
250    'fecomposite': 'feComposite',
251    'feconvolvematrix': 'feConvolveMatrix',
252    'fediffuselighting': 'feDiffuseLighting',
253    'fedisplacementmap': 'feDisplacementMap',
254    'fedistantlight': 'feDistantLight',
255    'feflood': 'feFlood',
256    'fefunca': 'feFuncA',
257    'fefuncb': 'feFuncB',
258    'fefuncg': 'feFuncG',
259    'fefuncr': 'feFuncR',
260    'fegaussianblur': 'feGaussianBlur',
261    'feimage': 'feImage',
262    'femerge': 'feMerge',
263    'femergenode': 'feMergeNode',
264    'femorphology': 'feMorphology',
265    'feoffset': 'feOffset',
266    'fepointlight': 'fePointLight',
267    'fespecularlighting': 'feSpecularLighting',
268    'fespotlight': 'feSpotLight',
269    'fetile': 'feTile',
270    'feturbulence': 'feTurbulence',
271    'foreignobject': 'foreignObject',
272    'glyphref': 'glyphRef',
273    'lineargradient': 'linearGradient',
274    'radialgradient': 'radialGradient',
275    'textpath': 'textPath'
276};
277
278//Tags that causes exit from foreign content
279var EXITS_FOREIGN_CONTENT = {};
280
281EXITS_FOREIGN_CONTENT[$.B] = true;
282EXITS_FOREIGN_CONTENT[$.BIG] = true;
283EXITS_FOREIGN_CONTENT[$.BLOCKQUOTE] = true;
284EXITS_FOREIGN_CONTENT[$.BODY] = true;
285EXITS_FOREIGN_CONTENT[$.BR] = true;
286EXITS_FOREIGN_CONTENT[$.CENTER] = true;
287EXITS_FOREIGN_CONTENT[$.CODE] = true;
288EXITS_FOREIGN_CONTENT[$.DD] = true;
289EXITS_FOREIGN_CONTENT[$.DIV] = true;
290EXITS_FOREIGN_CONTENT[$.DL] = true;
291EXITS_FOREIGN_CONTENT[$.DT] = true;
292EXITS_FOREIGN_CONTENT[$.EM] = true;
293EXITS_FOREIGN_CONTENT[$.EMBED] = true;
294EXITS_FOREIGN_CONTENT[$.H1] = true;
295EXITS_FOREIGN_CONTENT[$.H2] = true;
296EXITS_FOREIGN_CONTENT[$.H3] = true;
297EXITS_FOREIGN_CONTENT[$.H4] = true;
298EXITS_FOREIGN_CONTENT[$.H5] = true;
299EXITS_FOREIGN_CONTENT[$.H6] = true;
300EXITS_FOREIGN_CONTENT[$.HEAD] = true;
301EXITS_FOREIGN_CONTENT[$.HR] = true;
302EXITS_FOREIGN_CONTENT[$.I] = true;
303EXITS_FOREIGN_CONTENT[$.IMG] = true;
304EXITS_FOREIGN_CONTENT[$.LI] = true;
305EXITS_FOREIGN_CONTENT[$.LISTING] = true;
306EXITS_FOREIGN_CONTENT[$.MENU] = true;
307EXITS_FOREIGN_CONTENT[$.META] = true;
308EXITS_FOREIGN_CONTENT[$.NOBR] = true;
309EXITS_FOREIGN_CONTENT[$.OL] = true;
310EXITS_FOREIGN_CONTENT[$.P] = true;
311EXITS_FOREIGN_CONTENT[$.PRE] = true;
312EXITS_FOREIGN_CONTENT[$.RUBY] = true;
313EXITS_FOREIGN_CONTENT[$.S] = true;
314EXITS_FOREIGN_CONTENT[$.SMALL] = true;
315EXITS_FOREIGN_CONTENT[$.SPAN] = true;
316EXITS_FOREIGN_CONTENT[$.STRONG] = true;
317EXITS_FOREIGN_CONTENT[$.STRIKE] = true;
318EXITS_FOREIGN_CONTENT[$.SUB] = true;
319EXITS_FOREIGN_CONTENT[$.SUP] = true;
320EXITS_FOREIGN_CONTENT[$.TABLE] = true;
321EXITS_FOREIGN_CONTENT[$.TT] = true;
322EXITS_FOREIGN_CONTENT[$.U] = true;
323EXITS_FOREIGN_CONTENT[$.UL] = true;
324EXITS_FOREIGN_CONTENT[$.VAR] = true;
325
326//Check exit from foreign content
327exports.causesExit = function (startTagToken) {
328    var tn = startTagToken.tagName;
329
330    if (tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null ||
331        Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null ||
332        Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null)) {
333        return true;
334    }
335
336    return EXITS_FOREIGN_CONTENT[tn];
337};
338
339//Token adjustments
340exports.adjustTokenMathMLAttrs = function (token) {
341    for (var i = 0; i < token.attrs.length; i++) {
342        if (token.attrs[i].name === DEFINITION_URL_ATTR) {
343            token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR;
344            break;
345        }
346    }
347};
348
349exports.adjustTokenSVGAttrs = function (token) {
350    for (var i = 0; i < token.attrs.length; i++) {
351        var adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
352
353        if (adjustedAttrName)
354            token.attrs[i].name = adjustedAttrName;
355    }
356};
357
358exports.adjustTokenXMLAttrs = function (token) {
359    for (var i = 0; i < token.attrs.length; i++) {
360        var adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
361
362        if (adjustedAttrEntry) {
363            token.attrs[i].prefix = adjustedAttrEntry.prefix;
364            token.attrs[i].name = adjustedAttrEntry.name;
365            token.attrs[i].namespace = adjustedAttrEntry.namespace;
366        }
367    }
368};
369
370exports.adjustTokenSVGTagName = function (token) {
371    var adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName];
372
373    if (adjustedTagName)
374        token.tagName = adjustedTagName;
375};
376
377//Integration points
378exports.isMathMLTextIntegrationPoint = function (tn, ns) {
379    return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT);
380};
381
382exports.isHtmlIntegrationPoint = function (tn, ns, attrs) {
383    if (ns === NS.MATHML && tn === $.ANNOTATION_XML) {
384        for (var i = 0; i < attrs.length; i++) {
385            if (attrs[i].name === ATTRS.ENCODING) {
386                var value = attrs[i].value.toLowerCase();
387
388                return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML;
389            }
390        }
391    }
392
393    return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE);
394};
395
396},{"../tokenization/tokenizer":14,"./html":3}],3:[function(require,module,exports){
397'use strict';
398
399var NS = exports.NAMESPACES = {
400    HTML: 'http://www.w3.org/1999/xhtml',
401    MATHML: 'http://www.w3.org/1998/Math/MathML',
402    SVG: 'http://www.w3.org/2000/svg',
403    XLINK: 'http://www.w3.org/1999/xlink',
404    XML: 'http://www.w3.org/XML/1998/namespace',
405    XMLNS: 'http://www.w3.org/2000/xmlns/'
406};
407
408exports.ATTRS = {
409    TYPE: 'type',
410    ACTION: 'action',
411    ENCODING: 'encoding',
412    PROMPT: 'prompt',
413    NAME: 'name',
414    COLOR: 'color',
415    FACE: 'face',
416    SIZE: 'size'
417};
418
419var $ = exports.TAG_NAMES = {
420    A: 'a',
421    ADDRESS: 'address',
422    ANNOTATION_XML: 'annotation-xml',
423    APPLET: 'applet',
424    AREA: 'area',
425    ARTICLE: 'article',
426    ASIDE: 'aside',
427
428    B: 'b',
429    BASE: 'base',
430    BASEFONT: 'basefont',
431    BGSOUND: 'bgsound',
432    BIG: 'big',
433    BLOCKQUOTE: 'blockquote',
434    BODY: 'body',
435    BR: 'br',
436    BUTTON: 'button',
437
438    CAPTION: 'caption',
439    CENTER: 'center',
440    CODE: 'code',
441    COL: 'col',
442    COLGROUP: 'colgroup',
443    COMMAND: 'command',
444
445    DD: 'dd',
446    DESC: 'desc',
447    DETAILS: 'details',
448    DIALOG: 'dialog',
449    DIR: 'dir',
450    DIV: 'div',
451    DL: 'dl',
452    DT: 'dt',
453
454    EM: 'em',
455    EMBED: 'embed',
456
457    FIELDSET: 'fieldset',
458    FIGCAPTION: 'figcaption',
459    FIGURE: 'figure',
460    FONT: 'font',
461    FOOTER: 'footer',
462    FOREIGN_OBJECT: 'foreignObject',
463    FORM: 'form',
464    FRAME: 'frame',
465    FRAMESET: 'frameset',
466
467    H1: 'h1',
468    H2: 'h2',
469    H3: 'h3',
470    H4: 'h4',
471    H5: 'h5',
472    H6: 'h6',
473    HEAD: 'head',
474    HEADER: 'header',
475    HGROUP: 'hgroup',
476    HR: 'hr',
477    HTML: 'html',
478
479    I: 'i',
480    IMG: 'img',
481    IMAGE: 'image',
482    INPUT: 'input',
483    IFRAME: 'iframe',
484    ISINDEX: 'isindex',
485
486    KEYGEN: 'keygen',
487
488    LABEL: 'label',
489    LI: 'li',
490    LINK: 'link',
491    LISTING: 'listing',
492
493    MAIN: 'main',
494    MALIGNMARK: 'malignmark',
495    MARQUEE: 'marquee',
496    MATH: 'math',
497    MENU: 'menu',
498    MENUITEM: 'menuitem',
499    META: 'meta',
500    MGLYPH: 'mglyph',
501    MI: 'mi',
502    MO: 'mo',
503    MN: 'mn',
504    MS: 'ms',
505    MTEXT: 'mtext',
506
507    NAV: 'nav',
508    NOBR: 'nobr',
509    NOFRAMES: 'noframes',
510    NOEMBED: 'noembed',
511    NOSCRIPT: 'noscript',
512
513    OBJECT: 'object',
514    OL: 'ol',
515    OPTGROUP: 'optgroup',
516    OPTION: 'option',
517
518    P: 'p',
519    PARAM: 'param',
520    PLAINTEXT: 'plaintext',
521    PRE: 'pre',
522
523    RP: 'rp',
524    RT: 'rt',
525    RUBY: 'ruby',
526
527    S: 's',
528    SCRIPT: 'script',
529    SECTION: 'section',
530    SELECT: 'select',
531    SOURCE: 'source',
532    SMALL: 'small',
533    SPAN: 'span',
534    STRIKE: 'strike',
535    STRONG: 'strong',
536    STYLE: 'style',
537    SUB: 'sub',
538    SUMMARY: 'summary',
539    SUP: 'sup',
540
541    TABLE: 'table',
542    TBODY: 'tbody',
543    TEMPLATE: 'template',
544    TEXTAREA: 'textarea',
545    TFOOT: 'tfoot',
546    TD: 'td',
547    TH: 'th',
548    THEAD: 'thead',
549    TITLE: 'title',
550    TR: 'tr',
551    TRACK: 'track',
552    TT: 'tt',
553
554    U: 'u',
555    UL: 'ul',
556
557    SVG: 'svg',
558
559    VAR: 'var',
560
561    WBR: 'wbr',
562
563    XMP: 'xmp'
564};
565
566var SPECIAL_ELEMENTS = exports.SPECIAL_ELEMENTS = {};
567
568SPECIAL_ELEMENTS[NS.HTML] = {};
569SPECIAL_ELEMENTS[NS.HTML][$.ADDRESS] = true;
570SPECIAL_ELEMENTS[NS.HTML][$.APPLET] = true;
571SPECIAL_ELEMENTS[NS.HTML][$.AREA] = true;
572SPECIAL_ELEMENTS[NS.HTML][$.ARTICLE] = true;
573SPECIAL_ELEMENTS[NS.HTML][$.ASIDE] = true;
574SPECIAL_ELEMENTS[NS.HTML][$.BASE] = true;
575SPECIAL_ELEMENTS[NS.HTML][$.BASEFONT] = true;
576SPECIAL_ELEMENTS[NS.HTML][$.BGSOUND] = true;
577SPECIAL_ELEMENTS[NS.HTML][$.BLOCKQUOTE] = true;
578SPECIAL_ELEMENTS[NS.HTML][$.BODY] = true;
579SPECIAL_ELEMENTS[NS.HTML][$.BR] = true;
580SPECIAL_ELEMENTS[NS.HTML][$.BUTTON] = true;
581SPECIAL_ELEMENTS[NS.HTML][$.CAPTION] = true;
582SPECIAL_ELEMENTS[NS.HTML][$.CENTER] = true;
583SPECIAL_ELEMENTS[NS.HTML][$.COL] = true;
584SPECIAL_ELEMENTS[NS.HTML][$.COLGROUP] = true;
585SPECIAL_ELEMENTS[NS.HTML][$.DD] = true;
586SPECIAL_ELEMENTS[NS.HTML][$.DETAILS] = true;
587SPECIAL_ELEMENTS[NS.HTML][$.DIR] = true;
588SPECIAL_ELEMENTS[NS.HTML][$.DIV] = true;
589SPECIAL_ELEMENTS[NS.HTML][$.DL] = true;
590SPECIAL_ELEMENTS[NS.HTML][$.DT] = true;
591SPECIAL_ELEMENTS[NS.HTML][$.EMBED] = true;
592SPECIAL_ELEMENTS[NS.HTML][$.FIELDSET] = true;
593SPECIAL_ELEMENTS[NS.HTML][$.FIGCAPTION] = true;
594SPECIAL_ELEMENTS[NS.HTML][$.FIGURE] = true;
595SPECIAL_ELEMENTS[NS.HTML][$.FOOTER] = true;
596SPECIAL_ELEMENTS[NS.HTML][$.FORM] = true;
597SPECIAL_ELEMENTS[NS.HTML][$.FRAME] = true;
598SPECIAL_ELEMENTS[NS.HTML][$.FRAMESET] = true;
599SPECIAL_ELEMENTS[NS.HTML][$.H1] = true;
600SPECIAL_ELEMENTS[NS.HTML][$.H2] = true;
601SPECIAL_ELEMENTS[NS.HTML][$.H3] = true;
602SPECIAL_ELEMENTS[NS.HTML][$.H4] = true;
603SPECIAL_ELEMENTS[NS.HTML][$.H5] = true;
604SPECIAL_ELEMENTS[NS.HTML][$.H6] = true;
605SPECIAL_ELEMENTS[NS.HTML][$.HEAD] = true;
606SPECIAL_ELEMENTS[NS.HTML][$.HEADER] = true;
607SPECIAL_ELEMENTS[NS.HTML][$.HGROUP] = true;
608SPECIAL_ELEMENTS[NS.HTML][$.HR] = true;
609SPECIAL_ELEMENTS[NS.HTML][$.HTML] = true;
610SPECIAL_ELEMENTS[NS.HTML][$.IFRAME] = true;
611SPECIAL_ELEMENTS[NS.HTML][$.IMG] = true;
612SPECIAL_ELEMENTS[NS.HTML][$.INPUT] = true;
613SPECIAL_ELEMENTS[NS.HTML][$.ISINDEX] = true;
614SPECIAL_ELEMENTS[NS.HTML][$.LI] = true;
615SPECIAL_ELEMENTS[NS.HTML][$.LINK] = true;
616SPECIAL_ELEMENTS[NS.HTML][$.LISTING] = true;
617SPECIAL_ELEMENTS[NS.HTML][$.MAIN] = true;
618SPECIAL_ELEMENTS[NS.HTML][$.MARQUEE] = true;
619SPECIAL_ELEMENTS[NS.HTML][$.MENU] = true;
620SPECIAL_ELEMENTS[NS.HTML][$.MENUITEM] = true;
621SPECIAL_ELEMENTS[NS.HTML][$.META] = true;
622SPECIAL_ELEMENTS[NS.HTML][$.NAV] = true;
623SPECIAL_ELEMENTS[NS.HTML][$.NOEMBED] = true;
624SPECIAL_ELEMENTS[NS.HTML][$.NOFRAMES] = true;
625SPECIAL_ELEMENTS[NS.HTML][$.NOSCRIPT] = true;
626SPECIAL_ELEMENTS[NS.HTML][$.OBJECT] = true;
627SPECIAL_ELEMENTS[NS.HTML][$.OL] = true;
628SPECIAL_ELEMENTS[NS.HTML][$.P] = true;
629SPECIAL_ELEMENTS[NS.HTML][$.PARAM] = true;
630SPECIAL_ELEMENTS[NS.HTML][$.PLAINTEXT] = true;
631SPECIAL_ELEMENTS[NS.HTML][$.PRE] = true;
632SPECIAL_ELEMENTS[NS.HTML][$.SCRIPT] = true;
633SPECIAL_ELEMENTS[NS.HTML][$.SECTION] = true;
634SPECIAL_ELEMENTS[NS.HTML][$.SELECT] = true;
635SPECIAL_ELEMENTS[NS.HTML][$.SOURCE] = true;
636SPECIAL_ELEMENTS[NS.HTML][$.STYLE] = true;
637SPECIAL_ELEMENTS[NS.HTML][$.SUMMARY] = true;
638SPECIAL_ELEMENTS[NS.HTML][$.TABLE] = true;
639SPECIAL_ELEMENTS[NS.HTML][$.TBODY] = true;
640SPECIAL_ELEMENTS[NS.HTML][$.TD] = true;
641SPECIAL_ELEMENTS[NS.HTML][$.TEMPLATE] = true;
642SPECIAL_ELEMENTS[NS.HTML][$.TEXTAREA] = true;
643SPECIAL_ELEMENTS[NS.HTML][$.TFOOT] = true;
644SPECIAL_ELEMENTS[NS.HTML][$.TH] = true;
645SPECIAL_ELEMENTS[NS.HTML][$.THEAD] = true;
646SPECIAL_ELEMENTS[NS.HTML][$.TITLE] = true;
647SPECIAL_ELEMENTS[NS.HTML][$.TR] = true;
648SPECIAL_ELEMENTS[NS.HTML][$.TRACK] = true;
649SPECIAL_ELEMENTS[NS.HTML][$.UL] = true;
650SPECIAL_ELEMENTS[NS.HTML][$.WBR] = true;
651SPECIAL_ELEMENTS[NS.HTML][$.XMP] = true;
652
653SPECIAL_ELEMENTS[NS.MATHML] = {};
654SPECIAL_ELEMENTS[NS.MATHML][$.MI] = true;
655SPECIAL_ELEMENTS[NS.MATHML][$.MO] = true;
656SPECIAL_ELEMENTS[NS.MATHML][$.MN] = true;
657SPECIAL_ELEMENTS[NS.MATHML][$.MS] = true;
658SPECIAL_ELEMENTS[NS.MATHML][$.MTEXT] = true;
659SPECIAL_ELEMENTS[NS.MATHML][$.ANNOTATION_XML] = true;
660
661SPECIAL_ELEMENTS[NS.SVG] = {};
662SPECIAL_ELEMENTS[NS.SVG][$.TITLE] = true;
663SPECIAL_ELEMENTS[NS.SVG][$.FOREIGN_OBJECT] = true;
664SPECIAL_ELEMENTS[NS.SVG][$.DESC] = true;
665
666},{}],4:[function(require,module,exports){
667'use strict';
668
669exports.REPLACEMENT_CHARACTER = '\uFFFD';
670
671exports.CODE_POINTS = {
672    EOF: -1,
673    NULL: 0x00,
674    TABULATION: 0x09,
675    CARRIAGE_RETURN: 0x0D,
676    LINE_FEED: 0x0A,
677    FORM_FEED: 0x0C,
678    SPACE: 0x20,
679    EXCLAMATION_MARK: 0x21,
680    QUOTATION_MARK: 0x22,
681    NUMBER_SIGN: 0x23,
682    AMPERSAND: 0x26,
683    APOSTROPHE: 0x27,
684    HYPHEN_MINUS: 0x2D,
685    SOLIDUS: 0x2F,
686    DIGIT_0: 0x30,
687    DIGIT_9: 0x39,
688    SEMICOLON: 0x3B,
689    LESS_THAN_SIGN: 0x3C,
690    EQUALS_SIGN: 0x3D,
691    GREATER_THAN_SIGN: 0x3E,
692    QUESTION_MARK: 0x3F,
693    LATIN_CAPITAL_A: 0x41,
694    LATIN_CAPITAL_F: 0x46,
695    LATIN_CAPITAL_X: 0x58,
696    LATIN_CAPITAL_Z: 0x5A,
697    GRAVE_ACCENT: 0x60,
698    LATIN_SMALL_A: 0x61,
699    LATIN_SMALL_F: 0x66,
700    LATIN_SMALL_X: 0x78,
701    LATIN_SMALL_Z: 0x7A,
702    BOM: 0xFEFF,
703    REPLACEMENT_CHARACTER: 0xFFFD
704};
705
706exports.CODE_POINT_SEQUENCES = {
707    DASH_DASH_STRING: [0x2D, 0x2D], //--
708    DOCTYPE_STRING: [0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45], //DOCTYPE
709    CDATA_START_STRING: [0x5B, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5B], //[CDATA[
710    CDATA_END_STRING: [0x5D, 0x5D, 0x3E], //]]>
711    SCRIPT_STRING: [0x73, 0x63, 0x72, 0x69, 0x70, 0x74], //script
712    PUBLIC_STRING: [0x50, 0x55, 0x42, 0x4C, 0x49, 0x43], //PUBLIC
713    SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4D] //SYSTEM
714};
715
716},{}],5:[function(require,module,exports){
717'use strict';
718
719exports.mergeOptions = function (defaults, options) {
720    options = options || {};
721
722    return [defaults, options].reduce(function (merged, optObj) {
723        Object.keys(optObj).forEach(function (key) {
724            merged[key] = optObj[key];
725        });
726
727        return merged;
728    }, {});
729};
730
731},{}],6:[function(require,module,exports){
732(function (process){
733'use strict';
734
735var Parser = require('../tree_construction/parser'),
736    ParsingUnit = require('./parsing_unit');
737
738//API
739exports.parseDocument = function (html, treeAdapter) {
740    //NOTE: this should be reentrant, so we create new parser here
741    var parser = new Parser(treeAdapter),
742        parsingUnit = new ParsingUnit(parser);
743
744    //NOTE: override parser loop method
745    parser._runParsingLoop = function () {
746        parsingUnit.parsingLoopLock = true;
747
748        while (!parsingUnit.suspended && !this.stopped)
749            this._iterateParsingLoop();
750
751        parsingUnit.parsingLoopLock = false;
752
753        if (this.stopped)
754            parsingUnit.callback(this.document);
755    };
756
757    //NOTE: wait while parserController will be adopted by calling code, then
758    //start parsing
759    process.nextTick(function () {
760        parser.parse(html);
761    });
762
763    return parsingUnit;
764};
765
766exports.parseInnerHtml = function (innerHtml, contextElement, treeAdapter) {
767    //NOTE: this should be reentrant, so we create new parser here
768    var parser = new Parser(treeAdapter);
769
770    return parser.parseFragment(innerHtml, contextElement);
771};
772}).call(this,require('_process'))
773},{"../tree_construction/parser":20,"./parsing_unit":7,"_process":22}],7:[function(require,module,exports){
774'use strict';
775
776var ParsingUnit = module.exports = function (parser) {
777    this.parser = parser;
778    this.suspended = false;
779    this.parsingLoopLock = false;
780    this.callback = null;
781};
782
783ParsingUnit.prototype._stateGuard = function (suspend) {
784    if (this.suspended && suspend)
785        throw new Error('parse5: Parser was already suspended. Please, check your control flow logic.');
786
787    else if (!this.suspended && !suspend)
788        throw new Error('parse5: Parser was already resumed. Please, check your control flow logic.');
789
790    return suspend;
791};
792
793ParsingUnit.prototype.suspend = function () {
794    this.suspended = this._stateGuard(true);
795
796    return this;
797};
798
799ParsingUnit.prototype.resume = function () {
800    this.suspended = this._stateGuard(false);
801
802    //NOTE: don't enter parsing loop if it is locked. Without this lock _runParsingLoop() may be called
803    //while parsing loop is still running. E.g. when suspend() and resume() called synchronously.
804    if (!this.parsingLoopLock)
805        this.parser._runParsingLoop();
806
807    return this;
808};
809
810ParsingUnit.prototype.documentWrite = function (html) {
811    this.parser.tokenizer.preprocessor.write(html);
812
813    return this;
814};
815
816ParsingUnit.prototype.handleScripts = function (scriptHandler) {
817    this.parser.scriptHandler = scriptHandler;
818
819    return this;
820};
821
822ParsingUnit.prototype.done = function (callback) {
823    this.callback = callback;
824
825    return this;
826};
827
828},{}],8:[function(require,module,exports){
829'use strict';
830
831var DefaultTreeAdapter = require('../tree_adapters/default'),
832    Doctype = require('../common/doctype'),
833    Utils = require('../common/utils'),
834    HTML = require('../common/html');
835
836//Aliases
837var $ = HTML.TAG_NAMES,
838    NS = HTML.NAMESPACES;
839
840//Default serializer options
841var DEFAULT_OPTIONS = {
842    encodeHtmlEntities: true
843};
844
845//Escaping regexes
846var AMP_REGEX = /&/g,
847    NBSP_REGEX = /\u00a0/g,
848    DOUBLE_QUOTE_REGEX = /"/g,
849    LT_REGEX = /</g,
850    GT_REGEX = />/g;
851
852//Escape string
853function escapeString(str, attrMode) {
854    str = str
855        .replace(AMP_REGEX, '&amp;')
856        .replace(NBSP_REGEX, '&nbsp;');
857
858    if (attrMode)
859        str = str.replace(DOUBLE_QUOTE_REGEX, '&quot;');
860
861    else {
862        str = str
863            .replace(LT_REGEX, '&lt;')
864            .replace(GT_REGEX, '&gt;');
865    }
866
867    return str;
868}
869
870
871//Enquote doctype ID
872
873
874
875//Serializer
876var Serializer = module.exports = function (treeAdapter, options) {
877    this.treeAdapter = treeAdapter || DefaultTreeAdapter;
878    this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
879};
880
881
882//API
883Serializer.prototype.serialize = function (node) {
884    this.html = '';
885    this._serializeChildNodes(node);
886
887    return this.html;
888};
889
890
891//Internals
892Serializer.prototype._serializeChildNodes = function (parentNode) {
893    var childNodes = this.treeAdapter.getChildNodes(parentNode);
894
895    if (childNodes) {
896        for (var i = 0, cnLength = childNodes.length; i < cnLength; i++) {
897            var currentNode = childNodes[i];
898
899            if (this.treeAdapter.isElementNode(currentNode))
900                this._serializeElement(currentNode);
901
902            else if (this.treeAdapter.isTextNode(currentNode))
903                this._serializeTextNode(currentNode);
904
905            else if (this.treeAdapter.isCommentNode(currentNode))
906                this._serializeCommentNode(currentNode);
907
908            else if (this.treeAdapter.isDocumentTypeNode(currentNode))
909                this._serializeDocumentTypeNode(currentNode);
910        }
911    }
912};
913
914Serializer.prototype._serializeElement = function (node) {
915    var tn = this.treeAdapter.getTagName(node),
916        ns = this.treeAdapter.getNamespaceURI(node),
917        qualifiedTn = (ns === NS.HTML || ns === NS.SVG || ns === NS.MATHML) ? tn : (ns + ':' + tn);
918
919    this.html += '<' + qualifiedTn;
920    this._serializeAttributes(node);
921    this.html += '>';
922
923    if (tn !== $.AREA && tn !== $.BASE && tn !== $.BASEFONT && tn !== $.BGSOUND && tn !== $.BR && tn !== $.BR &&
924        tn !== $.COL && tn !== $.EMBED && tn !== $.FRAME && tn !== $.HR && tn !== $.IMG && tn !== $.INPUT &&
925        tn !== $.KEYGEN && tn !== $.LINK && tn !== $.MENUITEM && tn !== $.META && tn !== $.PARAM && tn !== $.SOURCE &&
926        tn !== $.TRACK && tn !== $.WBR) {
927
928        if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING) {
929            var firstChild = this.treeAdapter.getFirstChild(node);
930
931            if (firstChild && this.treeAdapter.isTextNode(firstChild)) {
932                var content = this.treeAdapter.getTextNodeContent(firstChild);
933
934                if (content[0] === '\n')
935                    this.html += '\n';
936            }
937        }
938
939        var childNodesHolder = tn === $.TEMPLATE && ns === NS.HTML ?
940                               this.treeAdapter.getChildNodes(node)[0] :
941                               node;
942
943        this._serializeChildNodes(childNodesHolder);
944        this.html += '</' + qualifiedTn + '>';
945    }
946};
947
948Serializer.prototype._serializeAttributes = function (node) {
949    var attrs = this.treeAdapter.getAttrList(node);
950
951    for (var i = 0, attrsLength = attrs.length; i < attrsLength; i++) {
952        var attr = attrs[i],
953            value = this.options.encodeHtmlEntities ? escapeString(attr.value, true) : attr.value;
954
955        this.html += ' ';
956
957        if (!attr.namespace)
958            this.html += attr.name;
959
960        else if (attr.namespace === NS.XML)
961            this.html += 'xml:' + attr.name;
962
963        else if (attr.namespace === NS.XMLNS) {
964            if (attr.name !== 'xmlns')
965                this.html += 'xmlns:';
966
967            this.html += attr.name;
968        }
969
970        else if (attr.namespace === NS.XLINK)
971            this.html += 'xlink:' + attr.name;
972
973        else
974            this.html += attr.namespace + ':' + attr.name;
975
976        this.html += '="' + value + '"';
977    }
978};
979
980Serializer.prototype._serializeTextNode = function (node) {
981    var content = this.treeAdapter.getTextNodeContent(node),
982        parent = this.treeAdapter.getParentNode(node),
983        parentTn = void 0;
984
985    if (parent && this.treeAdapter.isElementNode(parent))
986        parentTn = this.treeAdapter.getTagName(parent);
987
988    if (parentTn === $.STYLE || parentTn === $.SCRIPT || parentTn === $.XMP || parentTn === $.IFRAME ||
989        parentTn === $.NOEMBED || parentTn === $.NOFRAMES || parentTn === $.PLAINTEXT || parentTn === $.NOSCRIPT) {
990        this.html += content;
991    }
992
993    else
994        this.html += this.options.encodeHtmlEntities ? escapeString(content, false) : content;
995};
996
997Serializer.prototype._serializeCommentNode = function (node) {
998    this.html += '<!--' + this.treeAdapter.getCommentNodeContent(node) + '-->';
999};
1000
1001Serializer.prototype._serializeDocumentTypeNode = function (node) {
1002    var name = this.treeAdapter.getDocumentTypeNodeName(node),
1003        publicId = this.treeAdapter.getDocumentTypeNodePublicId(node),
1004        systemId = this.treeAdapter.getDocumentTypeNodeSystemId(node);
1005
1006    this.html += '<' + Doctype.serializeContent(name, publicId, systemId) + '>';
1007};
1008
1009},{"../common/doctype":1,"../common/html":3,"../common/utils":5,"../tree_adapters/default":15}],9:[function(require,module,exports){
1010'use strict';
1011
1012var Tokenizer = require('../tokenization/tokenizer'),
1013    TokenizerProxy = require('./tokenizer_proxy'),
1014    Utils = require('../common/utils');
1015
1016//Default options
1017var DEFAULT_OPTIONS = {
1018    decodeHtmlEntities: true,
1019    locationInfo: false
1020};
1021
1022//Skipping handler
1023function skip() {
1024    //NOTE: do nothing =)
1025}
1026
1027//SimpleApiParser
1028var SimpleApiParser = module.exports = function (handlers, options) {
1029    this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
1030    this.handlers = {
1031        doctype: this._wrapHandler(handlers.doctype),
1032        startTag: this._wrapHandler(handlers.startTag),
1033        endTag: this._wrapHandler(handlers.endTag),
1034        text: this._wrapHandler(handlers.text),
1035        comment: this._wrapHandler(handlers.comment)
1036    };
1037};
1038
1039SimpleApiParser.prototype._wrapHandler = function (handler) {
1040    var parser = this;
1041
1042    handler = handler || skip;
1043
1044    if (this.options.locationInfo) {
1045        return function () {
1046            var args = Array.prototype.slice.call(arguments);
1047            args.push(parser.currentTokenLocation);
1048            handler.apply(handler, args);
1049        };
1050    }
1051
1052    return handler;
1053};
1054
1055//API
1056SimpleApiParser.prototype.parse = function (html) {
1057    var token = null;
1058
1059    this._reset(html);
1060
1061    do {
1062        token = this.tokenizerProxy.getNextToken();
1063
1064        if (token.type === Tokenizer.CHARACTER_TOKEN ||
1065            token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN ||
1066            token.type === Tokenizer.NULL_CHARACTER_TOKEN) {
1067
1068            if (this.options.locationInfo) {
1069                if (this.pendingText === null)
1070                    this.currentTokenLocation = token.location;
1071
1072                else
1073                    this.currentTokenLocation.end = token.location.end;
1074            }
1075
1076            this.pendingText = (this.pendingText || '') + token.chars;
1077        }
1078
1079        else {
1080            this._emitPendingText();
1081            this._handleToken(token);
1082        }
1083    } while (token.type !== Tokenizer.EOF_TOKEN);
1084};
1085
1086//Internals
1087SimpleApiParser.prototype._handleToken = function (token) {
1088    if (this.options.locationInfo)
1089        this.currentTokenLocation = token.location;
1090
1091    if (token.type === Tokenizer.START_TAG_TOKEN)
1092        this.handlers.startTag(token.tagName, token.attrs, token.selfClosing);
1093
1094    else if (token.type === Tokenizer.END_TAG_TOKEN)
1095        this.handlers.endTag(token.tagName);
1096
1097    else if (token.type === Tokenizer.COMMENT_TOKEN)
1098        this.handlers.comment(token.data);
1099
1100    else if (token.type === Tokenizer.DOCTYPE_TOKEN)
1101        this.handlers.doctype(token.name, token.publicId, token.systemId);
1102
1103};
1104
1105SimpleApiParser.prototype._reset = function (html) {
1106    this.tokenizerProxy = new TokenizerProxy(html, this.options);
1107    this.pendingText = null;
1108    this.currentTokenLocation = null;
1109};
1110
1111SimpleApiParser.prototype._emitPendingText = function () {
1112    if (this.pendingText !== null) {
1113        this.handlers.text(this.pendingText);
1114        this.pendingText = null;
1115    }
1116};
1117
1118},{"../common/utils":5,"../tokenization/tokenizer":14,"./tokenizer_proxy":10}],10:[function(require,module,exports){
1119'use strict';
1120
1121var Tokenizer = require('../tokenization/tokenizer'),
1122    ForeignContent = require('../common/foreign_content'),
1123    UNICODE = require('../common/unicode'),
1124    HTML = require('../common/html');
1125
1126//Aliases
1127var $ = HTML.TAG_NAMES,
1128    NS = HTML.NAMESPACES;
1129
1130
1131//Tokenizer proxy
1132//NOTE: this proxy simulates adjustment of the Tokenizer which performed by standard parser during tree construction.
1133var TokenizerProxy = module.exports = function (html, options) {
1134    this.tokenizer = new Tokenizer(html, options);
1135
1136    this.namespaceStack = [];
1137    this.namespaceStackTop = -1;
1138    this.currentNamespace = null;
1139    this.inForeignContent = false;
1140};
1141
1142//API
1143TokenizerProxy.prototype.getNextToken = function () {
1144    var token = this.tokenizer.getNextToken();
1145
1146    if (token.type === Tokenizer.START_TAG_TOKEN)
1147        this._handleStartTagToken(token);
1148
1149    else if (token.type === Tokenizer.END_TAG_TOKEN)
1150        this._handleEndTagToken(token);
1151
1152    else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) {
1153        token.type = Tokenizer.CHARACTER_TOKEN;
1154        token.chars = UNICODE.REPLACEMENT_CHARACTER;
1155    }
1156
1157    return token;
1158};
1159
1160//Namespace stack mutations
1161TokenizerProxy.prototype._enterNamespace = function (namespace) {
1162    this.namespaceStackTop++;
1163    this.namespaceStack.push(namespace);
1164
1165    this.inForeignContent = namespace !== NS.HTML;
1166    this.currentNamespace = namespace;
1167    this.tokenizer.allowCDATA = this.inForeignContent;
1168};
1169
1170TokenizerProxy.prototype._leaveCurrentNamespace = function () {
1171    this.namespaceStackTop--;
1172    this.namespaceStack.pop();
1173
1174    this.currentNamespace = this.namespaceStack[this.namespaceStackTop];
1175    this.inForeignContent = this.currentNamespace !== NS.HTML;
1176    this.tokenizer.allowCDATA = this.inForeignContent;
1177};
1178
1179//Token handlers
1180TokenizerProxy.prototype._ensureTokenizerMode = function (tn) {
1181    if (tn === $.TEXTAREA || tn === $.TITLE)
1182        this.tokenizer.state = Tokenizer.MODE.RCDATA;
1183
1184    else if (tn === $.PLAINTEXT)
1185        this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
1186
1187    else if (tn === $.SCRIPT)
1188        this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
1189
1190    else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP ||
1191             tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) {
1192        this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
1193    }
1194};
1195
1196TokenizerProxy.prototype._handleStartTagToken = function (token) {
1197    var tn = token.tagName;
1198
1199    if (tn === $.SVG)
1200        this._enterNamespace(NS.SVG);
1201
1202    else if (tn === $.MATH)
1203        this._enterNamespace(NS.MATHML);
1204
1205    else {
1206        if (this.inForeignContent) {
1207            if (ForeignContent.causesExit(token))
1208                this._leaveCurrentNamespace();
1209
1210            else if (ForeignContent.isMathMLTextIntegrationPoint(tn, this.currentNamespace) ||
1211                     ForeignContent.isHtmlIntegrationPoint(tn, this.currentNamespace, token.attrs)) {
1212                this._enterNamespace(NS.HTML);
1213            }
1214        }
1215
1216        else
1217            this._ensureTokenizerMode(tn);
1218    }
1219};
1220
1221TokenizerProxy.prototype._handleEndTagToken = function (token) {
1222    var tn = token.tagName;
1223
1224    if (!this.inForeignContent) {
1225        var previousNs = this.namespaceStack[this.namespaceStackTop - 1];
1226
1227        //NOTE: check for exit from integration point
1228        if (ForeignContent.isMathMLTextIntegrationPoint(tn, previousNs) ||
1229            ForeignContent.isHtmlIntegrationPoint(tn, previousNs, token.attrs)) {
1230            this._leaveCurrentNamespace();
1231        }
1232
1233        else if (tn === $.SCRIPT)
1234            this.tokenizer.state = Tokenizer.MODE.DATA;
1235    }
1236
1237    else if ((tn === $.SVG && this.currentNamespace === NS.SVG) ||
1238             (tn === $.MATH && this.currentNamespace === NS.MATHML))
1239        this._leaveCurrentNamespace();
1240};
1241
1242},{"../common/foreign_content":2,"../common/html":3,"../common/unicode":4,"../tokenization/tokenizer":14}],11:[function(require,module,exports){
1243'use strict';
1244
1245exports.assign = function (tokenizer) {
1246    //NOTE: obtain Tokenizer proto this way to avoid module circular references
1247    var tokenizerProto = Object.getPrototypeOf(tokenizer);
1248
1249    tokenizer.tokenStartLoc = -1;
1250
1251    //NOTE: add location info builder method
1252    tokenizer._attachLocationInfo = function (token) {
1253        token.location = {
1254            start: this.tokenStartLoc,
1255            end: -1
1256        };
1257    };
1258
1259    //NOTE: patch token creation methods and attach location objects
1260    tokenizer._createStartTagToken = function (tagNameFirstCh) {
1261        tokenizerProto._createStartTagToken.call(this, tagNameFirstCh);
1262        this._attachLocationInfo(this.currentToken);
1263    };
1264
1265    tokenizer._createEndTagToken = function (tagNameFirstCh) {
1266        tokenizerProto._createEndTagToken.call(this, tagNameFirstCh);
1267        this._attachLocationInfo(this.currentToken);
1268    };
1269
1270    tokenizer._createCommentToken = function () {
1271        tokenizerProto._createCommentToken.call(this);
1272        this._attachLocationInfo(this.currentToken);
1273    };
1274
1275    tokenizer._createDoctypeToken = function (doctypeNameFirstCh) {
1276        tokenizerProto._createDoctypeToken.call(this, doctypeNameFirstCh);
1277        this._attachLocationInfo(this.currentToken);
1278    };
1279
1280    tokenizer._createCharacterToken = function (type, ch) {
1281        tokenizerProto._createCharacterToken.call(this, type, ch);
1282        this._attachLocationInfo(this.currentCharacterToken);
1283    };
1284
1285    //NOTE: patch token emission methods to determine end location
1286    tokenizer._emitCurrentToken = function () {
1287        //NOTE: if we have pending character token make it's end location equal to the
1288        //current token's start location.
1289        if (this.currentCharacterToken)
1290            this.currentCharacterToken.location.end = this.currentToken.location.start;
1291
1292        this.currentToken.location.end = this.preprocessor.pos + 1;
1293        tokenizerProto._emitCurrentToken.call(this);
1294    };
1295
1296    tokenizer._emitCurrentCharacterToken = function () {
1297        //NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(),
1298        //then set it's location at the current preprocessor position
1299        if (this.currentCharacterToken && this.currentCharacterToken.location.end === -1) {
1300            //NOTE: we don't need to increment preprocessor position, since character token
1301            //emission is always forced by the start of the next character token here.
1302            //So, we already have advanced position.
1303            this.currentCharacterToken.location.end = this.preprocessor.pos;
1304        }
1305
1306        tokenizerProto._emitCurrentCharacterToken.call(this);
1307    };
1308
1309    //NOTE: patch initial states for each mode to obtain token start position
1310    Object.keys(tokenizerProto.MODE)
1311
1312        .map(function (modeName) {
1313            return tokenizerProto.MODE[modeName];
1314        })
1315
1316        .forEach(function (state) {
1317            tokenizer[state] = function (cp) {
1318                this.tokenStartLoc = this.preprocessor.pos;
1319                tokenizerProto[state].call(this, cp);
1320            };
1321        });
1322};
1323
1324},{}],12:[function(require,module,exports){
1325'use strict';
1326
1327//NOTE: this file contains auto generated trie structure that is used for named entity references consumption
1328//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references and
1329//http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references)
1330module.exports = {65:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[198]}},c:[198]}}}}}}},77:{l:{80:{l:{59:{c:[38]}},c:[38]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[193]}},c:[193]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[258]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[194]}},c:[194]}}}}},121:{l:{59:{c:[1040]}}}}},102:{l:{114:{l:{59:{c:[120068]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[192]}},c:[192]}}}}}}}}},108:{l:{112:{l:{104:{l:{97:{l:{59:{c:[913]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[256]}}}}}}}}},110:{l:{100:{l:{59:{c:[10835]}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[260]}}}}}}},112:{l:{102:{l:{59:{c:[120120]}}}}}}},112:{l:{112:{l:{108:{l:{121:{l:{70:{l:{117:{l:{110:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8289]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[197]}},c:[197]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119964]}}}}},115:{l:{105:{l:{103:{l:{110:{l:{59:{c:[8788]}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[195]}},c:[195]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[196]}},c:[196]}}}}}}},66:{l:{97:{l:{99:{l:{107:{l:{115:{l:{108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8726]}}}}}}}}}}}}}}},114:{l:{118:{l:{59:{c:[10983]}}},119:{l:{101:{l:{100:{l:{59:{c:[8966]}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1041]}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{101:{l:{59:{c:[8757]}}}}}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{108:{l:{108:{l:{105:{l:{115:{l:{59:{c:[8492]}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[914]}}}}}}},102:{l:{114:{l:{59:{c:[120069]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120121]}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8492]}}}}}}},117:{l:{109:{l:{112:{l:{101:{l:{113:{l:{59:{c:[8782]}}}}}}}}}}}}},67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1063]}}}}}}},79:{l:{80:{l:{89:{l:{59:{c:[169]}},c:[169]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[262]}}}}}}}}},112:{l:{59:{c:[8914]},105:{l:{116:{l:{97:{l:{108:{l:{68:{l:{105:{l:{102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8517]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},121:{l:{108:{l:{101:{l:{121:{l:{115:{l:{59:{c:[8493]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[268]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[199]}},c:[199]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[264]}}}}}}},111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8752]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[266]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{108:{l:{97:{l:{59:{c:[184]}}}}}}}}}}},110:{l:{116:{l:{101:{l:{114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8493]}}}}},104:{l:{105:{l:{59:{c:[935]}}}}},105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8857]}}}}}}},77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8855]}}}}}}}}}}}}}}}}}}}}},108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8754]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8221]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8217]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8759]},101:{l:{59:{c:[10868]}}}}}}}}},110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8801]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8751]}}}}}}},116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8750]}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8450]}}},114:{l:{111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8720]}}}}}}}}}}}}}}},117:{l:{110:{l:{116:{l:{101:{l:{114:{l:{67:{l:{108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8755]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10799]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119966]}}}}}}},117:{l:{112:{l:{59:{c:[8915]},67:{l:{97:{l:{112:{l:{59:{c:[8781]}}}}}}}}}}}}},68:{l:{68:{l:{59:{c:[8517]},111:{l:{116:{l:{114:{l:{97:{l:{104:{l:{100:{l:{59:{c:[10513]}}}}}}}}}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1026]}}}}}}},83:{l:{99:{l:{121:{l:{59:{c:[1029]}}}}}}},90:{l:{99:{l:{121:{l:{59:{c:[1039]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8609]}}}}},115:{l:{104:{l:{118:{l:{59:{c:[10980]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[270]}}}}}}}}},121:{l:{59:{c:[1044]}}}}},101:{l:{108:{l:{59:{c:[8711]},116:{l:{97:{l:{59:{c:[916]}}}}}}}}},102:{l:{114:{l:{59:{c:[120071]}}}}},105:{l:{97:{l:{99:{l:{114:{l:{105:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[180]}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[729]}}},117:{l:{98:{l:{108:{l:{101:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[733]}}}}}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{111:{l:{110:{l:{100:{l:{59:{c:[8900]}}}}}}}}}}},102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8518]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120123]}}}}},116:{l:{59:{c:[168]},68:{l:{111:{l:{116:{l:{59:{c:[8412]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8784]}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8751]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[168]}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[10980]}}}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8872]}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]},66:{l:{97:{l:{114:{l:{59:{c:[10515]}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8693]}}}}}}}}}}}}}}}}}}}}}}}}},66:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[785]}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10576]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10590]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8637]},66:{l:{97:{l:{114:{l:{59:{c:[10582]}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10591]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8641]},66:{l:{97:{l:{114:{l:{59:{c:[10583]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8868]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8615]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119967]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[272]}}}}}}}}}}}}},69:{l:{78:{l:{71:{l:{59:{c:[330]}}}}},84:{l:{72:{l:{59:{c:[208]}},c:[208]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[201]}},c:[201]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[282]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[202]}},c:[202]}}}}},121:{l:{59:{c:[1069]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[278]}}}}}}},102:{l:{114:{l:{59:{c:[120072]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[200]}},c:[200]}}}}}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8712]}}}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[274]}}}}}}},112:{l:{116:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9723]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9643]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[280]}}}}}}},112:{l:{102:{l:{59:{c:[120124]}}}}}}},112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[917]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10869]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770]}}}}}}}}}}}}}}},105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8496]}}}}},105:{l:{109:{l:{59:{c:[10867]}}}}}}},116:{l:{97:{l:{59:{c:[919]}}}}},117:{l:{109:{l:{108:{l:{59:{c:[203]}},c:[203]}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8707]}}}}}}}}},112:{l:{111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{69:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{99:{l:{121:{l:{59:{c:[1060]}}}}},102:{l:{114:{l:{59:{c:[120073]}}}}},105:{l:{108:{l:{108:{l:{101:{l:{100:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9724]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120125]}}}}},114:{l:{65:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}}}},117:{l:{114:{l:{105:{l:{101:{l:{114:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8497]}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8497]}}}}}}}}},71:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1027]}}}}}}},84:{l:{59:{c:[62]}},c:[62]},97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[915]},100:{l:{59:{c:[988]}}}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[286]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[290]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[284]}}}}}}},121:{l:{59:{c:[1043]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[288]}}}}}}},102:{l:{114:{l:{59:{c:[120074]}}}}},103:{l:{59:{c:[8921]}}},111:{l:{112:{l:{102:{l:{59:{c:[120126]}}}}}}},114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8805]},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8819]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119970]}}}}}}},116:{l:{59:{c:[8811]}}}}},72:{l:{65:{l:{82:{l:{68:{l:{99:{l:{121:{l:{59:{c:[1066]}}}}}}}}}}},97:{l:{99:{l:{101:{l:{107:{l:{59:{c:[711]}}}}}}},116:{l:{59:{c:[94]}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[292]}}}}}}}}},102:{l:{114:{l:{59:{c:[8460]}}}}},105:{l:{108:{l:{98:{l:{101:{l:{114:{l:{116:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8459]}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8461]}}}}},114:{l:{105:{l:{122:{l:{111:{l:{110:{l:{116:{l:{97:{l:{108:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[9472]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8459]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[294]}}}}}}}}}}},117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783]}}}}}}}}}}}}}}}}}}},73:{l:{69:{l:{99:{l:{121:{l:{59:{c:[1045]}}}}}}},74:{l:{108:{l:{105:{l:{103:{l:{59:{c:[306]}}}}}}}}},79:{l:{99:{l:{121:{l:{59:{c:[1025]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[205]}},c:[205]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[206]}},c:[206]}}}}},121:{l:{59:{c:[1048]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[304]}}}}}}},102:{l:{114:{l:{59:{c:[8465]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[204]}},c:[204]}}}}}}}}},109:{l:{59:{c:[8465]},97:{l:{99:{l:{114:{l:{59:{c:[298]}}}}},103:{l:{105:{l:{110:{l:{97:{l:{114:{l:{121:{l:{73:{l:{59:{c:[8520]}}}}}}}}}}}}}}}}},112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[8658]}}}}}}}}}}}}},110:{l:{116:{l:{59:{c:[8748]},101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8747]}}}}}}}}},114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8898]}}}}}}}}}}}}}}}}}}}}},118:{l:{105:{l:{115:{l:{105:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[8291]}}}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8290]}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[302]}}}}}}},112:{l:{102:{l:{59:{c:[120128]}}}}},116:{l:{97:{l:{59:{c:[921]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8464]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[296]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1030]}}}}}}},109:{l:{108:{l:{59:{c:[207]}},c:[207]}}}}}}},74:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[308]}}}}}}},121:{l:{59:{c:[1049]}}}}},102:{l:{114:{l:{59:{c:[120077]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120129]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119973]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1032]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1028]}}}}}}}}}}},75:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1061]}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1036]}}}}}}},97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[922]}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[310]}}}}}}}}},121:{l:{59:{c:[1050]}}}}},102:{l:{114:{l:{59:{c:[120078]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120130]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119974]}}}}}}}}},76:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1033]}}}}}}},84:{l:{59:{c:[60]}},c:[60]},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[313]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[923]}}}}}}}}},110:{l:{103:{l:{59:{c:[10218]}}}}},112:{l:{108:{l:{97:{l:{99:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8466]}}}}}}}}}}}}}}}}},114:{l:{114:{l:{59:{c:[8606]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[317]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[315]}}}}}}}}},121:{l:{59:{c:[1051]}}}}},101:{l:{102:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10216]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},66:{l:{97:{l:{114:{l:{59:{c:[8676]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8646]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8968]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10214]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10593]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8643]},66:{l:{97:{l:{114:{l:{59:{c:[10585]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10574]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8867]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8612]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10586]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8882]},66:{l:{97:{l:{114:{l:{59:{c:[10703]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8884]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10577]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10592]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8639]},66:{l:{97:{l:{114:{l:{59:{c:[10584]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8636]},66:{l:{97:{l:{114:{l:{59:{c:[10578]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8922]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8806]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8822]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8818]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120079]}}}}},108:{l:{59:{c:[8920]},101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8666]}}}}}}}}}}}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[319]}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120131]}}}}},119:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8466]}}}}},104:{l:{59:{c:[8624]}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[321]}}}}}}}}}}},116:{l:{59:{c:[8810]}}}}},77:{l:{97:{l:{112:{l:{59:{c:[10501]}}}}},99:{l:{121:{l:{59:{c:[1052]}}}}},101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287]}}}}}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{110:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8499]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120080]}}}}},105:{l:{110:{l:{117:{l:{115:{l:{80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120132]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8499]}}}}}}},117:{l:{59:{c:[924]}}}}},78:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1034]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[323]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[327]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[325]}}}}}}}}},121:{l:{59:{c:[1053]}}}}},101:{l:{103:{l:{97:{l:{116:{l:{105:{l:{118:{l:{101:{l:{77:{l:{101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{104:{l:{105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[10]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120081]}}}}},111:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{59:{c:[8288]}}}}}}}}}}},110:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{105:{l:{110:{l:{103:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[160]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8469]}}}}},116:{l:{59:{c:[10988]},67:{l:{111:{l:{110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8802]}}}}}}}}}}}}}}}}},117:{l:{112:{l:{67:{l:{97:{l:{112:{l:{59:{c:[8813]}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8713]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8800]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770,824]}}}}}}}}}}}}}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8708]}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8815]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8817]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807,824]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811,824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8825]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8821]}}}}}}}}}}}}}}}}}}}}}}}}},72:{l:{117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782,824]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783,824]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8938]},66:{l:{97:{l:{114:{l:{59:{c:[10703,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8940]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{59:{c:[8814]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8816]}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810,824]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8820]}}}}}}}}}}}}}}}}}}},78:{l:{101:{l:{115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{114:{l:{101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8832]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8928]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{101:{l:{118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8716]}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8939]},66:{l:{97:{l:{114:{l:{59:{c:[10704,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8930]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8931]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8840]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8833]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8929]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831,824]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8841]}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8769]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8772]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8775]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8777]}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8740]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119977]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[209]}},c:[209]}}}}}}}}},117:{l:{59:{c:[925]}}}}},79:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[338]}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[211]}},c:[211]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[212]}},c:[212]}}}}},121:{l:{59:{c:[1054]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[336]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120082]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[210]}},c:[210]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[332]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[937]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[927]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120134]}}}}}}},112:{l:{101:{l:{110:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8220]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8216]}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{59:{c:[10836]}}},115:{l:{99:{l:{114:{l:{59:{c:[119978]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[216]}},c:[216]}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[213]}},c:[213]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[10807]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[214]}},c:[214]}}}}},118:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8254]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9182]}}},107:{l:{101:{l:{116:{l:{59:{c:[9140]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9180]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8706]}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1055]}}}}},102:{l:{114:{l:{59:{c:[120083]}}}}},104:{l:{105:{l:{59:{c:[934]}}}}},105:{l:{59:{c:[928]}}},108:{l:{117:{l:{115:{l:{77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[177]}}}}}}}}}}}}}}}}},111:{l:{105:{l:{110:{l:{99:{l:{97:{l:{114:{l:{101:{l:{112:{l:{108:{l:{97:{l:{110:{l:{101:{l:{59:{c:[8460]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8473]}}}}}}},114:{l:{59:{c:[10939]},101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8826]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8828]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8830]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8243]}}}}}}},111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8719]}}}}}}}}},112:{l:{111:{l:{114:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8759]},97:{l:{108:{l:{59:{c:[8733]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119979]}}}}},105:{l:{59:{c:[936]}}}}}}},81:{l:{85:{l:{79:{l:{84:{l:{59:{c:[34]}},c:[34]}}}}},102:{l:{114:{l:{59:{c:[120084]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8474]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119980]}}}}}}}}},82:{l:{66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10512]}}}}}}}}},69:{l:{71:{l:{59:{c:[174]}},c:[174]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[340]}}}}}}}}},110:{l:{103:{l:{59:{c:[10219]}}}}},114:{l:{114:{l:{59:{c:[8608]},116:{l:{108:{l:{59:{c:[10518]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[344]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[342]}}}}}}}}},121:{l:{59:{c:[1056]}}}}},101:{l:{59:{c:[8476]},118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10607]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8476]}}}}},104:{l:{111:{l:{59:{c:[929]}}}}},105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10217]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},66:{l:{97:{l:{114:{l:{59:{c:[8677]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8644]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8969]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10215]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10589]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8642]},66:{l:{97:{l:{114:{l:{59:{c:[10581]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8866]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8614]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10587]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8883]},66:{l:{97:{l:{114:{l:{59:{c:[10704]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10575]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10588]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8638]},66:{l:{97:{l:{114:{l:{59:{c:[10580]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8640]},66:{l:{97:{l:{114:{l:{59:{c:[10579]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8477]}}}}},117:{l:{110:{l:{100:{l:{73:{l:{109:{l:{112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[10608]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8667]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8475]}}}}},104:{l:{59:{c:[8625]}}}}},117:{l:{108:{l:{101:{l:{68:{l:{101:{l:{108:{l:{97:{l:{121:{l:{101:{l:{100:{l:{59:{c:[10740]}}}}}}}}}}}}}}}}}}}}}}},83:{l:{72:{l:{67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1065]}}}}}}}}},99:{l:{121:{l:{59:{c:[1064]}}}}}}},79:{l:{70:{l:{84:{l:{99:{l:{121:{l:{59:{c:[1068]}}}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[346]}}}}}}}}}}},99:{l:{59:{c:[10940]},97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[352]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[350]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[348]}}}}}}},121:{l:{59:{c:[1057]}}}}},102:{l:{114:{l:{59:{c:[120086]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[931]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{67:{l:{105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{59:{c:[8728]}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120138]}}}}}}},113:{l:{114:{l:{116:{l:{59:{c:[8730]}}}}},117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9633]},73:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8851]}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8849]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{110:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8852]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119982]}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[8902]}}}}}}},117:{l:{98:{l:{59:{c:[8912]},115:{l:{101:{l:{116:{l:{59:{c:[8912]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8838]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8827]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8829]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831]}}}}}}}}}}}}}}}}}}}}},104:{l:{84:{l:{104:{l:{97:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},109:{l:{59:{c:[8721]}}},112:{l:{59:{c:[8913]},101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8839]}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8913]}}}}}}}}}}}}},84:{l:{72:{l:{79:{l:{82:{l:{78:{l:{59:{c:[222]}},c:[222]}}}}}}},82:{l:{65:{l:{68:{l:{69:{l:{59:{c:[8482]}}}}}}}}},83:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1035]}}}}}}},99:{l:{121:{l:{59:{c:[1062]}}}}}}},97:{l:{98:{l:{59:{c:[9]}}},117:{l:{59:{c:[932]}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[356]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[354]}}}}}}}}},121:{l:{59:{c:[1058]}}}}},102:{l:{114:{l:{59:{c:[120087]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[920]}}}}}}},105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287,8202]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8201]}}}}}}}}}}}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8764]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8771]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8773]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8776]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120139]}}}}}}},114:{l:{105:{l:{112:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119983]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[358]}}}}}}}}}}}}},85:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[218]}},c:[218]}}}}}}},114:{l:{114:{l:{59:{c:[8607]},111:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10569]}}}}}}}}}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1038]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[364]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[219]}},c:[219]}}}}},121:{l:{59:{c:[1059]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[368]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120088]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[217]}},c:[217]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[362]}}}}}}}}},110:{l:{100:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[95]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9183]}}},107:{l:{101:{l:{116:{l:{59:{c:[9141]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9181]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{111:{l:{110:{l:{59:{c:[8899]},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[370]}}}}}}},112:{l:{102:{l:{59:{c:[120140]}}}}}}},112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]},66:{l:{97:{l:{114:{l:{59:{c:[10514]}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8645]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10606]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8869]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8613]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{105:{l:{59:{c:[978]},108:{l:{111:{l:{110:{l:{59:{c:[933]}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[366]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119984]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[360]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[220]}},c:[220]}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8875]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[10987]}}}}}}},99:{l:{121:{l:{59:{c:[1042]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8873]},108:{l:{59:{c:[10982]}}}}}}}}}}},101:{l:{101:{l:{59:{c:[8897]}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8214]}}}}}}},116:{l:{59:{c:[8214]},105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8739]}}}}}}},76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[124]}}}}}}}}},83:{l:{101:{l:{112:{l:{97:{l:{114:{l:{97:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10072]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8768]}}}}}}}}}}}}}}}}}}}}},121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8202]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120089]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120141]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119985]}}}}}}},118:{l:{100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8874]}}}}}}}}}}}}},87:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[372]}}}}}}}}},101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}},102:{l:{114:{l:{59:{c:[120090]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120142]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119986]}}}}}}}}},88:{l:{102:{l:{114:{l:{59:{c:[120091]}}}}},105:{l:{59:{c:[926]}}},111:{l:{112:{l:{102:{l:{59:{c:[120143]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119987]}}}}}}}}},89:{l:{65:{l:{99:{l:{121:{l:{59:{c:[1071]}}}}}}},73:{l:{99:{l:{121:{l:{59:{c:[1031]}}}}}}},85:{l:{99:{l:{121:{l:{59:{c:[1070]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[221]}},c:[221]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[374]}}}}}}},121:{l:{59:{c:[1067]}}}}},102:{l:{114:{l:{59:{c:[120092]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120144]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119988]}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[376]}}}}}}}}},90:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1046]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[377]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[381]}}}}}}}}},121:{l:{59:{c:[1047]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[379]}}}}}}},101:{l:{114:{l:{111:{l:{87:{l:{105:{l:{100:{l:{116:{l:{104:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[918]}}}}}}},102:{l:{114:{l:{59:{c:[8488]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8484]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119989]}}}}}}}}},97:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[225]}},c:[225]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[259]}}}}}}}}}}},99:{l:{59:{c:[8766]},69:{l:{59:{c:[8766,819]}}},100:{l:{59:{c:[8767]}}},105:{l:{114:{l:{99:{l:{59:{c:[226]}},c:[226]}}}}},117:{l:{116:{l:{101:{l:{59:{c:[180]}},c:[180]}}}}},121:{l:{59:{c:[1072]}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[230]}},c:[230]}}}}}}},102:{l:{59:{c:[8289]},114:{l:{59:{c:[120094]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[224]}},c:[224]}}}}}}}}},108:{l:{101:{l:{102:{l:{115:{l:{121:{l:{109:{l:{59:{c:[8501]}}}}}}}}},112:{l:{104:{l:{59:{c:[8501]}}}}}}},112:{l:{104:{l:{97:{l:{59:{c:[945]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[257]}}}}},108:{l:{103:{l:{59:{c:[10815]}}}}}}},112:{l:{59:{c:[38]}},c:[38]}}},110:{l:{100:{l:{59:{c:[8743]},97:{l:{110:{l:{100:{l:{59:{c:[10837]}}}}}}},100:{l:{59:{c:[10844]}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10840]}}}}}}}}}}},118:{l:{59:{c:[10842]}}}}},103:{l:{59:{c:[8736]},101:{l:{59:{c:[10660]}}},108:{l:{101:{l:{59:{c:[8736]}}}}},109:{l:{115:{l:{100:{l:{59:{c:[8737]},97:{l:{97:{l:{59:{c:[10664]}}},98:{l:{59:{c:[10665]}}},99:{l:{59:{c:[10666]}}},100:{l:{59:{c:[10667]}}},101:{l:{59:{c:[10668]}}},102:{l:{59:{c:[10669]}}},103:{l:{59:{c:[10670]}}},104:{l:{59:{c:[10671]}}}}}}}}}}},114:{l:{116:{l:{59:{c:[8735]},118:{l:{98:{l:{59:{c:[8894]},100:{l:{59:{c:[10653]}}}}}}}}}}},115:{l:{112:{l:{104:{l:{59:{c:[8738]}}}}},116:{l:{59:{c:[197]}}}}},122:{l:{97:{l:{114:{l:{114:{l:{59:{c:[9084]}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[261]}}}}}}},112:{l:{102:{l:{59:{c:[120146]}}}}}}},112:{l:{59:{c:[8776]},69:{l:{59:{c:[10864]}}},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10863]}}}}}}}}},101:{l:{59:{c:[8778]}}},105:{l:{100:{l:{59:{c:[8779]}}}}},111:{l:{115:{l:{59:{c:[39]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8778]}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[229]}},c:[229]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119990]}}}}},116:{l:{59:{c:[42]}}},121:{l:{109:{l:{112:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8781]}}}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[227]}},c:[227]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[228]}},c:[228]}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8755]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10769]}}}}}}}}}}},98:{l:{78:{l:{111:{l:{116:{l:{59:{c:[10989]}}}}}}},97:{l:{99:{l:{107:{l:{99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}}}},101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1014]}}}}}}}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8765]},101:{l:{113:{l:{59:{c:[8909]}}}}}}}}}}}}}}},114:{l:{118:{l:{101:{l:{101:{l:{59:{c:[8893]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8965]},103:{l:{101:{l:{59:{c:[8965]}}}}}}}}}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9141]},116:{l:{98:{l:{114:{l:{107:{l:{59:{c:[9142]}}}}}}}}}}}}}}},99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}},121:{l:{59:{c:[1073]}}}}},100:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8222]}}}}}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{59:{c:[8757]},101:{l:{59:{c:[8757]}}}}}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10672]}}}}}}}}}}},112:{l:{115:{l:{105:{l:{59:{c:[1014]}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{59:{c:[8492]}}}}}}}}},116:{l:{97:{l:{59:{c:[946]}}},104:{l:{59:{c:[8502]}}},119:{l:{101:{l:{101:{l:{110:{l:{59:{c:[8812]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120095]}}}}},105:{l:{103:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10754]}}}}}}}}}}}}},115:{l:{113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9733]}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9661]}}}}}}}}},117:{l:{112:{l:{59:{c:[9651]}}}}}}}}}}}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}}}},107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10509]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{107:{l:{108:{l:{111:{l:{122:{l:{101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[10731]}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9652]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9662]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9666]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9656]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{107:{l:{59:{c:[9251]}}}}}}},107:{l:{49:{l:{50:{l:{59:{c:[9618]}}},52:{l:{59:{c:[9617]}}}}},51:{l:{52:{l:{59:{c:[9619]}}}}}}},111:{l:{99:{l:{107:{l:{59:{c:[9608]}}}}}}}}},110:{l:{101:{l:{59:{c:[61,8421]},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8801,8421]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[8976]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120147]}}}}},116:{l:{59:{c:[8869]},116:{l:{111:{l:{109:{l:{59:{c:[8869]}}}}}}}}},119:{l:{116:{l:{105:{l:{101:{l:{59:{c:[8904]}}}}}}}}},120:{l:{68:{l:{76:{l:{59:{c:[9559]}}},82:{l:{59:{c:[9556]}}},108:{l:{59:{c:[9558]}}},114:{l:{59:{c:[9555]}}}}},72:{l:{59:{c:[9552]},68:{l:{59:{c:[9574]}}},85:{l:{59:{c:[9577]}}},100:{l:{59:{c:[9572]}}},117:{l:{59:{c:[9575]}}}}},85:{l:{76:{l:{59:{c:[9565]}}},82:{l:{59:{c:[9562]}}},108:{l:{59:{c:[9564]}}},114:{l:{59:{c:[9561]}}}}},86:{l:{59:{c:[9553]},72:{l:{59:{c:[9580]}}},76:{l:{59:{c:[9571]}}},82:{l:{59:{c:[9568]}}},104:{l:{59:{c:[9579]}}},108:{l:{59:{c:[9570]}}},114:{l:{59:{c:[9567]}}}}},98:{l:{111:{l:{120:{l:{59:{c:[10697]}}}}}}},100:{l:{76:{l:{59:{c:[9557]}}},82:{l:{59:{c:[9554]}}},108:{l:{59:{c:[9488]}}},114:{l:{59:{c:[9484]}}}}},104:{l:{59:{c:[9472]},68:{l:{59:{c:[9573]}}},85:{l:{59:{c:[9576]}}},100:{l:{59:{c:[9516]}}},117:{l:{59:{c:[9524]}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8863]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8862]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8864]}}}}}}}}}}},117:{l:{76:{l:{59:{c:[9563]}}},82:{l:{59:{c:[9560]}}},108:{l:{59:{c:[9496]}}},114:{l:{59:{c:[9492]}}}}},118:{l:{59:{c:[9474]},72:{l:{59:{c:[9578]}}},76:{l:{59:{c:[9569]}}},82:{l:{59:{c:[9566]}}},104:{l:{59:{c:[9532]}}},108:{l:{59:{c:[9508]}}},114:{l:{59:{c:[9500]}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[166]}},c:[166]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119991]}}}}},101:{l:{109:{l:{105:{l:{59:{c:[8271]}}}}}}},105:{l:{109:{l:{59:{c:[8765]},101:{l:{59:{c:[8909]}}}}}}},111:{l:{108:{l:{59:{c:[92]},98:{l:{59:{c:[10693]}}},104:{l:{115:{l:{117:{l:{98:{l:{59:{c:[10184]}}}}}}}}}}}}}}},117:{l:{108:{l:{108:{l:{59:{c:[8226]},101:{l:{116:{l:{59:{c:[8226]}}}}}}}}},109:{l:{112:{l:{59:{c:[8782]},69:{l:{59:{c:[10926]}}},101:{l:{59:{c:[8783]},113:{l:{59:{c:[8783]}}}}}}}}}}}}},99:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[263]}}}}}}}}},112:{l:{59:{c:[8745]},97:{l:{110:{l:{100:{l:{59:{c:[10820]}}}}}}},98:{l:{114:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10825]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10827]}}}}},117:{l:{112:{l:{59:{c:[10823]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10816]}}}}}}},115:{l:{59:{c:[8745,65024]}}}}},114:{l:{101:{l:{116:{l:{59:{c:[8257]}}}}},111:{l:{110:{l:{59:{c:[711]}}}}}}}}},99:{l:{97:{l:{112:{l:{115:{l:{59:{c:[10829]}}}}},114:{l:{111:{l:{110:{l:{59:{c:[269]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[231]}},c:[231]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[265]}}}}}}},117:{l:{112:{l:{115:{l:{59:{c:[10828]},115:{l:{109:{l:{59:{c:[10832]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[267]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[184]}},c:[184]}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10674]}}}}}}}}}}},110:{l:{116:{l:{59:{c:[162]},101:{l:{114:{l:{100:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}},c:[162]}}}}},102:{l:{114:{l:{59:{c:[120096]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1095]}}}}},101:{l:{99:{l:{107:{l:{59:{c:[10003]},109:{l:{97:{l:{114:{l:{107:{l:{59:{c:[10003]}}}}}}}}}}}}}}},105:{l:{59:{c:[967]}}}}},105:{l:{114:{l:{59:{c:[9675]},69:{l:{59:{c:[10691]}}},99:{l:{59:{c:[710]},101:{l:{113:{l:{59:{c:[8791]}}}}},108:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8634]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8635]}}}}}}}}}}}}}}}}}}}}},100:{l:{82:{l:{59:{c:[174]}}},83:{l:{59:{c:[9416]}}},97:{l:{115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8858]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}}}}}}}}}}}},101:{l:{59:{c:[8791]}}},102:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10768]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[10991]}}}}}}},115:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10690]}}}}}}}}}}}}},108:{l:{117:{l:{98:{l:{115:{l:{59:{c:[9827]},117:{l:{105:{l:{116:{l:{59:{c:[9827]}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[58]},101:{l:{59:{c:[8788]},113:{l:{59:{c:[8788]}}}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[44]},116:{l:{59:{c:[64]}}}}}}},112:{l:{59:{c:[8705]},102:{l:{110:{l:{59:{c:[8728]}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8705]}}}}}}}}},120:{l:{101:{l:{115:{l:{59:{c:[8450]}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[8773]},100:{l:{111:{l:{116:{l:{59:{c:[10861]}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}}}},112:{l:{102:{l:{59:{c:[120148]}}},114:{l:{111:{l:{100:{l:{59:{c:[8720]}}}}}}},121:{l:{59:{c:[169]},115:{l:{114:{l:{59:{c:[8471]}}}}}},c:[169]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8629]}}}}}}},111:{l:{115:{l:{115:{l:{59:{c:[10007]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119992]}}}}},117:{l:{98:{l:{59:{c:[10959]},101:{l:{59:{c:[10961]}}}}},112:{l:{59:{c:[10960]},101:{l:{59:{c:[10962]}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8943]}}}}}}}}},117:{l:{100:{l:{97:{l:{114:{l:{114:{l:{108:{l:{59:{c:[10552]}}},114:{l:{59:{c:[10549]}}}}}}}}}}},101:{l:{112:{l:{114:{l:{59:{c:[8926]}}}}},115:{l:{99:{l:{59:{c:[8927]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8630]},112:{l:{59:{c:[10557]}}}}}}}}}}},112:{l:{59:{c:[8746]},98:{l:{114:{l:{99:{l:{97:{l:{112:{l:{59:{c:[10824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10822]}}}}},117:{l:{112:{l:{59:{c:[10826]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8845]}}}}}}},111:{l:{114:{l:{59:{c:[10821]}}}}},115:{l:{59:{c:[8746,65024]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8631]},109:{l:{59:{c:[10556]}}}}}}}}},108:{l:{121:{l:{101:{l:{113:{l:{112:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8926]}}}}}}}}},115:{l:{117:{l:{99:{l:{99:{l:{59:{c:[8927]}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8911]}}}}}}}}}}}}}}},114:{l:{101:{l:{110:{l:{59:{c:[164]}},c:[164]}}}}},118:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8630]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8631]}}}}}}}}}}}}}}}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8911]}}}}}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8754]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8753]}}}}}}}}},121:{l:{108:{l:{99:{l:{116:{l:{121:{l:{59:{c:[9005]}}}}}}}}}}}}},100:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8659]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10597]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8224]}}}}}}}}},108:{l:{101:{l:{116:{l:{104:{l:{59:{c:[8504]}}}}}}}}},114:{l:{114:{l:{59:{c:[8595]}}}}},115:{l:{104:{l:{59:{c:[8208]},118:{l:{59:{c:[8867]}}}}}}}}},98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10511]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{59:{c:[733]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[271]}}}}}}}}},121:{l:{59:{c:[1076]}}}}},100:{l:{59:{c:[8518]},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8650]}}}}}}},111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[10871]}}}}}}}}}}}}},101:{l:{103:{l:{59:{c:[176]}},c:[176]},108:{l:{116:{l:{97:{l:{59:{c:[948]}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10673]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10623]}}}}}}}}},114:{l:{59:{c:[120097]}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8643]}}},114:{l:{59:{c:[8642]}}}}}}}}},105:{l:{97:{l:{109:{l:{59:{c:[8900]},111:{l:{110:{l:{100:{l:{59:{c:[8900]},115:{l:{117:{l:{105:{l:{116:{l:{59:{c:[9830]}}}}}}}}}}}}}}},115:{l:{59:{c:[9830]}}}}}}},101:{l:{59:{c:[168]}}},103:{l:{97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[989]}}}}}}}}}}},115:{l:{105:{l:{110:{l:{59:{c:[8946]}}}}}}},118:{l:{59:{c:[247]},105:{l:{100:{l:{101:{l:{59:{c:[247]},111:{l:{110:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8903]}}}}}}}}}}}}}}}},c:[247]}}}}},111:{l:{110:{l:{120:{l:{59:{c:[8903]}}}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1106]}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8990]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8973]}}}}}}}}}}},111:{l:{108:{l:{108:{l:{97:{l:{114:{l:{59:{c:[36]}}}}}}}}},112:{l:{102:{l:{59:{c:[120149]}}}}},116:{l:{59:{c:[729]},101:{l:{113:{l:{59:{c:[8784]},100:{l:{111:{l:{116:{l:{59:{c:[8785]}}}}}}}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8760]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8724]}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8865]}}}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{98:{l:{97:{l:{114:{l:{119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8966]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8650]}}}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8643]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10512]}}}}}}}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8991]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8972]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119993]}}},121:{l:{59:{c:[1109]}}}}},111:{l:{108:{l:{59:{c:[10742]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[273]}}}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8945]}}}}}}},114:{l:{105:{l:{59:{c:[9663]},102:{l:{59:{c:[9662]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8693]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10607]}}}}}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10662]}}}}}}}}}}}}},122:{l:{99:{l:{121:{l:{59:{c:[1119]}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10239]}}}}}}}}}}}}}}}}},101:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[10871]}}}}}}},111:{l:{116:{l:{59:{c:[8785]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[233]}},c:[233]}}}}}}},115:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10862]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[283]}}}}}}}}},105:{l:{114:{l:{59:{c:[8790]},99:{l:{59:{c:[234]}},c:[234]}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}},121:{l:{59:{c:[1101]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[279]}}}}}}},101:{l:{59:{c:[8519]}}},102:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8786]}}}}}}},114:{l:{59:{c:[120098]}}}}},103:{l:{59:{c:[10906]},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[232]}},c:[232]}}}}}}},115:{l:{59:{c:[10902]},100:{l:{111:{l:{116:{l:{59:{c:[10904]}}}}}}}}}}},108:{l:{59:{c:[10905]},105:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{59:{c:[9191]}}}}}}}}}}}}},108:{l:{59:{c:[8467]}}},115:{l:{59:{c:[10901]},100:{l:{111:{l:{116:{l:{59:{c:[10903]}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[275]}}}}}}},112:{l:{116:{l:{121:{l:{59:{c:[8709]},115:{l:{101:{l:{116:{l:{59:{c:[8709]}}}}}}},118:{l:{59:{c:[8709]}}}}}}}}},115:{l:{112:{l:{49:{l:{51:{l:{59:{c:[8196]}}},52:{l:{59:{c:[8197]}}}}},59:{c:[8195]}}}}}}},110:{l:{103:{l:{59:{c:[331]}}},115:{l:{112:{l:{59:{c:[8194]}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[281]}}}}}}},112:{l:{102:{l:{59:{c:[120150]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8917]},115:{l:{108:{l:{59:{c:[10723]}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[10865]}}}}}}},115:{l:{105:{l:{59:{c:[949]},108:{l:{111:{l:{110:{l:{59:{c:[949]}}}}}}},118:{l:{59:{c:[1013]}}}}}}}}},113:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8790]}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8770]}}}}},108:{l:{97:{l:{110:{l:{116:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10902]}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10901]}}}}}}}}}}}}}}}}}}},117:{l:{97:{l:{108:{l:{115:{l:{59:{c:[61]}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[8799]}}}}}}},105:{l:{118:{l:{59:{c:[8801]},68:{l:{68:{l:{59:{c:[10872]}}}}}}}}}}},118:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10725]}}}}}}}}}}}}}}},114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8787]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10609]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8495]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784]}}}}}}},105:{l:{109:{l:{59:{c:[8770]}}}}}}},116:{l:{97:{l:{59:{c:[951]}}},104:{l:{59:{c:[240]}},c:[240]}}},117:{l:{109:{l:{108:{l:{59:{c:[235]}},c:[235]}}},114:{l:{111:{l:{59:{c:[8364]}}}}}}},120:{l:{99:{l:{108:{l:{59:{c:[33]}}}}},105:{l:{115:{l:{116:{l:{59:{c:[8707]}}}}}}},112:{l:{101:{l:{99:{l:{116:{l:{97:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8496]}}}}}}}}}}}}}}}}},111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{101:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{97:{l:{108:{l:{108:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8786]}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1092]}}}}},101:{l:{109:{l:{97:{l:{108:{l:{101:{l:{59:{c:[9792]}}}}}}}}}}},102:{l:{105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64259]}}}}}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64256]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64260]}}}}}}}}},114:{l:{59:{c:[120099]}}}}},105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64257]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[102,106]}}}}}}}}},108:{l:{97:{l:{116:{l:{59:{c:[9837]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64258]}}}}}}},116:{l:{110:{l:{115:{l:{59:{c:[9649]}}}}}}}}},110:{l:{111:{l:{102:{l:{59:{c:[402]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120151]}}}}},114:{l:{97:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}},107:{l:{59:{c:[8916]},118:{l:{59:{c:[10969]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10765]}}}}}}}}}}}}}}},114:{l:{97:{l:{99:{l:{49:{l:{50:{l:{59:{c:[189]}},c:[189]},51:{l:{59:{c:[8531]}}},52:{l:{59:{c:[188]}},c:[188]},53:{l:{59:{c:[8533]}}},54:{l:{59:{c:[8537]}}},56:{l:{59:{c:[8539]}}}}},50:{l:{51:{l:{59:{c:[8532]}}},53:{l:{59:{c:[8534]}}}}},51:{l:{52:{l:{59:{c:[190]}},c:[190]},53:{l:{59:{c:[8535]}}},56:{l:{59:{c:[8540]}}}}},52:{l:{53:{l:{59:{c:[8536]}}}}},53:{l:{54:{l:{59:{c:[8538]}}},56:{l:{59:{c:[8541]}}}}},55:{l:{56:{l:{59:{c:[8542]}}}}}}},115:{l:{108:{l:{59:{c:[8260]}}}}}}},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119995]}}}}}}}}},103:{l:{69:{l:{59:{c:[8807]},108:{l:{59:{c:[10892]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[501]}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[947]},100:{l:{59:{c:[989]}}}}}}}}},112:{l:{59:{c:[10886]}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[287]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[285]}}}}}}},121:{l:{59:{c:[1075]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[289]}}}}}}},101:{l:{59:{c:[8805]},108:{l:{59:{c:[8923]}}},113:{l:{59:{c:[8805]},113:{l:{59:{c:[8807]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878]}}}}}}}}}}}}},115:{l:{59:{c:[10878]},99:{l:{99:{l:{59:{c:[10921]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10880]},111:{l:{59:{c:[10882]},108:{l:{59:{c:[10884]}}}}}}}}}}},108:{l:{59:{c:[8923,65024]},101:{l:{115:{l:{59:{c:[10900]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120100]}}}}},103:{l:{59:{c:[8811]},103:{l:{59:{c:[8921]}}}}},105:{l:{109:{l:{101:{l:{108:{l:{59:{c:[8503]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1107]}}}}}}},108:{l:{59:{c:[8823]},69:{l:{59:{c:[10898]}}},97:{l:{59:{c:[10917]}}},106:{l:{59:{c:[10916]}}}}},110:{l:{69:{l:{59:{c:[8809]}}},97:{l:{112:{l:{59:{c:[10890]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10890]}}}}}}}}}}}}},101:{l:{59:{c:[10888]},113:{l:{59:{c:[10888]},113:{l:{59:{c:[8809]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8935]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120152]}}}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8458]}}}}},105:{l:{109:{l:{59:{c:[8819]},101:{l:{59:{c:[10894]}}},108:{l:{59:{c:[10896]}}}}}}}}},116:{l:{59:{c:[62]},99:{l:{99:{l:{59:{c:[10919]}}},105:{l:{114:{l:{59:{c:[10874]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},108:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10645]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10876]}}}}}}}}}}},114:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10886]}}}}}}}}}}},114:{l:{114:{l:{59:{c:[10616]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},101:{l:{113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}},113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10892]}}}}}}}}}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8819]}}}}}}}}}},c:[62]},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8809,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8809,65024]}}}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8660]}}}}}}},97:{l:{105:{l:{114:{l:{115:{l:{112:{l:{59:{c:[8202]}}}}}}}}},108:{l:{102:{l:{59:{c:[189]}}}}},109:{l:{105:{l:{108:{l:{116:{l:{59:{c:[8459]}}}}}}}}},114:{l:{100:{l:{99:{l:{121:{l:{59:{c:[1098]}}}}}}},114:{l:{59:{c:[8596]},99:{l:{105:{l:{114:{l:{59:{c:[10568]}}}}}}},119:{l:{59:{c:[8621]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[8463]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[293]}}}}}}}}},101:{l:{97:{l:{114:{l:{116:{l:{115:{l:{59:{c:[9829]},117:{l:{105:{l:{116:{l:{59:{c:[9829]}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8230]}}}}}}}}},114:{l:{99:{l:{111:{l:{110:{l:{59:{c:[8889]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120101]}}}}},107:{l:{115:{l:{101:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10533]}}}}}}}}}}},119:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10534]}}}}}}}}}}}}}}},111:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8703]}}}}}}},109:{l:{116:{l:{104:{l:{116:{l:{59:{c:[8763]}}}}}}}}},111:{l:{107:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8617]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8618]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120153]}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8213]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119997]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8463]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[295]}}}}}}}}}}},121:{l:{98:{l:{117:{l:{108:{l:{108:{l:{59:{c:[8259]}}}}}}}}},112:{l:{104:{l:{101:{l:{110:{l:{59:{c:[8208]}}}}}}}}}}}}},105:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[237]}},c:[237]}}}}}}}}},99:{l:{59:{c:[8291]},105:{l:{114:{l:{99:{l:{59:{c:[238]}},c:[238]}}}}},121:{l:{59:{c:[1080]}}}}},101:{l:{99:{l:{121:{l:{59:{c:[1077]}}}}},120:{l:{99:{l:{108:{l:{59:{c:[161]}},c:[161]}}}}}}},102:{l:{102:{l:{59:{c:[8660]}}},114:{l:{59:{c:[120102]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[236]}},c:[236]}}}}}}}}},105:{l:{59:{c:[8520]},105:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10716]}}}}}}}}},111:{l:{116:{l:{97:{l:{59:{c:[8489]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[307]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[299]}}}}},103:{l:{101:{l:{59:{c:[8465]}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8464]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8465]}}}}}}}}}}},116:{l:{104:{l:{59:{c:[305]}}}}}}},111:{l:{102:{l:{59:{c:[8887]}}}}},112:{l:{101:{l:{100:{l:{59:{c:[437]}}}}}}}}},110:{l:{59:{c:[8712]},99:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8453]}}}}}}}}},102:{l:{105:{l:{110:{l:{59:{c:[8734]},116:{l:{105:{l:{101:{l:{59:{c:[10717]}}}}}}}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[305]}}}}}}}}},116:{l:{59:{c:[8747]},99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}},101:{l:{103:{l:{101:{l:{114:{l:{115:{l:{59:{c:[8484]}}}}}}}}},114:{l:{99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}}}}}},108:{l:{97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10775]}}}}}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}}}}}},111:{l:{99:{l:{121:{l:{59:{c:[1105]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[303]}}}}}}},112:{l:{102:{l:{59:{c:[120154]}}}}},116:{l:{97:{l:{59:{c:[953]}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[191]}},c:[191]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119998]}}}}},105:{l:{110:{l:{59:{c:[8712]},69:{l:{59:{c:[8953]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949]}}}}}}},115:{l:{59:{c:[8948]},118:{l:{59:{c:[8947]}}}}},118:{l:{59:{c:[8712]}}}}}}}}},116:{l:{59:{c:[8290]},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[297]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1110]}}}}}}},109:{l:{108:{l:{59:{c:[239]}},c:[239]}}}}}}},106:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[309]}}}}}}},121:{l:{59:{c:[1081]}}}}},102:{l:{114:{l:{59:{c:[120103]}}}}},109:{l:{97:{l:{116:{l:{104:{l:{59:{c:[567]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120155]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119999]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1112]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1108]}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[954]},118:{l:{59:{c:[1008]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[311]}}}}}}}}},121:{l:{59:{c:[1082]}}}}},102:{l:{114:{l:{59:{c:[120104]}}}}},103:{l:{114:{l:{101:{l:{101:{l:{110:{l:{59:{c:[312]}}}}}}}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1093]}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1116]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120156]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120000]}}}}}}}}},108:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8666]}}}}}}},114:{l:{114:{l:{59:{c:[8656]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10523]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10510]}}}}}}}}},69:{l:{59:{c:[8806]},103:{l:{59:{c:[10891]}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10594]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[314]}}}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10676]}}}}}}}}}}}}},103:{l:{114:{l:{97:{l:{110:{l:{59:{c:[8466]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[955]}}}}}}}}},110:{l:{103:{l:{59:{c:[10216]},100:{l:{59:{c:[10641]}}},108:{l:{101:{l:{59:{c:[10216]}}}}}}}}},112:{l:{59:{c:[10885]}}},113:{l:{117:{l:{111:{l:{59:{c:[171]}},c:[171]}}}}},114:{l:{114:{l:{59:{c:[8592]},98:{l:{59:{c:[8676]},102:{l:{115:{l:{59:{c:[10527]}}}}}}},102:{l:{115:{l:{59:{c:[10525]}}}}},104:{l:{107:{l:{59:{c:[8617]}}}}},108:{l:{112:{l:{59:{c:[8619]}}}}},112:{l:{108:{l:{59:{c:[10553]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10611]}}}}}}},116:{l:{108:{l:{59:{c:[8610]}}}}}}}}},116:{l:{59:{c:[10923]},97:{l:{105:{l:{108:{l:{59:{c:[10521]}}}}}}},101:{l:{59:{c:[10925]},115:{l:{59:{c:[10925,65024]}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10508]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10098]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[123]}}},107:{l:{59:{c:[91]}}}}}}},107:{l:{101:{l:{59:{c:[10635]}}},115:{l:{108:{l:{100:{l:{59:{c:[10639]}}},117:{l:{59:{c:[10637]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[318]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[316]}}}}}}},105:{l:{108:{l:{59:{c:[8968]}}}}}}},117:{l:{98:{l:{59:{c:[123]}}}}},121:{l:{59:{c:[1083]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10550]}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8220]},114:{l:{59:{c:[8222]}}}}}}}}},114:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10599]}}}}}}}}},117:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10571]}}}}}}}}}}}}},115:{l:{104:{l:{59:{c:[8626]}}}}}}},101:{l:{59:{c:[8804]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8610]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8637]}}}}}}}}},117:{l:{112:{l:{59:{c:[8636]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8647]}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]},115:{l:{59:{c:[8646]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8621]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8907]}}}}}}}}}}}}}}}}}}}}}}}}},103:{l:{59:{c:[8922]}}},113:{l:{59:{c:[8804]},113:{l:{59:{c:[8806]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877]}}}}}}}}}}}}},115:{l:{59:{c:[10877]},99:{l:{99:{l:{59:{c:[10920]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10879]},111:{l:{59:{c:[10881]},114:{l:{59:{c:[10883]}}}}}}}}}}},103:{l:{59:{c:[8922,65024]},101:{l:{115:{l:{59:{c:[10899]}}}}}}},115:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10885]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},101:{l:{113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[8922]}}}}}}},113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10891]}}}}}}}}}}}}},103:{l:{116:{l:{114:{l:{59:{c:[8822]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8818]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10620]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}},114:{l:{59:{c:[120105]}}}}},103:{l:{59:{c:[8822]},69:{l:{59:{c:[10897]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8637]}}},117:{l:{59:{c:[8636]},108:{l:{59:{c:[10602]}}}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9604]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1113]}}}}}}},108:{l:{59:{c:[8810]},97:{l:{114:{l:{114:{l:{59:{c:[8647]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8990]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[10603]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9722]}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[320]}}}}}}}}},111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9136]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9136]}}}}}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808]}}},97:{l:{112:{l:{59:{c:[10889]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10889]}}}}}}}}}}}}},101:{l:{59:{c:[10887]},113:{l:{59:{c:[10887]},113:{l:{59:{c:[8808]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8934]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10220]}}}}},114:{l:{114:{l:{59:{c:[8701]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10214]}}}}}}},110:{l:{103:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{115:{l:{116:{l:{111:{l:{59:{c:[10236]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8619]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8620]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10629]}}}}},102:{l:{59:{c:[120157]}}},108:{l:{117:{l:{115:{l:{59:{c:[10797]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10804]}}}}}}}}}}},119:{l:{97:{l:{115:{l:{116:{l:{59:{c:[8727]}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[95]}}}}}}}}},122:{l:{59:{c:[9674]},101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[9674]}}}}}}}}},102:{l:{59:{c:[10731]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[40]},108:{l:{116:{l:{59:{c:[10643]}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8646]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8991]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8651]},100:{l:{59:{c:[10605]}}}}}}}}},109:{l:{59:{c:[8206]}}},116:{l:{114:{l:{105:{l:{59:{c:[8895]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8249]}}}}}}}}},99:{l:{114:{l:{59:{c:[120001]}}}}},104:{l:{59:{c:[8624]}}},105:{l:{109:{l:{59:{c:[8818]},101:{l:{59:{c:[10893]}}},103:{l:{59:{c:[10895]}}}}}}},113:{l:{98:{l:{59:{c:[91]}}},117:{l:{111:{l:{59:{c:[8216]},114:{l:{59:{c:[8218]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[322]}}}}}}}}}}},116:{l:{59:{c:[60]},99:{l:{99:{l:{59:{c:[10918]}}},105:{l:{114:{l:{59:{c:[10873]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8907]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8905]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10614]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10875]}}}}}}}}}}},114:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10646]}}}}}}},105:{l:{59:{c:[9667]},101:{l:{59:{c:[8884]}}},102:{l:{59:{c:[9666]}}}}}}}},c:[60]},117:{l:{114:{l:{100:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10570]}}}}}}}}}}},117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10598]}}}}}}}}}}}}},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8808,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808,65024]}}}}}}}}},109:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8762]}}}}}}}}},97:{l:{99:{l:{114:{l:{59:{c:[175]}},c:[175]}}},108:{l:{101:{l:{59:{c:[9794]}}},116:{l:{59:{c:[10016]},101:{l:{115:{l:{101:{l:{59:{c:[10016]}}}}}}}}}}},112:{l:{59:{c:[8614]},115:{l:{116:{l:{111:{l:{59:{c:[8614]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8615]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8612]}}}}}}}}},117:{l:{112:{l:{59:{c:[8613]}}}}}}}}}}}}},114:{l:{107:{l:{101:{l:{114:{l:{59:{c:[9646]}}}}}}}}}}},99:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[10793]}}}}}}}}},121:{l:{59:{c:[1084]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8212]}}}}}}}}},101:{l:{97:{l:{115:{l:{117:{l:{114:{l:{101:{l:{100:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8737]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120106]}}}}},104:{l:{111:{l:{59:{c:[8487]}}}}},105:{l:{99:{l:{114:{l:{111:{l:{59:{c:[181]}},c:[181]}}}}},100:{l:{59:{c:[8739]},97:{l:{115:{l:{116:{l:{59:{c:[42]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10992]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[183]}},c:[183]}}}}}}},110:{l:{117:{l:{115:{l:{59:{c:[8722]},98:{l:{59:{c:[8863]}}},100:{l:{59:{c:[8760]},117:{l:{59:{c:[10794]}}}}}}}}}}}}},108:{l:{99:{l:{112:{l:{59:{c:[10971]}}}}},100:{l:{114:{l:{59:{c:[8230]}}}}}}},110:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}},111:{l:{100:{l:{101:{l:{108:{l:{115:{l:{59:{c:[8871]}}}}}}}}},112:{l:{102:{l:{59:{c:[120158]}}}}}}},112:{l:{59:{c:[8723]}}},115:{l:{99:{l:{114:{l:{59:{c:[120002]}}}}},116:{l:{112:{l:{111:{l:{115:{l:{59:{c:[8766]}}}}}}}}}}},117:{l:{59:{c:[956]},108:{l:{116:{l:{105:{l:{109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}},110:{l:{71:{l:{103:{l:{59:{c:[8921,824]}}},116:{l:{59:{c:[8811,8402]},118:{l:{59:{c:[8811,824]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8653]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8654]}}}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{59:{c:[8920,824]}}},116:{l:{59:{c:[8810,8402]},118:{l:{59:{c:[8810,824]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8655]}}}}}}}}}}}}}}}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8879]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8878]}}}}}}}}}}},97:{l:{98:{l:{108:{l:{97:{l:{59:{c:[8711]}}}}}}},99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[324]}}}}}}}}},110:{l:{103:{l:{59:{c:[8736,8402]}}}}},112:{l:{59:{c:[8777]},69:{l:{59:{c:[10864,824]}}},105:{l:{100:{l:{59:{c:[8779,824]}}}}},111:{l:{115:{l:{59:{c:[329]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8777]}}}}}}}}}}},116:{l:{117:{l:{114:{l:{59:{c:[9838]},97:{l:{108:{l:{59:{c:[9838]},115:{l:{59:{c:[8469]}}}}}}}}}}}}}}},98:{l:{115:{l:{112:{l:{59:{c:[160]}},c:[160]}}},117:{l:{109:{l:{112:{l:{59:{c:[8782,824]},101:{l:{59:{c:[8783,824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10819]}}},114:{l:{111:{l:{110:{l:{59:{c:[328]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[326]}}}}}}}}},111:{l:{110:{l:{103:{l:{59:{c:[8775]},100:{l:{111:{l:{116:{l:{59:{c:[10861,824]}}}}}}}}}}}}},117:{l:{112:{l:{59:{c:[10818]}}}}},121:{l:{59:{c:[1085]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8211]}}}}}}}}},101:{l:{59:{c:[8800]},65:{l:{114:{l:{114:{l:{59:{c:[8663]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10532]}}}}},114:{l:{59:{c:[8599]},111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784,824]}}}}}}},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8802]}}}}}}}}},115:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10536]}}}}}}},105:{l:{109:{l:{59:{c:[8770,824]}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{59:{c:[8708]},115:{l:{59:{c:[8708]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120107]}}}}},103:{l:{69:{l:{59:{c:[8807,824]}}},101:{l:{59:{c:[8817]},113:{l:{59:{c:[8817]},113:{l:{59:{c:[8807,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878,824]}}}}}}}}}}}}},115:{l:{59:{c:[10878,824]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8821]}}}}}}},116:{l:{59:{c:[8815]},114:{l:{59:{c:[8815]}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8654]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8622]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10994]}}}}}}}}},105:{l:{59:{c:[8715]},115:{l:{59:{c:[8956]},100:{l:{59:{c:[8954]}}}}},118:{l:{59:{c:[8715]}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1114]}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8653]}}}}}}},69:{l:{59:{c:[8806,824]}}},97:{l:{114:{l:{114:{l:{59:{c:[8602]}}}}}}},100:{l:{114:{l:{59:{c:[8229]}}}}},101:{l:{59:{c:[8816]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8602]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8622]}}}}}}}}}}}}}}}}}}}}}}}}},113:{l:{59:{c:[8816]},113:{l:{59:{c:[8806,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877,824]}}}}}}}}}}}}},115:{l:{59:{c:[10877,824]},115:{l:{59:{c:[8814]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8820]}}}}}}},116:{l:{59:{c:[8814]},114:{l:{105:{l:{59:{c:[8938]},101:{l:{59:{c:[8940]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120159]}}}}},116:{l:{59:{c:[172]},105:{l:{110:{l:{59:{c:[8713]},69:{l:{59:{c:[8953,824]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949,824]}}}}}}},118:{l:{97:{l:{59:{c:[8713]}}},98:{l:{59:{c:[8951]}}},99:{l:{59:{c:[8950]}}}}}}}}},110:{l:{105:{l:{59:{c:[8716]},118:{l:{97:{l:{59:{c:[8716]}}},98:{l:{59:{c:[8958]}}},99:{l:{59:{c:[8957]}}}}}}}}}},c:[172]}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]},97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}},115:{l:{108:{l:{59:{c:[11005,8421]}}}}},116:{l:{59:{c:[8706,824]}}}}}}},111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10772]}}}}}}}}}}},114:{l:{59:{c:[8832]},99:{l:{117:{l:{101:{l:{59:{c:[8928]}}}}}}},101:{l:{59:{c:[10927,824]},99:{l:{59:{c:[8832]},101:{l:{113:{l:{59:{c:[10927,824]}}}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8655]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8603]},99:{l:{59:{c:[10547,824]}}},119:{l:{59:{c:[8605,824]}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8603]}}}}}}}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[8939]},101:{l:{59:{c:[8941]}}}}}}}}}}},115:{l:{99:{l:{59:{c:[8833]},99:{l:{117:{l:{101:{l:{59:{c:[8929]}}}}}}},101:{l:{59:{c:[10928,824]}}},114:{l:{59:{c:[120003]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[8769]},101:{l:{59:{c:[8772]},113:{l:{59:{c:[8772]}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}},113:{l:{115:{l:{117:{l:{98:{l:{101:{l:{59:{c:[8930]}}}}},112:{l:{101:{l:{59:{c:[8931]}}}}}}}}}}},117:{l:{98:{l:{59:{c:[8836]},69:{l:{59:{c:[10949,824]}}},101:{l:{59:{c:[8840]}}},115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},101:{l:{113:{l:{59:{c:[8840]},113:{l:{59:{c:[10949,824]}}}}}}}}}}}}}}},99:{l:{99:{l:{59:{c:[8833]},101:{l:{113:{l:{59:{c:[10928,824]}}}}}}}}},112:{l:{59:{c:[8837]},69:{l:{59:{c:[10950,824]}}},101:{l:{59:{c:[8841]}}},115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},101:{l:{113:{l:{59:{c:[8841]},113:{l:{59:{c:[10950,824]}}}}}}}}}}}}}}}}}}},116:{l:{103:{l:{108:{l:{59:{c:[8825]}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[241]}},c:[241]}}}}}}},108:{l:{103:{l:{59:{c:[8824]}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8938]},101:{l:{113:{l:{59:{c:[8940]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8939]},101:{l:{113:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{59:{c:[957]},109:{l:{59:{c:[35]},101:{l:{114:{l:{111:{l:{59:{c:[8470]}}}}}}},115:{l:{112:{l:{59:{c:[8199]}}}}}}}}},118:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8877]}}}}}}}}},72:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10500]}}}}}}}}},97:{l:{112:{l:{59:{c:[8781,8402]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8876]}}}}}}}}},103:{l:{101:{l:{59:{c:[8805,8402]}}},116:{l:{59:{c:[62,8402]}}}}},105:{l:{110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10718]}}}}}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10498]}}}}}}},101:{l:{59:{c:[8804,8402]}}},116:{l:{59:{c:[60,8402]},114:{l:{105:{l:{101:{l:{59:{c:[8884,8402]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10499]}}}}}}},116:{l:{114:{l:{105:{l:{101:{l:{59:{c:[8885,8402]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764,8402]}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8662]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10531]}}}}},114:{l:{59:{c:[8598]},111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}},110:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10535]}}}}}}}}}}}}},111:{l:{83:{l:{59:{c:[9416]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[243]}},c:[243]}}}}}}},115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[8858]},99:{l:{59:{c:[244]}},c:[244]}}}}},121:{l:{59:{c:[1086]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[337]}}}}}}}}},105:{l:{118:{l:{59:{c:[10808]}}}}},111:{l:{116:{l:{59:{c:[8857]}}}}},115:{l:{111:{l:{108:{l:{100:{l:{59:{c:[10684]}}}}}}}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[339]}}}}}}}}},102:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10687]}}}}}}},114:{l:{59:{c:[120108]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[731]}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[242]}},c:[242]}}}}}}},116:{l:{59:{c:[10689]}}}}},104:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10677]}}}}}}},109:{l:{59:{c:[937]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8634]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10686]}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10683]}}}}}}}}}}},105:{l:{110:{l:{101:{l:{59:{c:[8254]}}}}}}},116:{l:{59:{c:[10688]}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[333]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[969]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[959]}}}}}}}}},100:{l:{59:{c:[10678]}}},110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120160]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10679]}}}}},101:{l:{114:{l:{112:{l:{59:{c:[10681]}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},114:{l:{59:{c:[8744]},97:{l:{114:{l:{114:{l:{59:{c:[8635]}}}}}}},100:{l:{59:{c:[10845]},101:{l:{114:{l:{59:{c:[8500]},111:{l:{102:{l:{59:{c:[8500]}}}}}}}}},102:{l:{59:{c:[170]}},c:[170]},109:{l:{59:{c:[186]}},c:[186]}}},105:{l:{103:{l:{111:{l:{102:{l:{59:{c:[8886]}}}}}}}}},111:{l:{114:{l:{59:{c:[10838]}}}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10839]}}}}}}}}}}},118:{l:{59:{c:[10843]}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8500]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[248]}},c:[248]}}}}}}},111:{l:{108:{l:{59:{c:[8856]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[245]}},c:[245]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[8855]},97:{l:{115:{l:{59:{c:[10806]}}}}}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[246]}},c:[246]}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[9021]}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8741]},97:{l:{59:{c:[182]},108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}},c:[182]},115:{l:{105:{l:{109:{l:{59:{c:[10995]}}}}},108:{l:{59:{c:[11005]}}}}},116:{l:{59:{c:[8706]}}}}}}},99:{l:{121:{l:{59:{c:[1087]}}}}},101:{l:{114:{l:{99:{l:{110:{l:{116:{l:{59:{c:[37]}}}}}}},105:{l:{111:{l:{100:{l:{59:{c:[46]}}}}}}},109:{l:{105:{l:{108:{l:{59:{c:[8240]}}}}}}},112:{l:{59:{c:[8869]}}},116:{l:{101:{l:{110:{l:{107:{l:{59:{c:[8241]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120109]}}}}},104:{l:{105:{l:{59:{c:[966]},118:{l:{59:{c:[981]}}}}},109:{l:{109:{l:{97:{l:{116:{l:{59:{c:[8499]}}}}}}}}},111:{l:{110:{l:{101:{l:{59:{c:[9742]}}}}}}}}},105:{l:{59:{c:[960]},116:{l:{99:{l:{104:{l:{102:{l:{111:{l:{114:{l:{107:{l:{59:{c:[8916]}}}}}}}}}}}}}}},118:{l:{59:{c:[982]}}}}},108:{l:{97:{l:{110:{l:{99:{l:{107:{l:{59:{c:[8463]},104:{l:{59:{c:[8462]}}}}}}},107:{l:{118:{l:{59:{c:[8463]}}}}}}}}},117:{l:{115:{l:{59:{c:[43]},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10787]}}}}}}}}},98:{l:{59:{c:[8862]}}},99:{l:{105:{l:{114:{l:{59:{c:[10786]}}}}}}},100:{l:{111:{l:{59:{c:[8724]}}},117:{l:{59:{c:[10789]}}}}},101:{l:{59:{c:[10866]}}},109:{l:{110:{l:{59:{c:[177]}},c:[177]}}},115:{l:{105:{l:{109:{l:{59:{c:[10790]}}}}}}},116:{l:{119:{l:{111:{l:{59:{c:[10791]}}}}}}}}}}}}},109:{l:{59:{c:[177]}}},111:{l:{105:{l:{110:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10773]}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120161]}}}}},117:{l:{110:{l:{100:{l:{59:{c:[163]}},c:[163]}}}}}}},114:{l:{59:{c:[8826]},69:{l:{59:{c:[10931]}}},97:{l:{112:{l:{59:{c:[10935]}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8828]}}}}}}},101:{l:{59:{c:[10927]},99:{l:{59:{c:[8826]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10935]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8828]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10927]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10937]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10933]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8242]},115:{l:{59:{c:[8473]}}}}}}}}},110:{l:{69:{l:{59:{c:[10933]}}},97:{l:{112:{l:{59:{c:[10937]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},111:{l:{100:{l:{59:{c:[8719]}}},102:{l:{97:{l:{108:{l:{97:{l:{114:{l:{59:{c:[9006]}}}}}}}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8978]}}}}}}}}},115:{l:{117:{l:{114:{l:{102:{l:{59:{c:[8979]}}}}}}}}}}},112:{l:{59:{c:[8733]},116:{l:{111:{l:{59:{c:[8733]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}},117:{l:{114:{l:{101:{l:{108:{l:{59:{c:[8880]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120005]}}}}},105:{l:{59:{c:[968]}}}}},117:{l:{110:{l:{99:{l:{115:{l:{112:{l:{59:{c:[8200]}}}}}}}}}}}}},113:{l:{102:{l:{114:{l:{59:{c:[120110]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120162]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8279]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120006]}}}}}}},117:{l:{97:{l:{116:{l:{101:{l:{114:{l:{110:{l:{105:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8461]}}}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10774]}}}}}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[63]},101:{l:{113:{l:{59:{c:[8799]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[34]}},c:[34]}}}}}}},114:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8667]}}}}}}},114:{l:{114:{l:{59:{c:[8658]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10524]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10511]}}}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10596]}}}}}}},97:{l:{99:{l:{101:{l:{59:{c:[8765,817]}}},117:{l:{116:{l:{101:{l:{59:{c:[341]}}}}}}}}},100:{l:{105:{l:{99:{l:{59:{c:[8730]}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10675]}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[10217]},100:{l:{59:{c:[10642]}}},101:{l:{59:{c:[10661]}}},108:{l:{101:{l:{59:{c:[10217]}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[187]}},c:[187]}}}}},114:{l:{114:{l:{59:{c:[8594]},97:{l:{112:{l:{59:{c:[10613]}}}}},98:{l:{59:{c:[8677]},102:{l:{115:{l:{59:{c:[10528]}}}}}}},99:{l:{59:{c:[10547]}}},102:{l:{115:{l:{59:{c:[10526]}}}}},104:{l:{107:{l:{59:{c:[8618]}}}}},108:{l:{112:{l:{59:{c:[8620]}}}}},112:{l:{108:{l:{59:{c:[10565]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10612]}}}}}}},116:{l:{108:{l:{59:{c:[8611]}}}}},119:{l:{59:{c:[8605]}}}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10522]}}}}}}},105:{l:{111:{l:{59:{c:[8758]},110:{l:{97:{l:{108:{l:{115:{l:{59:{c:[8474]}}}}}}}}}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10509]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10099]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[125]}}},107:{l:{59:{c:[93]}}}}}}},107:{l:{101:{l:{59:{c:[10636]}}},115:{l:{108:{l:{100:{l:{59:{c:[10638]}}},117:{l:{59:{c:[10640]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[345]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[343]}}}}}}},105:{l:{108:{l:{59:{c:[8969]}}}}}}},117:{l:{98:{l:{59:{c:[125]}}}}},121:{l:{59:{c:[1088]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10551]}}}}},108:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10601]}}}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8221]},114:{l:{59:{c:[8221]}}}}}}}}},115:{l:{104:{l:{59:{c:[8627]}}}}}}},101:{l:{97:{l:{108:{l:{59:{c:[8476]},105:{l:{110:{l:{101:{l:{59:{c:[8475]}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8476]}}}}}}}}},115:{l:{59:{c:[8477]}}}}}}},99:{l:{116:{l:{59:{c:[9645]}}}}},103:{l:{59:{c:[174]}},c:[174]}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10621]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}},114:{l:{59:{c:[120111]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8641]}}},117:{l:{59:{c:[8640]},108:{l:{59:{c:[10604]}}}}}}}}},111:{l:{59:{c:[961]},118:{l:{59:{c:[1009]}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8611]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8641]}}}}}}}}},117:{l:{112:{l:{59:{c:[8640]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8644]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8649]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8605]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8908]}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[730]}}}}},115:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8787]}}}}}}}}}}}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8644]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8652]}}}}}}},109:{l:{59:{c:[8207]}}}}},109:{l:{111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9137]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9137]}}}}}}}}}}}}}}}}}}},110:{l:{109:{l:{105:{l:{100:{l:{59:{c:[10990]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10221]}}}}},114:{l:{114:{l:{59:{c:[8702]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10215]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10630]}}}}},102:{l:{59:{c:[120163]}}},108:{l:{117:{l:{115:{l:{59:{c:[10798]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10805]}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[41]},103:{l:{116:{l:{59:{c:[10644]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10770]}}}}}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8649]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8250]}}}}}}}}},99:{l:{114:{l:{59:{c:[120007]}}}}},104:{l:{59:{c:[8625]}}},113:{l:{98:{l:{59:{c:[93]}}},117:{l:{111:{l:{59:{c:[8217]},114:{l:{59:{c:[8217]}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8908]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8906]}}}}}}}}},114:{l:{105:{l:{59:{c:[9657]},101:{l:{59:{c:[8885]}}},102:{l:{59:{c:[9656]}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[10702]}}}}}}}}}}}}}}},117:{l:{108:{l:{117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10600]}}}}}}}}}}}}},120:{l:{59:{c:[8478]}}}}},115:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[347]}}}}}}}}}}},98:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8218]}}}}}}}}},99:{l:{59:{c:[8827]},69:{l:{59:{c:[10932]}}},97:{l:{112:{l:{59:{c:[10936]}}},114:{l:{111:{l:{110:{l:{59:{c:[353]}}}}}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8829]}}}}}}},101:{l:{59:{c:[10928]},100:{l:{105:{l:{108:{l:{59:{c:[351]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[349]}}}}}}},110:{l:{69:{l:{59:{c:[10934]}}},97:{l:{112:{l:{59:{c:[10938]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10771]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}},121:{l:{59:{c:[1089]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8901]},98:{l:{59:{c:[8865]}}},101:{l:{59:{c:[10854]}}}}}}}}},101:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8664]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10533]}}}}},114:{l:{59:{c:[8600]},111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}},99:{l:{116:{l:{59:{c:[167]}},c:[167]}}},109:{l:{105:{l:{59:{c:[59]}}}}},115:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10537]}}}}}}}}},116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}},110:{l:{59:{c:[8726]}}}}}}},120:{l:{116:{l:{59:{c:[10038]}}}}}}},102:{l:{114:{l:{59:{c:[120112]},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{59:{c:[9839]}}}}}}},99:{l:{104:{l:{99:{l:{121:{l:{59:{c:[1097]}}}}}}},121:{l:{59:{c:[1096]}}}}},111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8739]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}},121:{l:{59:{c:[173]}},c:[173]}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[963]},102:{l:{59:{c:[962]}}},118:{l:{59:{c:[962]}}}}}}}}},109:{l:{59:{c:[8764]},100:{l:{111:{l:{116:{l:{59:{c:[10858]}}}}}}},101:{l:{59:{c:[8771]},113:{l:{59:{c:[8771]}}}}},103:{l:{59:{c:[10910]},69:{l:{59:{c:[10912]}}}}},108:{l:{59:{c:[10909]},69:{l:{59:{c:[10911]}}}}},110:{l:{101:{l:{59:{c:[8774]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10788]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10610]}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8592]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{115:{l:{101:{l:{116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}}}}}}}}}}}}}},115:{l:{104:{l:{112:{l:{59:{c:[10803]}}}}}}}}},101:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10724]}}}}}}}}}}}}},105:{l:{100:{l:{59:{c:[8739]}}},108:{l:{101:{l:{59:{c:[8995]}}}}}}},116:{l:{59:{c:[10922]},101:{l:{59:{c:[10924]},115:{l:{59:{c:[10924,65024]}}}}}}}}},111:{l:{102:{l:{116:{l:{99:{l:{121:{l:{59:{c:[1100]}}}}}}}}},108:{l:{59:{c:[47]},98:{l:{59:{c:[10692]},97:{l:{114:{l:{59:{c:[9023]}}}}}}}}},112:{l:{102:{l:{59:{c:[120164]}}}}}}},112:{l:{97:{l:{100:{l:{101:{l:{115:{l:{59:{c:[9824]},117:{l:{105:{l:{116:{l:{59:{c:[9824]}}}}}}}}}}}}},114:{l:{59:{c:[8741]}}}}}}},113:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8851]},115:{l:{59:{c:[8851,65024]}}}}}}},117:{l:{112:{l:{59:{c:[8852]},115:{l:{59:{c:[8852,65024]}}}}}}}}},115:{l:{117:{l:{98:{l:{59:{c:[8847]},101:{l:{59:{c:[8849]}}},115:{l:{101:{l:{116:{l:{59:{c:[8847]},101:{l:{113:{l:{59:{c:[8849]}}}}}}}}}}}}},112:{l:{59:{c:[8848]},101:{l:{59:{c:[8850]}}},115:{l:{101:{l:{116:{l:{59:{c:[8848]},101:{l:{113:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}},117:{l:{59:{c:[9633]},97:{l:{114:{l:{101:{l:{59:{c:[9633]}}},102:{l:{59:{c:[9642]}}}}}}},102:{l:{59:{c:[9642]}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8594]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120008]}}}}},101:{l:{116:{l:{109:{l:{110:{l:{59:{c:[8726]}}}}}}}}},109:{l:{105:{l:{108:{l:{101:{l:{59:{c:[8995]}}}}}}}}},116:{l:{97:{l:{114:{l:{102:{l:{59:{c:[8902]}}}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9734]},102:{l:{59:{c:[9733]}}}}}}},114:{l:{97:{l:{105:{l:{103:{l:{104:{l:{116:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}}}}}}}}}}}}}},110:{l:{115:{l:{59:{c:[175]}}}}}}}}},117:{l:{98:{l:{59:{c:[8834]},69:{l:{59:{c:[10949]}}},100:{l:{111:{l:{116:{l:{59:{c:[10941]}}}}}}},101:{l:{59:{c:[8838]},100:{l:{111:{l:{116:{l:{59:{c:[10947]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10945]}}}}}}}}},110:{l:{69:{l:{59:{c:[10955]}}},101:{l:{59:{c:[8842]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10943]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10617]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8834]},101:{l:{113:{l:{59:{c:[8838]},113:{l:{59:{c:[10949]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8842]},113:{l:{59:{c:[10955]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10951]}}}}},117:{l:{98:{l:{59:{c:[10965]}}},112:{l:{59:{c:[10963]}}}}}}}}},99:{l:{99:{l:{59:{c:[8827]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10936]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8829]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10928]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10938]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10934]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}}}}}},109:{l:{59:{c:[8721]}}},110:{l:{103:{l:{59:{c:[9834]}}}}},112:{l:{49:{l:{59:{c:[185]}},c:[185]},50:{l:{59:{c:[178]}},c:[178]},51:{l:{59:{c:[179]}},c:[179]},59:{c:[8835]},69:{l:{59:{c:[10950]}}},100:{l:{111:{l:{116:{l:{59:{c:[10942]}}}}},115:{l:{117:{l:{98:{l:{59:{c:[10968]}}}}}}}}},101:{l:{59:{c:[8839]},100:{l:{111:{l:{116:{l:{59:{c:[10948]}}}}}}}}},104:{l:{115:{l:{111:{l:{108:{l:{59:{c:[10185]}}}}},117:{l:{98:{l:{59:{c:[10967]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10619]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10946]}}}}}}}}},110:{l:{69:{l:{59:{c:[10956]}}},101:{l:{59:{c:[8843]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10944]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8835]},101:{l:{113:{l:{59:{c:[8839]},113:{l:{59:{c:[10950]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8843]},113:{l:{59:{c:[10956]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10952]}}}}},117:{l:{98:{l:{59:{c:[10964]}}},112:{l:{59:{c:[10966]}}}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8665]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10534]}}}}},114:{l:{59:{c:[8601]},111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}},110:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10538]}}}}}}}}}}},122:{l:{108:{l:{105:{l:{103:{l:{59:{c:[223]}},c:[223]}}}}}}}}},116:{l:{97:{l:{114:{l:{103:{l:{101:{l:{116:{l:{59:{c:[8982]}}}}}}}}},117:{l:{59:{c:[964]}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9140]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[357]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[355]}}}}}}}}},121:{l:{59:{c:[1090]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}},101:{l:{108:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8981]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120113]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{52:{l:{59:{c:[8756]}}},102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[952]},115:{l:{121:{l:{109:{l:{59:{c:[977]}}}}}}},118:{l:{59:{c:[977]}}}}}}}}},105:{l:{99:{l:{107:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}}}},110:{l:{115:{l:{112:{l:{59:{c:[8201]}}}}}}}}},107:{l:{97:{l:{112:{l:{59:{c:[8776]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}},111:{l:{114:{l:{110:{l:{59:{c:[254]}},c:[254]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}},109:{l:{101:{l:{115:{l:{59:{c:[215]},98:{l:{59:{c:[8864]},97:{l:{114:{l:{59:{c:[10801]}}}}}}},100:{l:{59:{c:[10800]}}}},c:[215]}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},111:{l:{101:{l:{97:{l:{59:{c:[10536]}}}}},112:{l:{59:{c:[8868]},98:{l:{111:{l:{116:{l:{59:{c:[9014]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10993]}}}}}}},102:{l:{59:{c:[120165]},111:{l:{114:{l:{107:{l:{59:{c:[10970]}}}}}}}}}}},115:{l:{97:{l:{59:{c:[10537]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8244]}}}}}}}}}}},114:{l:{97:{l:{100:{l:{101:{l:{59:{c:[8482]}}}}}}},105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9653]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9663]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9667]},101:{l:{113:{l:{59:{c:[8884]}}}}}}}}}}}}},113:{l:{59:{c:[8796]}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9657]},101:{l:{113:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[9708]}}}}}}},101:{l:{59:{c:[8796]}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[10810]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10809]}}}}}}}}},115:{l:{98:{l:{59:{c:[10701]}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10811]}}}}}}}}}}},112:{l:{101:{l:{122:{l:{105:{l:{117:{l:{109:{l:{59:{c:[9186]}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120009]}}},121:{l:{59:{c:[1094]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1115]}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[359]}}}}}}}}}}},119:{l:{105:{l:{120:{l:{116:{l:{59:{c:[8812]}}}}}}},111:{l:{104:{l:{101:{l:{97:{l:{100:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8606]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8608]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8657]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10595]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[250]}},c:[250]}}}}}}},114:{l:{114:{l:{59:{c:[8593]}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1118]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[365]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[251]}},c:[251]}}}}},121:{l:{59:{c:[1091]}}}}},100:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8645]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[369]}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10606]}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10622]}}}}}}}}},114:{l:{59:{c:[120114]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[249]}},c:[249]}}}}}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8639]}}},114:{l:{59:{c:[8638]}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9600]}}}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8988]},101:{l:{114:{l:{59:{c:[8988]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8975]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9720]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[363]}}}}}}},108:{l:{59:{c:[168]}},c:[168]}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[371]}}}}}}},112:{l:{102:{l:{59:{c:[120166]}}}}}}},112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8639]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8638]}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}},115:{l:{105:{l:{59:{c:[965]},104:{l:{59:{c:[978]}}},108:{l:{111:{l:{110:{l:{59:{c:[965]}}}}}}}}}}},117:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8648]}}}}}}}}}}}}}}}}}}},114:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8989]},101:{l:{114:{l:{59:{c:[8989]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8974]}}}}}}}}},105:{l:{110:{l:{103:{l:{59:{c:[367]}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9721]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120010]}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8944]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[361]}}}}}}}}},114:{l:{105:{l:{59:{c:[9653]},102:{l:{59:{c:[9652]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8648]}}}}}}},109:{l:{108:{l:{59:{c:[252]}},c:[252]}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10663]}}}}}}}}}}}}}}},118:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8661]}}}}}}},66:{l:{97:{l:{114:{l:{59:{c:[10984]},118:{l:{59:{c:[10985]}}}}}}}}},68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8872]}}}}}}}}},97:{l:{110:{l:{103:{l:{114:{l:{116:{l:{59:{c:[10652]}}}}}}}}},114:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[1008]}}}}}}}}}}},110:{l:{111:{l:{116:{l:{104:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8709]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}},105:{l:{59:{c:[982]}}},114:{l:{111:{l:{112:{l:{116:{l:{111:{l:{59:{c:[8733]}}}}}}}}}}}}},114:{l:{59:{c:[8597]},104:{l:{111:{l:{59:{c:[1009]}}}}}}},115:{l:{105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[962]}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8842,65024]},113:{l:{59:{c:[10955,65024]}}}}}}}}}}}}}}}}},112:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8843,65024]},113:{l:{59:{c:[10956,65024]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{101:{l:{116:{l:{97:{l:{59:{c:[977]}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8882]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8883]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1074]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8866]}}}}}}}}},101:{l:{101:{l:{59:{c:[8744]},98:{l:{97:{l:{114:{l:{59:{c:[8891]}}}}}}},101:{l:{113:{l:{59:{c:[8794]}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8942]}}}}}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[124]}}}}}}},116:{l:{59:{c:[124]}}}}}}},102:{l:{114:{l:{59:{c:[120115]}}}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8882]}}}}}}}}},110:{l:{115:{l:{117:{l:{98:{l:{59:{c:[8834,8402]}}},112:{l:{59:{c:[8835,8402]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120167]}}}}}}},112:{l:{114:{l:{111:{l:{112:{l:{59:{c:[8733]}}}}}}}}},114:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8883]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120011]}}}}},117:{l:{98:{l:{110:{l:{69:{l:{59:{c:[10955,65024]}}},101:{l:{59:{c:[8842,65024]}}}}}}},112:{l:{110:{l:{69:{l:{59:{c:[10956,65024]}}},101:{l:{59:{c:[8843,65024]}}}}}}}}}}},122:{l:{105:{l:{103:{l:{122:{l:{97:{l:{103:{l:{59:{c:[10650]}}}}}}}}}}}}}}},119:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[373]}}}}}}}}},101:{l:{100:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10847]}}}}}}},103:{l:{101:{l:{59:{c:[8743]},113:{l:{59:{c:[8793]}}}}}}}}},105:{l:{101:{l:{114:{l:{112:{l:{59:{c:[8472]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120116]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120168]}}}}}}},112:{l:{59:{c:[8472]}}},114:{l:{59:{c:[8768]},101:{l:{97:{l:{116:{l:{104:{l:{59:{c:[8768]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120012]}}}}}}}}},120:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},100:{l:{116:{l:{114:{l:{105:{l:{59:{c:[9661]}}}}}}}}},102:{l:{114:{l:{59:{c:[120117]}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10234]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10231]}}}}}}}}},105:{l:{59:{c:[958]}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10232]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10229]}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[10236]}}}}}}},110:{l:{105:{l:{115:{l:{59:{c:[8955]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{102:{l:{59:{c:[120169]}}},108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10754]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10233]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10230]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120013]}}}}},113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9651]}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}},121:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[253]}},c:[253]}}}}},121:{l:{59:{c:[1103]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[375]}}}}}}},121:{l:{59:{c:[1099]}}}}},101:{l:{110:{l:{59:{c:[165]}},c:[165]}}},102:{l:{114:{l:{59:{c:[120118]}}}}},105:{l:{99:{l:{121:{l:{59:{c:[1111]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120170]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120014]}}}}}}},117:{l:{99:{l:{121:{l:{59:{c:[1102]}}}}},109:{l:{108:{l:{59:{c:[255]}},c:[255]}}}}}}},122:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[378]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[382]}}}}}}}}},121:{l:{59:{c:[1079]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[380]}}}}}}},101:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8488]}}}}}}}}},116:{l:{97:{l:{59:{c:[950]}}}}}}},102:{l:{114:{l:{59:{c:[120119]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1078]}}}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8669]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120171]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120015]}}}}}}},119:{l:{106:{l:{59:{c:[8205]}}},110:{l:{106:{l:{59:{c:[8204]}}}}}}}}}};
1331
1332},{}],13:[function(require,module,exports){
1333'use strict';
1334
1335var UNICODE = require('../common/unicode');
1336
1337//Aliases
1338var $ = UNICODE.CODE_POINTS;
1339
1340//Utils
1341
1342//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
1343//this functions if they will be situated in another module due to context switch.
1344//Always perform inlining check before modifying this functions ('node --trace-inlining').
1345function isReservedCodePoint(cp) {
1346    return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
1347}
1348
1349function isSurrogatePair(cp1, cp2) {
1350    return cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF;
1351}
1352
1353function getSurrogatePairCodePoint(cp1, cp2) {
1354    return (cp1 - 0xD800) * 0x400 + 0x2400 + cp2;
1355}
1356
1357//Preprocessor
1358//NOTE: HTML input preprocessing
1359//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream)
1360var Preprocessor = module.exports = function (html) {
1361    this.write(html);
1362
1363    //NOTE: one leading U+FEFF BYTE ORDER MARK character must be ignored if any are present in the input stream.
1364    this.pos = this.html.charCodeAt(0) === $.BOM ? 0 : -1;
1365
1366    this.gapStack = [];
1367    this.lastGapPos = -1;
1368    this.skipNextNewLine = false;
1369};
1370
1371Preprocessor.prototype.write = function (html) {
1372    if (this.html) {
1373        this.html = this.html.substring(0, this.pos + 1) +
1374                    html +
1375                    this.html.substring(this.pos + 1, this.html.length);
1376
1377    }
1378    else
1379        this.html = html;
1380
1381
1382    this.lastCharPos = this.html.length - 1;
1383};
1384
1385Preprocessor.prototype.advanceAndPeekCodePoint = function () {
1386    this.pos++;
1387
1388    if (this.pos > this.lastCharPos)
1389        return $.EOF;
1390
1391    var cp = this.html.charCodeAt(this.pos);
1392
1393    //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character
1394    //must be ignored.
1395    if (this.skipNextNewLine && cp === $.LINE_FEED) {
1396        this.skipNextNewLine = false;
1397        this._addGap();
1398        return this.advanceAndPeekCodePoint();
1399    }
1400
1401    //NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters
1402    if (cp === $.CARRIAGE_RETURN) {
1403        this.skipNextNewLine = true;
1404        return $.LINE_FEED;
1405    }
1406
1407    this.skipNextNewLine = false;
1408
1409    //OPTIMIZATION: first perform check if the code point in the allowed range that covers most common
1410    //HTML input (e.g. ASCII codes) to avoid performance-cost operations for high-range code points.
1411    return cp >= 0xD800 ? this._processHighRangeCodePoint(cp) : cp;
1412};
1413
1414Preprocessor.prototype._processHighRangeCodePoint = function (cp) {
1415    //NOTE: try to peek a surrogate pair
1416    if (this.pos !== this.lastCharPos) {
1417        var nextCp = this.html.charCodeAt(this.pos + 1);
1418
1419        if (isSurrogatePair(cp, nextCp)) {
1420            //NOTE: we have a surrogate pair. Peek pair character and recalculate code point.
1421            this.pos++;
1422            cp = getSurrogatePairCodePoint(cp, nextCp);
1423
1424            //NOTE: add gap that should be avoided during retreat
1425            this._addGap();
1426        }
1427    }
1428
1429    if (isReservedCodePoint(cp))
1430        cp = $.REPLACEMENT_CHARACTER;
1431
1432    return cp;
1433};
1434
1435Preprocessor.prototype._addGap = function () {
1436    this.gapStack.push(this.lastGapPos);
1437    this.lastGapPos = this.pos;
1438};
1439
1440Preprocessor.prototype.retreat = function () {
1441    if (this.pos === this.lastGapPos) {
1442        this.lastGapPos = this.gapStack.pop();
1443        this.pos--;
1444    }
1445
1446    this.pos--;
1447};
1448
1449},{"../common/unicode":4}],14:[function(require,module,exports){
1450'use strict';
1451
1452var Preprocessor = require('./preprocessor'),
1453    LocationInfoMixin = require('./location_info_mixin'),
1454    UNICODE = require('../common/unicode'),
1455    NAMED_ENTITY_TRIE = require('./named_entity_trie');
1456
1457//Aliases
1458var $ = UNICODE.CODE_POINTS,
1459    $$ = UNICODE.CODE_POINT_SEQUENCES;
1460
1461//Replacement code points for numeric entities
1462var NUMERIC_ENTITY_REPLACEMENTS = {
1463    0x00: 0xFFFD, 0x0D: 0x000D, 0x80: 0x20AC, 0x81: 0x0081, 0x82: 0x201A, 0x83: 0x0192, 0x84: 0x201E,
1464    0x85: 0x2026, 0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02C6, 0x89: 0x2030, 0x8A: 0x0160, 0x8B: 0x2039,
1465    0x8C: 0x0152, 0x8D: 0x008D, 0x8E: 0x017D, 0x8F: 0x008F, 0x90: 0x0090, 0x91: 0x2018, 0x92: 0x2019,
1466    0x93: 0x201C, 0x94: 0x201D, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014, 0x98: 0x02DC, 0x99: 0x2122,
1467    0x9A: 0x0161, 0x9B: 0x203A, 0x9C: 0x0153, 0x9D: 0x009D, 0x9E: 0x017E, 0x9F: 0x0178
1468};
1469
1470//States
1471var DATA_STATE = 'DATA_STATE',
1472    CHARACTER_REFERENCE_IN_DATA_STATE = 'CHARACTER_REFERENCE_IN_DATA_STATE',
1473    RCDATA_STATE = 'RCDATA_STATE',
1474    CHARACTER_REFERENCE_IN_RCDATA_STATE = 'CHARACTER_REFERENCE_IN_RCDATA_STATE',
1475    RAWTEXT_STATE = 'RAWTEXT_STATE',
1476    SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE',
1477    PLAINTEXT_STATE = 'PLAINTEXT_STATE',
1478    TAG_OPEN_STATE = 'TAG_OPEN_STATE',
1479    END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE',
1480    TAG_NAME_STATE = 'TAG_NAME_STATE',
1481    RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE',
1482    RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE',
1483    RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE',
1484    RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE',
1485    RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE',
1486    RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE',
1487    SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE',
1488    SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE',
1489    SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE',
1490    SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE',
1491    SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE',
1492    SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE',
1493    SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE',
1494    SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE',
1495    SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE',
1496    SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE',
1497    SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE',
1498    SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE',
1499    SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE',
1500    SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE',
1501    SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE',
1502    SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE',
1503    SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE',
1504    BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE',
1505    ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE',
1506    AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE',
1507    BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE',
1508    ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE',
1509    ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE',
1510    ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE',
1511    CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE = 'CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE',
1512    AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE',
1513    SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE',
1514    BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE',
1515    MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE',
1516    COMMENT_START_STATE = 'COMMENT_START_STATE',
1517    COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE',
1518    COMMENT_STATE = 'COMMENT_STATE',
1519    COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE',
1520    COMMENT_END_STATE = 'COMMENT_END_STATE',
1521    COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE',
1522    DOCTYPE_STATE = 'DOCTYPE_STATE',
1523    BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE',
1524    DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE',
1525    AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE',
1526    AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE',
1527    BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
1528    DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE',
1529    DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE',
1530    AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
1531    BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE',
1532    AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE',
1533    BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
1534    DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE',
1535    DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE',
1536    AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
1537    BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE',
1538    CDATA_SECTION_STATE = 'CDATA_SECTION_STATE';
1539
1540//Utils
1541
1542//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
1543//this functions if they will be situated in another module due to context switch.
1544//Always perform inlining check before modifying this functions ('node --trace-inlining').
1545function isWhitespace(cp) {
1546    return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED;
1547}
1548
1549function isAsciiDigit(cp) {
1550    return cp >= $.DIGIT_0 && cp <= $.DIGIT_9;
1551}
1552
1553function isAsciiUpper(cp) {
1554    return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z;
1555}
1556
1557function isAsciiLower(cp) {
1558    return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z;
1559}
1560
1561function isAsciiAlphaNumeric(cp) {
1562    return isAsciiDigit(cp) || isAsciiUpper(cp) || isAsciiLower(cp);
1563}
1564
1565function isDigit(cp, isHex) {
1566    return isAsciiDigit(cp) || (isHex && ((cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F) ||
1567                                          (cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F)));
1568}
1569
1570function isReservedCodePoint(cp) {
1571    return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
1572}
1573
1574function toAsciiLowerCodePoint(cp) {
1575    return cp + 0x0020;
1576}
1577
1578//NOTE: String.fromCharCode() function can handle only characters from BMP subset.
1579//So, we need to workaround this manually.
1580//(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values)
1581function toChar(cp) {
1582    if (cp <= 0xFFFF)
1583        return String.fromCharCode(cp);
1584
1585    cp -= 0x10000;
1586    return String.fromCharCode(cp >>> 10 & 0x3FF | 0xD800) + String.fromCharCode(0xDC00 | cp & 0x3FF);
1587}
1588
1589function toAsciiLowerChar(cp) {
1590    return String.fromCharCode(toAsciiLowerCodePoint(cp));
1591}
1592
1593//Tokenizer
1594var Tokenizer = module.exports = function (html, options) {
1595    this.disableEntitiesDecoding = false;
1596
1597    this.preprocessor = new Preprocessor(html);
1598
1599    this.tokenQueue = [];
1600
1601    this.allowCDATA = false;
1602
1603    this.state = DATA_STATE;
1604    this.returnState = '';
1605
1606    this.consumptionPos = 0;
1607
1608    this.tempBuff = [];
1609    this.additionalAllowedCp = void 0;
1610    this.lastStartTagName = '';
1611
1612    this.currentCharacterToken = null;
1613    this.currentToken = null;
1614    this.currentAttr = null;
1615
1616    if (options) {
1617        this.disableEntitiesDecoding = !options.decodeHtmlEntities;
1618
1619        if (options.locationInfo)
1620            LocationInfoMixin.assign(this);
1621    }
1622};
1623
1624//Token types
1625Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN';
1626Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN';
1627Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN';
1628Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN';
1629Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN';
1630Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN';
1631Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN';
1632Tokenizer.EOF_TOKEN = 'EOF_TOKEN';
1633
1634//Tokenizer initial states for different modes
1635Tokenizer.MODE = Tokenizer.prototype.MODE = {
1636    DATA: DATA_STATE,
1637    RCDATA: RCDATA_STATE,
1638    RAWTEXT: RAWTEXT_STATE,
1639    SCRIPT_DATA: SCRIPT_DATA_STATE,
1640    PLAINTEXT: PLAINTEXT_STATE
1641};
1642
1643//Static
1644Tokenizer.getTokenAttr = function (token, attrName) {
1645    for (var i = token.attrs.length - 1; i >= 0; i--) {
1646        if (token.attrs[i].name === attrName)
1647            return token.attrs[i].value;
1648    }
1649
1650    return null;
1651};
1652
1653//Get token
1654Tokenizer.prototype.getNextToken = function () {
1655    while (!this.tokenQueue.length)
1656        this[this.state](this._consume());
1657
1658    return this.tokenQueue.shift();
1659};
1660
1661//Consumption
1662Tokenizer.prototype._consume = function () {
1663    this.consumptionPos++;
1664    return this.preprocessor.advanceAndPeekCodePoint();
1665};
1666
1667Tokenizer.prototype._unconsume = function () {
1668    this.consumptionPos--;
1669    this.preprocessor.retreat();
1670};
1671
1672Tokenizer.prototype._unconsumeSeveral = function (count) {
1673    while (count--)
1674        this._unconsume();
1675};
1676
1677Tokenizer.prototype._reconsumeInState = function (state) {
1678    this.state = state;
1679    this._unconsume();
1680};
1681
1682Tokenizer.prototype._consumeSubsequentIfMatch = function (pattern, startCp, caseSensitive) {
1683    var rollbackPos = this.consumptionPos,
1684        isMatch = true,
1685        patternLength = pattern.length,
1686        patternPos = 0,
1687        cp = startCp,
1688        patternCp = void 0;
1689
1690    for (; patternPos < patternLength; patternPos++) {
1691        if (patternPos > 0)
1692            cp = this._consume();
1693
1694        if (cp === $.EOF) {
1695            isMatch = false;
1696            break;
1697        }
1698
1699        patternCp = pattern[patternPos];
1700
1701        if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) {
1702            isMatch = false;
1703            break;
1704        }
1705    }
1706
1707    if (!isMatch)
1708        this._unconsumeSeveral(this.consumptionPos - rollbackPos);
1709
1710    return isMatch;
1711};
1712
1713//Lookahead
1714Tokenizer.prototype._lookahead = function () {
1715    var cp = this.preprocessor.advanceAndPeekCodePoint();
1716    this.preprocessor.retreat();
1717
1718    return cp;
1719};
1720
1721//Temp buffer
1722Tokenizer.prototype.isTempBufferEqualToScriptString = function () {
1723    if (this.tempBuff.length !== $$.SCRIPT_STRING.length)
1724        return false;
1725
1726    for (var i = 0; i < this.tempBuff.length; i++) {
1727        if (this.tempBuff[i] !== $$.SCRIPT_STRING[i])
1728            return false;
1729    }
1730
1731    return true;
1732};
1733
1734//Token creation
1735Tokenizer.prototype.buildStartTagToken = function (tagName) {
1736    return {
1737        type: Tokenizer.START_TAG_TOKEN,
1738        tagName: tagName,
1739        selfClosing: false,
1740        attrs: []
1741    };
1742};
1743
1744Tokenizer.prototype.buildEndTagToken = function (tagName) {
1745    return {
1746        type: Tokenizer.END_TAG_TOKEN,
1747        tagName: tagName,
1748        ignored: false,
1749        attrs: []
1750    };
1751};
1752
1753Tokenizer.prototype._createStartTagToken = function (tagNameFirstCh) {
1754    this.currentToken = this.buildStartTagToken(tagNameFirstCh);
1755};
1756
1757Tokenizer.prototype._createEndTagToken = function (tagNameFirstCh) {
1758    this.currentToken = this.buildEndTagToken(tagNameFirstCh);
1759};
1760
1761Tokenizer.prototype._createCommentToken = function () {
1762    this.currentToken = {
1763        type: Tokenizer.COMMENT_TOKEN,
1764        data: ''
1765    };
1766};
1767
1768Tokenizer.prototype._createDoctypeToken = function (doctypeNameFirstCh) {
1769    this.currentToken = {
1770        type: Tokenizer.DOCTYPE_TOKEN,
1771        name: doctypeNameFirstCh || '',
1772        forceQuirks: false,
1773        publicId: null,
1774        systemId: null
1775    };
1776};
1777
1778Tokenizer.prototype._createCharacterToken = function (type, ch) {
1779    this.currentCharacterToken = {
1780        type: type,
1781        chars: ch
1782    };
1783};
1784
1785//Tag attributes
1786Tokenizer.prototype._createAttr = function (attrNameFirstCh) {
1787    this.currentAttr = {
1788        name: attrNameFirstCh,
1789        value: ''
1790    };
1791};
1792
1793Tokenizer.prototype._isDuplicateAttr = function () {
1794    return Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) !== null;
1795};
1796
1797Tokenizer.prototype._leaveAttrName = function (toState) {
1798    this.state = toState;
1799
1800    if (!this._isDuplicateAttr())
1801        this.currentToken.attrs.push(this.currentAttr);
1802};
1803
1804//Appropriate end tag token
1805//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#appropriate-end-tag-token)
1806Tokenizer.prototype._isAppropriateEndTagToken = function () {
1807    return this.lastStartTagName === this.currentToken.tagName;
1808};
1809
1810//Token emission
1811Tokenizer.prototype._emitCurrentToken = function () {
1812    this._emitCurrentCharacterToken();
1813
1814    //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate.
1815    if (this.currentToken.type === Tokenizer.START_TAG_TOKEN)
1816        this.lastStartTagName = this.currentToken.tagName;
1817
1818    this.tokenQueue.push(this.currentToken);
1819    this.currentToken = null;
1820};
1821
1822Tokenizer.prototype._emitCurrentCharacterToken = function () {
1823    if (this.currentCharacterToken) {
1824        this.tokenQueue.push(this.currentCharacterToken);
1825        this.currentCharacterToken = null;
1826    }
1827};
1828
1829Tokenizer.prototype._emitEOFToken = function () {
1830    this._emitCurrentCharacterToken();
1831    this.tokenQueue.push({type: Tokenizer.EOF_TOKEN});
1832};
1833
1834//Characters emission
1835
1836//OPTIMIZATION: specification uses only one type of character tokens (one token per character).
1837//This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters.
1838//If we have a sequence of characters that belong to the same group, parser can process it
1839//as a single solid character token.
1840//So, there are 3 types of character tokens in parse5:
1841//1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000')
1842//2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n  \r\t   \f')
1843//3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^')
1844Tokenizer.prototype._appendCharToCurrentCharacterToken = function (type, ch) {
1845    if (this.currentCharacterToken && this.currentCharacterToken.type !== type)
1846        this._emitCurrentCharacterToken();
1847
1848    if (this.currentCharacterToken)
1849        this.currentCharacterToken.chars += ch;
1850
1851    else
1852        this._createCharacterToken(type, ch);
1853};
1854
1855Tokenizer.prototype._emitCodePoint = function (cp) {
1856    var type = Tokenizer.CHARACTER_TOKEN;
1857
1858    if (isWhitespace(cp))
1859        type = Tokenizer.WHITESPACE_CHARACTER_TOKEN;
1860
1861    else if (cp === $.NULL)
1862        type = Tokenizer.NULL_CHARACTER_TOKEN;
1863
1864    this._appendCharToCurrentCharacterToken(type, toChar(cp));
1865};
1866
1867Tokenizer.prototype._emitSeveralCodePoints = function (codePoints) {
1868    for (var i = 0; i < codePoints.length; i++)
1869        this._emitCodePoint(codePoints[i]);
1870};
1871
1872//NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character.
1873//So we can avoid additional checks here.
1874Tokenizer.prototype._emitChar = function (ch) {
1875    this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch);
1876};
1877
1878//Character reference tokenization
1879Tokenizer.prototype._consumeNumericEntity = function (isHex) {
1880    var digits = '',
1881        nextCp = void 0;
1882
1883    do {
1884        digits += toChar(this._consume());
1885        nextCp = this._lookahead();
1886    } while (nextCp !== $.EOF && isDigit(nextCp, isHex));
1887
1888    if (this._lookahead() === $.SEMICOLON)
1889        this._consume();
1890
1891    var referencedCp = parseInt(digits, isHex ? 16 : 10),
1892        replacement = NUMERIC_ENTITY_REPLACEMENTS[referencedCp];
1893
1894    if (replacement)
1895        return replacement;
1896
1897    if (isReservedCodePoint(referencedCp))
1898        return $.REPLACEMENT_CHARACTER;
1899
1900    return referencedCp;
1901};
1902
1903Tokenizer.prototype._consumeNamedEntity = function (startCp, inAttr) {
1904    var referencedCodePoints = null,
1905        entityCodePointsCount = 0,
1906        cp = startCp,
1907        leaf = NAMED_ENTITY_TRIE[cp],
1908        consumedCount = 1,
1909        semicolonTerminated = false;
1910
1911    for (; leaf && cp !== $.EOF; cp = this._consume(), consumedCount++, leaf = leaf.l && leaf.l[cp]) {
1912        if (leaf.c) {
1913            //NOTE: we have at least one named reference match. But we don't stop lookup at this point,
1914            //because longer matches still can be found (e.g. '&not' and '&notin;') except the case
1915            //then found match is terminated by semicolon.
1916            referencedCodePoints = leaf.c;
1917            entityCodePointsCount = consumedCount;
1918
1919            if (cp === $.SEMICOLON) {
1920                semicolonTerminated = true;
1921                break;
1922            }
1923        }
1924    }
1925
1926    if (referencedCodePoints) {
1927        if (!semicolonTerminated) {
1928            //NOTE: unconsume excess (e.g. 'it' in '&notit')
1929            this._unconsumeSeveral(consumedCount - entityCodePointsCount);
1930
1931            //NOTE: If the character reference is being consumed as part of an attribute and the next character
1932            //is either a U+003D EQUALS SIGN character (=) or an alphanumeric ASCII character, then, for historical
1933            //reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be
1934            //unconsumed, and nothing is returned.
1935            //However, if this next character is in fact a U+003D EQUALS SIGN character (=), then this is a
1936            //parse error, because some legacy user agents will misinterpret the markup in those cases.
1937            //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references)
1938            if (inAttr) {
1939                var nextCp = this._lookahead();
1940
1941                if (nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp)) {
1942                    this._unconsumeSeveral(entityCodePointsCount);
1943                    return null;
1944                }
1945            }
1946        }
1947
1948        return referencedCodePoints;
1949    }
1950
1951    this._unconsumeSeveral(consumedCount);
1952
1953    return null;
1954};
1955
1956Tokenizer.prototype._consumeCharacterReference = function (startCp, inAttr) {
1957    if (this.disableEntitiesDecoding || isWhitespace(startCp) || startCp === $.GREATER_THAN_SIGN ||
1958        startCp === $.AMPERSAND || startCp === this.additionalAllowedCp || startCp === $.EOF) {
1959        //NOTE: not a character reference. No characters are consumed, and nothing is returned.
1960        this._unconsume();
1961        return null;
1962    }
1963
1964    else if (startCp === $.NUMBER_SIGN) {
1965        //NOTE: we have a numeric entity candidate, now we should determine if it's hex or decimal
1966        var isHex = false,
1967            nextCp = this._lookahead();
1968
1969        if (nextCp === $.LATIN_SMALL_X || nextCp === $.LATIN_CAPITAL_X) {
1970            this._consume();
1971            isHex = true;
1972        }
1973
1974        nextCp = this._lookahead();
1975
1976        //NOTE: if we have at least one digit this is a numeric entity for sure, so we consume it
1977        if (nextCp !== $.EOF && isDigit(nextCp, isHex))
1978            return [this._consumeNumericEntity(isHex)];
1979
1980        else {
1981            //NOTE: otherwise this is a bogus number entity and a parse error. Unconsume the number sign
1982            //and the 'x'-character if appropriate.
1983            this._unconsumeSeveral(isHex ? 2 : 1);
1984            return null;
1985        }
1986    }
1987
1988    else
1989        return this._consumeNamedEntity(startCp, inAttr);
1990};
1991
1992//State machine
1993var _ = Tokenizer.prototype;
1994
1995//12.2.4.1 Data state
1996//------------------------------------------------------------------
1997_[DATA_STATE] = function dataState(cp) {
1998    if (cp === $.AMPERSAND)
1999        this.state = CHARACTER_REFERENCE_IN_DATA_STATE;
2000
2001    else if (cp === $.LESS_THAN_SIGN)
2002        this.state = TAG_OPEN_STATE;
2003
2004    else if (cp === $.NULL)
2005        this._emitCodePoint(cp);
2006
2007    else if (cp === $.EOF)
2008        this._emitEOFToken();
2009
2010    else
2011        this._emitCodePoint(cp);
2012};
2013
2014
2015//12.2.4.2 Character reference in data state
2016//------------------------------------------------------------------
2017_[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp) {
2018    this.state = DATA_STATE;
2019    this.additionalAllowedCp = void 0;
2020
2021    var referencedCodePoints = this._consumeCharacterReference(cp, false);
2022
2023    if (referencedCodePoints)
2024        this._emitSeveralCodePoints(referencedCodePoints);
2025    else
2026        this._emitChar('&');
2027};
2028
2029
2030//12.2.4.3 RCDATA state
2031//------------------------------------------------------------------
2032_[RCDATA_STATE] = function rcdataState(cp) {
2033    if (cp === $.AMPERSAND)
2034        this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE;
2035
2036    else if (cp === $.LESS_THAN_SIGN)
2037        this.state = RCDATA_LESS_THAN_SIGN_STATE;
2038
2039    else if (cp === $.NULL)
2040        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2041
2042    else if (cp === $.EOF)
2043        this._emitEOFToken();
2044
2045    else
2046        this._emitCodePoint(cp);
2047};
2048
2049
2050//12.2.4.4 Character reference in RCDATA state
2051//------------------------------------------------------------------
2052_[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataState(cp) {
2053    this.state = RCDATA_STATE;
2054    this.additionalAllowedCp = void 0;
2055
2056    var referencedCodePoints = this._consumeCharacterReference(cp, false);
2057
2058    if (referencedCodePoints)
2059        this._emitSeveralCodePoints(referencedCodePoints);
2060    else
2061        this._emitChar('&');
2062};
2063
2064
2065//12.2.4.5 RAWTEXT state
2066//------------------------------------------------------------------
2067_[RAWTEXT_STATE] = function rawtextState(cp) {
2068    if (cp === $.LESS_THAN_SIGN)
2069        this.state = RAWTEXT_LESS_THAN_SIGN_STATE;
2070
2071    else if (cp === $.NULL)
2072        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2073
2074    else if (cp === $.EOF)
2075        this._emitEOFToken();
2076
2077    else
2078        this._emitCodePoint(cp);
2079};
2080
2081
2082//12.2.4.6 Script data state
2083//------------------------------------------------------------------
2084_[SCRIPT_DATA_STATE] = function scriptDataState(cp) {
2085    if (cp === $.LESS_THAN_SIGN)
2086        this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;
2087
2088    else if (cp === $.NULL)
2089        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2090
2091    else if (cp === $.EOF)
2092        this._emitEOFToken();
2093
2094    else
2095        this._emitCodePoint(cp);
2096};
2097
2098
2099//12.2.4.7 PLAINTEXT state
2100//------------------------------------------------------------------
2101_[PLAINTEXT_STATE] = function plaintextState(cp) {
2102    if (cp === $.NULL)
2103        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2104
2105    else if (cp === $.EOF)
2106        this._emitEOFToken();
2107
2108    else
2109        this._emitCodePoint(cp);
2110};
2111
2112
2113//12.2.4.8 Tag open state
2114//------------------------------------------------------------------
2115_[TAG_OPEN_STATE] = function tagOpenState(cp) {
2116    if (cp === $.EXCLAMATION_MARK)
2117        this.state = MARKUP_DECLARATION_OPEN_STATE;
2118
2119    else if (cp === $.SOLIDUS)
2120        this.state = END_TAG_OPEN_STATE;
2121
2122    else if (isAsciiUpper(cp)) {
2123        this._createStartTagToken(toAsciiLowerChar(cp));
2124        this.state = TAG_NAME_STATE;
2125    }
2126
2127    else if (isAsciiLower(cp)) {
2128        this._createStartTagToken(toChar(cp));
2129        this.state = TAG_NAME_STATE;
2130    }
2131
2132    else if (cp === $.QUESTION_MARK) {
2133        //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
2134        this[BOGUS_COMMENT_STATE](cp);
2135    }
2136
2137    else {
2138        this._emitChar('<');
2139        this._reconsumeInState(DATA_STATE);
2140    }
2141};
2142
2143
2144//12.2.4.9 End tag open state
2145//------------------------------------------------------------------
2146_[END_TAG_OPEN_STATE] = function endTagOpenState(cp) {
2147    if (isAsciiUpper(cp)) {
2148        this._createEndTagToken(toAsciiLowerChar(cp));
2149        this.state = TAG_NAME_STATE;
2150    }
2151
2152    else if (isAsciiLower(cp)) {
2153        this._createEndTagToken(toChar(cp));
2154        this.state = TAG_NAME_STATE;
2155    }
2156
2157    else if (cp === $.GREATER_THAN_SIGN)
2158        this.state = DATA_STATE;
2159
2160    else if (cp === $.EOF) {
2161        this._reconsumeInState(DATA_STATE);
2162        this._emitChar('<');
2163        this._emitChar('/');
2164    }
2165
2166    else {
2167        //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
2168        this[BOGUS_COMMENT_STATE](cp);
2169    }
2170};
2171
2172
2173//12.2.4.10 Tag name state
2174//------------------------------------------------------------------
2175_[TAG_NAME_STATE] = function tagNameState(cp) {
2176    if (isWhitespace(cp))
2177        this.state = BEFORE_ATTRIBUTE_NAME_STATE;
2178
2179    else if (cp === $.SOLIDUS)
2180        this.state = SELF_CLOSING_START_TAG_STATE;
2181
2182    else if (cp === $.GREATER_THAN_SIGN) {
2183        this.state = DATA_STATE;
2184        this._emitCurrentToken();
2185    }
2186
2187    else if (isAsciiUpper(cp))
2188        this.currentToken.tagName += toAsciiLowerChar(cp);
2189
2190    else if (cp === $.NULL)
2191        this.currentToken.tagName += UNICODE.REPLACEMENT_CHARACTER;
2192
2193    else if (cp === $.EOF)
2194        this._reconsumeInState(DATA_STATE);
2195
2196    else
2197        this.currentToken.tagName += toChar(cp);
2198};
2199
2200
2201//12.2.4.11 RCDATA less-than sign state
2202//------------------------------------------------------------------
2203_[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) {
2204    if (cp === $.SOLIDUS) {
2205        this.tempBuff = [];
2206        this.state = RCDATA_END_TAG_OPEN_STATE;
2207    }
2208
2209    else {
2210        this._emitChar('<');
2211        this._reconsumeInState(RCDATA_STATE);
2212    }
2213};
2214
2215
2216//12.2.4.12 RCDATA end tag open state
2217//------------------------------------------------------------------
2218_[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) {
2219    if (isAsciiUpper(cp)) {
2220        this._createEndTagToken(toAsciiLowerChar(cp));
2221        this.tempBuff.push(cp);
2222        this.state = RCDATA_END_TAG_NAME_STATE;
2223    }
2224
2225    else if (isAsciiLower(cp)) {
2226        this._createEndTagToken(toChar(cp));
2227        this.tempBuff.push(cp);
2228        this.state = RCDATA_END_TAG_NAME_STATE;
2229    }
2230
2231    else {
2232        this._emitChar('<');
2233        this._emitChar('/');
2234        this._reconsumeInState(RCDATA_STATE);
2235    }
2236};
2237
2238
2239//12.2.4.13 RCDATA end tag name state
2240//------------------------------------------------------------------
2241_[RCDATA_END_TAG_NAME_STATE] = function rcdataEndTagNameState(cp) {
2242    if (isAsciiUpper(cp)) {
2243        this.currentToken.tagName += toAsciiLowerChar(cp);
2244        this.tempBuff.push(cp);
2245    }
2246
2247    else if (isAsciiLower(cp)) {
2248        this.currentToken.tagName += toChar(cp);
2249        this.tempBuff.push(cp);
2250    }
2251
2252    else {
2253        if (this._isAppropriateEndTagToken()) {
2254            if (isWhitespace(cp)) {
2255                this.state = BEFORE_ATTRIBUTE_NAME_STATE;
2256                return;
2257            }
2258
2259            if (cp === $.SOLIDUS) {
2260                this.state = SELF_CLOSING_START_TAG_STATE;
2261                return;
2262            }
2263
2264            if (cp === $.GREATER_THAN_SIGN) {
2265                this.state = DATA_STATE;
2266                this._emitCurrentToken();
2267                return;
2268            }
2269        }
2270
2271        this._emitChar('<');
2272        this._emitChar('/');
2273        this._emitSeveralCodePoints(this.tempBuff);
2274        this._reconsumeInState(RCDATA_STATE);
2275    }
2276};
2277
2278
2279//12.2.4.14 RAWTEXT less-than sign state
2280//------------------------------------------------------------------
2281_[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) {
2282    if (cp === $.SOLIDUS) {
2283        this.tempBuff = [];
2284        this.state = RAWTEXT_END_TAG_OPEN_STATE;
2285    }
2286
2287    else {
2288        this._emitChar('<');
2289        this._reconsumeInState(RAWTEXT_STATE);
2290    }
2291};
2292
2293
2294//12.2.4.15 RAWTEXT end tag open state
2295//------------------------------------------------------------------
2296_[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) {
2297    if (isAsciiUpper(cp)) {
2298        this._createEndTagToken(toAsciiLowerChar(cp));
2299        this.tempBuff.push(cp);
2300        this.state = RAWTEXT_END_TAG_NAME_STATE;
2301    }
2302
2303    else if (isAsciiLower(cp)) {
2304        this._createEndTagToken(toChar(cp));
2305        this.tempBuff.push(cp);
2306        this.state = RAWTEXT_END_TAG_NAME_STATE;
2307    }
2308
2309    else {
2310        this._emitChar('<');
2311        this._emitChar('/');
2312        this._reconsumeInState(RAWTEXT_STATE);
2313    }
2314};
2315
2316
2317//12.2.4.16 RAWTEXT end tag name state
2318//------------------------------------------------------------------
2319_[RAWTEXT_END_TAG_NAME_STATE] = function rawtextEndTagNameState(cp) {
2320    if (isAsciiUpper(cp)) {
2321        this.currentToken.tagName += toAsciiLowerChar(cp);
2322        this.tempBuff.push(cp);
2323    }
2324
2325    else if (isAsciiLower(cp)) {
2326        this.currentToken.tagName += toChar(cp);
2327        this.tempBuff.push(cp);
2328    }
2329
2330    else {
2331        if (this._isAppropriateEndTagToken()) {
2332            if (isWhitespace(cp)) {
2333                this.state = BEFORE_ATTRIBUTE_NAME_STATE;
2334                return;
2335            }
2336
2337            if (cp === $.SOLIDUS) {
2338                this.state = SELF_CLOSING_START_TAG_STATE;
2339                return;
2340            }
2341
2342            if (cp === $.GREATER_THAN_SIGN) {
2343                this._emitCurrentToken();
2344                this.state = DATA_STATE;
2345                return;
2346            }
2347        }
2348
2349        this._emitChar('<');
2350        this._emitChar('/');
2351        this._emitSeveralCodePoints(this.tempBuff);
2352        this._reconsumeInState(RAWTEXT_STATE);
2353    }
2354};
2355
2356
2357//12.2.4.17 Script data less-than sign state
2358//------------------------------------------------------------------
2359_[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(cp) {
2360    if (cp === $.SOLIDUS) {
2361        this.tempBuff = [];
2362        this.state = SCRIPT_DATA_END_TAG_OPEN_STATE;
2363    }
2364
2365    else if (cp === $.EXCLAMATION_MARK) {
2366        this.state = SCRIPT_DATA_ESCAPE_START_STATE;
2367        this._emitChar('<');
2368        this._emitChar('!');
2369    }
2370
2371    else {
2372        this._emitChar('<');
2373        this._reconsumeInState(SCRIPT_DATA_STATE);
2374    }
2375};
2376
2377
2378//12.2.4.18 Script data end tag open state
2379//------------------------------------------------------------------
2380_[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) {
2381    if (isAsciiUpper(cp)) {
2382        this._createEndTagToken(toAsciiLowerChar(cp));
2383        this.tempBuff.push(cp);
2384        this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
2385    }
2386
2387    else if (isAsciiLower(cp)) {
2388        this._createEndTagToken(toChar(cp));
2389        this.tempBuff.push(cp);
2390        this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
2391    }
2392
2393    else {
2394        this._emitChar('<');
2395        this._emitChar('/');
2396        this._reconsumeInState(SCRIPT_DATA_STATE);
2397    }
2398};
2399
2400
2401//12.2.4.19 Script data end tag name state
2402//------------------------------------------------------------------
2403_[SCRIPT_DATA_END_TAG_NAME_STATE] = function scriptDataEndTagNameState(cp) {
2404    if (isAsciiUpper(cp)) {
2405        this.currentToken.tagName += toAsciiLowerChar(cp);
2406        this.tempBuff.push(cp);
2407    }
2408
2409    else if (isAsciiLower(cp)) {
2410        this.currentToken.tagName += toChar(cp);
2411        this.tempBuff.push(cp);
2412    }
2413
2414    else {
2415        if (this._isAppropriateEndTagToken()) {
2416            if (isWhitespace(cp)) {
2417                this.state = BEFORE_ATTRIBUTE_NAME_STATE;
2418                return;
2419            }
2420
2421            else if (cp === $.SOLIDUS) {
2422                this.state = SELF_CLOSING_START_TAG_STATE;
2423                return;
2424            }
2425
2426            else if (cp === $.GREATER_THAN_SIGN) {
2427                this._emitCurrentToken();
2428                this.state = DATA_STATE;
2429                return;
2430            }
2431        }
2432
2433        this._emitChar('<');
2434        this._emitChar('/');
2435        this._emitSeveralCodePoints(this.tempBuff);
2436        this._reconsumeInState(SCRIPT_DATA_STATE);
2437    }
2438};
2439
2440
2441//12.2.4.20 Script data escape start state
2442//------------------------------------------------------------------
2443_[SCRIPT_DATA_ESCAPE_START_STATE] = function scriptDataEscapeStartState(cp) {
2444    if (cp === $.HYPHEN_MINUS) {
2445        this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE;
2446        this._emitChar('-');
2447    }
2448
2449    else
2450        this._reconsumeInState(SCRIPT_DATA_STATE);
2451};
2452
2453
2454//12.2.4.21 Script data escape start dash state
2455//------------------------------------------------------------------
2456_[SCRIPT_DATA_ESCAPE_START_DASH_STATE] = function scriptDataEscapeStartDashState(cp) {
2457    if (cp === $.HYPHEN_MINUS) {
2458        this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
2459        this._emitChar('-');
2460    }
2461
2462    else
2463        this._reconsumeInState(SCRIPT_DATA_STATE);
2464};
2465
2466
2467//12.2.4.22 Script data escaped state
2468//------------------------------------------------------------------
2469_[SCRIPT_DATA_ESCAPED_STATE] = function scriptDataEscapedState(cp) {
2470    if (cp === $.HYPHEN_MINUS) {
2471        this.state = SCRIPT_DATA_ESCAPED_DASH_STATE;
2472        this._emitChar('-');
2473    }
2474
2475    else if (cp === $.LESS_THAN_SIGN)
2476        this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
2477
2478    else if (cp === $.NULL)
2479        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2480
2481    else if (cp === $.EOF)
2482        this._reconsumeInState(DATA_STATE);
2483
2484    else
2485        this._emitCodePoint(cp);
2486};
2487
2488
2489//12.2.4.23 Script data escaped dash state
2490//------------------------------------------------------------------
2491_[SCRIPT_DATA_ESCAPED_DASH_STATE] = function scriptDataEscapedDashState(cp) {
2492    if (cp === $.HYPHEN_MINUS) {
2493        this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
2494        this._emitChar('-');
2495    }
2496
2497    else if (cp === $.LESS_THAN_SIGN)
2498        this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
2499
2500    else if (cp === $.NULL) {
2501        this.state = SCRIPT_DATA_ESCAPED_STATE;
2502        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2503    }
2504
2505    else if (cp === $.EOF)
2506        this._reconsumeInState(DATA_STATE);
2507
2508    else {
2509        this.state = SCRIPT_DATA_ESCAPED_STATE;
2510        this._emitCodePoint(cp);
2511    }
2512};
2513
2514
2515//12.2.4.24 Script data escaped dash dash state
2516//------------------------------------------------------------------
2517_[SCRIPT_DATA_ESCAPED_DASH_DASH_STATE] = function scriptDataEscapedDashDashState(cp) {
2518    if (cp === $.HYPHEN_MINUS)
2519        this._emitChar('-');
2520
2521    else if (cp === $.LESS_THAN_SIGN)
2522        this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
2523
2524    else if (cp === $.GREATER_THAN_SIGN) {
2525        this.state = SCRIPT_DATA_STATE;
2526        this._emitChar('>');
2527    }
2528
2529    else if (cp === $.NULL) {
2530        this.state = SCRIPT_DATA_ESCAPED_STATE;
2531        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2532    }
2533
2534    else if (cp === $.EOF)
2535        this._reconsumeInState(DATA_STATE);
2536
2537    else {
2538        this.state = SCRIPT_DATA_ESCAPED_STATE;
2539        this._emitCodePoint(cp);
2540    }
2541};
2542
2543
2544//12.2.4.25 Script data escaped less-than sign state
2545//------------------------------------------------------------------
2546_[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThanSignState(cp) {
2547    if (cp === $.SOLIDUS) {
2548        this.tempBuff = [];
2549        this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;
2550    }
2551
2552    else if (isAsciiUpper(cp)) {
2553        this.tempBuff = [];
2554        this.tempBuff.push(toAsciiLowerCodePoint(cp));
2555        this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
2556        this._emitChar('<');
2557        this._emitCodePoint(cp);
2558    }
2559
2560    else if (isAsciiLower(cp)) {
2561        this.tempBuff = [];
2562        this.tempBuff.push(cp);
2563        this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
2564        this._emitChar('<');
2565        this._emitCodePoint(cp);
2566    }
2567
2568    else {
2569        this._emitChar('<');
2570        this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
2571    }
2572};
2573
2574
2575//12.2.4.26 Script data escaped end tag open state
2576//------------------------------------------------------------------
2577_[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) {
2578    if (isAsciiUpper(cp)) {
2579        this._createEndTagToken(toAsciiLowerChar(cp));
2580        this.tempBuff.push(cp);
2581        this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
2582    }
2583
2584    else if (isAsciiLower(cp)) {
2585        this._createEndTagToken(toChar(cp));
2586        this.tempBuff.push(cp);
2587        this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
2588    }
2589
2590    else {
2591        this._emitChar('<');
2592        this._emitChar('/');
2593        this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
2594    }
2595};
2596
2597
2598//12.2.4.27 Script data escaped end tag name state
2599//------------------------------------------------------------------
2600_[SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE] = function scriptDataEscapedEndTagNameState(cp) {
2601    if (isAsciiUpper(cp)) {
2602        this.currentToken.tagName += toAsciiLowerChar(cp);
2603        this.tempBuff.push(cp);
2604    }
2605
2606    else if (isAsciiLower(cp)) {
2607        this.currentToken.tagName += toChar(cp);
2608        this.tempBuff.push(cp);
2609    }
2610
2611    else {
2612        if (this._isAppropriateEndTagToken()) {
2613            if (isWhitespace(cp)) {
2614                this.state = BEFORE_ATTRIBUTE_NAME_STATE;
2615                return;
2616            }
2617
2618            if (cp === $.SOLIDUS) {
2619                this.state = SELF_CLOSING_START_TAG_STATE;
2620                return;
2621            }
2622
2623            if (cp === $.GREATER_THAN_SIGN) {
2624                this._emitCurrentToken();
2625                this.state = DATA_STATE;
2626                return;
2627            }
2628        }
2629
2630        this._emitChar('<');
2631        this._emitChar('/');
2632        this._emitSeveralCodePoints(this.tempBuff);
2633        this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
2634    }
2635};
2636
2637
2638//12.2.4.28 Script data double escape start state
2639//------------------------------------------------------------------
2640_[SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE] = function scriptDataDoubleEscapeStartState(cp) {
2641    if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
2642        this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE : SCRIPT_DATA_ESCAPED_STATE;
2643        this._emitCodePoint(cp);
2644    }
2645
2646    else if (isAsciiUpper(cp)) {
2647        this.tempBuff.push(toAsciiLowerCodePoint(cp));
2648        this._emitCodePoint(cp);
2649    }
2650
2651    else if (isAsciiLower(cp)) {
2652        this.tempBuff.push(cp);
2653        this._emitCodePoint(cp);
2654    }
2655
2656    else
2657        this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
2658};
2659
2660
2661//12.2.4.29 Script data double escaped state
2662//------------------------------------------------------------------
2663_[SCRIPT_DATA_DOUBLE_ESCAPED_STATE] = function scriptDataDoubleEscapedState(cp) {
2664    if (cp === $.HYPHEN_MINUS) {
2665        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE;
2666        this._emitChar('-');
2667    }
2668
2669    else if (cp === $.LESS_THAN_SIGN) {
2670        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
2671        this._emitChar('<');
2672    }
2673
2674    else if (cp === $.NULL)
2675        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2676
2677    else if (cp === $.EOF)
2678        this._reconsumeInState(DATA_STATE);
2679
2680    else
2681        this._emitCodePoint(cp);
2682};
2683
2684
2685//12.2.4.30 Script data double escaped dash state
2686//------------------------------------------------------------------
2687_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE] = function scriptDataDoubleEscapedDashState(cp) {
2688    if (cp === $.HYPHEN_MINUS) {
2689        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE;
2690        this._emitChar('-');
2691    }
2692
2693    else if (cp === $.LESS_THAN_SIGN) {
2694        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
2695        this._emitChar('<');
2696    }
2697
2698    else if (cp === $.NULL) {
2699        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
2700        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2701    }
2702
2703    else if (cp === $.EOF)
2704        this._reconsumeInState(DATA_STATE);
2705
2706    else {
2707        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
2708        this._emitCodePoint(cp);
2709    }
2710};
2711
2712
2713//12.2.4.31 Script data double escaped dash dash state
2714//------------------------------------------------------------------
2715_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE] = function scriptDataDoubleEscapedDashDashState(cp) {
2716    if (cp === $.HYPHEN_MINUS)
2717        this._emitChar('-');
2718
2719    else if (cp === $.LESS_THAN_SIGN) {
2720        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
2721        this._emitChar('<');
2722    }
2723
2724    else if (cp === $.GREATER_THAN_SIGN) {
2725        this.state = SCRIPT_DATA_STATE;
2726        this._emitChar('>');
2727    }
2728
2729    else if (cp === $.NULL) {
2730        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
2731        this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
2732    }
2733
2734    else if (cp === $.EOF)
2735        this._reconsumeInState(DATA_STATE);
2736
2737    else {
2738        this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
2739        this._emitCodePoint(cp);
2740    }
2741};
2742
2743
2744//12.2.4.32 Script data double escaped less-than sign state
2745//------------------------------------------------------------------
2746_[SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataDoubleEscapedLessThanSignState(cp) {
2747    if (cp === $.SOLIDUS) {
2748        this.tempBuff = [];
2749        this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE;
2750        this._emitChar('/');
2751    }
2752
2753    else
2754        this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
2755};
2756
2757
2758//12.2.4.33 Script data double escape end state
2759//------------------------------------------------------------------
2760_[SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE] = function scriptDataDoubleEscapeEndState(cp) {
2761    if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
2762        this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_ESCAPED_STATE : SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
2763
2764        this._emitCodePoint(cp);
2765    }
2766
2767    else if (isAsciiUpper(cp)) {
2768        this.tempBuff.push(toAsciiLowerCodePoint(cp));
2769        this._emitCodePoint(cp);
2770    }
2771
2772    else if (isAsciiLower(cp)) {
2773        this.tempBuff.push(cp);
2774        this._emitCodePoint(cp);
2775    }
2776
2777    else
2778        this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
2779};
2780
2781
2782//12.2.4.34 Before attribute name state
2783//------------------------------------------------------------------
2784_[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) {
2785    if (isWhitespace(cp))
2786        return;
2787
2788    if (cp === $.SOLIDUS)
2789        this.state = SELF_CLOSING_START_TAG_STATE;
2790
2791    else if (cp === $.GREATER_THAN_SIGN) {
2792        this.state = DATA_STATE;
2793        this._emitCurrentToken();
2794    }
2795
2796    else if (isAsciiUpper(cp)) {
2797        this._createAttr(toAsciiLowerChar(cp));
2798        this.state = ATTRIBUTE_NAME_STATE;
2799    }
2800
2801    else if (cp === $.NULL) {
2802        this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
2803        this.state = ATTRIBUTE_NAME_STATE;
2804    }
2805
2806    else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN) {
2807        this._createAttr(toChar(cp));
2808        this.state = ATTRIBUTE_NAME_STATE;
2809    }
2810
2811    else if (cp === $.EOF)
2812        this._reconsumeInState(DATA_STATE);
2813
2814    else {
2815        this._createAttr(toChar(cp));
2816        this.state = ATTRIBUTE_NAME_STATE;
2817    }
2818};
2819
2820
2821//12.2.4.35 Attribute name state
2822//------------------------------------------------------------------
2823_[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) {
2824    if (isWhitespace(cp))
2825        this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE);
2826
2827    else if (cp === $.SOLIDUS)
2828        this._leaveAttrName(SELF_CLOSING_START_TAG_STATE);
2829
2830    else if (cp === $.EQUALS_SIGN)
2831        this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE);
2832
2833    else if (cp === $.GREATER_THAN_SIGN) {
2834        this._leaveAttrName(DATA_STATE);
2835        this._emitCurrentToken();
2836    }
2837
2838    else if (isAsciiUpper(cp))
2839        this.currentAttr.name += toAsciiLowerChar(cp);
2840
2841    else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN)
2842        this.currentAttr.name += toChar(cp);
2843
2844    else if (cp === $.NULL)
2845        this.currentAttr.name += UNICODE.REPLACEMENT_CHARACTER;
2846
2847    else if (cp === $.EOF)
2848        this._reconsumeInState(DATA_STATE);
2849
2850    else
2851        this.currentAttr.name += toChar(cp);
2852};
2853
2854
2855//12.2.4.36 After attribute name state
2856//------------------------------------------------------------------
2857_[AFTER_ATTRIBUTE_NAME_STATE] = function afterAttributeNameState(cp) {
2858    if (isWhitespace(cp))
2859        return;
2860
2861    if (cp === $.SOLIDUS)
2862        this.state = SELF_CLOSING_START_TAG_STATE;
2863
2864    else if (cp === $.EQUALS_SIGN)
2865        this.state = BEFORE_ATTRIBUTE_VALUE_STATE;
2866
2867    else if (cp === $.GREATER_THAN_SIGN) {
2868        this.state = DATA_STATE;
2869        this._emitCurrentToken();
2870    }
2871
2872    else if (isAsciiUpper(cp)) {
2873        this._createAttr(toAsciiLowerChar(cp));
2874        this.state = ATTRIBUTE_NAME_STATE;
2875    }
2876
2877    else if (cp === $.NULL) {
2878        this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
2879        this.state = ATTRIBUTE_NAME_STATE;
2880    }
2881
2882    else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) {
2883        this._createAttr(toChar(cp));
2884        this.state = ATTRIBUTE_NAME_STATE;
2885    }
2886
2887    else if (cp === $.EOF)
2888        this._reconsumeInState(DATA_STATE);
2889
2890    else {
2891        this._createAttr(toChar(cp));
2892        this.state = ATTRIBUTE_NAME_STATE;
2893    }
2894};
2895
2896
2897//12.2.4.37 Before attribute value state
2898//------------------------------------------------------------------
2899_[BEFORE_ATTRIBUTE_VALUE_STATE] = function beforeAttributeValueState(cp) {
2900    if (isWhitespace(cp))
2901        return;
2902
2903    if (cp === $.QUOTATION_MARK)
2904        this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;
2905
2906    else if (cp === $.AMPERSAND)
2907        this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);
2908
2909    else if (cp === $.APOSTROPHE)
2910        this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;
2911
2912    else if (cp === $.NULL) {
2913        this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
2914        this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
2915    }
2916
2917    else if (cp === $.GREATER_THAN_SIGN) {
2918        this.state = DATA_STATE;
2919        this._emitCurrentToken();
2920    }
2921
2922    else if (cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) {
2923        this.currentAttr.value += toChar(cp);
2924        this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
2925    }
2926
2927    else if (cp === $.EOF)
2928        this._reconsumeInState(DATA_STATE);
2929
2930    else {
2931        this.currentAttr.value += toChar(cp);
2932        this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
2933    }
2934};
2935
2936
2937//12.2.4.38 Attribute value (double-quoted) state
2938//------------------------------------------------------------------
2939_[ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE] = function attributeValueDoubleQuotedState(cp) {
2940    if (cp === $.QUOTATION_MARK)
2941        this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
2942
2943    else if (cp === $.AMPERSAND) {
2944        this.additionalAllowedCp = $.QUOTATION_MARK;
2945        this.returnState = this.state;
2946        this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
2947    }
2948
2949    else if (cp === $.NULL)
2950        this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
2951
2952    else if (cp === $.EOF)
2953        this._reconsumeInState(DATA_STATE);
2954
2955    else
2956        this.currentAttr.value += toChar(cp);
2957};
2958
2959
2960//12.2.4.39 Attribute value (single-quoted) state
2961//------------------------------------------------------------------
2962_[ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE] = function attributeValueSingleQuotedState(cp) {
2963    if (cp === $.APOSTROPHE)
2964        this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
2965
2966    else if (cp === $.AMPERSAND) {
2967        this.additionalAllowedCp = $.APOSTROPHE;
2968        this.returnState = this.state;
2969        this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
2970    }
2971
2972    else if (cp === $.NULL)
2973        this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
2974
2975    else if (cp === $.EOF)
2976        this._reconsumeInState(DATA_STATE);
2977
2978    else
2979        this.currentAttr.value += toChar(cp);
2980};
2981
2982
2983//12.2.4.40 Attribute value (unquoted) state
2984//------------------------------------------------------------------
2985_[ATTRIBUTE_VALUE_UNQUOTED_STATE] = function attributeValueUnquotedState(cp) {
2986    if (isWhitespace(cp))
2987        this.state = BEFORE_ATTRIBUTE_NAME_STATE;
2988
2989    else if (cp === $.AMPERSAND) {
2990        this.additionalAllowedCp = $.GREATER_THAN_SIGN;
2991        this.returnState = this.state;
2992        this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
2993    }
2994
2995    else if (cp === $.GREATER_THAN_SIGN) {
2996        this.state = DATA_STATE;
2997        this._emitCurrentToken();
2998    }
2999
3000    else if (cp === $.NULL)
3001        this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
3002
3003    else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN ||
3004             cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) {
3005        this.currentAttr.value += toChar(cp);
3006    }
3007
3008    else if (cp === $.EOF)
3009        this._reconsumeInState(DATA_STATE);
3010
3011    else
3012        this.currentAttr.value += toChar(cp);
3013};
3014
3015
3016//12.2.4.41 Character reference in attribute value state
3017//------------------------------------------------------------------
3018_[CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE] = function characterReferenceInAttributeValueState(cp) {
3019    var referencedCodePoints = this._consumeCharacterReference(cp, true);
3020
3021    if (referencedCodePoints) {
3022        for (var i = 0; i < referencedCodePoints.length; i++)
3023            this.currentAttr.value += toChar(referencedCodePoints[i]);
3024    } else
3025        this.currentAttr.value += '&';
3026
3027    this.state = this.returnState;
3028};
3029
3030
3031//12.2.4.42 After attribute value (quoted) state
3032//------------------------------------------------------------------
3033_[AFTER_ATTRIBUTE_VALUE_QUOTED_STATE] = function afterAttributeValueQuotedState(cp) {
3034    if (isWhitespace(cp))
3035        this.state = BEFORE_ATTRIBUTE_NAME_STATE;
3036
3037    else if (cp === $.SOLIDUS)
3038        this.state = SELF_CLOSING_START_TAG_STATE;
3039
3040    else if (cp === $.GREATER_THAN_SIGN) {
3041        this.state = DATA_STATE;
3042        this._emitCurrentToken();
3043    }
3044
3045    else if (cp === $.EOF)
3046        this._reconsumeInState(DATA_STATE);
3047
3048    else
3049        this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
3050};
3051
3052
3053//12.2.4.43 Self-closing start tag state
3054//------------------------------------------------------------------
3055_[SELF_CLOSING_START_TAG_STATE] = function selfClosingStartTagState(cp) {
3056    if (cp === $.GREATER_THAN_SIGN) {
3057        this.currentToken.selfClosing = true;
3058        this.state = DATA_STATE;
3059        this._emitCurrentToken();
3060    }
3061
3062    else if (cp === $.EOF)
3063        this._reconsumeInState(DATA_STATE);
3064
3065    else
3066        this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
3067};
3068
3069
3070//12.2.4.44 Bogus comment state
3071//------------------------------------------------------------------
3072_[BOGUS_COMMENT_STATE] = function bogusCommentState(cp) {
3073    this._createCommentToken();
3074
3075    while (true) {
3076        if (cp === $.GREATER_THAN_SIGN) {
3077            this.state = DATA_STATE;
3078            break;
3079        }
3080
3081        else if (cp === $.EOF) {
3082            this._reconsumeInState(DATA_STATE);
3083            break;
3084        }
3085
3086        else {
3087            this.currentToken.data += cp === $.NULL ? UNICODE.REPLACEMENT_CHARACTER : toChar(cp);
3088            cp = this._consume();
3089        }
3090    }
3091
3092    this._emitCurrentToken();
3093};
3094
3095
3096//12.2.4.45 Markup declaration open state
3097//------------------------------------------------------------------
3098_[MARKUP_DECLARATION_OPEN_STATE] = function markupDeclarationOpenState(cp) {
3099    if (this._consumeSubsequentIfMatch($$.DASH_DASH_STRING, cp, true)) {
3100        this._createCommentToken();
3101        this.state = COMMENT_START_STATE;
3102    }
3103
3104    else if (this._consumeSubsequentIfMatch($$.DOCTYPE_STRING, cp, false))
3105        this.state = DOCTYPE_STATE;
3106
3107    else if (this.allowCDATA && this._consumeSubsequentIfMatch($$.CDATA_START_STRING, cp, true))
3108        this.state = CDATA_SECTION_STATE;
3109
3110    else {
3111        //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
3112        this[BOGUS_COMMENT_STATE](cp);
3113    }
3114};
3115
3116
3117//12.2.4.46 Comment start state
3118//------------------------------------------------------------------
3119_[COMMENT_START_STATE] = function commentStartState(cp) {
3120    if (cp === $.HYPHEN_MINUS)
3121        this.state = COMMENT_START_DASH_STATE;
3122
3123    else if (cp === $.NULL) {
3124        this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
3125        this.state = COMMENT_STATE;
3126    }
3127
3128    else if (cp === $.GREATER_THAN_SIGN) {
3129        this.state = DATA_STATE;
3130        this._emitCurrentToken();
3131    }
3132
3133    else if (cp === $.EOF) {
3134        this._emitCurrentToken();
3135        this._reconsumeInState(DATA_STATE);
3136    }
3137
3138    else {
3139        this.currentToken.data += toChar(cp);
3140        this.state = COMMENT_STATE;
3141    }
3142};
3143
3144
3145//12.2.4.47 Comment start dash state
3146//------------------------------------------------------------------
3147_[COMMENT_START_DASH_STATE] = function commentStartDashState(cp) {
3148    if (cp === $.HYPHEN_MINUS)
3149        this.state = COMMENT_END_STATE;
3150
3151    else if (cp === $.NULL) {
3152        this.currentToken.data += '-';
3153        this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
3154        this.state = COMMENT_STATE;
3155    }
3156
3157    else if (cp === $.GREATER_THAN_SIGN) {
3158        this.state = DATA_STATE;
3159        this._emitCurrentToken();
3160    }
3161
3162    else if (cp === $.EOF) {
3163        this._emitCurrentToken();
3164        this._reconsumeInState(DATA_STATE);
3165    }
3166
3167    else {
3168        this.currentToken.data += '-';
3169        this.currentToken.data += toChar(cp);
3170        this.state = COMMENT_STATE;
3171    }
3172};
3173
3174
3175//12.2.4.48 Comment state
3176//------------------------------------------------------------------
3177_[COMMENT_STATE] = function commentState(cp) {
3178    if (cp === $.HYPHEN_MINUS)
3179        this.state = COMMENT_END_DASH_STATE;
3180
3181    else if (cp === $.NULL)
3182        this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
3183
3184    else if (cp === $.EOF) {
3185        this._emitCurrentToken();
3186        this._reconsumeInState(DATA_STATE);
3187    }
3188
3189    else
3190        this.currentToken.data += toChar(cp);
3191};
3192
3193
3194//12.2.4.49 Comment end dash state
3195//------------------------------------------------------------------
3196_[COMMENT_END_DASH_STATE] = function commentEndDashState(cp) {
3197    if (cp === $.HYPHEN_MINUS)
3198        this.state = COMMENT_END_STATE;
3199
3200    else if (cp === $.NULL) {
3201        this.currentToken.data += '-';
3202        this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
3203        this.state = COMMENT_STATE;
3204    }
3205
3206    else if (cp === $.EOF) {
3207        this._emitCurrentToken();
3208        this._reconsumeInState(DATA_STATE);
3209    }
3210
3211    else {
3212        this.currentToken.data += '-';
3213        this.currentToken.data += toChar(cp);
3214        this.state = COMMENT_STATE;
3215    }
3216};
3217
3218
3219//12.2.4.50 Comment end state
3220//------------------------------------------------------------------
3221_[COMMENT_END_STATE] = function commentEndState(cp) {
3222    if (cp === $.GREATER_THAN_SIGN) {
3223        this.state = DATA_STATE;
3224        this._emitCurrentToken();
3225    }
3226
3227    else if (cp === $.EXCLAMATION_MARK)
3228        this.state = COMMENT_END_BANG_STATE;
3229
3230    else if (cp === $.HYPHEN_MINUS)
3231        this.currentToken.data += '-';
3232
3233    else if (cp === $.NULL) {
3234        this.currentToken.data += '--';
3235        this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
3236        this.state = COMMENT_STATE;
3237    }
3238
3239    else if (cp === $.EOF) {
3240        this._reconsumeInState(DATA_STATE);
3241        this._emitCurrentToken();
3242    }
3243
3244    else {
3245        this.currentToken.data += '--';
3246        this.currentToken.data += toChar(cp);
3247        this.state = COMMENT_STATE;
3248    }
3249};
3250
3251
3252//12.2.4.51 Comment end bang state
3253//------------------------------------------------------------------
3254_[COMMENT_END_BANG_STATE] = function commentEndBangState(cp) {
3255    if (cp === $.HYPHEN_MINUS) {
3256        this.currentToken.data += '--!';
3257        this.state = COMMENT_END_DASH_STATE;
3258    }
3259
3260    else if (cp === $.GREATER_THAN_SIGN) {
3261        this.state = DATA_STATE;
3262        this._emitCurrentToken();
3263    }
3264
3265    else if (cp === $.NULL) {
3266        this.currentToken.data += '--!';
3267        this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
3268        this.state = COMMENT_STATE;
3269    }
3270
3271    else if (cp === $.EOF) {
3272        this._emitCurrentToken();
3273        this._reconsumeInState(DATA_STATE);
3274    }
3275
3276    else {
3277        this.currentToken.data += '--!';
3278        this.currentToken.data += toChar(cp);
3279        this.state = COMMENT_STATE;
3280    }
3281};
3282
3283
3284//12.2.4.52 DOCTYPE state
3285//------------------------------------------------------------------
3286_[DOCTYPE_STATE] = function doctypeState(cp) {
3287    if (isWhitespace(cp))
3288        this.state = BEFORE_DOCTYPE_NAME_STATE;
3289
3290    else if (cp === $.EOF) {
3291        this._createDoctypeToken();
3292        this.currentToken.forceQuirks = true;
3293        this._emitCurrentToken();
3294        this._reconsumeInState(DATA_STATE);
3295    }
3296
3297    else
3298        this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);
3299};
3300
3301
3302//12.2.4.53 Before DOCTYPE name state
3303//------------------------------------------------------------------
3304_[BEFORE_DOCTYPE_NAME_STATE] = function beforeDoctypeNameState(cp) {
3305    if (isWhitespace(cp))
3306        return;
3307
3308    if (isAsciiUpper(cp)) {
3309        this._createDoctypeToken(toAsciiLowerChar(cp));
3310        this.state = DOCTYPE_NAME_STATE;
3311    }
3312
3313    else if (cp === $.GREATER_THAN_SIGN) {
3314        this._createDoctypeToken();
3315        this.currentToken.forceQuirks = true;
3316        this._emitCurrentToken();
3317        this.state = DATA_STATE;
3318    }
3319
3320    else if (cp === $.EOF) {
3321        this._createDoctypeToken();
3322        this.currentToken.forceQuirks = true;
3323        this._emitCurrentToken();
3324        this._reconsumeInState(DATA_STATE);
3325    }
3326
3327    else if (cp === $.NULL) {
3328        this._createDoctypeToken(UNICODE.REPLACEMENT_CHARACTER);
3329        this.state = DOCTYPE_NAME_STATE;
3330    }
3331
3332    else {
3333        this._createDoctypeToken(toChar(cp));
3334        this.state = DOCTYPE_NAME_STATE;
3335    }
3336};
3337
3338
3339//12.2.4.54 DOCTYPE name state
3340//------------------------------------------------------------------
3341_[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) {
3342    if (isWhitespace(cp))
3343        this.state = AFTER_DOCTYPE_NAME_STATE;
3344
3345    else if (cp === $.GREATER_THAN_SIGN) {
3346        this._emitCurrentToken();
3347        this.state = DATA_STATE;
3348    }
3349
3350    else if (isAsciiUpper(cp))
3351        this.currentToken.name += toAsciiLowerChar(cp);
3352
3353    else if (cp === $.NULL)
3354        this.currentToken.name += UNICODE.REPLACEMENT_CHARACTER;
3355
3356    else if (cp === $.EOF) {
3357        this.currentToken.forceQuirks = true;
3358        this._emitCurrentToken();
3359        this._reconsumeInState(DATA_STATE);
3360    }
3361
3362    else
3363        this.currentToken.name += toChar(cp);
3364};
3365
3366
3367//12.2.4.55 After DOCTYPE name state
3368//------------------------------------------------------------------
3369_[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) {
3370    if (isWhitespace(cp))
3371        return;
3372
3373    if (cp === $.GREATER_THAN_SIGN) {
3374        this.state = DATA_STATE;
3375        this._emitCurrentToken();
3376    }
3377
3378    else if (cp === $.EOF) {
3379        this.currentToken.forceQuirks = true;
3380        this._emitCurrentToken();
3381        this._reconsumeInState(DATA_STATE);
3382    }
3383
3384    else if (this._consumeSubsequentIfMatch($$.PUBLIC_STRING, cp, false))
3385        this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE;
3386
3387    else if (this._consumeSubsequentIfMatch($$.SYSTEM_STRING, cp, false))
3388        this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE;
3389
3390    else {
3391        this.currentToken.forceQuirks = true;
3392        this.state = BOGUS_DOCTYPE_STATE;
3393    }
3394};
3395
3396
3397//12.2.4.56 After DOCTYPE public keyword state
3398//------------------------------------------------------------------
3399_[AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE] = function afterDoctypePublicKeywordState(cp) {
3400    if (isWhitespace(cp))
3401        this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
3402
3403    else if (cp === $.QUOTATION_MARK) {
3404        this.currentToken.publicId = '';
3405        this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
3406    }
3407
3408    else if (cp === $.APOSTROPHE) {
3409        this.currentToken.publicId = '';
3410        this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
3411    }
3412
3413    else if (cp === $.GREATER_THAN_SIGN) {
3414        this.currentToken.forceQuirks = true;
3415        this._emitCurrentToken();
3416        this.state = DATA_STATE;
3417    }
3418
3419    else if (cp === $.EOF) {
3420        this.currentToken.forceQuirks = true;
3421        this._emitCurrentToken();
3422        this._reconsumeInState(DATA_STATE);
3423    }
3424
3425    else {
3426        this.currentToken.forceQuirks = true;
3427        this.state = BOGUS_DOCTYPE_STATE;
3428    }
3429};
3430
3431
3432//12.2.4.57 Before DOCTYPE public identifier state
3433//------------------------------------------------------------------
3434_[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifierState(cp) {
3435    if (isWhitespace(cp))
3436        return;
3437
3438    if (cp === $.QUOTATION_MARK) {
3439        this.currentToken.publicId = '';
3440        this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
3441    }
3442
3443    else if (cp === $.APOSTROPHE) {
3444        this.currentToken.publicId = '';
3445        this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
3446    }
3447
3448    else if (cp === $.GREATER_THAN_SIGN) {
3449        this.currentToken.forceQuirks = true;
3450        this._emitCurrentToken();
3451        this.state = DATA_STATE;
3452    }
3453
3454    else if (cp === $.EOF) {
3455        this.currentToken.forceQuirks = true;
3456        this._emitCurrentToken();
3457        this._reconsumeInState(DATA_STATE);
3458    }
3459
3460    else {
3461        this.currentToken.forceQuirks = true;
3462        this.state = BOGUS_DOCTYPE_STATE;
3463    }
3464};
3465
3466
3467//12.2.4.58 DOCTYPE public identifier (double-quoted) state
3468//------------------------------------------------------------------
3469_[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentifierDoubleQuotedState(cp) {
3470    if (cp === $.QUOTATION_MARK)
3471        this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
3472
3473    else if (cp === $.NULL)
3474        this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
3475
3476    else if (cp === $.GREATER_THAN_SIGN) {
3477        this.currentToken.forceQuirks = true;
3478        this._emitCurrentToken();
3479        this.state = DATA_STATE;
3480    }
3481
3482    else if (cp === $.EOF) {
3483        this.currentToken.forceQuirks = true;
3484        this._emitCurrentToken();
3485        this._reconsumeInState(DATA_STATE);
3486    }
3487
3488    else
3489        this.currentToken.publicId += toChar(cp);
3490};
3491
3492
3493//12.2.4.59 DOCTYPE public identifier (single-quoted) state
3494//------------------------------------------------------------------
3495_[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentifierSingleQuotedState(cp) {
3496    if (cp === $.APOSTROPHE)
3497        this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
3498
3499    else if (cp === $.NULL)
3500        this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
3501
3502    else if (cp === $.GREATER_THAN_SIGN) {
3503        this.currentToken.forceQuirks = true;
3504        this._emitCurrentToken();
3505        this.state = DATA_STATE;
3506    }
3507
3508    else if (cp === $.EOF) {
3509        this.currentToken.forceQuirks = true;
3510        this._emitCurrentToken();
3511        this._reconsumeInState(DATA_STATE);
3512    }
3513
3514    else
3515        this.currentToken.publicId += toChar(cp);
3516};
3517
3518
3519//12.2.4.60 After DOCTYPE public identifier state
3520//------------------------------------------------------------------
3521_[AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function afterDoctypePublicIdentifierState(cp) {
3522    if (isWhitespace(cp))
3523        this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
3524
3525    else if (cp === $.GREATER_THAN_SIGN) {
3526        this._emitCurrentToken();
3527        this.state = DATA_STATE;
3528    }
3529
3530    else if (cp === $.QUOTATION_MARK) {
3531        this.currentToken.systemId = '';
3532        this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
3533    }
3534
3535    else if (cp === $.APOSTROPHE) {
3536        this.currentToken.systemId = '';
3537        this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
3538    }
3539
3540    else if (cp === $.EOF) {
3541        this.currentToken.forceQuirks = true;
3542        this._emitCurrentToken();
3543        this._reconsumeInState(DATA_STATE);
3544    }
3545
3546    else {
3547        this.currentToken.forceQuirks = true;
3548        this.state = BOGUS_DOCTYPE_STATE;
3549    }
3550};
3551
3552
3553//12.2.4.61 Between DOCTYPE public and system identifiers state
3554//------------------------------------------------------------------
3555_[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctypePublicAndSystemIdentifiersState(cp) {
3556    if (isWhitespace(cp))
3557        return;
3558
3559    if (cp === $.GREATER_THAN_SIGN) {
3560        this._emitCurrentToken();
3561        this.state = DATA_STATE;
3562    }
3563
3564    else if (cp === $.QUOTATION_MARK) {
3565        this.currentToken.systemId = '';
3566        this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
3567    }
3568
3569
3570    else if (cp === $.APOSTROPHE) {
3571        this.currentToken.systemId = '';
3572        this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
3573    }
3574
3575    else if (cp === $.EOF) {
3576        this.currentToken.forceQuirks = true;
3577        this._emitCurrentToken();
3578        this._reconsumeInState(DATA_STATE);
3579    }
3580
3581    else {
3582        this.currentToken.forceQuirks = true;
3583        this.state = BOGUS_DOCTYPE_STATE;
3584    }
3585};
3586
3587
3588//12.2.4.62 After DOCTYPE system keyword state
3589//------------------------------------------------------------------
3590_[AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE] = function afterDoctypeSystemKeywordState(cp) {
3591    if (isWhitespace(cp))
3592        this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
3593
3594    else if (cp === $.QUOTATION_MARK) {
3595        this.currentToken.systemId = '';
3596        this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
3597    }
3598
3599    else if (cp === $.APOSTROPHE) {
3600        this.currentToken.systemId = '';
3601        this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
3602    }
3603
3604    else if (cp === $.GREATER_THAN_SIGN) {
3605        this.currentToken.forceQuirks = true;
3606        this._emitCurrentToken();
3607        this.state = DATA_STATE;
3608    }
3609
3610    else if (cp === $.EOF) {
3611        this.currentToken.forceQuirks = true;
3612        this._emitCurrentToken();
3613        this._reconsumeInState(DATA_STATE);
3614    }
3615
3616    else {
3617        this.currentToken.forceQuirks = true;
3618        this.state = BOGUS_DOCTYPE_STATE;
3619    }
3620};
3621
3622
3623//12.2.4.63 Before DOCTYPE system identifier state
3624//------------------------------------------------------------------
3625_[BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function beforeDoctypeSystemIdentifierState(cp) {
3626    if (isWhitespace(cp))
3627        return;
3628
3629    if (cp === $.QUOTATION_MARK) {
3630        this.currentToken.systemId = '';
3631        this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
3632    }
3633
3634    else if (cp === $.APOSTROPHE) {
3635        this.currentToken.systemId = '';
3636        this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
3637    }
3638
3639    else if (cp === $.GREATER_THAN_SIGN) {
3640        this.currentToken.forceQuirks = true;
3641        this._emitCurrentToken();
3642        this.state = DATA_STATE;
3643    }
3644
3645    else if (cp === $.EOF) {
3646        this.currentToken.forceQuirks = true;
3647        this._emitCurrentToken();
3648        this._reconsumeInState(DATA_STATE);
3649    }
3650
3651    else {
3652        this.currentToken.forceQuirks = true;
3653        this.state = BOGUS_DOCTYPE_STATE;
3654    }
3655};
3656
3657
3658//12.2.4.64 DOCTYPE system identifier (double-quoted) state
3659//------------------------------------------------------------------
3660_[DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypeSystemIdentifierDoubleQuotedState(cp) {
3661    if (cp === $.QUOTATION_MARK)
3662        this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
3663
3664    else if (cp === $.GREATER_THAN_SIGN) {
3665        this.currentToken.forceQuirks = true;
3666        this._emitCurrentToken();
3667        this.state = DATA_STATE;
3668    }
3669
3670    else if (cp === $.NULL)
3671        this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
3672
3673    else if (cp === $.EOF) {
3674        this.currentToken.forceQuirks = true;
3675        this._emitCurrentToken();
3676        this._reconsumeInState(DATA_STATE);
3677    }
3678
3679    else
3680        this.currentToken.systemId += toChar(cp);
3681};
3682
3683
3684//12.2.4.65 DOCTYPE system identifier (single-quoted) state
3685//------------------------------------------------------------------
3686_[DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypeSystemIdentifierSingleQuotedState(cp) {
3687    if (cp === $.APOSTROPHE)
3688        this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
3689
3690    else if (cp === $.GREATER_THAN_SIGN) {
3691        this.currentToken.forceQuirks = true;
3692        this._emitCurrentToken();
3693        this.state = DATA_STATE;
3694    }
3695
3696    else if (cp === $.NULL)
3697        this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
3698
3699    else if (cp === $.EOF) {
3700        this.currentToken.forceQuirks = true;
3701        this._emitCurrentToken();
3702        this._reconsumeInState(DATA_STATE);
3703    }
3704
3705    else
3706        this.currentToken.systemId += toChar(cp);
3707};
3708
3709
3710//12.2.4.66 After DOCTYPE system identifier state
3711//------------------------------------------------------------------
3712_[AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function afterDoctypeSystemIdentifierState(cp) {
3713    if (isWhitespace(cp))
3714        return;
3715
3716    if (cp === $.GREATER_THAN_SIGN) {
3717        this._emitCurrentToken();
3718        this.state = DATA_STATE;
3719    }
3720
3721    else if (cp === $.EOF) {
3722        this.currentToken.forceQuirks = true;
3723        this._emitCurrentToken();
3724        this._reconsumeInState(DATA_STATE);
3725    }
3726
3727    else
3728        this.state = BOGUS_DOCTYPE_STATE;
3729};
3730
3731
3732//12.2.4.67 Bogus DOCTYPE state
3733//------------------------------------------------------------------
3734_[BOGUS_DOCTYPE_STATE] = function bogusDoctypeState(cp) {
3735    if (cp === $.GREATER_THAN_SIGN) {
3736        this._emitCurrentToken();
3737        this.state = DATA_STATE;
3738    }
3739
3740    else if (cp === $.EOF) {
3741        this._emitCurrentToken();
3742        this._reconsumeInState(DATA_STATE);
3743    }
3744};
3745
3746
3747//12.2.4.68 CDATA section state
3748//------------------------------------------------------------------
3749_[CDATA_SECTION_STATE] = function cdataSectionState(cp) {
3750    while (true) {
3751        if (cp === $.EOF) {
3752            this._reconsumeInState(DATA_STATE);
3753            break;
3754        }
3755
3756        else if (this._consumeSubsequentIfMatch($$.CDATA_END_STRING, cp, true)) {
3757            this.state = DATA_STATE;
3758            break;
3759        }
3760
3761        else {
3762            this._emitCodePoint(cp);
3763            cp = this._consume();
3764        }
3765    }
3766};
3767
3768},{"../common/unicode":4,"./location_info_mixin":11,"./named_entity_trie":12,"./preprocessor":13}],15:[function(require,module,exports){
3769'use strict';
3770
3771//Node construction
3772exports.createDocument = function () {
3773    return {
3774        nodeName: '#document',
3775        quirksMode: false,
3776        childNodes: []
3777    };
3778};
3779
3780exports.createDocumentFragment = function () {
3781    return {
3782        nodeName: '#document-fragment',
3783        quirksMode: false,
3784        childNodes: []
3785    };
3786};
3787
3788exports.createElement = function (tagName, namespaceURI, attrs) {
3789    return {
3790        nodeName: tagName,
3791        tagName: tagName,
3792        attrs: attrs,
3793        namespaceURI: namespaceURI,
3794        childNodes: [],
3795        parentNode: null
3796    };
3797};
3798
3799exports.createCommentNode = function (data) {
3800    return {
3801        nodeName: '#comment',
3802        data: data,
3803        parentNode: null
3804    };
3805};
3806
3807var createTextNode = function (value) {
3808    return {
3809        nodeName: '#text',
3810        value: value,
3811        parentNode: null
3812    }
3813};
3814
3815
3816//Tree mutation
3817exports.setDocumentType = function (document, name, publicId, systemId) {
3818    var doctypeNode = null;
3819
3820    for (var i = 0; i < document.childNodes.length; i++) {
3821        if (document.childNodes[i].nodeName === '#documentType') {
3822            doctypeNode = document.childNodes[i];
3823            break;
3824        }
3825    }
3826
3827    if (doctypeNode) {
3828        doctypeNode.name = name;
3829        doctypeNode.publicId = publicId;
3830        doctypeNode.systemId = systemId;
3831    }
3832
3833    else {
3834        appendChild(document, {
3835            nodeName: '#documentType',
3836            name: name,
3837            publicId: publicId,
3838            systemId: systemId
3839        });
3840    }
3841};
3842
3843exports.setQuirksMode = function (document) {
3844    document.quirksMode = true;
3845};
3846
3847exports.isQuirksMode = function (document) {
3848    return document.quirksMode;
3849};
3850
3851var appendChild = exports.appendChild = function (parentNode, newNode) {
3852    parentNode.childNodes.push(newNode);
3853    newNode.parentNode = parentNode;
3854};
3855
3856var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
3857    var insertionIdx = parentNode.childNodes.indexOf(referenceNode);
3858
3859    parentNode.childNodes.splice(insertionIdx, 0, newNode);
3860    newNode.parentNode = parentNode;
3861};
3862
3863exports.detachNode = function (node) {
3864    if (node.parentNode) {
3865        var idx = node.parentNode.childNodes.indexOf(node);
3866
3867        node.parentNode.childNodes.splice(idx, 1);
3868        node.parentNode = null;
3869    }
3870};
3871
3872exports.insertText = function (parentNode, text) {
3873    if (parentNode.childNodes.length) {
3874        var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
3875
3876        if (prevNode.nodeName === '#text') {
3877            prevNode.value += text;
3878            return;
3879        }
3880    }
3881
3882    appendChild(parentNode, createTextNode(text));
3883};
3884
3885exports.insertTextBefore = function (parentNode, text, referenceNode) {
3886    var prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
3887
3888    if (prevNode && prevNode.nodeName === '#text')
3889        prevNode.value += text;
3890    else
3891        insertBefore(parentNode, createTextNode(text), referenceNode);
3892};
3893
3894exports.adoptAttributes = function (recipientNode, attrs) {
3895    var recipientAttrsMap = [];
3896
3897    for (var i = 0; i < recipientNode.attrs.length; i++)
3898        recipientAttrsMap.push(recipientNode.attrs[i].name);
3899
3900    for (var j = 0; j < attrs.length; j++) {
3901        if (recipientAttrsMap.indexOf(attrs[j].name) === -1)
3902            recipientNode.attrs.push(attrs[j]);
3903    }
3904};
3905
3906
3907//Tree traversing
3908exports.getFirstChild = function (node) {
3909    return node.childNodes[0];
3910};
3911
3912exports.getChildNodes = function (node) {
3913    return node.childNodes;
3914};
3915
3916exports.getParentNode = function (node) {
3917    return node.parentNode;
3918};
3919
3920exports.getAttrList = function (node) {
3921    return node.attrs;
3922};
3923
3924//Node data
3925exports.getTagName = function (element) {
3926    return element.tagName;
3927};
3928
3929exports.getNamespaceURI = function (element) {
3930    return element.namespaceURI;
3931};
3932
3933exports.getTextNodeContent = function (textNode) {
3934    return textNode.value;
3935};
3936
3937exports.getCommentNodeContent = function (commentNode) {
3938    return commentNode.data;
3939};
3940
3941exports.getDocumentTypeNodeName = function (doctypeNode) {
3942    return doctypeNode.name;
3943};
3944
3945exports.getDocumentTypeNodePublicId = function (doctypeNode) {
3946    return doctypeNode.publicId;
3947};
3948
3949exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
3950    return doctypeNode.systemId;
3951};
3952
3953//Node types
3954exports.isTextNode = function (node) {
3955    return node.nodeName === '#text';
3956};
3957
3958exports.isCommentNode = function (node) {
3959    return node.nodeName === '#comment';
3960};
3961
3962exports.isDocumentTypeNode = function (node) {
3963    return node.nodeName === '#documentType';
3964};
3965
3966exports.isElementNode = function (node) {
3967    return !!node.tagName;
3968};
3969
3970},{}],16:[function(require,module,exports){
3971'use strict';
3972
3973var Doctype = require('../common/doctype');
3974
3975//Conversion tables for DOM Level1 structure emulation
3976var nodeTypes = {
3977    element: 1,
3978    text: 3,
3979    cdata: 4,
3980    comment: 8
3981};
3982
3983var nodePropertyShorthands = {
3984    tagName: 'name',
3985    childNodes: 'children',
3986    parentNode: 'parent',
3987    previousSibling: 'prev',
3988    nextSibling: 'next',
3989    nodeValue: 'data'
3990};
3991
3992//Node
3993var Node = function (props) {
3994    for (var key in props) {
3995        if (props.hasOwnProperty(key))
3996            this[key] = props[key];
3997    }
3998};
3999
4000Node.prototype = {
4001    get firstChild() {
4002        var children = this.children;
4003        return children && children[0] || null;
4004    },
4005
4006    get lastChild() {
4007        var children = this.children;
4008        return children && children[children.length - 1] || null;
4009    },
4010
4011    get nodeType() {
4012        return nodeTypes[this.type] || nodeTypes.element;
4013    }
4014};
4015
4016Object.keys(nodePropertyShorthands).forEach(function (key) {
4017    var shorthand = nodePropertyShorthands[key];
4018
4019    Object.defineProperty(Node.prototype, key, {
4020        get: function () {
4021            return this[shorthand] || null;
4022        },
4023        set: function (val) {
4024            this[shorthand] = val;
4025            return val;
4026        }
4027    });
4028});
4029
4030
4031//Node construction
4032exports.createDocument =
4033exports.createDocumentFragment = function () {
4034    return new Node({
4035        type: 'root',
4036        name: 'root',
4037        parent: null,
4038        prev: null,
4039        next: null,
4040        children: []
4041    });
4042};
4043
4044exports.createElement = function (tagName, namespaceURI, attrs) {
4045    var attribs = {},
4046        attribsNamespace = {},
4047        attribsPrefix = {};
4048
4049    for (var i = 0; i < attrs.length; i++) {
4050        var attrName = attrs[i].name;
4051
4052        attribs[attrName] = attrs[i].value;
4053        attribsNamespace[attrName] = attrs[i].namespace;
4054        attribsPrefix[attrName] = attrs[i].prefix;
4055    }
4056
4057    return new Node({
4058        type: tagName === 'script' || tagName === 'style' ? tagName : 'tag',
4059        name: tagName,
4060        namespace: namespaceURI,
4061        attribs: attribs,
4062        'x-attribsNamespace': attribsNamespace,
4063        'x-attribsPrefix': attribsPrefix,
4064        children: [],
4065        parent: null,
4066        prev: null,
4067        next: null
4068    });
4069};
4070
4071exports.createCommentNode = function (data) {
4072    return new Node({
4073        type: 'comment',
4074        data: data,
4075        parent: null,
4076        prev: null,
4077        next: null
4078    });
4079};
4080
4081var createTextNode = function (value) {
4082    return new Node({
4083        type: 'text',
4084        data: value,
4085        parent: null,
4086        prev: null,
4087        next: null
4088    });
4089};
4090
4091
4092//Tree mutation
4093exports.setDocumentType = function (document, name, publicId, systemId) {
4094    var data = Doctype.serializeContent(name, publicId, systemId),
4095        doctypeNode = null;
4096
4097    for (var i = 0; i < document.children.length; i++) {
4098        if (document.children[i].type === 'directive' && document.children[i].name === '!doctype') {
4099            doctypeNode = document.children[i];
4100            break;
4101        }
4102    }
4103
4104    if (doctypeNode) {
4105        doctypeNode.data = data;
4106        doctypeNode['x-name'] = name;
4107        doctypeNode['x-publicId'] = publicId;
4108        doctypeNode['x-systemId'] = systemId;
4109    }
4110
4111    else {
4112        appendChild(document, new Node({
4113            type: 'directive',
4114            name: '!doctype',
4115            data: data,
4116            'x-name': name,
4117            'x-publicId': publicId,
4118            'x-systemId': systemId
4119        }));
4120    }
4121
4122};
4123
4124exports.setQuirksMode = function (document) {
4125    document.quirksMode = true;
4126};
4127
4128exports.isQuirksMode = function (document) {
4129    return document.quirksMode;
4130};
4131
4132var appendChild = exports.appendChild = function (parentNode, newNode) {
4133    var prev = parentNode.children[parentNode.children.length - 1];
4134
4135    if (prev) {
4136        prev.next = newNode;
4137        newNode.prev = prev;
4138    }
4139
4140    parentNode.children.push(newNode);
4141    newNode.parent = parentNode;
4142};
4143
4144var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
4145    var insertionIdx = parentNode.children.indexOf(referenceNode),
4146        prev = referenceNode.prev;
4147
4148    if (prev) {
4149        prev.next = newNode;
4150        newNode.prev = prev;
4151    }
4152
4153    referenceNode.prev = newNode;
4154    newNode.next = referenceNode;
4155
4156    parentNode.children.splice(insertionIdx, 0, newNode);
4157    newNode.parent = parentNode;
4158};
4159
4160exports.detachNode = function (node) {
4161    if (node.parent) {
4162        var idx = node.parent.children.indexOf(node),
4163            prev = node.prev,
4164            next = node.next;
4165
4166        node.prev = null;
4167        node.next = null;
4168
4169        if (prev)
4170            prev.next = next;
4171
4172        if (next)
4173            next.prev = prev;
4174
4175        node.parent.children.splice(idx, 1);
4176        node.parent = null;
4177    }
4178};
4179
4180exports.insertText = function (parentNode, text) {
4181    var lastChild = parentNode.children[parentNode.children.length - 1];
4182
4183    if (lastChild && lastChild.type === 'text')
4184        lastChild.data += text;
4185    else
4186        appendChild(parentNode, createTextNode(text));
4187};
4188
4189exports.insertTextBefore = function (parentNode, text, referenceNode) {
4190    var prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1];
4191
4192    if (prevNode && prevNode.type === 'text')
4193        prevNode.data += text;
4194    else
4195        insertBefore(parentNode, createTextNode(text), referenceNode);
4196};
4197
4198exports.adoptAttributes = function (recipientNode, attrs) {
4199    for (var i = 0; i < attrs.length; i++) {
4200        var attrName = attrs[i].name;
4201
4202        if (typeof recipientNode.attribs[attrName] === 'undefined') {
4203            recipientNode.attribs[attrName] = attrs[i].value;
4204            recipientNode['x-attribsNamespace'][attrName] = attrs[i].namespace;
4205            recipientNode['x-attribsPrefix'][attrName] = attrs[i].prefix;
4206        }
4207    }
4208};
4209
4210
4211//Tree traversing
4212exports.getFirstChild = function (node) {
4213    return node.children[0];
4214};
4215
4216exports.getChildNodes = function (node) {
4217    return node.children;
4218};
4219
4220exports.getParentNode = function (node) {
4221    return node.parent;
4222};
4223
4224exports.getAttrList = function (node) {
4225    var attrList = [];
4226
4227    for (var name in node.attribs) {
4228        if (node.attribs.hasOwnProperty(name)) {
4229            attrList.push({
4230                name: name,
4231                value: node.attribs[name],
4232                namespace: node['x-attribsNamespace'][name],
4233                prefix: node['x-attribsPrefix'][name]
4234            });
4235        }
4236    }
4237
4238    return attrList;
4239};
4240
4241
4242//Node data
4243exports.getTagName = function (element) {
4244    return element.name;
4245};
4246
4247exports.getNamespaceURI = function (element) {
4248    return element.namespace;
4249};
4250
4251exports.getTextNodeContent = function (textNode) {
4252    return textNode.data;
4253};
4254
4255exports.getCommentNodeContent = function (commentNode) {
4256    return commentNode.data;
4257};
4258
4259exports.getDocumentTypeNodeName = function (doctypeNode) {
4260    return doctypeNode['x-name'];
4261};
4262
4263exports.getDocumentTypeNodePublicId = function (doctypeNode) {
4264    return doctypeNode['x-publicId'];
4265};
4266
4267exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
4268    return doctypeNode['x-systemId'];
4269};
4270
4271
4272//Node types
4273exports.isTextNode = function (node) {
4274    return node.type === 'text';
4275};
4276
4277exports.isCommentNode = function (node) {
4278    return node.type === 'comment';
4279};
4280
4281exports.isDocumentTypeNode = function (node) {
4282    return node.type === 'directive' && node.name === '!doctype';
4283};
4284
4285exports.isElementNode = function (node) {
4286    return !!node.attribs;
4287};
4288
4289},{"../common/doctype":1}],17:[function(require,module,exports){
4290'use strict';
4291
4292//Const
4293var NOAH_ARK_CAPACITY = 3;
4294
4295//List of formatting elements
4296var FormattingElementList = module.exports = function (treeAdapter) {
4297    this.length = 0;
4298    this.entries = [];
4299    this.treeAdapter = treeAdapter;
4300    this.bookmark = null;
4301};
4302
4303//Entry types
4304FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY';
4305FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY';
4306
4307//Noah Ark's condition
4308//OPTIMIZATION: at first we try to find possible candidates for exclusion using
4309//lightweight heuristics without thorough attributes check.
4310FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) {
4311    var candidates = [];
4312
4313    if (this.length >= NOAH_ARK_CAPACITY) {
4314        var neAttrsLength = this.treeAdapter.getAttrList(newElement).length,
4315            neTagName = this.treeAdapter.getTagName(newElement),
4316            neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
4317
4318        for (var i = this.length - 1; i >= 0; i--) {
4319            var entry = this.entries[i];
4320
4321            if (entry.type === FormattingElementList.MARKER_ENTRY)
4322                break;
4323
4324            var element = entry.element,
4325                elementAttrs = this.treeAdapter.getAttrList(element);
4326
4327            if (this.treeAdapter.getTagName(element) === neTagName &&
4328                this.treeAdapter.getNamespaceURI(element) === neNamespaceURI &&
4329                elementAttrs.length === neAttrsLength) {
4330                candidates.push({idx: i, attrs: elementAttrs});
4331            }
4332        }
4333    }
4334
4335    return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates;
4336};
4337
4338FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) {
4339    var candidates = this._getNoahArkConditionCandidates(newElement),
4340        cLength = candidates.length;
4341
4342    if (cLength) {
4343        var neAttrs = this.treeAdapter.getAttrList(newElement),
4344            neAttrsLength = neAttrs.length,
4345            neAttrsMap = {};
4346
4347        //NOTE: build attrs map for the new element so we can perform fast lookups
4348        for (var i = 0; i < neAttrsLength; i++) {
4349            var neAttr = neAttrs[i];
4350
4351            neAttrsMap[neAttr.name] = neAttr.value;
4352        }
4353
4354        for (var i = 0; i < neAttrsLength; i++) {
4355            for (var j = 0; j < cLength; j++) {
4356                var cAttr = candidates[j].attrs[i];
4357
4358                if (neAttrsMap[cAttr.name] !== cAttr.value) {
4359                    candidates.splice(j, 1);
4360                    cLength--;
4361                }
4362
4363                if (candidates.length < NOAH_ARK_CAPACITY)
4364                    return;
4365            }
4366        }
4367
4368        //NOTE: remove bottommost candidates until Noah's Ark condition will not be met
4369        for (var i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) {
4370            this.entries.splice(candidates[i].idx, 1);
4371            this.length--;
4372        }
4373    }
4374};
4375
4376//Mutations
4377FormattingElementList.prototype.insertMarker = function () {
4378    this.entries.push({type: FormattingElementList.MARKER_ENTRY});
4379    this.length++;
4380};
4381
4382FormattingElementList.prototype.pushElement = function (element, token) {
4383    this._ensureNoahArkCondition(element);
4384
4385    this.entries.push({
4386        type: FormattingElementList.ELEMENT_ENTRY,
4387        element: element,
4388        token: token
4389    });
4390
4391    this.length++;
4392};
4393
4394FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) {
4395    var bookmarkIdx = this.length - 1;
4396
4397    for (; bookmarkIdx >= 0; bookmarkIdx--) {
4398        if (this.entries[bookmarkIdx] === this.bookmark)
4399            break;
4400    }
4401
4402    this.entries.splice(bookmarkIdx + 1, 0, {
4403        type: FormattingElementList.ELEMENT_ENTRY,
4404        element: element,
4405        token: token
4406    });
4407
4408    this.length++;
4409};
4410
4411FormattingElementList.prototype.removeEntry = function (entry) {
4412    for (var i = this.length - 1; i >= 0; i--) {
4413        if (this.entries[i] === entry) {
4414            this.entries.splice(i, 1);
4415            this.length--;
4416            break;
4417        }
4418    }
4419};
4420
4421FormattingElementList.prototype.clearToLastMarker = function () {
4422    while (this.length) {
4423        var entry = this.entries.pop();
4424
4425        this.length--;
4426
4427        if (entry.type === FormattingElementList.MARKER_ENTRY)
4428            break;
4429    }
4430};
4431
4432//Search
4433FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) {
4434    for (var i = this.length - 1; i >= 0; i--) {
4435        var entry = this.entries[i];
4436
4437        if (entry.type === FormattingElementList.MARKER_ENTRY)
4438            return null;
4439
4440        if (this.treeAdapter.getTagName(entry.element) === tagName)
4441            return entry;
4442    }
4443
4444    return null;
4445};
4446
4447FormattingElementList.prototype.getElementEntry = function (element) {
4448    for (var i = this.length - 1; i >= 0; i--) {
4449        var entry = this.entries[i];
4450
4451        if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element == element)
4452            return entry;
4453    }
4454
4455    return null;
4456};
4457
4458},{}],18:[function(require,module,exports){
4459'use strict';
4460
4461var OpenElementStack = require('./open_element_stack'),
4462    Tokenizer = require('../tokenization/tokenizer'),
4463    HTML = require('../common/html');
4464
4465
4466//Aliases
4467var $ = HTML.TAG_NAMES;
4468
4469
4470function setEndLocation(element, closingToken, treeAdapter) {
4471    var loc = element.__location;
4472
4473    if (!loc)
4474        return;
4475
4476    if (!loc.startTag) {
4477        loc.startTag = {
4478            start: loc.start,
4479            end: loc.end
4480        };
4481    }
4482
4483    if (closingToken.location) {
4484        var tn = treeAdapter.getTagName(element),
4485            // NOTE: For cases like <p> <p> </p> - First 'p' closes without a closing tag and
4486            // for cases like <td> <p> </td> - 'p' closes without a closing tag
4487            isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN &&
4488                              tn === closingToken.tagName;
4489
4490        if (isClosingEndTag) {
4491            loc.endTag = {
4492                start: closingToken.location.start,
4493                end: closingToken.location.end
4494            };
4495        }
4496
4497        loc.end = closingToken.location.end;
4498    }
4499}
4500
4501//NOTE: patch open elements stack, so we can assign end location for the elements
4502function patchOpenElementsStack(stack, parser) {
4503    var treeAdapter = parser.treeAdapter;
4504
4505    stack.pop = function () {
4506        setEndLocation(this.current, parser.currentToken, treeAdapter);
4507        OpenElementStack.prototype.pop.call(this);
4508    };
4509
4510    stack.popAllUpToHtmlElement = function () {
4511        for (var i = this.stackTop; i > 0; i--)
4512            setEndLocation(this.items[i], parser.currentToken, treeAdapter);
4513
4514        OpenElementStack.prototype.popAllUpToHtmlElement.call(this);
4515    };
4516
4517    stack.remove = function (element) {
4518        setEndLocation(element, parser.currentToken, treeAdapter);
4519        OpenElementStack.prototype.remove.call(this, element);
4520    };
4521}
4522
4523exports.assign = function (parser) {
4524    //NOTE: obtain Parser proto this way to avoid module circular references
4525    var parserProto = Object.getPrototypeOf(parser),
4526        treeAdapter = parser.treeAdapter;
4527
4528
4529    //NOTE: patch _reset method
4530    parser._reset = function (html, document, fragmentContext) {
4531        parserProto._reset.call(this, html, document, fragmentContext);
4532
4533        this.attachableElementLocation = null;
4534        this.lastFosterParentingLocation = null;
4535        this.currentToken = null;
4536
4537        patchOpenElementsStack(this.openElements, parser);
4538    };
4539
4540    parser._processTokenInForeignContent = function (token) {
4541        this.currentToken = token;
4542        parserProto._processTokenInForeignContent.call(this, token);
4543    };
4544
4545    parser._processToken = function (token) {
4546        this.currentToken = token;
4547        parserProto._processToken.call(this, token);
4548
4549        //NOTE: <body> and <html> are never popped from the stack, so we need to updated
4550        //their end location explicitly.
4551        if (token.type === Tokenizer.END_TAG_TOKEN &&
4552            (token.tagName === $.HTML ||
4553            (token.tagName === $.BODY && this.openElements.hasInScope($.BODY)))) {
4554            for (var i = this.openElements.stackTop; i >= 0; i--) {
4555                var element = this.openElements.items[i];
4556
4557                if (this.treeAdapter.getTagName(element) === token.tagName) {
4558                    setEndLocation(element, token, treeAdapter);
4559                    break;
4560                }
4561            }
4562        }
4563    };
4564
4565    //Doctype
4566    parser._setDocumentType = function (token) {
4567        parserProto._setDocumentType.call(this, token);
4568
4569        var documentChildren = this.treeAdapter.getChildNodes(this.document),
4570            cnLength = documentChildren.length;
4571
4572        for (var i = 0; i < cnLength; i++) {
4573            var node = documentChildren[i];
4574
4575            if (this.treeAdapter.isDocumentTypeNode(node)) {
4576                node.__location = token.location;
4577                break;
4578            }
4579        }
4580    };
4581
4582    //Elements
4583    parser._attachElementToTree = function (element) {
4584        //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods.
4585        //So we will use token location stored in this methods for the element.
4586        element.__location = this.attachableElementLocation || null;
4587        this.attachableElementLocation = null;
4588        parserProto._attachElementToTree.call(this, element);
4589    };
4590
4591    parser._appendElement = function (token, namespaceURI) {
4592        this.attachableElementLocation = token.location;
4593        parserProto._appendElement.call(this, token, namespaceURI);
4594    };
4595
4596    parser._insertElement = function (token, namespaceURI) {
4597        this.attachableElementLocation = token.location;
4598        parserProto._insertElement.call(this, token, namespaceURI);
4599    };
4600
4601    parser._insertTemplate = function (token) {
4602        this.attachableElementLocation = token.location;
4603        parserProto._insertTemplate.call(this, token);
4604
4605        var tmplContent = this.treeAdapter.getChildNodes(this.openElements.current)[0];
4606
4607        tmplContent.__location = null;
4608    };
4609
4610    parser._insertFakeRootElement = function () {
4611        parserProto._insertFakeRootElement.call(this);
4612        this.openElements.current.__location = null;
4613    };
4614
4615    //Comments
4616    parser._appendCommentNode = function (token, parent) {
4617        parserProto._appendCommentNode.call(this, token, parent);
4618
4619        var children = this.treeAdapter.getChildNodes(parent),
4620            commentNode = children[children.length - 1];
4621
4622        commentNode.__location = token.location;
4623    };
4624
4625    //Text
4626    parser._findFosterParentingLocation = function () {
4627        //NOTE: store last foster parenting location, so we will be able to find inserted text
4628        //in case of foster parenting
4629        this.lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this);
4630        return this.lastFosterParentingLocation;
4631    };
4632
4633    parser._insertCharacters = function (token) {
4634        parserProto._insertCharacters.call(this, token);
4635
4636        var hasFosterParent = this._shouldFosterParentOnInsertion(),
4637            parentingLocation = this.lastFosterParentingLocation,
4638            parent = (hasFosterParent && parentingLocation.parent) ||
4639                     this.openElements.currentTmplContent ||
4640                     this.openElements.current,
4641            siblings = this.treeAdapter.getChildNodes(parent),
4642            textNodeIdx = hasFosterParent && parentingLocation.beforeElement ?
4643                          siblings.indexOf(parentingLocation.beforeElement) - 1 :
4644                          siblings.length - 1,
4645            textNode = siblings[textNodeIdx];
4646
4647        //NOTE: if we have location assigned by another token, then just update end position
4648        if (textNode.__location)
4649            textNode.__location.end = token.location.end;
4650
4651        else
4652            textNode.__location = token.location;
4653    };
4654};
4655
4656
4657},{"../common/html":3,"../tokenization/tokenizer":14,"./open_element_stack":19}],19:[function(require,module,exports){
4658'use strict';
4659
4660var HTML = require('../common/html');
4661
4662//Aliases
4663var $ = HTML.TAG_NAMES,
4664    NS = HTML.NAMESPACES;
4665
4666//Element utils
4667
4668//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
4669//It's faster than using dictionary.
4670function isImpliedEndTagRequired(tn) {
4671    switch (tn.length) {
4672        case 1:
4673            return tn === $.P;
4674
4675        case 2:
4676            return tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI;
4677
4678        case 6:
4679            return tn === $.OPTION;
4680
4681        case 8:
4682            return tn === $.OPTGROUP;
4683    }
4684
4685    return false;
4686}
4687
4688function isScopingElement(tn, ns) {
4689    switch (tn.length) {
4690        case 2:
4691            if (tn === $.TD || tn === $.TH)
4692                return ns === NS.HTML;
4693
4694            else if (tn === $.MI || tn === $.MO || tn == $.MN || tn === $.MS)
4695                return ns === NS.MATHML;
4696
4697            break;
4698
4699        case 4:
4700            if (tn === $.HTML)
4701                return ns === NS.HTML;
4702
4703            else if (tn === $.DESC)
4704                return ns === NS.SVG;
4705
4706            break;
4707
4708        case 5:
4709            if (tn === $.TABLE)
4710                return ns === NS.HTML;
4711
4712            else if (tn === $.MTEXT)
4713                return ns === NS.MATHML;
4714
4715            else if (tn === $.TITLE)
4716                return ns === NS.SVG;
4717
4718            break;
4719
4720        case 6:
4721            return (tn === $.APPLET || tn === $.OBJECT) && ns === NS.HTML;
4722
4723        case 7:
4724            return (tn === $.CAPTION || tn === $.MARQUEE) && ns === NS.HTML;
4725
4726        case 8:
4727            return tn === $.TEMPLATE && ns === NS.HTML;
4728
4729        case 13:
4730            return tn === $.FOREIGN_OBJECT && ns === NS.SVG;
4731
4732        case 14:
4733            return tn === $.ANNOTATION_XML && ns === NS.MATHML;
4734    }
4735
4736    return false;
4737}
4738
4739//Stack of open elements
4740var OpenElementStack = module.exports = function (document, treeAdapter) {
4741    this.stackTop = -1;
4742    this.items = [];
4743    this.current = document;
4744    this.currentTagName = null;
4745    this.currentTmplContent = null;
4746    this.tmplCount = 0;
4747    this.treeAdapter = treeAdapter;
4748};
4749
4750//Index of element
4751OpenElementStack.prototype._indexOf = function (element) {
4752    var idx = -1;
4753
4754    for (var i = this.stackTop; i >= 0; i--) {
4755        if (this.items[i] === element) {
4756            idx = i;
4757            break;
4758        }
4759    }
4760    return idx;
4761};
4762
4763//Update current element
4764OpenElementStack.prototype._isInTemplate = function () {
4765    if (this.currentTagName !== $.TEMPLATE)
4766        return false;
4767
4768    return this.treeAdapter.getNamespaceURI(this.current) === NS.HTML;
4769};
4770
4771OpenElementStack.prototype._updateCurrentElement = function () {
4772    this.current = this.items[this.stackTop];
4773    this.currentTagName = this.current && this.treeAdapter.getTagName(this.current);
4774
4775    this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getChildNodes(this.current)[0] : null;
4776};
4777
4778//Mutations
4779OpenElementStack.prototype.push = function (element) {
4780    this.items[++this.stackTop] = element;
4781    this._updateCurrentElement();
4782
4783    if (this._isInTemplate())
4784        this.tmplCount++;
4785
4786};
4787
4788OpenElementStack.prototype.pop = function () {
4789    this.stackTop--;
4790
4791    if (this.tmplCount > 0 && this._isInTemplate())
4792        this.tmplCount--;
4793
4794    this._updateCurrentElement();
4795};
4796
4797OpenElementStack.prototype.replace = function (oldElement, newElement) {
4798    var idx = this._indexOf(oldElement);
4799    this.items[idx] = newElement;
4800
4801    if (idx === this.stackTop)
4802        this._updateCurrentElement();
4803};
4804
4805OpenElementStack.prototype.insertAfter = function (referenceElement, newElement) {
4806    var insertionIdx = this._indexOf(referenceElement) + 1;
4807
4808    this.items.splice(insertionIdx, 0, newElement);
4809
4810    if (insertionIdx == ++this.stackTop)
4811        this._updateCurrentElement();
4812};
4813
4814OpenElementStack.prototype.popUntilTagNamePopped = function (tagName) {
4815    while (this.stackTop > -1) {
4816        var tn = this.currentTagName;
4817
4818        this.pop();
4819
4820        if (tn === tagName)
4821            break;
4822    }
4823};
4824
4825OpenElementStack.prototype.popUntilTemplatePopped = function () {
4826    while (this.stackTop > -1) {
4827        var tn = this.currentTagName,
4828            ns = this.treeAdapter.getNamespaceURI(this.current);
4829
4830        this.pop();
4831
4832        if (tn === $.TEMPLATE && ns === NS.HTML)
4833            break;
4834    }
4835};
4836
4837OpenElementStack.prototype.popUntilElementPopped = function (element) {
4838    while (this.stackTop > -1) {
4839        var poppedElement = this.current;
4840
4841        this.pop();
4842
4843        if (poppedElement === element)
4844            break;
4845    }
4846};
4847
4848OpenElementStack.prototype.popUntilNumberedHeaderPopped = function () {
4849    while (this.stackTop > -1) {
4850        var tn = this.currentTagName;
4851
4852        this.pop();
4853
4854        if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
4855            break;
4856    }
4857};
4858
4859OpenElementStack.prototype.popAllUpToHtmlElement = function () {
4860    //NOTE: here we assume that root <html> element is always first in the open element stack, so
4861    //we perform this fast stack clean up.
4862    this.stackTop = 0;
4863    this._updateCurrentElement();
4864};
4865
4866OpenElementStack.prototype.clearBackToTableContext = function () {
4867    while (this.currentTagName !== $.TABLE && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML)
4868        this.pop();
4869};
4870
4871OpenElementStack.prototype.clearBackToTableBodyContext = function () {
4872    while (this.currentTagName !== $.TBODY && this.currentTagName !== $.TFOOT &&
4873           this.currentTagName !== $.THEAD && this.currentTagName !== $.TEMPLATE &&
4874           this.currentTagName !== $.HTML) {
4875        this.pop();
4876    }
4877};
4878
4879OpenElementStack.prototype.clearBackToTableRowContext = function () {
4880    while (this.currentTagName !== $.TR && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML)
4881        this.pop();
4882};
4883
4884OpenElementStack.prototype.remove = function (element) {
4885    for (var i = this.stackTop; i >= 0; i--) {
4886        if (this.items[i] === element) {
4887            this.items.splice(i, 1);
4888            this.stackTop--;
4889            this._updateCurrentElement();
4890            break;
4891        }
4892    }
4893};
4894
4895//Search
4896OpenElementStack.prototype.tryPeekProperlyNestedBodyElement = function () {
4897    //Properly nested <body> element (should be second element in stack).
4898    var element = this.items[1];
4899    return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null;
4900};
4901
4902OpenElementStack.prototype.contains = function (element) {
4903    return this._indexOf(element) > -1;
4904};
4905
4906OpenElementStack.prototype.getCommonAncestor = function (element) {
4907    var elementIdx = this._indexOf(element);
4908
4909    return --elementIdx >= 0 ? this.items[elementIdx] : null;
4910};
4911
4912OpenElementStack.prototype.isRootHtmlElementCurrent = function () {
4913    return this.stackTop === 0 && this.currentTagName === $.HTML;
4914};
4915
4916//Element in scope
4917OpenElementStack.prototype.hasInScope = function (tagName) {
4918    for (var i = this.stackTop; i >= 0; i--) {
4919        var tn = this.treeAdapter.getTagName(this.items[i]);
4920
4921        if (tn === tagName)
4922            return true;
4923
4924        var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
4925
4926        if (isScopingElement(tn, ns))
4927            return false;
4928    }
4929
4930    return true;
4931};
4932
4933OpenElementStack.prototype.hasNumberedHeaderInScope = function () {
4934    for (var i = this.stackTop; i >= 0; i--) {
4935        var tn = this.treeAdapter.getTagName(this.items[i]);
4936
4937        if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
4938            return true;
4939
4940        if (isScopingElement(tn, this.treeAdapter.getNamespaceURI(this.items[i])))
4941            return false;
4942    }
4943
4944    return true;
4945};
4946
4947OpenElementStack.prototype.hasInListItemScope = function (tagName) {
4948    for (var i = this.stackTop; i >= 0; i--) {
4949        var tn = this.treeAdapter.getTagName(this.items[i]);
4950
4951        if (tn === tagName)
4952            return true;
4953
4954        var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
4955
4956        if (((tn === $.UL || tn === $.OL) && ns === NS.HTML) || isScopingElement(tn, ns))
4957            return false;
4958    }
4959
4960    return true;
4961};
4962
4963OpenElementStack.prototype.hasInButtonScope = function (tagName) {
4964    for (var i = this.stackTop; i >= 0; i--) {
4965        var tn = this.treeAdapter.getTagName(this.items[i]);
4966
4967        if (tn === tagName)
4968            return true;
4969
4970        var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
4971
4972        if ((tn === $.BUTTON && ns === NS.HTML) || isScopingElement(tn, ns))
4973            return false;
4974    }
4975
4976    return true;
4977};
4978
4979OpenElementStack.prototype.hasInTableScope = function (tagName) {
4980    for (var i = this.stackTop; i >= 0; i--) {
4981        var tn = this.treeAdapter.getTagName(this.items[i]);
4982
4983        if (tn === tagName)
4984            return true;
4985
4986        var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
4987
4988        if ((tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML) && ns === NS.HTML)
4989            return false;
4990    }
4991
4992    return true;
4993};
4994
4995OpenElementStack.prototype.hasTableBodyContextInTableScope = function () {
4996    for (var i = this.stackTop; i >= 0; i--) {
4997        var tn = this.treeAdapter.getTagName(this.items[i]);
4998
4999        if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT)
5000            return true;
5001
5002        var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
5003
5004        if ((tn === $.TABLE || tn === $.HTML) && ns === NS.HTML)
5005            return false;
5006    }
5007
5008    return true;
5009};
5010
5011OpenElementStack.prototype.hasInSelectScope = function (tagName) {
5012    for (var i = this.stackTop; i >= 0; i--) {
5013        var tn = this.treeAdapter.getTagName(this.items[i]);
5014
5015        if (tn === tagName)
5016            return true;
5017
5018        var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
5019
5020        if (tn !== $.OPTION && tn !== $.OPTGROUP && ns === NS.HTML)
5021            return false;
5022    }
5023
5024    return true;
5025};
5026
5027//Implied end tags
5028OpenElementStack.prototype.generateImpliedEndTags = function () {
5029    while (isImpliedEndTagRequired(this.currentTagName))
5030        this.pop();
5031};
5032
5033OpenElementStack.prototype.generateImpliedEndTagsWithExclusion = function (exclusionTagName) {
5034    while (isImpliedEndTagRequired(this.currentTagName) && this.currentTagName !== exclusionTagName)
5035        this.pop();
5036};
5037
5038},{"../common/html":3}],20:[function(require,module,exports){
5039'use strict';
5040
5041var Tokenizer = require('../tokenization/tokenizer'),
5042    OpenElementStack = require('./open_element_stack'),
5043    FormattingElementList = require('./formatting_element_list'),
5044    LocationInfoMixin = require('./location_info_mixin'),
5045    DefaultTreeAdapter = require('../tree_adapters/default'),
5046    Doctype = require('../common/doctype'),
5047    ForeignContent = require('../common/foreign_content'),
5048    Utils = require('../common/utils'),
5049    UNICODE = require('../common/unicode'),
5050    HTML = require('../common/html');
5051
5052//Aliases
5053var $ = HTML.TAG_NAMES,
5054    NS = HTML.NAMESPACES,
5055    ATTRS = HTML.ATTRS;
5056
5057//Default options
5058var DEFAULT_OPTIONS = {
5059    decodeHtmlEntities: true,
5060    locationInfo: false
5061};
5062
5063//Misc constants
5064var SEARCHABLE_INDEX_DEFAULT_PROMPT = 'This is a searchable index. Enter search keywords: ',
5065    SEARCHABLE_INDEX_INPUT_NAME = 'isindex',
5066    HIDDEN_INPUT_TYPE = 'hidden';
5067
5068//Adoption agency loops iteration count
5069var AA_OUTER_LOOP_ITER = 8,
5070    AA_INNER_LOOP_ITER = 3;
5071
5072//Insertion modes
5073var INITIAL_MODE = 'INITIAL_MODE',
5074    BEFORE_HTML_MODE = 'BEFORE_HTML_MODE',
5075    BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE',
5076    IN_HEAD_MODE = 'IN_HEAD_MODE',
5077    AFTER_HEAD_MODE = 'AFTER_HEAD_MODE',
5078    IN_BODY_MODE = 'IN_BODY_MODE',
5079    TEXT_MODE = 'TEXT_MODE',
5080    IN_TABLE_MODE = 'IN_TABLE_MODE',
5081    IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE',
5082    IN_CAPTION_MODE = 'IN_CAPTION_MODE',
5083    IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE',
5084    IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE',
5085    IN_ROW_MODE = 'IN_ROW_MODE',
5086    IN_CELL_MODE = 'IN_CELL_MODE',
5087    IN_SELECT_MODE = 'IN_SELECT_MODE',
5088    IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE',
5089    IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE',
5090    AFTER_BODY_MODE = 'AFTER_BODY_MODE',
5091    IN_FRAMESET_MODE = 'IN_FRAMESET_MODE',
5092    AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE',
5093    AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE',
5094    AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE';
5095
5096//Insertion mode reset map
5097var INSERTION_MODE_RESET_MAP = {};
5098
5099INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE;
5100INSERTION_MODE_RESET_MAP[$.TBODY] =
5101INSERTION_MODE_RESET_MAP[$.THEAD] =
5102INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE;
5103INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE;
5104INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE;
5105INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE;
5106INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE;
5107INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE;
5108
5109//Template insertion mode switch map
5110var TEMPLATE_INSERTION_MODE_SWITCH_MAP = {};
5111
5112TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] =
5113TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] =
5114TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] =
5115TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] =
5116TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE;
5117TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE;
5118TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE;
5119TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] =
5120TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE;
5121
5122//Token handlers map for insertion modes
5123var _ = {};
5124
5125_[INITIAL_MODE] = {};
5126_[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] =
5127_[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode;
5128_[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
5129_[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5130_[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode;
5131_[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] =
5132_[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] =
5133_[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode;
5134
5135_[BEFORE_HTML_MODE] = {};
5136_[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] =
5137_[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml;
5138_[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
5139_[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5140_[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5141_[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml;
5142_[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml;
5143_[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml;
5144
5145_[BEFORE_HEAD_MODE] = {};
5146_[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
5147_[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead;
5148_[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
5149_[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5150_[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5151_[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead;
5152_[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead;
5153_[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead;
5154
5155_[IN_HEAD_MODE] = {};
5156_[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
5157_[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead;
5158_[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5159_[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5160_[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5161_[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead;
5162_[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead;
5163_[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead;
5164
5165_[AFTER_HEAD_MODE] = {};
5166_[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
5167_[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead;
5168_[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5169_[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5170_[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5171_[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead;
5172_[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead;
5173_[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead;
5174
5175_[IN_BODY_MODE] = {};
5176_[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
5177_[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5178_[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
5179_[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5180_[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5181_[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody;
5182_[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody;
5183_[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5184
5185_[TEXT_MODE] = {};
5186_[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] =
5187_[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
5188_[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5189_[TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
5190_[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
5191_[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken;
5192_[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText;
5193_[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText;
5194
5195_[IN_TABLE_MODE] = {};
5196_[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] =
5197_[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
5198_[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
5199_[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5200_[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5201_[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable;
5202_[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable;
5203_[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5204
5205_[IN_TABLE_TEXT_MODE] = {};
5206_[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText;
5207_[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5208_[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText;
5209_[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
5210_[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
5211_[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] =
5212_[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] =
5213_[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText;
5214
5215_[IN_CAPTION_MODE] = {};
5216_[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
5217_[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5218_[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
5219_[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5220_[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5221_[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption;
5222_[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption;
5223_[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5224
5225_[IN_COLUMN_GROUP_MODE] = {};
5226_[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] =
5227_[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup;
5228_[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5229_[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5230_[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5231_[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup;
5232_[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup;
5233_[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5234
5235_[IN_TABLE_BODY_MODE] = {};
5236_[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
5237_[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
5238_[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
5239_[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5240_[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5241_[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody;
5242_[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody;
5243_[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5244
5245_[IN_ROW_MODE] = {};
5246_[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] =
5247_[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
5248_[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
5249_[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5250_[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5251_[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow;
5252_[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow;
5253_[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5254
5255_[IN_CELL_MODE] = {};
5256_[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
5257_[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5258_[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
5259_[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5260_[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5261_[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell;
5262_[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell;
5263_[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5264
5265_[IN_SELECT_MODE] = {};
5266_[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
5267_[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5268_[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5269_[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5270_[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5271_[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect;
5272_[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect;
5273_[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5274
5275_[IN_SELECT_IN_TABLE_MODE] = {};
5276_[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
5277_[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5278_[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5279_[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5280_[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5281_[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable;
5282_[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable;
5283_[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
5284
5285_[IN_TEMPLATE_MODE] = {};
5286_[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
5287_[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5288_[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
5289_[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5290_[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5291_[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate;
5292_[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate;
5293_[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate;
5294
5295_[AFTER_BODY_MODE] = {};
5296_[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
5297_[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody;
5298_[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
5299_[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement;
5300_[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5301_[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody;
5302_[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody;
5303_[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
5304
5305_[IN_FRAMESET_MODE] = {};
5306_[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
5307_[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5308_[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5309_[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5310_[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5311_[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset;
5312_[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset;
5313_[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
5314
5315_[AFTER_FRAMESET_MODE] = {};
5316_[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
5317_[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5318_[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
5319_[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
5320_[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5321_[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset;
5322_[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset;
5323_[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
5324
5325_[AFTER_AFTER_BODY_MODE] = {};
5326_[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody;
5327_[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody;
5328_[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
5329_[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
5330_[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5331_[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody;
5332_[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody;
5333_[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
5334
5335_[AFTER_AFTER_FRAMESET_MODE] = {};
5336_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
5337_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
5338_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
5339_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
5340_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
5341_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset;
5342_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken;
5343_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
5344
5345//Searchable index building utils (<isindex> tag)
5346function getSearchableIndexFormAttrs(isindexStartTagToken) {
5347    var indexAction = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.ACTION),
5348        attrs = [];
5349
5350    if (indexAction !== null) {
5351        attrs.push({
5352            name: ATTRS.ACTION,
5353            value: indexAction
5354        });
5355    }
5356
5357    return attrs;
5358}
5359
5360function getSearchableIndexLabelText(isindexStartTagToken) {
5361    var indexPrompt = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.PROMPT);
5362
5363    return indexPrompt === null ? SEARCHABLE_INDEX_DEFAULT_PROMPT : indexPrompt;
5364}
5365
5366function getSearchableIndexInputAttrs(isindexStartTagToken) {
5367    var isindexAttrs = isindexStartTagToken.attrs,
5368        inputAttrs = [];
5369
5370    for (var i = 0; i < isindexAttrs.length; i++) {
5371        var name = isindexAttrs[i].name;
5372
5373        if (name !== ATTRS.NAME && name !== ATTRS.ACTION && name !== ATTRS.PROMPT)
5374            inputAttrs.push(isindexAttrs[i]);
5375    }
5376
5377    inputAttrs.push({
5378        name: ATTRS.NAME,
5379        value: SEARCHABLE_INDEX_INPUT_NAME
5380    });
5381
5382    return inputAttrs;
5383}
5384
5385//Parser
5386var Parser = module.exports = function (treeAdapter, options) {
5387    this.treeAdapter = treeAdapter || DefaultTreeAdapter;
5388    this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
5389    this.scriptHandler = null;
5390
5391    if (this.options.locationInfo)
5392        LocationInfoMixin.assign(this);
5393};
5394
5395//API
5396Parser.prototype.parse = function (html) {
5397    var document = this.treeAdapter.createDocument();
5398
5399    this._reset(html, document, null);
5400    this._runParsingLoop();
5401
5402    return document;
5403};
5404
5405Parser.prototype.parseFragment = function (html, fragmentContext) {
5406    //NOTE: use <template> element as a fragment context if context element was not provided,
5407    //so we will parse in "forgiving" manner
5408    if (!fragmentContext)
5409        fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []);
5410
5411    //NOTE: create fake element which will be used as 'document' for fragment parsing.
5412    //This is important for jsdom there 'document' can't be recreated, therefore
5413    //fragment parsing causes messing of the main `document`.
5414    var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []);
5415
5416    this._reset(html, documentMock, fragmentContext);
5417
5418    if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE)
5419        this._pushTmplInsertionMode(IN_TEMPLATE_MODE);
5420
5421    this._initTokenizerForFragmentParsing();
5422    this._insertFakeRootElement();
5423    this._resetInsertionMode();
5424    this._findFormInFragmentContext();
5425    this._runParsingLoop();
5426
5427    var rootElement = this.treeAdapter.getFirstChild(documentMock),
5428        fragment = this.treeAdapter.createDocumentFragment();
5429
5430    this._adoptNodes(rootElement, fragment);
5431
5432    return fragment;
5433};
5434
5435//Reset state
5436Parser.prototype._reset = function (html, document, fragmentContext) {
5437    this.tokenizer = new Tokenizer(html, this.options);
5438
5439    this.stopped = false;
5440
5441    this.insertionMode = INITIAL_MODE;
5442    this.originalInsertionMode = '';
5443
5444    this.document = document;
5445    this.fragmentContext = fragmentContext;
5446
5447    this.headElement = null;
5448    this.formElement = null;
5449
5450    this.openElements = new OpenElementStack(this.document, this.treeAdapter);
5451    this.activeFormattingElements = new FormattingElementList(this.treeAdapter);
5452
5453    this.tmplInsertionModeStack = [];
5454    this.tmplInsertionModeStackTop = -1;
5455    this.currentTmplInsertionMode = null;
5456
5457    this.pendingCharacterTokens = [];
5458    this.hasNonWhitespacePendingCharacterToken = false;
5459
5460    this.framesetOk = true;
5461    this.skipNextNewLine = false;
5462    this.fosterParentingEnabled = false;
5463};
5464
5465//Parsing loop
5466Parser.prototype._iterateParsingLoop = function () {
5467    this._setupTokenizerCDATAMode();
5468
5469    var token = this.tokenizer.getNextToken();
5470
5471    if (this.skipNextNewLine) {
5472        this.skipNextNewLine = false;
5473
5474        if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
5475            if (token.chars.length === 1)
5476                return;
5477
5478            token.chars = token.chars.substr(1);
5479        }
5480    }
5481
5482    if (this._shouldProcessTokenInForeignContent(token))
5483        this._processTokenInForeignContent(token);
5484
5485    else
5486        this._processToken(token);
5487};
5488
5489Parser.prototype._runParsingLoop = function () {
5490    while (!this.stopped)
5491        this._iterateParsingLoop();
5492};
5493
5494//Text parsing
5495Parser.prototype._setupTokenizerCDATAMode = function () {
5496    var current = this._getAdjustedCurrentElement();
5497
5498    this.tokenizer.allowCDATA = current && current !== this.document &&
5499                                this.treeAdapter.getNamespaceURI(current) !== NS.HTML &&
5500                                (!this._isHtmlIntegrationPoint(current)) &&
5501                                (!this._isMathMLTextIntegrationPoint(current));
5502};
5503
5504Parser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) {
5505    this._insertElement(currentToken, NS.HTML);
5506    this.tokenizer.state = nextTokenizerState;
5507    this.originalInsertionMode = this.insertionMode;
5508    this.insertionMode = TEXT_MODE;
5509};
5510
5511//Fragment parsing
5512Parser.prototype._getAdjustedCurrentElement = function () {
5513    return this.openElements.stackTop === 0 && this.fragmentContext ?
5514           this.fragmentContext :
5515           this.openElements.current;
5516};
5517
5518Parser.prototype._findFormInFragmentContext = function () {
5519    var node = this.fragmentContext;
5520
5521    do {
5522        if (this.treeAdapter.getTagName(node) === $.FORM) {
5523            this.formElement = node;
5524            break;
5525        }
5526
5527        node = this.treeAdapter.getParentNode(node);
5528    } while (node);
5529};
5530
5531Parser.prototype._initTokenizerForFragmentParsing = function () {
5532    var tn = this.treeAdapter.getTagName(this.fragmentContext);
5533
5534    if (tn === $.TITLE || tn === $.TEXTAREA)
5535        this.tokenizer.state = Tokenizer.MODE.RCDATA;
5536
5537    else if (tn === $.STYLE || tn === $.XMP || tn === $.IFRAME ||
5538             tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) {
5539        this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
5540    }
5541
5542    else if (tn === $.SCRIPT)
5543        this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
5544
5545    else if (tn === $.PLAINTEXT)
5546        this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
5547};
5548
5549//Tree mutation
5550Parser.prototype._setDocumentType = function (token) {
5551    this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId);
5552};
5553
5554Parser.prototype._attachElementToTree = function (element) {
5555    if (this._shouldFosterParentOnInsertion())
5556        this._fosterParentElement(element);
5557
5558    else {
5559        var parent = this.openElements.currentTmplContent || this.openElements.current;
5560
5561        this.treeAdapter.appendChild(parent, element);
5562    }
5563};
5564
5565Parser.prototype._appendElement = function (token, namespaceURI) {
5566    var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
5567
5568    this._attachElementToTree(element);
5569};
5570
5571Parser.prototype._insertElement = function (token, namespaceURI) {
5572    var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
5573
5574    this._attachElementToTree(element);
5575    this.openElements.push(element);
5576};
5577
5578Parser.prototype._insertTemplate = function (token) {
5579    var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs),
5580        content = this.treeAdapter.createDocumentFragment();
5581
5582    this.treeAdapter.appendChild(tmpl, content);
5583    this._attachElementToTree(tmpl);
5584    this.openElements.push(tmpl);
5585};
5586
5587Parser.prototype._insertFakeRootElement = function () {
5588    var element = this.treeAdapter.createElement($.HTML, NS.HTML, []);
5589
5590    this.treeAdapter.appendChild(this.openElements.current, element);
5591    this.openElements.push(element);
5592};
5593
5594Parser.prototype._appendCommentNode = function (token, parent) {
5595    var commentNode = this.treeAdapter.createCommentNode(token.data);
5596
5597    this.treeAdapter.appendChild(parent, commentNode);
5598};
5599
5600Parser.prototype._insertCharacters = function (token) {
5601    if (this._shouldFosterParentOnInsertion())
5602        this._fosterParentText(token.chars);
5603
5604    else {
5605        var parent = this.openElements.currentTmplContent || this.openElements.current;
5606
5607        this.treeAdapter.insertText(parent, token.chars);
5608    }
5609};
5610
5611Parser.prototype._adoptNodes = function (donor, recipient) {
5612    while (true) {
5613        var child = this.treeAdapter.getFirstChild(donor);
5614
5615        if (!child)
5616            break;
5617
5618        this.treeAdapter.detachNode(child);
5619        this.treeAdapter.appendChild(recipient, child);
5620    }
5621};
5622
5623//Token processing
5624Parser.prototype._shouldProcessTokenInForeignContent = function (token) {
5625    var current = this._getAdjustedCurrentElement();
5626
5627    if (!current || current === this.document)
5628        return false;
5629
5630    var ns = this.treeAdapter.getNamespaceURI(current);
5631
5632    if (ns === NS.HTML)
5633        return false;
5634
5635    if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML &&
5636        token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG) {
5637        return false;
5638    }
5639
5640    var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN ||
5641                           token.type === Tokenizer.NULL_CHARACTER_TOKEN ||
5642                           token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN,
5643        isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN &&
5644                               token.tagName !== $.MGLYPH &&
5645                               token.tagName !== $.MALIGNMARK;
5646
5647    if ((isMathMLTextStartTag || isCharacterToken) && this._isMathMLTextIntegrationPoint(current))
5648        return false;
5649
5650    if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isHtmlIntegrationPoint(current))
5651        return false;
5652
5653    return token.type !== Tokenizer.EOF_TOKEN;
5654};
5655
5656Parser.prototype._processToken = function (token) {
5657    _[this.insertionMode][token.type](this, token);
5658};
5659
5660Parser.prototype._processTokenInBodyMode = function (token) {
5661    _[IN_BODY_MODE][token.type](this, token);
5662};
5663
5664Parser.prototype._processTokenInForeignContent = function (token) {
5665    if (token.type === Tokenizer.CHARACTER_TOKEN)
5666        characterInForeignContent(this, token);
5667
5668    else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN)
5669        nullCharacterInForeignContent(this, token);
5670
5671    else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN)
5672        insertCharacters(this, token);
5673
5674    else if (token.type === Tokenizer.COMMENT_TOKEN)
5675        appendComment(this, token);
5676
5677    else if (token.type === Tokenizer.START_TAG_TOKEN)
5678        startTagInForeignContent(this, token);
5679
5680    else if (token.type === Tokenizer.END_TAG_TOKEN)
5681        endTagInForeignContent(this, token);
5682};
5683
5684Parser.prototype._processFakeStartTagWithAttrs = function (tagName, attrs) {
5685    var fakeToken = this.tokenizer.buildStartTagToken(tagName);
5686
5687    fakeToken.attrs = attrs;
5688    this._processToken(fakeToken);
5689};
5690
5691Parser.prototype._processFakeStartTag = function (tagName) {
5692    var fakeToken = this.tokenizer.buildStartTagToken(tagName);
5693
5694    this._processToken(fakeToken);
5695    return fakeToken;
5696};
5697
5698Parser.prototype._processFakeEndTag = function (tagName) {
5699    var fakeToken = this.tokenizer.buildEndTagToken(tagName);
5700
5701    this._processToken(fakeToken);
5702    return fakeToken;
5703};
5704
5705//Integration points
5706Parser.prototype._isMathMLTextIntegrationPoint = function (element) {
5707    var tn = this.treeAdapter.getTagName(element),
5708        ns = this.treeAdapter.getNamespaceURI(element);
5709
5710    return ForeignContent.isMathMLTextIntegrationPoint(tn, ns);
5711};
5712
5713Parser.prototype._isHtmlIntegrationPoint = function (element) {
5714    var tn = this.treeAdapter.getTagName(element),
5715        ns = this.treeAdapter.getNamespaceURI(element),
5716        attrs = this.treeAdapter.getAttrList(element);
5717
5718    return ForeignContent.isHtmlIntegrationPoint(tn, ns, attrs);
5719};
5720
5721//Active formatting elements reconstruction
5722Parser.prototype._reconstructActiveFormattingElements = function () {
5723    var listLength = this.activeFormattingElements.length;
5724
5725    if (listLength) {
5726        var unopenIdx = listLength,
5727            entry = null;
5728
5729        do {
5730            unopenIdx--;
5731            entry = this.activeFormattingElements.entries[unopenIdx];
5732
5733            if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) {
5734                unopenIdx++;
5735                break;
5736            }
5737        } while (unopenIdx > 0);
5738
5739        for (var i = unopenIdx; i < listLength; i++) {
5740            entry = this.activeFormattingElements.entries[i];
5741            this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element));
5742            entry.element = this.openElements.current;
5743        }
5744    }
5745};
5746
5747//Close elements
5748Parser.prototype._closeTableCell = function () {
5749    if (this.openElements.hasInTableScope($.TD))
5750        this._processFakeEndTag($.TD);
5751
5752    else
5753        this._processFakeEndTag($.TH);
5754};
5755
5756Parser.prototype._closePElement = function () {
5757    this.openElements.generateImpliedEndTagsWithExclusion($.P);
5758    this.openElements.popUntilTagNamePopped($.P);
5759};
5760
5761//Insertion modes
5762Parser.prototype._resetInsertionMode = function () {
5763    for (var i = this.openElements.stackTop, last = false; i >= 0; i--) {
5764        var element = this.openElements.items[i];
5765
5766        if (i === 0) {
5767            last = true;
5768
5769            if (this.fragmentContext)
5770                element = this.fragmentContext;
5771        }
5772
5773        var tn = this.treeAdapter.getTagName(element),
5774            newInsertionMode = INSERTION_MODE_RESET_MAP[tn];
5775
5776        if (newInsertionMode) {
5777            this.insertionMode = newInsertionMode;
5778            break;
5779        }
5780
5781        else if (!last && (tn === $.TD || tn === $.TH)) {
5782            this.insertionMode = IN_CELL_MODE;
5783            break;
5784        }
5785
5786        else if (!last && tn === $.HEAD) {
5787            this.insertionMode = IN_HEAD_MODE;
5788            break;
5789        }
5790
5791        else if (tn === $.SELECT) {
5792            this._resetInsertionModeForSelect(i);
5793            break;
5794        }
5795
5796        else if (tn === $.TEMPLATE) {
5797            this.insertionMode = this.currentTmplInsertionMode;
5798            break;
5799        }
5800
5801        else if (tn === $.HTML) {
5802            this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE;
5803            break;
5804        }
5805
5806        else if (last) {
5807            this.insertionMode = IN_BODY_MODE;
5808            break;
5809        }
5810    }
5811};
5812
5813Parser.prototype._resetInsertionModeForSelect = function (selectIdx) {
5814    if (selectIdx > 0) {
5815        for (var i = selectIdx - 1; i > 0; i--) {
5816            var ancestor = this.openElements.items[i],
5817                tn = this.treeAdapter.getTagName(ancestor);
5818
5819            if (tn === $.TEMPLATE)
5820                break;
5821
5822            else if (tn === $.TABLE) {
5823                this.insertionMode = IN_SELECT_IN_TABLE_MODE;
5824                return;
5825            }
5826        }
5827    }
5828
5829    this.insertionMode = IN_SELECT_MODE;
5830};
5831
5832Parser.prototype._pushTmplInsertionMode = function (mode) {
5833    this.tmplInsertionModeStack.push(mode);
5834    this.tmplInsertionModeStackTop++;
5835    this.currentTmplInsertionMode = mode;
5836};
5837
5838Parser.prototype._popTmplInsertionMode = function () {
5839    this.tmplInsertionModeStack.pop();
5840    this.tmplInsertionModeStackTop--;
5841    this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop];
5842};
5843
5844//Foster parenting
5845Parser.prototype._isElementCausesFosterParenting = function (element) {
5846    var tn = this.treeAdapter.getTagName(element);
5847
5848    return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn == $.THEAD || tn === $.TR;
5849};
5850
5851Parser.prototype._shouldFosterParentOnInsertion = function () {
5852    return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current);
5853};
5854
5855Parser.prototype._findFosterParentingLocation = function () {
5856    var location = {
5857        parent: null,
5858        beforeElement: null
5859    };
5860
5861    for (var i = this.openElements.stackTop; i >= 0; i--) {
5862        var openElement = this.openElements.items[i],
5863            tn = this.treeAdapter.getTagName(openElement),
5864            ns = this.treeAdapter.getNamespaceURI(openElement);
5865
5866        if (tn === $.TEMPLATE && ns === NS.HTML) {
5867            location.parent = this.treeAdapter.getChildNodes(openElement)[0];
5868            break;
5869        }
5870
5871        else if (tn === $.TABLE) {
5872            location.parent = this.treeAdapter.getParentNode(openElement);
5873
5874            if (location.parent)
5875                location.beforeElement = openElement;
5876            else
5877                location.parent = this.openElements.items[i - 1];
5878
5879            break;
5880        }
5881    }
5882
5883    if (!location.parent)
5884        location.parent = this.openElements.items[0];
5885
5886    return location;
5887};
5888
5889Parser.prototype._fosterParentElement = function (element) {
5890    var location = this._findFosterParentingLocation();
5891
5892    if (location.beforeElement)
5893        this.treeAdapter.insertBefore(location.parent, element, location.beforeElement);
5894    else
5895        this.treeAdapter.appendChild(location.parent, element);
5896};
5897
5898Parser.prototype._fosterParentText = function (chars) {
5899    var location = this._findFosterParentingLocation();
5900
5901    if (location.beforeElement)
5902        this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement);
5903    else
5904        this.treeAdapter.insertText(location.parent, chars);
5905};
5906
5907//Special elements
5908Parser.prototype._isSpecialElement = function (element) {
5909    var tn = this.treeAdapter.getTagName(element),
5910        ns = this.treeAdapter.getNamespaceURI(element);
5911
5912    return HTML.SPECIAL_ELEMENTS[ns][tn];
5913};
5914
5915//Adoption agency algorithm
5916//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency)
5917//------------------------------------------------------------------
5918
5919//Steps 5-8 of the algorithm
5920function aaObtainFormattingElementEntry(p, token) {
5921    var formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName);
5922
5923    if (formattingElementEntry) {
5924        if (!p.openElements.contains(formattingElementEntry.element)) {
5925            p.activeFormattingElements.removeEntry(formattingElementEntry);
5926            formattingElementEntry = null;
5927        }
5928
5929        else if (!p.openElements.hasInScope(token.tagName))
5930            formattingElementEntry = null;
5931    }
5932
5933    else
5934        genericEndTagInBody(p, token);
5935
5936    return formattingElementEntry;
5937}
5938
5939//Steps 9 and 10 of the algorithm
5940function aaObtainFurthestBlock(p, formattingElementEntry) {
5941    var furthestBlock = null;
5942
5943    for (var i = p.openElements.stackTop; i >= 0; i--) {
5944        var element = p.openElements.items[i];
5945
5946        if (element === formattingElementEntry.element)
5947            break;
5948
5949        if (p._isSpecialElement(element))
5950            furthestBlock = element;
5951    }
5952
5953    if (!furthestBlock) {
5954        p.openElements.popUntilElementPopped(formattingElementEntry.element);
5955        p.activeFormattingElements.removeEntry(formattingElementEntry);
5956    }
5957
5958    return furthestBlock;
5959}
5960
5961//Step 13 of the algorithm
5962function aaInnerLoop(p, furthestBlock, formattingElement) {
5963    var element = null,
5964        lastElement = furthestBlock,
5965        nextElement = p.openElements.getCommonAncestor(furthestBlock);
5966
5967    for (var i = 0; i < AA_INNER_LOOP_ITER; i++) {
5968        element = nextElement;
5969
5970        //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5)
5971        nextElement = p.openElements.getCommonAncestor(element);
5972
5973        var elementEntry = p.activeFormattingElements.getElementEntry(element);
5974
5975        if (!elementEntry) {
5976            p.openElements.remove(element);
5977            continue;
5978        }
5979
5980        if (element === formattingElement)
5981            break;
5982
5983        element = aaRecreateElementFromEntry(p, elementEntry);
5984
5985        if (lastElement === furthestBlock)
5986            p.activeFormattingElements.bookmark = elementEntry;
5987
5988        p.treeAdapter.detachNode(lastElement);
5989        p.treeAdapter.appendChild(element, lastElement);
5990        lastElement = element;
5991    }
5992
5993    return lastElement;
5994}
5995
5996//Step 13.7 of the algorithm
5997function aaRecreateElementFromEntry(p, elementEntry) {
5998    var ns = p.treeAdapter.getNamespaceURI(elementEntry.element),
5999        newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs);
6000
6001    p.openElements.replace(elementEntry.element, newElement);
6002    elementEntry.element = newElement;
6003
6004    return newElement;
6005}
6006
6007//Step 14 of the algorithm
6008function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) {
6009    if (p._isElementCausesFosterParenting(commonAncestor))
6010        p._fosterParentElement(lastElement);
6011
6012    else {
6013        var tn = p.treeAdapter.getTagName(commonAncestor),
6014            ns = p.treeAdapter.getNamespaceURI(commonAncestor);
6015
6016        if (tn === $.TEMPLATE && ns === NS.HTML)
6017            commonAncestor = p.treeAdapter.getChildNodes(commonAncestor)[0];
6018
6019        p.treeAdapter.appendChild(commonAncestor, lastElement);
6020    }
6021}
6022
6023//Steps 15-19 of the algorithm
6024function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) {
6025    var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element),
6026        token = formattingElementEntry.token,
6027        newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs);
6028
6029    p._adoptNodes(furthestBlock, newElement);
6030    p.treeAdapter.appendChild(furthestBlock, newElement);
6031
6032    p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token);
6033    p.activeFormattingElements.removeEntry(formattingElementEntry);
6034
6035    p.openElements.remove(formattingElementEntry.element);
6036    p.openElements.insertAfter(furthestBlock, newElement);
6037}
6038
6039//Algorithm entry point
6040function callAdoptionAgency(p, token) {
6041    for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) {
6042        var formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry);
6043
6044        if (!formattingElementEntry)
6045            break;
6046
6047        var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry);
6048
6049        if (!furthestBlock)
6050            break;
6051
6052        p.activeFormattingElements.bookmark = formattingElementEntry;
6053
6054        var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element),
6055            commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element);
6056
6057        p.treeAdapter.detachNode(lastElement);
6058        aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);
6059        aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry);
6060    }
6061}
6062
6063
6064//Generic token handlers
6065//------------------------------------------------------------------
6066function ignoreToken(p, token) {
6067    //NOTE: do nothing =)
6068}
6069
6070function appendComment(p, token) {
6071    p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current)
6072}
6073
6074function appendCommentToRootHtmlElement(p, token) {
6075    p._appendCommentNode(token, p.openElements.items[0]);
6076}
6077
6078function appendCommentToDocument(p, token) {
6079    p._appendCommentNode(token, p.document);
6080}
6081
6082function insertCharacters(p, token) {
6083    p._insertCharacters(token);
6084}
6085
6086function stopParsing(p, token) {
6087    p.stopped = true;
6088}
6089
6090//12.2.5.4.1 The "initial" insertion mode
6091//------------------------------------------------------------------
6092function doctypeInInitialMode(p, token) {
6093    p._setDocumentType(token);
6094
6095    if (token.forceQuirks || Doctype.isQuirks(token.name, token.publicId, token.systemId))
6096        p.treeAdapter.setQuirksMode(p.document);
6097
6098    p.insertionMode = BEFORE_HTML_MODE;
6099}
6100
6101function tokenInInitialMode(p, token) {
6102    p.treeAdapter.setQuirksMode(p.document);
6103    p.insertionMode = BEFORE_HTML_MODE;
6104    p._processToken(token);
6105}
6106
6107
6108//12.2.5.4.2 The "before html" insertion mode
6109//------------------------------------------------------------------
6110function startTagBeforeHtml(p, token) {
6111    if (token.tagName === $.HTML) {
6112        p._insertElement(token, NS.HTML);
6113        p.insertionMode = BEFORE_HEAD_MODE;
6114    }
6115
6116    else
6117        tokenBeforeHtml(p, token);
6118}
6119
6120function endTagBeforeHtml(p, token) {
6121    var tn = token.tagName;
6122
6123    if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR)
6124        tokenBeforeHtml(p, token);
6125}
6126
6127function tokenBeforeHtml(p, token) {
6128    p._insertFakeRootElement();
6129    p.insertionMode = BEFORE_HEAD_MODE;
6130    p._processToken(token);
6131}
6132
6133
6134//12.2.5.4.3 The "before head" insertion mode
6135//------------------------------------------------------------------
6136function startTagBeforeHead(p, token) {
6137    var tn = token.tagName;
6138
6139    if (tn === $.HTML)
6140        startTagInBody(p, token);
6141
6142    else if (tn === $.HEAD) {
6143        p._insertElement(token, NS.HTML);
6144        p.headElement = p.openElements.current;
6145        p.insertionMode = IN_HEAD_MODE;
6146    }
6147
6148    else
6149        tokenBeforeHead(p, token);
6150}
6151
6152function endTagBeforeHead(p, token) {
6153    var tn = token.tagName;
6154
6155    if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR)
6156        tokenBeforeHead(p, token);
6157}
6158
6159function tokenBeforeHead(p, token) {
6160    p._processFakeStartTag($.HEAD);
6161    p._processToken(token);
6162}
6163
6164
6165//12.2.5.4.4 The "in head" insertion mode
6166//------------------------------------------------------------------
6167function startTagInHead(p, token) {
6168    var tn = token.tagName;
6169
6170    if (tn === $.HTML)
6171        startTagInBody(p, token);
6172
6173    else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND ||
6174             tn === $.COMMAND || tn === $.LINK || tn === $.META) {
6175        p._appendElement(token, NS.HTML);
6176    }
6177
6178    else if (tn === $.TITLE)
6179        p._switchToTextParsing(token, Tokenizer.MODE.RCDATA);
6180
6181    //NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse
6182    //<noscript> as a rawtext.
6183    else if (tn === $.NOSCRIPT || tn === $.NOFRAMES || tn === $.STYLE)
6184        p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
6185
6186    else if (tn === $.SCRIPT)
6187        p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA);
6188
6189    else if (tn === $.TEMPLATE) {
6190        p._insertTemplate(token, NS.HTML);
6191        p.activeFormattingElements.insertMarker();
6192        p.framesetOk = false;
6193        p.insertionMode = IN_TEMPLATE_MODE;
6194        p._pushTmplInsertionMode(IN_TEMPLATE_MODE);
6195    }
6196
6197    else if (tn !== $.HEAD)
6198        tokenInHead(p, token);
6199}
6200
6201function endTagInHead(p, token) {
6202    var tn = token.tagName;
6203
6204    if (tn === $.HEAD) {
6205        p.openElements.pop();
6206        p.insertionMode = AFTER_HEAD_MODE;
6207    }
6208
6209    else if (tn === $.BODY || tn === $.BR || tn === $.HTML)
6210        tokenInHead(p, token);
6211
6212    else if (tn === $.TEMPLATE && p.openElements.tmplCount > 0) {
6213        p.openElements.generateImpliedEndTags();
6214        p.openElements.popUntilTemplatePopped();
6215        p.activeFormattingElements.clearToLastMarker();
6216        p._popTmplInsertionMode();
6217        p._resetInsertionMode();
6218    }
6219}
6220
6221function tokenInHead(p, token) {
6222    p._processFakeEndTag($.HEAD);
6223    p._processToken(token);
6224}
6225
6226
6227//12.2.5.4.6 The "after head" insertion mode
6228//------------------------------------------------------------------
6229function startTagAfterHead(p, token) {
6230    var tn = token.tagName;
6231
6232    if (tn === $.HTML)
6233        startTagInBody(p, token);
6234
6235    else if (tn === $.BODY) {
6236        p._insertElement(token, NS.HTML);
6237        p.framesetOk = false;
6238        p.insertionMode = IN_BODY_MODE;
6239    }
6240
6241    else if (tn === $.FRAMESET) {
6242        p._insertElement(token, NS.HTML);
6243        p.insertionMode = IN_FRAMESET_MODE;
6244    }
6245
6246    else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
6247             tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) {
6248        p.openElements.push(p.headElement);
6249        startTagInHead(p, token);
6250        p.openElements.remove(p.headElement);
6251    }
6252
6253    else if (tn !== $.HEAD)
6254        tokenAfterHead(p, token);
6255}
6256
6257function endTagAfterHead(p, token) {
6258    var tn = token.tagName;
6259
6260    if (tn === $.BODY || tn === $.HTML || tn === $.BR)
6261        tokenAfterHead(p, token);
6262
6263    else if (tn === $.TEMPLATE)
6264        endTagInHead(p, token);
6265}
6266
6267function tokenAfterHead(p, token) {
6268    p._processFakeStartTag($.BODY);
6269    p.framesetOk = true;
6270    p._processToken(token);
6271}
6272
6273
6274//12.2.5.4.7 The "in body" insertion mode
6275//------------------------------------------------------------------
6276function whitespaceCharacterInBody(p, token) {
6277    p._reconstructActiveFormattingElements();
6278    p._insertCharacters(token);
6279}
6280
6281function characterInBody(p, token) {
6282    p._reconstructActiveFormattingElements();
6283    p._insertCharacters(token);
6284    p.framesetOk = false;
6285}
6286
6287function htmlStartTagInBody(p, token) {
6288    if (p.openElements.tmplCount === 0)
6289        p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs);
6290}
6291
6292function bodyStartTagInBody(p, token) {
6293    var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
6294
6295    if (bodyElement && p.openElements.tmplCount === 0) {
6296        p.framesetOk = false;
6297        p.treeAdapter.adoptAttributes(bodyElement, token.attrs);
6298    }
6299}
6300
6301function framesetStartTagInBody(p, token) {
6302    var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
6303
6304    if (p.framesetOk && bodyElement) {
6305        p.treeAdapter.detachNode(bodyElement);
6306        p.openElements.popAllUpToHtmlElement();
6307        p._insertElement(token, NS.HTML);
6308        p.insertionMode = IN_FRAMESET_MODE;
6309    }
6310}
6311
6312function addressStartTagInBody(p, token) {
6313    if (p.openElements.hasInButtonScope($.P))
6314        p._closePElement();
6315
6316    p._insertElement(token, NS.HTML);
6317}
6318
6319function numberedHeaderStartTagInBody(p, token) {
6320    if (p.openElements.hasInButtonScope($.P))
6321        p._closePElement();
6322
6323    var tn = p.openElements.currentTagName;
6324
6325    if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
6326        p.openElements.pop();
6327
6328    p._insertElement(token, NS.HTML);
6329}
6330
6331function preStartTagInBody(p, token) {
6332    if (p.openElements.hasInButtonScope($.P))
6333        p._closePElement();
6334
6335    p._insertElement(token, NS.HTML);
6336    //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
6337    //on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.)
6338    p.skipNextNewLine = true;
6339    p.framesetOk = false;
6340}
6341
6342function formStartTagInBody(p, token) {
6343    var inTemplate = p.openElements.tmplCount > 0;
6344
6345    if (!p.formElement || inTemplate) {
6346        if (p.openElements.hasInButtonScope($.P))
6347            p._closePElement();
6348
6349        p._insertElement(token, NS.HTML);
6350
6351        if (!inTemplate)
6352            p.formElement = p.openElements.current;
6353    }
6354}
6355
6356function listItemStartTagInBody(p, token) {
6357    p.framesetOk = false;
6358
6359    for (var i = p.openElements.stackTop; i >= 0; i--) {
6360        var element = p.openElements.items[i],
6361            tn = p.treeAdapter.getTagName(element);
6362
6363        if ((token.tagName === $.LI && tn === $.LI) ||
6364            ((token.tagName === $.DD || token.tagName === $.DT) && (tn === $.DD || tn == $.DT))) {
6365            p._processFakeEndTag(tn);
6366            break;
6367        }
6368
6369        if (tn !== $.ADDRESS && tn !== $.DIV && tn !== $.P && p._isSpecialElement(element))
6370            break;
6371    }
6372
6373    if (p.openElements.hasInButtonScope($.P))
6374        p._closePElement();
6375
6376    p._insertElement(token, NS.HTML);
6377}
6378
6379function plaintextStartTagInBody(p, token) {
6380    if (p.openElements.hasInButtonScope($.P))
6381        p._closePElement();
6382
6383    p._insertElement(token, NS.HTML);
6384    p.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
6385}
6386
6387function buttonStartTagInBody(p, token) {
6388    if (p.openElements.hasInScope($.BUTTON)) {
6389        p._processFakeEndTag($.BUTTON);
6390        buttonStartTagInBody(p, token);
6391    }
6392
6393    else {
6394        p._reconstructActiveFormattingElements();
6395        p._insertElement(token, NS.HTML);
6396        p.framesetOk = false;
6397    }
6398}
6399
6400function aStartTagInBody(p, token) {
6401    var activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A);
6402
6403    if (activeElementEntry) {
6404        p._processFakeEndTag($.A);
6405        p.openElements.remove(activeElementEntry.element);
6406        p.activeFormattingElements.removeEntry(activeElementEntry);
6407    }
6408
6409    p._reconstructActiveFormattingElements();
6410    p._insertElement(token, NS.HTML);
6411    p.activeFormattingElements.pushElement(p.openElements.current, token);
6412}
6413
6414function bStartTagInBody(p, token) {
6415    p._reconstructActiveFormattingElements();
6416    p._insertElement(token, NS.HTML);
6417    p.activeFormattingElements.pushElement(p.openElements.current, token);
6418}
6419
6420function nobrStartTagInBody(p, token) {
6421    p._reconstructActiveFormattingElements();
6422
6423    if (p.openElements.hasInScope($.NOBR)) {
6424        p._processFakeEndTag($.NOBR);
6425        p._reconstructActiveFormattingElements();
6426    }
6427
6428    p._insertElement(token, NS.HTML);
6429    p.activeFormattingElements.pushElement(p.openElements.current, token);
6430}
6431
6432function appletStartTagInBody(p, token) {
6433    p._reconstructActiveFormattingElements();
6434    p._insertElement(token, NS.HTML);
6435    p.activeFormattingElements.insertMarker();
6436    p.framesetOk = false;
6437}
6438
6439function tableStartTagInBody(p, token) {
6440    if (!p.treeAdapter.isQuirksMode(p.document) && p.openElements.hasInButtonScope($.P))
6441        p._closePElement();
6442
6443    p._insertElement(token, NS.HTML);
6444    p.framesetOk = false;
6445    p.insertionMode = IN_TABLE_MODE;
6446}
6447
6448function areaStartTagInBody(p, token) {
6449    p._reconstructActiveFormattingElements();
6450    p._appendElement(token, NS.HTML);
6451    p.framesetOk = false;
6452}
6453
6454function inputStartTagInBody(p, token) {
6455    p._reconstructActiveFormattingElements();
6456    p._appendElement(token, NS.HTML);
6457
6458    var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
6459
6460    if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE)
6461        p.framesetOk = false;
6462
6463}
6464
6465function paramStartTagInBody(p, token) {
6466    p._appendElement(token, NS.HTML);
6467}
6468
6469function hrStartTagInBody(p, token) {
6470    if (p.openElements.hasInButtonScope($.P))
6471        p._closePElement();
6472
6473    p._appendElement(token, NS.HTML);
6474    p.framesetOk = false;
6475}
6476
6477function imageStartTagInBody(p, token) {
6478    token.tagName = $.IMG;
6479    areaStartTagInBody(p, token);
6480}
6481
6482function isindexStartTagInBody(p, token) {
6483    if (!p.formElement || p.openElements.tmplCount > 0) {
6484        p._processFakeStartTagWithAttrs($.FORM, getSearchableIndexFormAttrs(token));
6485        p._processFakeStartTag($.HR);
6486        p._processFakeStartTag($.LABEL);
6487        p.treeAdapter.insertText(p.openElements.current, getSearchableIndexLabelText(token));
6488        p._processFakeStartTagWithAttrs($.INPUT, getSearchableIndexInputAttrs(token));
6489        p._processFakeEndTag($.LABEL);
6490        p._processFakeStartTag($.HR);
6491        p._processFakeEndTag($.FORM);
6492    }
6493}
6494
6495function textareaStartTagInBody(p, token) {
6496    p._insertElement(token, NS.HTML);
6497    //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
6498    //on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.)
6499    p.skipNextNewLine = true;
6500    p.tokenizer.state = Tokenizer.MODE.RCDATA;
6501    p.originalInsertionMode = p.insertionMode;
6502    p.framesetOk = false;
6503    p.insertionMode = TEXT_MODE;
6504}
6505
6506function xmpStartTagInBody(p, token) {
6507    if (p.openElements.hasInButtonScope($.P))
6508        p._closePElement();
6509
6510    p._reconstructActiveFormattingElements();
6511    p.framesetOk = false;
6512    p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
6513}
6514
6515function iframeStartTagInBody(p, token) {
6516    p.framesetOk = false;
6517    p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
6518}
6519
6520//NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse
6521//<noembed> as a rawtext.
6522function noembedStartTagInBody(p, token) {
6523    p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
6524}
6525
6526function selectStartTagInBody(p, token) {
6527    p._reconstructActiveFormattingElements();
6528    p._insertElement(token, NS.HTML);
6529    p.framesetOk = false;
6530
6531    if (p.insertionMode === IN_TABLE_MODE || p.insertionMode === IN_CAPTION_MODE ||
6532        p.insertionMode === IN_TABLE_BODY_MODE || p.insertionMode === IN_ROW_MODE ||
6533        p.insertionMode === IN_CELL_MODE) {
6534        p.insertionMode = IN_SELECT_IN_TABLE_MODE;
6535    }
6536
6537    else
6538        p.insertionMode = IN_SELECT_MODE;
6539}
6540
6541function optgroupStartTagInBody(p, token) {
6542    if (p.openElements.currentTagName === $.OPTION)
6543        p._processFakeEndTag($.OPTION);
6544
6545    p._reconstructActiveFormattingElements();
6546    p._insertElement(token, NS.HTML);
6547}
6548
6549function rpStartTagInBody(p, token) {
6550    if (p.openElements.hasInScope($.RUBY))
6551        p.openElements.generateImpliedEndTags();
6552
6553    p._insertElement(token, NS.HTML);
6554}
6555
6556function menuitemStartTagInBody(p, token) {
6557    p._appendElement(token, NS.HTML);
6558}
6559
6560function mathStartTagInBody(p, token) {
6561    p._reconstructActiveFormattingElements();
6562
6563    ForeignContent.adjustTokenMathMLAttrs(token);
6564    ForeignContent.adjustTokenXMLAttrs(token);
6565
6566    if (token.selfClosing)
6567        p._appendElement(token, NS.MATHML);
6568    else
6569        p._insertElement(token, NS.MATHML);
6570}
6571
6572function svgStartTagInBody(p, token) {
6573    p._reconstructActiveFormattingElements();
6574
6575    ForeignContent.adjustTokenSVGAttrs(token);
6576    ForeignContent.adjustTokenXMLAttrs(token);
6577
6578    if (token.selfClosing)
6579        p._appendElement(token, NS.SVG);
6580    else
6581        p._insertElement(token, NS.SVG);
6582}
6583
6584function genericStartTagInBody(p, token) {
6585    p._reconstructActiveFormattingElements();
6586    p._insertElement(token, NS.HTML);
6587}
6588
6589//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
6590//It's faster than using dictionary.
6591function startTagInBody(p, token) {
6592    var tn = token.tagName;
6593
6594    switch (tn.length) {
6595        case 1:
6596            if (tn === $.I || tn === $.S || tn === $.B || tn === $.U)
6597                bStartTagInBody(p, token);
6598
6599            else if (tn === $.P)
6600                addressStartTagInBody(p, token);
6601
6602            else if (tn === $.A)
6603                aStartTagInBody(p, token);
6604
6605            else
6606                genericStartTagInBody(p, token);
6607
6608            break;
6609
6610        case 2:
6611            if (tn === $.DL || tn === $.OL || tn === $.UL)
6612                addressStartTagInBody(p, token);
6613
6614            else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
6615                numberedHeaderStartTagInBody(p, token);
6616
6617            else if (tn === $.LI || tn === $.DD || tn === $.DT)
6618                listItemStartTagInBody(p, token);
6619
6620            else if (tn === $.EM || tn === $.TT)
6621                bStartTagInBody(p, token);
6622
6623            else if (tn === $.BR)
6624                areaStartTagInBody(p, token);
6625
6626            else if (tn === $.HR)
6627                hrStartTagInBody(p, token);
6628
6629            else if (tn === $.RP || tn === $.RT)
6630                rpStartTagInBody(p, token);
6631
6632            else if (tn !== $.TH && tn !== $.TD && tn !== $.TR)
6633                genericStartTagInBody(p, token);
6634
6635            break;
6636
6637        case 3:
6638            if (tn === $.DIV || tn === $.DIR || tn === $.NAV)
6639                addressStartTagInBody(p, token);
6640
6641            else if (tn === $.PRE)
6642                preStartTagInBody(p, token);
6643
6644            else if (tn === $.BIG)
6645                bStartTagInBody(p, token);
6646
6647            else if (tn === $.IMG || tn === $.WBR)
6648                areaStartTagInBody(p, token);
6649
6650            else if (tn === $.XMP)
6651                xmpStartTagInBody(p, token);
6652
6653            else if (tn === $.SVG)
6654                svgStartTagInBody(p, token);
6655
6656            else if (tn !== $.COL)
6657                genericStartTagInBody(p, token);
6658
6659            break;
6660
6661        case 4:
6662            if (tn === $.HTML)
6663                htmlStartTagInBody(p, token);
6664
6665            else if (tn === $.BASE || tn === $.LINK || tn === $.META)
6666                startTagInHead(p, token);
6667
6668            else if (tn === $.BODY)
6669                bodyStartTagInBody(p, token);
6670
6671            else if (tn === $.MAIN || tn === $.MENU)
6672                addressStartTagInBody(p, token);
6673
6674            else if (tn === $.FORM)
6675                formStartTagInBody(p, token);
6676
6677            else if (tn === $.CODE || tn === $.FONT)
6678                bStartTagInBody(p, token);
6679
6680            else if (tn === $.NOBR)
6681                nobrStartTagInBody(p, token);
6682
6683            else if (tn === $.AREA)
6684                areaStartTagInBody(p, token);
6685
6686            else if (tn === $.MATH)
6687                mathStartTagInBody(p, token);
6688
6689            else if (tn !== $.HEAD)
6690                genericStartTagInBody(p, token);
6691
6692            break;
6693
6694        case 5:
6695            if (tn === $.STYLE || tn === $.TITLE)
6696                startTagInHead(p, token);
6697
6698            else if (tn === $.ASIDE)
6699                addressStartTagInBody(p, token);
6700
6701            else if (tn === $.SMALL)
6702                bStartTagInBody(p, token);
6703
6704            else if (tn === $.TABLE)
6705                tableStartTagInBody(p, token);
6706
6707            else if (tn === $.EMBED)
6708                areaStartTagInBody(p, token);
6709
6710            else if (tn === $.INPUT)
6711                inputStartTagInBody(p, token);
6712
6713            else if (tn === $.PARAM || tn === $.TRACK)
6714                paramStartTagInBody(p, token);
6715
6716            else if (tn === $.IMAGE)
6717                imageStartTagInBody(p, token);
6718
6719            else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD)
6720                genericStartTagInBody(p, token);
6721
6722            break;
6723
6724        case 6:
6725            if (tn === $.SCRIPT)
6726                startTagInHead(p, token);
6727
6728            else if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
6729                addressStartTagInBody(p, token);
6730
6731            else if (tn === $.BUTTON)
6732                buttonStartTagInBody(p, token);
6733
6734            else if (tn === $.STRIKE || tn === $.STRONG)
6735                bStartTagInBody(p, token);
6736
6737            else if (tn === $.APPLET || tn === $.OBJECT)
6738                appletStartTagInBody(p, token);
6739
6740            else if (tn === $.KEYGEN)
6741                areaStartTagInBody(p, token);
6742
6743            else if (tn === $.SOURCE)
6744                paramStartTagInBody(p, token);
6745
6746            else if (tn === $.IFRAME)
6747                iframeStartTagInBody(p, token);
6748
6749            else if (tn === $.SELECT)
6750                selectStartTagInBody(p, token);
6751
6752            else if (tn === $.OPTION)
6753                optgroupStartTagInBody(p, token);
6754
6755            else
6756                genericStartTagInBody(p, token);
6757
6758            break;
6759
6760        case 7:
6761            if (tn === $.BGSOUND || tn === $.COMMAND)
6762                startTagInHead(p, token);
6763
6764            else if (tn === $.DETAILS || tn === $.ADDRESS || tn === $.ARTICLE || tn === $.SECTION || tn === $.SUMMARY)
6765                addressStartTagInBody(p, token);
6766
6767            else if (tn === $.LISTING)
6768                preStartTagInBody(p, token);
6769
6770            else if (tn === $.MARQUEE)
6771                appletStartTagInBody(p, token);
6772
6773            else if (tn === $.ISINDEX)
6774                isindexStartTagInBody(p, token);
6775
6776            else if (tn === $.NOEMBED)
6777                noembedStartTagInBody(p, token);
6778
6779            else if (tn !== $.CAPTION)
6780                genericStartTagInBody(p, token);
6781
6782            break;
6783
6784        case 8:
6785            if (tn === $.BASEFONT || tn === $.MENUITEM)
6786                menuitemStartTagInBody(p, token);
6787
6788            else if (tn === $.FRAMESET)
6789                framesetStartTagInBody(p, token);
6790
6791            else if (tn === $.FIELDSET)
6792                addressStartTagInBody(p, token);
6793
6794            else if (tn === $.TEXTAREA)
6795                textareaStartTagInBody(p, token);
6796
6797            else if (tn === $.TEMPLATE)
6798                startTagInHead(p, token);
6799
6800            else if (tn === $.NOSCRIPT)
6801                noembedStartTagInBody(p, token);
6802
6803            else if (tn === $.OPTGROUP)
6804                optgroupStartTagInBody(p, token);
6805
6806            else if (tn !== $.COLGROUP)
6807                genericStartTagInBody(p, token);
6808
6809            break;
6810
6811        case 9:
6812            if (tn === $.PLAINTEXT)
6813                plaintextStartTagInBody(p, token);
6814
6815            else
6816                genericStartTagInBody(p, token);
6817
6818            break;
6819
6820        case 10:
6821            if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
6822                addressStartTagInBody(p, token);
6823
6824            else
6825                genericStartTagInBody(p, token);
6826
6827            break;
6828
6829        default:
6830            genericStartTagInBody(p, token);
6831    }
6832}
6833
6834function bodyEndTagInBody(p, token) {
6835    if (p.openElements.hasInScope($.BODY))
6836        p.insertionMode = AFTER_BODY_MODE;
6837
6838    else
6839        token.ignored = true;
6840}
6841
6842function htmlEndTagInBody(p, token) {
6843    var fakeToken = p._processFakeEndTag($.BODY);
6844
6845    if (!fakeToken.ignored)
6846        p._processToken(token);
6847}
6848
6849function addressEndTagInBody(p, token) {
6850    var tn = token.tagName;
6851
6852    if (p.openElements.hasInScope(tn)) {
6853        p.openElements.generateImpliedEndTags();
6854        p.openElements.popUntilTagNamePopped(tn);
6855    }
6856}
6857
6858function formEndTagInBody(p, token) {
6859    var inTemplate = p.openElements.tmplCount > 0,
6860        formElement = p.formElement;
6861
6862    if (!inTemplate)
6863        p.formElement = null;
6864
6865    if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) {
6866        p.openElements.generateImpliedEndTags();
6867
6868        if (inTemplate)
6869            p.openElements.popUntilTagNamePopped($.FORM);
6870
6871        else
6872            p.openElements.remove(formElement);
6873    }
6874}
6875
6876function pEndTagInBody(p, token) {
6877    if (p.openElements.hasInButtonScope($.P)) {
6878        p.openElements.generateImpliedEndTagsWithExclusion($.P);
6879        p.openElements.popUntilTagNamePopped($.P);
6880    }
6881
6882    else {
6883        p._processFakeStartTag($.P);
6884        p._processToken(token);
6885    }
6886}
6887
6888function liEndTagInBody(p, token) {
6889    if (p.openElements.hasInListItemScope($.LI)) {
6890        p.openElements.generateImpliedEndTagsWithExclusion($.LI);
6891        p.openElements.popUntilTagNamePopped($.LI);
6892    }
6893}
6894
6895function ddEndTagInBody(p, token) {
6896    var tn = token.tagName;
6897
6898    if (p.openElements.hasInScope(tn)) {
6899        p.openElements.generateImpliedEndTagsWithExclusion(tn);
6900        p.openElements.popUntilTagNamePopped(tn);
6901    }
6902}
6903
6904function numberedHeaderEndTagInBody(p, token) {
6905    if (p.openElements.hasNumberedHeaderInScope()) {
6906        p.openElements.generateImpliedEndTags();
6907        p.openElements.popUntilNumberedHeaderPopped();
6908    }
6909}
6910
6911function appletEndTagInBody(p, token) {
6912    var tn = token.tagName;
6913
6914    if (p.openElements.hasInScope(tn)) {
6915        p.openElements.generateImpliedEndTags();
6916        p.openElements.popUntilTagNamePopped(tn);
6917        p.activeFormattingElements.clearToLastMarker();
6918    }
6919}
6920
6921function brEndTagInBody(p, token) {
6922    p._processFakeStartTag($.BR);
6923}
6924
6925function genericEndTagInBody(p, token) {
6926    var tn = token.tagName;
6927
6928    for (var i = p.openElements.stackTop; i > 0; i--) {
6929        var element = p.openElements.items[i];
6930
6931        if (p.treeAdapter.getTagName(element) === tn) {
6932            p.openElements.generateImpliedEndTagsWithExclusion(tn);
6933            p.openElements.popUntilElementPopped(element);
6934            break;
6935        }
6936
6937        if (p._isSpecialElement(element))
6938            break;
6939    }
6940}
6941
6942//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
6943//It's faster than using dictionary.
6944function endTagInBody(p, token) {
6945    var tn = token.tagName;
6946
6947    switch (tn.length) {
6948        case 1:
6949            if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn == $.U)
6950                callAdoptionAgency(p, token);
6951
6952            else if (tn === $.P)
6953                pEndTagInBody(p, token);
6954
6955            else
6956                genericEndTagInBody(p, token);
6957
6958            break;
6959
6960        case 2:
6961            if (tn == $.DL || tn === $.UL || tn === $.OL)
6962                addressEndTagInBody(p, token);
6963
6964            else if (tn === $.LI)
6965                liEndTagInBody(p, token);
6966
6967            else if (tn === $.DD || tn === $.DT)
6968                ddEndTagInBody(p, token);
6969
6970            else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
6971                numberedHeaderEndTagInBody(p, token);
6972
6973            else if (tn === $.BR)
6974                brEndTagInBody(p, token);
6975
6976            else if (tn === $.EM || tn === $.TT)
6977                callAdoptionAgency(p, token);
6978
6979            else
6980                genericEndTagInBody(p, token);
6981
6982            break;
6983
6984        case 3:
6985            if (tn === $.BIG)
6986                callAdoptionAgency(p, token);
6987
6988            else if (tn === $.DIR || tn === $.DIV || tn === $.NAV)
6989                addressEndTagInBody(p, token);
6990
6991            else
6992                genericEndTagInBody(p, token);
6993
6994            break;
6995
6996        case 4:
6997            if (tn === $.BODY)
6998                bodyEndTagInBody(p, token);
6999
7000            else if (tn === $.HTML)
7001                htmlEndTagInBody(p, token);
7002
7003            else if (tn === $.FORM)
7004                formEndTagInBody(p, token);
7005
7006            else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR)
7007                callAdoptionAgency(p, token);
7008
7009            else if (tn === $.MAIN || tn === $.MENU)
7010                addressEndTagInBody(p, token);
7011
7012            else
7013                genericEndTagInBody(p, token);
7014
7015            break;
7016
7017        case 5:
7018            if (tn === $.ASIDE)
7019                addressEndTagInBody(p, token);
7020
7021            else if (tn === $.SMALL)
7022                callAdoptionAgency(p, token);
7023
7024            else
7025                genericEndTagInBody(p, token);
7026
7027            break;
7028
7029        case 6:
7030            if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
7031                addressEndTagInBody(p, token);
7032
7033            else if (tn === $.APPLET || tn === $.OBJECT)
7034                appletEndTagInBody(p, token);
7035
7036            else if (tn == $.STRIKE || tn === $.STRONG)
7037                callAdoptionAgency(p, token);
7038
7039            else
7040                genericEndTagInBody(p, token);
7041
7042            break;
7043
7044        case 7:
7045            if (tn === $.ADDRESS || tn === $.ARTICLE || tn === $.DETAILS || tn === $.SECTION || tn === $.SUMMARY)
7046                addressEndTagInBody(p, token);
7047
7048            else if (tn === $.MARQUEE)
7049                appletEndTagInBody(p, token);
7050
7051            else
7052                genericEndTagInBody(p, token);
7053
7054            break;
7055
7056        case 8:
7057            if (tn === $.FIELDSET)
7058                addressEndTagInBody(p, token);
7059
7060            else if (tn === $.TEMPLATE)
7061                endTagInHead(p, token);
7062
7063            else
7064                genericEndTagInBody(p, token);
7065
7066            break;
7067
7068        case 10:
7069            if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
7070                addressEndTagInBody(p, token);
7071
7072            else
7073                genericEndTagInBody(p, token);
7074
7075            break;
7076
7077        default :
7078            genericEndTagInBody(p, token);
7079    }
7080}
7081
7082function eofInBody(p, token) {
7083    if (p.tmplInsertionModeStackTop > -1)
7084        eofInTemplate(p, token);
7085
7086    else
7087        p.stopped = true;
7088}
7089
7090//12.2.5.4.8 The "text" insertion mode
7091//------------------------------------------------------------------
7092function endTagInText(p, token) {
7093    if (!p.fragmentContext && p.scriptHandler && token.tagName === $.SCRIPT)
7094        p.scriptHandler(p.document, p.openElements.current);
7095
7096    p.openElements.pop();
7097    p.insertionMode = p.originalInsertionMode;
7098}
7099
7100
7101function eofInText(p, token) {
7102    p.openElements.pop();
7103    p.insertionMode = p.originalInsertionMode;
7104    p._processToken(token);
7105}
7106
7107
7108//12.2.5.4.9 The "in table" insertion mode
7109//------------------------------------------------------------------
7110function characterInTable(p, token) {
7111    var curTn = p.openElements.currentTagName;
7112
7113    if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) {
7114        p.pendingCharacterTokens = [];
7115        p.hasNonWhitespacePendingCharacterToken = false;
7116        p.originalInsertionMode = p.insertionMode;
7117        p.insertionMode = IN_TABLE_TEXT_MODE;
7118        p._processToken(token);
7119    }
7120
7121    else
7122        tokenInTable(p, token);
7123}
7124
7125function captionStartTagInTable(p, token) {
7126    p.openElements.clearBackToTableContext();
7127    p.activeFormattingElements.insertMarker();
7128    p._insertElement(token, NS.HTML);
7129    p.insertionMode = IN_CAPTION_MODE;
7130}
7131
7132function colgroupStartTagInTable(p, token) {
7133    p.openElements.clearBackToTableContext();
7134    p._insertElement(token, NS.HTML);
7135    p.insertionMode = IN_COLUMN_GROUP_MODE;
7136}
7137
7138function colStartTagInTable(p, token) {
7139    p._processFakeStartTag($.COLGROUP);
7140    p._processToken(token);
7141}
7142
7143function tbodyStartTagInTable(p, token) {
7144    p.openElements.clearBackToTableContext();
7145    p._insertElement(token, NS.HTML);
7146    p.insertionMode = IN_TABLE_BODY_MODE;
7147}
7148
7149function tdStartTagInTable(p, token) {
7150    p._processFakeStartTag($.TBODY);
7151    p._processToken(token);
7152}
7153
7154function tableStartTagInTable(p, token) {
7155    var fakeToken = p._processFakeEndTag($.TABLE);
7156
7157    //NOTE: The fake end tag token here can only be ignored in the fragment case.
7158    if (!fakeToken.ignored)
7159        p._processToken(token);
7160}
7161
7162function inputStartTagInTable(p, token) {
7163    var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
7164
7165    if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE)
7166        p._appendElement(token, NS.HTML);
7167
7168    else
7169        tokenInTable(p, token);
7170}
7171
7172function formStartTagInTable(p, token) {
7173    if (!p.formElement && p.openElements.tmplCount === 0) {
7174        p._insertElement(token, NS.HTML);
7175        p.formElement = p.openElements.current;
7176        p.openElements.pop();
7177    }
7178}
7179
7180function startTagInTable(p, token) {
7181    var tn = token.tagName;
7182
7183    switch (tn.length) {
7184        case 2:
7185            if (tn === $.TD || tn === $.TH || tn === $.TR)
7186                tdStartTagInTable(p, token);
7187
7188            else
7189                tokenInTable(p, token);
7190
7191            break;
7192
7193        case 3:
7194            if (tn === $.COL)
7195                colStartTagInTable(p, token);
7196
7197            else
7198                tokenInTable(p, token);
7199
7200            break;
7201
7202        case 4:
7203            if (tn === $.FORM)
7204                formStartTagInTable(p, token);
7205
7206            else
7207                tokenInTable(p, token);
7208
7209            break;
7210
7211        case 5:
7212            if (tn === $.TABLE)
7213                tableStartTagInTable(p, token);
7214
7215            else if (tn === $.STYLE)
7216                startTagInHead(p, token);
7217
7218            else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD)
7219                tbodyStartTagInTable(p, token);
7220
7221            else if (tn === $.INPUT)
7222                inputStartTagInTable(p, token);
7223
7224            else
7225                tokenInTable(p, token);
7226
7227            break;
7228
7229        case 6:
7230            if (tn === $.SCRIPT)
7231                startTagInHead(p, token);
7232
7233            else
7234                tokenInTable(p, token);
7235
7236            break;
7237
7238        case 7:
7239            if (tn === $.CAPTION)
7240                captionStartTagInTable(p, token);
7241
7242            else
7243                tokenInTable(p, token);
7244
7245            break;
7246
7247        case 8:
7248            if (tn === $.COLGROUP)
7249                colgroupStartTagInTable(p, token);
7250
7251            else if (tn === $.TEMPLATE)
7252                startTagInHead(p, token);
7253
7254            else
7255                tokenInTable(p, token);
7256
7257            break;
7258
7259        default:
7260            tokenInTable(p, token);
7261    }
7262
7263}
7264
7265function endTagInTable(p, token) {
7266    var tn = token.tagName;
7267
7268    if (tn === $.TABLE) {
7269        if (p.openElements.hasInTableScope($.TABLE)) {
7270            p.openElements.popUntilTagNamePopped($.TABLE);
7271            p._resetInsertionMode();
7272        }
7273
7274        else
7275            token.ignored = true;
7276    }
7277
7278    else if (tn === $.TEMPLATE)
7279        endTagInHead(p, token);
7280
7281    else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML &&
7282             tn !== $.TBODY && tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) {
7283        tokenInTable(p, token);
7284    }
7285}
7286
7287function tokenInTable(p, token) {
7288    var savedFosterParentingState = p.fosterParentingEnabled;
7289
7290    p.fosterParentingEnabled = true;
7291    p._processTokenInBodyMode(token);
7292    p.fosterParentingEnabled = savedFosterParentingState;
7293}
7294
7295
7296//12.2.5.4.10 The "in table text" insertion mode
7297//------------------------------------------------------------------
7298function whitespaceCharacterInTableText(p, token) {
7299    p.pendingCharacterTokens.push(token);
7300}
7301
7302function characterInTableText(p, token) {
7303    p.pendingCharacterTokens.push(token);
7304    p.hasNonWhitespacePendingCharacterToken = true;
7305}
7306
7307function tokenInTableText(p, token) {
7308    if (p.hasNonWhitespacePendingCharacterToken) {
7309        for (var i = 0; i < p.pendingCharacterTokens.length; i++)
7310            tokenInTable(p, p.pendingCharacterTokens[i]);
7311    }
7312
7313    else {
7314        for (var i = 0; i < p.pendingCharacterTokens.length; i++)
7315            p._insertCharacters(p.pendingCharacterTokens[i]);
7316    }
7317
7318    p.insertionMode = p.originalInsertionMode;
7319    p._processToken(token);
7320}
7321
7322
7323//12.2.5.4.11 The "in caption" insertion mode
7324//------------------------------------------------------------------
7325function startTagInCaption(p, token) {
7326    var tn = token.tagName;
7327
7328    if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
7329        tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
7330        var fakeToken = p._processFakeEndTag($.CAPTION);
7331
7332        //NOTE: The fake end tag token here can only be ignored in the fragment case.
7333        if (!fakeToken.ignored)
7334            p._processToken(token);
7335    }
7336
7337    else
7338        startTagInBody(p, token);
7339}
7340
7341function endTagInCaption(p, token) {
7342    var tn = token.tagName;
7343
7344    if (tn === $.CAPTION) {
7345        if (p.openElements.hasInTableScope($.CAPTION)) {
7346            p.openElements.generateImpliedEndTags();
7347            p.openElements.popUntilTagNamePopped($.CAPTION);
7348            p.activeFormattingElements.clearToLastMarker();
7349            p.insertionMode = IN_TABLE_MODE;
7350        }
7351
7352        else
7353            token.ignored = true;
7354    }
7355
7356    else if (tn === $.TABLE) {
7357        var fakeToken = p._processFakeEndTag($.CAPTION);
7358
7359        //NOTE: The fake end tag token here can only be ignored in the fragment case.
7360        if (!fakeToken.ignored)
7361            p._processToken(token);
7362    }
7363
7364    else if (tn !== $.BODY && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && tn !== $.TBODY &&
7365             tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) {
7366        endTagInBody(p, token);
7367    }
7368}
7369
7370
7371//12.2.5.4.12 The "in column group" insertion mode
7372//------------------------------------------------------------------
7373function startTagInColumnGroup(p, token) {
7374    var tn = token.tagName;
7375
7376    if (tn === $.HTML)
7377        startTagInBody(p, token);
7378
7379    else if (tn === $.COL)
7380        p._appendElement(token, NS.HTML);
7381
7382    else if (tn === $.TEMPLATE)
7383        startTagInHead(p, token);
7384
7385    else
7386        tokenInColumnGroup(p, token);
7387}
7388
7389function endTagInColumnGroup(p, token) {
7390    var tn = token.tagName;
7391
7392    if (tn === $.COLGROUP) {
7393        if (p.openElements.currentTagName !== $.COLGROUP)
7394            token.ignored = true;
7395
7396        else {
7397            p.openElements.pop();
7398            p.insertionMode = IN_TABLE_MODE;
7399        }
7400    }
7401
7402    else if (tn === $.TEMPLATE)
7403        endTagInHead(p, token);
7404
7405    else if (tn !== $.COL)
7406        tokenInColumnGroup(p, token);
7407}
7408
7409function tokenInColumnGroup(p, token) {
7410    var fakeToken = p._processFakeEndTag($.COLGROUP);
7411
7412    //NOTE: The fake end tag token here can only be ignored in the fragment case.
7413    if (!fakeToken.ignored)
7414        p._processToken(token);
7415}
7416
7417//12.2.5.4.13 The "in table body" insertion mode
7418//------------------------------------------------------------------
7419function startTagInTableBody(p, token) {
7420    var tn = token.tagName;
7421
7422    if (tn === $.TR) {
7423        p.openElements.clearBackToTableBodyContext();
7424        p._insertElement(token, NS.HTML);
7425        p.insertionMode = IN_ROW_MODE;
7426    }
7427
7428    else if (tn === $.TH || tn === $.TD) {
7429        p._processFakeStartTag($.TR);
7430        p._processToken(token);
7431    }
7432
7433    else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP ||
7434             tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
7435
7436        if (p.openElements.hasTableBodyContextInTableScope()) {
7437            p.openElements.clearBackToTableBodyContext();
7438            p._processFakeEndTag(p.openElements.currentTagName);
7439            p._processToken(token);
7440        }
7441    }
7442
7443    else
7444        startTagInTable(p, token);
7445}
7446
7447function endTagInTableBody(p, token) {
7448    var tn = token.tagName;
7449
7450    if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
7451        if (p.openElements.hasInTableScope(tn)) {
7452            p.openElements.clearBackToTableBodyContext();
7453            p.openElements.pop();
7454            p.insertionMode = IN_TABLE_MODE;
7455        }
7456    }
7457
7458    else if (tn === $.TABLE) {
7459        if (p.openElements.hasTableBodyContextInTableScope()) {
7460            p.openElements.clearBackToTableBodyContext();
7461            p._processFakeEndTag(p.openElements.currentTagName);
7462            p._processToken(token);
7463        }
7464    }
7465
7466    else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
7467             tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR) {
7468        endTagInTable(p, token);
7469    }
7470}
7471
7472//12.2.5.4.14 The "in row" insertion mode
7473//------------------------------------------------------------------
7474function startTagInRow(p, token) {
7475    var tn = token.tagName;
7476
7477    if (tn === $.TH || tn === $.TD) {
7478        p.openElements.clearBackToTableRowContext();
7479        p._insertElement(token, NS.HTML);
7480        p.insertionMode = IN_CELL_MODE;
7481        p.activeFormattingElements.insertMarker();
7482    }
7483
7484    else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
7485             tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
7486        var fakeToken = p._processFakeEndTag($.TR);
7487
7488        //NOTE: The fake end tag token here can only be ignored in the fragment case.
7489        if (!fakeToken.ignored)
7490            p._processToken(token);
7491    }
7492
7493    else
7494        startTagInTable(p, token);
7495}
7496
7497function endTagInRow(p, token) {
7498    var tn = token.tagName;
7499
7500    if (tn === $.TR) {
7501        if (p.openElements.hasInTableScope($.TR)) {
7502            p.openElements.clearBackToTableRowContext();
7503            p.openElements.pop();
7504            p.insertionMode = IN_TABLE_BODY_MODE;
7505        }
7506
7507        else
7508            token.ignored = true;
7509    }
7510
7511    else if (tn === $.TABLE) {
7512        var fakeToken = p._processFakeEndTag($.TR);
7513
7514        //NOTE: The fake end tag token here can only be ignored in the fragment case.
7515        if (!fakeToken.ignored)
7516            p._processToken(token);
7517    }
7518
7519    else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
7520        if (p.openElements.hasInTableScope(tn)) {
7521            p._processFakeEndTag($.TR);
7522            p._processToken(token);
7523        }
7524    }
7525
7526    else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
7527             tn !== $.HTML && tn !== $.TD && tn !== $.TH) {
7528        endTagInTable(p, token);
7529    }
7530}
7531
7532
7533//12.2.5.4.15 The "in cell" insertion mode
7534//------------------------------------------------------------------
7535function startTagInCell(p, token) {
7536    var tn = token.tagName;
7537
7538    if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
7539        tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
7540
7541        if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) {
7542            p._closeTableCell();
7543            p._processToken(token);
7544        }
7545    }
7546
7547    else
7548        startTagInBody(p, token);
7549}
7550
7551function endTagInCell(p, token) {
7552    var tn = token.tagName;
7553
7554    if (tn === $.TD || tn === $.TH) {
7555        if (p.openElements.hasInTableScope(tn)) {
7556            p.openElements.generateImpliedEndTags();
7557            p.openElements.popUntilTagNamePopped(tn);
7558            p.activeFormattingElements.clearToLastMarker();
7559            p.insertionMode = IN_ROW_MODE;
7560        }
7561    }
7562
7563    else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
7564        if (p.openElements.hasInTableScope(tn)) {
7565            p._closeTableCell();
7566            p._processToken(token);
7567        }
7568    }
7569
7570    else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML)
7571        endTagInBody(p, token);
7572}
7573
7574//12.2.5.4.16 The "in select" insertion mode
7575//------------------------------------------------------------------
7576function startTagInSelect(p, token) {
7577    var tn = token.tagName;
7578
7579    if (tn === $.HTML)
7580        startTagInBody(p, token);
7581
7582    else if (tn === $.OPTION) {
7583        if (p.openElements.currentTagName === $.OPTION)
7584            p._processFakeEndTag($.OPTION);
7585
7586        p._insertElement(token, NS.HTML);
7587    }
7588
7589    else if (tn === $.OPTGROUP) {
7590        if (p.openElements.currentTagName === $.OPTION)
7591            p._processFakeEndTag($.OPTION);
7592
7593        if (p.openElements.currentTagName === $.OPTGROUP)
7594            p._processFakeEndTag($.OPTGROUP);
7595
7596        p._insertElement(token, NS.HTML);
7597    }
7598
7599    else if (tn === $.SELECT)
7600        p._processFakeEndTag($.SELECT);
7601
7602    else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA) {
7603        if (p.openElements.hasInSelectScope($.SELECT)) {
7604            p._processFakeEndTag($.SELECT);
7605            p._processToken(token);
7606        }
7607    }
7608
7609    else if (tn === $.SCRIPT || tn === $.TEMPLATE)
7610        startTagInHead(p, token);
7611}
7612
7613function endTagInSelect(p, token) {
7614    var tn = token.tagName;
7615
7616    if (tn === $.OPTGROUP) {
7617        var prevOpenElement = p.openElements.items[p.openElements.stackTop - 1],
7618            prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement);
7619
7620        if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP)
7621            p._processFakeEndTag($.OPTION);
7622
7623        if (p.openElements.currentTagName === $.OPTGROUP)
7624            p.openElements.pop();
7625    }
7626
7627    else if (tn === $.OPTION) {
7628        if (p.openElements.currentTagName === $.OPTION)
7629            p.openElements.pop();
7630    }
7631
7632    else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) {
7633        p.openElements.popUntilTagNamePopped($.SELECT);
7634        p._resetInsertionMode();
7635    }
7636
7637    else if (tn === $.TEMPLATE)
7638        endTagInHead(p, token);
7639}
7640
7641//12.2.5.4.17 The "in select in table" insertion mode
7642//------------------------------------------------------------------
7643function startTagInSelectInTable(p, token) {
7644    var tn = token.tagName;
7645
7646    if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
7647        tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
7648        p._processFakeEndTag($.SELECT);
7649        p._processToken(token);
7650    }
7651
7652    else
7653        startTagInSelect(p, token);
7654}
7655
7656function endTagInSelectInTable(p, token) {
7657    var tn = token.tagName;
7658
7659    if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
7660        tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
7661        if (p.openElements.hasInTableScope(tn)) {
7662            p._processFakeEndTag($.SELECT);
7663            p._processToken(token);
7664        }
7665    }
7666
7667    else
7668        endTagInSelect(p, token);
7669}
7670
7671//12.2.5.4.18 The "in template" insertion mode
7672//------------------------------------------------------------------
7673function startTagInTemplate(p, token) {
7674    var tn = token.tagName;
7675
7676    if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
7677        tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) {
7678        startTagInHead(p, token);
7679    }
7680
7681    else {
7682        var newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE;
7683
7684        p._popTmplInsertionMode();
7685        p._pushTmplInsertionMode(newInsertionMode);
7686        p.insertionMode = newInsertionMode;
7687        p._processToken(token);
7688    }
7689}
7690
7691function endTagInTemplate(p, token) {
7692    if (token.tagName === $.TEMPLATE)
7693        endTagInHead(p, token);
7694}
7695
7696function eofInTemplate(p, token) {
7697    if (p.openElements.tmplCount > 0) {
7698        p.openElements.popUntilTemplatePopped();
7699        p.activeFormattingElements.clearToLastMarker();
7700        p._popTmplInsertionMode();
7701        p._resetInsertionMode();
7702        p._processToken(token);
7703    }
7704
7705    else
7706        p.stopped = true;
7707}
7708
7709
7710//12.2.5.4.19 The "after body" insertion mode
7711//------------------------------------------------------------------
7712function startTagAfterBody(p, token) {
7713    if (token.tagName === $.HTML)
7714        startTagInBody(p, token);
7715
7716    else
7717        tokenAfterBody(p, token);
7718}
7719
7720function endTagAfterBody(p, token) {
7721    if (token.tagName === $.HTML) {
7722        if (!p.fragmentContext)
7723            p.insertionMode = AFTER_AFTER_BODY_MODE;
7724    }
7725
7726    else
7727        tokenAfterBody(p, token);
7728}
7729
7730function tokenAfterBody(p, token) {
7731    p.insertionMode = IN_BODY_MODE;
7732    p._processToken(token);
7733}
7734
7735//12.2.5.4.20 The "in frameset" insertion mode
7736//------------------------------------------------------------------
7737function startTagInFrameset(p, token) {
7738    var tn = token.tagName;
7739
7740    if (tn === $.HTML)
7741        startTagInBody(p, token);
7742
7743    else if (tn === $.FRAMESET)
7744        p._insertElement(token, NS.HTML);
7745
7746    else if (tn === $.FRAME)
7747        p._appendElement(token, NS.HTML);
7748
7749    else if (tn === $.NOFRAMES)
7750        startTagInHead(p, token);
7751}
7752
7753function endTagInFrameset(p, token) {
7754    if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) {
7755        p.openElements.pop();
7756
7757        if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET)
7758            p.insertionMode = AFTER_FRAMESET_MODE;
7759    }
7760}
7761
7762//12.2.5.4.21 The "after frameset" insertion mode
7763//------------------------------------------------------------------
7764function startTagAfterFrameset(p, token) {
7765    var tn = token.tagName;
7766
7767    if (tn === $.HTML)
7768        startTagInBody(p, token);
7769
7770    else if (tn === $.NOFRAMES)
7771        startTagInHead(p, token);
7772}
7773
7774function endTagAfterFrameset(p, token) {
7775    if (token.tagName === $.HTML)
7776        p.insertionMode = AFTER_AFTER_FRAMESET_MODE;
7777}
7778
7779//12.2.5.4.22 The "after after body" insertion mode
7780//------------------------------------------------------------------
7781function startTagAfterAfterBody(p, token) {
7782    if (token.tagName === $.HTML)
7783        startTagInBody(p, token);
7784
7785    else
7786        tokenAfterAfterBody(p, token);
7787}
7788
7789function tokenAfterAfterBody(p, token) {
7790    p.insertionMode = IN_BODY_MODE;
7791    p._processToken(token);
7792}
7793
7794//12.2.5.4.23 The "after after frameset" insertion mode
7795//------------------------------------------------------------------
7796function startTagAfterAfterFrameset(p, token) {
7797    var tn = token.tagName;
7798
7799    if (tn === $.HTML)
7800        startTagInBody(p, token);
7801
7802    else if (tn === $.NOFRAMES)
7803        startTagInHead(p, token);
7804}
7805
7806
7807//12.2.5.5 The rules for parsing tokens in foreign content
7808//------------------------------------------------------------------
7809function nullCharacterInForeignContent(p, token) {
7810    token.chars = UNICODE.REPLACEMENT_CHARACTER;
7811    p._insertCharacters(token);
7812}
7813
7814function characterInForeignContent(p, token) {
7815    p._insertCharacters(token);
7816    p.framesetOk = false;
7817}
7818
7819function startTagInForeignContent(p, token) {
7820    if (ForeignContent.causesExit(token) && !p.fragmentContext) {
7821        while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML &&
7822               (!p._isMathMLTextIntegrationPoint(p.openElements.current)) &&
7823               (!p._isHtmlIntegrationPoint(p.openElements.current))) {
7824            p.openElements.pop();
7825        }
7826
7827        p._processToken(token);
7828    }
7829
7830    else {
7831        var current = p._getAdjustedCurrentElement(),
7832            currentNs = p.treeAdapter.getNamespaceURI(current);
7833
7834        if (currentNs === NS.MATHML)
7835            ForeignContent.adjustTokenMathMLAttrs(token);
7836
7837        else if (currentNs === NS.SVG) {
7838            ForeignContent.adjustTokenSVGTagName(token);
7839            ForeignContent.adjustTokenSVGAttrs(token);
7840        }
7841
7842        ForeignContent.adjustTokenXMLAttrs(token);
7843
7844        if (token.selfClosing)
7845            p._appendElement(token, currentNs);
7846        else
7847            p._insertElement(token, currentNs);
7848    }
7849}
7850
7851function endTagInForeignContent(p, token) {
7852    for (var i = p.openElements.stackTop; i > 0; i--) {
7853        var element = p.openElements.items[i];
7854
7855        if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) {
7856            p._processToken(token);
7857            break;
7858        }
7859
7860        if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) {
7861            p.openElements.popUntilElementPopped(element);
7862            break;
7863        }
7864    }
7865}
7866
7867},{"../common/doctype":1,"../common/foreign_content":2,"../common/html":3,"../common/unicode":4,"../common/utils":5,"../tokenization/tokenizer":14,"../tree_adapters/default":15,"./formatting_element_list":17,"./location_info_mixin":18,"./open_element_stack":19}],21:[function(require,module,exports){
7868(function (global){
7869'use strict';
7870
7871global.parse5 = {};
7872
7873parse5.Parser = require('./lib/tree_construction/parser');
7874parse5.SimpleApiParser = require('./lib/simple_api/simple_api_parser');
7875parse5.TreeSerializer =
7876parse5.Serializer = require('./lib/serialization/serializer');
7877parse5.JsDomParser = require('./lib/jsdom/jsdom_parser');
7878
7879parse5.TreeAdapters = {
7880    default: require('./lib/tree_adapters/default'),
7881    htmlparser2: require('./lib/tree_adapters/htmlparser2')
7882};
7883
7884}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
7885},{"./lib/jsdom/jsdom_parser":6,"./lib/serialization/serializer":8,"./lib/simple_api/simple_api_parser":9,"./lib/tree_adapters/default":15,"./lib/tree_adapters/htmlparser2":16,"./lib/tree_construction/parser":20}],22:[function(require,module,exports){
7886// shim for using process in browser
7887
7888var process = module.exports = {};
7889var queue = [];
7890var draining = false;
7891var currentQueue;
7892var queueIndex = -1;
7893
7894function cleanUpNextTick() {
7895    draining = false;
7896    if (currentQueue.length) {
7897        queue = currentQueue.concat(queue);
7898    } else {
7899        queueIndex = -1;
7900    }
7901    if (queue.length) {
7902        drainQueue();
7903    }
7904}
7905
7906function drainQueue() {
7907    if (draining) {
7908        return;
7909    }
7910    var timeout = setTimeout(cleanUpNextTick);
7911    draining = true;
7912
7913    var len = queue.length;
7914    while(len) {
7915        currentQueue = queue;
7916        queue = [];
7917        while (++queueIndex < len) {
7918            currentQueue[queueIndex].run();
7919        }
7920        queueIndex = -1;
7921        len = queue.length;
7922    }
7923    currentQueue = null;
7924    draining = false;
7925    clearTimeout(timeout);
7926}
7927
7928process.nextTick = function (fun) {
7929    var args = new Array(arguments.length - 1);
7930    if (arguments.length > 1) {
7931        for (var i = 1; i < arguments.length; i++) {
7932            args[i - 1] = arguments[i];
7933        }
7934    }
7935    queue.push(new Item(fun, args));
7936    if (queue.length === 1 && !draining) {
7937        setTimeout(drainQueue, 0);
7938    }
7939};
7940
7941// v8 likes predictible objects
7942function Item(fun, array) {
7943    this.fun = fun;
7944    this.array = array;
7945}
7946Item.prototype.run = function () {
7947    this.fun.apply(null, this.array);
7948};
7949process.title = 'browser';
7950process.browser = true;
7951process.env = {};
7952process.argv = [];
7953process.version = ''; // empty string to avoid regexp issues
7954process.versions = {};
7955
7956function noop() {}
7957
7958process.on = noop;
7959process.addListener = noop;
7960process.once = noop;
7961process.off = noop;
7962process.removeListener = noop;
7963process.removeAllListeners = noop;
7964process.emit = noop;
7965
7966process.binding = function (name) {
7967    throw new Error('process.binding is not supported');
7968};
7969
7970// TODO(shtylman)
7971process.cwd = function () { return '/' };
7972process.chdir = function (dir) {
7973    throw new Error('process.chdir is not supported');
7974};
7975process.umask = function() { return 0; };
7976
7977},{}]},{},[21]);
7978