| (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){ |
| 'use strict'; |
| |
| //Const |
| var VALID_DOCTYPE_NAME = 'html', |
| QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd', |
| QUIRKS_MODE_PUBLIC_ID_PREFIXES = [ |
| "+//silmaril//dtd html pro v0r11 19970101//en", |
| "-//advasoft ltd//dtd html 3.0 aswedit + extensions//en", |
| "-//as//dtd html 3.0 aswedit + extensions//en", |
| "-//ietf//dtd html 2.0 level 1//en", |
| "-//ietf//dtd html 2.0 level 2//en", |
| "-//ietf//dtd html 2.0 strict level 1//en", |
| "-//ietf//dtd html 2.0 strict level 2//en", |
| "-//ietf//dtd html 2.0 strict//en", |
| "-//ietf//dtd html 2.0//en", |
| "-//ietf//dtd html 2.1e//en", |
| "-//ietf//dtd html 3.0//en", |
| "-//ietf//dtd html 3.0//en//", |
| "-//ietf//dtd html 3.2 final//en", |
| "-//ietf//dtd html 3.2//en", |
| "-//ietf//dtd html 3//en", |
| "-//ietf//dtd html level 0//en", |
| "-//ietf//dtd html level 0//en//2.0", |
| "-//ietf//dtd html level 1//en", |
| "-//ietf//dtd html level 1//en//2.0", |
| "-//ietf//dtd html level 2//en", |
| "-//ietf//dtd html level 2//en//2.0", |
| "-//ietf//dtd html level 3//en", |
| "-//ietf//dtd html level 3//en//3.0", |
| "-//ietf//dtd html strict level 0//en", |
| "-//ietf//dtd html strict level 0//en//2.0", |
| "-//ietf//dtd html strict level 1//en", |
| "-//ietf//dtd html strict level 1//en//2.0", |
| "-//ietf//dtd html strict level 2//en", |
| "-//ietf//dtd html strict level 2//en//2.0", |
| "-//ietf//dtd html strict level 3//en", |
| "-//ietf//dtd html strict level 3//en//3.0", |
| "-//ietf//dtd html strict//en", |
| "-//ietf//dtd html strict//en//2.0", |
| "-//ietf//dtd html strict//en//3.0", |
| "-//ietf//dtd html//en", |
| "-//ietf//dtd html//en//2.0", |
| "-//ietf//dtd html//en//3.0", |
| "-//metrius//dtd metrius presentational//en", |
| "-//microsoft//dtd internet explorer 2.0 html strict//en", |
| "-//microsoft//dtd internet explorer 2.0 html//en", |
| "-//microsoft//dtd internet explorer 2.0 tables//en", |
| "-//microsoft//dtd internet explorer 3.0 html strict//en", |
| "-//microsoft//dtd internet explorer 3.0 html//en", |
| "-//microsoft//dtd internet explorer 3.0 tables//en", |
| "-//netscape comm. corp.//dtd html//en", |
| "-//netscape comm. corp.//dtd strict html//en", |
| "-//o'reilly and associates//dtd html 2.0//en", |
| "-//o'reilly and associates//dtd html extended 1.0//en", |
| "-//spyglass//dtd html 2.0 extended//en", |
| "-//sq//dtd html 2.0 hotmetal + extensions//en", |
| "-//sun microsystems corp.//dtd hotjava html//en", |
| "-//sun microsystems corp.//dtd hotjava strict html//en", |
| "-//w3c//dtd html 3 1995-03-24//en", |
| "-//w3c//dtd html 3.2 draft//en", |
| "-//w3c//dtd html 3.2 final//en", |
| "-//w3c//dtd html 3.2//en", |
| "-//w3c//dtd html 3.2s draft//en", |
| "-//w3c//dtd html 4.0 frameset//en", |
| "-//w3c//dtd html 4.0 transitional//en", |
| "-//w3c//dtd html experimental 19960712//en", |
| "-//w3c//dtd html experimental 970421//en", |
| "-//w3c//dtd w3 html//en", |
| "-//w3o//dtd w3 html 3.0//en", |
| "-//w3o//dtd w3 html 3.0//en//", |
| "-//webtechs//dtd mozilla html 2.0//en", |
| "-//webtechs//dtd mozilla html//en" |
| ], |
| QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [ |
| '-//w3c//dtd html 4.01 frameset//', |
| '-//w3c//dtd html 4.01 transitional//' |
| ], |
| QUIRKS_MODE_PUBLIC_IDS = [ |
| '-//w3o//dtd w3 html strict 3.0//en//', |
| '-/w3c/dtd html 4.0 transitional/en', |
| 'html' |
| ]; |
| |
| |
| //Utils |
| function enquoteDoctypeId(id) { |
| var quote = id.indexOf('"') !== -1 ? '\'' : '"'; |
| |
| return quote + id + quote; |
| } |
| |
| |
| //API |
| exports.isQuirks = function (name, publicId, systemId) { |
| if (name !== VALID_DOCTYPE_NAME) |
| return true; |
| |
| if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID) |
| return true; |
| |
| if (publicId !== null) { |
| publicId = publicId.toLowerCase(); |
| |
| if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1) |
| return true; |
| |
| var prefixes = QUIRKS_MODE_PUBLIC_ID_PREFIXES; |
| |
| if (systemId === null) |
| prefixes = prefixes.concat(QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES); |
| |
| for (var i = 0; i < prefixes.length; i++) { |
| if (publicId.indexOf(prefixes[i]) === 0) |
| return true; |
| } |
| } |
| |
| return false; |
| }; |
| |
| exports.serializeContent = function (name, publicId, systemId) { |
| var str = '!DOCTYPE ' + name; |
| |
| if (publicId !== null) |
| str += ' PUBLIC ' + enquoteDoctypeId(publicId); |
| |
| else if (systemId !== null) |
| str += ' SYSTEM'; |
| |
| if (systemId !== null) |
| str += ' ' + enquoteDoctypeId(systemId); |
| |
| return str; |
| }; |
| |
| },{}],2:[function(require,module,exports){ |
| 'use strict'; |
| |
| var Tokenizer = require('../tokenization/tokenizer'), |
| HTML = require('./html'); |
| |
| //Aliases |
| var $ = HTML.TAG_NAMES, |
| NS = HTML.NAMESPACES, |
| ATTRS = HTML.ATTRS; |
| |
| |
| //MIME types |
| var MIME_TYPES = { |
| TEXT_HTML: 'text/html', |
| APPLICATION_XML: 'application/xhtml+xml' |
| }; |
| |
| //Attributes |
| var DEFINITION_URL_ATTR = 'definitionurl', |
| ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL', |
| SVG_ATTRS_ADJUSTMENT_MAP = { |
| 'attributename': 'attributeName', |
| 'attributetype': 'attributeType', |
| 'basefrequency': 'baseFrequency', |
| 'baseprofile': 'baseProfile', |
| 'calcmode': 'calcMode', |
| 'clippathunits': 'clipPathUnits', |
| 'contentscripttype': 'contentScriptType', |
| 'contentstyletype': 'contentStyleType', |
| 'diffuseconstant': 'diffuseConstant', |
| 'edgemode': 'edgeMode', |
| 'externalresourcesrequired': 'externalResourcesRequired', |
| 'filterres': 'filterRes', |
| 'filterunits': 'filterUnits', |
| 'glyphref': 'glyphRef', |
| 'gradienttransform': 'gradientTransform', |
| 'gradientunits': 'gradientUnits', |
| 'kernelmatrix': 'kernelMatrix', |
| 'kernelunitlength': 'kernelUnitLength', |
| 'keypoints': 'keyPoints', |
| 'keysplines': 'keySplines', |
| 'keytimes': 'keyTimes', |
| 'lengthadjust': 'lengthAdjust', |
| 'limitingconeangle': 'limitingConeAngle', |
| 'markerheight': 'markerHeight', |
| 'markerunits': 'markerUnits', |
| 'markerwidth': 'markerWidth', |
| 'maskcontentunits': 'maskContentUnits', |
| 'maskunits': 'maskUnits', |
| 'numoctaves': 'numOctaves', |
| 'pathlength': 'pathLength', |
| 'patterncontentunits': 'patternContentUnits', |
| 'patterntransform': 'patternTransform', |
| 'patternunits': 'patternUnits', |
| 'pointsatx': 'pointsAtX', |
| 'pointsaty': 'pointsAtY', |
| 'pointsatz': 'pointsAtZ', |
| 'preservealpha': 'preserveAlpha', |
| 'preserveaspectratio': 'preserveAspectRatio', |
| 'primitiveunits': 'primitiveUnits', |
| 'refx': 'refX', |
| 'refy': 'refY', |
| 'repeatcount': 'repeatCount', |
| 'repeatdur': 'repeatDur', |
| 'requiredextensions': 'requiredExtensions', |
| 'requiredfeatures': 'requiredFeatures', |
| 'specularconstant': 'specularConstant', |
| 'specularexponent': 'specularExponent', |
| 'spreadmethod': 'spreadMethod', |
| 'startoffset': 'startOffset', |
| 'stddeviation': 'stdDeviation', |
| 'stitchtiles': 'stitchTiles', |
| 'surfacescale': 'surfaceScale', |
| 'systemlanguage': 'systemLanguage', |
| 'tablevalues': 'tableValues', |
| 'targetx': 'targetX', |
| 'targety': 'targetY', |
| 'textlength': 'textLength', |
| 'viewbox': 'viewBox', |
| 'viewtarget': 'viewTarget', |
| 'xchannelselector': 'xChannelSelector', |
| 'ychannelselector': 'yChannelSelector', |
| 'zoomandpan': 'zoomAndPan' |
| }, |
| XML_ATTRS_ADJUSTMENT_MAP = { |
| 'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.XLINK}, |
| 'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK}, |
| 'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.XLINK}, |
| 'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.XLINK}, |
| 'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.XLINK}, |
| 'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.XLINK}, |
| 'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.XLINK}, |
| 'xml:base': {prefix: 'xml', name: 'base', namespace: NS.XML}, |
| 'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.XML}, |
| 'xml:space': {prefix: 'xml', name: 'space', namespace: NS.XML}, |
| 'xmlns': {prefix: '', name: 'xmlns', namespace: NS.XMLNS}, |
| 'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS} |
| |
| }; |
| |
| //SVG tag names adjustment map |
| var SVG_TAG_NAMES_ADJUSTMENT_MAP = { |
| 'altglyph': 'altGlyph', |
| 'altglyphdef': 'altGlyphDef', |
| 'altglyphitem': 'altGlyphItem', |
| 'animatecolor': 'animateColor', |
| 'animatemotion': 'animateMotion', |
| 'animatetransform': 'animateTransform', |
| 'clippath': 'clipPath', |
| 'feblend': 'feBlend', |
| 'fecolormatrix': 'feColorMatrix', |
| 'fecomponenttransfer': 'feComponentTransfer', |
| 'fecomposite': 'feComposite', |
| 'feconvolvematrix': 'feConvolveMatrix', |
| 'fediffuselighting': 'feDiffuseLighting', |
| 'fedisplacementmap': 'feDisplacementMap', |
| 'fedistantlight': 'feDistantLight', |
| 'feflood': 'feFlood', |
| 'fefunca': 'feFuncA', |
| 'fefuncb': 'feFuncB', |
| 'fefuncg': 'feFuncG', |
| 'fefuncr': 'feFuncR', |
| 'fegaussianblur': 'feGaussianBlur', |
| 'feimage': 'feImage', |
| 'femerge': 'feMerge', |
| 'femergenode': 'feMergeNode', |
| 'femorphology': 'feMorphology', |
| 'feoffset': 'feOffset', |
| 'fepointlight': 'fePointLight', |
| 'fespecularlighting': 'feSpecularLighting', |
| 'fespotlight': 'feSpotLight', |
| 'fetile': 'feTile', |
| 'feturbulence': 'feTurbulence', |
| 'foreignobject': 'foreignObject', |
| 'glyphref': 'glyphRef', |
| 'lineargradient': 'linearGradient', |
| 'radialgradient': 'radialGradient', |
| 'textpath': 'textPath' |
| }; |
| |
| //Tags that causes exit from foreign content |
| var EXITS_FOREIGN_CONTENT = {}; |
| |
| EXITS_FOREIGN_CONTENT[$.B] = true; |
| EXITS_FOREIGN_CONTENT[$.BIG] = true; |
| EXITS_FOREIGN_CONTENT[$.BLOCKQUOTE] = true; |
| EXITS_FOREIGN_CONTENT[$.BODY] = true; |
| EXITS_FOREIGN_CONTENT[$.BR] = true; |
| EXITS_FOREIGN_CONTENT[$.CENTER] = true; |
| EXITS_FOREIGN_CONTENT[$.CODE] = true; |
| EXITS_FOREIGN_CONTENT[$.DD] = true; |
| EXITS_FOREIGN_CONTENT[$.DIV] = true; |
| EXITS_FOREIGN_CONTENT[$.DL] = true; |
| EXITS_FOREIGN_CONTENT[$.DT] = true; |
| EXITS_FOREIGN_CONTENT[$.EM] = true; |
| EXITS_FOREIGN_CONTENT[$.EMBED] = true; |
| EXITS_FOREIGN_CONTENT[$.H1] = true; |
| EXITS_FOREIGN_CONTENT[$.H2] = true; |
| EXITS_FOREIGN_CONTENT[$.H3] = true; |
| EXITS_FOREIGN_CONTENT[$.H4] = true; |
| EXITS_FOREIGN_CONTENT[$.H5] = true; |
| EXITS_FOREIGN_CONTENT[$.H6] = true; |
| EXITS_FOREIGN_CONTENT[$.HEAD] = true; |
| EXITS_FOREIGN_CONTENT[$.HR] = true; |
| EXITS_FOREIGN_CONTENT[$.I] = true; |
| EXITS_FOREIGN_CONTENT[$.IMG] = true; |
| EXITS_FOREIGN_CONTENT[$.LI] = true; |
| EXITS_FOREIGN_CONTENT[$.LISTING] = true; |
| EXITS_FOREIGN_CONTENT[$.MENU] = true; |
| EXITS_FOREIGN_CONTENT[$.META] = true; |
| EXITS_FOREIGN_CONTENT[$.NOBR] = true; |
| EXITS_FOREIGN_CONTENT[$.OL] = true; |
| EXITS_FOREIGN_CONTENT[$.P] = true; |
| EXITS_FOREIGN_CONTENT[$.PRE] = true; |
| EXITS_FOREIGN_CONTENT[$.RUBY] = true; |
| EXITS_FOREIGN_CONTENT[$.S] = true; |
| EXITS_FOREIGN_CONTENT[$.SMALL] = true; |
| EXITS_FOREIGN_CONTENT[$.SPAN] = true; |
| EXITS_FOREIGN_CONTENT[$.STRONG] = true; |
| EXITS_FOREIGN_CONTENT[$.STRIKE] = true; |
| EXITS_FOREIGN_CONTENT[$.SUB] = true; |
| EXITS_FOREIGN_CONTENT[$.SUP] = true; |
| EXITS_FOREIGN_CONTENT[$.TABLE] = true; |
| EXITS_FOREIGN_CONTENT[$.TT] = true; |
| EXITS_FOREIGN_CONTENT[$.U] = true; |
| EXITS_FOREIGN_CONTENT[$.UL] = true; |
| EXITS_FOREIGN_CONTENT[$.VAR] = true; |
| |
| //Check exit from foreign content |
| exports.causesExit = function (startTagToken) { |
| var tn = startTagToken.tagName; |
| |
| if (tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null || |
| Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null || |
| Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null)) { |
| return true; |
| } |
| |
| return EXITS_FOREIGN_CONTENT[tn]; |
| }; |
| |
| //Token adjustments |
| exports.adjustTokenMathMLAttrs = function (token) { |
| for (var i = 0; i < token.attrs.length; i++) { |
| if (token.attrs[i].name === DEFINITION_URL_ATTR) { |
| token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR; |
| break; |
| } |
| } |
| }; |
| |
| exports.adjustTokenSVGAttrs = function (token) { |
| for (var i = 0; i < token.attrs.length; i++) { |
| var adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; |
| |
| if (adjustedAttrName) |
| token.attrs[i].name = adjustedAttrName; |
| } |
| }; |
| |
| exports.adjustTokenXMLAttrs = function (token) { |
| for (var i = 0; i < token.attrs.length; i++) { |
| var adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; |
| |
| if (adjustedAttrEntry) { |
| token.attrs[i].prefix = adjustedAttrEntry.prefix; |
| token.attrs[i].name = adjustedAttrEntry.name; |
| token.attrs[i].namespace = adjustedAttrEntry.namespace; |
| } |
| } |
| }; |
| |
| exports.adjustTokenSVGTagName = function (token) { |
| var adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName]; |
| |
| if (adjustedTagName) |
| token.tagName = adjustedTagName; |
| }; |
| |
| //Integration points |
| exports.isMathMLTextIntegrationPoint = function (tn, ns) { |
| return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT); |
| }; |
| |
| exports.isHtmlIntegrationPoint = function (tn, ns, attrs) { |
| if (ns === NS.MATHML && tn === $.ANNOTATION_XML) { |
| for (var i = 0; i < attrs.length; i++) { |
| if (attrs[i].name === ATTRS.ENCODING) { |
| var value = attrs[i].value.toLowerCase(); |
| |
| return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML; |
| } |
| } |
| } |
| |
| return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE); |
| }; |
| |
| },{"../tokenization/tokenizer":14,"./html":3}],3:[function(require,module,exports){ |
| 'use strict'; |
| |
| var NS = exports.NAMESPACES = { |
| HTML: 'http://www.w3.org/1999/xhtml', |
| MATHML: 'http://www.w3.org/1998/Math/MathML', |
| SVG: 'http://www.w3.org/2000/svg', |
| XLINK: 'http://www.w3.org/1999/xlink', |
| XML: 'http://www.w3.org/XML/1998/namespace', |
| XMLNS: 'http://www.w3.org/2000/xmlns/' |
| }; |
| |
| exports.ATTRS = { |
| TYPE: 'type', |
| ACTION: 'action', |
| ENCODING: 'encoding', |
| PROMPT: 'prompt', |
| NAME: 'name', |
| COLOR: 'color', |
| FACE: 'face', |
| SIZE: 'size' |
| }; |
| |
| var $ = exports.TAG_NAMES = { |
| A: 'a', |
| ADDRESS: 'address', |
| ANNOTATION_XML: 'annotation-xml', |
| APPLET: 'applet', |
| AREA: 'area', |
| ARTICLE: 'article', |
| ASIDE: 'aside', |
| |
| B: 'b', |
| BASE: 'base', |
| BASEFONT: 'basefont', |
| BGSOUND: 'bgsound', |
| BIG: 'big', |
| BLOCKQUOTE: 'blockquote', |
| BODY: 'body', |
| BR: 'br', |
| BUTTON: 'button', |
| |
| CAPTION: 'caption', |
| CENTER: 'center', |
| CODE: 'code', |
| COL: 'col', |
| COLGROUP: 'colgroup', |
| COMMAND: 'command', |
| |
| DD: 'dd', |
| DESC: 'desc', |
| DETAILS: 'details', |
| DIALOG: 'dialog', |
| DIR: 'dir', |
| DIV: 'div', |
| DL: 'dl', |
| DT: 'dt', |
| |
| EM: 'em', |
| EMBED: 'embed', |
| |
| FIELDSET: 'fieldset', |
| FIGCAPTION: 'figcaption', |
| FIGURE: 'figure', |
| FONT: 'font', |
| FOOTER: 'footer', |
| FOREIGN_OBJECT: 'foreignObject', |
| FORM: 'form', |
| FRAME: 'frame', |
| FRAMESET: 'frameset', |
| |
| H1: 'h1', |
| H2: 'h2', |
| H3: 'h3', |
| H4: 'h4', |
| H5: 'h5', |
| H6: 'h6', |
| HEAD: 'head', |
| HEADER: 'header', |
| HGROUP: 'hgroup', |
| HR: 'hr', |
| HTML: 'html', |
| |
| I: 'i', |
| IMG: 'img', |
| IMAGE: 'image', |
| INPUT: 'input', |
| IFRAME: 'iframe', |
| ISINDEX: 'isindex', |
| |
| KEYGEN: 'keygen', |
| |
| LABEL: 'label', |
| LI: 'li', |
| LINK: 'link', |
| LISTING: 'listing', |
| |
| MAIN: 'main', |
| MALIGNMARK: 'malignmark', |
| MARQUEE: 'marquee', |
| MATH: 'math', |
| MENU: 'menu', |
| MENUITEM: 'menuitem', |
| META: 'meta', |
| MGLYPH: 'mglyph', |
| MI: 'mi', |
| MO: 'mo', |
| MN: 'mn', |
| MS: 'ms', |
| MTEXT: 'mtext', |
| |
| NAV: 'nav', |
| NOBR: 'nobr', |
| NOFRAMES: 'noframes', |
| NOEMBED: 'noembed', |
| NOSCRIPT: 'noscript', |
| |
| OBJECT: 'object', |
| OL: 'ol', |
| OPTGROUP: 'optgroup', |
| OPTION: 'option', |
| |
| P: 'p', |
| PARAM: 'param', |
| PLAINTEXT: 'plaintext', |
| PRE: 'pre', |
| |
| RP: 'rp', |
| RT: 'rt', |
| RUBY: 'ruby', |
| |
| S: 's', |
| SCRIPT: 'script', |
| SECTION: 'section', |
| SELECT: 'select', |
| SOURCE: 'source', |
| SMALL: 'small', |
| SPAN: 'span', |
| STRIKE: 'strike', |
| STRONG: 'strong', |
| STYLE: 'style', |
| SUB: 'sub', |
| SUMMARY: 'summary', |
| SUP: 'sup', |
| |
| TABLE: 'table', |
| TBODY: 'tbody', |
| TEMPLATE: 'template', |
| TEXTAREA: 'textarea', |
| TFOOT: 'tfoot', |
| TD: 'td', |
| TH: 'th', |
| THEAD: 'thead', |
| TITLE: 'title', |
| TR: 'tr', |
| TRACK: 'track', |
| TT: 'tt', |
| |
| U: 'u', |
| UL: 'ul', |
| |
| SVG: 'svg', |
| |
| VAR: 'var', |
| |
| WBR: 'wbr', |
| |
| XMP: 'xmp' |
| }; |
| |
| var SPECIAL_ELEMENTS = exports.SPECIAL_ELEMENTS = {}; |
| |
| SPECIAL_ELEMENTS[NS.HTML] = {}; |
| SPECIAL_ELEMENTS[NS.HTML][$.ADDRESS] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.APPLET] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.AREA] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.ARTICLE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.ASIDE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.BASE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.BASEFONT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.BGSOUND] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.BLOCKQUOTE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.BODY] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.BR] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.BUTTON] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.CAPTION] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.CENTER] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.COL] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.COLGROUP] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.DD] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.DETAILS] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.DIR] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.DIV] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.DL] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.DT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.EMBED] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.FIELDSET] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.FIGCAPTION] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.FIGURE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.FOOTER] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.FORM] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.FRAME] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.FRAMESET] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.H1] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.H2] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.H3] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.H4] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.H5] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.H6] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.HEAD] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.HEADER] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.HGROUP] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.HR] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.HTML] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.IFRAME] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.IMG] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.INPUT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.ISINDEX] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.LI] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.LINK] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.LISTING] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.MAIN] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.MARQUEE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.MENU] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.MENUITEM] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.META] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.NAV] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.NOEMBED] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.NOFRAMES] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.NOSCRIPT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.OBJECT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.OL] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.P] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.PARAM] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.PLAINTEXT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.PRE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.SCRIPT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.SECTION] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.SELECT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.SOURCE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.STYLE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.SUMMARY] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TABLE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TBODY] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TD] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TEMPLATE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TEXTAREA] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TFOOT] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TH] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.THEAD] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TITLE] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TR] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.TRACK] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.UL] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.WBR] = true; |
| SPECIAL_ELEMENTS[NS.HTML][$.XMP] = true; |
| |
| SPECIAL_ELEMENTS[NS.MATHML] = {}; |
| SPECIAL_ELEMENTS[NS.MATHML][$.MI] = true; |
| SPECIAL_ELEMENTS[NS.MATHML][$.MO] = true; |
| SPECIAL_ELEMENTS[NS.MATHML][$.MN] = true; |
| SPECIAL_ELEMENTS[NS.MATHML][$.MS] = true; |
| SPECIAL_ELEMENTS[NS.MATHML][$.MTEXT] = true; |
| SPECIAL_ELEMENTS[NS.MATHML][$.ANNOTATION_XML] = true; |
| |
| SPECIAL_ELEMENTS[NS.SVG] = {}; |
| SPECIAL_ELEMENTS[NS.SVG][$.TITLE] = true; |
| SPECIAL_ELEMENTS[NS.SVG][$.FOREIGN_OBJECT] = true; |
| SPECIAL_ELEMENTS[NS.SVG][$.DESC] = true; |
| |
| },{}],4:[function(require,module,exports){ |
| 'use strict'; |
| |
| exports.REPLACEMENT_CHARACTER = '\uFFFD'; |
| |
| exports.CODE_POINTS = { |
| EOF: -1, |
| NULL: 0x00, |
| TABULATION: 0x09, |
| CARRIAGE_RETURN: 0x0D, |
| LINE_FEED: 0x0A, |
| FORM_FEED: 0x0C, |
| SPACE: 0x20, |
| EXCLAMATION_MARK: 0x21, |
| QUOTATION_MARK: 0x22, |
| NUMBER_SIGN: 0x23, |
| AMPERSAND: 0x26, |
| APOSTROPHE: 0x27, |
| HYPHEN_MINUS: 0x2D, |
| SOLIDUS: 0x2F, |
| DIGIT_0: 0x30, |
| DIGIT_9: 0x39, |
| SEMICOLON: 0x3B, |
| LESS_THAN_SIGN: 0x3C, |
| EQUALS_SIGN: 0x3D, |
| GREATER_THAN_SIGN: 0x3E, |
| QUESTION_MARK: 0x3F, |
| LATIN_CAPITAL_A: 0x41, |
| LATIN_CAPITAL_F: 0x46, |
| LATIN_CAPITAL_X: 0x58, |
| LATIN_CAPITAL_Z: 0x5A, |
| GRAVE_ACCENT: 0x60, |
| LATIN_SMALL_A: 0x61, |
| LATIN_SMALL_F: 0x66, |
| LATIN_SMALL_X: 0x78, |
| LATIN_SMALL_Z: 0x7A, |
| BOM: 0xFEFF, |
| REPLACEMENT_CHARACTER: 0xFFFD |
| }; |
| |
| exports.CODE_POINT_SEQUENCES = { |
| DASH_DASH_STRING: [0x2D, 0x2D], //-- |
| DOCTYPE_STRING: [0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45], //DOCTYPE |
| CDATA_START_STRING: [0x5B, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5B], //[CDATA[ |
| CDATA_END_STRING: [0x5D, 0x5D, 0x3E], //]]> |
| SCRIPT_STRING: [0x73, 0x63, 0x72, 0x69, 0x70, 0x74], //script |
| PUBLIC_STRING: [0x50, 0x55, 0x42, 0x4C, 0x49, 0x43], //PUBLIC |
| SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4D] //SYSTEM |
| }; |
| |
| },{}],5:[function(require,module,exports){ |
| 'use strict'; |
| |
| exports.mergeOptions = function (defaults, options) { |
| options = options || {}; |
| |
| return [defaults, options].reduce(function (merged, optObj) { |
| Object.keys(optObj).forEach(function (key) { |
| merged[key] = optObj[key]; |
| }); |
| |
| return merged; |
| }, {}); |
| }; |
| |
| },{}],6:[function(require,module,exports){ |
| (function (process){ |
| 'use strict'; |
| |
| var Parser = require('../tree_construction/parser'), |
| ParsingUnit = require('./parsing_unit'); |
| |
| //API |
| exports.parseDocument = function (html, treeAdapter) { |
| //NOTE: this should be reentrant, so we create new parser here |
| var parser = new Parser(treeAdapter), |
| parsingUnit = new ParsingUnit(parser); |
| |
| //NOTE: override parser loop method |
| parser._runParsingLoop = function () { |
| parsingUnit.parsingLoopLock = true; |
| |
| while (!parsingUnit.suspended && !this.stopped) |
| this._iterateParsingLoop(); |
| |
| parsingUnit.parsingLoopLock = false; |
| |
| if (this.stopped) |
| parsingUnit.callback(this.document); |
| }; |
| |
| //NOTE: wait while parserController will be adopted by calling code, then |
| //start parsing |
| process.nextTick(function () { |
| parser.parse(html); |
| }); |
| |
| return parsingUnit; |
| }; |
| |
| exports.parseInnerHtml = function (innerHtml, contextElement, treeAdapter) { |
| //NOTE: this should be reentrant, so we create new parser here |
| var parser = new Parser(treeAdapter); |
| |
| return parser.parseFragment(innerHtml, contextElement); |
| }; |
| }).call(this,require('_process')) |
| },{"../tree_construction/parser":20,"./parsing_unit":7,"_process":22}],7:[function(require,module,exports){ |
| 'use strict'; |
| |
| var ParsingUnit = module.exports = function (parser) { |
| this.parser = parser; |
| this.suspended = false; |
| this.parsingLoopLock = false; |
| this.callback = null; |
| }; |
| |
| ParsingUnit.prototype._stateGuard = function (suspend) { |
| if (this.suspended && suspend) |
| throw new Error('parse5: Parser was already suspended. Please, check your control flow logic.'); |
| |
| else if (!this.suspended && !suspend) |
| throw new Error('parse5: Parser was already resumed. Please, check your control flow logic.'); |
| |
| return suspend; |
| }; |
| |
| ParsingUnit.prototype.suspend = function () { |
| this.suspended = this._stateGuard(true); |
| |
| return this; |
| }; |
| |
| ParsingUnit.prototype.resume = function () { |
| this.suspended = this._stateGuard(false); |
| |
| //NOTE: don't enter parsing loop if it is locked. Without this lock _runParsingLoop() may be called |
| //while parsing loop is still running. E.g. when suspend() and resume() called synchronously. |
| if (!this.parsingLoopLock) |
| this.parser._runParsingLoop(); |
| |
| return this; |
| }; |
| |
| ParsingUnit.prototype.documentWrite = function (html) { |
| this.parser.tokenizer.preprocessor.write(html); |
| |
| return this; |
| }; |
| |
| ParsingUnit.prototype.handleScripts = function (scriptHandler) { |
| this.parser.scriptHandler = scriptHandler; |
| |
| return this; |
| }; |
| |
| ParsingUnit.prototype.done = function (callback) { |
| this.callback = callback; |
| |
| return this; |
| }; |
| |
| },{}],8:[function(require,module,exports){ |
| 'use strict'; |
| |
| var DefaultTreeAdapter = require('../tree_adapters/default'), |
| Doctype = require('../common/doctype'), |
| Utils = require('../common/utils'), |
| HTML = require('../common/html'); |
| |
| //Aliases |
| var $ = HTML.TAG_NAMES, |
| NS = HTML.NAMESPACES; |
| |
| //Default serializer options |
| var DEFAULT_OPTIONS = { |
| encodeHtmlEntities: true |
| }; |
| |
| //Escaping regexes |
| var AMP_REGEX = /&/g, |
| NBSP_REGEX = /\u00a0/g, |
| DOUBLE_QUOTE_REGEX = /"/g, |
| LT_REGEX = /</g, |
| GT_REGEX = />/g; |
| |
| //Escape string |
| function escapeString(str, attrMode) { |
| str = str |
| .replace(AMP_REGEX, '&') |
| .replace(NBSP_REGEX, ' '); |
| |
| if (attrMode) |
| str = str.replace(DOUBLE_QUOTE_REGEX, '"'); |
| |
| else { |
| str = str |
| .replace(LT_REGEX, '<') |
| .replace(GT_REGEX, '>'); |
| } |
| |
| return str; |
| } |
| |
| |
| //Enquote doctype ID |
| |
| |
| |
| //Serializer |
| var Serializer = module.exports = function (treeAdapter, options) { |
| this.treeAdapter = treeAdapter || DefaultTreeAdapter; |
| this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options); |
| }; |
| |
| |
| //API |
| Serializer.prototype.serialize = function (node) { |
| this.html = ''; |
| this._serializeChildNodes(node); |
| |
| return this.html; |
| }; |
| |
| |
| //Internals |
| Serializer.prototype._serializeChildNodes = function (parentNode) { |
| var childNodes = this.treeAdapter.getChildNodes(parentNode); |
| |
| if (childNodes) { |
| for (var i = 0, cnLength = childNodes.length; i < cnLength; i++) { |
| var currentNode = childNodes[i]; |
| |
| if (this.treeAdapter.isElementNode(currentNode)) |
| this._serializeElement(currentNode); |
| |
| else if (this.treeAdapter.isTextNode(currentNode)) |
| this._serializeTextNode(currentNode); |
| |
| else if (this.treeAdapter.isCommentNode(currentNode)) |
| this._serializeCommentNode(currentNode); |
| |
| else if (this.treeAdapter.isDocumentTypeNode(currentNode)) |
| this._serializeDocumentTypeNode(currentNode); |
| } |
| } |
| }; |
| |
| Serializer.prototype._serializeElement = function (node) { |
| var tn = this.treeAdapter.getTagName(node), |
| ns = this.treeAdapter.getNamespaceURI(node), |
| qualifiedTn = (ns === NS.HTML || ns === NS.SVG || ns === NS.MATHML) ? tn : (ns + ':' + tn); |
| |
| this.html += '<' + qualifiedTn; |
| this._serializeAttributes(node); |
| this.html += '>'; |
| |
| if (tn !== $.AREA && tn !== $.BASE && tn !== $.BASEFONT && tn !== $.BGSOUND && tn !== $.BR && tn !== $.BR && |
| tn !== $.COL && tn !== $.EMBED && tn !== $.FRAME && tn !== $.HR && tn !== $.IMG && tn !== $.INPUT && |
| tn !== $.KEYGEN && tn !== $.LINK && tn !== $.MENUITEM && tn !== $.META && tn !== $.PARAM && tn !== $.SOURCE && |
| tn !== $.TRACK && tn !== $.WBR) { |
| |
| if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING) { |
| var firstChild = this.treeAdapter.getFirstChild(node); |
| |
| if (firstChild && this.treeAdapter.isTextNode(firstChild)) { |
| var content = this.treeAdapter.getTextNodeContent(firstChild); |
| |
| if (content[0] === '\n') |
| this.html += '\n'; |
| } |
| } |
| |
| var childNodesHolder = tn === $.TEMPLATE && ns === NS.HTML ? |
| this.treeAdapter.getChildNodes(node)[0] : |
| node; |
| |
| this._serializeChildNodes(childNodesHolder); |
| this.html += '</' + qualifiedTn + '>'; |
| } |
| }; |
| |
| Serializer.prototype._serializeAttributes = function (node) { |
| var attrs = this.treeAdapter.getAttrList(node); |
| |
| for (var i = 0, attrsLength = attrs.length; i < attrsLength; i++) { |
| var attr = attrs[i], |
| value = this.options.encodeHtmlEntities ? escapeString(attr.value, true) : attr.value; |
| |
| this.html += ' '; |
| |
| if (!attr.namespace) |
| this.html += attr.name; |
| |
| else if (attr.namespace === NS.XML) |
| this.html += 'xml:' + attr.name; |
| |
| else if (attr.namespace === NS.XMLNS) { |
| if (attr.name !== 'xmlns') |
| this.html += 'xmlns:'; |
| |
| this.html += attr.name; |
| } |
| |
| else if (attr.namespace === NS.XLINK) |
| this.html += 'xlink:' + attr.name; |
| |
| else |
| this.html += attr.namespace + ':' + attr.name; |
| |
| this.html += '="' + value + '"'; |
| } |
| }; |
| |
| Serializer.prototype._serializeTextNode = function (node) { |
| var content = this.treeAdapter.getTextNodeContent(node), |
| parent = this.treeAdapter.getParentNode(node), |
| parentTn = void 0; |
| |
| if (parent && this.treeAdapter.isElementNode(parent)) |
| parentTn = this.treeAdapter.getTagName(parent); |
| |
| if (parentTn === $.STYLE || parentTn === $.SCRIPT || parentTn === $.XMP || parentTn === $.IFRAME || |
| parentTn === $.NOEMBED || parentTn === $.NOFRAMES || parentTn === $.PLAINTEXT || parentTn === $.NOSCRIPT) { |
| this.html += content; |
| } |
| |
| else |
| this.html += this.options.encodeHtmlEntities ? escapeString(content, false) : content; |
| }; |
| |
| Serializer.prototype._serializeCommentNode = function (node) { |
| this.html += '<!--' + this.treeAdapter.getCommentNodeContent(node) + '-->'; |
| }; |
| |
| Serializer.prototype._serializeDocumentTypeNode = function (node) { |
| var name = this.treeAdapter.getDocumentTypeNodeName(node), |
| publicId = this.treeAdapter.getDocumentTypeNodePublicId(node), |
| systemId = this.treeAdapter.getDocumentTypeNodeSystemId(node); |
| |
| this.html += '<' + Doctype.serializeContent(name, publicId, systemId) + '>'; |
| }; |
| |
| },{"../common/doctype":1,"../common/html":3,"../common/utils":5,"../tree_adapters/default":15}],9:[function(require,module,exports){ |
| 'use strict'; |
| |
| var Tokenizer = require('../tokenization/tokenizer'), |
| TokenizerProxy = require('./tokenizer_proxy'), |
| Utils = require('../common/utils'); |
| |
| //Default options |
| var DEFAULT_OPTIONS = { |
| decodeHtmlEntities: true, |
| locationInfo: false |
| }; |
| |
| //Skipping handler |
| function skip() { |
| //NOTE: do nothing =) |
| } |
| |
| //SimpleApiParser |
| var SimpleApiParser = module.exports = function (handlers, options) { |
| this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options); |
| this.handlers = { |
| doctype: this._wrapHandler(handlers.doctype), |
| startTag: this._wrapHandler(handlers.startTag), |
| endTag: this._wrapHandler(handlers.endTag), |
| text: this._wrapHandler(handlers.text), |
| comment: this._wrapHandler(handlers.comment) |
| }; |
| }; |
| |
| SimpleApiParser.prototype._wrapHandler = function (handler) { |
| var parser = this; |
| |
| handler = handler || skip; |
| |
| if (this.options.locationInfo) { |
| return function () { |
| var args = Array.prototype.slice.call(arguments); |
| args.push(parser.currentTokenLocation); |
| handler.apply(handler, args); |
| }; |
| } |
| |
| return handler; |
| }; |
| |
| //API |
| SimpleApiParser.prototype.parse = function (html) { |
| var token = null; |
| |
| this._reset(html); |
| |
| do { |
| token = this.tokenizerProxy.getNextToken(); |
| |
| if (token.type === Tokenizer.CHARACTER_TOKEN || |
| token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN || |
| token.type === Tokenizer.NULL_CHARACTER_TOKEN) { |
| |
| if (this.options.locationInfo) { |
| if (this.pendingText === null) |
| this.currentTokenLocation = token.location; |
| |
| else |
| this.currentTokenLocation.end = token.location.end; |
| } |
| |
| this.pendingText = (this.pendingText || '') + token.chars; |
| } |
| |
| else { |
| this._emitPendingText(); |
| this._handleToken(token); |
| } |
| } while (token.type !== Tokenizer.EOF_TOKEN); |
| }; |
| |
| //Internals |
| SimpleApiParser.prototype._handleToken = function (token) { |
| if (this.options.locationInfo) |
| this.currentTokenLocation = token.location; |
| |
| if (token.type === Tokenizer.START_TAG_TOKEN) |
| this.handlers.startTag(token.tagName, token.attrs, token.selfClosing); |
| |
| else if (token.type === Tokenizer.END_TAG_TOKEN) |
| this.handlers.endTag(token.tagName); |
| |
| else if (token.type === Tokenizer.COMMENT_TOKEN) |
| this.handlers.comment(token.data); |
| |
| else if (token.type === Tokenizer.DOCTYPE_TOKEN) |
| this.handlers.doctype(token.name, token.publicId, token.systemId); |
| |
| }; |
| |
| SimpleApiParser.prototype._reset = function (html) { |
| this.tokenizerProxy = new TokenizerProxy(html, this.options); |
| this.pendingText = null; |
| this.currentTokenLocation = null; |
| }; |
| |
| SimpleApiParser.prototype._emitPendingText = function () { |
| if (this.pendingText !== null) { |
| this.handlers.text(this.pendingText); |
| this.pendingText = null; |
| } |
| }; |
| |
| },{"../common/utils":5,"../tokenization/tokenizer":14,"./tokenizer_proxy":10}],10:[function(require,module,exports){ |
| 'use strict'; |
| |
| var Tokenizer = require('../tokenization/tokenizer'), |
| ForeignContent = require('../common/foreign_content'), |
| UNICODE = require('../common/unicode'), |
| HTML = require('../common/html'); |
| |
| //Aliases |
| var $ = HTML.TAG_NAMES, |
| NS = HTML.NAMESPACES; |
| |
| |
| //Tokenizer proxy |
| //NOTE: this proxy simulates adjustment of the Tokenizer which performed by standard parser during tree construction. |
| var TokenizerProxy = module.exports = function (html, options) { |
| this.tokenizer = new Tokenizer(html, options); |
| |
| this.namespaceStack = []; |
| this.namespaceStackTop = -1; |
| this.currentNamespace = null; |
| this.inForeignContent = false; |
| }; |
| |
| //API |
| TokenizerProxy.prototype.getNextToken = function () { |
| var token = this.tokenizer.getNextToken(); |
| |
| if (token.type === Tokenizer.START_TAG_TOKEN) |
| this._handleStartTagToken(token); |
| |
| else if (token.type === Tokenizer.END_TAG_TOKEN) |
| this._handleEndTagToken(token); |
| |
| else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) { |
| token.type = Tokenizer.CHARACTER_TOKEN; |
| token.chars = UNICODE.REPLACEMENT_CHARACTER; |
| } |
| |
| return token; |
| }; |
| |
| //Namespace stack mutations |
| TokenizerProxy.prototype._enterNamespace = function (namespace) { |
| this.namespaceStackTop++; |
| this.namespaceStack.push(namespace); |
| |
| this.inForeignContent = namespace !== NS.HTML; |
| this.currentNamespace = namespace; |
| this.tokenizer.allowCDATA = this.inForeignContent; |
| }; |
| |
| TokenizerProxy.prototype._leaveCurrentNamespace = function () { |
| this.namespaceStackTop--; |
| this.namespaceStack.pop(); |
| |
| this.currentNamespace = this.namespaceStack[this.namespaceStackTop]; |
| this.inForeignContent = this.currentNamespace !== NS.HTML; |
| this.tokenizer.allowCDATA = this.inForeignContent; |
| }; |
| |
| //Token handlers |
| TokenizerProxy.prototype._ensureTokenizerMode = function (tn) { |
| if (tn === $.TEXTAREA || tn === $.TITLE) |
| this.tokenizer.state = Tokenizer.MODE.RCDATA; |
| |
| else if (tn === $.PLAINTEXT) |
| this.tokenizer.state = Tokenizer.MODE.PLAINTEXT; |
| |
| else if (tn === $.SCRIPT) |
| this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA; |
| |
| else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP || |
| tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) { |
| this.tokenizer.state = Tokenizer.MODE.RAWTEXT; |
| } |
| }; |
| |
| TokenizerProxy.prototype._handleStartTagToken = function (token) { |
| var tn = token.tagName; |
| |
| if (tn === $.SVG) |
| this._enterNamespace(NS.SVG); |
| |
| else if (tn === $.MATH) |
| this._enterNamespace(NS.MATHML); |
| |
| else { |
| if (this.inForeignContent) { |
| if (ForeignContent.causesExit(token)) |
| this._leaveCurrentNamespace(); |
| |
| else if (ForeignContent.isMathMLTextIntegrationPoint(tn, this.currentNamespace) || |
| ForeignContent.isHtmlIntegrationPoint(tn, this.currentNamespace, token.attrs)) { |
| this._enterNamespace(NS.HTML); |
| } |
| } |
| |
| else |
| this._ensureTokenizerMode(tn); |
| } |
| }; |
| |
| TokenizerProxy.prototype._handleEndTagToken = function (token) { |
| var tn = token.tagName; |
| |
| if (!this.inForeignContent) { |
| var previousNs = this.namespaceStack[this.namespaceStackTop - 1]; |
| |
| //NOTE: check for exit from integration point |
| if (ForeignContent.isMathMLTextIntegrationPoint(tn, previousNs) || |
| ForeignContent.isHtmlIntegrationPoint(tn, previousNs, token.attrs)) { |
| this._leaveCurrentNamespace(); |
| } |
| |
| else if (tn === $.SCRIPT) |
| this.tokenizer.state = Tokenizer.MODE.DATA; |
| } |
| |
| else if ((tn === $.SVG && this.currentNamespace === NS.SVG) || |
| (tn === $.MATH && this.currentNamespace === NS.MATHML)) |
| this._leaveCurrentNamespace(); |
| }; |
| |
| },{"../common/foreign_content":2,"../common/html":3,"../common/unicode":4,"../tokenization/tokenizer":14}],11:[function(require,module,exports){ |
| 'use strict'; |
| |
| exports.assign = function (tokenizer) { |
| //NOTE: obtain Tokenizer proto this way to avoid module circular references |
| var tokenizerProto = Object.getPrototypeOf(tokenizer); |
| |
| tokenizer.tokenStartLoc = -1; |
| |
| //NOTE: add location info builder method |
| tokenizer._attachLocationInfo = function (token) { |
| token.location = { |
| start: this.tokenStartLoc, |
| end: -1 |
| }; |
| }; |
| |
| //NOTE: patch token creation methods and attach location objects |
| tokenizer._createStartTagToken = function (tagNameFirstCh) { |
| tokenizerProto._createStartTagToken.call(this, tagNameFirstCh); |
| this._attachLocationInfo(this.currentToken); |
| }; |
| |
| tokenizer._createEndTagToken = function (tagNameFirstCh) { |
| tokenizerProto._createEndTagToken.call(this, tagNameFirstCh); |
| this._attachLocationInfo(this.currentToken); |
| }; |
| |
| tokenizer._createCommentToken = function () { |
| tokenizerProto._createCommentToken.call(this); |
| this._attachLocationInfo(this.currentToken); |
| }; |
| |
| tokenizer._createDoctypeToken = function (doctypeNameFirstCh) { |
| tokenizerProto._createDoctypeToken.call(this, doctypeNameFirstCh); |
| this._attachLocationInfo(this.currentToken); |
| }; |
| |
| tokenizer._createCharacterToken = function (type, ch) { |
| tokenizerProto._createCharacterToken.call(this, type, ch); |
| this._attachLocationInfo(this.currentCharacterToken); |
| }; |
| |
| //NOTE: patch token emission methods to determine end location |
| tokenizer._emitCurrentToken = function () { |
| //NOTE: if we have pending character token make it's end location equal to the |
| //current token's start location. |
| if (this.currentCharacterToken) |
| this.currentCharacterToken.location.end = this.currentToken.location.start; |
| |
| this.currentToken.location.end = this.preprocessor.pos + 1; |
| tokenizerProto._emitCurrentToken.call(this); |
| }; |
| |
| tokenizer._emitCurrentCharacterToken = function () { |
| //NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(), |
| //then set it's location at the current preprocessor position |
| if (this.currentCharacterToken && this.currentCharacterToken.location.end === -1) { |
| //NOTE: we don't need to increment preprocessor position, since character token |
| //emission is always forced by the start of the next character token here. |
| //So, we already have advanced position. |
| this.currentCharacterToken.location.end = this.preprocessor.pos; |
| } |
| |
| tokenizerProto._emitCurrentCharacterToken.call(this); |
| }; |
| |
| //NOTE: patch initial states for each mode to obtain token start position |
| Object.keys(tokenizerProto.MODE) |
| |
| .map(function (modeName) { |
| return tokenizerProto.MODE[modeName]; |
| }) |
| |
| .forEach(function (state) { |
| tokenizer[state] = function (cp) { |
| this.tokenStartLoc = this.preprocessor.pos; |
| tokenizerProto[state].call(this, cp); |
| }; |
| }); |
| }; |
| |
| },{}],12:[function(require,module,exports){ |
| 'use strict'; |
| |
| //NOTE: this file contains auto generated trie structure that is used for named entity references consumption |
| //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references and |
| //http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references) |
| module.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]}}}}}}}}}}; |
| |
| },{}],13:[function(require,module,exports){ |
| 'use strict'; |
| |
| var UNICODE = require('../common/unicode'); |
| |
| //Aliases |
| var $ = UNICODE.CODE_POINTS; |
| |
| //Utils |
| |
| //OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline |
| //this functions if they will be situated in another module due to context switch. |
| //Always perform inlining check before modifying this functions ('node --trace-inlining'). |
| function isReservedCodePoint(cp) { |
| return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF; |
| } |
| |
| function isSurrogatePair(cp1, cp2) { |
| return cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF; |
| } |
| |
| function getSurrogatePairCodePoint(cp1, cp2) { |
| return (cp1 - 0xD800) * 0x400 + 0x2400 + cp2; |
| } |
| |
| //Preprocessor |
| //NOTE: HTML input preprocessing |
| //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream) |
| var Preprocessor = module.exports = function (html) { |
| this.write(html); |
| |
| //NOTE: one leading U+FEFF BYTE ORDER MARK character must be ignored if any are present in the input stream. |
| this.pos = this.html.charCodeAt(0) === $.BOM ? 0 : -1; |
| |
| this.gapStack = []; |
| this.lastGapPos = -1; |
| this.skipNextNewLine = false; |
| }; |
| |
| Preprocessor.prototype.write = function (html) { |
| if (this.html) { |
| this.html = this.html.substring(0, this.pos + 1) + |
| html + |
| this.html.substring(this.pos + 1, this.html.length); |
| |
| } |
| else |
| this.html = html; |
| |
| |
| this.lastCharPos = this.html.length - 1; |
| }; |
| |
| Preprocessor.prototype.advanceAndPeekCodePoint = function () { |
| this.pos++; |
| |
| if (this.pos > this.lastCharPos) |
| return $.EOF; |
| |
| var cp = this.html.charCodeAt(this.pos); |
| |
| //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character |
| //must be ignored. |
| if (this.skipNextNewLine && cp === $.LINE_FEED) { |
| this.skipNextNewLine = false; |
| this._addGap(); |
| return this.advanceAndPeekCodePoint(); |
| } |
| |
| //NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters |
| if (cp === $.CARRIAGE_RETURN) { |
| this.skipNextNewLine = true; |
| return $.LINE_FEED; |
| } |
| |
| this.skipNextNewLine = false; |
| |
| //OPTIMIZATION: first perform check if the code point in the allowed range that covers most common |
| //HTML input (e.g. ASCII codes) to avoid performance-cost operations for high-range code points. |
| return cp >= 0xD800 ? this._processHighRangeCodePoint(cp) : cp; |
| }; |
| |
| Preprocessor.prototype._processHighRangeCodePoint = function (cp) { |
| //NOTE: try to peek a surrogate pair |
| if (this.pos !== this.lastCharPos) { |
| var nextCp = this.html.charCodeAt(this.pos + 1); |
| |
| if (isSurrogatePair(cp, nextCp)) { |
| //NOTE: we have a surrogate pair. Peek pair character and recalculate code point. |
| this.pos++; |
| cp = getSurrogatePairCodePoint(cp, nextCp); |
| |
| //NOTE: add gap that should be avoided during retreat |
| this._addGap(); |
| } |
| } |
| |
| if (isReservedCodePoint(cp)) |
| cp = $.REPLACEMENT_CHARACTER; |
| |
| return cp; |
| }; |
| |
| Preprocessor.prototype._addGap = function () { |
| this.gapStack.push(this.lastGapPos); |
| this.lastGapPos = this.pos; |
| }; |
| |
| Preprocessor.prototype.retreat = function () { |
| if (this.pos === this.lastGapPos) { |
| this.lastGapPos = this.gapStack.pop(); |
| this.pos--; |
| } |
| |
| this.pos--; |
| }; |
| |
| },{"../common/unicode":4}],14:[function(require,module,exports){ |
| 'use strict'; |
| |
| var Preprocessor = require('./preprocessor'), |
| LocationInfoMixin = require('./location_info_mixin'), |
| UNICODE = require('../common/unicode'), |
| NAMED_ENTITY_TRIE = require('./named_entity_trie'); |
| |
| //Aliases |
| var $ = UNICODE.CODE_POINTS, |
| $$ = UNICODE.CODE_POINT_SEQUENCES; |
| |
| //Replacement code points for numeric entities |
| var NUMERIC_ENTITY_REPLACEMENTS = { |
| 0x00: 0xFFFD, 0x0D: 0x000D, 0x80: 0x20AC, 0x81: 0x0081, 0x82: 0x201A, 0x83: 0x0192, 0x84: 0x201E, |
| 0x85: 0x2026, 0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02C6, 0x89: 0x2030, 0x8A: 0x0160, 0x8B: 0x2039, |
| 0x8C: 0x0152, 0x8D: 0x008D, 0x8E: 0x017D, 0x8F: 0x008F, 0x90: 0x0090, 0x91: 0x2018, 0x92: 0x2019, |
| 0x93: 0x201C, 0x94: 0x201D, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014, 0x98: 0x02DC, 0x99: 0x2122, |
| 0x9A: 0x0161, 0x9B: 0x203A, 0x9C: 0x0153, 0x9D: 0x009D, 0x9E: 0x017E, 0x9F: 0x0178 |
| }; |
| |
| //States |
| var DATA_STATE = 'DATA_STATE', |
| CHARACTER_REFERENCE_IN_DATA_STATE = 'CHARACTER_REFERENCE_IN_DATA_STATE', |
| RCDATA_STATE = 'RCDATA_STATE', |
| CHARACTER_REFERENCE_IN_RCDATA_STATE = 'CHARACTER_REFERENCE_IN_RCDATA_STATE', |
| RAWTEXT_STATE = 'RAWTEXT_STATE', |
| SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE', |
| PLAINTEXT_STATE = 'PLAINTEXT_STATE', |
| TAG_OPEN_STATE = 'TAG_OPEN_STATE', |
| END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE', |
| TAG_NAME_STATE = 'TAG_NAME_STATE', |
| RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE', |
| RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE', |
| RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE', |
| RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE', |
| RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE', |
| RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE', |
| SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE', |
| SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE', |
| SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE', |
| SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE', |
| SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE', |
| SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE', |
| SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE', |
| SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE', |
| SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE', |
| SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE', |
| SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE', |
| SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE', |
| SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE', |
| SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE', |
| SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE', |
| SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE', |
| SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE', |
| BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE', |
| ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE', |
| AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE', |
| BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE', |
| ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE', |
| ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE', |
| ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE', |
| CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE = 'CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE', |
| AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE', |
| SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE', |
| BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE', |
| MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE', |
| COMMENT_START_STATE = 'COMMENT_START_STATE', |
| COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE', |
| COMMENT_STATE = 'COMMENT_STATE', |
| COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE', |
| COMMENT_END_STATE = 'COMMENT_END_STATE', |
| COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE', |
| DOCTYPE_STATE = 'DOCTYPE_STATE', |
| BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE', |
| DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE', |
| AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE', |
| AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE', |
| BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE', |
| DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE', |
| DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE', |
| AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE', |
| BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE', |
| AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE', |
| BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE', |
| DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE', |
| DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE', |
| AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE', |
| BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE', |
| CDATA_SECTION_STATE = 'CDATA_SECTION_STATE'; |
| |
| //Utils |
| |
| //OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline |
| //this functions if they will be situated in another module due to context switch. |
| //Always perform inlining check before modifying this functions ('node --trace-inlining'). |
| function isWhitespace(cp) { |
| return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED; |
| } |
| |
| function isAsciiDigit(cp) { |
| return cp >= $.DIGIT_0 && cp <= $.DIGIT_9; |
| } |
| |
| function isAsciiUpper(cp) { |
| return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z; |
| } |
| |
| function isAsciiLower(cp) { |
| return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z; |
| } |
| |
| function isAsciiAlphaNumeric(cp) { |
| return isAsciiDigit(cp) || isAsciiUpper(cp) || isAsciiLower(cp); |
| } |
| |
| function isDigit(cp, isHex) { |
| return isAsciiDigit(cp) || (isHex && ((cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F) || |
| (cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F))); |
| } |
| |
| function isReservedCodePoint(cp) { |
| return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF; |
| } |
| |
| function toAsciiLowerCodePoint(cp) { |
| return cp + 0x0020; |
| } |
| |
| //NOTE: String.fromCharCode() function can handle only characters from BMP subset. |
| //So, we need to workaround this manually. |
| //(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values) |
| function toChar(cp) { |
| if (cp <= 0xFFFF) |
| return String.fromCharCode(cp); |
| |
| cp -= 0x10000; |
| return String.fromCharCode(cp >>> 10 & 0x3FF | 0xD800) + String.fromCharCode(0xDC00 | cp & 0x3FF); |
| } |
| |
| function toAsciiLowerChar(cp) { |
| return String.fromCharCode(toAsciiLowerCodePoint(cp)); |
| } |
| |
| //Tokenizer |
| var Tokenizer = module.exports = function (html, options) { |
| this.disableEntitiesDecoding = false; |
| |
| this.preprocessor = new Preprocessor(html); |
| |
| this.tokenQueue = []; |
| |
| this.allowCDATA = false; |
| |
| this.state = DATA_STATE; |
| this.returnState = ''; |
| |
| this.consumptionPos = 0; |
| |
| this.tempBuff = []; |
| this.additionalAllowedCp = void 0; |
| this.lastStartTagName = ''; |
| |
| this.currentCharacterToken = null; |
| this.currentToken = null; |
| this.currentAttr = null; |
| |
| if (options) { |
| this.disableEntitiesDecoding = !options.decodeHtmlEntities; |
| |
| if (options.locationInfo) |
| LocationInfoMixin.assign(this); |
| } |
| }; |
| |
| //Token types |
| Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN'; |
| Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN'; |
| Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN'; |
| Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN'; |
| Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN'; |
| Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN'; |
| Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN'; |
| Tokenizer.EOF_TOKEN = 'EOF_TOKEN'; |
| |
| //Tokenizer initial states for different modes |
| Tokenizer.MODE = Tokenizer.prototype.MODE = { |
| DATA: DATA_STATE, |
| RCDATA: RCDATA_STATE, |
| RAWTEXT: RAWTEXT_STATE, |
| SCRIPT_DATA: SCRIPT_DATA_STATE, |
| PLAINTEXT: PLAINTEXT_STATE |
| }; |
| |
| //Static |
| Tokenizer.getTokenAttr = function (token, attrName) { |
| for (var i = token.attrs.length - 1; i >= 0; i--) { |
| if (token.attrs[i].name === attrName) |
| return token.attrs[i].value; |
| } |
| |
| return null; |
| }; |
| |
| //Get token |
| Tokenizer.prototype.getNextToken = function () { |
| while (!this.tokenQueue.length) |
| this[this.state](this._consume()); |
| |
| return this.tokenQueue.shift(); |
| }; |
| |
| //Consumption |
| Tokenizer.prototype._consume = function () { |
| this.consumptionPos++; |
| return this.preprocessor.advanceAndPeekCodePoint(); |
| }; |
| |
| Tokenizer.prototype._unconsume = function () { |
| this.consumptionPos--; |
| this.preprocessor.retreat(); |
| }; |
| |
| Tokenizer.prototype._unconsumeSeveral = function (count) { |
| while (count--) |
| this._unconsume(); |
| }; |
| |
| Tokenizer.prototype._reconsumeInState = function (state) { |
| this.state = state; |
| this._unconsume(); |
| }; |
| |
| Tokenizer.prototype._consumeSubsequentIfMatch = function (pattern, startCp, caseSensitive) { |
| var rollbackPos = this.consumptionPos, |
| isMatch = true, |
| patternLength = pattern.length, |
| patternPos = 0, |
| cp = startCp, |
| patternCp = void 0; |
| |
| for (; patternPos < patternLength; patternPos++) { |
| if (patternPos > 0) |
| cp = this._consume(); |
| |
| if (cp === $.EOF) { |
| isMatch = false; |
| break; |
| } |
| |
| patternCp = pattern[patternPos]; |
| |
| if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) { |
| isMatch = false; |
| break; |
| } |
| } |
| |
| if (!isMatch) |
| this._unconsumeSeveral(this.consumptionPos - rollbackPos); |
| |
| return isMatch; |
| }; |
| |
| //Lookahead |
| Tokenizer.prototype._lookahead = function () { |
| var cp = this.preprocessor.advanceAndPeekCodePoint(); |
| this.preprocessor.retreat(); |
| |
| return cp; |
| }; |
| |
| //Temp buffer |
| Tokenizer.prototype.isTempBufferEqualToScriptString = function () { |
| if (this.tempBuff.length !== $$.SCRIPT_STRING.length) |
| return false; |
| |
| for (var i = 0; i < this.tempBuff.length; i++) { |
| if (this.tempBuff[i] !== $$.SCRIPT_STRING[i]) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| //Token creation |
| Tokenizer.prototype.buildStartTagToken = function (tagName) { |
| return { |
| type: Tokenizer.START_TAG_TOKEN, |
| tagName: tagName, |
| selfClosing: false, |
| attrs: [] |
| }; |
| }; |
| |
| Tokenizer.prototype.buildEndTagToken = function (tagName) { |
| return { |
| type: Tokenizer.END_TAG_TOKEN, |
| tagName: tagName, |
| ignored: false, |
| attrs: [] |
| }; |
| }; |
| |
| Tokenizer.prototype._createStartTagToken = function (tagNameFirstCh) { |
| this.currentToken = this.buildStartTagToken(tagNameFirstCh); |
| }; |
| |
| Tokenizer.prototype._createEndTagToken = function (tagNameFirstCh) { |
| this.currentToken = this.buildEndTagToken(tagNameFirstCh); |
| }; |
| |
| Tokenizer.prototype._createCommentToken = function () { |
| this.currentToken = { |
| type: Tokenizer.COMMENT_TOKEN, |
| data: '' |
| }; |
| }; |
| |
| Tokenizer.prototype._createDoctypeToken = function (doctypeNameFirstCh) { |
| this.currentToken = { |
| type: Tokenizer.DOCTYPE_TOKEN, |
| name: doctypeNameFirstCh || '', |
| forceQuirks: false, |
| publicId: null, |
| systemId: null |
| }; |
| }; |
| |
| Tokenizer.prototype._createCharacterToken = function (type, ch) { |
| this.currentCharacterToken = { |
| type: type, |
| chars: ch |
| }; |
| }; |
| |
| //Tag attributes |
| Tokenizer.prototype._createAttr = function (attrNameFirstCh) { |
| this.currentAttr = { |
| name: attrNameFirstCh, |
| value: '' |
| }; |
| }; |
| |
| Tokenizer.prototype._isDuplicateAttr = function () { |
| return Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) !== null; |
| }; |
| |
| Tokenizer.prototype._leaveAttrName = function (toState) { |
| this.state = toState; |
| |
| if (!this._isDuplicateAttr()) |
| this.currentToken.attrs.push(this.currentAttr); |
| }; |
| |
| //Appropriate end tag token |
| //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#appropriate-end-tag-token) |
| Tokenizer.prototype._isAppropriateEndTagToken = function () { |
| return this.lastStartTagName === this.currentToken.tagName; |
| }; |
| |
| //Token emission |
| Tokenizer.prototype._emitCurrentToken = function () { |
| this._emitCurrentCharacterToken(); |
| |
| //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate. |
| if (this.currentToken.type === Tokenizer.START_TAG_TOKEN) |
| this.lastStartTagName = this.currentToken.tagName; |
| |
| this.tokenQueue.push(this.currentToken); |
| this.currentToken = null; |
| }; |
| |
| Tokenizer.prototype._emitCurrentCharacterToken = function () { |
| if (this.currentCharacterToken) { |
| this.tokenQueue.push(this.currentCharacterToken); |
| this.currentCharacterToken = null; |
| } |
| }; |
| |
| Tokenizer.prototype._emitEOFToken = function () { |
| this._emitCurrentCharacterToken(); |
| this.tokenQueue.push({type: Tokenizer.EOF_TOKEN}); |
| }; |
| |
| //Characters emission |
| |
| //OPTIMIZATION: specification uses only one type of character tokens (one token per character). |
| //This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters. |
| //If we have a sequence of characters that belong to the same group, parser can process it |
| //as a single solid character token. |
| //So, there are 3 types of character tokens in parse5: |
| //1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000') |
| //2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n \r\t \f') |
| //3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^') |
| Tokenizer.prototype._appendCharToCurrentCharacterToken = function (type, ch) { |
| if (this.currentCharacterToken && this.currentCharacterToken.type !== type) |
| this._emitCurrentCharacterToken(); |
| |
| if (this.currentCharacterToken) |
| this.currentCharacterToken.chars += ch; |
| |
| else |
| this._createCharacterToken(type, ch); |
| }; |
| |
| Tokenizer.prototype._emitCodePoint = function (cp) { |
| var type = Tokenizer.CHARACTER_TOKEN; |
| |
| if (isWhitespace(cp)) |
| type = Tokenizer.WHITESPACE_CHARACTER_TOKEN; |
| |
| else if (cp === $.NULL) |
| type = Tokenizer.NULL_CHARACTER_TOKEN; |
| |
| this._appendCharToCurrentCharacterToken(type, toChar(cp)); |
| }; |
| |
| Tokenizer.prototype._emitSeveralCodePoints = function (codePoints) { |
| for (var i = 0; i < codePoints.length; i++) |
| this._emitCodePoint(codePoints[i]); |
| }; |
| |
| //NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character. |
| //So we can avoid additional checks here. |
| Tokenizer.prototype._emitChar = function (ch) { |
| this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch); |
| }; |
| |
| //Character reference tokenization |
| Tokenizer.prototype._consumeNumericEntity = function (isHex) { |
| var digits = '', |
| nextCp = void 0; |
| |
| do { |
| digits += toChar(this._consume()); |
| nextCp = this._lookahead(); |
| } while (nextCp !== $.EOF && isDigit(nextCp, isHex)); |
| |
| if (this._lookahead() === $.SEMICOLON) |
| this._consume(); |
| |
| var referencedCp = parseInt(digits, isHex ? 16 : 10), |
| replacement = NUMERIC_ENTITY_REPLACEMENTS[referencedCp]; |
| |
| if (replacement) |
| return replacement; |
| |
| if (isReservedCodePoint(referencedCp)) |
| return $.REPLACEMENT_CHARACTER; |
| |
| return referencedCp; |
| }; |
| |
| Tokenizer.prototype._consumeNamedEntity = function (startCp, inAttr) { |
| var referencedCodePoints = null, |
| entityCodePointsCount = 0, |
| cp = startCp, |
| leaf = NAMED_ENTITY_TRIE[cp], |
| consumedCount = 1, |
| semicolonTerminated = false; |
| |
| for (; leaf && cp !== $.EOF; cp = this._consume(), consumedCount++, leaf = leaf.l && leaf.l[cp]) { |
| if (leaf.c) { |
| //NOTE: we have at least one named reference match. But we don't stop lookup at this point, |
| //because longer matches still can be found (e.g. '¬' and '∉') except the case |
| //then found match is terminated by semicolon. |
| referencedCodePoints = leaf.c; |
| entityCodePointsCount = consumedCount; |
| |
| if (cp === $.SEMICOLON) { |
| semicolonTerminated = true; |
| break; |
| } |
| } |
| } |
| |
| if (referencedCodePoints) { |
| if (!semicolonTerminated) { |
| //NOTE: unconsume excess (e.g. 'it' in '¬it') |
| this._unconsumeSeveral(consumedCount - entityCodePointsCount); |
| |
| //NOTE: If the character reference is being consumed as part of an attribute and the next character |
| //is either a U+003D EQUALS SIGN character (=) or an alphanumeric ASCII character, then, for historical |
| //reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be |
| //unconsumed, and nothing is returned. |
| //However, if this next character is in fact a U+003D EQUALS SIGN character (=), then this is a |
| //parse error, because some legacy user agents will misinterpret the markup in those cases. |
| //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references) |
| if (inAttr) { |
| var nextCp = this._lookahead(); |
| |
| if (nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp)) { |
| this._unconsumeSeveral(entityCodePointsCount); |
| return null; |
| } |
| } |
| } |
| |
| return referencedCodePoints; |
| } |
| |
| this._unconsumeSeveral(consumedCount); |
| |
| return null; |
| }; |
| |
| Tokenizer.prototype._consumeCharacterReference = function (startCp, inAttr) { |
| if (this.disableEntitiesDecoding || isWhitespace(startCp) || startCp === $.GREATER_THAN_SIGN || |
| startCp === $.AMPERSAND || startCp === this.additionalAllowedCp || startCp === $.EOF) { |
| //NOTE: not a character reference. No characters are consumed, and nothing is returned. |
| this._unconsume(); |
| return null; |
| } |
| |
| else if (startCp === $.NUMBER_SIGN) { |
| //NOTE: we have a numeric entity candidate, now we should determine if it's hex or decimal |
| var isHex = false, |
| nextCp = this._lookahead(); |
| |
| if (nextCp === $.LATIN_SMALL_X || nextCp === $.LATIN_CAPITAL_X) { |
| this._consume(); |
| isHex = true; |
| } |
| |
| nextCp = this._lookahead(); |
| |
| //NOTE: if we have at least one digit this is a numeric entity for sure, so we consume it |
| if (nextCp !== $.EOF && isDigit(nextCp, isHex)) |
| return [this._consumeNumericEntity(isHex)]; |
| |
| else { |
| //NOTE: otherwise this is a bogus number entity and a parse error. Unconsume the number sign |
| //and the 'x'-character if appropriate. |
| this._unconsumeSeveral(isHex ? 2 : 1); |
| return null; |
| } |
| } |
| |
| else |
| return this._consumeNamedEntity(startCp, inAttr); |
| }; |
| |
| //State machine |
| var _ = Tokenizer.prototype; |
| |
| //12.2.4.1 Data state |
| //------------------------------------------------------------------ |
| _[DATA_STATE] = function dataState(cp) { |
| if (cp === $.AMPERSAND) |
| this.state = CHARACTER_REFERENCE_IN_DATA_STATE; |
| |
| else if (cp === $.LESS_THAN_SIGN) |
| this.state = TAG_OPEN_STATE; |
| |
| else if (cp === $.NULL) |
| this._emitCodePoint(cp); |
| |
| else if (cp === $.EOF) |
| this._emitEOFToken(); |
| |
| else |
| this._emitCodePoint(cp); |
| }; |
| |
| |
| //12.2.4.2 Character reference in data state |
| //------------------------------------------------------------------ |
| _[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp) { |
| this.state = DATA_STATE; |
| this.additionalAllowedCp = void 0; |
| |
| var referencedCodePoints = this._consumeCharacterReference(cp, false); |
| |
| if (referencedCodePoints) |
| this._emitSeveralCodePoints(referencedCodePoints); |
| else |
| this._emitChar('&'); |
| }; |
| |
| |
| //12.2.4.3 RCDATA state |
| //------------------------------------------------------------------ |
| _[RCDATA_STATE] = function rcdataState(cp) { |
| if (cp === $.AMPERSAND) |
| this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE; |
| |
| else if (cp === $.LESS_THAN_SIGN) |
| this.state = RCDATA_LESS_THAN_SIGN_STATE; |
| |
| else if (cp === $.NULL) |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| |
| else if (cp === $.EOF) |
| this._emitEOFToken(); |
| |
| else |
| this._emitCodePoint(cp); |
| }; |
| |
| |
| //12.2.4.4 Character reference in RCDATA state |
| //------------------------------------------------------------------ |
| _[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataState(cp) { |
| this.state = RCDATA_STATE; |
| this.additionalAllowedCp = void 0; |
| |
| var referencedCodePoints = this._consumeCharacterReference(cp, false); |
| |
| if (referencedCodePoints) |
| this._emitSeveralCodePoints(referencedCodePoints); |
| else |
| this._emitChar('&'); |
| }; |
| |
| |
| //12.2.4.5 RAWTEXT state |
| //------------------------------------------------------------------ |
| _[RAWTEXT_STATE] = function rawtextState(cp) { |
| if (cp === $.LESS_THAN_SIGN) |
| this.state = RAWTEXT_LESS_THAN_SIGN_STATE; |
| |
| else if (cp === $.NULL) |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| |
| else if (cp === $.EOF) |
| this._emitEOFToken(); |
| |
| else |
| this._emitCodePoint(cp); |
| }; |
| |
| |
| //12.2.4.6 Script data state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_STATE] = function scriptDataState(cp) { |
| if (cp === $.LESS_THAN_SIGN) |
| this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE; |
| |
| else if (cp === $.NULL) |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| |
| else if (cp === $.EOF) |
| this._emitEOFToken(); |
| |
| else |
| this._emitCodePoint(cp); |
| }; |
| |
| |
| //12.2.4.7 PLAINTEXT state |
| //------------------------------------------------------------------ |
| _[PLAINTEXT_STATE] = function plaintextState(cp) { |
| if (cp === $.NULL) |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| |
| else if (cp === $.EOF) |
| this._emitEOFToken(); |
| |
| else |
| this._emitCodePoint(cp); |
| }; |
| |
| |
| //12.2.4.8 Tag open state |
| //------------------------------------------------------------------ |
| _[TAG_OPEN_STATE] = function tagOpenState(cp) { |
| if (cp === $.EXCLAMATION_MARK) |
| this.state = MARKUP_DECLARATION_OPEN_STATE; |
| |
| else if (cp === $.SOLIDUS) |
| this.state = END_TAG_OPEN_STATE; |
| |
| else if (isAsciiUpper(cp)) { |
| this._createStartTagToken(toAsciiLowerChar(cp)); |
| this.state = TAG_NAME_STATE; |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this._createStartTagToken(toChar(cp)); |
| this.state = TAG_NAME_STATE; |
| } |
| |
| else if (cp === $.QUESTION_MARK) { |
| //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption. |
| this[BOGUS_COMMENT_STATE](cp); |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._reconsumeInState(DATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.9 End tag open state |
| //------------------------------------------------------------------ |
| _[END_TAG_OPEN_STATE] = function endTagOpenState(cp) { |
| if (isAsciiUpper(cp)) { |
| this._createEndTagToken(toAsciiLowerChar(cp)); |
| this.state = TAG_NAME_STATE; |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this._createEndTagToken(toChar(cp)); |
| this.state = TAG_NAME_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) |
| this.state = DATA_STATE; |
| |
| else if (cp === $.EOF) { |
| this._reconsumeInState(DATA_STATE); |
| this._emitChar('<'); |
| this._emitChar('/'); |
| } |
| |
| else { |
| //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption. |
| this[BOGUS_COMMENT_STATE](cp); |
| } |
| }; |
| |
| |
| //12.2.4.10 Tag name state |
| //------------------------------------------------------------------ |
| _[TAG_NAME_STATE] = function tagNameState(cp) { |
| if (isWhitespace(cp)) |
| this.state = BEFORE_ATTRIBUTE_NAME_STATE; |
| |
| else if (cp === $.SOLIDUS) |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (isAsciiUpper(cp)) |
| this.currentToken.tagName += toAsciiLowerChar(cp); |
| |
| else if (cp === $.NULL) |
| this.currentToken.tagName += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this.currentToken.tagName += toChar(cp); |
| }; |
| |
| |
| //12.2.4.11 RCDATA less-than sign state |
| //------------------------------------------------------------------ |
| _[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) { |
| if (cp === $.SOLIDUS) { |
| this.tempBuff = []; |
| this.state = RCDATA_END_TAG_OPEN_STATE; |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._reconsumeInState(RCDATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.12 RCDATA end tag open state |
| //------------------------------------------------------------------ |
| _[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) { |
| if (isAsciiUpper(cp)) { |
| this._createEndTagToken(toAsciiLowerChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = RCDATA_END_TAG_NAME_STATE; |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this._createEndTagToken(toChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = RCDATA_END_TAG_NAME_STATE; |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._reconsumeInState(RCDATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.13 RCDATA end tag name state |
| //------------------------------------------------------------------ |
| _[RCDATA_END_TAG_NAME_STATE] = function rcdataEndTagNameState(cp) { |
| if (isAsciiUpper(cp)) { |
| this.currentToken.tagName += toAsciiLowerChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this.currentToken.tagName += toChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else { |
| if (this._isAppropriateEndTagToken()) { |
| if (isWhitespace(cp)) { |
| this.state = BEFORE_ATTRIBUTE_NAME_STATE; |
| return; |
| } |
| |
| if (cp === $.SOLIDUS) { |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| return; |
| } |
| |
| if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| return; |
| } |
| } |
| |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._emitSeveralCodePoints(this.tempBuff); |
| this._reconsumeInState(RCDATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.14 RAWTEXT less-than sign state |
| //------------------------------------------------------------------ |
| _[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) { |
| if (cp === $.SOLIDUS) { |
| this.tempBuff = []; |
| this.state = RAWTEXT_END_TAG_OPEN_STATE; |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._reconsumeInState(RAWTEXT_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.15 RAWTEXT end tag open state |
| //------------------------------------------------------------------ |
| _[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) { |
| if (isAsciiUpper(cp)) { |
| this._createEndTagToken(toAsciiLowerChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = RAWTEXT_END_TAG_NAME_STATE; |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this._createEndTagToken(toChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = RAWTEXT_END_TAG_NAME_STATE; |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._reconsumeInState(RAWTEXT_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.16 RAWTEXT end tag name state |
| //------------------------------------------------------------------ |
| _[RAWTEXT_END_TAG_NAME_STATE] = function rawtextEndTagNameState(cp) { |
| if (isAsciiUpper(cp)) { |
| this.currentToken.tagName += toAsciiLowerChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this.currentToken.tagName += toChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else { |
| if (this._isAppropriateEndTagToken()) { |
| if (isWhitespace(cp)) { |
| this.state = BEFORE_ATTRIBUTE_NAME_STATE; |
| return; |
| } |
| |
| if (cp === $.SOLIDUS) { |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| return; |
| } |
| |
| if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| return; |
| } |
| } |
| |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._emitSeveralCodePoints(this.tempBuff); |
| this._reconsumeInState(RAWTEXT_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.17 Script data less-than sign state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(cp) { |
| if (cp === $.SOLIDUS) { |
| this.tempBuff = []; |
| this.state = SCRIPT_DATA_END_TAG_OPEN_STATE; |
| } |
| |
| else if (cp === $.EXCLAMATION_MARK) { |
| this.state = SCRIPT_DATA_ESCAPE_START_STATE; |
| this._emitChar('<'); |
| this._emitChar('!'); |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._reconsumeInState(SCRIPT_DATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.18 Script data end tag open state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) { |
| if (isAsciiUpper(cp)) { |
| this._createEndTagToken(toAsciiLowerChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = SCRIPT_DATA_END_TAG_NAME_STATE; |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this._createEndTagToken(toChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = SCRIPT_DATA_END_TAG_NAME_STATE; |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._reconsumeInState(SCRIPT_DATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.19 Script data end tag name state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_END_TAG_NAME_STATE] = function scriptDataEndTagNameState(cp) { |
| if (isAsciiUpper(cp)) { |
| this.currentToken.tagName += toAsciiLowerChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this.currentToken.tagName += toChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else { |
| if (this._isAppropriateEndTagToken()) { |
| if (isWhitespace(cp)) { |
| this.state = BEFORE_ATTRIBUTE_NAME_STATE; |
| return; |
| } |
| |
| else if (cp === $.SOLIDUS) { |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| return; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| return; |
| } |
| } |
| |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._emitSeveralCodePoints(this.tempBuff); |
| this._reconsumeInState(SCRIPT_DATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.20 Script data escape start state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPE_START_STATE] = function scriptDataEscapeStartState(cp) { |
| if (cp === $.HYPHEN_MINUS) { |
| this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE; |
| this._emitChar('-'); |
| } |
| |
| else |
| this._reconsumeInState(SCRIPT_DATA_STATE); |
| }; |
| |
| |
| //12.2.4.21 Script data escape start dash state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPE_START_DASH_STATE] = function scriptDataEscapeStartDashState(cp) { |
| if (cp === $.HYPHEN_MINUS) { |
| this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE; |
| this._emitChar('-'); |
| } |
| |
| else |
| this._reconsumeInState(SCRIPT_DATA_STATE); |
| }; |
| |
| |
| //12.2.4.22 Script data escaped state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPED_STATE] = function scriptDataEscapedState(cp) { |
| if (cp === $.HYPHEN_MINUS) { |
| this.state = SCRIPT_DATA_ESCAPED_DASH_STATE; |
| this._emitChar('-'); |
| } |
| |
| else if (cp === $.LESS_THAN_SIGN) |
| this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; |
| |
| else if (cp === $.NULL) |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this._emitCodePoint(cp); |
| }; |
| |
| |
| //12.2.4.23 Script data escaped dash state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPED_DASH_STATE] = function scriptDataEscapedDashState(cp) { |
| if (cp === $.HYPHEN_MINUS) { |
| this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE; |
| this._emitChar('-'); |
| } |
| |
| else if (cp === $.LESS_THAN_SIGN) |
| this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; |
| |
| else if (cp === $.NULL) { |
| this.state = SCRIPT_DATA_ESCAPED_STATE; |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else { |
| this.state = SCRIPT_DATA_ESCAPED_STATE; |
| this._emitCodePoint(cp); |
| } |
| }; |
| |
| |
| //12.2.4.24 Script data escaped dash dash state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPED_DASH_DASH_STATE] = function scriptDataEscapedDashDashState(cp) { |
| if (cp === $.HYPHEN_MINUS) |
| this._emitChar('-'); |
| |
| else if (cp === $.LESS_THAN_SIGN) |
| this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = SCRIPT_DATA_STATE; |
| this._emitChar('>'); |
| } |
| |
| else if (cp === $.NULL) { |
| this.state = SCRIPT_DATA_ESCAPED_STATE; |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else { |
| this.state = SCRIPT_DATA_ESCAPED_STATE; |
| this._emitCodePoint(cp); |
| } |
| }; |
| |
| |
| //12.2.4.25 Script data escaped less-than sign state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThanSignState(cp) { |
| if (cp === $.SOLIDUS) { |
| this.tempBuff = []; |
| this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE; |
| } |
| |
| else if (isAsciiUpper(cp)) { |
| this.tempBuff = []; |
| this.tempBuff.push(toAsciiLowerCodePoint(cp)); |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE; |
| this._emitChar('<'); |
| this._emitCodePoint(cp); |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this.tempBuff = []; |
| this.tempBuff.push(cp); |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE; |
| this._emitChar('<'); |
| this._emitCodePoint(cp); |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.26 Script data escaped end tag open state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) { |
| if (isAsciiUpper(cp)) { |
| this._createEndTagToken(toAsciiLowerChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE; |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this._createEndTagToken(toChar(cp)); |
| this.tempBuff.push(cp); |
| this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE; |
| } |
| |
| else { |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.27 Script data escaped end tag name state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE] = function scriptDataEscapedEndTagNameState(cp) { |
| if (isAsciiUpper(cp)) { |
| this.currentToken.tagName += toAsciiLowerChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this.currentToken.tagName += toChar(cp); |
| this.tempBuff.push(cp); |
| } |
| |
| else { |
| if (this._isAppropriateEndTagToken()) { |
| if (isWhitespace(cp)) { |
| this.state = BEFORE_ATTRIBUTE_NAME_STATE; |
| return; |
| } |
| |
| if (cp === $.SOLIDUS) { |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| return; |
| } |
| |
| if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| return; |
| } |
| } |
| |
| this._emitChar('<'); |
| this._emitChar('/'); |
| this._emitSeveralCodePoints(this.tempBuff); |
| this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.28 Script data double escape start state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE] = function scriptDataDoubleEscapeStartState(cp) { |
| if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) { |
| this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE : SCRIPT_DATA_ESCAPED_STATE; |
| this._emitCodePoint(cp); |
| } |
| |
| else if (isAsciiUpper(cp)) { |
| this.tempBuff.push(toAsciiLowerCodePoint(cp)); |
| this._emitCodePoint(cp); |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this.tempBuff.push(cp); |
| this._emitCodePoint(cp); |
| } |
| |
| else |
| this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); |
| }; |
| |
| |
| //12.2.4.29 Script data double escaped state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_DOUBLE_ESCAPED_STATE] = function scriptDataDoubleEscapedState(cp) { |
| if (cp === $.HYPHEN_MINUS) { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE; |
| this._emitChar('-'); |
| } |
| |
| else if (cp === $.LESS_THAN_SIGN) { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; |
| this._emitChar('<'); |
| } |
| |
| else if (cp === $.NULL) |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this._emitCodePoint(cp); |
| }; |
| |
| |
| //12.2.4.30 Script data double escaped dash state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE] = function scriptDataDoubleEscapedDashState(cp) { |
| if (cp === $.HYPHEN_MINUS) { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE; |
| this._emitChar('-'); |
| } |
| |
| else if (cp === $.LESS_THAN_SIGN) { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; |
| this._emitChar('<'); |
| } |
| |
| else if (cp === $.NULL) { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; |
| this._emitCodePoint(cp); |
| } |
| }; |
| |
| |
| //12.2.4.31 Script data double escaped dash dash state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE] = function scriptDataDoubleEscapedDashDashState(cp) { |
| if (cp === $.HYPHEN_MINUS) |
| this._emitChar('-'); |
| |
| else if (cp === $.LESS_THAN_SIGN) { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; |
| this._emitChar('<'); |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = SCRIPT_DATA_STATE; |
| this._emitChar('>'); |
| } |
| |
| else if (cp === $.NULL) { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; |
| this._emitChar(UNICODE.REPLACEMENT_CHARACTER); |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else { |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; |
| this._emitCodePoint(cp); |
| } |
| }; |
| |
| |
| //12.2.4.32 Script data double escaped less-than sign state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataDoubleEscapedLessThanSignState(cp) { |
| if (cp === $.SOLIDUS) { |
| this.tempBuff = []; |
| this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE; |
| this._emitChar('/'); |
| } |
| |
| else |
| this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE); |
| }; |
| |
| |
| //12.2.4.33 Script data double escape end state |
| //------------------------------------------------------------------ |
| _[SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE] = function scriptDataDoubleEscapeEndState(cp) { |
| if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) { |
| this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_ESCAPED_STATE : SCRIPT_DATA_DOUBLE_ESCAPED_STATE; |
| |
| this._emitCodePoint(cp); |
| } |
| |
| else if (isAsciiUpper(cp)) { |
| this.tempBuff.push(toAsciiLowerCodePoint(cp)); |
| this._emitCodePoint(cp); |
| } |
| |
| else if (isAsciiLower(cp)) { |
| this.tempBuff.push(cp); |
| this._emitCodePoint(cp); |
| } |
| |
| else |
| this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE); |
| }; |
| |
| |
| //12.2.4.34 Before attribute name state |
| //------------------------------------------------------------------ |
| _[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.SOLIDUS) |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (isAsciiUpper(cp)) { |
| this._createAttr(toAsciiLowerChar(cp)); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| |
| else if (cp === $.NULL) { |
| this._createAttr(UNICODE.REPLACEMENT_CHARACTER); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| |
| else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN) { |
| this._createAttr(toChar(cp)); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else { |
| this._createAttr(toChar(cp)); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.35 Attribute name state |
| //------------------------------------------------------------------ |
| _[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) { |
| if (isWhitespace(cp)) |
| this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE); |
| |
| else if (cp === $.SOLIDUS) |
| this._leaveAttrName(SELF_CLOSING_START_TAG_STATE); |
| |
| else if (cp === $.EQUALS_SIGN) |
| this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE); |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this._leaveAttrName(DATA_STATE); |
| this._emitCurrentToken(); |
| } |
| |
| else if (isAsciiUpper(cp)) |
| this.currentAttr.name += toAsciiLowerChar(cp); |
| |
| else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) |
| this.currentAttr.name += toChar(cp); |
| |
| else if (cp === $.NULL) |
| this.currentAttr.name += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this.currentAttr.name += toChar(cp); |
| }; |
| |
| |
| //12.2.4.36 After attribute name state |
| //------------------------------------------------------------------ |
| _[AFTER_ATTRIBUTE_NAME_STATE] = function afterAttributeNameState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.SOLIDUS) |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| |
| else if (cp === $.EQUALS_SIGN) |
| this.state = BEFORE_ATTRIBUTE_VALUE_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (isAsciiUpper(cp)) { |
| this._createAttr(toAsciiLowerChar(cp)); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| |
| else if (cp === $.NULL) { |
| this._createAttr(UNICODE.REPLACEMENT_CHARACTER); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| |
| else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) { |
| this._createAttr(toChar(cp)); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else { |
| this._createAttr(toChar(cp)); |
| this.state = ATTRIBUTE_NAME_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.37 Before attribute value state |
| //------------------------------------------------------------------ |
| _[BEFORE_ATTRIBUTE_VALUE_STATE] = function beforeAttributeValueState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.QUOTATION_MARK) |
| this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE; |
| |
| else if (cp === $.AMPERSAND) |
| this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE); |
| |
| else if (cp === $.APOSTROPHE) |
| this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE; |
| |
| else if (cp === $.NULL) { |
| this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; |
| this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) { |
| this.currentAttr.value += toChar(cp); |
| this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE; |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else { |
| this.currentAttr.value += toChar(cp); |
| this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.38 Attribute value (double-quoted) state |
| //------------------------------------------------------------------ |
| _[ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE] = function attributeValueDoubleQuotedState(cp) { |
| if (cp === $.QUOTATION_MARK) |
| this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE; |
| |
| else if (cp === $.AMPERSAND) { |
| this.additionalAllowedCp = $.QUOTATION_MARK; |
| this.returnState = this.state; |
| this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE; |
| } |
| |
| else if (cp === $.NULL) |
| this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this.currentAttr.value += toChar(cp); |
| }; |
| |
| |
| //12.2.4.39 Attribute value (single-quoted) state |
| //------------------------------------------------------------------ |
| _[ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE] = function attributeValueSingleQuotedState(cp) { |
| if (cp === $.APOSTROPHE) |
| this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE; |
| |
| else if (cp === $.AMPERSAND) { |
| this.additionalAllowedCp = $.APOSTROPHE; |
| this.returnState = this.state; |
| this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE; |
| } |
| |
| else if (cp === $.NULL) |
| this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this.currentAttr.value += toChar(cp); |
| }; |
| |
| |
| //12.2.4.40 Attribute value (unquoted) state |
| //------------------------------------------------------------------ |
| _[ATTRIBUTE_VALUE_UNQUOTED_STATE] = function attributeValueUnquotedState(cp) { |
| if (isWhitespace(cp)) |
| this.state = BEFORE_ATTRIBUTE_NAME_STATE; |
| |
| else if (cp === $.AMPERSAND) { |
| this.additionalAllowedCp = $.GREATER_THAN_SIGN; |
| this.returnState = this.state; |
| this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.NULL) |
| this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || |
| cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) { |
| this.currentAttr.value += toChar(cp); |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this.currentAttr.value += toChar(cp); |
| }; |
| |
| |
| //12.2.4.41 Character reference in attribute value state |
| //------------------------------------------------------------------ |
| _[CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE] = function characterReferenceInAttributeValueState(cp) { |
| var referencedCodePoints = this._consumeCharacterReference(cp, true); |
| |
| if (referencedCodePoints) { |
| for (var i = 0; i < referencedCodePoints.length; i++) |
| this.currentAttr.value += toChar(referencedCodePoints[i]); |
| } else |
| this.currentAttr.value += '&'; |
| |
| this.state = this.returnState; |
| }; |
| |
| |
| //12.2.4.42 After attribute value (quoted) state |
| //------------------------------------------------------------------ |
| _[AFTER_ATTRIBUTE_VALUE_QUOTED_STATE] = function afterAttributeValueQuotedState(cp) { |
| if (isWhitespace(cp)) |
| this.state = BEFORE_ATTRIBUTE_NAME_STATE; |
| |
| else if (cp === $.SOLIDUS) |
| this.state = SELF_CLOSING_START_TAG_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE); |
| }; |
| |
| |
| //12.2.4.43 Self-closing start tag state |
| //------------------------------------------------------------------ |
| _[SELF_CLOSING_START_TAG_STATE] = function selfClosingStartTagState(cp) { |
| if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.selfClosing = true; |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.EOF) |
| this._reconsumeInState(DATA_STATE); |
| |
| else |
| this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE); |
| }; |
| |
| |
| //12.2.4.44 Bogus comment state |
| //------------------------------------------------------------------ |
| _[BOGUS_COMMENT_STATE] = function bogusCommentState(cp) { |
| this._createCommentToken(); |
| |
| while (true) { |
| if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| break; |
| } |
| |
| else if (cp === $.EOF) { |
| this._reconsumeInState(DATA_STATE); |
| break; |
| } |
| |
| else { |
| this.currentToken.data += cp === $.NULL ? UNICODE.REPLACEMENT_CHARACTER : toChar(cp); |
| cp = this._consume(); |
| } |
| } |
| |
| this._emitCurrentToken(); |
| }; |
| |
| |
| //12.2.4.45 Markup declaration open state |
| //------------------------------------------------------------------ |
| _[MARKUP_DECLARATION_OPEN_STATE] = function markupDeclarationOpenState(cp) { |
| if (this._consumeSubsequentIfMatch($$.DASH_DASH_STRING, cp, true)) { |
| this._createCommentToken(); |
| this.state = COMMENT_START_STATE; |
| } |
| |
| else if (this._consumeSubsequentIfMatch($$.DOCTYPE_STRING, cp, false)) |
| this.state = DOCTYPE_STATE; |
| |
| else if (this.allowCDATA && this._consumeSubsequentIfMatch($$.CDATA_START_STRING, cp, true)) |
| this.state = CDATA_SECTION_STATE; |
| |
| else { |
| //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption. |
| this[BOGUS_COMMENT_STATE](cp); |
| } |
| }; |
| |
| |
| //12.2.4.46 Comment start state |
| //------------------------------------------------------------------ |
| _[COMMENT_START_STATE] = function commentStartState(cp) { |
| if (cp === $.HYPHEN_MINUS) |
| this.state = COMMENT_START_DASH_STATE; |
| |
| else if (cp === $.NULL) { |
| this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; |
| this.state = COMMENT_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.EOF) { |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.data += toChar(cp); |
| this.state = COMMENT_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.47 Comment start dash state |
| //------------------------------------------------------------------ |
| _[COMMENT_START_DASH_STATE] = function commentStartDashState(cp) { |
| if (cp === $.HYPHEN_MINUS) |
| this.state = COMMENT_END_STATE; |
| |
| else if (cp === $.NULL) { |
| this.currentToken.data += '-'; |
| this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; |
| this.state = COMMENT_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.EOF) { |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.data += '-'; |
| this.currentToken.data += toChar(cp); |
| this.state = COMMENT_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.48 Comment state |
| //------------------------------------------------------------------ |
| _[COMMENT_STATE] = function commentState(cp) { |
| if (cp === $.HYPHEN_MINUS) |
| this.state = COMMENT_END_DASH_STATE; |
| |
| else if (cp === $.NULL) |
| this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) { |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this.currentToken.data += toChar(cp); |
| }; |
| |
| |
| //12.2.4.49 Comment end dash state |
| //------------------------------------------------------------------ |
| _[COMMENT_END_DASH_STATE] = function commentEndDashState(cp) { |
| if (cp === $.HYPHEN_MINUS) |
| this.state = COMMENT_END_STATE; |
| |
| else if (cp === $.NULL) { |
| this.currentToken.data += '-'; |
| this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; |
| this.state = COMMENT_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.data += '-'; |
| this.currentToken.data += toChar(cp); |
| this.state = COMMENT_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.50 Comment end state |
| //------------------------------------------------------------------ |
| _[COMMENT_END_STATE] = function commentEndState(cp) { |
| if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.EXCLAMATION_MARK) |
| this.state = COMMENT_END_BANG_STATE; |
| |
| else if (cp === $.HYPHEN_MINUS) |
| this.currentToken.data += '-'; |
| |
| else if (cp === $.NULL) { |
| this.currentToken.data += '--'; |
| this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; |
| this.state = COMMENT_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this._reconsumeInState(DATA_STATE); |
| this._emitCurrentToken(); |
| } |
| |
| else { |
| this.currentToken.data += '--'; |
| this.currentToken.data += toChar(cp); |
| this.state = COMMENT_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.51 Comment end bang state |
| //------------------------------------------------------------------ |
| _[COMMENT_END_BANG_STATE] = function commentEndBangState(cp) { |
| if (cp === $.HYPHEN_MINUS) { |
| this.currentToken.data += '--!'; |
| this.state = COMMENT_END_DASH_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.NULL) { |
| this.currentToken.data += '--!'; |
| this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; |
| this.state = COMMENT_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.data += '--!'; |
| this.currentToken.data += toChar(cp); |
| this.state = COMMENT_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.52 DOCTYPE state |
| //------------------------------------------------------------------ |
| _[DOCTYPE_STATE] = function doctypeState(cp) { |
| if (isWhitespace(cp)) |
| this.state = BEFORE_DOCTYPE_NAME_STATE; |
| |
| else if (cp === $.EOF) { |
| this._createDoctypeToken(); |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE); |
| }; |
| |
| |
| //12.2.4.53 Before DOCTYPE name state |
| //------------------------------------------------------------------ |
| _[BEFORE_DOCTYPE_NAME_STATE] = function beforeDoctypeNameState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (isAsciiUpper(cp)) { |
| this._createDoctypeToken(toAsciiLowerChar(cp)); |
| this.state = DOCTYPE_NAME_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this._createDoctypeToken(); |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this._createDoctypeToken(); |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else if (cp === $.NULL) { |
| this._createDoctypeToken(UNICODE.REPLACEMENT_CHARACTER); |
| this.state = DOCTYPE_NAME_STATE; |
| } |
| |
| else { |
| this._createDoctypeToken(toChar(cp)); |
| this.state = DOCTYPE_NAME_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.54 DOCTYPE name state |
| //------------------------------------------------------------------ |
| _[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) { |
| if (isWhitespace(cp)) |
| this.state = AFTER_DOCTYPE_NAME_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (isAsciiUpper(cp)) |
| this.currentToken.name += toAsciiLowerChar(cp); |
| |
| else if (cp === $.NULL) |
| this.currentToken.name += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this.currentToken.name += toChar(cp); |
| }; |
| |
| |
| //12.2.4.55 After DOCTYPE name state |
| //------------------------------------------------------------------ |
| _[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.GREATER_THAN_SIGN) { |
| this.state = DATA_STATE; |
| this._emitCurrentToken(); |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else if (this._consumeSubsequentIfMatch($$.PUBLIC_STRING, cp, false)) |
| this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE; |
| |
| else if (this._consumeSubsequentIfMatch($$.SYSTEM_STRING, cp, false)) |
| this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE; |
| |
| else { |
| this.currentToken.forceQuirks = true; |
| this.state = BOGUS_DOCTYPE_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.56 After DOCTYPE public keyword state |
| //------------------------------------------------------------------ |
| _[AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE] = function afterDoctypePublicKeywordState(cp) { |
| if (isWhitespace(cp)) |
| this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE; |
| |
| else if (cp === $.QUOTATION_MARK) { |
| this.currentToken.publicId = ''; |
| this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.APOSTROPHE) { |
| this.currentToken.publicId = ''; |
| this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.forceQuirks = true; |
| this.state = BOGUS_DOCTYPE_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.57 Before DOCTYPE public identifier state |
| //------------------------------------------------------------------ |
| _[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifierState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.QUOTATION_MARK) { |
| this.currentToken.publicId = ''; |
| this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.APOSTROPHE) { |
| this.currentToken.publicId = ''; |
| this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.forceQuirks = true; |
| this.state = BOGUS_DOCTYPE_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.58 DOCTYPE public identifier (double-quoted) state |
| //------------------------------------------------------------------ |
| _[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentifierDoubleQuotedState(cp) { |
| if (cp === $.QUOTATION_MARK) |
| this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE; |
| |
| else if (cp === $.NULL) |
| this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this.currentToken.publicId += toChar(cp); |
| }; |
| |
| |
| //12.2.4.59 DOCTYPE public identifier (single-quoted) state |
| //------------------------------------------------------------------ |
| _[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentifierSingleQuotedState(cp) { |
| if (cp === $.APOSTROPHE) |
| this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE; |
| |
| else if (cp === $.NULL) |
| this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this.currentToken.publicId += toChar(cp); |
| }; |
| |
| |
| //12.2.4.60 After DOCTYPE public identifier state |
| //------------------------------------------------------------------ |
| _[AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function afterDoctypePublicIdentifierState(cp) { |
| if (isWhitespace(cp)) |
| this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.QUOTATION_MARK) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.APOSTROPHE) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.forceQuirks = true; |
| this.state = BOGUS_DOCTYPE_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.61 Between DOCTYPE public and system identifiers state |
| //------------------------------------------------------------------ |
| _[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctypePublicAndSystemIdentifiersState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.QUOTATION_MARK) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; |
| } |
| |
| |
| else if (cp === $.APOSTROPHE) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.forceQuirks = true; |
| this.state = BOGUS_DOCTYPE_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.62 After DOCTYPE system keyword state |
| //------------------------------------------------------------------ |
| _[AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE] = function afterDoctypeSystemKeywordState(cp) { |
| if (isWhitespace(cp)) |
| this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE; |
| |
| else if (cp === $.QUOTATION_MARK) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.APOSTROPHE) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.forceQuirks = true; |
| this.state = BOGUS_DOCTYPE_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.63 Before DOCTYPE system identifier state |
| //------------------------------------------------------------------ |
| _[BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function beforeDoctypeSystemIdentifierState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.QUOTATION_MARK) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.APOSTROPHE) { |
| this.currentToken.systemId = ''; |
| this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; |
| } |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else { |
| this.currentToken.forceQuirks = true; |
| this.state = BOGUS_DOCTYPE_STATE; |
| } |
| }; |
| |
| |
| //12.2.4.64 DOCTYPE system identifier (double-quoted) state |
| //------------------------------------------------------------------ |
| _[DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypeSystemIdentifierDoubleQuotedState(cp) { |
| if (cp === $.QUOTATION_MARK) |
| this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.NULL) |
| this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this.currentToken.systemId += toChar(cp); |
| }; |
| |
| |
| //12.2.4.65 DOCTYPE system identifier (single-quoted) state |
| //------------------------------------------------------------------ |
| _[DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypeSystemIdentifierSingleQuotedState(cp) { |
| if (cp === $.APOSTROPHE) |
| this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE; |
| |
| else if (cp === $.GREATER_THAN_SIGN) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.NULL) |
| this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER; |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this.currentToken.systemId += toChar(cp); |
| }; |
| |
| |
| //12.2.4.66 After DOCTYPE system identifier state |
| //------------------------------------------------------------------ |
| _[AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function afterDoctypeSystemIdentifierState(cp) { |
| if (isWhitespace(cp)) |
| return; |
| |
| if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this.currentToken.forceQuirks = true; |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| |
| else |
| this.state = BOGUS_DOCTYPE_STATE; |
| }; |
| |
| |
| //12.2.4.67 Bogus DOCTYPE state |
| //------------------------------------------------------------------ |
| _[BOGUS_DOCTYPE_STATE] = function bogusDoctypeState(cp) { |
| if (cp === $.GREATER_THAN_SIGN) { |
| this._emitCurrentToken(); |
| this.state = DATA_STATE; |
| } |
| |
| else if (cp === $.EOF) { |
| this._emitCurrentToken(); |
| this._reconsumeInState(DATA_STATE); |
| } |
| }; |
| |
| |
| //12.2.4.68 CDATA section state |
| //------------------------------------------------------------------ |
| _[CDATA_SECTION_STATE] = function cdataSectionState(cp) { |
| while (true) { |
| if (cp === $.EOF) { |
| this._reconsumeInState(DATA_STATE); |
| break; |
| } |
| |
| else if (this._consumeSubsequentIfMatch($$.CDATA_END_STRING, cp, true)) { |
| this.state = DATA_STATE; |
| break; |
| } |
| |
| else { |
| this._emitCodePoint(cp); |
| cp = this._consume(); |
| } |
| } |
| }; |
| |
| },{"../common/unicode":4,"./location_info_mixin":11,"./named_entity_trie":12,"./preprocessor":13}],15:[function(require,module,exports){ |
| 'use strict'; |
| |
| //Node construction |
| exports.createDocument = function () { |
| return { |
| nodeName: '#document', |
| quirksMode: false, |
| childNodes: [] |
| }; |
| }; |
| |
| exports.createDocumentFragment = function () { |
| return { |
| nodeName: '#document-fragment', |
| quirksMode: false, |
| childNodes: [] |
| }; |
| }; |
| |
| exports.createElement = function (tagName, namespaceURI, attrs) { |
| return { |
| nodeName: tagName, |
| tagName: tagName, |
| attrs: attrs, |
| namespaceURI: namespaceURI, |
| childNodes: [], |
| parentNode: null |
| }; |
| }; |
| |
| exports.createCommentNode = function (data) { |
| return { |
| nodeName: '#comment', |
| data: data, |
| parentNode: null |
| }; |
| }; |
| |
| var createTextNode = function (value) { |
| return { |
| nodeName: '#text', |
| value: value, |
| parentNode: null |
| } |
| }; |
| |
| |
| //Tree mutation |
| exports.setDocumentType = function (document, name, publicId, systemId) { |
| var doctypeNode = null; |
| |
| for (var i = 0; i < document.childNodes.length; i++) { |
| if (document.childNodes[i].nodeName === '#documentType') { |
| doctypeNode = document.childNodes[i]; |
| break; |
| } |
| } |
| |
| if (doctypeNode) { |
| doctypeNode.name = name; |
| doctypeNode.publicId = publicId; |
| doctypeNode.systemId = systemId; |
| } |
| |
| else { |
| appendChild(document, { |
| nodeName: '#documentType', |
| name: name, |
| publicId: publicId, |
| systemId: systemId |
| }); |
| } |
| }; |
| |
| exports.setQuirksMode = function (document) { |
| document.quirksMode = true; |
| }; |
| |
| exports.isQuirksMode = function (document) { |
| return document.quirksMode; |
| }; |
| |
| var appendChild = exports.appendChild = function (parentNode, newNode) { |
| parentNode.childNodes.push(newNode); |
| newNode.parentNode = parentNode; |
| }; |
| |
| var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) { |
| var insertionIdx = parentNode.childNodes.indexOf(referenceNode); |
| |
| parentNode.childNodes.splice(insertionIdx, 0, newNode); |
| newNode.parentNode = parentNode; |
| }; |
| |
| exports.detachNode = function (node) { |
| if (node.parentNode) { |
| var idx = node.parentNode.childNodes.indexOf(node); |
| |
| node.parentNode.childNodes.splice(idx, 1); |
| node.parentNode = null; |
| } |
| }; |
| |
| exports.insertText = function (parentNode, text) { |
| if (parentNode.childNodes.length) { |
| var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1]; |
| |
| if (prevNode.nodeName === '#text') { |
| prevNode.value += text; |
| return; |
| } |
| } |
| |
| appendChild(parentNode, createTextNode(text)); |
| }; |
| |
| exports.insertTextBefore = function (parentNode, text, referenceNode) { |
| var prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1]; |
| |
| if (prevNode && prevNode.nodeName === '#text') |
| prevNode.value += text; |
| else |
| insertBefore(parentNode, createTextNode(text), referenceNode); |
| }; |
| |
| exports.adoptAttributes = function (recipientNode, attrs) { |
| var recipientAttrsMap = []; |
| |
| for (var i = 0; i < recipientNode.attrs.length; i++) |
| recipientAttrsMap.push(recipientNode.attrs[i].name); |
| |
| for (var j = 0; j < attrs.length; j++) { |
| if (recipientAttrsMap.indexOf(attrs[j].name) === -1) |
| recipientNode.attrs.push(attrs[j]); |
| } |
| }; |
| |
| |
| //Tree traversing |
| exports.getFirstChild = function (node) { |
| return node.childNodes[0]; |
| }; |
| |
| exports.getChildNodes = function (node) { |
| return node.childNodes; |
| }; |
| |
| exports.getParentNode = function (node) { |
| return node.parentNode; |
| }; |
| |
| exports.getAttrList = function (node) { |
| return node.attrs; |
| }; |
| |
| //Node data |
| exports.getTagName = function (element) { |
| return element.tagName; |
| }; |
| |
| exports.getNamespaceURI = function (element) { |
| return element.namespaceURI; |
| }; |
| |
| exports.getTextNodeContent = function (textNode) { |
| return textNode.value; |
| }; |
| |
| exports.getCommentNodeContent = function (commentNode) { |
| return commentNode.data; |
| }; |
| |
| exports.getDocumentTypeNodeName = function (doctypeNode) { |
| return doctypeNode.name; |
| }; |
| |
| exports.getDocumentTypeNodePublicId = function (doctypeNode) { |
| return doctypeNode.publicId; |
| }; |
| |
| exports.getDocumentTypeNodeSystemId = function (doctypeNode) { |
| return doctypeNode.systemId; |
| }; |
| |
| //Node types |
| exports.isTextNode = function (node) { |
| return node.nodeName === '#text'; |
| }; |
| |
| exports.isCommentNode = function (node) { |
| return node.nodeName === '#comment'; |
| }; |
| |
| exports.isDocumentTypeNode = function (node) { |
| return node.nodeName === '#documentType'; |
| }; |
| |
| exports.isElementNode = function (node) { |
| return !!node.tagName; |
| }; |
| |
| },{}],16:[function(require,module,exports){ |
| 'use strict'; |
| |
| var Doctype = require('../common/doctype'); |
| |
| //Conversion tables for DOM Level1 structure emulation |
| var nodeTypes = { |
| element: 1, |
| text: 3, |
| cdata: 4, |
| comment: 8 |
| }; |
| |
| var nodePropertyShorthands = { |
| tagName: 'name', |
| childNodes: 'children', |
| parentNode: 'parent', |
| previousSibling: 'prev', |
| nextSibling: 'next', |
| nodeValue: 'data' |
| }; |
| |
| //Node |
| var Node = function (props) { |
| for (var key in props) { |
| if (props.hasOwnProperty(key)) |
| this[key] = props[key]; |
| } |
| }; |
| |
| Node.prototype = { |
| get firstChild() { |
| var children = this.children; |
| return children && children[0] || null; |
| }, |
| |
| get lastChild() { |
| var children = this.children; |
| return children && children[children.length - 1] || null; |
| }, |
| |
| get nodeType() { |
| return nodeTypes[this.type] || nodeTypes.element; |
| } |
| }; |
| |
| Object.keys(nodePropertyShorthands).forEach(function (key) { |
| var shorthand = nodePropertyShorthands[key]; |
| |
| Object.defineProperty(Node.prototype, key, { |
| get: function () { |
| return this[shorthand] || null; |
| }, |
| set: function (val) { |
| this[shorthand] = val; |
| return val; |
| } |
| }); |
| }); |
| |
| |
| //Node construction |
| exports.createDocument = |
| exports.createDocumentFragment = function () { |
| return new Node({ |
| type: 'root', |
| name: 'root', |
| parent: null, |
| prev: null, |
| next: null, |
| children: [] |
| }); |
| }; |
| |
| exports.createElement = function (tagName, namespaceURI, attrs) { |
| var attribs = {}, |
| attribsNamespace = {}, |
| attribsPrefix = {}; |
| |
| for (var i = 0; i < attrs.length; i++) { |
| var attrName = attrs[i].name; |
| |
| attribs[attrName] = attrs[i].value; |
| attribsNamespace[attrName] = attrs[i].namespace; |
| attribsPrefix[attrName] = attrs[i].prefix; |
| } |
| |
| return new Node({ |
| type: tagName === 'script' || tagName === 'style' ? tagName : 'tag', |
| name: tagName, |
| namespace: namespaceURI, |
| attribs: attribs, |
| 'x-attribsNamespace': attribsNamespace, |
| 'x-attribsPrefix': attribsPrefix, |
| children: [], |
| parent: null, |
| prev: null, |
| next: null |
| }); |
| }; |
| |
| exports.createCommentNode = function (data) { |
| return new Node({ |
| type: 'comment', |
| data: data, |
| parent: null, |
| prev: null, |
| next: null |
| }); |
| }; |
| |
| var createTextNode = function (value) { |
| return new Node({ |
| type: 'text', |
| data: value, |
| parent: null, |
| prev: null, |
| next: null |
| }); |
| }; |
| |
| |
| //Tree mutation |
| exports.setDocumentType = function (document, name, publicId, systemId) { |
| var data = Doctype.serializeContent(name, publicId, systemId), |
| doctypeNode = null; |
| |
| for (var i = 0; i < document.children.length; i++) { |
| if (document.children[i].type === 'directive' && document.children[i].name === '!doctype') { |
| doctypeNode = document.children[i]; |
| break; |
| } |
| } |
| |
| if (doctypeNode) { |
| doctypeNode.data = data; |
| doctypeNode['x-name'] = name; |
| doctypeNode['x-publicId'] = publicId; |
| doctypeNode['x-systemId'] = systemId; |
| } |
| |
| else { |
| appendChild(document, new Node({ |
| type: 'directive', |
| name: '!doctype', |
| data: data, |
| 'x-name': name, |
| 'x-publicId': publicId, |
| 'x-systemId': systemId |
| })); |
| } |
| |
| }; |
| |
| exports.setQuirksMode = function (document) { |
| document.quirksMode = true; |
| }; |
| |
| exports.isQuirksMode = function (document) { |
| return document.quirksMode; |
| }; |
| |
| var appendChild = exports.appendChild = function (parentNode, newNode) { |
| var prev = parentNode.children[parentNode.children.length - 1]; |
| |
| if (prev) { |
| prev.next = newNode; |
| newNode.prev = prev; |
| } |
| |
| parentNode.children.push(newNode); |
| newNode.parent = parentNode; |
| }; |
| |
| var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) { |
| var insertionIdx = parentNode.children.indexOf(referenceNode), |
| prev = referenceNode.prev; |
| |
| if (prev) { |
| prev.next = newNode; |
| newNode.prev = prev; |
| } |
| |
| referenceNode.prev = newNode; |
| newNode.next = referenceNode; |
| |
| parentNode.children.splice(insertionIdx, 0, newNode); |
| newNode.parent = parentNode; |
| }; |
| |
| exports.detachNode = function (node) { |
| if (node.parent) { |
| var idx = node.parent.children.indexOf(node), |
| prev = node.prev, |
| next = node.next; |
| |
| node.prev = null; |
| node.next = null; |
| |
| if (prev) |
| prev.next = next; |
| |
| if (next) |
| next.prev = prev; |
| |
| node.parent.children.splice(idx, 1); |
| node.parent = null; |
| } |
| }; |
| |
| exports.insertText = function (parentNode, text) { |
| var lastChild = parentNode.children[parentNode.children.length - 1]; |
| |
| if (lastChild && lastChild.type === 'text') |
| lastChild.data += text; |
| else |
| appendChild(parentNode, createTextNode(text)); |
| }; |
| |
| exports.insertTextBefore = function (parentNode, text, referenceNode) { |
| var prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1]; |
| |
| if (prevNode && prevNode.type === 'text') |
| prevNode.data += text; |
| else |
| insertBefore(parentNode, createTextNode(text), referenceNode); |
| }; |
| |
| exports.adoptAttributes = function (recipientNode, attrs) { |
| for (var i = 0; i < attrs.length; i++) { |
| var attrName = attrs[i].name; |
| |
| if (typeof recipientNode.attribs[attrName] === 'undefined') { |
| recipientNode.attribs[attrName] = attrs[i].value; |
| recipientNode['x-attribsNamespace'][attrName] = attrs[i].namespace; |
| recipientNode['x-attribsPrefix'][attrName] = attrs[i].prefix; |
| } |
| } |
| }; |
| |
| |
| //Tree traversing |
| exports.getFirstChild = function (node) { |
| return node.children[0]; |
| }; |
| |
| exports.getChildNodes = function (node) { |
| return node.children; |
| }; |
| |
| exports.getParentNode = function (node) { |
| return node.parent; |
| }; |
| |
| exports.getAttrList = function (node) { |
| var attrList = []; |
| |
| for (var name in node.attribs) { |
| if (node.attribs.hasOwnProperty(name)) { |
| attrList.push({ |
| name: name, |
| value: node.attribs[name], |
| namespace: node['x-attribsNamespace'][name], |
| prefix: node['x-attribsPrefix'][name] |
| }); |
| } |
| } |
| |
| return attrList; |
| }; |
| |
| |
| //Node data |
| exports.getTagName = function (element) { |
| return element.name; |
| }; |
| |
| exports.getNamespaceURI = function (element) { |
| return element.namespace; |
| }; |
| |
| exports.getTextNodeContent = function (textNode) { |
| return textNode.data; |
| }; |
| |
| exports.getCommentNodeContent = function (commentNode) { |
| return commentNode.data; |
| }; |
| |
| exports.getDocumentTypeNodeName = function (doctypeNode) { |
| return doctypeNode['x-name']; |
| }; |
| |
| exports.getDocumentTypeNodePublicId = function (doctypeNode) { |
| return doctypeNode['x-publicId']; |
| }; |
| |
| exports.getDocumentTypeNodeSystemId = function (doctypeNode) { |
| return doctypeNode['x-systemId']; |
| }; |
| |
| |
| //Node types |
| exports.isTextNode = function (node) { |
| return node.type === 'text'; |
| }; |
| |
| exports.isCommentNode = function (node) { |
| return node.type === 'comment'; |
| }; |
| |
| exports.isDocumentTypeNode = function (node) { |
| return node.type === 'directive' && node.name === '!doctype'; |
| }; |
| |
| exports.isElementNode = function (node) { |
| return !!node.attribs; |
| }; |
| |
| },{"../common/doctype":1}],17:[function(require,module,exports){ |
| 'use strict'; |
| |
| //Const |
| var NOAH_ARK_CAPACITY = 3; |
| |
| //List of formatting elements |
| var FormattingElementList = module.exports = function (treeAdapter) { |
| this.length = 0; |
| this.entries = []; |
| this.treeAdapter = treeAdapter; |
| this.bookmark = null; |
| }; |
| |
| //Entry types |
| FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY'; |
| FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY'; |
| |
| //Noah Ark's condition |
| //OPTIMIZATION: at first we try to find possible candidates for exclusion using |
| //lightweight heuristics without thorough attributes check. |
| FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) { |
| var candidates = []; |
| |
| if (this.length >= NOAH_ARK_CAPACITY) { |
| var neAttrsLength = this.treeAdapter.getAttrList(newElement).length, |
| neTagName = this.treeAdapter.getTagName(newElement), |
| neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement); |
| |
| for (var i = this.length - 1; i >= 0; i--) { |
| var entry = this.entries[i]; |
| |
| if (entry.type === FormattingElementList.MARKER_ENTRY) |
| break; |
| |
| var element = entry.element, |
| elementAttrs = this.treeAdapter.getAttrList(element); |
| |
| if (this.treeAdapter.getTagName(element) === neTagName && |
| this.treeAdapter.getNamespaceURI(element) === neNamespaceURI && |
| elementAttrs.length === neAttrsLength) { |
| candidates.push({idx: i, attrs: elementAttrs}); |
| } |
| } |
| } |
| |
| return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates; |
| }; |
| |
| FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) { |
| var candidates = this._getNoahArkConditionCandidates(newElement), |
| cLength = candidates.length; |
| |
| if (cLength) { |
| var neAttrs = this.treeAdapter.getAttrList(newElement), |
| neAttrsLength = neAttrs.length, |
| neAttrsMap = {}; |
| |
| //NOTE: build attrs map for the new element so we can perform fast lookups |
| for (var i = 0; i < neAttrsLength; i++) { |
| var neAttr = neAttrs[i]; |
| |
| neAttrsMap[neAttr.name] = neAttr.value; |
| } |
| |
| for (var i = 0; i < neAttrsLength; i++) { |
| for (var j = 0; j < cLength; j++) { |
| var cAttr = candidates[j].attrs[i]; |
| |
| if (neAttrsMap[cAttr.name] !== cAttr.value) { |
| candidates.splice(j, 1); |
| cLength--; |
| } |
| |
| if (candidates.length < NOAH_ARK_CAPACITY) |
| return; |
| } |
| } |
| |
| //NOTE: remove bottommost candidates until Noah's Ark condition will not be met |
| for (var i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) { |
| this.entries.splice(candidates[i].idx, 1); |
| this.length--; |
| } |
| } |
| }; |
| |
| //Mutations |
| FormattingElementList.prototype.insertMarker = function () { |
| this.entries.push({type: FormattingElementList.MARKER_ENTRY}); |
| this.length++; |
| }; |
| |
| FormattingElementList.prototype.pushElement = function (element, token) { |
| this._ensureNoahArkCondition(element); |
| |
| this.entries.push({ |
| type: FormattingElementList.ELEMENT_ENTRY, |
| element: element, |
| token: token |
| }); |
| |
| this.length++; |
| }; |
| |
| FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) { |
| var bookmarkIdx = this.length - 1; |
| |
| for (; bookmarkIdx >= 0; bookmarkIdx--) { |
| if (this.entries[bookmarkIdx] === this.bookmark) |
| break; |
| } |
| |
| this.entries.splice(bookmarkIdx + 1, 0, { |
| type: FormattingElementList.ELEMENT_ENTRY, |
| element: element, |
| token: token |
| }); |
| |
| this.length++; |
| }; |
| |
| FormattingElementList.prototype.removeEntry = function (entry) { |
| for (var i = this.length - 1; i >= 0; i--) { |
| if (this.entries[i] === entry) { |
| this.entries.splice(i, 1); |
| this.length--; |
| break; |
| } |
| } |
| }; |
| |
| FormattingElementList.prototype.clearToLastMarker = function () { |
| while (this.length) { |
| var entry = this.entries.pop(); |
| |
| this.length--; |
| |
| if (entry.type === FormattingElementList.MARKER_ENTRY) |
| break; |
| } |
| }; |
| |
| //Search |
| FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) { |
| for (var i = this.length - 1; i >= 0; i--) { |
| var entry = this.entries[i]; |
| |
| if (entry.type === FormattingElementList.MARKER_ENTRY) |
| return null; |
| |
| if (this.treeAdapter.getTagName(entry.element) === tagName) |
| return entry; |
| } |
| |
| return null; |
| }; |
| |
| FormattingElementList.prototype.getElementEntry = function (element) { |
| for (var i = this.length - 1; i >= 0; i--) { |
| var entry = this.entries[i]; |
| |
| if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element == element) |
| return entry; |
| } |
| |
| return null; |
| }; |
| |
| },{}],18:[function(require,module,exports){ |
| 'use strict'; |
| |
| var OpenElementStack = require('./open_element_stack'), |
| Tokenizer = require('../tokenization/tokenizer'), |
| HTML = require('../common/html'); |
| |
| |
| //Aliases |
| var $ = HTML.TAG_NAMES; |
| |
| |
| function setEndLocation(element, closingToken, treeAdapter) { |
| var loc = element.__location; |
| |
| if (!loc) |
| return; |
| |
| if (!loc.startTag) { |
| loc.startTag = { |
| start: loc.start, |
| end: loc.end |
| }; |
| } |
| |
| if (closingToken.location) { |
| var tn = treeAdapter.getTagName(element), |
| // NOTE: For cases like <p> <p> </p> - First 'p' closes without a closing tag and |
| // for cases like <td> <p> </td> - 'p' closes without a closing tag |
| isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN && |
| tn === closingToken.tagName; |
| |
| if (isClosingEndTag) { |
| loc.endTag = { |
| start: closingToken.location.start, |
| end: closingToken.location.end |
| }; |
| } |
| |
| loc.end = closingToken.location.end; |
| } |
| } |
| |
| //NOTE: patch open elements stack, so we can assign end location for the elements |
| function patchOpenElementsStack(stack, parser) { |
| var treeAdapter = parser.treeAdapter; |
| |
| stack.pop = function () { |
| setEndLocation(this.current, parser.currentToken, treeAdapter); |
| OpenElementStack.prototype.pop.call(this); |
| }; |
| |
| stack.popAllUpToHtmlElement = function () { |
| for (var i = this.stackTop; i > 0; i--) |
| setEndLocation(this.items[i], parser.currentToken, treeAdapter); |
| |
| OpenElementStack.prototype.popAllUpToHtmlElement.call(this); |
| }; |
| |
| stack.remove = function (element) { |
| setEndLocation(element, parser.currentToken, treeAdapter); |
| OpenElementStack.prototype.remove.call(this, element); |
| }; |
| } |
| |
| exports.assign = function (parser) { |
| //NOTE: obtain Parser proto this way to avoid module circular references |
| var parserProto = Object.getPrototypeOf(parser), |
| treeAdapter = parser.treeAdapter; |
| |
| |
| //NOTE: patch _reset method |
| parser._reset = function (html, document, fragmentContext) { |
| parserProto._reset.call(this, html, document, fragmentContext); |
| |
| this.attachableElementLocation = null; |
| this.lastFosterParentingLocation = null; |
| this.currentToken = null; |
| |
| patchOpenElementsStack(this.openElements, parser); |
| }; |
| |
| parser._processTokenInForeignContent = function (token) { |
| this.currentToken = token; |
| parserProto._processTokenInForeignContent.call(this, token); |
| }; |
| |
| parser._processToken = function (token) { |
| this.currentToken = token; |
| parserProto._processToken.call(this, token); |
| |
| //NOTE: <body> and <html> are never popped from the stack, so we need to updated |
| //their end location explicitly. |
| if (token.type === Tokenizer.END_TAG_TOKEN && |
| (token.tagName === $.HTML || |
| (token.tagName === $.BODY && this.openElements.hasInScope($.BODY)))) { |
| for (var i = this.openElements.stackTop; i >= 0; i--) { |
| var element = this.openElements.items[i]; |
| |
| if (this.treeAdapter.getTagName(element) === token.tagName) { |
| setEndLocation(element, token, treeAdapter); |
| break; |
| } |
| } |
| } |
| }; |
| |
| //Doctype |
| parser._setDocumentType = function (token) { |
| parserProto._setDocumentType.call(this, token); |
| |
| var documentChildren = this.treeAdapter.getChildNodes(this.document), |
| cnLength = documentChildren.length; |
| |
| for (var i = 0; i < cnLength; i++) { |
| var node = documentChildren[i]; |
| |
| if (this.treeAdapter.isDocumentTypeNode(node)) { |
| node.__location = token.location; |
| break; |
| } |
| } |
| }; |
| |
| //Elements |
| parser._attachElementToTree = function (element) { |
| //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods. |
| //So we will use token location stored in this methods for the element. |
| element.__location = this.attachableElementLocation || null; |
| this.attachableElementLocation = null; |
| parserProto._attachElementToTree.call(this, element); |
| }; |
| |
| parser._appendElement = function (token, namespaceURI) { |
| this.attachableElementLocation = token.location; |
| parserProto._appendElement.call(this, token, namespaceURI); |
| }; |
| |
| parser._insertElement = function (token, namespaceURI) { |
| this.attachableElementLocation = token.location; |
| parserProto._insertElement.call(this, token, namespaceURI); |
| }; |
| |
| parser._insertTemplate = function (token) { |
| this.attachableElementLocation = token.location; |
| parserProto._insertTemplate.call(this, token); |
| |
| var tmplContent = this.treeAdapter.getChildNodes(this.openElements.current)[0]; |
| |
| tmplContent.__location = null; |
| }; |
| |
| parser._insertFakeRootElement = function () { |
| parserProto._insertFakeRootElement.call(this); |
| this.openElements.current.__location = null; |
| }; |
| |
| //Comments |
| parser._appendCommentNode = function (token, parent) { |
| parserProto._appendCommentNode.call(this, token, parent); |
| |
| var children = this.treeAdapter.getChildNodes(parent), |
| commentNode = children[children.length - 1]; |
| |
| commentNode.__location = token.location; |
| }; |
| |
| //Text |
| parser._findFosterParentingLocation = function () { |
| //NOTE: store last foster parenting location, so we will be able to find inserted text |
| //in case of foster parenting |
| this.lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this); |
| return this.lastFosterParentingLocation; |
| }; |
| |
| parser._insertCharacters = function (token) { |
| parserProto._insertCharacters.call(this, token); |
| |
| var hasFosterParent = this._shouldFosterParentOnInsertion(), |
| parentingLocation = this.lastFosterParentingLocation, |
| parent = (hasFosterParent && parentingLocation.parent) || |
| this.openElements.currentTmplContent || |
| this.openElements.current, |
| siblings = this.treeAdapter.getChildNodes(parent), |
| textNodeIdx = hasFosterParent && parentingLocation.beforeElement ? |
| siblings.indexOf(parentingLocation.beforeElement) - 1 : |
| siblings.length - 1, |
| textNode = siblings[textNodeIdx]; |
| |
| //NOTE: if we have location assigned by another token, then just update end position |
| if (textNode.__location) |
| textNode.__location.end = token.location.end; |
| |
| else |
| textNode.__location = token.location; |
| }; |
| }; |
| |
| |
| },{"../common/html":3,"../tokenization/tokenizer":14,"./open_element_stack":19}],19:[function(require,module,exports){ |
| 'use strict'; |
| |
| var HTML = require('../common/html'); |
| |
| //Aliases |
| var $ = HTML.TAG_NAMES, |
| NS = HTML.NAMESPACES; |
| |
| //Element utils |
| |
| //OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. |
| //It's faster than using dictionary. |
| function isImpliedEndTagRequired(tn) { |
| switch (tn.length) { |
| case 1: |
| return tn === $.P; |
| |
| case 2: |
| return tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI; |
| |
| case 6: |
| return tn === $.OPTION; |
| |
| case 8: |
| return tn === $.OPTGROUP; |
| } |
| |
| return false; |
| } |
| |
| function isScopingElement(tn, ns) { |
| switch (tn.length) { |
| case 2: |
| if (tn === $.TD || tn === $.TH) |
| return ns === NS.HTML; |
| |
| else if (tn === $.MI || tn === $.MO || tn == $.MN || tn === $.MS) |
| return ns === NS.MATHML; |
| |
| break; |
| |
| case 4: |
| if (tn === $.HTML) |
| return ns === NS.HTML; |
| |
| else if (tn === $.DESC) |
| return ns === NS.SVG; |
| |
| break; |
| |
| case 5: |
| if (tn === $.TABLE) |
| return ns === NS.HTML; |
| |
| else if (tn === $.MTEXT) |
| return ns === NS.MATHML; |
| |
| else if (tn === $.TITLE) |
| return ns === NS.SVG; |
| |
| break; |
| |
| case 6: |
| return (tn === $.APPLET || tn === $.OBJECT) && ns === NS.HTML; |
| |
| case 7: |
| return (tn === $.CAPTION || tn === $.MARQUEE) && ns === NS.HTML; |
| |
| case 8: |
| return tn === $.TEMPLATE && ns === NS.HTML; |
| |
| case 13: |
| return tn === $.FOREIGN_OBJECT && ns === NS.SVG; |
| |
| case 14: |
| return tn === $.ANNOTATION_XML && ns === NS.MATHML; |
| } |
| |
| return false; |
| } |
| |
| //Stack of open elements |
| var OpenElementStack = module.exports = function (document, treeAdapter) { |
| this.stackTop = -1; |
| this.items = []; |
| this.current = document; |
| this.currentTagName = null; |
| this.currentTmplContent = null; |
| this.tmplCount = 0; |
| this.treeAdapter = treeAdapter; |
| }; |
| |
| //Index of element |
| OpenElementStack.prototype._indexOf = function (element) { |
| var idx = -1; |
| |
| for (var i = this.stackTop; i >= 0; i--) { |
| if (this.items[i] === element) { |
| idx = i; |
| break; |
| } |
| } |
| return idx; |
| }; |
| |
| //Update current element |
| OpenElementStack.prototype._isInTemplate = function () { |
| if (this.currentTagName !== $.TEMPLATE) |
| return false; |
| |
| return this.treeAdapter.getNamespaceURI(this.current) === NS.HTML; |
| }; |
| |
| OpenElementStack.prototype._updateCurrentElement = function () { |
| this.current = this.items[this.stackTop]; |
| this.currentTagName = this.current && this.treeAdapter.getTagName(this.current); |
| |
| this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getChildNodes(this.current)[0] : null; |
| }; |
| |
| //Mutations |
| OpenElementStack.prototype.push = function (element) { |
| this.items[++this.stackTop] = element; |
| this._updateCurrentElement(); |
| |
| if (this._isInTemplate()) |
| this.tmplCount++; |
| |
| }; |
| |
| OpenElementStack.prototype.pop = function () { |
| this.stackTop--; |
| |
| if (this.tmplCount > 0 && this._isInTemplate()) |
| this.tmplCount--; |
| |
| this._updateCurrentElement(); |
| }; |
| |
| OpenElementStack.prototype.replace = function (oldElement, newElement) { |
| var idx = this._indexOf(oldElement); |
| this.items[idx] = newElement; |
| |
| if (idx === this.stackTop) |
| this._updateCurrentElement(); |
| }; |
| |
| OpenElementStack.prototype.insertAfter = function (referenceElement, newElement) { |
| var insertionIdx = this._indexOf(referenceElement) + 1; |
| |
| this.items.splice(insertionIdx, 0, newElement); |
| |
| if (insertionIdx == ++this.stackTop) |
| this._updateCurrentElement(); |
| }; |
| |
| OpenElementStack.prototype.popUntilTagNamePopped = function (tagName) { |
| while (this.stackTop > -1) { |
| var tn = this.currentTagName; |
| |
| this.pop(); |
| |
| if (tn === tagName) |
| break; |
| } |
| }; |
| |
| OpenElementStack.prototype.popUntilTemplatePopped = function () { |
| while (this.stackTop > -1) { |
| var tn = this.currentTagName, |
| ns = this.treeAdapter.getNamespaceURI(this.current); |
| |
| this.pop(); |
| |
| if (tn === $.TEMPLATE && ns === NS.HTML) |
| break; |
| } |
| }; |
| |
| OpenElementStack.prototype.popUntilElementPopped = function (element) { |
| while (this.stackTop > -1) { |
| var poppedElement = this.current; |
| |
| this.pop(); |
| |
| if (poppedElement === element) |
| break; |
| } |
| }; |
| |
| OpenElementStack.prototype.popUntilNumberedHeaderPopped = function () { |
| while (this.stackTop > -1) { |
| var tn = this.currentTagName; |
| |
| this.pop(); |
| |
| if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) |
| break; |
| } |
| }; |
| |
| OpenElementStack.prototype.popAllUpToHtmlElement = function () { |
| //NOTE: here we assume that root <html> element is always first in the open element stack, so |
| //we perform this fast stack clean up. |
| this.stackTop = 0; |
| this._updateCurrentElement(); |
| }; |
| |
| OpenElementStack.prototype.clearBackToTableContext = function () { |
| while (this.currentTagName !== $.TABLE && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) |
| this.pop(); |
| }; |
| |
| OpenElementStack.prototype.clearBackToTableBodyContext = function () { |
| while (this.currentTagName !== $.TBODY && this.currentTagName !== $.TFOOT && |
| this.currentTagName !== $.THEAD && this.currentTagName !== $.TEMPLATE && |
| this.currentTagName !== $.HTML) { |
| this.pop(); |
| } |
| }; |
| |
| OpenElementStack.prototype.clearBackToTableRowContext = function () { |
| while (this.currentTagName !== $.TR && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) |
| this.pop(); |
| }; |
| |
| OpenElementStack.prototype.remove = function (element) { |
| for (var i = this.stackTop; i >= 0; i--) { |
| if (this.items[i] === element) { |
| this.items.splice(i, 1); |
| this.stackTop--; |
| this._updateCurrentElement(); |
| break; |
| } |
| } |
| }; |
| |
| //Search |
| OpenElementStack.prototype.tryPeekProperlyNestedBodyElement = function () { |
| //Properly nested <body> element (should be second element in stack). |
| var element = this.items[1]; |
| return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null; |
| }; |
| |
| OpenElementStack.prototype.contains = function (element) { |
| return this._indexOf(element) > -1; |
| }; |
| |
| OpenElementStack.prototype.getCommonAncestor = function (element) { |
| var elementIdx = this._indexOf(element); |
| |
| return --elementIdx >= 0 ? this.items[elementIdx] : null; |
| }; |
| |
| OpenElementStack.prototype.isRootHtmlElementCurrent = function () { |
| return this.stackTop === 0 && this.currentTagName === $.HTML; |
| }; |
| |
| //Element in scope |
| OpenElementStack.prototype.hasInScope = function (tagName) { |
| for (var i = this.stackTop; i >= 0; i--) { |
| var tn = this.treeAdapter.getTagName(this.items[i]); |
| |
| if (tn === tagName) |
| return true; |
| |
| var ns = this.treeAdapter.getNamespaceURI(this.items[i]); |
| |
| if (isScopingElement(tn, ns)) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| OpenElementStack.prototype.hasNumberedHeaderInScope = function () { |
| for (var i = this.stackTop; i >= 0; i--) { |
| var tn = this.treeAdapter.getTagName(this.items[i]); |
| |
| if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) |
| return true; |
| |
| if (isScopingElement(tn, this.treeAdapter.getNamespaceURI(this.items[i]))) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| OpenElementStack.prototype.hasInListItemScope = function (tagName) { |
| for (var i = this.stackTop; i >= 0; i--) { |
| var tn = this.treeAdapter.getTagName(this.items[i]); |
| |
| if (tn === tagName) |
| return true; |
| |
| var ns = this.treeAdapter.getNamespaceURI(this.items[i]); |
| |
| if (((tn === $.UL || tn === $.OL) && ns === NS.HTML) || isScopingElement(tn, ns)) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| OpenElementStack.prototype.hasInButtonScope = function (tagName) { |
| for (var i = this.stackTop; i >= 0; i--) { |
| var tn = this.treeAdapter.getTagName(this.items[i]); |
| |
| if (tn === tagName) |
| return true; |
| |
| var ns = this.treeAdapter.getNamespaceURI(this.items[i]); |
| |
| if ((tn === $.BUTTON && ns === NS.HTML) || isScopingElement(tn, ns)) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| OpenElementStack.prototype.hasInTableScope = function (tagName) { |
| for (var i = this.stackTop; i >= 0; i--) { |
| var tn = this.treeAdapter.getTagName(this.items[i]); |
| |
| if (tn === tagName) |
| return true; |
| |
| var ns = this.treeAdapter.getNamespaceURI(this.items[i]); |
| |
| if ((tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML) && ns === NS.HTML) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| OpenElementStack.prototype.hasTableBodyContextInTableScope = function () { |
| for (var i = this.stackTop; i >= 0; i--) { |
| var tn = this.treeAdapter.getTagName(this.items[i]); |
| |
| if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT) |
| return true; |
| |
| var ns = this.treeAdapter.getNamespaceURI(this.items[i]); |
| |
| if ((tn === $.TABLE || tn === $.HTML) && ns === NS.HTML) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| OpenElementStack.prototype.hasInSelectScope = function (tagName) { |
| for (var i = this.stackTop; i >= 0; i--) { |
| var tn = this.treeAdapter.getTagName(this.items[i]); |
| |
| if (tn === tagName) |
| return true; |
| |
| var ns = this.treeAdapter.getNamespaceURI(this.items[i]); |
| |
| if (tn !== $.OPTION && tn !== $.OPTGROUP && ns === NS.HTML) |
| return false; |
| } |
| |
| return true; |
| }; |
| |
| //Implied end tags |
| OpenElementStack.prototype.generateImpliedEndTags = function () { |
| while (isImpliedEndTagRequired(this.currentTagName)) |
| this.pop(); |
| }; |
| |
| OpenElementStack.prototype.generateImpliedEndTagsWithExclusion = function (exclusionTagName) { |
| while (isImpliedEndTagRequired(this.currentTagName) && this.currentTagName !== exclusionTagName) |
| this.pop(); |
| }; |
| |
| },{"../common/html":3}],20:[function(require,module,exports){ |
| 'use strict'; |
| |
| var Tokenizer = require('../tokenization/tokenizer'), |
| OpenElementStack = require('./open_element_stack'), |
| FormattingElementList = require('./formatting_element_list'), |
| LocationInfoMixin = require('./location_info_mixin'), |
| DefaultTreeAdapter = require('../tree_adapters/default'), |
| Doctype = require('../common/doctype'), |
| ForeignContent = require('../common/foreign_content'), |
| Utils = require('../common/utils'), |
| UNICODE = require('../common/unicode'), |
| HTML = require('../common/html'); |
| |
| //Aliases |
| var $ = HTML.TAG_NAMES, |
| NS = HTML.NAMESPACES, |
| ATTRS = HTML.ATTRS; |
| |
| //Default options |
| var DEFAULT_OPTIONS = { |
| decodeHtmlEntities: true, |
| locationInfo: false |
| }; |
| |
| //Misc constants |
| var SEARCHABLE_INDEX_DEFAULT_PROMPT = 'This is a searchable index. Enter search keywords: ', |
| SEARCHABLE_INDEX_INPUT_NAME = 'isindex', |
| HIDDEN_INPUT_TYPE = 'hidden'; |
| |
| //Adoption agency loops iteration count |
| var AA_OUTER_LOOP_ITER = 8, |
| AA_INNER_LOOP_ITER = 3; |
| |
| //Insertion modes |
| var INITIAL_MODE = 'INITIAL_MODE', |
| BEFORE_HTML_MODE = 'BEFORE_HTML_MODE', |
| BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE', |
| IN_HEAD_MODE = 'IN_HEAD_MODE', |
| AFTER_HEAD_MODE = 'AFTER_HEAD_MODE', |
| IN_BODY_MODE = 'IN_BODY_MODE', |
| TEXT_MODE = 'TEXT_MODE', |
| IN_TABLE_MODE = 'IN_TABLE_MODE', |
| IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE', |
| IN_CAPTION_MODE = 'IN_CAPTION_MODE', |
| IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE', |
| IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE', |
| IN_ROW_MODE = 'IN_ROW_MODE', |
| IN_CELL_MODE = 'IN_CELL_MODE', |
| IN_SELECT_MODE = 'IN_SELECT_MODE', |
| IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE', |
| IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE', |
| AFTER_BODY_MODE = 'AFTER_BODY_MODE', |
| IN_FRAMESET_MODE = 'IN_FRAMESET_MODE', |
| AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE', |
| AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE', |
| AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE'; |
| |
| //Insertion mode reset map |
| var INSERTION_MODE_RESET_MAP = {}; |
| |
| INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE; |
| INSERTION_MODE_RESET_MAP[$.TBODY] = |
| INSERTION_MODE_RESET_MAP[$.THEAD] = |
| INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE; |
| INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE; |
| INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE; |
| INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE; |
| INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE; |
| INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE; |
| |
| //Template insertion mode switch map |
| var TEMPLATE_INSERTION_MODE_SWITCH_MAP = {}; |
| |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] = |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] = |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] = |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] = |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE; |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE; |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE; |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] = |
| TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE; |
| |
| //Token handlers map for insertion modes |
| var _ = {}; |
| |
| _[INITIAL_MODE] = {}; |
| _[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode; |
| _[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; |
| _[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode; |
| _[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] = |
| _[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] = |
| _[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode; |
| |
| _[BEFORE_HTML_MODE] = {}; |
| _[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml; |
| _[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; |
| _[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml; |
| _[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml; |
| _[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml; |
| |
| _[BEFORE_HEAD_MODE] = {}; |
| _[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead; |
| _[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; |
| _[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead; |
| _[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead; |
| _[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead; |
| |
| _[IN_HEAD_MODE] = {}; |
| _[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead; |
| _[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead; |
| _[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead; |
| _[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead; |
| |
| _[AFTER_HEAD_MODE] = {}; |
| _[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead; |
| _[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead; |
| _[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead; |
| _[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead; |
| |
| _[IN_BODY_MODE] = {}; |
| _[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; |
| _[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; |
| _[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody; |
| _[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody; |
| _[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[TEXT_MODE] = {}; |
| _[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = |
| _[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[TEXT_MODE][Tokenizer.COMMENT_TOKEN] = |
| _[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = |
| _[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken; |
| _[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText; |
| _[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText; |
| |
| _[IN_TABLE_MODE] = {}; |
| _[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = |
| _[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; |
| _[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable; |
| _[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable; |
| _[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_TABLE_TEXT_MODE] = {}; |
| _[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText; |
| _[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText; |
| _[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] = |
| _[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = |
| _[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] = |
| _[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] = |
| _[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText; |
| |
| _[IN_CAPTION_MODE] = {}; |
| _[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; |
| _[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; |
| _[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption; |
| _[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption; |
| _[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_COLUMN_GROUP_MODE] = {}; |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup; |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup; |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup; |
| _[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_TABLE_BODY_MODE] = {}; |
| _[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = |
| _[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; |
| _[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody; |
| _[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody; |
| _[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_ROW_MODE] = {}; |
| _[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = |
| _[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; |
| _[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow; |
| _[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow; |
| _[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_CELL_MODE] = {}; |
| _[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; |
| _[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; |
| _[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell; |
| _[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell; |
| _[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_SELECT_MODE] = {}; |
| _[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters; |
| _[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect; |
| _[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect; |
| _[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_SELECT_IN_TABLE_MODE] = {}; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable; |
| _[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody; |
| |
| _[IN_TEMPLATE_MODE] = {}; |
| _[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; |
| _[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; |
| _[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate; |
| _[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate; |
| _[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate; |
| |
| _[AFTER_BODY_MODE] = {}; |
| _[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody; |
| _[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; |
| _[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement; |
| _[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody; |
| _[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody; |
| _[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing; |
| |
| _[IN_FRAMESET_MODE] = {}; |
| _[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset; |
| _[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset; |
| _[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; |
| |
| _[AFTER_FRAMESET_MODE] = {}; |
| _[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; |
| _[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; |
| _[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset; |
| _[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset; |
| _[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; |
| |
| _[AFTER_AFTER_BODY_MODE] = {}; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody; |
| _[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing; |
| |
| _[AFTER_AFTER_FRAMESET_MODE] = {}; |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument; |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset; |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken; |
| _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; |
| |
| //Searchable index building utils (<isindex> tag) |
| function getSearchableIndexFormAttrs(isindexStartTagToken) { |
| var indexAction = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.ACTION), |
| attrs = []; |
| |
| if (indexAction !== null) { |
| attrs.push({ |
| name: ATTRS.ACTION, |
| value: indexAction |
| }); |
| } |
| |
| return attrs; |
| } |
| |
| function getSearchableIndexLabelText(isindexStartTagToken) { |
| var indexPrompt = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.PROMPT); |
| |
| return indexPrompt === null ? SEARCHABLE_INDEX_DEFAULT_PROMPT : indexPrompt; |
| } |
| |
| function getSearchableIndexInputAttrs(isindexStartTagToken) { |
| var isindexAttrs = isindexStartTagToken.attrs, |
| inputAttrs = []; |
| |
| for (var i = 0; i < isindexAttrs.length; i++) { |
| var name = isindexAttrs[i].name; |
| |
| if (name !== ATTRS.NAME && name !== ATTRS.ACTION && name !== ATTRS.PROMPT) |
| inputAttrs.push(isindexAttrs[i]); |
| } |
| |
| inputAttrs.push({ |
| name: ATTRS.NAME, |
| value: SEARCHABLE_INDEX_INPUT_NAME |
| }); |
| |
| return inputAttrs; |
| } |
| |
| //Parser |
| var Parser = module.exports = function (treeAdapter, options) { |
| this.treeAdapter = treeAdapter || DefaultTreeAdapter; |
| this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options); |
| this.scriptHandler = null; |
| |
| if (this.options.locationInfo) |
| LocationInfoMixin.assign(this); |
| }; |
| |
| //API |
| Parser.prototype.parse = function (html) { |
| var document = this.treeAdapter.createDocument(); |
| |
| this._reset(html, document, null); |
| this._runParsingLoop(); |
| |
| return document; |
| }; |
| |
| Parser.prototype.parseFragment = function (html, fragmentContext) { |
| //NOTE: use <template> element as a fragment context if context element was not provided, |
| //so we will parse in "forgiving" manner |
| if (!fragmentContext) |
| fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []); |
| |
| //NOTE: create fake element which will be used as 'document' for fragment parsing. |
| //This is important for jsdom there 'document' can't be recreated, therefore |
| //fragment parsing causes messing of the main `document`. |
| var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []); |
| |
| this._reset(html, documentMock, fragmentContext); |
| |
| if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE) |
| this._pushTmplInsertionMode(IN_TEMPLATE_MODE); |
| |
| this._initTokenizerForFragmentParsing(); |
| this._insertFakeRootElement(); |
| this._resetInsertionMode(); |
| this._findFormInFragmentContext(); |
| this._runParsingLoop(); |
| |
| var rootElement = this.treeAdapter.getFirstChild(documentMock), |
| fragment = this.treeAdapter.createDocumentFragment(); |
| |
| this._adoptNodes(rootElement, fragment); |
| |
| return fragment; |
| }; |
| |
| //Reset state |
| Parser.prototype._reset = function (html, document, fragmentContext) { |
| this.tokenizer = new Tokenizer(html, this.options); |
| |
| this.stopped = false; |
| |
| this.insertionMode = INITIAL_MODE; |
| this.originalInsertionMode = ''; |
| |
| this.document = document; |
| this.fragmentContext = fragmentContext; |
| |
| this.headElement = null; |
| this.formElement = null; |
| |
| this.openElements = new OpenElementStack(this.document, this.treeAdapter); |
| this.activeFormattingElements = new FormattingElementList(this.treeAdapter); |
| |
| this.tmplInsertionModeStack = []; |
| this.tmplInsertionModeStackTop = -1; |
| this.currentTmplInsertionMode = null; |
| |
| this.pendingCharacterTokens = []; |
| this.hasNonWhitespacePendingCharacterToken = false; |
| |
| this.framesetOk = true; |
| this.skipNextNewLine = false; |
| this.fosterParentingEnabled = false; |
| }; |
| |
| //Parsing loop |
| Parser.prototype._iterateParsingLoop = function () { |
| this._setupTokenizerCDATAMode(); |
| |
| var token = this.tokenizer.getNextToken(); |
| |
| if (this.skipNextNewLine) { |
| this.skipNextNewLine = false; |
| |
| if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') { |
| if (token.chars.length === 1) |
| return; |
| |
| token.chars = token.chars.substr(1); |
| } |
| } |
| |
| if (this._shouldProcessTokenInForeignContent(token)) |
| this._processTokenInForeignContent(token); |
| |
| else |
| this._processToken(token); |
| }; |
| |
| Parser.prototype._runParsingLoop = function () { |
| while (!this.stopped) |
| this._iterateParsingLoop(); |
| }; |
| |
| //Text parsing |
| Parser.prototype._setupTokenizerCDATAMode = function () { |
| var current = this._getAdjustedCurrentElement(); |
| |
| this.tokenizer.allowCDATA = current && current !== this.document && |
| this.treeAdapter.getNamespaceURI(current) !== NS.HTML && |
| (!this._isHtmlIntegrationPoint(current)) && |
| (!this._isMathMLTextIntegrationPoint(current)); |
| }; |
| |
| Parser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) { |
| this._insertElement(currentToken, NS.HTML); |
| this.tokenizer.state = nextTokenizerState; |
| this.originalInsertionMode = this.insertionMode; |
| this.insertionMode = TEXT_MODE; |
| }; |
| |
| //Fragment parsing |
| Parser.prototype._getAdjustedCurrentElement = function () { |
| return this.openElements.stackTop === 0 && this.fragmentContext ? |
| this.fragmentContext : |
| this.openElements.current; |
| }; |
| |
| Parser.prototype._findFormInFragmentContext = function () { |
| var node = this.fragmentContext; |
| |
| do { |
| if (this.treeAdapter.getTagName(node) === $.FORM) { |
| this.formElement = node; |
| break; |
| } |
| |
| node = this.treeAdapter.getParentNode(node); |
| } while (node); |
| }; |
| |
| Parser.prototype._initTokenizerForFragmentParsing = function () { |
| var tn = this.treeAdapter.getTagName(this.fragmentContext); |
| |
| if (tn === $.TITLE || tn === $.TEXTAREA) |
| this.tokenizer.state = Tokenizer.MODE.RCDATA; |
| |
| else if (tn === $.STYLE || tn === $.XMP || tn === $.IFRAME || |
| tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) { |
| this.tokenizer.state = Tokenizer.MODE.RAWTEXT; |
| } |
| |
| else if (tn === $.SCRIPT) |
| this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA; |
| |
| else if (tn === $.PLAINTEXT) |
| this.tokenizer.state = Tokenizer.MODE.PLAINTEXT; |
| }; |
| |
| //Tree mutation |
| Parser.prototype._setDocumentType = function (token) { |
| this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId); |
| }; |
| |
| Parser.prototype._attachElementToTree = function (element) { |
| if (this._shouldFosterParentOnInsertion()) |
| this._fosterParentElement(element); |
| |
| else { |
| var parent = this.openElements.currentTmplContent || this.openElements.current; |
| |
| this.treeAdapter.appendChild(parent, element); |
| } |
| }; |
| |
| Parser.prototype._appendElement = function (token, namespaceURI) { |
| var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs); |
| |
| this._attachElementToTree(element); |
| }; |
| |
| Parser.prototype._insertElement = function (token, namespaceURI) { |
| var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs); |
| |
| this._attachElementToTree(element); |
| this.openElements.push(element); |
| }; |
| |
| Parser.prototype._insertTemplate = function (token) { |
| var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs), |
| content = this.treeAdapter.createDocumentFragment(); |
| |
| this.treeAdapter.appendChild(tmpl, content); |
| this._attachElementToTree(tmpl); |
| this.openElements.push(tmpl); |
| }; |
| |
| Parser.prototype._insertFakeRootElement = function () { |
| var element = this.treeAdapter.createElement($.HTML, NS.HTML, []); |
| |
| this.treeAdapter.appendChild(this.openElements.current, element); |
| this.openElements.push(element); |
| }; |
| |
| Parser.prototype._appendCommentNode = function (token, parent) { |
| var commentNode = this.treeAdapter.createCommentNode(token.data); |
| |
| this.treeAdapter.appendChild(parent, commentNode); |
| }; |
| |
| Parser.prototype._insertCharacters = function (token) { |
| if (this._shouldFosterParentOnInsertion()) |
| this._fosterParentText(token.chars); |
| |
| else { |
| var parent = this.openElements.currentTmplContent || this.openElements.current; |
| |
| this.treeAdapter.insertText(parent, token.chars); |
| } |
| }; |
| |
| Parser.prototype._adoptNodes = function (donor, recipient) { |
| while (true) { |
| var child = this.treeAdapter.getFirstChild(donor); |
| |
| if (!child) |
| break; |
| |
| this.treeAdapter.detachNode(child); |
| this.treeAdapter.appendChild(recipient, child); |
| } |
| }; |
| |
| //Token processing |
| Parser.prototype._shouldProcessTokenInForeignContent = function (token) { |
| var current = this._getAdjustedCurrentElement(); |
| |
| if (!current || current === this.document) |
| return false; |
| |
| var ns = this.treeAdapter.getNamespaceURI(current); |
| |
| if (ns === NS.HTML) |
| return false; |
| |
| if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML && |
| token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG) { |
| return false; |
| } |
| |
| var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN || |
| token.type === Tokenizer.NULL_CHARACTER_TOKEN || |
| token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN, |
| isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN && |
| token.tagName !== $.MGLYPH && |
| token.tagName !== $.MALIGNMARK; |
| |
| if ((isMathMLTextStartTag || isCharacterToken) && this._isMathMLTextIntegrationPoint(current)) |
| return false; |
| |
| if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isHtmlIntegrationPoint(current)) |
| return false; |
| |
| return token.type !== Tokenizer.EOF_TOKEN; |
| }; |
| |
| Parser.prototype._processToken = function (token) { |
| _[this.insertionMode][token.type](this, token); |
| }; |
| |
| Parser.prototype._processTokenInBodyMode = function (token) { |
| _[IN_BODY_MODE][token.type](this, token); |
| }; |
| |
| Parser.prototype._processTokenInForeignContent = function (token) { |
| if (token.type === Tokenizer.CHARACTER_TOKEN) |
| characterInForeignContent(this, token); |
| |
| else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN) |
| nullCharacterInForeignContent(this, token); |
| |
| else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN) |
| insertCharacters(this, token); |
| |
| else if (token.type === Tokenizer.COMMENT_TOKEN) |
| appendComment(this, token); |
| |
| else if (token.type === Tokenizer.START_TAG_TOKEN) |
| startTagInForeignContent(this, token); |
| |
| else if (token.type === Tokenizer.END_TAG_TOKEN) |
| endTagInForeignContent(this, token); |
| }; |
| |
| Parser.prototype._processFakeStartTagWithAttrs = function (tagName, attrs) { |
| var fakeToken = this.tokenizer.buildStartTagToken(tagName); |
| |
| fakeToken.attrs = attrs; |
| this._processToken(fakeToken); |
| }; |
| |
| Parser.prototype._processFakeStartTag = function (tagName) { |
| var fakeToken = this.tokenizer.buildStartTagToken(tagName); |
| |
| this._processToken(fakeToken); |
| return fakeToken; |
| }; |
| |
| Parser.prototype._processFakeEndTag = function (tagName) { |
| var fakeToken = this.tokenizer.buildEndTagToken(tagName); |
| |
| this._processToken(fakeToken); |
| return fakeToken; |
| }; |
| |
| //Integration points |
| Parser.prototype._isMathMLTextIntegrationPoint = function (element) { |
| var tn = this.treeAdapter.getTagName(element), |
| ns = this.treeAdapter.getNamespaceURI(element); |
| |
| return ForeignContent.isMathMLTextIntegrationPoint(tn, ns); |
| }; |
| |
| Parser.prototype._isHtmlIntegrationPoint = function (element) { |
| var tn = this.treeAdapter.getTagName(element), |
| ns = this.treeAdapter.getNamespaceURI(element), |
| attrs = this.treeAdapter.getAttrList(element); |
| |
| return ForeignContent.isHtmlIntegrationPoint(tn, ns, attrs); |
| }; |
| |
| //Active formatting elements reconstruction |
| Parser.prototype._reconstructActiveFormattingElements = function () { |
| var listLength = this.activeFormattingElements.length; |
| |
| if (listLength) { |
| var unopenIdx = listLength, |
| entry = null; |
| |
| do { |
| unopenIdx--; |
| entry = this.activeFormattingElements.entries[unopenIdx]; |
| |
| if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) { |
| unopenIdx++; |
| break; |
| } |
| } while (unopenIdx > 0); |
| |
| for (var i = unopenIdx; i < listLength; i++) { |
| entry = this.activeFormattingElements.entries[i]; |
| this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element)); |
| entry.element = this.openElements.current; |
| } |
| } |
| }; |
| |
| //Close elements |
| Parser.prototype._closeTableCell = function () { |
| if (this.openElements.hasInTableScope($.TD)) |
| this._processFakeEndTag($.TD); |
| |
| else |
| this._processFakeEndTag($.TH); |
| }; |
| |
| Parser.prototype._closePElement = function () { |
| this.openElements.generateImpliedEndTagsWithExclusion($.P); |
| this.openElements.popUntilTagNamePopped($.P); |
| }; |
| |
| //Insertion modes |
| Parser.prototype._resetInsertionMode = function () { |
| for (var i = this.openElements.stackTop, last = false; i >= 0; i--) { |
| var element = this.openElements.items[i]; |
| |
| if (i === 0) { |
| last = true; |
| |
| if (this.fragmentContext) |
| element = this.fragmentContext; |
| } |
| |
| var tn = this.treeAdapter.getTagName(element), |
| newInsertionMode = INSERTION_MODE_RESET_MAP[tn]; |
| |
| if (newInsertionMode) { |
| this.insertionMode = newInsertionMode; |
| break; |
| } |
| |
| else if (!last && (tn === $.TD || tn === $.TH)) { |
| this.insertionMode = IN_CELL_MODE; |
| break; |
| } |
| |
| else if (!last && tn === $.HEAD) { |
| this.insertionMode = IN_HEAD_MODE; |
| break; |
| } |
| |
| else if (tn === $.SELECT) { |
| this._resetInsertionModeForSelect(i); |
| break; |
| } |
| |
| else if (tn === $.TEMPLATE) { |
| this.insertionMode = this.currentTmplInsertionMode; |
| break; |
| } |
| |
| else if (tn === $.HTML) { |
| this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE; |
| break; |
| } |
| |
| else if (last) { |
| this.insertionMode = IN_BODY_MODE; |
| break; |
| } |
| } |
| }; |
| |
| Parser.prototype._resetInsertionModeForSelect = function (selectIdx) { |
| if (selectIdx > 0) { |
| for (var i = selectIdx - 1; i > 0; i--) { |
| var ancestor = this.openElements.items[i], |
| tn = this.treeAdapter.getTagName(ancestor); |
| |
| if (tn === $.TEMPLATE) |
| break; |
| |
| else if (tn === $.TABLE) { |
| this.insertionMode = IN_SELECT_IN_TABLE_MODE; |
| return; |
| } |
| } |
| } |
| |
| this.insertionMode = IN_SELECT_MODE; |
| }; |
| |
| Parser.prototype._pushTmplInsertionMode = function (mode) { |
| this.tmplInsertionModeStack.push(mode); |
| this.tmplInsertionModeStackTop++; |
| this.currentTmplInsertionMode = mode; |
| }; |
| |
| Parser.prototype._popTmplInsertionMode = function () { |
| this.tmplInsertionModeStack.pop(); |
| this.tmplInsertionModeStackTop--; |
| this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop]; |
| }; |
| |
| //Foster parenting |
| Parser.prototype._isElementCausesFosterParenting = function (element) { |
| var tn = this.treeAdapter.getTagName(element); |
| |
| return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn == $.THEAD || tn === $.TR; |
| }; |
| |
| Parser.prototype._shouldFosterParentOnInsertion = function () { |
| return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current); |
| }; |
| |
| Parser.prototype._findFosterParentingLocation = function () { |
| var location = { |
| parent: null, |
| beforeElement: null |
| }; |
| |
| for (var i = this.openElements.stackTop; i >= 0; i--) { |
| var openElement = this.openElements.items[i], |
| tn = this.treeAdapter.getTagName(openElement), |
| ns = this.treeAdapter.getNamespaceURI(openElement); |
| |
| if (tn === $.TEMPLATE && ns === NS.HTML) { |
| location.parent = this.treeAdapter.getChildNodes(openElement)[0]; |
| break; |
| } |
| |
| else if (tn === $.TABLE) { |
| location.parent = this.treeAdapter.getParentNode(openElement); |
| |
| if (location.parent) |
| location.beforeElement = openElement; |
| else |
| location.parent = this.openElements.items[i - 1]; |
| |
| break; |
| } |
| } |
| |
| if (!location.parent) |
| location.parent = this.openElements.items[0]; |
| |
| return location; |
| }; |
| |
| Parser.prototype._fosterParentElement = function (element) { |
| var location = this._findFosterParentingLocation(); |
| |
| if (location.beforeElement) |
| this.treeAdapter.insertBefore(location.parent, element, location.beforeElement); |
| else |
| this.treeAdapter.appendChild(location.parent, element); |
| }; |
| |
| Parser.prototype._fosterParentText = function (chars) { |
| var location = this._findFosterParentingLocation(); |
| |
| if (location.beforeElement) |
| this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement); |
| else |
| this.treeAdapter.insertText(location.parent, chars); |
| }; |
| |
| //Special elements |
| Parser.prototype._isSpecialElement = function (element) { |
| var tn = this.treeAdapter.getTagName(element), |
| ns = this.treeAdapter.getNamespaceURI(element); |
| |
| return HTML.SPECIAL_ELEMENTS[ns][tn]; |
| }; |
| |
| //Adoption agency algorithm |
| //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency) |
| //------------------------------------------------------------------ |
| |
| //Steps 5-8 of the algorithm |
| function aaObtainFormattingElementEntry(p, token) { |
| var formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName); |
| |
| if (formattingElementEntry) { |
| if (!p.openElements.contains(formattingElementEntry.element)) { |
| p.activeFormattingElements.removeEntry(formattingElementEntry); |
| formattingElementEntry = null; |
| } |
| |
| else if (!p.openElements.hasInScope(token.tagName)) |
| formattingElementEntry = null; |
| } |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| return formattingElementEntry; |
| } |
| |
| //Steps 9 and 10 of the algorithm |
| function aaObtainFurthestBlock(p, formattingElementEntry) { |
| var furthestBlock = null; |
| |
| for (var i = p.openElements.stackTop; i >= 0; i--) { |
| var element = p.openElements.items[i]; |
| |
| if (element === formattingElementEntry.element) |
| break; |
| |
| if (p._isSpecialElement(element)) |
| furthestBlock = element; |
| } |
| |
| if (!furthestBlock) { |
| p.openElements.popUntilElementPopped(formattingElementEntry.element); |
| p.activeFormattingElements.removeEntry(formattingElementEntry); |
| } |
| |
| return furthestBlock; |
| } |
| |
| //Step 13 of the algorithm |
| function aaInnerLoop(p, furthestBlock, formattingElement) { |
| var element = null, |
| lastElement = furthestBlock, |
| nextElement = p.openElements.getCommonAncestor(furthestBlock); |
| |
| for (var i = 0; i < AA_INNER_LOOP_ITER; i++) { |
| element = nextElement; |
| |
| //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5) |
| nextElement = p.openElements.getCommonAncestor(element); |
| |
| var elementEntry = p.activeFormattingElements.getElementEntry(element); |
| |
| if (!elementEntry) { |
| p.openElements.remove(element); |
| continue; |
| } |
| |
| if (element === formattingElement) |
| break; |
| |
| element = aaRecreateElementFromEntry(p, elementEntry); |
| |
| if (lastElement === furthestBlock) |
| p.activeFormattingElements.bookmark = elementEntry; |
| |
| p.treeAdapter.detachNode(lastElement); |
| p.treeAdapter.appendChild(element, lastElement); |
| lastElement = element; |
| } |
| |
| return lastElement; |
| } |
| |
| //Step 13.7 of the algorithm |
| function aaRecreateElementFromEntry(p, elementEntry) { |
| var ns = p.treeAdapter.getNamespaceURI(elementEntry.element), |
| newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs); |
| |
| p.openElements.replace(elementEntry.element, newElement); |
| elementEntry.element = newElement; |
| |
| return newElement; |
| } |
| |
| //Step 14 of the algorithm |
| function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) { |
| if (p._isElementCausesFosterParenting(commonAncestor)) |
| p._fosterParentElement(lastElement); |
| |
| else { |
| var tn = p.treeAdapter.getTagName(commonAncestor), |
| ns = p.treeAdapter.getNamespaceURI(commonAncestor); |
| |
| if (tn === $.TEMPLATE && ns === NS.HTML) |
| commonAncestor = p.treeAdapter.getChildNodes(commonAncestor)[0]; |
| |
| p.treeAdapter.appendChild(commonAncestor, lastElement); |
| } |
| } |
| |
| //Steps 15-19 of the algorithm |
| function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) { |
| var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element), |
| token = formattingElementEntry.token, |
| newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs); |
| |
| p._adoptNodes(furthestBlock, newElement); |
| p.treeAdapter.appendChild(furthestBlock, newElement); |
| |
| p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token); |
| p.activeFormattingElements.removeEntry(formattingElementEntry); |
| |
| p.openElements.remove(formattingElementEntry.element); |
| p.openElements.insertAfter(furthestBlock, newElement); |
| } |
| |
| //Algorithm entry point |
| function callAdoptionAgency(p, token) { |
| for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) { |
| var formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry); |
| |
| if (!formattingElementEntry) |
| break; |
| |
| var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry); |
| |
| if (!furthestBlock) |
| break; |
| |
| p.activeFormattingElements.bookmark = formattingElementEntry; |
| |
| var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element), |
| commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element); |
| |
| p.treeAdapter.detachNode(lastElement); |
| aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement); |
| aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry); |
| } |
| } |
| |
| |
| //Generic token handlers |
| //------------------------------------------------------------------ |
| function ignoreToken(p, token) { |
| //NOTE: do nothing =) |
| } |
| |
| function appendComment(p, token) { |
| p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current) |
| } |
| |
| function appendCommentToRootHtmlElement(p, token) { |
| p._appendCommentNode(token, p.openElements.items[0]); |
| } |
| |
| function appendCommentToDocument(p, token) { |
| p._appendCommentNode(token, p.document); |
| } |
| |
| function insertCharacters(p, token) { |
| p._insertCharacters(token); |
| } |
| |
| function stopParsing(p, token) { |
| p.stopped = true; |
| } |
| |
| //12.2.5.4.1 The "initial" insertion mode |
| //------------------------------------------------------------------ |
| function doctypeInInitialMode(p, token) { |
| p._setDocumentType(token); |
| |
| if (token.forceQuirks || Doctype.isQuirks(token.name, token.publicId, token.systemId)) |
| p.treeAdapter.setQuirksMode(p.document); |
| |
| p.insertionMode = BEFORE_HTML_MODE; |
| } |
| |
| function tokenInInitialMode(p, token) { |
| p.treeAdapter.setQuirksMode(p.document); |
| p.insertionMode = BEFORE_HTML_MODE; |
| p._processToken(token); |
| } |
| |
| |
| //12.2.5.4.2 The "before html" insertion mode |
| //------------------------------------------------------------------ |
| function startTagBeforeHtml(p, token) { |
| if (token.tagName === $.HTML) { |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = BEFORE_HEAD_MODE; |
| } |
| |
| else |
| tokenBeforeHtml(p, token); |
| } |
| |
| function endTagBeforeHtml(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR) |
| tokenBeforeHtml(p, token); |
| } |
| |
| function tokenBeforeHtml(p, token) { |
| p._insertFakeRootElement(); |
| p.insertionMode = BEFORE_HEAD_MODE; |
| p._processToken(token); |
| } |
| |
| |
| //12.2.5.4.3 The "before head" insertion mode |
| //------------------------------------------------------------------ |
| function startTagBeforeHead(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.HEAD) { |
| p._insertElement(token, NS.HTML); |
| p.headElement = p.openElements.current; |
| p.insertionMode = IN_HEAD_MODE; |
| } |
| |
| else |
| tokenBeforeHead(p, token); |
| } |
| |
| function endTagBeforeHead(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR) |
| tokenBeforeHead(p, token); |
| } |
| |
| function tokenBeforeHead(p, token) { |
| p._processFakeStartTag($.HEAD); |
| p._processToken(token); |
| } |
| |
| |
| //12.2.5.4.4 The "in head" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInHead(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || |
| tn === $.COMMAND || tn === $.LINK || tn === $.META) { |
| p._appendElement(token, NS.HTML); |
| } |
| |
| else if (tn === $.TITLE) |
| p._switchToTextParsing(token, Tokenizer.MODE.RCDATA); |
| |
| //NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse |
| //<noscript> as a rawtext. |
| else if (tn === $.NOSCRIPT || tn === $.NOFRAMES || tn === $.STYLE) |
| p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); |
| |
| else if (tn === $.SCRIPT) |
| p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA); |
| |
| else if (tn === $.TEMPLATE) { |
| p._insertTemplate(token, NS.HTML); |
| p.activeFormattingElements.insertMarker(); |
| p.framesetOk = false; |
| p.insertionMode = IN_TEMPLATE_MODE; |
| p._pushTmplInsertionMode(IN_TEMPLATE_MODE); |
| } |
| |
| else if (tn !== $.HEAD) |
| tokenInHead(p, token); |
| } |
| |
| function endTagInHead(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HEAD) { |
| p.openElements.pop(); |
| p.insertionMode = AFTER_HEAD_MODE; |
| } |
| |
| else if (tn === $.BODY || tn === $.BR || tn === $.HTML) |
| tokenInHead(p, token); |
| |
| else if (tn === $.TEMPLATE && p.openElements.tmplCount > 0) { |
| p.openElements.generateImpliedEndTags(); |
| p.openElements.popUntilTemplatePopped(); |
| p.activeFormattingElements.clearToLastMarker(); |
| p._popTmplInsertionMode(); |
| p._resetInsertionMode(); |
| } |
| } |
| |
| function tokenInHead(p, token) { |
| p._processFakeEndTag($.HEAD); |
| p._processToken(token); |
| } |
| |
| |
| //12.2.5.4.6 The "after head" insertion mode |
| //------------------------------------------------------------------ |
| function startTagAfterHead(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.BODY) { |
| p._insertElement(token, NS.HTML); |
| p.framesetOk = false; |
| p.insertionMode = IN_BODY_MODE; |
| } |
| |
| else if (tn === $.FRAMESET) { |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = IN_FRAMESET_MODE; |
| } |
| |
| else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META || |
| tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) { |
| p.openElements.push(p.headElement); |
| startTagInHead(p, token); |
| p.openElements.remove(p.headElement); |
| } |
| |
| else if (tn !== $.HEAD) |
| tokenAfterHead(p, token); |
| } |
| |
| function endTagAfterHead(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.BODY || tn === $.HTML || tn === $.BR) |
| tokenAfterHead(p, token); |
| |
| else if (tn === $.TEMPLATE) |
| endTagInHead(p, token); |
| } |
| |
| function tokenAfterHead(p, token) { |
| p._processFakeStartTag($.BODY); |
| p.framesetOk = true; |
| p._processToken(token); |
| } |
| |
| |
| //12.2.5.4.7 The "in body" insertion mode |
| //------------------------------------------------------------------ |
| function whitespaceCharacterInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._insertCharacters(token); |
| } |
| |
| function characterInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._insertCharacters(token); |
| p.framesetOk = false; |
| } |
| |
| function htmlStartTagInBody(p, token) { |
| if (p.openElements.tmplCount === 0) |
| p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs); |
| } |
| |
| function bodyStartTagInBody(p, token) { |
| var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement(); |
| |
| if (bodyElement && p.openElements.tmplCount === 0) { |
| p.framesetOk = false; |
| p.treeAdapter.adoptAttributes(bodyElement, token.attrs); |
| } |
| } |
| |
| function framesetStartTagInBody(p, token) { |
| var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement(); |
| |
| if (p.framesetOk && bodyElement) { |
| p.treeAdapter.detachNode(bodyElement); |
| p.openElements.popAllUpToHtmlElement(); |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = IN_FRAMESET_MODE; |
| } |
| } |
| |
| function addressStartTagInBody(p, token) { |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._insertElement(token, NS.HTML); |
| } |
| |
| function numberedHeaderStartTagInBody(p, token) { |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| var tn = p.openElements.currentTagName; |
| |
| if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) |
| p.openElements.pop(); |
| |
| p._insertElement(token, NS.HTML); |
| } |
| |
| function preStartTagInBody(p, token) { |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._insertElement(token, NS.HTML); |
| //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move |
| //on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.) |
| p.skipNextNewLine = true; |
| p.framesetOk = false; |
| } |
| |
| function formStartTagInBody(p, token) { |
| var inTemplate = p.openElements.tmplCount > 0; |
| |
| if (!p.formElement || inTemplate) { |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._insertElement(token, NS.HTML); |
| |
| if (!inTemplate) |
| p.formElement = p.openElements.current; |
| } |
| } |
| |
| function listItemStartTagInBody(p, token) { |
| p.framesetOk = false; |
| |
| for (var i = p.openElements.stackTop; i >= 0; i--) { |
| var element = p.openElements.items[i], |
| tn = p.treeAdapter.getTagName(element); |
| |
| if ((token.tagName === $.LI && tn === $.LI) || |
| ((token.tagName === $.DD || token.tagName === $.DT) && (tn === $.DD || tn == $.DT))) { |
| p._processFakeEndTag(tn); |
| break; |
| } |
| |
| if (tn !== $.ADDRESS && tn !== $.DIV && tn !== $.P && p._isSpecialElement(element)) |
| break; |
| } |
| |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._insertElement(token, NS.HTML); |
| } |
| |
| function plaintextStartTagInBody(p, token) { |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._insertElement(token, NS.HTML); |
| p.tokenizer.state = Tokenizer.MODE.PLAINTEXT; |
| } |
| |
| function buttonStartTagInBody(p, token) { |
| if (p.openElements.hasInScope($.BUTTON)) { |
| p._processFakeEndTag($.BUTTON); |
| buttonStartTagInBody(p, token); |
| } |
| |
| else { |
| p._reconstructActiveFormattingElements(); |
| p._insertElement(token, NS.HTML); |
| p.framesetOk = false; |
| } |
| } |
| |
| function aStartTagInBody(p, token) { |
| var activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A); |
| |
| if (activeElementEntry) { |
| p._processFakeEndTag($.A); |
| p.openElements.remove(activeElementEntry.element); |
| p.activeFormattingElements.removeEntry(activeElementEntry); |
| } |
| |
| p._reconstructActiveFormattingElements(); |
| p._insertElement(token, NS.HTML); |
| p.activeFormattingElements.pushElement(p.openElements.current, token); |
| } |
| |
| function bStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._insertElement(token, NS.HTML); |
| p.activeFormattingElements.pushElement(p.openElements.current, token); |
| } |
| |
| function nobrStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| |
| if (p.openElements.hasInScope($.NOBR)) { |
| p._processFakeEndTag($.NOBR); |
| p._reconstructActiveFormattingElements(); |
| } |
| |
| p._insertElement(token, NS.HTML); |
| p.activeFormattingElements.pushElement(p.openElements.current, token); |
| } |
| |
| function appletStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._insertElement(token, NS.HTML); |
| p.activeFormattingElements.insertMarker(); |
| p.framesetOk = false; |
| } |
| |
| function tableStartTagInBody(p, token) { |
| if (!p.treeAdapter.isQuirksMode(p.document) && p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._insertElement(token, NS.HTML); |
| p.framesetOk = false; |
| p.insertionMode = IN_TABLE_MODE; |
| } |
| |
| function areaStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._appendElement(token, NS.HTML); |
| p.framesetOk = false; |
| } |
| |
| function inputStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._appendElement(token, NS.HTML); |
| |
| var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE); |
| |
| if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE) |
| p.framesetOk = false; |
| |
| } |
| |
| function paramStartTagInBody(p, token) { |
| p._appendElement(token, NS.HTML); |
| } |
| |
| function hrStartTagInBody(p, token) { |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._appendElement(token, NS.HTML); |
| p.framesetOk = false; |
| } |
| |
| function imageStartTagInBody(p, token) { |
| token.tagName = $.IMG; |
| areaStartTagInBody(p, token); |
| } |
| |
| function isindexStartTagInBody(p, token) { |
| if (!p.formElement || p.openElements.tmplCount > 0) { |
| p._processFakeStartTagWithAttrs($.FORM, getSearchableIndexFormAttrs(token)); |
| p._processFakeStartTag($.HR); |
| p._processFakeStartTag($.LABEL); |
| p.treeAdapter.insertText(p.openElements.current, getSearchableIndexLabelText(token)); |
| p._processFakeStartTagWithAttrs($.INPUT, getSearchableIndexInputAttrs(token)); |
| p._processFakeEndTag($.LABEL); |
| p._processFakeStartTag($.HR); |
| p._processFakeEndTag($.FORM); |
| } |
| } |
| |
| function textareaStartTagInBody(p, token) { |
| p._insertElement(token, NS.HTML); |
| //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move |
| //on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.) |
| p.skipNextNewLine = true; |
| p.tokenizer.state = Tokenizer.MODE.RCDATA; |
| p.originalInsertionMode = p.insertionMode; |
| p.framesetOk = false; |
| p.insertionMode = TEXT_MODE; |
| } |
| |
| function xmpStartTagInBody(p, token) { |
| if (p.openElements.hasInButtonScope($.P)) |
| p._closePElement(); |
| |
| p._reconstructActiveFormattingElements(); |
| p.framesetOk = false; |
| p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); |
| } |
| |
| function iframeStartTagInBody(p, token) { |
| p.framesetOk = false; |
| p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); |
| } |
| |
| //NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse |
| //<noembed> as a rawtext. |
| function noembedStartTagInBody(p, token) { |
| p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); |
| } |
| |
| function selectStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._insertElement(token, NS.HTML); |
| p.framesetOk = false; |
| |
| if (p.insertionMode === IN_TABLE_MODE || p.insertionMode === IN_CAPTION_MODE || |
| p.insertionMode === IN_TABLE_BODY_MODE || p.insertionMode === IN_ROW_MODE || |
| p.insertionMode === IN_CELL_MODE) { |
| p.insertionMode = IN_SELECT_IN_TABLE_MODE; |
| } |
| |
| else |
| p.insertionMode = IN_SELECT_MODE; |
| } |
| |
| function optgroupStartTagInBody(p, token) { |
| if (p.openElements.currentTagName === $.OPTION) |
| p._processFakeEndTag($.OPTION); |
| |
| p._reconstructActiveFormattingElements(); |
| p._insertElement(token, NS.HTML); |
| } |
| |
| function rpStartTagInBody(p, token) { |
| if (p.openElements.hasInScope($.RUBY)) |
| p.openElements.generateImpliedEndTags(); |
| |
| p._insertElement(token, NS.HTML); |
| } |
| |
| function menuitemStartTagInBody(p, token) { |
| p._appendElement(token, NS.HTML); |
| } |
| |
| function mathStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| |
| ForeignContent.adjustTokenMathMLAttrs(token); |
| ForeignContent.adjustTokenXMLAttrs(token); |
| |
| if (token.selfClosing) |
| p._appendElement(token, NS.MATHML); |
| else |
| p._insertElement(token, NS.MATHML); |
| } |
| |
| function svgStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| |
| ForeignContent.adjustTokenSVGAttrs(token); |
| ForeignContent.adjustTokenXMLAttrs(token); |
| |
| if (token.selfClosing) |
| p._appendElement(token, NS.SVG); |
| else |
| p._insertElement(token, NS.SVG); |
| } |
| |
| function genericStartTagInBody(p, token) { |
| p._reconstructActiveFormattingElements(); |
| p._insertElement(token, NS.HTML); |
| } |
| |
| //OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. |
| //It's faster than using dictionary. |
| function startTagInBody(p, token) { |
| var tn = token.tagName; |
| |
| switch (tn.length) { |
| case 1: |
| if (tn === $.I || tn === $.S || tn === $.B || tn === $.U) |
| bStartTagInBody(p, token); |
| |
| else if (tn === $.P) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.A) |
| aStartTagInBody(p, token); |
| |
| else |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 2: |
| if (tn === $.DL || tn === $.OL || tn === $.UL) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) |
| numberedHeaderStartTagInBody(p, token); |
| |
| else if (tn === $.LI || tn === $.DD || tn === $.DT) |
| listItemStartTagInBody(p, token); |
| |
| else if (tn === $.EM || tn === $.TT) |
| bStartTagInBody(p, token); |
| |
| else if (tn === $.BR) |
| areaStartTagInBody(p, token); |
| |
| else if (tn === $.HR) |
| hrStartTagInBody(p, token); |
| |
| else if (tn === $.RP || tn === $.RT) |
| rpStartTagInBody(p, token); |
| |
| else if (tn !== $.TH && tn !== $.TD && tn !== $.TR) |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 3: |
| if (tn === $.DIV || tn === $.DIR || tn === $.NAV) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.PRE) |
| preStartTagInBody(p, token); |
| |
| else if (tn === $.BIG) |
| bStartTagInBody(p, token); |
| |
| else if (tn === $.IMG || tn === $.WBR) |
| areaStartTagInBody(p, token); |
| |
| else if (tn === $.XMP) |
| xmpStartTagInBody(p, token); |
| |
| else if (tn === $.SVG) |
| svgStartTagInBody(p, token); |
| |
| else if (tn !== $.COL) |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 4: |
| if (tn === $.HTML) |
| htmlStartTagInBody(p, token); |
| |
| else if (tn === $.BASE || tn === $.LINK || tn === $.META) |
| startTagInHead(p, token); |
| |
| else if (tn === $.BODY) |
| bodyStartTagInBody(p, token); |
| |
| else if (tn === $.MAIN || tn === $.MENU) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.FORM) |
| formStartTagInBody(p, token); |
| |
| else if (tn === $.CODE || tn === $.FONT) |
| bStartTagInBody(p, token); |
| |
| else if (tn === $.NOBR) |
| nobrStartTagInBody(p, token); |
| |
| else if (tn === $.AREA) |
| areaStartTagInBody(p, token); |
| |
| else if (tn === $.MATH) |
| mathStartTagInBody(p, token); |
| |
| else if (tn !== $.HEAD) |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 5: |
| if (tn === $.STYLE || tn === $.TITLE) |
| startTagInHead(p, token); |
| |
| else if (tn === $.ASIDE) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.SMALL) |
| bStartTagInBody(p, token); |
| |
| else if (tn === $.TABLE) |
| tableStartTagInBody(p, token); |
| |
| else if (tn === $.EMBED) |
| areaStartTagInBody(p, token); |
| |
| else if (tn === $.INPUT) |
| inputStartTagInBody(p, token); |
| |
| else if (tn === $.PARAM || tn === $.TRACK) |
| paramStartTagInBody(p, token); |
| |
| else if (tn === $.IMAGE) |
| imageStartTagInBody(p, token); |
| |
| else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD) |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 6: |
| if (tn === $.SCRIPT) |
| startTagInHead(p, token); |
| |
| else if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.BUTTON) |
| buttonStartTagInBody(p, token); |
| |
| else if (tn === $.STRIKE || tn === $.STRONG) |
| bStartTagInBody(p, token); |
| |
| else if (tn === $.APPLET || tn === $.OBJECT) |
| appletStartTagInBody(p, token); |
| |
| else if (tn === $.KEYGEN) |
| areaStartTagInBody(p, token); |
| |
| else if (tn === $.SOURCE) |
| paramStartTagInBody(p, token); |
| |
| else if (tn === $.IFRAME) |
| iframeStartTagInBody(p, token); |
| |
| else if (tn === $.SELECT) |
| selectStartTagInBody(p, token); |
| |
| else if (tn === $.OPTION) |
| optgroupStartTagInBody(p, token); |
| |
| else |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 7: |
| if (tn === $.BGSOUND || tn === $.COMMAND) |
| startTagInHead(p, token); |
| |
| else if (tn === $.DETAILS || tn === $.ADDRESS || tn === $.ARTICLE || tn === $.SECTION || tn === $.SUMMARY) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.LISTING) |
| preStartTagInBody(p, token); |
| |
| else if (tn === $.MARQUEE) |
| appletStartTagInBody(p, token); |
| |
| else if (tn === $.ISINDEX) |
| isindexStartTagInBody(p, token); |
| |
| else if (tn === $.NOEMBED) |
| noembedStartTagInBody(p, token); |
| |
| else if (tn !== $.CAPTION) |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 8: |
| if (tn === $.BASEFONT || tn === $.MENUITEM) |
| menuitemStartTagInBody(p, token); |
| |
| else if (tn === $.FRAMESET) |
| framesetStartTagInBody(p, token); |
| |
| else if (tn === $.FIELDSET) |
| addressStartTagInBody(p, token); |
| |
| else if (tn === $.TEXTAREA) |
| textareaStartTagInBody(p, token); |
| |
| else if (tn === $.TEMPLATE) |
| startTagInHead(p, token); |
| |
| else if (tn === $.NOSCRIPT) |
| noembedStartTagInBody(p, token); |
| |
| else if (tn === $.OPTGROUP) |
| optgroupStartTagInBody(p, token); |
| |
| else if (tn !== $.COLGROUP) |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 9: |
| if (tn === $.PLAINTEXT) |
| plaintextStartTagInBody(p, token); |
| |
| else |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| case 10: |
| if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) |
| addressStartTagInBody(p, token); |
| |
| else |
| genericStartTagInBody(p, token); |
| |
| break; |
| |
| default: |
| genericStartTagInBody(p, token); |
| } |
| } |
| |
| function bodyEndTagInBody(p, token) { |
| if (p.openElements.hasInScope($.BODY)) |
| p.insertionMode = AFTER_BODY_MODE; |
| |
| else |
| token.ignored = true; |
| } |
| |
| function htmlEndTagInBody(p, token) { |
| var fakeToken = p._processFakeEndTag($.BODY); |
| |
| if (!fakeToken.ignored) |
| p._processToken(token); |
| } |
| |
| function addressEndTagInBody(p, token) { |
| var tn = token.tagName; |
| |
| if (p.openElements.hasInScope(tn)) { |
| p.openElements.generateImpliedEndTags(); |
| p.openElements.popUntilTagNamePopped(tn); |
| } |
| } |
| |
| function formEndTagInBody(p, token) { |
| var inTemplate = p.openElements.tmplCount > 0, |
| formElement = p.formElement; |
| |
| if (!inTemplate) |
| p.formElement = null; |
| |
| if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) { |
| p.openElements.generateImpliedEndTags(); |
| |
| if (inTemplate) |
| p.openElements.popUntilTagNamePopped($.FORM); |
| |
| else |
| p.openElements.remove(formElement); |
| } |
| } |
| |
| function pEndTagInBody(p, token) { |
| if (p.openElements.hasInButtonScope($.P)) { |
| p.openElements.generateImpliedEndTagsWithExclusion($.P); |
| p.openElements.popUntilTagNamePopped($.P); |
| } |
| |
| else { |
| p._processFakeStartTag($.P); |
| p._processToken(token); |
| } |
| } |
| |
| function liEndTagInBody(p, token) { |
| if (p.openElements.hasInListItemScope($.LI)) { |
| p.openElements.generateImpliedEndTagsWithExclusion($.LI); |
| p.openElements.popUntilTagNamePopped($.LI); |
| } |
| } |
| |
| function ddEndTagInBody(p, token) { |
| var tn = token.tagName; |
| |
| if (p.openElements.hasInScope(tn)) { |
| p.openElements.generateImpliedEndTagsWithExclusion(tn); |
| p.openElements.popUntilTagNamePopped(tn); |
| } |
| } |
| |
| function numberedHeaderEndTagInBody(p, token) { |
| if (p.openElements.hasNumberedHeaderInScope()) { |
| p.openElements.generateImpliedEndTags(); |
| p.openElements.popUntilNumberedHeaderPopped(); |
| } |
| } |
| |
| function appletEndTagInBody(p, token) { |
| var tn = token.tagName; |
| |
| if (p.openElements.hasInScope(tn)) { |
| p.openElements.generateImpliedEndTags(); |
| p.openElements.popUntilTagNamePopped(tn); |
| p.activeFormattingElements.clearToLastMarker(); |
| } |
| } |
| |
| function brEndTagInBody(p, token) { |
| p._processFakeStartTag($.BR); |
| } |
| |
| function genericEndTagInBody(p, token) { |
| var tn = token.tagName; |
| |
| for (var i = p.openElements.stackTop; i > 0; i--) { |
| var element = p.openElements.items[i]; |
| |
| if (p.treeAdapter.getTagName(element) === tn) { |
| p.openElements.generateImpliedEndTagsWithExclusion(tn); |
| p.openElements.popUntilElementPopped(element); |
| break; |
| } |
| |
| if (p._isSpecialElement(element)) |
| break; |
| } |
| } |
| |
| //OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. |
| //It's faster than using dictionary. |
| function endTagInBody(p, token) { |
| var tn = token.tagName; |
| |
| switch (tn.length) { |
| case 1: |
| if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn == $.U) |
| callAdoptionAgency(p, token); |
| |
| else if (tn === $.P) |
| pEndTagInBody(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 2: |
| if (tn == $.DL || tn === $.UL || tn === $.OL) |
| addressEndTagInBody(p, token); |
| |
| else if (tn === $.LI) |
| liEndTagInBody(p, token); |
| |
| else if (tn === $.DD || tn === $.DT) |
| ddEndTagInBody(p, token); |
| |
| else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) |
| numberedHeaderEndTagInBody(p, token); |
| |
| else if (tn === $.BR) |
| brEndTagInBody(p, token); |
| |
| else if (tn === $.EM || tn === $.TT) |
| callAdoptionAgency(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 3: |
| if (tn === $.BIG) |
| callAdoptionAgency(p, token); |
| |
| else if (tn === $.DIR || tn === $.DIV || tn === $.NAV) |
| addressEndTagInBody(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 4: |
| if (tn === $.BODY) |
| bodyEndTagInBody(p, token); |
| |
| else if (tn === $.HTML) |
| htmlEndTagInBody(p, token); |
| |
| else if (tn === $.FORM) |
| formEndTagInBody(p, token); |
| |
| else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR) |
| callAdoptionAgency(p, token); |
| |
| else if (tn === $.MAIN || tn === $.MENU) |
| addressEndTagInBody(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 5: |
| if (tn === $.ASIDE) |
| addressEndTagInBody(p, token); |
| |
| else if (tn === $.SMALL) |
| callAdoptionAgency(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 6: |
| if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP) |
| addressEndTagInBody(p, token); |
| |
| else if (tn === $.APPLET || tn === $.OBJECT) |
| appletEndTagInBody(p, token); |
| |
| else if (tn == $.STRIKE || tn === $.STRONG) |
| callAdoptionAgency(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 7: |
| if (tn === $.ADDRESS || tn === $.ARTICLE || tn === $.DETAILS || tn === $.SECTION || tn === $.SUMMARY) |
| addressEndTagInBody(p, token); |
| |
| else if (tn === $.MARQUEE) |
| appletEndTagInBody(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 8: |
| if (tn === $.FIELDSET) |
| addressEndTagInBody(p, token); |
| |
| else if (tn === $.TEMPLATE) |
| endTagInHead(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| case 10: |
| if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) |
| addressEndTagInBody(p, token); |
| |
| else |
| genericEndTagInBody(p, token); |
| |
| break; |
| |
| default : |
| genericEndTagInBody(p, token); |
| } |
| } |
| |
| function eofInBody(p, token) { |
| if (p.tmplInsertionModeStackTop > -1) |
| eofInTemplate(p, token); |
| |
| else |
| p.stopped = true; |
| } |
| |
| //12.2.5.4.8 The "text" insertion mode |
| //------------------------------------------------------------------ |
| function endTagInText(p, token) { |
| if (!p.fragmentContext && p.scriptHandler && token.tagName === $.SCRIPT) |
| p.scriptHandler(p.document, p.openElements.current); |
| |
| p.openElements.pop(); |
| p.insertionMode = p.originalInsertionMode; |
| } |
| |
| |
| function eofInText(p, token) { |
| p.openElements.pop(); |
| p.insertionMode = p.originalInsertionMode; |
| p._processToken(token); |
| } |
| |
| |
| //12.2.5.4.9 The "in table" insertion mode |
| //------------------------------------------------------------------ |
| function characterInTable(p, token) { |
| var curTn = p.openElements.currentTagName; |
| |
| if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) { |
| p.pendingCharacterTokens = []; |
| p.hasNonWhitespacePendingCharacterToken = false; |
| p.originalInsertionMode = p.insertionMode; |
| p.insertionMode = IN_TABLE_TEXT_MODE; |
| p._processToken(token); |
| } |
| |
| else |
| tokenInTable(p, token); |
| } |
| |
| function captionStartTagInTable(p, token) { |
| p.openElements.clearBackToTableContext(); |
| p.activeFormattingElements.insertMarker(); |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = IN_CAPTION_MODE; |
| } |
| |
| function colgroupStartTagInTable(p, token) { |
| p.openElements.clearBackToTableContext(); |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = IN_COLUMN_GROUP_MODE; |
| } |
| |
| function colStartTagInTable(p, token) { |
| p._processFakeStartTag($.COLGROUP); |
| p._processToken(token); |
| } |
| |
| function tbodyStartTagInTable(p, token) { |
| p.openElements.clearBackToTableContext(); |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = IN_TABLE_BODY_MODE; |
| } |
| |
| function tdStartTagInTable(p, token) { |
| p._processFakeStartTag($.TBODY); |
| p._processToken(token); |
| } |
| |
| function tableStartTagInTable(p, token) { |
| var fakeToken = p._processFakeEndTag($.TABLE); |
| |
| //NOTE: The fake end tag token here can only be ignored in the fragment case. |
| if (!fakeToken.ignored) |
| p._processToken(token); |
| } |
| |
| function inputStartTagInTable(p, token) { |
| var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE); |
| |
| if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE) |
| p._appendElement(token, NS.HTML); |
| |
| else |
| tokenInTable(p, token); |
| } |
| |
| function formStartTagInTable(p, token) { |
| if (!p.formElement && p.openElements.tmplCount === 0) { |
| p._insertElement(token, NS.HTML); |
| p.formElement = p.openElements.current; |
| p.openElements.pop(); |
| } |
| } |
| |
| function startTagInTable(p, token) { |
| var tn = token.tagName; |
| |
| switch (tn.length) { |
| case 2: |
| if (tn === $.TD || tn === $.TH || tn === $.TR) |
| tdStartTagInTable(p, token); |
| |
| else |
| tokenInTable(p, token); |
| |
| break; |
| |
| case 3: |
| if (tn === $.COL) |
| colStartTagInTable(p, token); |
| |
| else |
| tokenInTable(p, token); |
| |
| break; |
| |
| case 4: |
| if (tn === $.FORM) |
| formStartTagInTable(p, token); |
| |
| else |
| tokenInTable(p, token); |
| |
| break; |
| |
| case 5: |
| if (tn === $.TABLE) |
| tableStartTagInTable(p, token); |
| |
| else if (tn === $.STYLE) |
| startTagInHead(p, token); |
| |
| else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) |
| tbodyStartTagInTable(p, token); |
| |
| else if (tn === $.INPUT) |
| inputStartTagInTable(p, token); |
| |
| else |
| tokenInTable(p, token); |
| |
| break; |
| |
| case 6: |
| if (tn === $.SCRIPT) |
| startTagInHead(p, token); |
| |
| else |
| tokenInTable(p, token); |
| |
| break; |
| |
| case 7: |
| if (tn === $.CAPTION) |
| captionStartTagInTable(p, token); |
| |
| else |
| tokenInTable(p, token); |
| |
| break; |
| |
| case 8: |
| if (tn === $.COLGROUP) |
| colgroupStartTagInTable(p, token); |
| |
| else if (tn === $.TEMPLATE) |
| startTagInHead(p, token); |
| |
| else |
| tokenInTable(p, token); |
| |
| break; |
| |
| default: |
| tokenInTable(p, token); |
| } |
| |
| } |
| |
| function endTagInTable(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.TABLE) { |
| if (p.openElements.hasInTableScope($.TABLE)) { |
| p.openElements.popUntilTagNamePopped($.TABLE); |
| p._resetInsertionMode(); |
| } |
| |
| else |
| token.ignored = true; |
| } |
| |
| else if (tn === $.TEMPLATE) |
| endTagInHead(p, token); |
| |
| else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && |
| tn !== $.TBODY && tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) { |
| tokenInTable(p, token); |
| } |
| } |
| |
| function tokenInTable(p, token) { |
| var savedFosterParentingState = p.fosterParentingEnabled; |
| |
| p.fosterParentingEnabled = true; |
| p._processTokenInBodyMode(token); |
| p.fosterParentingEnabled = savedFosterParentingState; |
| } |
| |
| |
| //12.2.5.4.10 The "in table text" insertion mode |
| //------------------------------------------------------------------ |
| function whitespaceCharacterInTableText(p, token) { |
| p.pendingCharacterTokens.push(token); |
| } |
| |
| function characterInTableText(p, token) { |
| p.pendingCharacterTokens.push(token); |
| p.hasNonWhitespacePendingCharacterToken = true; |
| } |
| |
| function tokenInTableText(p, token) { |
| if (p.hasNonWhitespacePendingCharacterToken) { |
| for (var i = 0; i < p.pendingCharacterTokens.length; i++) |
| tokenInTable(p, p.pendingCharacterTokens[i]); |
| } |
| |
| else { |
| for (var i = 0; i < p.pendingCharacterTokens.length; i++) |
| p._insertCharacters(p.pendingCharacterTokens[i]); |
| } |
| |
| p.insertionMode = p.originalInsertionMode; |
| p._processToken(token); |
| } |
| |
| |
| //12.2.5.4.11 The "in caption" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInCaption(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY || |
| tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) { |
| var fakeToken = p._processFakeEndTag($.CAPTION); |
| |
| //NOTE: The fake end tag token here can only be ignored in the fragment case. |
| if (!fakeToken.ignored) |
| p._processToken(token); |
| } |
| |
| else |
| startTagInBody(p, token); |
| } |
| |
| function endTagInCaption(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.CAPTION) { |
| if (p.openElements.hasInTableScope($.CAPTION)) { |
| p.openElements.generateImpliedEndTags(); |
| p.openElements.popUntilTagNamePopped($.CAPTION); |
| p.activeFormattingElements.clearToLastMarker(); |
| p.insertionMode = IN_TABLE_MODE; |
| } |
| |
| else |
| token.ignored = true; |
| } |
| |
| else if (tn === $.TABLE) { |
| var fakeToken = p._processFakeEndTag($.CAPTION); |
| |
| //NOTE: The fake end tag token here can only be ignored in the fragment case. |
| if (!fakeToken.ignored) |
| p._processToken(token); |
| } |
| |
| else if (tn !== $.BODY && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && tn !== $.TBODY && |
| tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) { |
| endTagInBody(p, token); |
| } |
| } |
| |
| |
| //12.2.5.4.12 The "in column group" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInColumnGroup(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.COL) |
| p._appendElement(token, NS.HTML); |
| |
| else if (tn === $.TEMPLATE) |
| startTagInHead(p, token); |
| |
| else |
| tokenInColumnGroup(p, token); |
| } |
| |
| function endTagInColumnGroup(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.COLGROUP) { |
| if (p.openElements.currentTagName !== $.COLGROUP) |
| token.ignored = true; |
| |
| else { |
| p.openElements.pop(); |
| p.insertionMode = IN_TABLE_MODE; |
| } |
| } |
| |
| else if (tn === $.TEMPLATE) |
| endTagInHead(p, token); |
| |
| else if (tn !== $.COL) |
| tokenInColumnGroup(p, token); |
| } |
| |
| function tokenInColumnGroup(p, token) { |
| var fakeToken = p._processFakeEndTag($.COLGROUP); |
| |
| //NOTE: The fake end tag token here can only be ignored in the fragment case. |
| if (!fakeToken.ignored) |
| p._processToken(token); |
| } |
| |
| //12.2.5.4.13 The "in table body" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInTableBody(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.TR) { |
| p.openElements.clearBackToTableBodyContext(); |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = IN_ROW_MODE; |
| } |
| |
| else if (tn === $.TH || tn === $.TD) { |
| p._processFakeStartTag($.TR); |
| p._processToken(token); |
| } |
| |
| else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || |
| tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { |
| |
| if (p.openElements.hasTableBodyContextInTableScope()) { |
| p.openElements.clearBackToTableBodyContext(); |
| p._processFakeEndTag(p.openElements.currentTagName); |
| p._processToken(token); |
| } |
| } |
| |
| else |
| startTagInTable(p, token); |
| } |
| |
| function endTagInTableBody(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { |
| if (p.openElements.hasInTableScope(tn)) { |
| p.openElements.clearBackToTableBodyContext(); |
| p.openElements.pop(); |
| p.insertionMode = IN_TABLE_MODE; |
| } |
| } |
| |
| else if (tn === $.TABLE) { |
| if (p.openElements.hasTableBodyContextInTableScope()) { |
| p.openElements.clearBackToTableBodyContext(); |
| p._processFakeEndTag(p.openElements.currentTagName); |
| p._processToken(token); |
| } |
| } |
| |
| else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP || |
| tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR) { |
| endTagInTable(p, token); |
| } |
| } |
| |
| //12.2.5.4.14 The "in row" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInRow(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.TH || tn === $.TD) { |
| p.openElements.clearBackToTableRowContext(); |
| p._insertElement(token, NS.HTML); |
| p.insertionMode = IN_CELL_MODE; |
| p.activeFormattingElements.insertMarker(); |
| } |
| |
| else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY || |
| tn === $.TFOOT || tn === $.THEAD || tn === $.TR) { |
| var fakeToken = p._processFakeEndTag($.TR); |
| |
| //NOTE: The fake end tag token here can only be ignored in the fragment case. |
| if (!fakeToken.ignored) |
| p._processToken(token); |
| } |
| |
| else |
| startTagInTable(p, token); |
| } |
| |
| function endTagInRow(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.TR) { |
| if (p.openElements.hasInTableScope($.TR)) { |
| p.openElements.clearBackToTableRowContext(); |
| p.openElements.pop(); |
| p.insertionMode = IN_TABLE_BODY_MODE; |
| } |
| |
| else |
| token.ignored = true; |
| } |
| |
| else if (tn === $.TABLE) { |
| var fakeToken = p._processFakeEndTag($.TR); |
| |
| //NOTE: The fake end tag token here can only be ignored in the fragment case. |
| if (!fakeToken.ignored) |
| p._processToken(token); |
| } |
| |
| else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { |
| if (p.openElements.hasInTableScope(tn)) { |
| p._processFakeEndTag($.TR); |
| p._processToken(token); |
| } |
| } |
| |
| else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP || |
| tn !== $.HTML && tn !== $.TD && tn !== $.TH) { |
| endTagInTable(p, token); |
| } |
| } |
| |
| |
| //12.2.5.4.15 The "in cell" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInCell(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY || |
| tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) { |
| |
| if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) { |
| p._closeTableCell(); |
| p._processToken(token); |
| } |
| } |
| |
| else |
| startTagInBody(p, token); |
| } |
| |
| function endTagInCell(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.TD || tn === $.TH) { |
| if (p.openElements.hasInTableScope(tn)) { |
| p.openElements.generateImpliedEndTags(); |
| p.openElements.popUntilTagNamePopped(tn); |
| p.activeFormattingElements.clearToLastMarker(); |
| p.insertionMode = IN_ROW_MODE; |
| } |
| } |
| |
| else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) { |
| if (p.openElements.hasInTableScope(tn)) { |
| p._closeTableCell(); |
| p._processToken(token); |
| } |
| } |
| |
| else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML) |
| endTagInBody(p, token); |
| } |
| |
| //12.2.5.4.16 The "in select" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInSelect(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.OPTION) { |
| if (p.openElements.currentTagName === $.OPTION) |
| p._processFakeEndTag($.OPTION); |
| |
| p._insertElement(token, NS.HTML); |
| } |
| |
| else if (tn === $.OPTGROUP) { |
| if (p.openElements.currentTagName === $.OPTION) |
| p._processFakeEndTag($.OPTION); |
| |
| if (p.openElements.currentTagName === $.OPTGROUP) |
| p._processFakeEndTag($.OPTGROUP); |
| |
| p._insertElement(token, NS.HTML); |
| } |
| |
| else if (tn === $.SELECT) |
| p._processFakeEndTag($.SELECT); |
| |
| else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA) { |
| if (p.openElements.hasInSelectScope($.SELECT)) { |
| p._processFakeEndTag($.SELECT); |
| p._processToken(token); |
| } |
| } |
| |
| else if (tn === $.SCRIPT || tn === $.TEMPLATE) |
| startTagInHead(p, token); |
| } |
| |
| function endTagInSelect(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.OPTGROUP) { |
| var prevOpenElement = p.openElements.items[p.openElements.stackTop - 1], |
| prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement); |
| |
| if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP) |
| p._processFakeEndTag($.OPTION); |
| |
| if (p.openElements.currentTagName === $.OPTGROUP) |
| p.openElements.pop(); |
| } |
| |
| else if (tn === $.OPTION) { |
| if (p.openElements.currentTagName === $.OPTION) |
| p.openElements.pop(); |
| } |
| |
| else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) { |
| p.openElements.popUntilTagNamePopped($.SELECT); |
| p._resetInsertionMode(); |
| } |
| |
| else if (tn === $.TEMPLATE) |
| endTagInHead(p, token); |
| } |
| |
| //12.2.5.4.17 The "in select in table" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInSelectInTable(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || |
| tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) { |
| p._processFakeEndTag($.SELECT); |
| p._processToken(token); |
| } |
| |
| else |
| startTagInSelect(p, token); |
| } |
| |
| function endTagInSelectInTable(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || |
| tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) { |
| if (p.openElements.hasInTableScope(tn)) { |
| p._processFakeEndTag($.SELECT); |
| p._processToken(token); |
| } |
| } |
| |
| else |
| endTagInSelect(p, token); |
| } |
| |
| //12.2.5.4.18 The "in template" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInTemplate(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META || |
| tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) { |
| startTagInHead(p, token); |
| } |
| |
| else { |
| var newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE; |
| |
| p._popTmplInsertionMode(); |
| p._pushTmplInsertionMode(newInsertionMode); |
| p.insertionMode = newInsertionMode; |
| p._processToken(token); |
| } |
| } |
| |
| function endTagInTemplate(p, token) { |
| if (token.tagName === $.TEMPLATE) |
| endTagInHead(p, token); |
| } |
| |
| function eofInTemplate(p, token) { |
| if (p.openElements.tmplCount > 0) { |
| p.openElements.popUntilTemplatePopped(); |
| p.activeFormattingElements.clearToLastMarker(); |
| p._popTmplInsertionMode(); |
| p._resetInsertionMode(); |
| p._processToken(token); |
| } |
| |
| else |
| p.stopped = true; |
| } |
| |
| |
| //12.2.5.4.19 The "after body" insertion mode |
| //------------------------------------------------------------------ |
| function startTagAfterBody(p, token) { |
| if (token.tagName === $.HTML) |
| startTagInBody(p, token); |
| |
| else |
| tokenAfterBody(p, token); |
| } |
| |
| function endTagAfterBody(p, token) { |
| if (token.tagName === $.HTML) { |
| if (!p.fragmentContext) |
| p.insertionMode = AFTER_AFTER_BODY_MODE; |
| } |
| |
| else |
| tokenAfterBody(p, token); |
| } |
| |
| function tokenAfterBody(p, token) { |
| p.insertionMode = IN_BODY_MODE; |
| p._processToken(token); |
| } |
| |
| //12.2.5.4.20 The "in frameset" insertion mode |
| //------------------------------------------------------------------ |
| function startTagInFrameset(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.FRAMESET) |
| p._insertElement(token, NS.HTML); |
| |
| else if (tn === $.FRAME) |
| p._appendElement(token, NS.HTML); |
| |
| else if (tn === $.NOFRAMES) |
| startTagInHead(p, token); |
| } |
| |
| function endTagInFrameset(p, token) { |
| if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) { |
| p.openElements.pop(); |
| |
| if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET) |
| p.insertionMode = AFTER_FRAMESET_MODE; |
| } |
| } |
| |
| //12.2.5.4.21 The "after frameset" insertion mode |
| //------------------------------------------------------------------ |
| function startTagAfterFrameset(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.NOFRAMES) |
| startTagInHead(p, token); |
| } |
| |
| function endTagAfterFrameset(p, token) { |
| if (token.tagName === $.HTML) |
| p.insertionMode = AFTER_AFTER_FRAMESET_MODE; |
| } |
| |
| //12.2.5.4.22 The "after after body" insertion mode |
| //------------------------------------------------------------------ |
| function startTagAfterAfterBody(p, token) { |
| if (token.tagName === $.HTML) |
| startTagInBody(p, token); |
| |
| else |
| tokenAfterAfterBody(p, token); |
| } |
| |
| function tokenAfterAfterBody(p, token) { |
| p.insertionMode = IN_BODY_MODE; |
| p._processToken(token); |
| } |
| |
| //12.2.5.4.23 The "after after frameset" insertion mode |
| //------------------------------------------------------------------ |
| function startTagAfterAfterFrameset(p, token) { |
| var tn = token.tagName; |
| |
| if (tn === $.HTML) |
| startTagInBody(p, token); |
| |
| else if (tn === $.NOFRAMES) |
| startTagInHead(p, token); |
| } |
| |
| |
| //12.2.5.5 The rules for parsing tokens in foreign content |
| //------------------------------------------------------------------ |
| function nullCharacterInForeignContent(p, token) { |
| token.chars = UNICODE.REPLACEMENT_CHARACTER; |
| p._insertCharacters(token); |
| } |
| |
| function characterInForeignContent(p, token) { |
| p._insertCharacters(token); |
| p.framesetOk = false; |
| } |
| |
| function startTagInForeignContent(p, token) { |
| if (ForeignContent.causesExit(token) && !p.fragmentContext) { |
| while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML && |
| (!p._isMathMLTextIntegrationPoint(p.openElements.current)) && |
| (!p._isHtmlIntegrationPoint(p.openElements.current))) { |
| p.openElements.pop(); |
| } |
| |
| p._processToken(token); |
| } |
| |
| else { |
| var current = p._getAdjustedCurrentElement(), |
| currentNs = p.treeAdapter.getNamespaceURI(current); |
| |
| if (currentNs === NS.MATHML) |
| ForeignContent.adjustTokenMathMLAttrs(token); |
| |
| else if (currentNs === NS.SVG) { |
| ForeignContent.adjustTokenSVGTagName(token); |
| ForeignContent.adjustTokenSVGAttrs(token); |
| } |
| |
| ForeignContent.adjustTokenXMLAttrs(token); |
| |
| if (token.selfClosing) |
| p._appendElement(token, currentNs); |
| else |
| p._insertElement(token, currentNs); |
| } |
| } |
| |
| function endTagInForeignContent(p, token) { |
| for (var i = p.openElements.stackTop; i > 0; i--) { |
| var element = p.openElements.items[i]; |
| |
| if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) { |
| p._processToken(token); |
| break; |
| } |
| |
| if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) { |
| p.openElements.popUntilElementPopped(element); |
| break; |
| } |
| } |
| } |
| |
| },{"../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){ |
| (function (global){ |
| 'use strict'; |
| |
| global.parse5 = {}; |
| |
| parse5.Parser = require('./lib/tree_construction/parser'); |
| parse5.SimpleApiParser = require('./lib/simple_api/simple_api_parser'); |
| parse5.TreeSerializer = |
| parse5.Serializer = require('./lib/serialization/serializer'); |
| parse5.JsDomParser = require('./lib/jsdom/jsdom_parser'); |
| |
| parse5.TreeAdapters = { |
| default: require('./lib/tree_adapters/default'), |
| htmlparser2: require('./lib/tree_adapters/htmlparser2') |
| }; |
| |
| }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
| },{"./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){ |
| // shim for using process in browser |
| |
| var process = module.exports = {}; |
| var queue = []; |
| var draining = false; |
| var currentQueue; |
| var queueIndex = -1; |
| |
| function cleanUpNextTick() { |
| draining = false; |
| if (currentQueue.length) { |
| queue = currentQueue.concat(queue); |
| } else { |
| queueIndex = -1; |
| } |
| if (queue.length) { |
| drainQueue(); |
| } |
| } |
| |
| function drainQueue() { |
| if (draining) { |
| return; |
| } |
| var timeout = setTimeout(cleanUpNextTick); |
| draining = true; |
| |
| var len = queue.length; |
| while(len) { |
| currentQueue = queue; |
| queue = []; |
| while (++queueIndex < len) { |
| currentQueue[queueIndex].run(); |
| } |
| queueIndex = -1; |
| len = queue.length; |
| } |
| currentQueue = null; |
| draining = false; |
| clearTimeout(timeout); |
| } |
| |
| process.nextTick = function (fun) { |
| var args = new Array(arguments.length - 1); |
| if (arguments.length > 1) { |
| for (var i = 1; i < arguments.length; i++) { |
| args[i - 1] = arguments[i]; |
| } |
| } |
| queue.push(new Item(fun, args)); |
| if (queue.length === 1 && !draining) { |
| setTimeout(drainQueue, 0); |
| } |
| }; |
| |
| // v8 likes predictible objects |
| function Item(fun, array) { |
| this.fun = fun; |
| this.array = array; |
| } |
| Item.prototype.run = function () { |
| this.fun.apply(null, this.array); |
| }; |
| process.title = 'browser'; |
| process.browser = true; |
| process.env = {}; |
| process.argv = []; |
| process.version = ''; // empty string to avoid regexp issues |
| process.versions = {}; |
| |
| function noop() {} |
| |
| process.on = noop; |
| process.addListener = noop; |
| process.once = noop; |
| process.off = noop; |
| process.removeListener = noop; |
| process.removeAllListeners = noop; |
| process.emit = noop; |
| |
| process.binding = function (name) { |
| throw new Error('process.binding is not supported'); |
| }; |
| |
| // TODO(shtylman) |
| process.cwd = function () { return '/' }; |
| process.chdir = function (dir) { |
| throw new Error('process.chdir is not supported'); |
| }; |
| process.umask = function() { return 0; }; |
| |
| },{}]},{},[21]); |