seo-crawl-audit 0.7.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundle/cli.js CHANGED
@@ -1,7 +1,10 @@
1
- import{createHash}from"node:crypto";var DOCS_BASE="https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md";var definitions=[{id:"page-unreachable",severity:"error",owner:"developer",scope:"page",remediation:"Restore the page or remove references to it."},{id:"http-error",severity:"error",owner:"developer",scope:"page",remediation:"Return a successful response or a deliberate redirect."},{id:"noindex",severity:"info",owner:"seo",scope:"page",remediation:"Remove noindex when the page should appear in search."},{id:"x-robots-noindex",severity:"error",owner:"developer",scope:"page",remediation:"Remove the noindex X-Robots-Tag when indexing is intended."},{id:"robots-blocked",severity:"error",owner:"developer",scope:"page",remediation:"Allow the URL in robots.txt when it should be crawled."},{id:"missing-canonical",severity:"warning",owner:"seo",scope:"page",remediation:"Declare the preferred canonical URL when duplicate URL variants are possible."},{id:"invalid-canonical",severity:"error",owner:"developer",scope:"page",remediation:"Use an absolute or valid relative HTTP(S) canonical URL."},{id:"cross-domain-canonical",severity:"error",owner:"seo",scope:"page",remediation:"Confirm the external canonical or point it to the intended same-site URL."},{id:"canonical-target-error",severity:"error",owner:"developer",scope:"page",remediation:"Point the canonical to an accessible, indexable URL."},{id:"redirect-loop",severity:"error",owner:"developer",scope:"page",remediation:"Remove the circular redirect path."},{id:"long-redirect-chain",severity:"warning",owner:"developer",scope:"page",remediation:"Redirect directly to the final destination."},{id:"sitemap-unavailable",severity:"error",owner:"developer",scope:"site",remediation:"Restore a valid, reachable XML sitemap."},{id:"noindex-in-sitemap",severity:"error",owner:"seo",scope:"page",remediation:"Remove the URL from the sitemap or make it indexable."},{id:"redirect-in-sitemap",severity:"error",owner:"seo",scope:"page",remediation:"Replace the sitemap URL with its final canonical destination."},{id:"missing-title",severity:"error",owner:"content",scope:"page",remediation:"Add a unique, descriptive HTML title."},{id:"duplicate-title",severity:"warning",owner:"content",scope:"page",remediation:"Write a title that uniquely describes this page."},{id:"title-length",severity:"warning",owner:"content",scope:"page",remediation:"Keep the title concise and descriptive, usually 10\u201360 characters."},{id:"missing-description",severity:"warning",owner:"content",scope:"page",remediation:"Add a useful meta description."},{id:"duplicate-description",severity:"warning",owner:"content",scope:"page",remediation:"Write a unique meta description for this page."},{id:"description-length",severity:"warning",owner:"content",scope:"page",remediation:"Keep the description useful and usually between 50 and 160 characters."},{id:"missing-h1",severity:"warning",owner:"content",scope:"page",remediation:"Add one clear primary heading."},{id:"broken-internal-link",severity:"error",owner:"developer",scope:"page",remediation:"Update or remove the internal link, or restore its target."},{id:"orphan-sitemap-page",severity:"warning",owner:"seo",scope:"page",remediation:"Add meaningful internal links to the sitemap page."},{id:"crawlable-not-in-sitemap",severity:"warning",owner:"seo",scope:"page",remediation:"Add the indexable page to the sitemap or intentionally exclude it."},{id:"invalid-hreflang",severity:"warning",owner:"seo",scope:"page",remediation:"Use valid language tags and resolvable HTTP(S) alternate URLs."},{id:"malformed-json-ld",severity:"warning",owner:"developer",scope:"page",remediation:"Fix JSON syntax in the structured-data block."},{id:"http-on-https-site",severity:"warning",owner:"developer",scope:"page",remediation:"Use HTTPS for internal URLs and metadata references."},{id:"invalid-language",severity:"warning",owner:"developer",scope:"page",remediation:"Set a valid BCP 47 language tag on the html element."},{id:"duplicate-content",severity:"warning",owner:"content",scope:"page",remediation:"Consolidate duplicate pages or differentiate their main content."},{id:"multiple-h1",severity:"info",owner:"content",scope:"page",remediation:"Review whether one primary H1 would make the hierarchy clearer."},{id:"missing-open-graph",severity:"info",owner:"content",scope:"page",remediation:"Add Open Graph title, description, and image for social sharing."},{id:"missing-twitter-metadata",severity:"info",owner:"content",scope:"page",remediation:"Add Twitter card metadata when social previews matter."},{id:"image-missing-alt",severity:"info",owner:"content",scope:"page",remediation:"Add meaningful alt text, or an empty alt for decorative images."},{id:"low-word-count",severity:"info",owner:"content",scope:"page",remediation:"Review whether the page provides enough useful primary content."},{id:"robots-changed",severity:"warning",owner:"developer",scope:"site",remediation:"Review the robots.txt change and confirm that crawl access is intentional."},{id:"page-missing",severity:"error",owner:"developer",scope:"page",remediation:"Include the page in the scan or confirm that its removal is intentional."},{id:"status-regression",severity:"error",owner:"developer",scope:"page",remediation:"Restore the previous successful HTTP response."},{id:"new-noindex",severity:"error",owner:"seo",scope:"page",remediation:"Remove the newly introduced noindex unless it is intentional."},{id:"title-removed",severity:"error",owner:"content",scope:"page",remediation:"Restore a descriptive title."},{id:"title-changed",severity:"warning",owner:"content",scope:"page",remediation:"Review and approve the changed title."},{id:"description-removed",severity:"warning",owner:"content",scope:"page",remediation:"Restore a useful meta description."},{id:"canonical-removed",severity:"error",owner:"seo",scope:"page",remediation:"Restore the canonical declaration."},{id:"canonical-changed",severity:"warning",owner:"seo",scope:"page",remediation:"Confirm the new canonical target is deliberate and valid."},{id:"h1-removed",severity:"warning",owner:"content",scope:"page",remediation:"Restore a clear primary heading."},{id:"redirect-changed",severity:"warning",owner:"developer",scope:"page",remediation:"Confirm the new redirect destination is intentional."},{id:"sitemap-url-count-drop",severity:"error",owner:"seo",scope:"site",remediation:"Investigate the sitemap URL loss and restore omitted indexable pages."}];var RULE_REGISTRY=Object.freeze(definitions.map(definition=>Object.freeze({...definition})));var RULES=new Map(RULE_REGISTRY.map(rule=>[rule.id,rule]));function stableStringify(value){if(Array.isArray(value))return`[${value.map(stableStringify).join(",")}]`;if(value&&typeof value==="object")return`{${Object.entries(value).sort(([a],[b])=>a.localeCompare(b)).map(([key,child])=>`${key}:${stableStringify(child)}`).join(",")}}`;return JSON.stringify(value)}function issueFingerprint(ruleId,scope,url,identity){return createHash("sha256").update(`${ruleId}
1
+ import{createHash}from"node:crypto";var DOCS_BASE="https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md",definitions=[{id:"page-unreachable",severity:"error",owner:"developer",scope:"page",remediation:"Restore the page or remove references to it."},{id:"http-error",severity:"error",owner:"developer",scope:"page",remediation:"Return a successful response or a deliberate redirect."},{id:"noindex",severity:"info",owner:"seo",scope:"page",remediation:"Remove noindex when the page should appear in search."},{id:"x-robots-noindex",severity:"error",owner:"developer",scope:"page",remediation:"Remove the noindex X-Robots-Tag when indexing is intended."},{id:"robots-blocked",severity:"error",owner:"developer",scope:"page",remediation:"Allow the URL in robots.txt when it should be crawled."},{id:"missing-canonical",severity:"warning",owner:"seo",scope:"page",remediation:"Declare the preferred canonical URL when duplicate URL variants are possible."},{id:"invalid-canonical",severity:"error",owner:"developer",scope:"page",remediation:"Use an absolute or valid relative HTTP(S) canonical URL."},{id:"cross-domain-canonical",severity:"error",owner:"seo",scope:"page",remediation:"Confirm the external canonical or point it to the intended same-site URL."},{id:"canonical-target-error",severity:"error",owner:"developer",scope:"page",remediation:"Point the canonical to an accessible, indexable URL."},{id:"redirect-loop",severity:"error",owner:"developer",scope:"page",remediation:"Remove the circular redirect path."},{id:"long-redirect-chain",severity:"warning",owner:"developer",scope:"page",remediation:"Redirect directly to the final destination."},{id:"sitemap-unavailable",severity:"error",owner:"developer",scope:"site",remediation:"Restore a valid, reachable XML sitemap."},{id:"noindex-in-sitemap",severity:"error",owner:"seo",scope:"page",remediation:"Remove the URL from the sitemap or make it indexable."},{id:"redirect-in-sitemap",severity:"error",owner:"seo",scope:"page",remediation:"Replace the sitemap URL with its final canonical destination."},{id:"missing-title",severity:"error",owner:"content",scope:"page",remediation:"Add a unique, descriptive HTML title."},{id:"duplicate-title",severity:"warning",owner:"content",scope:"page",remediation:"Write a title that uniquely describes this page."},{id:"title-length",severity:"warning",owner:"content",scope:"page",remediation:"Keep the title concise and descriptive, usually 10\u201360 characters."},{id:"missing-description",severity:"warning",owner:"content",scope:"page",remediation:"Add a useful meta description."},{id:"duplicate-description",severity:"warning",owner:"content",scope:"page",remediation:"Write a unique meta description for this page."},{id:"description-length",severity:"warning",owner:"content",scope:"page",remediation:"Keep the description useful and usually between 50 and 160 characters."},{id:"missing-h1",severity:"warning",owner:"content",scope:"page",remediation:"Add one clear primary heading."},{id:"broken-internal-link",severity:"error",owner:"developer",scope:"page",remediation:"Update or remove the internal link, or restore its target."},{id:"orphan-sitemap-page",severity:"warning",owner:"seo",scope:"page",remediation:"Add meaningful internal links to the sitemap page."},{id:"crawlable-not-in-sitemap",severity:"warning",owner:"seo",scope:"page",remediation:"Add the indexable page to the sitemap or intentionally exclude it."},{id:"invalid-hreflang",severity:"warning",owner:"seo",scope:"page",remediation:"Use valid language tags and resolvable HTTP(S) alternate URLs."},{id:"malformed-json-ld",severity:"warning",owner:"developer",scope:"page",remediation:"Fix JSON syntax in the structured-data block."},{id:"http-on-https-site",severity:"warning",owner:"developer",scope:"page",remediation:"Use HTTPS for internal URLs and metadata references."},{id:"invalid-language",severity:"warning",owner:"developer",scope:"page",remediation:"Set a valid BCP 47 language tag on the html element."},{id:"duplicate-content",severity:"warning",owner:"content",scope:"page",remediation:"Consolidate duplicate pages or differentiate their main content."},{id:"multiple-h1",severity:"info",owner:"content",scope:"page",remediation:"Review whether one primary H1 would make the hierarchy clearer."},{id:"missing-open-graph",severity:"info",owner:"content",scope:"page",remediation:"Add Open Graph title, description, and image for social sharing."},{id:"missing-twitter-metadata",severity:"info",owner:"content",scope:"page",remediation:"Add Twitter card metadata when social previews matter."},{id:"image-missing-alt",severity:"info",owner:"content",scope:"page",remediation:"Add meaningful alt text, or an empty alt for decorative images."},{id:"low-word-count",severity:"info",owner:"content",scope:"page",remediation:"Review whether the page provides enough useful primary content."},{id:"robots-changed",severity:"warning",owner:"developer",scope:"site",remediation:"Review the robots.txt change and confirm that crawl access is intentional."},{id:"page-missing",severity:"error",owner:"developer",scope:"page",remediation:"Include the page in the scan or confirm that its removal is intentional."},{id:"status-regression",severity:"error",owner:"developer",scope:"page",remediation:"Restore the previous successful HTTP response."},{id:"new-noindex",severity:"error",owner:"seo",scope:"page",remediation:"Remove the newly introduced noindex unless it is intentional."},{id:"title-removed",severity:"error",owner:"content",scope:"page",remediation:"Restore a descriptive title."},{id:"title-changed",severity:"warning",owner:"content",scope:"page",remediation:"Review and approve the changed title."},{id:"description-removed",severity:"warning",owner:"content",scope:"page",remediation:"Restore a useful meta description."},{id:"canonical-removed",severity:"error",owner:"seo",scope:"page",remediation:"Restore the canonical declaration."},{id:"canonical-changed",severity:"warning",owner:"seo",scope:"page",remediation:"Confirm the new canonical target is deliberate and valid."},{id:"h1-removed",severity:"warning",owner:"content",scope:"page",remediation:"Restore a clear primary heading."},{id:"redirect-changed",severity:"warning",owner:"developer",scope:"page",remediation:"Confirm the new redirect destination is intentional."},{id:"sitemap-url-count-drop",severity:"error",owner:"seo",scope:"site",remediation:"Investigate the sitemap URL loss and restore omitted indexable pages."}],RULE_REGISTRY=Object.freeze(definitions.map(definition=>Object.freeze({...definition}))),RULES=new Map(RULE_REGISTRY.map(rule=>[rule.id,rule]));function stableStringify(value){return Array.isArray(value)?`[${value.map(stableStringify).join(",")}]`:value&&typeof value=="object"?`{${Object.entries(value).sort(([a],[b])=>a.localeCompare(b)).map(([key,child])=>`${key}:${stableStringify(child)}`).join(",")}}`:JSON.stringify(value)}function issueFingerprint(ruleId,scope,url,identity){return createHash("sha256").update(`${ruleId}
2
2
  ${scope}
3
3
  ${url}
4
- ${stableStringify(identity??null)}`).digest("hex").slice(0,24)}function createIssue(ruleId,url,message,evidence={},identity){const definition=RULES.get(ruleId);if(!definition)throw new Error(`unknown rule: ${ruleId}`);return{fingerprint:issueFingerprint(ruleId,definition.scope,url,identity),ruleId,rule:ruleId,severity:definition.severity,scope:definition.scope,url,message,evidence,owner:definition.owner,remediation:definition.remediation,documentationUrl:`${DOCS_BASE}#${ruleId}`,after:evidence.actual}}function hasDirective(value,directive){return new RegExp(`(^|[\\s,])${directive}($|[\\s,])`,"i").test(value??"")}function validLanguage(language){if(language.toLowerCase()==="x-default")return true;try{new Intl.Locale(language);return true}catch{return false}}function duplicateMap(pages,select){const groups=new Map;for(const page of pages){const value=select(page)?.trim().toLowerCase();if(!value)continue;const urls=groups.get(value)??[];urls.push(page.url);groups.set(value,urls)}return new Map([...groups].filter(([,urls])=>urls.length>1))}function evaluateCurrentRules(snapshot){const issues=[];const add=candidate=>{issues.push(candidate)};const pageByUrl=new Map(snapshot.pages.map(page=>[page.url,page]));const sitemapUrls=new Set(snapshot.sitemap?.urls??[]);const titles=duplicateMap(snapshot.pages,page=>page.title);const descriptions=duplicateMap(snapshot.pages,page=>page.description);const content=duplicateMap(snapshot.pages,page=>page.contentHash);if(snapshot.sitemap?.error)add(createIssue("sitemap-unavailable",snapshot.sitemap.url,"The configured sitemap could not be loaded",{actual:snapshot.sitemap.error}));for(const page of snapshot.pages){if(page.blockedByRobots){add(createIssue("robots-blocked",page.url,"Page is blocked by robots.txt",{actual:true}));continue}if(page.error){add(createIssue(page.error.includes("redirect loop")?"redirect-loop":"page-unreachable",page.url,`Page request failed: ${page.error}`,{actual:page.error,redirectChain:page.redirectChain}));continue}if(page.status===null||page.status>=400)add(createIssue("http-error",page.url,`Page returned HTTP ${page.status??"unknown"}`,{actual:page.status}));if(hasDirective(page.robots,"noindex"))add(createIssue("noindex",page.url,"Page contains a noindex meta directive",{actual:page.robots}));if(hasDirective(page.xRobotsTag,"noindex"))add(createIssue("x-robots-noindex",page.url,"Page contains a noindex X-Robots-Tag",{actual:page.xRobotsTag}));if(!page.canonicalRaw&&!page.canonical)add(createIssue("missing-canonical",page.url,"Page does not declare a canonical URL",{actual:null}));if(page.canonicalRaw&&!page.canonical)add(createIssue("invalid-canonical",page.url,"Canonical URL is invalid",{actual:page.canonicalRaw}));if(page.canonical&&new URL(page.canonical).origin!==new URL(snapshot.siteUrl).origin)add(createIssue("cross-domain-canonical",page.url,"Canonical points to another origin",{actual:page.canonical}));if(page.canonical){const target=pageByUrl.get(page.canonical);if(target&&(target.error||(target.status??500)>=400))add(createIssue("canonical-target-error",page.url,"Canonical target is unavailable",{target:page.canonical,actual:target.status??target.error},page.canonical))}if(page.redirectChain.length>3)add(createIssue("long-redirect-chain",page.url,`Page uses ${page.redirectChain.length} redirects`,{actual:page.redirectChain.length,redirectChain:page.redirectChain}));if(sitemapUrls.has(page.url)&&(hasDirective(page.robots,"noindex")||hasDirective(page.xRobotsTag,"noindex")))add(createIssue("noindex-in-sitemap",page.url,"Sitemap URL is marked noindex",{actual:page.robots??page.xRobotsTag}));if(sitemapUrls.has(page.url)&&page.redirectChain.length>0)add(createIssue("redirect-in-sitemap",page.url,"Sitemap URL redirects",{actual:page.finalUrl,redirectChain:page.redirectChain}));if(!page.title)add(createIssue("missing-title",page.url,"Page does not have a title",{actual:null}));else{if(titles.get(page.title.trim().toLowerCase()))add(createIssue("duplicate-title",page.url,"Title is shared by multiple pages",{actual:page.title,urls:titles.get(page.title.trim().toLowerCase())},page.title.trim().toLowerCase()));if(page.title.length<10||page.title.length>60)add(createIssue("title-length",page.url,`Title length is ${page.title.length} characters`,{actual:page.title.length,value:page.title}))}if(!page.description)add(createIssue("missing-description",page.url,"Page does not have a meta description",{actual:null}));else{if(descriptions.get(page.description.trim().toLowerCase()))add(createIssue("duplicate-description",page.url,"Meta description is shared by multiple pages",{actual:page.description,urls:descriptions.get(page.description.trim().toLowerCase())},page.description.trim().toLowerCase()));if(page.description.length<50||page.description.length>160)add(createIssue("description-length",page.url,`Description length is ${page.description.length} characters`,{actual:page.description.length,value:page.description}))}if(page.h1Count===0)add(createIssue("missing-h1",page.url,"Page does not contain an H1 heading",{actual:0}));else if(page.h1Count>1)add(createIssue("multiple-h1",page.url,`Page contains ${page.h1Count} H1 headings`,{actual:page.h1Count}));for(const targetUrl of page.internalLinks){const target=pageByUrl.get(targetUrl);if(target&&(target.error||(target.status??500)>=400))add(createIssue("broken-internal-link",page.url,"Internal link points to an unavailable page",{target:targetUrl,actual:target.status??target.error},targetUrl))}if(sitemapUrls.has(page.url)&&page.url!==snapshot.siteUrl&&snapshot.linkGraph.orphanUrls.includes(page.url))add(createIssue("orphan-sitemap-page",page.url,"Sitemap page has no discovered internal links",{actual:true}));if(snapshot.sitemap&&!sitemapUrls.has(page.url)&&!hasDirective(page.robots,"noindex")&&(page.status??500)<400)add(createIssue("crawlable-not-in-sitemap",page.url,"Crawlable page is absent from the sitemap",{actual:false}));for(const alternate of page.hreflang)if(!validLanguage(alternate.lang)||!alternate.url)add(createIssue("invalid-hreflang",page.url,"Hreflang declaration is invalid",{actual:alternate},alternate));for(const[index,block]of page.jsonLd.entries())if(!block.valid)add(createIssue("malformed-json-ld",page.url,"JSON-LD block contains invalid JSON",{actual:block.error,index},index));if(snapshot.siteUrl.startsWith("https:")&&[page.url,page.canonical,...page.internalLinks].some(url=>url?.startsWith("http:")))add(createIssue("http-on-https-site",page.url,"HTTPS site references an internal HTTP URL",{actual:[page.url,page.canonical,...page.internalLinks].filter(url=>url?.startsWith("http:"))}));if(page.lang&&!validLanguage(page.lang))add(createIssue("invalid-language",page.url,"HTML language declaration is invalid",{actual:page.lang}));if(page.contentHash&&content.get(page.contentHash))add(createIssue("duplicate-content",page.url,"Main text is an exact duplicate of another page",{urls:content.get(page.contentHash)},page.contentHash));if(!page.openGraph.title||!page.openGraph.description||!page.openGraph.image)add(createIssue("missing-open-graph",page.url,"Open Graph metadata is incomplete",{actual:page.openGraph}));if(!page.twitter.card||!page.twitter.title||!page.twitter.description||!page.twitter.image)add(createIssue("missing-twitter-metadata",page.url,"Twitter card metadata is incomplete",{actual:page.twitter}));const missingAlt=page.images.filter(image=>image.alt===null).map(image=>image.src);if(missingAlt.length>0)add(createIssue("image-missing-alt",page.url,`${missingAlt.length} image(s) do not have an alt attribute`,{actual:missingAlt}));if(page.wordCount<200)add(createIssue("low-word-count",page.url,`Page contains approximately ${page.wordCount} visible words`,{actual:page.wordCount}))}return issues}var severityOrder={error:0,warning:1,info:2};function globMatches(url,pattern){const pathname=(()=>{try{return new URL(url).pathname}catch{return url}})();const expression=pattern.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("**","\0").replaceAll("*","[^/]*").replaceAll("\0",".*");const regex=new RegExp(`^${expression}$`);return regex.test(pathname)||regex.test(url)}function activeSuppression(issue,suppressions,now){return suppressions.find(suppression=>{if(suppression.rule!==issue.ruleId||!globMatches(issue.url,suppression.urlPattern))return false;if(!suppression.expiresAt)return true;return new Date(`${suppression.expiresAt}T23:59:59.999Z`).getTime()>=now.getTime()})??null}function sortIssues(issues){return issues.sort((left,right)=>severityOrder[left.severity]-severityOrder[right.severity]||left.url.localeCompare(right.url)||left.ruleId.localeCompare(right.ruleId)||left.fingerprint.localeCompare(right.fingerprint))}function applyRulePolicy(issues,snapshot,ruleSet={}){const enabled=ruleSet.enabledRules??snapshot.config.enabledRules;const enabledSet=enabled?new Set(enabled):null;const overrides={...snapshot.config.severityOverrides,...ruleSet.severityOverrides??{}};const suppressions=ruleSet.suppressions??snapshot.config.suppressions;const now=new Date(ruleSet.now??Date.now());return sortIssues(issues.filter(candidate=>!enabledSet||enabledSet.has(candidate.ruleId)).map(candidate=>({...candidate,severity:overrides[candidate.ruleId]??candidate.severity})).filter(candidate=>!activeSuppression(candidate,suppressions,now)))}import{createHash as createHash2}from"node:crypto";var ENGINE_VERSION="0.7.2";var RULE_SET_VERSION="1.1.0";var PRODUCT_NAME="seo-crawl-audit";var DEFAULT_USER_AGENT=`${PRODUCT_NAME}/${ENGINE_VERSION}`;var DEFAULT_OPEN_GRAPH={title:null,description:null,image:null};var DEFAULT_TWITTER={card:null,title:null,description:null,image:null};function baselineInput(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error("snapshot must be an object")}return value}function pageInput(value){if(!value||typeof value!=="object"||typeof value.url!=="string"){throw new Error("snapshot page URL must be a string")}return value}function stableJson(value){if(Array.isArray(value)){return`[${value.map(stableJson).join(",")}]`}if(value&&typeof value==="object"){return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,child])=>`${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`}return JSON.stringify(value)}function hashConfiguration(config){return createHash2("sha256").update(stableJson(config)).digest("hex")}function normalizePage(page){return{url:page.url,finalUrl:page.finalUrl??null,status:page.status??null,contentType:page.contentType??null,blockedByRobots:page.blockedByRobots??false,error:page.error??null,title:page.title??null,description:page.description??null,canonical:page.canonical??null,canonicalRaw:page.canonicalRaw??page.canonical??null,robots:page.robots??null,xRobotsTag:page.xRobotsTag??null,lang:page.lang??null,h1Count:page.h1Count??0,openGraph:page.openGraph??DEFAULT_OPEN_GRAPH,twitter:page.twitter??DEFAULT_TWITTER,hreflang:page.hreflang??[],jsonLd:page.jsonLd??[],images:page.images??[],links:[...page.links??[]].sort(),internalLinks:[...page.internalLinks??[]].sort(),externalLinks:[...page.externalLinks??[]].sort(),wordCount:page.wordCount??0,contentHash:page.contentHash??null,depth:page.depth??0,redirectChain:page.redirectChain??[],responseBytes:page.responseBytes??0}}function defaultConfig(input){const source=input.source??{};const options=input.options??{};const firstPage=input.pages?.[0];const firstPageUrl=firstPage&&typeof firstPage==="object"?firstPage.url:void 0;const url=input.siteUrl??input.startUrl??source.startUrl??(typeof firstPageUrl==="string"?firstPageUrl:void 0);if(!url)throw new Error("snapshot site URL must be a string");return{schemaVersion:1,url,sitemap:options.sitemap??source.sitemap??"auto",maxPages:options.maxPages??source.maxPages??100,concurrency:options.concurrency??5,delay:options.requestDelay??source.requestDelay??100,timeout:options.timeout??1e4,respectRobots:options.respectRobots??source.respectRobots??true,includeQuery:options.includeQuery??source.includeQuery??false,maxRedirects:options.maxRedirects??10,maxResponseBytes:options.maxResponseBytes??5*1024*1024,enabledRules:options.enabledRules??null,severityOverrides:options.severityOverrides??{},suppressions:options.suppressions??[],regressionBudgets:options.regressionBudgets??{},report:options.report??{}}}function createLinkGraph(pages,sitemapUrls){const known=new Set(pages.map(page=>page.url));const linked=new Set(pages.flatMap(page=>page.internalLinks));const broken=new Set;for(const page of pages){if(page.error||page.blockedByRobots||(page.status??500)>=400){broken.add(page.url)}}return{internalEdges:pages.reduce((sum,page)=>sum+page.internalLinks.length,0),externalEdges:pages.reduce((sum,page)=>sum+page.externalLinks.length,0),orphanUrls:sitemapUrls.filter(url=>known.has(url)&&!linked.has(url)),brokenInternalUrls:[...broken].sort()}}function createStatistics(input,pages){const blockedByRobots=pages.filter(page=>page.blockedByRobots).length;const failed=pages.filter(page=>page.error||(page.status??500)>=400).length;return{requested:input.requested??pages.length,completed:pages.length,succeeded:pages.length-failed-blockedByRobots,failed,blockedByRobots,redirected:pages.filter(page=>page.redirectChain.length>0||page.url!==page.finalUrl).length,durationMs:input.durationMs??0,truncated:input.truncated??false,partial:input.partial??false}}function createBaseline(scanInput){const scan2=baselineInput(scanInput);const config=defaultConfig(scan2);const pages=(scan2.pages??[]).map(page=>normalizePage(pageInput(page))).sort((left,right)=>left.url.localeCompare(right.url));const sitemapUrls=scan2.sitemap?.urls??[];if(scan2.sitemap&&!scan2.sitemap.url)throw new Error("snapshot sitemap URL must be a string");const sitemap=scan2.sitemap?{url:scan2.sitemap.url,urls:[...sitemapUrls].sort(),sitemapCount:scan2.sitemap.sitemapCount??0,truncated:scan2.sitemap.truncated??false,error:scan2.sitemap.error??null}:null;const siteUrl=scan2.startUrl??config.url;const truncated=scan2.truncated??false;return{schemaVersion:2,engineVersion:ENGINE_VERSION,ruleSetVersion:RULE_SET_VERSION,generatedAt:scan2.generatedAt??new Date().toISOString(),siteUrl,configurationHash:hashConfiguration(config),config,robots:{url:scan2.robots?.url??new URL("/robots.txt",siteUrl).href,status:scan2.robots?.status??null,sha256:scan2.robots?.sha256??null,error:scan2.robots?.error??null,denyAll:scan2.robots?.denyAll??false},sitemap,pages,linkGraph:scan2.linkGraph??createLinkGraph(pages,sitemapUrls),statistics:scan2.statistics??createStatistics(scan2,pages),partial:scan2.partial??false,source:{startUrl:siteUrl,maxPages:config.maxPages,requestDelay:config.delay,includeQuery:config.includeQuery,respectRobots:config.respectRobots,sitemap:typeof config.sitemap==="string"&&!["auto","none"].includes(config.sitemap)?config.sitemap:null},truncated}}function migrateSnapshot(input){const value=baselineInput(input);if(!Array.isArray(value.pages)){throw new Error("snapshot pages must be an array")}if(value.schemaVersion===2){return createBaseline({...value,startUrl:value.siteUrl,options:value.config,pages:value.pages,generatedAt:value.generatedAt,partial:value.partial,statistics:value.statistics,linkGraph:value.linkGraph})}if(value.schemaVersion===1){return createBaseline(value)}throw new Error(`unsupported snapshot schema version: ${String(value.schemaVersion)}`)}function normalizeSnapshotInput(input){if(input.schemaVersion===2)return input;const legacy=input;const firstPage=legacy.pages?.[0];const firstPageUrl=firstPage&&typeof firstPage==="object"?firstPage.url:void 0;const firstUrl=typeof firstPageUrl==="string"?firstPageUrl:legacy.source?.startUrl??"https://invalid.local/";return createBaseline({...legacy,startUrl:legacy.siteUrl??legacy.source?.startUrl??firstUrl,robots:legacy.robots??{url:new URL("/robots.txt",firstUrl).href,status:null,sha256:null,error:null},options:legacy.config??legacy.options??{}})}function audit(snapshotInput,ruleSet={}){const snapshot=normalizeSnapshotInput(snapshotInput);return applyRulePolicy(evaluateCurrentRules(snapshot),snapshot,ruleSet)}function hasDirective2(value,directive){return new RegExp(`(^|[\\s,])${directive}($|[\\s,])`,"i").test(value??"")}function changedIssue(ruleId,url,message,before,after){const candidate=createIssue(ruleId,url,message,{before,after,actual:after});candidate.before=before;candidate.after=after;return candidate}function evaluateRegressionRules(baseline,current){const complete=!current.partial&&!current.truncated;const issues=[];const currentPages=new Map(current.pages.map(page=>[page.url,page]));if(baseline.robots.sha256&&current.robots.sha256&&baseline.robots.sha256!==current.robots.sha256){issues.push(changedIssue("robots-changed",current.robots.url,"robots.txt content changed",baseline.robots.sha256,current.robots.sha256))}const previousSitemapCount=baseline.sitemap?.urls.length??0;const currentSitemapCount=current.sitemap?.urls.length??0;const sitemapDrop=previousSitemapCount-currentSitemapCount;if(complete&&previousSitemapCount>0&&sitemapDrop>=Math.max(5,Math.ceil(previousSitemapCount*.2))){issues.push(changedIssue("sitemap-url-count-drop",current.sitemap?.url??baseline.sitemap?.url??current.siteUrl,`Sitemap URL count dropped by ${sitemapDrop}`,previousSitemapCount,currentSitemapCount))}for(const before of baseline.pages){const after=currentPages.get(before.url);if(!after){if(complete)issues.push(changedIssue("page-missing",before.url,"Page was not checked",before.status,null));continue}if(after.blockedByRobots&&!before.blockedByRobots){issues.push(changedIssue("robots-blocked",before.url,"Page is now blocked by robots.txt",false,true));continue}if(after.error&&!before.error){issues.push(changedIssue(after.error.includes("redirect loop")?"redirect-loop":"page-unreachable",before.url,`Page request failed: ${after.error}`,before.error,after.error));continue}if(before.status!==null&&before.status<400&&(after.status===null||after.status>=400))issues.push(changedIssue("status-regression",before.url,`HTTP status regressed from ${before.status} to ${after.status??"none"}`,before.status,after.status));const beforeRobots=`${before.robots??""},${before.xRobotsTag??""}`;const afterRobots=`${after.robots??""},${after.xRobotsTag??""}`;if(!hasDirective2(beforeRobots,"noindex")&&hasDirective2(afterRobots,"noindex"))issues.push(changedIssue("new-noindex",before.url,"Page now contains a noindex directive",beforeRobots,afterRobots));if(before.title&&!after.title)issues.push(changedIssue("title-removed",before.url,"Page title was removed",before.title,after.title));else if(before.title&&after.title&&before.title!==after.title)issues.push(changedIssue("title-changed",before.url,"Page title changed",before.title,after.title));if(before.description&&!after.description)issues.push(changedIssue("description-removed",before.url,"Meta description was removed",before.description,after.description));if(before.canonical&&!after.canonical)issues.push(changedIssue("canonical-removed",before.url,"Canonical URL was removed",before.canonical,after.canonical));else if(before.canonical&&after.canonical&&before.canonical!==after.canonical){const candidate=changedIssue("canonical-changed",before.url,"Canonical URL changed",before.canonical,after.canonical);if(new URL(after.canonical).origin!==new URL(before.url).origin)candidate.severity="error";issues.push(candidate)}if(before.h1Count>0&&after.h1Count===0)issues.push(changedIssue("h1-removed",before.url,"All H1 headings were removed",before.h1Count,after.h1Count));if(before.finalUrl&&after.finalUrl&&before.finalUrl!==after.finalUrl){const candidate=changedIssue("redirect-changed",before.url,"Final redirect URL changed",before.finalUrl,after.finalUrl);if(new URL(after.finalUrl).origin!==new URL(before.url).origin)candidate.severity="error";issues.push(candidate)}}return issues}function compareBaselines(baselineInput2,currentInput,ruleSet={}){const baseline=normalizeSnapshotInput(baselineInput2);const current=normalizeSnapshotInput(currentInput);return applyRulePolicy(evaluateRegressionRules(baseline,current),current,ruleSet)}function lifecycle(issue,value){return{...issue,lifecycle:value}}function diff(previousInput,currentInput,ruleSet={}){const previous=normalizeSnapshotInput(previousInput);const current=normalizeSnapshotInput(currentInput);const complete=!current.partial&&!current.truncated;const checkedUrls=new Set(current.pages.map(page=>page.url));const previousIssues=new Map(audit(previous,ruleSet).map(candidate=>[candidate.fingerprint,candidate]));const currentIssues=new Map(audit(current,ruleSet).map(candidate=>[candidate.fingerprint,candidate]));const newIssues=[];const ongoingIssues=[];const unchangedIssues=[];const resolvedIssues=[];for(const[fingerprint,candidate]of currentIssues){const before=previousIssues.get(fingerprint);if(!before)newIssues.push(lifecycle(candidate,"new"));else if(JSON.stringify(before.evidence)===JSON.stringify(candidate.evidence))unchangedIssues.push(lifecycle(candidate,"unchanged"));else ongoingIssues.push(lifecycle({...candidate,before:before.evidence,after:candidate.evidence},"ongoing"))}for(const[fingerprint,candidate]of previousIssues){const evaluated=candidate.scope==="page"?checkedUrls.has(candidate.url):complete;if(evaluated&&!currentIssues.has(fingerprint))resolvedIssues.push(lifecycle(candidate,"resolved"))}const known=new Set(newIssues.map(candidate=>candidate.fingerprint));for(const regression of compareBaselines(previous,current,ruleSet)){if(!known.has(regression.fingerprint))newIssues.push(lifecycle(regression,"new"))}const budgets={...previous.config.regressionBudgets,...current.config.regressionBudgets};const budgetExceeded=Object.entries(budgets).flatMap(([budget,allowed])=>{const actual2=newIssues.filter(candidate=>candidate.severity===budget||candidate.ruleId===budget).length;return actual2>allowed?[{budget,allowed,actual:actual2}]:[]});sortIssues(newIssues);sortIssues(ongoingIssues);sortIssues(unchangedIssues);sortIssues(resolvedIssues);return{complete,newIssues,ongoingIssues,resolvedIssues,unchangedIssues,issues:[...newIssues,...ongoingIssues],budgetExceeded}}var DEFAULT_CONFIG_FILE="seo-audit.config.json";var DEFAULT_SCAN_CONFIG=Object.freeze({schemaVersion:1,url:"",sitemap:"auto",maxPages:100,concurrency:5,delay:100,timeout:1e4,respectRobots:true,includeQuery:false,maxRedirects:10,maxResponseBytes:5*1024*1024,enabledRules:null,severityOverrides:{},suppressions:[],regressionBudgets:{},report:{}});function object(value,field){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error(`${field} must be an object`)}return value}function integer(value,field,minimum,maximum=Number.MAX_SAFE_INTEGER){if(!Number.isInteger(value)||value<minimum||value>maximum){throw new Error(`${field} must be an integer between ${minimum} and ${maximum}`)}return value}function optionalString(value,field){if(value===void 0)return void 0;if(typeof value!=="string")throw new Error(`${field} must be a string`);return value}function validateConfig(input){const value=object(input,"config");const allowed=new Set(["$schema","schemaVersion","url","sitemap","maxPages","concurrency","delay","timeout","respectRobots","includeQuery","maxRedirects","maxResponseBytes","enabledRules","severityOverrides","suppressions","regressionBudgets","report"]);for(const key of Object.keys(value)){if(!allowed.has(key))throw new Error(`unknown config property: ${key}`)}const result={};if(value.schemaVersion!==void 0&&value.schemaVersion!==1)throw new Error("schemaVersion must be 1");if(value.url!==void 0){const url=optionalString(value.url,"url");if(!/^https?:\/\//i.test(url))throw new Error("url must be an HTTP(S) URL");result.url=url}if(value.sitemap!==void 0){const sitemap=optionalString(value.sitemap,"sitemap");if(!["auto","none"].includes(sitemap)&&!/^https?:\/\//i.test(sitemap)){throw new Error("sitemap must be auto, none, or an HTTP(S) URL")}result.sitemap=sitemap}if(value.maxPages!==void 0)result.maxPages=integer(value.maxPages,"maxPages",1);if(value.concurrency!==void 0)result.concurrency=integer(value.concurrency,"concurrency",1,50);if(value.delay!==void 0)result.delay=integer(value.delay,"delay",0);if(value.timeout!==void 0)result.timeout=integer(value.timeout,"timeout",1);if(value.maxRedirects!==void 0)result.maxRedirects=integer(value.maxRedirects,"maxRedirects",0,50);if(value.maxResponseBytes!==void 0)result.maxResponseBytes=integer(value.maxResponseBytes,"maxResponseBytes",1024);for(const field of["respectRobots","includeQuery"]){if(value[field]!==void 0){if(typeof value[field]!=="boolean")throw new Error(`${field} must be a boolean`);result[field]=value[field]}}if(value.enabledRules!==void 0){if(value.enabledRules!==null&&(!Array.isArray(value.enabledRules)||value.enabledRules.some(rule=>typeof rule!=="string"))){throw new Error("enabledRules must be null or an array of rule IDs")}result.enabledRules=value.enabledRules}if(value.severityOverrides!==void 0){const overrides=object(value.severityOverrides,"severityOverrides");for(const[rule,severity]of Object.entries(overrides)){if(!["error","warning","info"].includes(severity)){throw new Error(`severityOverrides.${rule} must be error, warning, or info`)}}result.severityOverrides=overrides}if(value.suppressions!==void 0){if(!Array.isArray(value.suppressions))throw new Error("suppressions must be an array");result.suppressions=value.suppressions.map((entry,index)=>{const suppression=object(entry,`suppressions[${index}]`);for(const field of["rule","urlPattern","reason"]){if(typeof suppression[field]!=="string"||suppression[field]===""){throw new Error(`suppressions[${index}].${field} must be a non-empty string`)}}if(suppression.expiresAt!==void 0&&!/^\d{4}-\d{2}-\d{2}$/.test(String(suppression.expiresAt))){throw new Error(`suppressions[${index}].expiresAt must use YYYY-MM-DD`)}return suppression})}if(value.regressionBudgets!==void 0){const budgets=object(value.regressionBudgets,"regressionBudgets");result.regressionBudgets=Object.fromEntries(Object.entries(budgets).map(([key,budget])=>[key,integer(budget,`regressionBudgets.${key}`,0)]))}if(value.report!==void 0){const report=object(value.report,"report");const branding={};const agencyName=optionalString(report.agencyName,"report.agencyName");const logo=optionalString(report.logo,"report.logo");const primaryColor=optionalString(report.primaryColor,"report.primaryColor");if(agencyName!==void 0)branding.agencyName=agencyName;if(logo!==void 0)branding.logo=logo;if(primaryColor!==void 0)branding.primaryColor=primaryColor;if(branding.primaryColor&&!/^#[0-9a-f]{6}$/i.test(branding.primaryColor)){throw new Error("report.primaryColor must be a six-digit hex color")}result.report=Object.fromEntries(Object.entries(branding).filter(([,child])=>child!==void 0))}return result}function resolveConfig(cli,file={},baseline={}){const merged={...DEFAULT_SCAN_CONFIG,...baseline,...file,...cli};return{...merged,schemaVersion:1,severityOverrides:{...baseline.severityOverrides??{},...file.severityOverrides??{},...cli.severityOverrides??{}},regressionBudgets:{...baseline.regressionBudgets??{},...file.regressionBudgets??{},...cli.regressionBudgets??{}},report:{...baseline.report??{},...file.report??{},...cli.report??{}},suppressions:cli.suppressions??file.suppressions??baseline.suppressions??[]}}function noop(){}var NOOP_LOGGER=Object.freeze({debug:noop,info:noop,warn:noop,error:noop});import{setTimeout as sleep}from"node:timers/promises";function createRequestGate(intervalMs=0,{now=Date.now,wait=sleep}={}){const interval=Math.max(0,intervalMs);let nextStartAt=0;let queue=Promise.resolve();return function waitForRequestSlot(){if(interval===0)return Promise.resolve();const slot=queue.then(async()=>{const remaining=Math.max(0,nextStartAt-now());if(remaining>0)await wait(remaining);nextStartAt=now()+interval});queue=slot.catch(()=>void 0);return slot}}function createPerOriginRequestGate(intervalMs=0,factory=createRequestGate){const gates=new Map;return url=>{const origin=new URL(url).origin;let gate=gates.get(origin);if(!gate){gate=factory(intervalMs);gates.set(origin,gate)}return gate()}}import{createHash as createHash3}from"node:crypto";import{setTimeout as sleep2}from"node:timers/promises";var RequestFailure=class extends Error{redirectChain;constructor(message,redirectChain=[],options){super(message,options);this.name="RequestFailure";this.redirectChain=redirectChain}};function retryableStatus(status){return status===429||status===500||status===502||status===503||status===504}function retryAfterMs(value,now=Date.now()){if(!value)return null;const seconds=Number(value);if(Number.isFinite(seconds)&&seconds>=0)return Math.min(seconds*1e3,3e4);const date=Date.parse(value);return Number.isNaN(date)?null:Math.min(Math.max(0,date-now),3e4)}function requestSignal(timeout,signal){const timeoutSignal=AbortSignal.timeout(timeout);return signal?AbortSignal.any([signal,timeoutSignal]):timeoutSignal}async function fetchRedirectChain(initialUrl,init,policy2){const chain=[];const visited=new Set([initialUrl]);let url=initialUrl;while(true){policy2.signal?.throwIfAborted();await policy2.gate?.(url);const response=await policy2.fetch(url,{...init,redirect:"manual",signal:requestSignal(policy2.timeout,policy2.signal)});const location=response.headers.get("location");if(response.status<300||response.status>=400||!location){return{response,redirectChain:chain}}const next=new URL(location,url).href;chain.push({url,status:response.status,location:next});await response.body?.cancel();if(visited.has(next))throw new RequestFailure(`redirect loop detected at ${next}`,chain);if(chain.length>policy2.maxRedirects){throw new RequestFailure(`redirect limit of ${policy2.maxRedirects} exceeded`,chain)}visited.add(next);url=next}}async function fetchWithRetry(url,init,policy2){let lastError;for(let attempt=0;attempt<=policy2.retries;attempt+=1){try{const result=await fetchRedirectChain(url,init,policy2);if(!retryableStatus(result.response.status)||attempt===policy2.retries)return result;const serverDelay=retryAfterMs(result.response.headers.get("retry-after"));await result.response.body?.cancel();const jitter=Math.floor((policy2.random??Math.random)()*100);const delayMs=serverDelay??Math.min(250*2**attempt+jitter,3e4);await policy2.onEvent?.({type:"retry",url,attempt:attempt+1,delayMs});await sleep2(delayMs,void 0,{signal:policy2.signal})}catch(error){if(policy2.signal?.aborted)throw policy2.signal.reason??error;lastError=error;if(error instanceof RequestFailure||attempt===policy2.retries)break;const jitter=Math.floor((policy2.random??Math.random)()*100);const delayMs=Math.min(250*2**attempt+jitter,3e4);await policy2.onEvent?.({type:"retry",url,attempt:attempt+1,delayMs});await sleep2(delayMs,void 0,{signal:policy2.signal})}}if(lastError instanceof RequestFailure)throw lastError;throw new RequestFailure(lastError instanceof Error?lastError.message:String(lastError),[],{cause:lastError})}async function readResponseBody(response,maxBytes){if(!response.body)return{text:"",bytes:0,buffer:Buffer.alloc(0)};const reader=response.body.getReader();const chunks=[];let total=0;while(true){const{done,value}=await reader.read();if(done)break;total+=value.byteLength;if(total>maxBytes){await reader.cancel();throw new RequestFailure(`response exceeds ${maxBytes} bytes`)}chunks.push(Buffer.from(value))}const buffer=Buffer.concat(chunks);return{text:buffer.toString("utf8"),bytes:total,buffer}}function patternMatches(pathWithQuery,pattern){if(!pattern)return false;const anchored=pattern.endsWith("$");const source=anchored?pattern.slice(0,-1):pattern;const escaped=source.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${escaped}${anchored?"$":""}`).test(pathWithQuery)}function parseRobots(body,userAgent){const groups=[];let current=null;for(const rawLine of body.replace(/^\uFEFF/,"").split(/\r?\n/)){const line=rawLine.replace(/#.*$/,"").trim();const separator=line.indexOf(":");if(!line||separator<0)continue;const field=line.slice(0,separator).trim().toLowerCase();const value=line.slice(separator+1).trim();if(field==="user-agent"){if(!current||current.hasRules){current={agents:[],rules:[],hasRules:false};groups.push(current)}if(value)current.agents.push(value.toLowerCase());continue}if(current&&(field==="allow"||field==="disallow")&&value){current.rules.push({type:field,path:value});current.hasRules=true}}const normalizedAgent=userAgent.toLowerCase();const specific=groups.filter(group=>group.agents.some(agent=>agent!=="*"&&normalizedAgent.includes(agent)));const matching=specific.length>0?specific:groups.filter(group=>group.agents.includes("*"));return matching.flatMap(group=>group.rules)}function isAllowedByRobots(url,robots){if(robots.denyAll)return false;const parsed=new URL(url);const pathWithQuery=`${parsed.pathname}${parsed.search}`;const matches=(robots.rules??[]).filter(rule=>patternMatches(pathWithQuery,rule.path)).sort((left,right)=>right.path.length-left.path.length||(left.type==="allow"?-1:1));return matches.length===0||matches[0]?.type==="allow"}async function fetchRobots(startUrl,options){const robotsUrl=new URL("/robots.txt",startUrl).href;try{const{response}=await fetchWithRetry(robotsUrl,{headers:{accept:"text/plain,*/*;q=0.1","user-agent":options.userAgent}},{fetch:options.fetch,timeout:options.timeout,maxRedirects:options.maxRedirects,retries:options.retries,signal:options.signal,gate:options.requestGate,onEvent:options.onEvent});const{text:body}=await readResponseBody(response,MAX_ROBOTS_BYTES);return{url:robotsUrl,status:response.status,body,sha256:createHash3("sha256").update(body).digest("hex"),rules:response.ok?parseRobots(body,options.userAgent):[],denyAll:response.status===401||response.status===403,error:null}}catch(error){if(options.signal?.aborted)throw error;return{url:robotsUrl,status:null,body:"",sha256:null,rules:[],denyAll:false,error:error instanceof Error?error.message:String(error)}}}var MAX_ROBOTS_BYTES=512*1024;import{gunzipSync}from"node:zlib";var nameStartChar=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";var nameChar=nameStartChar+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040";var nameRegexp="["+nameStartChar+"]["+nameChar+"]*";var regexName=new RegExp("^"+nameRegexp+"$");function getAllMatches(string,regex){const matches=[];let match=regex.exec(string);while(match){const allmatches=[];allmatches.startIndex=regex.lastIndex-match[0].length;const len=match.length;for(let index=0;index<len;index++){allmatches.push(match[index])}matches.push(allmatches);match=regex.exec(string)}return matches}var isName=function(string){const match=regexName.exec(string);return!(match===null||typeof match==="undefined")};function isExist(v){return typeof v!=="undefined"}var DANGEROUS_PROPERTY_NAMES=["hasOwnProperty","toString","valueOf","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"];var criticalProperties=["__proto__","constructor","prototype"];var defaultOptions={allowBooleanAttributes:false,unpairedTags:[]};function validate(xmlData,options){options=Object.assign({},defaultOptions,options);const tags=[];let tagFound=false;let reachedRoot=false;if(xmlData[0]==="\uFEFF"){xmlData=xmlData.substr(1)}for(let i=0;i<xmlData.length;i++){if(xmlData[i]==="<"&&xmlData[i+1]==="?"){i+=2;i=readPI(xmlData,i);if(i.err)return i}else if(xmlData[i]==="<"){let tagStartPos=i;i++;if(xmlData[i]==="!"){i=readCommentAndCDATA(xmlData,i);continue}else{let closingTag=false;if(xmlData[i]==="/"){closingTag=true;i++}let tagName="";for(;i<xmlData.length&&xmlData[i]!==">"&&xmlData[i]!==" "&&xmlData[i]!==" "&&xmlData[i]!=="\n"&&xmlData[i]!=="\r";i++){tagName+=xmlData[i]}tagName=tagName.trim();if(tagName[tagName.length-1]==="/"){tagName=tagName.substring(0,tagName.length-1);i--}if(!validateTagName(tagName)){let msg;if(tagName.trim().length===0){msg="Invalid space after '<'."}else{msg="Tag '"+tagName+"' is an invalid name."}return getErrorObject("InvalidTag",msg,getLineNumberForPosition(xmlData,i))}const result=readAttributeStr(xmlData,i);if(result===false){return getErrorObject("InvalidAttr","Attributes for '"+tagName+"' have open quote.",getLineNumberForPosition(xmlData,i))}let attrStr=result.value;i=result.index;if(attrStr[attrStr.length-1]==="/"){const attrStrStart=i-attrStr.length;attrStr=attrStr.substring(0,attrStr.length-1);const isValid=validateAttributeString(attrStr,options);if(isValid===true){tagFound=true}else{return getErrorObject(isValid.err.code,isValid.err.msg,getLineNumberForPosition(xmlData,attrStrStart+isValid.err.line))}}else if(closingTag){if(!result.tagClosed){return getErrorObject("InvalidTag","Closing tag '"+tagName+"' doesn't have proper closing.",getLineNumberForPosition(xmlData,i))}else if(attrStr.trim().length>0){return getErrorObject("InvalidTag","Closing tag '"+tagName+"' can't have attributes or invalid starting.",getLineNumberForPosition(xmlData,tagStartPos))}else if(tags.length===0){return getErrorObject("InvalidTag","Closing tag '"+tagName+"' has not been opened.",getLineNumberForPosition(xmlData,tagStartPos))}else{const otg=tags.pop();if(tagName!==otg.tagName){let openPos=getLineNumberForPosition(xmlData,otg.tagStartPos);return getErrorObject("InvalidTag","Expected closing tag '"+otg.tagName+"' (opened in line "+openPos.line+", col "+openPos.col+") instead of closing tag '"+tagName+"'.",getLineNumberForPosition(xmlData,tagStartPos))}if(tags.length==0){reachedRoot=true}}}else{const isValid=validateAttributeString(attrStr,options);if(isValid!==true){return getErrorObject(isValid.err.code,isValid.err.msg,getLineNumberForPosition(xmlData,i-attrStr.length+isValid.err.line))}if(reachedRoot===true){return getErrorObject("InvalidXml","Multiple possible root nodes found.",getLineNumberForPosition(xmlData,i))}else if(options.unpairedTags.indexOf(tagName)!==-1){}else{tags.push({tagName,tagStartPos})}tagFound=true}for(i++;i<xmlData.length;i++){if(xmlData[i]==="<"){if(xmlData[i+1]==="!"){i++;i=readCommentAndCDATA(xmlData,i);continue}else if(xmlData[i+1]==="?"){i=readPI(xmlData,++i);if(i.err)return i}else{break}}else if(xmlData[i]==="&"){const afterAmp=validateAmpersand(xmlData,i);if(afterAmp==-1)return getErrorObject("InvalidChar","char '&' is not expected.",getLineNumberForPosition(xmlData,i));i=afterAmp}else{if(reachedRoot===true&&!isWhiteSpace(xmlData[i])){return getErrorObject("InvalidXml","Extra text at the end",getLineNumberForPosition(xmlData,i))}}}if(xmlData[i]==="<"){i--}}}else{if(isWhiteSpace(xmlData[i])){continue}return getErrorObject("InvalidChar","char '"+xmlData[i]+"' is not expected.",getLineNumberForPosition(xmlData,i))}}if(!tagFound){return getErrorObject("InvalidXml","Start tag expected.",1)}else if(tags.length==1){return getErrorObject("InvalidTag","Unclosed tag '"+tags[0].tagName+"'.",getLineNumberForPosition(xmlData,tags[0].tagStartPos))}else if(tags.length>0){return getErrorObject("InvalidXml","Invalid '"+JSON.stringify(tags.map(t=>t.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1})}return true}function isWhiteSpace(char){return char===" "||char===" "||char==="\n"||char==="\r"}function readPI(xmlData,i){const start=i;for(;i<xmlData.length;i++){if(xmlData[i]=="?"||xmlData[i]==" "){const tagname=xmlData.substr(start,i-start);if(i>5&&tagname==="xml"){return getErrorObject("InvalidXml","XML declaration allowed only at the start of the document.",getLineNumberForPosition(xmlData,i))}else if(xmlData[i]=="?"&&xmlData[i+1]==">"){i++;break}else{continue}}}return i}function readCommentAndCDATA(xmlData,i){if(xmlData.length>i+5&&xmlData[i+1]==="-"&&xmlData[i+2]==="-"){for(i+=3;i<xmlData.length;i++){if(xmlData[i]==="-"&&xmlData[i+1]==="-"&&xmlData[i+2]===">"){i+=2;break}}}else if(xmlData.length>i+8&&xmlData[i+1]==="D"&&xmlData[i+2]==="O"&&xmlData[i+3]==="C"&&xmlData[i+4]==="T"&&xmlData[i+5]==="Y"&&xmlData[i+6]==="P"&&xmlData[i+7]==="E"){let angleBracketsCount=1;for(i+=8;i<xmlData.length;i++){if(xmlData[i]==="<"){angleBracketsCount++}else if(xmlData[i]===">"){angleBracketsCount--;if(angleBracketsCount===0){break}}}}else if(xmlData.length>i+9&&xmlData[i+1]==="["&&xmlData[i+2]==="C"&&xmlData[i+3]==="D"&&xmlData[i+4]==="A"&&xmlData[i+5]==="T"&&xmlData[i+6]==="A"&&xmlData[i+7]==="["){for(i+=8;i<xmlData.length;i++){if(xmlData[i]==="]"&&xmlData[i+1]==="]"&&xmlData[i+2]===">"){i+=2;break}}}return i}var doubleQuote='"';var singleQuote="'";function readAttributeStr(xmlData,i){let attrStr="";let startChar="";let tagClosed=false;for(;i<xmlData.length;i++){if(xmlData[i]===doubleQuote||xmlData[i]===singleQuote){if(startChar===""){startChar=xmlData[i]}else if(startChar!==xmlData[i]){}else{startChar=""}}else if(xmlData[i]===">"){if(startChar===""){tagClosed=true;break}}attrStr+=xmlData[i]}if(startChar!==""){return false}return{value:attrStr,index:i,tagClosed}}var validAttrStrRegxp=new RegExp(`(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['"])(([\\s\\S])*?)\\5)?`,"g");function validateAttributeString(attrStr,options){const matches=getAllMatches(attrStr,validAttrStrRegxp);const attrNames={};for(let i=0;i<matches.length;i++){if(matches[i][1].length===0){return getErrorObject("InvalidAttr","Attribute '"+matches[i][2]+"' has no space in starting.",getPositionFromMatch(matches[i]))}else if(matches[i][3]!==void 0&&matches[i][4]===void 0){return getErrorObject("InvalidAttr","Attribute '"+matches[i][2]+"' is without value.",getPositionFromMatch(matches[i]))}else if(matches[i][3]===void 0&&!options.allowBooleanAttributes){return getErrorObject("InvalidAttr","boolean attribute '"+matches[i][2]+"' is not allowed.",getPositionFromMatch(matches[i]))}const attrName=matches[i][2];if(!validateAttrName(attrName)){return getErrorObject("InvalidAttr","Attribute '"+attrName+"' is an invalid name.",getPositionFromMatch(matches[i]))}if(!Object.prototype.hasOwnProperty.call(attrNames,attrName)){attrNames[attrName]=1}else{return getErrorObject("InvalidAttr","Attribute '"+attrName+"' is repeated.",getPositionFromMatch(matches[i]))}}return true}function validateNumberAmpersand(xmlData,i){let re=/\d/;if(xmlData[i]==="x"){i++;re=/[\da-fA-F]/}for(;i<xmlData.length;i++){if(xmlData[i]===";")return i;if(!xmlData[i].match(re))break}return-1}function validateAmpersand(xmlData,i){i++;if(xmlData[i]===";")return-1;if(xmlData[i]==="#"){i++;return validateNumberAmpersand(xmlData,i)}let count=0;for(;i<xmlData.length;i++,count++){if(xmlData[i].match(/\w/)&&count<20)continue;if(xmlData[i]===";")break;return-1}return i}function getErrorObject(code,message,lineNumber){return{err:{code,msg:message,line:lineNumber.line||lineNumber,col:lineNumber.col}}}function validateAttrName(attrName){return isName(attrName)}function validateTagName(tagname){return isName(tagname)}function getLineNumberForPosition(xmlData,index){const lines=xmlData.substring(0,index).split(/\r?\n/);return{line:lines.length,col:lines[lines.length-1].length+1}}function getPositionFromMatch(match){return match.startIndex+match[1].length}var CURRENCY={cent:"\xA2",pound:"\xA3",curren:"\xA4",yen:"\xA5",euro:"\u20AC",dollar:"$",fnof:"\u0192",inr:"\u20B9",af:"\u060B",birr:"\u1265\u122D",peso:"\u20B1",rub:"\u20BD",won:"\u20A9",yuan:"\xA5",cedil:"\xB8"};var XML={amp:"&",apos:"'",gt:">",lt:"<",quot:'"'};var COMMON_HTML={nbsp:"\xA0",copy:"\xA9",reg:"\xAE",trade:"\u2122",mdash:"\u2014",ndash:"\u2013",hellip:"\u2026",laquo:"\xAB",raquo:"\xBB",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",bull:"\u2022",para:"\xB6",sect:"\xA7",deg:"\xB0",frac12:"\xBD",frac14:"\xBC",frac34:"\xBE"};var ENTITY_ACTION=Object.freeze({ALLOW:"allow",BLOCK:"block",THROW:"throw"});var SPECIAL_CHARS=new Set("!?\\\\/[]$%{}^&*()<>|+");function validateEntityName(name){if(name[0]==="#"){throw new Error(`[EntityReplacer] Invalid character '#' in entity name: "${name}"`)}for(const ch of name){if(SPECIAL_CHARS.has(ch)){throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: "${name}"`)}}return name}function mergeEntityMaps(...maps){const out=Object.create(null);for(const map of maps){if(!map)continue;for(const key of Object.keys(map)){const raw=map[key];if(typeof raw==="string"){out[key]=raw}else if(raw&&typeof raw==="object"&&raw.val!==void 0){const val=raw.val;if(typeof val==="string"){out[key]=val}}}}return out}var LIMIT_TIER_EXTERNAL="external";var LIMIT_TIER_BASE="base";var LIMIT_TIER_ALL="all";function parseLimitTiers(raw){if(!raw||raw===LIMIT_TIER_EXTERNAL)return new Set([LIMIT_TIER_EXTERNAL]);if(raw===LIMIT_TIER_ALL)return new Set([LIMIT_TIER_ALL]);if(raw===LIMIT_TIER_BASE)return new Set([LIMIT_TIER_BASE]);if(Array.isArray(raw))return new Set(raw);return new Set([LIMIT_TIER_EXTERNAL])}var NCR_LEVEL=Object.freeze({allow:0,leave:1,remove:2,throw:3});var XML10_ALLOWED_C0=new Set([9,10,13]);function parseNCRConfig(ncr){if(!ncr){return{xmlVersion:1,onLevel:NCR_LEVEL.allow,nullLevel:NCR_LEVEL.remove}}const xmlVersion=ncr.xmlVersion===1.1?1.1:1;const onLevel=NCR_LEVEL[ncr.onNCR]??NCR_LEVEL.allow;const nullLevel=NCR_LEVEL[ncr.nullNCR]??NCR_LEVEL.remove;const clampedNull=Math.max(nullLevel,NCR_LEVEL.remove);return{xmlVersion,onLevel,nullLevel:clampedNull}}var EntityDecoder=class{constructor(options={}){this._limit=options.limit||{};this._maxTotalExpansions=this._limit.maxTotalExpansions||0;this._maxExpandedLength=this._limit.maxExpandedLength||0;this._postCheck=typeof options.postCheck==="function"?options.postCheck:r=>r;this._limitTiers=parseLimitTiers(this._limit.applyLimitsTo??LIMIT_TIER_EXTERNAL);this._numericAllowed=options.numericAllowed??true;this._baseMap=mergeEntityMaps(XML,options.namedEntities||null);this._externalMap=Object.create(null);this._inputMap=Object.create(null);this._totalExpansions=0;this._expandedLength=0;this._removeSet=new Set(options.remove&&Array.isArray(options.remove)?options.remove:[]);this._leaveSet=new Set(options.leave&&Array.isArray(options.leave)?options.leave:[]);const ncrCfg=parseNCRConfig(options.ncr);this._ncrXmlVersion=ncrCfg.xmlVersion;this._ncrOnLevel=ncrCfg.onLevel;this._ncrNullLevel=ncrCfg.nullLevel;this._onExternalEntity=typeof options.onExternalEntity==="function"?options.onExternalEntity:null;this._onInputEntity=typeof options.onInputEntity==="function"?options.onInputEntity:null}_applyRegistrationHook(hook,name,value,context){if(!hook)return true;const action=hook(name,value);if(action===ENTITY_ACTION.BLOCK)return false;if(action===ENTITY_ACTION.THROW){throw new Error(`[EntityDecoder] Registration of ${context} entity "&${name};" was rejected by hook`)}return true}setExternalEntities(map){if(map){for(const key of Object.keys(map)){validateEntityName(key)}}if(!this._onExternalEntity){this._externalMap=mergeEntityMaps(map);return}const flat=mergeEntityMaps(map);const filtered=Object.create(null);for(const[name,value]of Object.entries(flat)){if(this._applyRegistrationHook(this._onExternalEntity,name,value,"external")){filtered[name]=value}}this._externalMap=filtered}addExternalEntity(key,value){validateEntityName(key);if(typeof value==="string"&&value.indexOf("&")===-1){if(this._applyRegistrationHook(this._onExternalEntity,key,value,"external")){this._externalMap[key]=value}}}addInputEntities(map){this._totalExpansions=0;this._expandedLength=0;if(!this._onInputEntity){this._inputMap=mergeEntityMaps(map);return}const flat=mergeEntityMaps(map);const filtered=Object.create(null);for(const[name,value]of Object.entries(flat)){if(this._applyRegistrationHook(this._onInputEntity,name,value,"input")){filtered[name]=value}}this._inputMap=filtered}reset(){this._inputMap=Object.create(null);this._totalExpansions=0;this._expandedLength=0;return this}setXmlVersion(version){this._ncrXmlVersion=version===1.1?1.1:1}decode(str){if(typeof str!=="string"||str.length===0)return str;if(str.indexOf("&")===-1)return str;const original=str;const chunks=[];const len=str.length;let last=0;let i=0;const limitExpansions=this._maxTotalExpansions>0;const limitLength=this._maxExpandedLength>0;const checkLimits=limitExpansions||limitLength;while(i<len){if(str.charCodeAt(i)!==38){i++;continue}let j=i+1;while(j<len&&str.charCodeAt(j)!==59&&j-i<=32)j++;if(j>=len||str.charCodeAt(j)!==59){i++;continue}const token=str.slice(i+1,j);if(token.length===0){i++;continue}let replacement;let tier;if(this._removeSet.has(token)){replacement="";if(tier===void 0){tier=LIMIT_TIER_EXTERNAL}}else if(this._leaveSet.has(token)){i++;continue}else if(token.charCodeAt(0)===35){const ncrResult=this._resolveNCR(token);if(ncrResult===void 0){i++;continue}replacement=ncrResult;tier=LIMIT_TIER_BASE}else{const resolved=this._resolveName(token);replacement=resolved?.value;tier=resolved?.tier}if(replacement===void 0){i++;continue}if(i>last)chunks.push(str.slice(last,i));chunks.push(replacement);last=j+1;i=last;if(checkLimits&&this._tierCounts(tier)){if(limitExpansions){this._totalExpansions++;if(this._totalExpansions>this._maxTotalExpansions){throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`)}}if(limitLength){const delta=replacement.length-(token.length+2);if(delta>0){this._expandedLength+=delta;if(this._expandedLength>this._maxExpandedLength){throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}}}if(last<len)chunks.push(str.slice(last));const result=chunks.length===0?str:chunks.join("");return this._postCheck(result,original)}_tierCounts(tier){if(this._limitTiers.has(LIMIT_TIER_ALL))return true;return this._limitTiers.has(tier)}_resolveName(name){if(name in this._inputMap)return{value:this._inputMap[name],tier:LIMIT_TIER_EXTERNAL};if(name in this._externalMap)return{value:this._externalMap[name],tier:LIMIT_TIER_EXTERNAL};if(name in this._baseMap)return{value:this._baseMap[name],tier:LIMIT_TIER_BASE};return void 0}_classifyNCR(cp){if(cp===0)return this._ncrNullLevel;if(cp>=55296&&cp<=57343)return NCR_LEVEL.remove;if(this._ncrXmlVersion===1){if(cp>=1&&cp<=31&&!XML10_ALLOWED_C0.has(cp))return NCR_LEVEL.remove}return-1}_applyNCRAction(action,token,cp){switch(action){case NCR_LEVEL.allow:return String.fromCodePoint(cp);case NCR_LEVEL.remove:return"";case NCR_LEVEL.leave:return void 0;case NCR_LEVEL.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${token}; (U+${cp.toString(16).toUpperCase().padStart(4,"0")})`);default:return String.fromCodePoint(cp)}}_resolveNCR(token){const second=token.charCodeAt(1);let cp;if(second===120||second===88){cp=parseInt(token.slice(2),16)}else{cp=parseInt(token.slice(1),10)}if(Number.isNaN(cp)||cp<0||cp>1114111)return void 0;const minimum=this._classifyNCR(cp);if(!this._numericAllowed&&minimum<NCR_LEVEL.remove)return void 0;const effective=minimum===-1?this._ncrOnLevel:Math.max(this._ncrOnLevel,minimum);return this._applyNCRAction(effective,token,cp)}};var defaultOnDangerousProperty=name=>{if(DANGEROUS_PROPERTY_NAMES.includes(name)){return"__"+name}return name};var defaultOptions2={preserveOrder:false,attributeNamePrefix:"@_",attributesGroupName:false,textNodeName:"#text",ignoreAttributes:true,removeNSPrefix:false,allowBooleanAttributes:false,parseTagValue:true,parseAttributeValue:false,trimValues:true,cdataPropName:false,numberParseOptions:{hex:true,leadingZeros:true,eNotation:true,unicode:false},tagValueProcessor:function(tagName,val){return val},attributeValueProcessor:function(attrName,val){return val},stopNodes:[],alwaysCreateTextNode:false,isArray:()=>false,commentPropName:false,unpairedTags:[],processEntities:true,htmlEntities:false,entityDecoder:null,ignoreDeclaration:false,ignorePiTags:false,transformTagName:false,transformAttributeName:false,updateTag:function(tagName,jPath,attrs){return tagName},captureMetaData:false,maxNestedTags:100,strictReservedNames:true,jPath:true,onDangerousProperty:defaultOnDangerousProperty};function validatePropertyName(propertyName,optionName){if(typeof propertyName!=="string"){return}const normalized=propertyName.toLowerCase();if(DANGEROUS_PROPERTY_NAMES.some(dangerous=>normalized===dangerous.toLowerCase())){throw new Error(`[SECURITY] Invalid ${optionName}: "${propertyName}" is a reserved JavaScript keyword that could cause prototype pollution`)}if(criticalProperties.some(dangerous=>normalized===dangerous.toLowerCase())){throw new Error(`[SECURITY] Invalid ${optionName}: "${propertyName}" is a reserved JavaScript keyword that could cause prototype pollution`)}}function normalizeProcessEntities(value,htmlEntities){if(typeof value==="boolean"){return{enabled:value,maxEntitySize:1e4,maxExpansionDepth:1e4,maxTotalExpansions:Infinity,maxExpandedLength:1e5,maxEntityCount:1e3,allowedTags:null,tagFilter:null,appliesTo:"all"}}if(typeof value==="object"&&value!==null){return{enabled:value.enabled!==false,maxEntitySize:Math.max(1,value.maxEntitySize??1e4),maxExpansionDepth:Math.max(1,value.maxExpansionDepth??1e4),maxTotalExpansions:Math.max(1,value.maxTotalExpansions??Infinity),maxExpandedLength:Math.max(1,value.maxExpandedLength??1e5),maxEntityCount:Math.max(1,value.maxEntityCount??1e3),allowedTags:value.allowedTags??null,tagFilter:value.tagFilter??null,appliesTo:value.appliesTo??"all"}}return normalizeProcessEntities(true)}var buildOptions=function(options){const built=Object.assign({},defaultOptions2,options);const propertyNameOptions=[{value:built.attributeNamePrefix,name:"attributeNamePrefix"},{value:built.attributesGroupName,name:"attributesGroupName"},{value:built.textNodeName,name:"textNodeName"},{value:built.cdataPropName,name:"cdataPropName"},{value:built.commentPropName,name:"commentPropName"}];for(const{value,name}of propertyNameOptions){if(value){validatePropertyName(value,name)}}if(built.onDangerousProperty===null){built.onDangerousProperty=defaultOnDangerousProperty}built.processEntities=normalizeProcessEntities(built.processEntities,built.htmlEntities);built.unpairedTagsSet=new Set(built.unpairedTags);if(built.stopNodes&&Array.isArray(built.stopNodes)){built.stopNodes=built.stopNodes.map(node=>{if(typeof node==="string"&&node.startsWith("*.")){return".."+node.substring(2)}return node})}return built};var METADATA_SYMBOL;if(typeof Symbol!=="function"){METADATA_SYMBOL="@@xmlMetadata"}else{METADATA_SYMBOL=Symbol("XML Node Metadata")}var XmlNode=class{constructor(tagname){this.tagname=tagname;this.child=[];this[":@"]=Object.create(null)}add(key,val){if(key==="__proto__")key="#__proto__";this.child.push({[key]:val})}addChild(node,startIndex){if(node.tagname==="__proto__")node.tagname="#__proto__";if(node[":@"]&&Object.keys(node[":@"]).length>0){this.child.push({[node.tagname]:node.child,[":@"]:node[":@"]})}else{this.child.push({[node.tagname]:node.child})}if(startIndex!==void 0){this.child[this.child.length-1][METADATA_SYMBOL]={startIndex}}}static getMetaDataSymbol(){return METADATA_SYMBOL}};var nameStartChar10=":A-Za-z_\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD";var nameChar10=nameStartChar10+"\\-\\.\\d\xB7\u0300-\u036F\u203F-\u2040";var nameStartChar11=":A-Za-z_\xC0-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}";var nameChar11=nameStartChar11+"\\-\\.\\d\xB7\u0300-\u036F\u0487\u203F-\u2040";var buildRegexes=(startChar,char,flags="")=>{const ncStart=startChar.replace(":","");const ncChar=char.replace(":","");const ncNamePat=`[${ncStart}][${ncChar}]*`;return{name:new RegExp(`^[${startChar}][${char}]*$`,flags),ncName:new RegExp(`^${ncNamePat}$`,flags),qName:new RegExp(`^${ncNamePat}(?::${ncNamePat})?$`,flags),nmToken:new RegExp(`^[${char}]+$`,flags),nmTokens:new RegExp(`^[${char}]+(?:\\s+[${char}]+)*$`,flags)}};var regexes10=buildRegexes(nameStartChar10,nameChar10);var regexes11=buildRegexes(nameStartChar11,nameChar11,"u");var nameStartCharAscii=":A-Za-z_";var nameCharAscii=nameStartCharAscii+"\\-\\.\\d";var regexesAscii=buildRegexes(nameStartCharAscii,nameCharAscii);var getRegexes=(xmlVersion="1.0",asciiOnly=false)=>{if(asciiOnly)return regexesAscii;return xmlVersion==="1.1"?regexes11:regexes10};var qName=(str,{xmlVersion="1.0",asciiOnly=false}={})=>getRegexes(xmlVersion,asciiOnly).qName.test(str);var DocTypeReader=class{constructor(options,xmlVersion){this.suppressValidationErr=!options;this.options=options;this.xmlVersion=xmlVersion||1}setXmlVersion(xmlVersion=1){this.xmlVersion=xmlVersion}readDocType(xmlData,i){const entities=Object.create(null);let entityCount=0;if(xmlData[i+3]==="O"&&xmlData[i+4]==="C"&&xmlData[i+5]==="T"&&xmlData[i+6]==="Y"&&xmlData[i+7]==="P"&&xmlData[i+8]==="E"){i=i+9;let angleBracketsCount=1;let hasBody=false,comment=false;let exp="";for(;i<xmlData.length;i++){if(xmlData[i]==="<"&&!comment){if(hasBody&&hasSeq(xmlData,"!ENTITY",i)){i+=7;let entityName,val;[entityName,val,i]=this.readEntityExp(xmlData,i+1,this.suppressValidationErr);if(val.indexOf("&")===-1){if(this.options.enabled!==false&&this.options.maxEntityCount!=null&&entityCount>=this.options.maxEntityCount){throw new Error(`Entity count (${entityCount+1}) exceeds maximum allowed (${this.options.maxEntityCount})`)}entities[entityName]=val;entityCount++}}else if(hasBody&&hasSeq(xmlData,"!ELEMENT",i)){i+=8;const{index}=this.readElementExp(xmlData,i+1);i=index}else if(hasBody&&hasSeq(xmlData,"!ATTLIST",i)){i+=8}else if(hasBody&&hasSeq(xmlData,"!NOTATION",i)){i+=9;const{index}=this.readNotationExp(xmlData,i+1,this.suppressValidationErr);i=index}else if(hasSeq(xmlData,"!--",i))comment=true;else throw new Error(`Invalid DOCTYPE`);angleBracketsCount++;exp=""}else if(xmlData[i]===">"){if(comment){if(xmlData[i-1]==="-"&&xmlData[i-2]==="-"){comment=false;angleBracketsCount--}}else{angleBracketsCount--}if(angleBracketsCount===0){break}}else if(xmlData[i]==="["){hasBody=true}else{exp+=xmlData[i]}}if(angleBracketsCount!==0){throw new Error(`Unclosed DOCTYPE`)}}else{throw new Error(`Invalid Tag instead of DOCTYPE`)}return{entities,i}}readEntityExp(xmlData,i){i=skipWhitespace(xmlData,i);const startIndex=i;while(i<xmlData.length&&!/\s/.test(xmlData[i])&&xmlData[i]!=='"'&&xmlData[i]!=="'"){i++}let entityName=xmlData.substring(startIndex,i);validateEntityName2(entityName,{xmlVersion:this.xmlVersion});i=skipWhitespace(xmlData,i);if(!this.suppressValidationErr){if(xmlData.substring(i,i+6).toUpperCase()==="SYSTEM"){throw new Error("External entities are not supported")}else if(xmlData[i]==="%"){throw new Error("Parameter entities are not supported")}}let entityValue="";[i,entityValue]=this.readIdentifierVal(xmlData,i,"entity");if(this.options.enabled!==false&&this.options.maxEntitySize!=null&&entityValue.length>this.options.maxEntitySize){throw new Error(`Entity "${entityName}" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`)}i--;return[entityName,entityValue,i]}readNotationExp(xmlData,i){i=skipWhitespace(xmlData,i);const startIndex=i;while(i<xmlData.length&&!/\s/.test(xmlData[i])){i++}let notationName=xmlData.substring(startIndex,i);!this.suppressValidationErr&&validateEntityName2(notationName,{xmlVersion:this.xmlVersion});i=skipWhitespace(xmlData,i);const identifierType=xmlData.substring(i,i+6).toUpperCase();if(!this.suppressValidationErr&&identifierType!=="SYSTEM"&&identifierType!=="PUBLIC"){throw new Error(`Expected SYSTEM or PUBLIC, found "${identifierType}"`)}i+=identifierType.length;i=skipWhitespace(xmlData,i);let publicIdentifier=null;let systemIdentifier=null;if(identifierType==="PUBLIC"){[i,publicIdentifier]=this.readIdentifierVal(xmlData,i,"publicIdentifier");i=skipWhitespace(xmlData,i);if(xmlData[i]==='"'||xmlData[i]==="'"){[i,systemIdentifier]=this.readIdentifierVal(xmlData,i,"systemIdentifier")}}else if(identifierType==="SYSTEM"){[i,systemIdentifier]=this.readIdentifierVal(xmlData,i,"systemIdentifier");if(!this.suppressValidationErr&&!systemIdentifier){throw new Error("Missing mandatory system identifier for SYSTEM notation")}}return{notationName,publicIdentifier,systemIdentifier,index:--i}}readIdentifierVal(xmlData,i,type){let identifierVal="";const startChar=xmlData[i];if(startChar!=='"'&&startChar!=="'"){throw new Error(`Expected quoted string, found "${startChar}"`)}i++;const startIndex=i;while(i<xmlData.length&&xmlData[i]!==startChar){i++}identifierVal=xmlData.substring(startIndex,i);if(xmlData[i]!==startChar){throw new Error(`Unterminated ${type} value`)}i++;return[i,identifierVal]}readElementExp(xmlData,i){i=skipWhitespace(xmlData,i);const startIndex=i;while(i<xmlData.length&&!/\s/.test(xmlData[i])){i++}let elementName=xmlData.substring(startIndex,i);if(!this.suppressValidationErr&&!qName(elementName,{xmlVersion:this.xmlVersion})){throw new Error(`Invalid element name: "${elementName}"`)}i=skipWhitespace(xmlData,i);let contentModel="";if(xmlData[i]==="E"&&hasSeq(xmlData,"MPTY",i))i+=4;else if(xmlData[i]==="A"&&hasSeq(xmlData,"NY",i))i+=2;else if(xmlData[i]==="("){i++;const startIndex2=i;while(i<xmlData.length&&xmlData[i]!==")"){i++}contentModel=xmlData.substring(startIndex2,i);if(xmlData[i]!==")"){throw new Error("Unterminated content model")}}else if(!this.suppressValidationErr){throw new Error(`Invalid Element Expression, found "${xmlData[i]}"`)}return{elementName,contentModel:contentModel.trim(),index:i}}readAttlistExp(xmlData,i){i=skipWhitespace(xmlData,i);let startIndex=i;while(i<xmlData.length&&!/\s/.test(xmlData[i])){i++}let elementName=xmlData.substring(startIndex,i);validateEntityName2(elementName,{xmlVersion:this.xmlVersion});i=skipWhitespace(xmlData,i);startIndex=i;while(i<xmlData.length&&!/\s/.test(xmlData[i])){i++}let attributeName=xmlData.substring(startIndex,i);if(!validateEntityName2(attributeName,{xmlVersion:this.xmlVersion})){throw new Error(`Invalid attribute name: "${attributeName}"`)}i=skipWhitespace(xmlData,i);let attributeType="";if(xmlData.substring(i,i+8).toUpperCase()==="NOTATION"){attributeType="NOTATION";i+=8;i=skipWhitespace(xmlData,i);if(xmlData[i]!=="("){throw new Error(`Expected '(', found "${xmlData[i]}"`)}i++;let allowedNotations=[];while(i<xmlData.length&&xmlData[i]!==")"){const startIndex2=i;while(i<xmlData.length&&xmlData[i]!=="|"&&xmlData[i]!==")"){i++}let notation=xmlData.substring(startIndex2,i);notation=notation.trim();if(!validateEntityName2(notation,{xmlVersion:this.xmlVersion})){throw new Error(`Invalid notation name: "${notation}"`)}allowedNotations.push(notation);if(xmlData[i]==="|"){i++;i=skipWhitespace(xmlData,i)}}if(xmlData[i]!==")"){throw new Error("Unterminated list of notations")}i++;attributeType+=" ("+allowedNotations.join("|")+")"}else{const startIndex2=i;while(i<xmlData.length&&!/\s/.test(xmlData[i])){i++}attributeType+=xmlData.substring(startIndex2,i);const validTypes=["CDATA","ID","IDREF","IDREFS","ENTITY","ENTITIES","NMTOKEN","NMTOKENS"];if(!this.suppressValidationErr&&!validTypes.includes(attributeType.toUpperCase())){throw new Error(`Invalid attribute type: "${attributeType}"`)}}i=skipWhitespace(xmlData,i);let defaultValue="";if(xmlData.substring(i,i+8).toUpperCase()==="#REQUIRED"){defaultValue="#REQUIRED";i+=8}else if(xmlData.substring(i,i+7).toUpperCase()==="#IMPLIED"){defaultValue="#IMPLIED";i+=7}else{[i,defaultValue]=this.readIdentifierVal(xmlData,i,"ATTLIST")}return{elementName,attributeName,attributeType,defaultValue,index:i}}};var skipWhitespace=(data,index)=>{while(index<data.length&&/\s/.test(data[index])){index++}return index};function hasSeq(data,seq,i){for(let j=0;j<seq.length;j++){if(seq[j]!==data[i+j+1])return false}return true}function validateEntityName2(name,xmlVersion){if(qName(name,{xmlVersion}))return name;else throw new Error(`Invalid entity name ${name}`)}var SCRIPT_ZEROS=[48,1632,1776,2406,2534,2662,2790,2918,3046,3174,3302,3430,3558,3664,3792,3872,4160,4240,6112,6160,6470,6608,6784,6800,6992,7088,7232,7248,65296,120782,120792,120802,120812,120822,66720,68912,69734,69872,69942,70096,70384,70736,70864,71248,71360,71472,71904,72016,72688,72784,73040,73120,73552,92768,92864,93008,123200,123632,124144,125264,130032];var NOT_DIGIT=255;var HIGH_MAP=new Map;var LOW_MAX=65535;var LOW_MIN=1632;var TABLE_OFFSET=LOW_MIN;var TABLE_SIZE=LOW_MAX-LOW_MIN+1;var TABLE=new Uint8Array(TABLE_SIZE).fill(NOT_DIGIT);for(const zero of SCRIPT_ZEROS){for(let d=0;d<10;d++){const cp=zero+d;if(cp<=LOW_MAX){TABLE[cp-TABLE_OFFSET]=d}else{HIGH_MAP.set(cp,d)}}}var CHAR_0=48;var CHAR_9=57;var CHAR_MINUS=45;var MINUS_SET=new Set([8722,65293,65123]);function anynum(str){if(typeof str!=="string")return str;const len=str.length;if(len===0)return str;let firstHit=-1;for(let i=0;i<len;i++){const cc=str.charCodeAt(i);if(cc>=CHAR_0&&cc<=CHAR_9||cc===CHAR_MINUS)continue;if(cc<TABLE_OFFSET){if(MINUS_SET.has(cc)){firstHit=i;break}continue}if(cc>=55296&&cc<=56319){if(i+1<len){const low=str.charCodeAt(i+1);if(low>=56320&&low<=57343){const cp=65536+(cc-55296<<10)+(low-56320);if(HIGH_MAP.has(cp)){firstHit=i;break}}}continue}if(TABLE[cc-TABLE_OFFSET]!==NOT_DIGIT||MINUS_SET.has(cc)){firstHit=i;break}}if(firstHit===-1)return str;const chars=[];if(firstHit>0)chars.push(str.slice(0,firstHit));for(let i=firstHit;i<len;i++){const cc=str.charCodeAt(i);if(cc>=CHAR_0&&cc<=CHAR_9||cc===CHAR_MINUS){chars.push(str[i]);continue}if(cc<TABLE_OFFSET){chars.push(MINUS_SET.has(cc)?"-":str[i]);continue}if(cc>=55296&&cc<=56319){if(i+1<len){const low=str.charCodeAt(i+1);if(low>=56320&&low<=57343){const cp=65536+(cc-55296<<10)+(low-56320);const d2=HIGH_MAP.get(cp);if(d2!==void 0){chars.push(String.fromCharCode(d2+48));i++;continue}}}chars.push(str[i]);continue}if(MINUS_SET.has(cc)){chars.push("-");continue}const d=TABLE[cc-TABLE_OFFSET];chars.push(d!==NOT_DIGIT?String.fromCharCode(d+48):str[i])}return chars.join("")}var anynum_default=anynum;var hexRegex=/^[-+]?0x[a-fA-F0-9]+$/;var binRegex=/^0b[01]+$/;var octRegex=/^0o[0-7]+$/;var numRegex=/^([\-\+])?(0*)([0-9]*(\.[0-9]*)?)$/;var consider={hex:true,binary:false,octal:false,leadingZeros:true,decimalPoint:".",eNotation:true,infinity:"original",unicode:false};function toNumber(str,options={}){options=Object.assign({},consider,options);if(!str||typeof str!=="string")return str;let trimmedStr=str.trim();if(trimmedStr.length===0)return str;else if(options.skipLike!==void 0&&options.skipLike.test(trimmedStr))return str;else if(trimmedStr==="0")return 0;if(options.unicode){trimmedStr=anynum_default(trimmedStr);if(trimmedStr==="0")return 0}if(options.hex&&hexRegex.test(trimmedStr)){return parse_int(trimmedStr,16)}else if(options.binary&&binRegex.test(trimmedStr)){return parse_int(trimmedStr,2)}else if(options.octal&&octRegex.test(trimmedStr)){return parse_int(trimmedStr,8)}else if(!isFinite(trimmedStr)){return handleInfinity(str,Number(trimmedStr),options)}else if(trimmedStr.includes("e")||trimmedStr.includes("E")){return resolveEnotation(str,trimmedStr,options)}else{const match=numRegex.exec(trimmedStr);if(match){const sign=match[1]||"";const leadingZeros=match[2];let numTrimmedByZeros=trimZeros(match[3]);const decimalAdjacentToLeadingZeros=sign?str[leadingZeros.length+1]===".":str[leadingZeros.length]===".";if(!options.leadingZeros&&(leadingZeros.length>1||leadingZeros.length===1&&!decimalAdjacentToLeadingZeros)){return str}else{const num=Number(trimmedStr);const parsedStr=String(num);if(num===0)return num;if(parsedStr.search(/[eE]/)!==-1){if(options.eNotation)return num;else return str}else if(trimmedStr.indexOf(".")!==-1){if(parsedStr==="0")return num;else if(parsedStr===numTrimmedByZeros)return num;else if(parsedStr===`${sign}${numTrimmedByZeros}`)return num;else return str}let n=leadingZeros?numTrimmedByZeros:trimmedStr;if(leadingZeros){return n===parsedStr||sign+n===parsedStr?num:str}else{return n===parsedStr||n===sign+parsedStr?num:str}}}else{return str}}}var eNotationRegx=/^([-+])?(0*)(\d*(\.\d*)?[eE][-\+]?\d+)$/;function resolveEnotation(str,trimmedStr,options){if(!options.eNotation)return str;const notation=trimmedStr.match(eNotationRegx);if(notation){let sign=notation[1]||"";const eChar=notation[3].indexOf("e")===-1?"E":"e";const leadingZeros=notation[2];const eAdjacentToLeadingZeros=sign?str[leadingZeros.length+1]===eChar:str[leadingZeros.length]===eChar;if(leadingZeros.length>1&&eAdjacentToLeadingZeros)return str;else if(leadingZeros.length===1&&(notation[3].startsWith(`.${eChar}`)||notation[3][0]===eChar)){return Number(trimmedStr)}else if(leadingZeros.length>0){if(options.leadingZeros&&!eAdjacentToLeadingZeros){trimmedStr=(notation[1]||"")+notation[3];return Number(trimmedStr)}else return str}else{return Number(trimmedStr)}}else{return str}}function trimZeros(numStr){if(numStr&&numStr.indexOf(".")!==-1){numStr=numStr.replace(/0+$/,"");if(numStr===".")numStr="0";else if(numStr[0]===".")numStr="0"+numStr;else if(numStr[numStr.length-1]===".")numStr=numStr.substring(0,numStr.length-1);return numStr}return numStr}function parse_int(numStr,base){const str=numStr.trim();if(base===2||base===8)numStr=str.substring(2);if(parseInt)return parseInt(numStr,base);else if(Number.parseInt)return Number.parseInt(numStr,base);else if(window&&window.parseInt)return window.parseInt(numStr,base);else throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}function handleInfinity(str,num,options){const isPositive=num===Infinity;switch(options.infinity.toLowerCase()){case"null":return null;case"infinity":return num;case"string":return isPositive?"Infinity":"-Infinity";case"original":default:return str}}function getIgnoreAttributesFn(ignoreAttributes){if(typeof ignoreAttributes==="function"){return ignoreAttributes}if(Array.isArray(ignoreAttributes)){return attrName=>{for(const pattern of ignoreAttributes){if(typeof pattern==="string"&&attrName===pattern){return true}if(pattern instanceof RegExp&&pattern.test(attrName)){return true}}}}return()=>false}var Expression=class{constructor(pattern,options={},data){this.pattern=pattern;this.separator=options.separator||".";this.segments=this._parse(pattern);this.data=data;this._hasDeepWildcard=this.segments.some(seg=>seg.type==="deep-wildcard");this._hasAttributeCondition=this.segments.some(seg=>seg.attrName!==void 0);this._hasPositionSelector=this.segments.some(seg=>seg.position!==void 0)}_parse(pattern){const segments=[];let i=0;let currentPart="";while(i<pattern.length){if(pattern[i]===this.separator){if(i+1<pattern.length&&pattern[i+1]===this.separator){if(currentPart.trim()){segments.push(this._parseSegment(currentPart.trim()));currentPart=""}segments.push({type:"deep-wildcard"});i+=2}else{if(currentPart.trim()){segments.push(this._parseSegment(currentPart.trim()))}currentPart="";i++}}else{currentPart+=pattern[i];i++}}if(currentPart.trim()){segments.push(this._parseSegment(currentPart.trim()))}return segments}_parseSegment(part){const segment={type:"tag"};let bracketContent=null;let withoutBrackets=part;const bracketMatch=part.match(/^([^\[]+)(\[[^\]]*\])(.*)$/);if(bracketMatch){withoutBrackets=bracketMatch[1]+bracketMatch[3];if(bracketMatch[2]){const content=bracketMatch[2].slice(1,-1);if(content){bracketContent=content}}}let namespace=void 0;let tagAndPosition=withoutBrackets;if(withoutBrackets.includes("::")){const nsIndex=withoutBrackets.indexOf("::");namespace=withoutBrackets.substring(0,nsIndex).trim();tagAndPosition=withoutBrackets.substring(nsIndex+2).trim();if(!namespace){throw new Error(`Invalid namespace in pattern: ${part}`)}}let tag=void 0;let positionMatch=null;if(tagAndPosition.includes(":")){const colonIndex=tagAndPosition.lastIndexOf(":");const tagPart=tagAndPosition.substring(0,colonIndex).trim();const posPart=tagAndPosition.substring(colonIndex+1).trim();const isPositionKeyword=["first","last","odd","even"].includes(posPart)||/^nth\(\d+\)$/.test(posPart);if(isPositionKeyword){tag=tagPart;positionMatch=posPart}else{tag=tagAndPosition}}else{tag=tagAndPosition}if(!tag){throw new Error(`Invalid segment pattern: ${part}`)}segment.tag=tag;if(namespace){segment.namespace=namespace}if(bracketContent){if(bracketContent.includes("=")){const eqIndex=bracketContent.indexOf("=");segment.attrName=bracketContent.substring(0,eqIndex).trim();segment.attrValue=bracketContent.substring(eqIndex+1).trim()}else{segment.attrName=bracketContent.trim()}}if(positionMatch){const nthMatch=positionMatch.match(/^nth\((\d+)\)$/);if(nthMatch){segment.position="nth";segment.positionValue=parseInt(nthMatch[1],10)}else{segment.position=positionMatch}}return segment}get length(){return this.segments.length}hasDeepWildcard(){return this._hasDeepWildcard}hasAttributeCondition(){return this._hasAttributeCondition}hasPositionSelector(){return this._hasPositionSelector}toString(){return this.pattern}};var ExpressionSet=class{constructor(){this._byDepthAndTag=new Map;this._wildcardByDepth=new Map;this._deepWildcards=[];this._deepByTerminalTag=new Map;this._patterns=new Set;this._sealed=false}add(expression){if(this._sealed){throw new TypeError("ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.")}if(this._patterns.has(expression.pattern))return this;this._patterns.add(expression.pattern);if(expression.hasDeepWildcard()){const lastSeg2=expression.segments[expression.segments.length-1];if(lastSeg2&&lastSeg2.type!=="deep-wildcard"&&lastSeg2.tag!=="*"){const tag2=lastSeg2.tag;if(!this._deepByTerminalTag.has(tag2))this._deepByTerminalTag.set(tag2,[]);this._deepByTerminalTag.get(tag2).push(expression)}else{this._deepWildcards.push(expression)}return this}const depth=expression.length;const lastSeg=expression.segments[expression.segments.length-1];const tag=lastSeg?.tag;if(!tag||tag==="*"){if(!this._wildcardByDepth.has(depth))this._wildcardByDepth.set(depth,[]);this._wildcardByDepth.get(depth).push(expression)}else{const key=`${depth}:${tag}`;if(!this._byDepthAndTag.has(key))this._byDepthAndTag.set(key,[]);this._byDepthAndTag.get(key).push(expression)}return this}addAll(expressions){for(const expr of expressions)this.add(expr);return this}has(expression){return this._patterns.has(expression.pattern)}get size(){return this._patterns.size}seal(){this._sealed=true;return this}get isSealed(){return this._sealed}matchesAny(matcher){return this.findMatch(matcher)!==null}findMatch(matcher){const depth=matcher.getDepth();const tag=matcher.getCurrentTag();const exactKey=`${depth}:${tag}`;const exactBucket=this._byDepthAndTag.get(exactKey);if(exactBucket){for(let i=0;i<exactBucket.length;i++){if(matcher.matches(exactBucket[i]))return exactBucket[i]}}const wildcardBucket=this._wildcardByDepth.get(depth);if(wildcardBucket){for(let i=0;i<wildcardBucket.length;i++){if(matcher.matches(wildcardBucket[i]))return wildcardBucket[i]}}const deepBucket=this._deepByTerminalTag.get(tag);if(deepBucket){for(let i=0;i<deepBucket.length;i++){if(matcher.matches(deepBucket[i]))return deepBucket[i]}}for(let i=0;i<this._deepWildcards.length;i++){if(matcher.matches(this._deepWildcards[i]))return this._deepWildcards[i]}return null}};var MatcherView=class{constructor(matcher){this._matcher=matcher}get separator(){return this._matcher.separator}getCurrentTag(){const path=this._matcher.path;return path.length>0?path[path.length-1].tag:void 0}getCurrentNamespace(){const path=this._matcher.path;return path.length>0?path[path.length-1].namespace:void 0}getAttrValue(attrName){const path=this._matcher.path;if(path.length===0)return void 0;return path[path.length-1].values?.[attrName]}hasAttr(attrName){const path=this._matcher.path;if(path.length===0)return false;const current=path[path.length-1];return current.values!==void 0&&attrName in current.values}getAnyParentAttr(attrName){return this._matcher.getAnyParentAttr(attrName)}hasAnyParentAttr(attrName){return this._matcher.hasAnyParentAttr(attrName)}getPosition(){const path=this._matcher.path;if(path.length===0)return-1;return path[path.length-1].position??0}getCounter(){const path=this._matcher.path;if(path.length===0)return-1;return path[path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(separator,includeNamespace=true){return this._matcher.toString(separator,includeNamespace)}toArray(){return this._matcher.path.map(n=>n.tag)}matches(expression){return this._matcher.matches(expression)}matchesAny(exprSet){return exprSet.matchesAny(this._matcher)}};var Matcher=class{constructor(options={}){this.separator=options.separator||".";this.path=[];this.siblingStacks=[];this._pathStringCache=null;this._view=new MatcherView(this);this._keptAttrs=[]}push(tagName,attrValues=null,namespace=null,options=null){this._pathStringCache=null;if(this.path.length>0){this.path[this.path.length-1].values=void 0}const currentLevel=this.path.length;let level=this.siblingStacks[currentLevel];if(!level){level={counts:new Map,total:0};this.siblingStacks[currentLevel]=level}const siblingKey=namespace?`${namespace}:${tagName}`:tagName;const counter=level.counts.get(siblingKey)||0;const position=level.total;level.counts.set(siblingKey,counter+1);level.total++;const node={tag:tagName,position,counter};if(namespace!==null&&namespace!==void 0){node.namespace=namespace}if(attrValues!==null&&attrValues!==void 0){node.values=attrValues}this.path.push(node);const depth=this.path.length;const keep=options!==null?options.keep:null;if(keep!==null&&keep!==void 0&&keep.length>0&&attrValues){for(let i=0;i<keep.length;i++){const name=keep[i];if(attrValues[name]!==void 0){this._keptAttrs.push({depth,name,value:attrValues[name]})}}}}pop(){if(this.path.length===0)return void 0;this._pathStringCache=null;const node=this.path.pop();if(this.siblingStacks.length>this.path.length+1){this.siblingStacks.length=this.path.length+1}const poppedDepth=this.path.length+1;while(this._keptAttrs.length>0&&this._keptAttrs[this._keptAttrs.length-1].depth>=poppedDepth){this._keptAttrs.pop()}return node}updateCurrent(attrValues){if(this.path.length>0){const current=this.path[this.path.length-1];if(attrValues!==null&&attrValues!==void 0){current.values=attrValues}}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(attrName){if(this.path.length===0)return void 0;return this.path[this.path.length-1].values?.[attrName]}hasAttr(attrName){if(this.path.length===0)return false;const current=this.path[this.path.length-1];return current.values!==void 0&&attrName in current.values}getAnyParentAttr(attrName){const kept=this._keptAttrs;for(let i=kept.length-1;i>=0;i--){if(kept[i].name===attrName)return kept[i].value}return void 0}hasAnyParentAttr(attrName){const kept=this._keptAttrs;for(let i=kept.length-1;i>=0;i--){if(kept[i].name===attrName)return true}return false}getPosition(){if(this.path.length===0)return-1;return this.path[this.path.length-1].position??0}getCounter(){if(this.path.length===0)return-1;return this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(separator,includeNamespace=true){const sep2=separator||this.separator;const isDefault=sep2===this.separator&&includeNamespace===true;if(isDefault){if(this._pathStringCache!==null){return this._pathStringCache}const result=this.path.map(n=>n.namespace?`${n.namespace}:${n.tag}`:n.tag).join(sep2);this._pathStringCache=result;return result}return this.path.map(n=>includeNamespace&&n.namespace?`${n.namespace}:${n.tag}`:n.tag).join(sep2)}toArray(){return this.path.map(n=>n.tag)}reset(){this._pathStringCache=null;this.path=[];this.siblingStacks=[];this._keptAttrs=[]}matches(expression){const segments=expression.segments;if(segments.length===0){return false}if(expression.hasDeepWildcard()){return this._matchWithDeepWildcard(segments)}return this._matchSimple(segments)}_matchSimple(segments){if(this.path.length!==segments.length){return false}for(let i=0;i<segments.length;i++){if(!this._matchSegment(segments[i],this.path[i],i===this.path.length-1)){return false}}return true}_matchWithDeepWildcard(segments){let pathIdx=this.path.length-1;let segIdx=segments.length-1;while(segIdx>=0&&pathIdx>=0){const segment=segments[segIdx];if(segment.type==="deep-wildcard"){segIdx--;if(segIdx<0){return true}const nextSeg=segments[segIdx];let found=false;for(let i=pathIdx;i>=0;i--){if(this._matchSegment(nextSeg,this.path[i],i===this.path.length-1)){pathIdx=i-1;segIdx--;found=true;break}}if(!found){return false}}else{if(!this._matchSegment(segment,this.path[pathIdx],pathIdx===this.path.length-1)){return false}pathIdx--;segIdx--}}return segIdx<0}_matchSegment(segment,node,isCurrentNode){if(segment.tag!=="*"&&segment.tag!==node.tag){return false}if(segment.namespace!==void 0){if(segment.namespace!=="*"&&segment.namespace!==node.namespace){return false}}if(segment.attrName!==void 0){if(!isCurrentNode){return false}if(!node.values||!(segment.attrName in node.values)){return false}if(segment.attrValue!==void 0){if(String(node.values[segment.attrName])!==String(segment.attrValue)){return false}}}if(segment.position!==void 0){if(!isCurrentNode){return false}const counter=node.counter??0;if(segment.position==="first"&&counter!==0){return false}else if(segment.position==="odd"&&counter%2!==1){return false}else if(segment.position==="even"&&counter%2!==0){return false}else if(segment.position==="nth"&&counter!==segment.positionValue){return false}}return true}matchesAny(exprSet){return exprSet.matchesAny(this)}snapshot(){return{path:this.path.map(node=>({...node})),siblingStacks:this.siblingStacks.map(level=>level?{counts:new Map(level.counts),total:level.total}:level),keptAttrs:this._keptAttrs.map(entry=>({...entry}))}}restore(snapshot){this._pathStringCache=null;this.path=snapshot.path.map(node=>({...node}));this.siblingStacks=snapshot.siblingStacks.map(level=>level?{counts:new Map(level.counts),total:level.total}:level);this._keptAttrs=(snapshot.keptAttrs||[]).map(entry=>({...entry}))}readOnly(){return this._view}};var HTML_PATTERNS=[{id:"html-script-open",description:"<script opening tag",pattern:/<script[\s>/]/i},{id:"html-script-close",description:"</script closing tag",pattern:/<\/script[\s>]/i},{id:"html-javascript-protocol",description:"javascript: URI scheme (with optional whitespace/encoding)",pattern:/j[\t\n\r ]*a[\t\n\r ]*v[\t\n\r ]*a[\t\n\r ]*s[\t\n\r ]*c[\t\n\r ]*r[\t\n\r ]*i[\t\n\r ]*p[\t\n\r ]*t[\t\n\r ]*:/i},{id:"html-vbscript-protocol",description:"vbscript: URI scheme",pattern:/vbscript[\t\n\r ]*:/i},{id:"html-data-html",description:"data:text/html URI \u2014 can execute scripts in browsers",pattern:/data[\t\n\r ]*:[\t\n\r ]*text\/html/i},{id:"html-data-xhtml",description:"data:application/xhtml+xml URI",pattern:/data[\t\n\r ]*:[\t\n\r ]*application\/xhtml/i},{id:"html-data-svg",description:"data:image/svg+xml URI \u2014 can execute scripts",pattern:/data[\t\n\r ]*:[\t\n\r ]*image\/svg\+xml/i},{id:"html-inline-event-handler",description:"Inline event handler attributes: onclick=, onerror=, onload=, etc.",pattern:/\bon\w{1,30}\s*=/i},{id:"html-entity-obfuscated-script",description:"HTML-entity-encoded <script (e.g. &#x3C;script or &lt;script)",pattern:/(?:&#x0*3[Cc];?|&#0*60;?|&lt;)\s*script/i},{id:"html-entity-obfuscated-javascript",description:'HTML-entity-encoded javascript: (partial \u2014 catches common &#106; or &#x6a; for "j")',pattern:/(?:&#x0*6[Aa];?|&#0*106;?)\s*(?:&#x0*61;?|a)[\s\S]{0,80}script\s*:/i},{id:"html-style-expression",description:"CSS expression() \u2014 IE-era code execution in style attributes",pattern:/style[\s\S]{0,20}expression\s*\(/i},{id:"html-object-embed",description:"<object or <embed tags that can load active content",pattern:/<(?:object|embed)[\s>/]/i},{id:"html-base-tag",description:"<base href= \u2014 can hijack all relative URLs on a page",pattern:/<base[\s>]/i},{id:"html-meta-refresh",description:'<meta http-equiv="refresh" \u2014 can redirect users',pattern:/<meta[\s\S]{0,40}http-equiv[\s\S]{0,20}refresh/i},{id:"html-srcdoc",description:"srcdoc= attribute on iframes \u2014 embeds HTML that can run scripts",pattern:/srcdoc\s*=/i},{id:"html-iframe",description:"<iframe tag",pattern:/<iframe[\s>/]/i},{id:"html-form",description:"<form tag \u2014 can be used for phishing / credential harvesting injection",pattern:/<form[\s>/]/i}];var html_default=HTML_PATTERNS;var XML_PATTERNS=[{id:"xml-cdata-injection",description:"CDATA section injection: <![CDATA[ breaks out of text node context",pattern:/<!\[CDATA\[/i},{id:"xml-cdata-close",description:"CDATA close sequence: ]]> can terminate an enclosing CDATA section",pattern:/\]\]>/},{id:"xml-processing-instruction",description:"XML processing instruction: <?xml-stylesheet or <?php etc.",pattern:/<\?(?:xml[\- ]|php|asp)/i},{id:"xml-doctype-injection",description:"DOCTYPE declaration embedded in content \u2014 can define entities",pattern:/<!DOCTYPE(?:[\s[]|$)/i},{id:"xml-entity-system",description:"SYSTEM keyword \u2014 used in external entity declarations (XXE)",pattern:/\bSYSTEM\s+["']/i},{id:"xml-entity-public",description:"PUBLIC keyword \u2014 used in external entity declarations (XXE)",pattern:/\bPUBLIC\s+["']/i},{id:"xml-entity-declaration",description:"<!ENTITY declaration \u2014 defines entities, potential XXE or entity expansion",pattern:/<!ENTITY[\s%]/i},{id:"xml-billion-laughs",description:"Entity reference chaining / billion laughs: repeated &eX; style references",pattern:/(?:&\w{1,20};){3,}/},{id:"xml-namespace-confusion",description:"xmlns: attribute injection \u2014 can redefine namespaces to confuse parsers",pattern:/\bxmlns\s*(?::\w{1,40})?\s*=/i},{id:"xml-comment-injection",description:"<!-- comment injection \u2014 can hide content from some parsers",pattern:/<!--/},{id:"xml-comment-close",description:"--> closes an enclosing XML comment",pattern:/-->/},{id:"xml-pi-close",description:"?> closes an enclosing processing instruction",pattern:/\?>/}];var xml_default=XML_PATTERNS;var SVG_PATTERNS=[{id:"svg-script-element",description:"<script element inside SVG executes JavaScript",pattern:/<script[\s>/]/i},{id:"svg-xlink-href-javascript",description:"xlink:href with javascript: \u2014 classic SVG XSS via <a> or <use>",pattern:/xlink\s*:\s*href\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-href-javascript",description:"href= with javascript: in SVG context (<a>, <animate>, etc.)",pattern:/href\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-foreignobject",description:"<foreignObject embeds HTML inside SVG \u2014 can execute scripts",pattern:/<foreignObject[\s>/]/i},{id:"svg-use-external",description:"<use xlink:href or href pointing to external resource (non-fragment URL)",pattern:/<use[\s\S]{0,60}(?:xlink\s*:\s*)?href\s*=\s*(?:["'][^#]|[^"'#\s>])/i},{id:"svg-animate-href",description:'<animate attributeName="href" \u2014 can dynamically change href to javascript:',pattern:/<animate[\s\S]{0,80}attributeName\s*=\s*["'][\s]*href["']/i},{id:"svg-animate-xlinkhref",description:'<animate attributeName="xlink:href"',pattern:/<animate[\s\S]{0,80}attributeName\s*=\s*["'][\s]*xlink\s*:\s*href["']/i},{id:"svg-set-javascript",description:'<set to="javascript:..." \u2014 sets an attribute to a javascript: URI',pattern:/<set[\s\S]{0,80}to\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-event-handler",description:"SVG-specific event handler attributes: onload=, onerror=, onactivate=, etc.",pattern:/\bon(?:load|error|activate|begin|end|repeat|focus|blur|click|mouse\w{1,20}|key\w{1,20})\s*=/i},{id:"svg-handler-generic",description:"Generic on* handler catch-all for SVG attributes",pattern:/\bon\w{1,30}\s*=/i},{id:"svg-filter-feimage",description:"<feImage href= \u2014 filter primitive that can load external resources",pattern:/<feImage[\s\S]{0,80}(?:xlink\s*:\s*)?href\s*=/i},{id:"svg-image-external",description:"<image xlink:href with http/https or javascript protocol",pattern:/<image[\s\S]{0,80}(?:xlink\s*:\s*)?href\s*=\s*["']?\s*(?:https?|javascript)\s*:/i},{id:"svg-style-javascript",description:"style= attribute containing javascript: (e.g. background:url(javascript:...))",pattern:/style\s*=[\s\S]{0,60}javascript\s*:/i}];var svg_default=SVG_PATTERNS;var SQL_PATTERNS=[{id:"sql-block-comment-open",description:"SQL block comment open: /* ... */ \u2014 unusual in legitimate user text",pattern:/\/\*/},{id:"sql-union-select",description:"UNION SELECT \u2014 most common SQL injection aggregation attack",pattern:/\bUNION\s{1,20}(?:ALL\s{1,20})?SELECT\b/i},{id:"sql-drop-table",description:"DROP TABLE \u2014 destructive DDL injection",pattern:/\bDROP\s{1,20}TABLE\b/i},{id:"sql-drop-database",description:"DROP DATABASE \u2014 destructive DDL injection",pattern:/\bDROP\s{1,20}DATABASE\b/i},{id:"sql-insert-into",description:"INSERT INTO \u2014 data injection",pattern:/\bINSERT\s{1,20}INTO\b/i},{id:"sql-delete-from",description:"DELETE FROM \u2014 data deletion injection",pattern:/\bDELETE\s{1,20}FROM\b/i},{id:"sql-update-set",description:"UPDATE ... SET \u2014 data modification injection",pattern:/\bUPDATE\b[\s\S]{1,60}\bSET\b/i},{id:"sql-exec-xp",description:"EXEC xp_ \u2014 MSSQL extended stored procedure execution",pattern:/\bEXEC(?:UTE)?\s{1,20}xp_/i},{id:"sql-tautology-string",description:`Classic string tautology: ' OR '1'='1 or " OR "1"="1"`,pattern:/'\s{0,10}OR\s{0,10}'[^']{0,20}'\s*=\s*'[^']{0,20}/i},{id:"sql-tautology-numeric",description:"Numeric tautology: OR 1=1",pattern:/\bOR\s{1,10}1\s*=\s*1\b/i},{id:"sql-always-true-zero",description:"Numeric tautology: OR 0=0",pattern:/\bOR\s{1,10}0\s*=\s*0\b/i},{id:"sql-sleep-benchmark",description:"Time-based blind injection: SLEEP() or BENCHMARK()",pattern:/\b(?:SLEEP|BENCHMARK)\s*\(/i},{id:"sql-waitfor-delay",description:"MSSQL time-based blind injection: WAITFOR DELAY",pattern:/\bWAITFOR\s{1,20}DELAY\b/i},{id:"sql-char-function",description:"CHAR() function \u2014 used to obfuscate injected strings",pattern:/\bCHAR\s*\(\s*\d{1,3}/i},{id:"sql-information-schema",description:"INFORMATION_SCHEMA \u2014 reconnaissance query for table/column enumeration",pattern:/\bINFORMATION_SCHEMA\b/i}];var sql_default=SQL_PATTERNS;var SHELL_PATTERNS=[{id:"shell-path-traversal-unix",description:"Unix path traversal: ../ \u2014 climbing the directory tree",pattern:/\.\.\//},{id:"shell-path-traversal-windows",description:"Windows path traversal: ..\\ \u2014 climbing the directory tree",pattern:/\.\.\\/},{id:"shell-path-traversal-encoded",description:"URL-encoded path traversal: %2e%2e or %2f variants",pattern:/%2e%2e|%2f\.\.|\.\.%2f/i},{id:"shell-null-byte",description:"Null byte injection: \\x00 or %00 \u2014 truncates strings in C-backed functions",pattern:/\x00|%00/},{id:"shell-semicolon",description:"Semicolon command separator: cmd1; cmd2",pattern:/;/},{id:"shell-pipe",description:"Pipe operator: cmd1 | cmd2",pattern:/\|/},{id:"shell-and-operator",description:"AND operator: cmd1 && cmd2",pattern:/&&/},{id:"shell-or-operator",description:"OR operator: cmd1 || cmd2",pattern:/\|\|/},{id:"shell-backtick",description:"Backtick command substitution: `cmd`",pattern:/`/},{id:"shell-dollar-paren",description:"Dollar-paren command substitution: $(cmd)",pattern:/\$\(/},{id:"shell-dollar-brace",description:"Dollar-brace variable expansion: ${var} \u2014 can be abused for injection",pattern:/\$\{/},{id:"shell-redirect-out",description:"Output redirection: cmd > file or cmd >> file",pattern:/>{1,2}/},{id:"shell-redirect-in",description:"Input redirection: cmd < file",pattern:/</},{id:"shell-newline-injection",description:"Newline injection: \\n or \\r \u2014 can inject new shell commands",pattern:/[\n\r]/},{id:"shell-glob-star",description:"Glob expansion: * or ? \u2014 can expand to unintended files",pattern:/[/\\][*?]/},{id:"shell-absolute-root",description:"Absolute root path injection: string starting with / or \\ (Windows UNC)",pattern:/^(?:\/|\\\\)/},{id:"shell-windows-drive",description:"Windows drive letter path injection: C:\\ or D:/",pattern:/^[a-zA-Z]:[/\\]/},{id:"shell-curl-wget",description:"curl/wget with URL or flags \u2014 can exfiltrate data or download payloads",pattern:/\b(?:curl|wget)\s+(?:https?:\/\/|ftp:\/\/|-)/i}];var shell_default=SHELL_PATTERNS;var REDOS_PATTERNS=[{id:"redos-nested-quantifier-plus",description:"Nested + quantifier inside a group with outer quantifier: (a+)+, (.+b)*, etc.",pattern:/\([^)]*\+[^)]*\)[+*]/},{id:"redos-nested-quantifier-star",description:"Nested * quantifier: (a*)* or (a*)+ \u2014 catastrophic backtracking",pattern:/\([^)]*\*[^)]*\)[*+]/},{id:"redos-nested-groups",description:"Doubly nested quantified groups: ((a+)+) \u2014 guaranteed catastrophic",pattern:/\(\([^)]{0,40}\)[+*]\)[+*]/},{id:"redos-alternation-overlap",description:"Overlapping alternation under quantifier: (a|a)+ \u2014 ambiguous NFA paths",pattern:/\(([^|()]{1,20})\|(?:\1)(?:\|[^|()]{1,20}){0,5}\)[+*?]{1,2}/},{id:"redos-star-plus-concat",description:"(x*x)+ pattern \u2014 triggers super-linear backtracking",pattern:/\([^)]{0,10}\*[^)]{0,10}\)[+*]/},{id:"redos-dot-star-greedy",description:"(.*){n,} or (.+){n,} \u2014 repeated greedy dot quantifiers",pattern:/\(\.[*+]\)\{?\d/},{id:"redos-large-repetition",description:"Very large fixed or range repetition count {1000,} or {1000,n} \u2014 denial of service via backtracking",pattern:/\{\d{4,}(?:,\d*)?\}/},{id:"redos-catastrophic-alternation",description:"Long alternation with many similar branches \u2014 polynomial backtracking risk",pattern:/\([^)]{0,200}(?:\|[^|)]{0,50}){9,}\)/}];var redos_default=REDOS_PATTERNS;var sep=`["'\\s]*:`;var NOSQL_PATTERNS=[{id:"nosql-where-operator",description:"$where \u2014 executes arbitrary JavaScript server-side in MongoDB",pattern:new RegExp(`\\$where${sep}`,"i")},{id:"nosql-ne-operator",description:'$ne \u2014 "not equal" operator used to bypass equality checks',pattern:new RegExp(`\\$ne${sep}`,"i")},{id:"nosql-gt-operator",description:'$gt \u2014 "greater than" used to bypass password/value checks',pattern:new RegExp(`\\$gte?${sep}`,"i")},{id:"nosql-lt-operator",description:'$lt / $lte \u2014 "less than" bypass variants',pattern:new RegExp(`\\$lte?${sep}`,"i")},{id:"nosql-regex-operator",description:"$regex \u2014 can be used to extract data character by character (blind injection)",pattern:new RegExp(`\\$regex${sep}`,"i")},{id:"nosql-or-operator",description:"$or \u2014 logical OR; used to create always-true conditions",pattern:new RegExp(`\\$or${sep}\\s*\\[`,"i")},{id:"nosql-and-operator",description:"$and \u2014 logical AND operator injection",pattern:new RegExp(`\\$and${sep}\\s*\\[`,"i")},{id:"nosql-nor-operator",description:"$nor \u2014 logical NOR operator injection",pattern:new RegExp(`\\$nor${sep}\\s*\\[`,"i")},{id:"nosql-exists-operator",description:"$exists \u2014 can enumerate fields to determine schema",pattern:new RegExp(`\\$exists${sep}`,"i")},{id:"nosql-in-operator",description:"$in \u2014 matches any value in a list; can enumerate values",pattern:new RegExp(`\\$in${sep}\\s*\\[`,"i")},{id:"nosql-expr-operator",description:"$expr \u2014 allows aggregation expressions in queries (MongoDB 3.6+)",pattern:new RegExp(`\\$expr${sep}`,"i")},{id:"nosql-function-operator",description:"$function \u2014 executes arbitrary JavaScript in MongoDB 4.4+",pattern:new RegExp(`\\$function${sep}`,"i")},{id:"nosql-accumulator-operator",description:"$accumulator \u2014 custom aggregation with arbitrary JS execution",pattern:new RegExp(`\\$accumulator${sep}`,"i")},{id:"nosql-proto-pollution",description:"__proto__ \u2014 prototype pollution via object key injection",pattern:/__proto__/},{id:"nosql-constructor-prototype",description:"constructor.prototype \u2014 alternative prototype pollution vector (dot notation or JSON key)",pattern:/constructor[\s"':.,{\[]*prototype/i},{id:"nosql-proto-bracket",description:'["__proto__"] \u2014 bracket-notation prototype pollution',pattern:/\[["']__proto__["']\]/}];var nosql_default=NOSQL_PATTERNS;var LOG_PATTERNS=[{id:"log-crlf-injection",description:"CRLF injection: literal \\r or \\n embeds fake log lines",pattern:/[\r\n]/},{id:"log-url-encoded-crlf",description:"URL-encoded CRLF: %0d, %0a, %0D, %0A \u2014 decoded by some log parsers",pattern:/%0[dDaA]/},{id:"log-unicode-newline",description:"Unicode newline variants: U+2028 (line separator), U+2029 (paragraph separator)",pattern:/[\u2028\u2029]/},{id:"log-log4shell-jndi",description:"Log4Shell: ${jndi:...} triggers remote code execution in Apache Log4j",pattern:/\$\{jndi\s*:/i},{id:"log-log4shell-obfuscated",description:"Obfuscated Log4Shell: ${::-j}... lookup-bypass prefix used to evade WAF detection",pattern:/\$\{::-/},{id:"log-log4j-lookup",description:"Log4j lookup syntax: ${env:...}, ${sys:...}, ${ctx:...} \u2014 data exfiltration",pattern:/\$\{(?:env|sys|ctx|main|map|sd|web|docker|k8s|spring)\s*:/i},{id:"log-ssti-double-brace",description:"SSTI double-brace: {{expression}} \u2014 Jinja2, Twig, Handlebars, etc.",pattern:/\{\{[\s\S]{0,80}\}\}/},{id:"log-ssti-hash-brace",description:"SSTI hash-brace: #{expression} \u2014 Thymeleaf, Velocity, Ruby ERB",pattern:/#\{[\s\S]{0,80}\}/},{id:"log-ssti-dollar-brace",description:"SSTI/EL injection: ${expression with operators or method calls} \u2014 JSP EL, Freemarker, SpEL",pattern:/\$\{[^}]*(?:\.|\(|\*|\+|\bclass\b|\bruntime\b|\bprocess\b|\bexec\b)[^}]{0,80}\}/i},{id:"log-ssti-percent-tag",description:"SSTI ERB/ASP tag: <%= expression %> \u2014 Ruby ERB, ASP",pattern:/<%=[\s\S]{0,80}%>/},{id:"log-null-byte",description:"Null byte: \\x00 or %00 \u2014 can truncate log entries in C-backed loggers",pattern:/\x00|%00/},{id:"log-ansi-escape",description:"ANSI escape sequence: ESC[ \u2014 can manipulate terminal output when logs are tailed",pattern:/\x1b\[/}];var log_default=LOG_PATTERNS;var SQL_STRICT_EXTRA=[{id:"sql-line-comment",description:"SQL line comment: -- followed by whitespace or end of string",pattern:/--(?:\s|$)/},{id:"sql-stacked-query",description:"Stacked queries: semicolon immediately followed by a SQL keyword",pattern:/;\s{0,10}(?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC)\b/i},{id:"sql-hex-encoding",description:"Hex-encoded string injection: 0x41414141 style (MySQL)",pattern:/\b0x[0-9a-f]{4,}/i}];var SQL_STRICT_PATTERNS=[...sql_default,...SQL_STRICT_EXTRA];var sql_strict_default=SQL_STRICT_PATTERNS;html_default.label="HTML";xml_default.label="XML";svg_default.label="SVG";sql_default.label="SQL";sql_strict_default.label="SQL-STRICT";shell_default.label="SHELL";redos_default.label="REDOS";nosql_default.label="NOSQL";log_default.label="LOG";var VALID_CONTEXTS=Object.freeze({HTML:html_default,XML:xml_default,SVG:svg_default,SQL:sql_default,"SQL-STRICT":sql_strict_default,SHELL:shell_default,REDOS:redos_default,NOSQL:nosql_default,LOG:log_default});function assertString(value){if(typeof value!=="string"){throw new TypeError(`is-unsafe: first argument must be a string, got ${typeof value}`)}}function assertContext(context){if(context instanceof RegExp)return;if(Array.isArray(context)){if(context.length===0){throw new TypeError("is-unsafe: context must not be an empty array")}if(Array.isArray(context[0])){for(const list of context){if(!Array.isArray(list)||list.length===0){throw new TypeError("is-unsafe: each context in the array must be a non-empty pattern array (PatternList)")}}}return}throw new TypeError(`is-unsafe: second argument must be a PatternList (e.g. HTML), an array of PatternLists (e.g. [HTML, XML]), or a RegExp. Got: ${typeof context}`)}function normalise(context){if(context instanceof RegExp)return{lists:null,regex:context};if(Array.isArray(context[0]))return{lists:context,regex:null};return{lists:[context],regex:null}}function matchList(value,list){const label=list.label??"CUSTOM";for(const rule of list){if(rule.pattern.test(value)){return{context:label,id:rule.id,description:rule.description,pattern:rule.pattern}}}return null}function isUnsafe(value,context){assertString(value);assertContext(context);const{lists,regex}=normalise(context);if(regex)return regex.test(value);for(const list of lists){if(matchList(value,list)!==null)return true}return false}function extractRawAttributes(prefixedAttrs,options){if(!prefixedAttrs)return{};const attrs=options.attributesGroupName?prefixedAttrs[options.attributesGroupName]:prefixedAttrs;if(!attrs)return{};const rawAttrs={};for(const key in attrs){if(key.startsWith(options.attributeNamePrefix)){const rawName=key.substring(options.attributeNamePrefix.length);rawAttrs[rawName]=attrs[key]}else{rawAttrs[key]=attrs[key]}}return rawAttrs}function extractNamespace(rawTagName){if(!rawTagName||typeof rawTagName!=="string")return void 0;const colonIndex=rawTagName.indexOf(":");if(colonIndex!==-1&&colonIndex>0){const ns=rawTagName.substring(0,colonIndex);if(ns!=="xmlns"){return ns}}return void 0}var OrderedObjParser=class{constructor(options,externalEntities){this.options=options;this.currentNode=null;this.tagsNodeStack=[];this.parseXml=parseXml;this.parseTextData=parseTextData;this.resolveNameSpace=resolveNameSpace;this.buildAttributesMap=buildAttributesMap;this.isItStopNode=isItStopNode;this.replaceEntitiesValue=replaceEntitiesValue;this.readStopNodeData=readStopNodeData;this.saveTextToParentTag=saveTextToParentTag;this.addChild=addChild;this.ignoreAttributesFn=getIgnoreAttributesFn(this.options.ignoreAttributes);this.entityExpansionCount=0;this.currentExpandedLength=0;this.doctypefound=false;let namedEntities={...XML};if(this.options.entityDecoder){this.entityDecoder=this.options.entityDecoder}else{if(typeof this.options.htmlEntities==="object")namedEntities=this.options.htmlEntities;else if(this.options.htmlEntities===true)namedEntities={...COMMON_HTML,...CURRENCY};this.entityDecoder=new EntityDecoder({namedEntities:{...namedEntities,...externalEntities},numericAllowed:this.options.htmlEntities,limit:{maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:this.options.processEntities.appliesTo},onInputEntity:(name,value)=>isUnsafe(value,[html_default,xml_default])?ENTITY_ACTION.BLOCK:ENTITY_ACTION.ALLOW})}this.matcher=new Matcher;this.readonlyMatcher=this.matcher.readOnly();this.isCurrentNodeStopNode=false;this.stopNodeExpressionsSet=new ExpressionSet;const stopNodesOpts=this.options.stopNodes;if(stopNodesOpts&&stopNodesOpts.length>0){for(let i=0;i<stopNodesOpts.length;i++){const stopNodeExp=stopNodesOpts[i];if(typeof stopNodeExp==="string"){this.stopNodeExpressionsSet.add(new Expression(stopNodeExp))}else if(stopNodeExp instanceof Expression){this.stopNodeExpressionsSet.add(stopNodeExp)}}this.stopNodeExpressionsSet.seal()}}};function parseTextData(val,tagName,jPath,dontTrim,hasAttributes,isLeafNode,escapeEntities){const options=this.options;if(val!==void 0){if(options.trimValues&&!dontTrim){val=val.trim()}if(val.length>0){if(!escapeEntities)val=this.replaceEntitiesValue(val,tagName,jPath);const jPathOrMatcher=options.jPath?jPath.toString():jPath;const newval=options.tagValueProcessor(tagName,val,jPathOrMatcher,hasAttributes,isLeafNode);if(newval===null||newval===void 0){return val}else if(typeof newval!==typeof val||newval!==val){return newval}else if(options.trimValues){return parseValue(val,options.parseTagValue,options.numberParseOptions)}else{const trimmedVal=val.trim();if(trimmedVal===val){return parseValue(val,options.parseTagValue,options.numberParseOptions)}else{return val}}}}}function resolveNameSpace(tagname){if(this.options.removeNSPrefix){const tags=tagname.split(":");const prefix=tagname.charAt(0)==="/"?"/":"";if(tags[0]==="xmlns"){return""}if(tags.length===2){tagname=prefix+tags[1]}}return tagname}var attrsRegx=new RegExp(`([^\\s=]+)\\s*(=\\s*(['"])([\\s\\S]*?)\\3)?`,"gm");function buildAttributesMap(attrStr,jPath,tagName,force=false){const options=this.options;if(force===true||options.ignoreAttributes!==true&&typeof attrStr==="string"){const matches=getAllMatches(attrStr,attrsRegx);const len=matches.length;const attrs={};const processedVals=new Array(len);let hasRawAttrs=false;const rawAttrsForMatcher={};for(let i=0;i<len;i++){const attrName=this.resolveNameSpace(matches[i][1]);const oldVal=matches[i][4];if(attrName.length&&oldVal!==void 0){let val=oldVal;if(options.trimValues)val=val.trim();val=this.replaceEntitiesValue(val,tagName,this.readonlyMatcher);processedVals[i]=val;rawAttrsForMatcher[attrName]=val;hasRawAttrs=true}}if(hasRawAttrs&&typeof jPath==="object"&&jPath.updateCurrent){jPath.updateCurrent(rawAttrsForMatcher)}const jPathStr=options.jPath?jPath.toString():this.readonlyMatcher;let hasAttrs=false;for(let i=0;i<len;i++){const attrName=this.resolveNameSpace(matches[i][1]);if(this.ignoreAttributesFn(attrName,jPathStr))continue;let aName=options.attributeNamePrefix+attrName;if(attrName.length){if(options.transformAttributeName){aName=options.transformAttributeName(aName)}aName=sanitizeName(aName,options);if(matches[i][4]!==void 0){const oldVal=processedVals[i];const newVal=options.attributeValueProcessor(attrName,oldVal,jPathStr);if(newVal===null||newVal===void 0){attrs[aName]=oldVal}else if(typeof newVal!==typeof oldVal||newVal!==oldVal){attrs[aName]=newVal}else{attrs[aName]=parseValue(oldVal,options.parseAttributeValue,options.numberParseOptions)}hasAttrs=true}else if(options.allowBooleanAttributes){attrs[aName]=true;hasAttrs=true}}}if(!hasAttrs)return;if(options.attributesGroupName&&!options.preserveOrder){const attrCollection={};attrCollection[options.attributesGroupName]=attrs;return attrCollection}return attrs}}var parseXml=function(xmlData){xmlData=xmlData.replace(/\r\n?/g,"\n");const xmlObj=new XmlNode("!xml");let currentNode=xmlObj;let textData="";this.matcher.reset();this.entityDecoder.reset();this.entityExpansionCount=0;this.currentExpandedLength=0;this.doctypefound=false;const options=this.options;const docTypeReader=new DocTypeReader(options.processEntities);const xmlLen=xmlData.length;for(let i=0;i<xmlLen;i++){const ch=xmlData[i];if(ch==="<"){const c1=xmlData.charCodeAt(i+1);if(c1===47){const closeIndex=findClosingIndex(xmlData,">",i,"Closing Tag is not closed.");let tagName=xmlData.substring(i+2,closeIndex).trim();if(options.removeNSPrefix){const colonIndex=tagName.indexOf(":");if(colonIndex!==-1){tagName=tagName.substr(colonIndex+1)}}tagName=transformTagName(options.transformTagName,tagName,"",options).tagName;if(currentNode){textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher)}const lastTagName=this.matcher.getCurrentTag();if(tagName&&options.unpairedTagsSet.has(tagName)){throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`)}if(lastTagName&&options.unpairedTagsSet.has(lastTagName)){this.matcher.pop();this.tagsNodeStack.pop()}this.matcher.pop();this.isCurrentNodeStopNode=false;currentNode=this.tagsNodeStack.pop();textData="";i=closeIndex}else if(c1===63){let tagData=readTagExp(xmlData,i,false,"?>");if(!tagData)throw new Error("Pi Tag is not closed.");textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher);const attsMap=this.buildAttributesMap(tagData.tagExp,this.matcher,tagData.tagName,true);if(attsMap){const ver=attsMap[this.options.attributeNamePrefix+"version"];this.entityDecoder.setXmlVersion(Number(ver)||1);docTypeReader.setXmlVersion(Number(ver)||1)}if(options.ignoreDeclaration&&tagData.tagName==="?xml"||options.ignorePiTags){}else{const childNode=new XmlNode(tagData.tagName);childNode.add(options.textNodeName,"");if(tagData.tagName!==tagData.tagExp&&tagData.attrExpPresent&&options.ignoreAttributes!==true){childNode[":@"]=attsMap}this.addChild(currentNode,childNode,this.readonlyMatcher,i)}i=tagData.closeIndex+1}else if(c1===33&&xmlData.charCodeAt(i+2)===45&&xmlData.charCodeAt(i+3)===45){const endIndex=findClosingIndex(xmlData,"-->",i+4,"Comment is not closed.");if(options.commentPropName){const comment=xmlData.substring(i+4,endIndex-2);textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher);currentNode.add(options.commentPropName,[{[options.textNodeName]:comment}])}i=endIndex}else if(c1===33&&xmlData.charCodeAt(i+2)===68){if(this.doctypefound)throw new Error("Multiple DOCTYPE declarations found.");this.doctypefound=true;const result=docTypeReader.readDocType(xmlData,i);this.entityDecoder.addInputEntities(result.entities);i=result.i}else if(c1===33&&xmlData.charCodeAt(i+2)===91){const closeIndex=findClosingIndex(xmlData,"]]>",i,"CDATA is not closed.")-2;const tagExp=xmlData.substring(i+9,closeIndex);textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher);let val=this.parseTextData(tagExp,currentNode.tagname,this.readonlyMatcher,true,false,true,true);if(val==void 0)val="";if(options.cdataPropName){currentNode.add(options.cdataPropName,[{[options.textNodeName]:tagExp}])}else{currentNode.add(options.textNodeName,val)}i=closeIndex+2}else{let result=readTagExp(xmlData,i,options.removeNSPrefix);if(!result){const context=xmlData.substring(Math.max(0,i-50),Math.min(xmlLen,i+50));throw new Error(`readTagExp returned undefined at position ${i}. Context: "${context}"`)}let tagName=result.tagName;const rawTagName=result.rawTagName;let tagExp=result.tagExp;let attrExpPresent=result.attrExpPresent;let closeIndex=result.closeIndex;({tagName,tagExp}=transformTagName(options.transformTagName,tagName,tagExp,options));if(options.strictReservedNames&&(tagName===options.commentPropName||tagName===options.cdataPropName||tagName===options.textNodeName||tagName===options.attributesGroupName)){throw new Error(`Invalid tag name: ${tagName}`)}if(currentNode&&textData){if(currentNode.tagname!=="!xml"){textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher,false)}}const lastTag=currentNode;if(lastTag&&options.unpairedTagsSet.has(lastTag.tagname)){currentNode=this.tagsNodeStack.pop();this.matcher.pop()}let isSelfClosing=false;if(tagExp.length>0&&tagExp.lastIndexOf("/")===tagExp.length-1){isSelfClosing=true;if(tagName[tagName.length-1]==="/"){tagName=tagName.substr(0,tagName.length-1);tagExp=tagName}else{tagExp=tagExp.substr(0,tagExp.length-1)}attrExpPresent=tagName!==tagExp}let prefixedAttrs=null;let rawAttrs={};let namespace=void 0;namespace=extractNamespace(rawTagName);if(tagName!==xmlObj.tagname){this.matcher.push(tagName,{},namespace)}if(tagName!==tagExp&&attrExpPresent){prefixedAttrs=this.buildAttributesMap(tagExp,this.matcher,tagName);if(prefixedAttrs){rawAttrs=extractRawAttributes(prefixedAttrs,options)}}if(tagName!==xmlObj.tagname){this.isCurrentNodeStopNode=this.isItStopNode()}const startIndex=i;if(this.isCurrentNodeStopNode){let tagContent="";if(isSelfClosing){i=result.closeIndex}else if(options.unpairedTagsSet.has(tagName)){i=result.closeIndex}else{const result2=this.readStopNodeData(xmlData,rawTagName,closeIndex+1);if(!result2)throw new Error(`Unexpected end of ${rawTagName}`);i=result2.i;tagContent=result2.tagContent}const childNode=new XmlNode(tagName);if(prefixedAttrs){childNode[":@"]=prefixedAttrs}childNode.add(options.textNodeName,tagContent);this.matcher.pop();this.isCurrentNodeStopNode=false;this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex)}else{if(isSelfClosing){({tagName,tagExp}=transformTagName(options.transformTagName,tagName,tagExp,options));const childNode=new XmlNode(tagName);if(prefixedAttrs){childNode[":@"]=prefixedAttrs}this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex);this.matcher.pop();this.isCurrentNodeStopNode=false}else if(options.unpairedTagsSet.has(tagName)){const childNode=new XmlNode(tagName);if(prefixedAttrs){childNode[":@"]=prefixedAttrs}this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex);this.matcher.pop();this.isCurrentNodeStopNode=false;i=result.closeIndex;continue}else{const childNode=new XmlNode(tagName);if(this.tagsNodeStack.length>options.maxNestedTags){throw new Error("Maximum nested tags exceeded")}this.tagsNodeStack.push(currentNode);if(prefixedAttrs){childNode[":@"]=prefixedAttrs}this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex);currentNode=childNode}textData="";i=closeIndex}}}else{textData+=xmlData[i]}}return xmlObj.child};function addChild(currentNode,childNode,matcher,startIndex){if(!this.options.captureMetaData)startIndex=void 0;const jPathOrMatcher=this.options.jPath?matcher.toString():matcher;const result=this.options.updateTag(childNode.tagname,jPathOrMatcher,childNode[":@"]);if(result===false){}else if(typeof result==="string"){childNode.tagname=result;currentNode.addChild(childNode,startIndex)}else{currentNode.addChild(childNode,startIndex)}}function replaceEntitiesValue(val,tagName,jPath){const entityConfig=this.options.processEntities;if(!entityConfig||!entityConfig.enabled){return val}if(entityConfig.allowedTags){const jPathOrMatcher=this.options.jPath?jPath.toString():jPath;const allowed=Array.isArray(entityConfig.allowedTags)?entityConfig.allowedTags.includes(tagName):entityConfig.allowedTags(tagName,jPathOrMatcher);if(!allowed){return val}}if(entityConfig.tagFilter){const jPathOrMatcher=this.options.jPath?jPath.toString():jPath;if(!entityConfig.tagFilter(tagName,jPathOrMatcher)){return val}}return this.entityDecoder.decode(val)}function saveTextToParentTag(textData,parentNode,matcher,isLeafNode){if(textData){if(isLeafNode===void 0)isLeafNode=parentNode.child.length===0;textData=this.parseTextData(textData,parentNode.tagname,matcher,false,parentNode[":@"]?Object.keys(parentNode[":@"]).length!==0:false,isLeafNode);if(textData!==void 0&&textData!=="")parentNode.add(this.options.textNodeName,textData);textData=""}return textData}function isItStopNode(){if(this.stopNodeExpressionsSet.size===0)return false;return this.matcher.matchesAny(this.stopNodeExpressionsSet)}function tagExpWithClosingIndex(xmlData,i,closingChar=">"){let attrBoundary=0;const len=xmlData.length;const closeCode0=closingChar.charCodeAt(0);const closeCode1=closingChar.length>1?closingChar.charCodeAt(1):-1;let result="";let segmentStart=i;for(let index=i;index<len;index++){const code=xmlData.charCodeAt(index);if(attrBoundary){if(code===attrBoundary)attrBoundary=0}else if(code===34||code===39){attrBoundary=code}else if(code===closeCode0){if(closeCode1!==-1){if(xmlData.charCodeAt(index+1)===closeCode1){result+=xmlData.substring(segmentStart,index);return{data:result,index}}}else{result+=xmlData.substring(segmentStart,index);return{data:result,index}}}else if(code===9&&!attrBoundary){result+=xmlData.substring(segmentStart,index)+" ";segmentStart=index+1}}}function findClosingIndex(xmlData,str,i,errMsg){const closingIndex=xmlData.indexOf(str,i);if(closingIndex===-1){throw new Error(errMsg)}else{return closingIndex+str.length-1}}function findClosingChar(xmlData,char,i,errMsg){const closingIndex=xmlData.indexOf(char,i);if(closingIndex===-1)throw new Error(errMsg);return closingIndex}function readTagExp(xmlData,i,removeNSPrefix,closingChar=">"){const result=tagExpWithClosingIndex(xmlData,i+1,closingChar);if(!result)return;let tagExp=result.data;const closeIndex=result.index;const separatorIndex=tagExp.search(/\s/);let tagName=tagExp;let attrExpPresent=true;if(separatorIndex!==-1){tagName=tagExp.substring(0,separatorIndex);tagExp=tagExp.substring(separatorIndex+1).trimStart()}const rawTagName=tagName;if(removeNSPrefix){const colonIndex=tagName.indexOf(":");if(colonIndex!==-1){tagName=tagName.substr(colonIndex+1);attrExpPresent=tagName!==result.data.substr(colonIndex+1)}}return{tagName,tagExp,closeIndex,attrExpPresent,rawTagName}}function readStopNodeData(xmlData,tagName,i){const startIndex=i;let openTagCount=1;const xmllen=xmlData.length;for(;i<xmllen;i++){if(xmlData[i]==="<"){const c1=xmlData.charCodeAt(i+1);if(c1===47){const closeIndex=findClosingChar(xmlData,">",i,`${tagName} is not closed`);let closeTagName=xmlData.substring(i+2,closeIndex).trim();if(closeTagName===tagName){openTagCount--;if(openTagCount===0){return{tagContent:xmlData.substring(startIndex,i),i:closeIndex}}}i=closeIndex}else if(c1===63){const closeIndex=findClosingIndex(xmlData,"?>",i+1,"StopNode is not closed.");i=closeIndex}else if(c1===33&&xmlData.charCodeAt(i+2)===45&&xmlData.charCodeAt(i+3)===45){const closeIndex=findClosingIndex(xmlData,"-->",i+3,"StopNode is not closed.");i=closeIndex}else if(c1===33&&xmlData.charCodeAt(i+2)===91){const closeIndex=findClosingIndex(xmlData,"]]>",i,"StopNode is not closed.")-2;i=closeIndex}else{const tagData=readTagExp(xmlData,i,false);if(tagData){const openTagName=tagData&&tagData.tagName;if(openTagName===tagName&&tagData.tagExp[tagData.tagExp.length-1]!=="/"){openTagCount++}i=tagData.closeIndex}}}}}function parseValue(val,shouldParse,options){if(shouldParse&&typeof val==="string"){const newval=val.trim();if(newval==="true")return true;else if(newval==="false")return false;else return toNumber(val,options)}else{if(isExist(val)){return val}else{return""}}}function transformTagName(fn,tagName,tagExp,options){if(fn){const newTagName=fn(tagName);if(tagExp===tagName){tagExp=newTagName}tagName=newTagName}tagName=sanitizeName(tagName,options);return{tagName,tagExp}}function sanitizeName(name,options){if(criticalProperties.includes(name)){throw new Error(`[SECURITY] Invalid name: "${name}" is a reserved JavaScript keyword that could cause prototype pollution`)}else if(DANGEROUS_PROPERTY_NAMES.includes(name)){return options.onDangerousProperty(name)}return name}var METADATA_SYMBOL2=XmlNode.getMetaDataSymbol();function stripAttributePrefix(attrs,prefix){if(!attrs||typeof attrs!=="object")return{};if(!prefix)return attrs;const rawAttrs={};for(const key in attrs){if(key.startsWith(prefix)){const rawName=key.substring(prefix.length);rawAttrs[rawName]=attrs[key]}else{rawAttrs[key]=attrs[key]}}return rawAttrs}function prettify(node,options,matcher,readonlyMatcher){return compress(node,options,matcher,readonlyMatcher)}function compress(arr,options,matcher,readonlyMatcher){let text;const compressedObj={};for(let i=0;i<arr.length;i++){const tagObj=arr[i];const property=propName(tagObj);if(property!==void 0&&property!==options.textNodeName){const rawAttrs=stripAttributePrefix(tagObj[":@"]||{},options.attributeNamePrefix);matcher.push(property,rawAttrs)}if(property===options.textNodeName){if(text===void 0)text=tagObj[property];else text+=""+tagObj[property]}else if(property===void 0){continue}else if(tagObj[property]){let val=compress(tagObj[property],options,matcher,readonlyMatcher);const isLeaf=isLeafTag(val,options);if(Object.keys(val).length===0&&options.alwaysCreateTextNode){val[options.textNodeName]=""}if(tagObj[":@"]){assignAttributes(val,tagObj[":@"],readonlyMatcher,options)}else if(Object.keys(val).length===1&&val[options.textNodeName]!==void 0&&!options.alwaysCreateTextNode){val=val[options.textNodeName]}else if(Object.keys(val).length===0){if(options.alwaysCreateTextNode)val[options.textNodeName]="";else val=""}if(tagObj[METADATA_SYMBOL2]!==void 0&&typeof val==="object"&&val!==null){val[METADATA_SYMBOL2]=tagObj[METADATA_SYMBOL2]}if(compressedObj[property]!==void 0&&Object.prototype.hasOwnProperty.call(compressedObj,property)){if(!Array.isArray(compressedObj[property])){compressedObj[property]=[compressedObj[property]]}compressedObj[property].push(val)}else{const jPathOrMatcher=options.jPath?readonlyMatcher.toString():readonlyMatcher;if(options.isArray(property,jPathOrMatcher,isLeaf)){compressedObj[property]=[val]}else{compressedObj[property]=val}}if(property!==void 0&&property!==options.textNodeName){matcher.pop()}}}if(typeof text==="string"){if(text.length>0)compressedObj[options.textNodeName]=text}else if(text!==void 0)compressedObj[options.textNodeName]=text;return compressedObj}function propName(obj){const keys=Object.keys(obj);for(let i=0;i<keys.length;i++){const key=keys[i];if(key!==":@")return key}}function assignAttributes(obj,attrMap,readonlyMatcher,options){if(attrMap){const keys=Object.keys(attrMap);const len=keys.length;for(let i=0;i<len;i++){const atrrName=keys[i];const rawAttrName=atrrName.startsWith(options.attributeNamePrefix)?atrrName.substring(options.attributeNamePrefix.length):atrrName;const jPathOrMatcher=options.jPath?readonlyMatcher.toString()+"."+rawAttrName:readonlyMatcher;if(options.isArray(atrrName,jPathOrMatcher,true,true)){obj[atrrName]=[attrMap[atrrName]]}else{obj[atrrName]=attrMap[atrrName]}}}}function isLeafTag(obj,options){const{textNodeName}=options;const propCount=Object.keys(obj).length;if(propCount===0){return true}if(propCount===1&&(obj[textNodeName]||typeof obj[textNodeName]==="boolean"||obj[textNodeName]===0)){return true}return false}var XMLParser=class{constructor(options){this.externalEntities={};this.options=buildOptions(options)}parse(xmlData,validationOption){if(typeof xmlData!=="string"&&xmlData.toString){xmlData=xmlData.toString()}else if(typeof xmlData!=="string"){throw new Error("XML data is accepted in String or Bytes[] form.")}if(validationOption){if(validationOption===true)validationOption={};const result=validate(xmlData,validationOption);if(result!==true){throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)}}const orderedObjParser=new OrderedObjParser(this.options,this.externalEntities);const orderedResult=orderedObjParser.parseXml(xmlData);if(this.options.preserveOrder||orderedResult===void 0)return orderedResult;else return prettify(orderedResult,this.options,orderedObjParser.matcher,orderedObjParser.readonlyMatcher)}addEntity(key,value){if(value.indexOf("&")!==-1){throw new Error("Entity value can't have '&'")}else if(key.indexOf("&")!==-1||key.indexOf(";")!==-1){throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'")}else if(value==="&"){throw new Error("An entity with value '&' is not permitted")}else{this.externalEntities[key]=value}}static getMetaDataSymbol(){return XmlNode.getMetaDataSymbol()}};var XMLValidator={validate};var SKIPPED_EXTENSIONS=/\.(?:avif|bmp|css|csv|docx?|eot|gif|gz|ico|jpe?g|js|json|map|mp3|mp4|mov|ogg|otf|pdf|png|pptx?|rar|rss|svg|tar|tiff?|ttf|txt|wav|webm|webp|woff2?|xlsx?|xml|zip)$/i;function normalizeUrl(input,base,{includeQuery=false}={}){let url;try{url=base?new URL(input,base):new URL(input)}catch{return null}if(url.protocol!=="http:"&&url.protocol!=="https:"){return null}url.hash="";if(!includeQuery){url.search=""}if(url.pathname.length>1&&url.pathname.endsWith("/")){url.pathname=url.pathname.replace(/\/+$/,"")}return url.href}function isSameOrigin(url,origin){try{return new URL(url).origin===origin}catch{return false}}function isCrawlableUrl(url){try{const parsed=new URL(url);return!SKIPPED_EXTENSIONS.test(parsed.pathname)}catch{return false}}var MAX_SITEMAP_BYTES=10*1024*1024;var MAX_SITEMAPS=100;var DEFAULT_SITEMAP_LIMIT=5e4;var parser=new XMLParser({ignoreAttributes:false,removeNSPrefix:true,trimValues:true});function record(value){return value&&typeof value==="object"&&!Array.isArray(value)?value:null}function locations(value){const entries=value===void 0?[]:Array.isArray(value)?value:[value];return entries.flatMap(entry=>{const location=record(entry)?.loc;return typeof location==="string"?[location]:[]})}function decodeSitemap(buffer,url,contentType){const gzip=url.toLowerCase().endsWith(".gz")||contentType.includes("gzip")||buffer[0]===31&&buffer[1]===139;const decoded=gzip?gunzipSync(buffer):buffer;if(decoded.byteLength>MAX_SITEMAP_BYTES)throw new Error(`sitemap exceeds ${MAX_SITEMAP_BYTES} bytes after decompression: ${url}`);return decoded.toString("utf8").replace(/^\uFEFF/,"")}function parseSitemap(xml,url){const validation=XMLValidator.validate(xml);if(validation!==true)throw new Error(`invalid sitemap XML at ${url}: ${validation.err.msg}`);const data=record(parser.parse(xml));const sitemapIndex=record(data?.sitemapindex);if(sitemapIndex){return{kind:"index",locations:locations(sitemapIndex.sitemap)}}const urlSet=record(data?.urlset);if(urlSet){return{kind:"urlset",locations:locations(urlSet.url)}}throw new Error(`XML is not a sitemap urlset or sitemapindex: ${url}`)}function policy(options){return{fetch:options.fetch??globalThis.fetch,timeout:options.timeout,maxRedirects:options.maxRedirects??10,retries:options.retries??2,signal:options.signal,gate:options.requestGate?async url=>options.requestGate?.(url):void 0,onEvent:options.onEvent}}async function fetchSitemap(url,options){const{response}=await fetchWithRetry(url,{headers:{accept:"application/xml,text/xml,application/gzip,text/plain;q=0.9,*/*;q=0.1","user-agent":options.userAgent}},policy(options));if(!response.ok){await response.body?.cancel();throw new Error(`sitemap returned HTTP ${response.status}: ${url}`)}const{buffer}=await readResponseBody(response,MAX_SITEMAP_BYTES);return decodeSitemap(buffer,url,response.headers.get("content-type")?.toLowerCase()??"")}async function isSitemapResponse(url,options){try{const xml=await fetchSitemap(url,options);parseSitemap(xml,url);return true}catch{return false}}async function discoverSitemapUrl(inputUrl,options){const startUrl=normalizeUrl(inputUrl,void 0);if(!startUrl)throw new Error(`invalid start URL: ${inputUrl}`);const origin=new URL(startUrl).origin;const robotsUrl=new URL("/robots.txt",origin).href;try{if(options.robotsBody!==void 0){for(const match of options.robotsBody.matchAll(/^sitemap:\s*(\S+)\s*$/gim)){const location=match[1];if(!location)continue;const candidate=normalizeUrl(location,robotsUrl,{includeQuery:true});if(candidate&&isSameOrigin(candidate,origin))return candidate}}else{const{response}=await fetchWithRetry(robotsUrl,{headers:{accept:"text/plain,*/*;q=0.1","user-agent":options.userAgent}},policy({...options,siteOrigin:origin}));if(response.ok){const{text}=await readResponseBody(response,512*1024);for(const match of text.matchAll(/^sitemap:\s*(\S+)\s*$/gim)){const location=match[1];if(!location)continue;const candidate=normalizeUrl(location,robotsUrl,{includeQuery:true});if(candidate&&isSameOrigin(candidate,origin))return candidate}}else await response.body?.cancel()}}catch{}for(const path of["/sitemap.xml","/sitemap.xml.gz","/sitemap_index.xml"]){const candidate=new URL(path,origin).href;if(await isSitemapResponse(candidate,{...options,siteOrigin:origin}))return candidate}return null}async function loadSitemapUrls(inputUrl,options){const sitemapUrl=normalizeUrl(inputUrl,void 0,{includeQuery:true});if(!sitemapUrl)throw new Error(`invalid sitemap URL: ${inputUrl}`);const sitemapOrigin=new URL(sitemapUrl).origin;const sitemapQueue=[sitemapUrl];const visitedSitemaps=new Set;const pageUrls=[];const pageSet=new Set;const limit=options.maxUrls??DEFAULT_SITEMAP_LIMIT;let truncated=false;while(sitemapQueue.length>0&&visitedSitemaps.size<MAX_SITEMAPS&&pageUrls.length<limit){const currentUrl=sitemapQueue.shift();if(visitedSitemaps.has(currentUrl))continue;visitedSitemaps.add(currentUrl);const parsed=parseSitemap(await fetchSitemap(currentUrl,options),currentUrl);if(parsed.kind==="index"){for(const location of parsed.locations){const child=normalizeUrl(location,currentUrl,{includeQuery:true});if(child&&isSameOrigin(child,sitemapOrigin)&&!visitedSitemaps.has(child)&&!sitemapQueue.includes(child))sitemapQueue.push(child)}sitemapQueue.sort();continue}for(const location of parsed.locations){const pageUrl=normalizeUrl(location,currentUrl,{includeQuery:options.includeQuery??false});if(!pageUrl||pageSet.has(pageUrl)||!isSameOrigin(pageUrl,options.siteOrigin)||!isCrawlableUrl(pageUrl))continue;pageSet.add(pageUrl);pageUrls.push(pageUrl);if(pageUrls.length>=limit){truncated=true;break}}}if(sitemapQueue.length>0||visitedSitemaps.size>=MAX_SITEMAPS)truncated=true;return{url:sitemapUrl,urls:pageUrls.sort(),sitemapCount:visitedSitemaps.size,truncated,error:null}}async function emit(options,event){await options.onEvent?.(event)}async function planScan(configInput,options={}){const config=resolveConfig(configInput);const startUrl=normalizeUrl(config.url,void 0,{includeQuery:config.includeQuery});if(!startUrl)throw new Error(`invalid start URL: ${config.url}`);const origin=new URL(startUrl).origin;const fetch=options.fetch??globalThis.fetch;const requestGate=createPerOriginRequestGate(config.delay);const logger=options.logger??NOOP_LOGGER;await emit(options,{type:"plan-start",url:startUrl});const robots=await fetchRobots(startUrl,{userAgent:DEFAULT_USER_AGENT,timeout:config.timeout,maxRedirects:config.maxRedirects,retries:2,fetch,signal:options.signal,requestGate,onEvent:options.onEvent,logger});await emit(options,{type:"robots",robots});let sitemapUrl=null;if(config.sitemap==="auto"){sitemapUrl=await discoverSitemapUrl(startUrl,{timeout:config.timeout,maxRedirects:config.maxRedirects,userAgent:DEFAULT_USER_AGENT,fetch,signal:options.signal,requestGate,onEvent:options.onEvent,robotsBody:robots.body})}else if(config.sitemap!=="none"){sitemapUrl=config.sitemap}let sitemap=null;if(sitemapUrl){try{sitemap=await loadSitemapUrls(sitemapUrl,{siteOrigin:origin,includeQuery:config.includeQuery,maxUrls:5e4,timeout:config.timeout,maxRedirects:config.maxRedirects,retries:2,userAgent:DEFAULT_USER_AGENT,fetch,signal:options.signal,requestGate,onEvent:options.onEvent})}catch(error){sitemap={url:sitemapUrl,urls:[],sitemapCount:0,truncated:false,error:error instanceof Error?error.message:String(error)};logger.warn(`Could not load sitemap ${sitemapUrl}: ${sitemap.error}`)}}const candidateUrls=sitemap?[...new Set([startUrl,...sitemap.urls])].sort((left,right)=>left===startUrl?-1:right===startUrl?1:left.localeCompare(right)):[startUrl];const candidateCount=sitemap?candidateUrls.length:null;await emit(options,{type:"sitemap",sitemap,candidateCount});return{planVersion:1,config,startUrl,origin,userAgent:DEFAULT_USER_AGENT,robots,sitemap,candidateUrls,candidateCount,mode:sitemap?"sitemap":"links"}}import{createHash as createHash4}from"node:crypto";var UNDEFINED_CODE_POINTS=new Set([65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]);var REPLACEMENT_CHARACTER="\uFFFD";var CODE_POINTS;(function(CODE_POINTS2){CODE_POINTS2[CODE_POINTS2["EOF"]=-1]="EOF";CODE_POINTS2[CODE_POINTS2["NULL"]=0]="NULL";CODE_POINTS2[CODE_POINTS2["TABULATION"]=9]="TABULATION";CODE_POINTS2[CODE_POINTS2["CARRIAGE_RETURN"]=13]="CARRIAGE_RETURN";CODE_POINTS2[CODE_POINTS2["LINE_FEED"]=10]="LINE_FEED";CODE_POINTS2[CODE_POINTS2["FORM_FEED"]=12]="FORM_FEED";CODE_POINTS2[CODE_POINTS2["SPACE"]=32]="SPACE";CODE_POINTS2[CODE_POINTS2["EXCLAMATION_MARK"]=33]="EXCLAMATION_MARK";CODE_POINTS2[CODE_POINTS2["QUOTATION_MARK"]=34]="QUOTATION_MARK";CODE_POINTS2[CODE_POINTS2["AMPERSAND"]=38]="AMPERSAND";CODE_POINTS2[CODE_POINTS2["APOSTROPHE"]=39]="APOSTROPHE";CODE_POINTS2[CODE_POINTS2["HYPHEN_MINUS"]=45]="HYPHEN_MINUS";CODE_POINTS2[CODE_POINTS2["SOLIDUS"]=47]="SOLIDUS";CODE_POINTS2[CODE_POINTS2["DIGIT_0"]=48]="DIGIT_0";CODE_POINTS2[CODE_POINTS2["DIGIT_9"]=57]="DIGIT_9";CODE_POINTS2[CODE_POINTS2["SEMICOLON"]=59]="SEMICOLON";CODE_POINTS2[CODE_POINTS2["LESS_THAN_SIGN"]=60]="LESS_THAN_SIGN";CODE_POINTS2[CODE_POINTS2["EQUALS_SIGN"]=61]="EQUALS_SIGN";CODE_POINTS2[CODE_POINTS2["GREATER_THAN_SIGN"]=62]="GREATER_THAN_SIGN";CODE_POINTS2[CODE_POINTS2["QUESTION_MARK"]=63]="QUESTION_MARK";CODE_POINTS2[CODE_POINTS2["LATIN_CAPITAL_A"]=65]="LATIN_CAPITAL_A";CODE_POINTS2[CODE_POINTS2["LATIN_CAPITAL_Z"]=90]="LATIN_CAPITAL_Z";CODE_POINTS2[CODE_POINTS2["RIGHT_SQUARE_BRACKET"]=93]="RIGHT_SQUARE_BRACKET";CODE_POINTS2[CODE_POINTS2["GRAVE_ACCENT"]=96]="GRAVE_ACCENT";CODE_POINTS2[CODE_POINTS2["LATIN_SMALL_A"]=97]="LATIN_SMALL_A";CODE_POINTS2[CODE_POINTS2["LATIN_SMALL_Z"]=122]="LATIN_SMALL_Z"})(CODE_POINTS||(CODE_POINTS={}));var SEQUENCES={DASH_DASH:"--",CDATA_START:"[CDATA[",DOCTYPE:"doctype",SCRIPT:"script",PUBLIC:"public",SYSTEM:"system"};function isSurrogate(cp){return cp>=55296&&cp<=57343}function isSurrogatePair(cp){return cp>=56320&&cp<=57343}function getSurrogatePairCodePoint(cp1,cp2){return(cp1-55296)*1024+9216+cp2}function isControlCodePoint(cp){return cp!==32&&cp!==10&&cp!==13&&cp!==9&&cp!==12&&cp>=1&&cp<=31||cp>=127&&cp<=159}function isUndefinedCodePoint(cp){return cp>=64976&&cp<=65007||UNDEFINED_CODE_POINTS.has(cp)}var ERR;(function(ERR2){ERR2["controlCharacterInInputStream"]="control-character-in-input-stream";ERR2["noncharacterInInputStream"]="noncharacter-in-input-stream";ERR2["surrogateInInputStream"]="surrogate-in-input-stream";ERR2["nonVoidHtmlElementStartTagWithTrailingSolidus"]="non-void-html-element-start-tag-with-trailing-solidus";ERR2["endTagWithAttributes"]="end-tag-with-attributes";ERR2["endTagWithTrailingSolidus"]="end-tag-with-trailing-solidus";ERR2["unexpectedSolidusInTag"]="unexpected-solidus-in-tag";ERR2["unexpectedNullCharacter"]="unexpected-null-character";ERR2["unexpectedQuestionMarkInsteadOfTagName"]="unexpected-question-mark-instead-of-tag-name";ERR2["invalidFirstCharacterOfTagName"]="invalid-first-character-of-tag-name";ERR2["unexpectedEqualsSignBeforeAttributeName"]="unexpected-equals-sign-before-attribute-name";ERR2["missingEndTagName"]="missing-end-tag-name";ERR2["unexpectedCharacterInAttributeName"]="unexpected-character-in-attribute-name";ERR2["unknownNamedCharacterReference"]="unknown-named-character-reference";ERR2["missingSemicolonAfterCharacterReference"]="missing-semicolon-after-character-reference";ERR2["unexpectedCharacterAfterDoctypeSystemIdentifier"]="unexpected-character-after-doctype-system-identifier";ERR2["unexpectedCharacterInUnquotedAttributeValue"]="unexpected-character-in-unquoted-attribute-value";ERR2["eofBeforeTagName"]="eof-before-tag-name";ERR2["eofInTag"]="eof-in-tag";ERR2["missingAttributeValue"]="missing-attribute-value";ERR2["missingWhitespaceBetweenAttributes"]="missing-whitespace-between-attributes";ERR2["missingWhitespaceAfterDoctypePublicKeyword"]="missing-whitespace-after-doctype-public-keyword";ERR2["missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers"]="missing-whitespace-between-doctype-public-and-system-identifiers";ERR2["missingWhitespaceAfterDoctypeSystemKeyword"]="missing-whitespace-after-doctype-system-keyword";ERR2["missingQuoteBeforeDoctypePublicIdentifier"]="missing-quote-before-doctype-public-identifier";ERR2["missingQuoteBeforeDoctypeSystemIdentifier"]="missing-quote-before-doctype-system-identifier";ERR2["missingDoctypePublicIdentifier"]="missing-doctype-public-identifier";ERR2["missingDoctypeSystemIdentifier"]="missing-doctype-system-identifier";ERR2["abruptDoctypePublicIdentifier"]="abrupt-doctype-public-identifier";ERR2["abruptDoctypeSystemIdentifier"]="abrupt-doctype-system-identifier";ERR2["cdataInHtmlContent"]="cdata-in-html-content";ERR2["incorrectlyOpenedComment"]="incorrectly-opened-comment";ERR2["eofInScriptHtmlCommentLikeText"]="eof-in-script-html-comment-like-text";ERR2["eofInDoctype"]="eof-in-doctype";ERR2["nestedComment"]="nested-comment";ERR2["abruptClosingOfEmptyComment"]="abrupt-closing-of-empty-comment";ERR2["eofInComment"]="eof-in-comment";ERR2["incorrectlyClosedComment"]="incorrectly-closed-comment";ERR2["eofInCdata"]="eof-in-cdata";ERR2["absenceOfDigitsInNumericCharacterReference"]="absence-of-digits-in-numeric-character-reference";ERR2["nullCharacterReference"]="null-character-reference";ERR2["surrogateCharacterReference"]="surrogate-character-reference";ERR2["characterReferenceOutsideUnicodeRange"]="character-reference-outside-unicode-range";ERR2["controlCharacterReference"]="control-character-reference";ERR2["noncharacterCharacterReference"]="noncharacter-character-reference";ERR2["missingWhitespaceBeforeDoctypeName"]="missing-whitespace-before-doctype-name";ERR2["missingDoctypeName"]="missing-doctype-name";ERR2["invalidCharacterSequenceAfterDoctypeName"]="invalid-character-sequence-after-doctype-name";ERR2["duplicateAttribute"]="duplicate-attribute";ERR2["nonConformingDoctype"]="non-conforming-doctype";ERR2["missingDoctype"]="missing-doctype";ERR2["misplacedDoctype"]="misplaced-doctype";ERR2["endTagWithoutMatchingOpenElement"]="end-tag-without-matching-open-element";ERR2["closingOfElementWithOpenChildElements"]="closing-of-element-with-open-child-elements";ERR2["disallowedContentInNoscriptInHead"]="disallowed-content-in-noscript-in-head";ERR2["openElementsLeftAfterEof"]="open-elements-left-after-eof";ERR2["abandonedHeadElementChild"]="abandoned-head-element-child";ERR2["misplacedStartTagForHeadElement"]="misplaced-start-tag-for-head-element";ERR2["nestedNoscriptInHead"]="nested-noscript-in-head";ERR2["eofInElementThatCanContainOnlyText"]="eof-in-element-that-can-contain-only-text"})(ERR||(ERR={}));var DEFAULT_BUFFER_WATERLINE=1<<16;var Preprocessor=class{constructor(handler){this.handler=handler;this.html="";this.pos=-1;this.lastGapPos=-2;this.gapStack=[];this.skipNextNewLine=false;this.lastChunkWritten=false;this.endOfChunkHit=false;this.bufferWaterline=DEFAULT_BUFFER_WATERLINE;this.isEol=false;this.lineStartPos=0;this.droppedBufferSize=0;this.line=1;this.lastErrOffset=-1}get col(){return this.pos-this.lineStartPos+Number(this.lastGapPos!==this.pos)}get offset(){return this.droppedBufferSize+this.pos}getError(code,cpOffset){const{line,col,offset}=this;const startCol=col+cpOffset;const startOffset=offset+cpOffset;return{code,startLine:line,endLine:line,startCol,endCol:startCol,startOffset,endOffset:startOffset}}_err(code){if(this.handler.onParseError&&this.lastErrOffset!==this.offset){this.lastErrOffset=this.offset;this.handler.onParseError(this.getError(code,0))}}_addGap(){this.gapStack.push(this.lastGapPos);this.lastGapPos=this.pos}_processSurrogate(cp){if(this.pos!==this.html.length-1){const nextCp=this.html.charCodeAt(this.pos+1);if(isSurrogatePair(nextCp)){this.pos++;this._addGap();return getSurrogatePairCodePoint(cp,nextCp)}}else if(!this.lastChunkWritten){this.endOfChunkHit=true;return CODE_POINTS.EOF}this._err(ERR.surrogateInInputStream);return cp}willDropParsedChunk(){return this.pos>this.bufferWaterline}dropParsedChunk(){if(this.willDropParsedChunk()){this.html=this.html.substring(this.pos);this.lineStartPos-=this.pos;this.droppedBufferSize+=this.pos;this.pos=0;this.lastGapPos=-2;this.gapStack.length=0}}write(chunk,isLastChunk){if(this.html.length>0){this.html+=chunk}else{this.html=chunk}this.endOfChunkHit=false;this.lastChunkWritten=isLastChunk}insertHtmlAtCurrentPos(chunk){this.html=this.html.substring(0,this.pos+1)+chunk+this.html.substring(this.pos+1);this.endOfChunkHit=false}startsWith(pattern,caseSensitive){if(this.pos+pattern.length>this.html.length){this.endOfChunkHit=!this.lastChunkWritten;return false}if(caseSensitive){return this.html.startsWith(pattern,this.pos)}for(let i=0;i<pattern.length;i++){const cp=this.html.charCodeAt(this.pos+i)|32;if(cp!==pattern.charCodeAt(i)){return false}}return true}peek(offset){const pos=this.pos+offset;if(pos>=this.html.length){this.endOfChunkHit=!this.lastChunkWritten;return CODE_POINTS.EOF}const code=this.html.charCodeAt(pos);return code===CODE_POINTS.CARRIAGE_RETURN?CODE_POINTS.LINE_FEED:code}advance(){this.pos++;if(this.isEol){this.isEol=false;this.line++;this.lineStartPos=this.pos}if(this.pos>=this.html.length){this.endOfChunkHit=!this.lastChunkWritten;return CODE_POINTS.EOF}let cp=this.html.charCodeAt(this.pos);if(cp===CODE_POINTS.CARRIAGE_RETURN){this.isEol=true;this.skipNextNewLine=true;return CODE_POINTS.LINE_FEED}if(cp===CODE_POINTS.LINE_FEED){this.isEol=true;if(this.skipNextNewLine){this.line--;this.skipNextNewLine=false;this._addGap();return this.advance()}}this.skipNextNewLine=false;if(isSurrogate(cp)){cp=this._processSurrogate(cp)}const isCommonValidRange=this.handler.onParseError===null||cp>31&&cp<127||cp===CODE_POINTS.LINE_FEED||cp===CODE_POINTS.CARRIAGE_RETURN||cp>159&&cp<64976;if(!isCommonValidRange){this._checkForProblematicCharacters(cp)}return cp}_checkForProblematicCharacters(cp){if(isControlCodePoint(cp)){this._err(ERR.controlCharacterInInputStream)}else if(isUndefinedCodePoint(cp)){this._err(ERR.noncharacterInInputStream)}}retreat(count){this.pos-=count;while(this.pos<this.lastGapPos){this.lastGapPos=this.gapStack.pop();this.pos--}this.isEol=false}};var TokenType;(function(TokenType2){TokenType2[TokenType2["CHARACTER"]=0]="CHARACTER";TokenType2[TokenType2["NULL_CHARACTER"]=1]="NULL_CHARACTER";TokenType2[TokenType2["WHITESPACE_CHARACTER"]=2]="WHITESPACE_CHARACTER";TokenType2[TokenType2["START_TAG"]=3]="START_TAG";TokenType2[TokenType2["END_TAG"]=4]="END_TAG";TokenType2[TokenType2["COMMENT"]=5]="COMMENT";TokenType2[TokenType2["DOCTYPE"]=6]="DOCTYPE";TokenType2[TokenType2["EOF"]=7]="EOF";TokenType2[TokenType2["HIBERNATION"]=8]="HIBERNATION"})(TokenType||(TokenType={}));function getTokenAttr(token,attrName){for(let i=token.attrs.length-1;i>=0;i--){if(token.attrs[i].name===attrName){return token.attrs[i].value}}return null}var decodeMap=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]);function replaceCodePoint(codePoint){if(codePoint>=55296&&codePoint<=57343||codePoint>1114111){return 65533}return decodeMap.get(codePoint)??codePoint}function decodeBase64(input){const binary=atob(input);const evenLength=binary.length&~1;const out=new Uint16Array(evenLength/2);for(let index=0,outIndex=0;index<evenLength;index+=2){const lo=binary.charCodeAt(index);const hi=binary.charCodeAt(index+1);out[outIndex++]=lo|hi<<8}return out}var htmlDecodeTree=decodeBase64("QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg");var BinTrieFlags;(function(BinTrieFlags2){BinTrieFlags2[BinTrieFlags2["VALUE_LENGTH"]=49152]="VALUE_LENGTH";BinTrieFlags2[BinTrieFlags2["FLAG13"]=8192]="FLAG13";BinTrieFlags2[BinTrieFlags2["BRANCH_LENGTH"]=8064]="BRANCH_LENGTH";BinTrieFlags2[BinTrieFlags2["JUMP_TABLE"]=127]="JUMP_TABLE"})(BinTrieFlags||(BinTrieFlags={}));var CharCodes;(function(CharCodes2){CharCodes2[CharCodes2["NUM"]=35]="NUM";CharCodes2[CharCodes2["SEMI"]=59]="SEMI";CharCodes2[CharCodes2["EQUALS"]=61]="EQUALS";CharCodes2[CharCodes2["ZERO"]=48]="ZERO";CharCodes2[CharCodes2["NINE"]=57]="NINE";CharCodes2[CharCodes2["LOWER_A"]=97]="LOWER_A";CharCodes2[CharCodes2["LOWER_F"]=102]="LOWER_F";CharCodes2[CharCodes2["LOWER_X"]=120]="LOWER_X";CharCodes2[CharCodes2["LOWER_Z"]=122]="LOWER_Z";CharCodes2[CharCodes2["UPPER_A"]=65]="UPPER_A";CharCodes2[CharCodes2["UPPER_F"]=70]="UPPER_F";CharCodes2[CharCodes2["UPPER_Z"]=90]="UPPER_Z"})(CharCodes||(CharCodes={}));var TO_LOWER_BIT=32;function isNumber(code){return code>=CharCodes.ZERO&&code<=CharCodes.NINE}function isHexadecimalCharacter(code){return code>=CharCodes.UPPER_A&&code<=CharCodes.UPPER_F||code>=CharCodes.LOWER_A&&code<=CharCodes.LOWER_F}function isAsciiAlphaNumeric(code){return code>=CharCodes.UPPER_A&&code<=CharCodes.UPPER_Z||code>=CharCodes.LOWER_A&&code<=CharCodes.LOWER_Z||isNumber(code)}function isEntityInAttributeInvalidEnd(code){return code===CharCodes.EQUALS||isAsciiAlphaNumeric(code)}var EntityDecoderState;(function(EntityDecoderState2){EntityDecoderState2[EntityDecoderState2["EntityStart"]=0]="EntityStart";EntityDecoderState2[EntityDecoderState2["NumericStart"]=1]="NumericStart";EntityDecoderState2[EntityDecoderState2["NumericDecimal"]=2]="NumericDecimal";EntityDecoderState2[EntityDecoderState2["NumericHex"]=3]="NumericHex";EntityDecoderState2[EntityDecoderState2["NamedEntity"]=4]="NamedEntity"})(EntityDecoderState||(EntityDecoderState={}));var DecodingMode;(function(DecodingMode2){DecodingMode2[DecodingMode2["Legacy"]=0]="Legacy";DecodingMode2[DecodingMode2["Strict"]=1]="Strict";DecodingMode2[DecodingMode2["Attribute"]=2]="Attribute"})(DecodingMode||(DecodingMode={}));var EntityDecoder2=class{decodeTree;emitCodePoint;errors;constructor(decodeTree,emitCodePoint,errors){this.decodeTree=decodeTree;this.emitCodePoint=emitCodePoint;this.errors=errors}state=EntityDecoderState.EntityStart;consumed=1;result=0;treeIndex=0;excess=1;decodeMode=DecodingMode.Strict;runConsumed=0;startEntity(decodeMode){this.decodeMode=decodeMode;this.state=EntityDecoderState.EntityStart;this.result=0;this.treeIndex=0;this.excess=1;this.consumed=1;this.runConsumed=0}write(input,offset){switch(this.state){case EntityDecoderState.EntityStart:{if(input.charCodeAt(offset)===CharCodes.NUM){this.state=EntityDecoderState.NumericStart;this.consumed+=1;return this.stateNumericStart(input,offset+1)}this.state=EntityDecoderState.NamedEntity;return this.stateNamedEntity(input,offset)}case EntityDecoderState.NumericStart:{return this.stateNumericStart(input,offset)}case EntityDecoderState.NumericDecimal:{return this.stateNumericDecimal(input,offset)}case EntityDecoderState.NumericHex:{return this.stateNumericHex(input,offset)}case EntityDecoderState.NamedEntity:{return this.stateNamedEntity(input,offset)}}}stateNumericStart(input,offset){if(offset>=input.length){return-1}if((input.charCodeAt(offset)|TO_LOWER_BIT)===CharCodes.LOWER_X){this.state=EntityDecoderState.NumericHex;this.consumed+=1;return this.stateNumericHex(input,offset+1)}this.state=EntityDecoderState.NumericDecimal;return this.stateNumericDecimal(input,offset)}stateNumericHex(input,offset){while(offset<input.length){const char=input.charCodeAt(offset);if(isNumber(char)||isHexadecimalCharacter(char)){const digit=char<=CharCodes.NINE?char-CharCodes.ZERO:(char|TO_LOWER_BIT)-CharCodes.LOWER_A+10;this.result=this.result*16+digit;this.consumed++;offset++}else{return this.emitNumericEntity(char,3)}}return-1}stateNumericDecimal(input,offset){while(offset<input.length){const char=input.charCodeAt(offset);if(isNumber(char)){this.result=this.result*10+(char-CharCodes.ZERO);this.consumed++;offset++}else{return this.emitNumericEntity(char,2)}}return-1}emitNumericEntity(lastCp,expectedLength){if(this.consumed<=expectedLength){this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);return 0}if(lastCp===CharCodes.SEMI){this.consumed+=1}else if(this.decodeMode===DecodingMode.Strict){return 0}this.emitCodePoint(replaceCodePoint(this.result),this.consumed);if(this.errors){if(lastCp!==CharCodes.SEMI){this.errors.missingSemicolonAfterCharacterReference()}this.errors.validateNumericCharacterReference(this.result)}return this.consumed}stateNamedEntity(input,offset){const{decodeTree}=this;let current=decodeTree[this.treeIndex];let valueLength=(current&BinTrieFlags.VALUE_LENGTH)>>14;while(offset<input.length){if(valueLength===0&&(current&BinTrieFlags.FLAG13)!==0){const runLength=(current&BinTrieFlags.BRANCH_LENGTH)>>7;if(this.runConsumed===0){const firstChar=current&BinTrieFlags.JUMP_TABLE;if(input.charCodeAt(offset)!==firstChar){return this.result===0?0:this.emitNotTerminatedNamedEntity()}offset++;this.excess++;this.runConsumed++}while(this.runConsumed<runLength){if(offset>=input.length){return-1}const charIndexInPacked=this.runConsumed-1;const packedWord=decodeTree[this.treeIndex+1+(charIndexInPacked>>1)];const expectedChar=charIndexInPacked%2===0?packedWord&255:packedWord>>8&255;if(input.charCodeAt(offset)!==expectedChar){this.runConsumed=0;return this.result===0?0:this.emitNotTerminatedNamedEntity()}offset++;this.excess++;this.runConsumed++}this.runConsumed=0;this.treeIndex+=1+(runLength>>1);current=decodeTree[this.treeIndex];valueLength=(current&BinTrieFlags.VALUE_LENGTH)>>14}if(offset>=input.length)break;const char=input.charCodeAt(offset);if(char===CharCodes.SEMI&&valueLength!==0&&(current&BinTrieFlags.FLAG13)!==0){return this.emitNamedEntityData(this.treeIndex,valueLength,this.consumed+this.excess)}this.treeIndex=determineBranch(decodeTree,current,this.treeIndex+Math.max(1,valueLength),char);if(this.treeIndex<0){return this.result===0||this.decodeMode===DecodingMode.Attribute&&(valueLength===0||isEntityInAttributeInvalidEnd(char))?0:this.emitNotTerminatedNamedEntity()}current=decodeTree[this.treeIndex];valueLength=(current&BinTrieFlags.VALUE_LENGTH)>>14;if(valueLength!==0){if(char===CharCodes.SEMI){return this.emitNamedEntityData(this.treeIndex,valueLength,this.consumed+this.excess)}if(this.decodeMode!==DecodingMode.Strict&&(current&BinTrieFlags.FLAG13)===0){this.result=this.treeIndex;this.consumed+=this.excess;this.excess=0}}offset++;this.excess++}return-1}emitNotTerminatedNamedEntity(){const{result,decodeTree}=this;const valueLength=(decodeTree[result]&BinTrieFlags.VALUE_LENGTH)>>14;this.emitNamedEntityData(result,valueLength,this.consumed);this.errors?.missingSemicolonAfterCharacterReference();return this.consumed}emitNamedEntityData(result,valueLength,consumed){const{decodeTree}=this;this.emitCodePoint(valueLength===1?decodeTree[result]&~(BinTrieFlags.VALUE_LENGTH|BinTrieFlags.FLAG13):decodeTree[result+1],consumed);if(valueLength===3){this.emitCodePoint(decodeTree[result+2],consumed)}return consumed}end(){switch(this.state){case EntityDecoderState.NamedEntity:{return this.result!==0&&(this.decodeMode!==DecodingMode.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0}case EntityDecoderState.NumericDecimal:{return this.emitNumericEntity(0,2)}case EntityDecoderState.NumericHex:{return this.emitNumericEntity(0,3)}case EntityDecoderState.NumericStart:{this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);return 0}case EntityDecoderState.EntityStart:{return 0}}}};function determineBranch(decodeTree,current,nodeIndex,char){const branchCount=(current&BinTrieFlags.BRANCH_LENGTH)>>7;const jumpOffset=current&BinTrieFlags.JUMP_TABLE;if(branchCount===0){return jumpOffset!==0&&char===jumpOffset?nodeIndex:-1}if(jumpOffset){const value=char-jumpOffset;return value<0||value>=branchCount?-1:decodeTree[nodeIndex+value]-1}const packedKeySlots=branchCount+1>>1;let lo=0;let hi=branchCount-1;while(lo<=hi){const mid=lo+hi>>>1;const slot=mid>>1;const packed=decodeTree[nodeIndex+slot];const midKey=packed>>(mid&1)*8&255;if(midKey<char){lo=mid+1}else if(midKey>char){hi=mid-1}else{return decodeTree[nodeIndex+packedKeySlots+mid]}}return-1}var NS;(function(NS2){NS2["HTML"]="http://www.w3.org/1999/xhtml";NS2["MATHML"]="http://www.w3.org/1998/Math/MathML";NS2["SVG"]="http://www.w3.org/2000/svg";NS2["XLINK"]="http://www.w3.org/1999/xlink";NS2["XML"]="http://www.w3.org/XML/1998/namespace";NS2["XMLNS"]="http://www.w3.org/2000/xmlns/"})(NS||(NS={}));var ATTRS;(function(ATTRS2){ATTRS2["TYPE"]="type";ATTRS2["ACTION"]="action";ATTRS2["ENCODING"]="encoding";ATTRS2["PROMPT"]="prompt";ATTRS2["NAME"]="name";ATTRS2["COLOR"]="color";ATTRS2["FACE"]="face";ATTRS2["SIZE"]="size"})(ATTRS||(ATTRS={}));var DOCUMENT_MODE;(function(DOCUMENT_MODE2){DOCUMENT_MODE2["NO_QUIRKS"]="no-quirks";DOCUMENT_MODE2["QUIRKS"]="quirks";DOCUMENT_MODE2["LIMITED_QUIRKS"]="limited-quirks"})(DOCUMENT_MODE||(DOCUMENT_MODE={}));var TAG_NAMES;(function(TAG_NAMES2){TAG_NAMES2["A"]="a";TAG_NAMES2["ADDRESS"]="address";TAG_NAMES2["ANNOTATION_XML"]="annotation-xml";TAG_NAMES2["APPLET"]="applet";TAG_NAMES2["AREA"]="area";TAG_NAMES2["ARTICLE"]="article";TAG_NAMES2["ASIDE"]="aside";TAG_NAMES2["B"]="b";TAG_NAMES2["BASE"]="base";TAG_NAMES2["BASEFONT"]="basefont";TAG_NAMES2["BGSOUND"]="bgsound";TAG_NAMES2["BIG"]="big";TAG_NAMES2["BLOCKQUOTE"]="blockquote";TAG_NAMES2["BODY"]="body";TAG_NAMES2["BR"]="br";TAG_NAMES2["BUTTON"]="button";TAG_NAMES2["CAPTION"]="caption";TAG_NAMES2["CENTER"]="center";TAG_NAMES2["CODE"]="code";TAG_NAMES2["COL"]="col";TAG_NAMES2["COLGROUP"]="colgroup";TAG_NAMES2["DD"]="dd";TAG_NAMES2["DESC"]="desc";TAG_NAMES2["DETAILS"]="details";TAG_NAMES2["DIALOG"]="dialog";TAG_NAMES2["DIR"]="dir";TAG_NAMES2["DIV"]="div";TAG_NAMES2["DL"]="dl";TAG_NAMES2["DT"]="dt";TAG_NAMES2["EM"]="em";TAG_NAMES2["EMBED"]="embed";TAG_NAMES2["FIELDSET"]="fieldset";TAG_NAMES2["FIGCAPTION"]="figcaption";TAG_NAMES2["FIGURE"]="figure";TAG_NAMES2["FONT"]="font";TAG_NAMES2["FOOTER"]="footer";TAG_NAMES2["FOREIGN_OBJECT"]="foreignObject";TAG_NAMES2["FORM"]="form";TAG_NAMES2["FRAME"]="frame";TAG_NAMES2["FRAMESET"]="frameset";TAG_NAMES2["H1"]="h1";TAG_NAMES2["H2"]="h2";TAG_NAMES2["H3"]="h3";TAG_NAMES2["H4"]="h4";TAG_NAMES2["H5"]="h5";TAG_NAMES2["H6"]="h6";TAG_NAMES2["HEAD"]="head";TAG_NAMES2["HEADER"]="header";TAG_NAMES2["HGROUP"]="hgroup";TAG_NAMES2["HR"]="hr";TAG_NAMES2["HTML"]="html";TAG_NAMES2["I"]="i";TAG_NAMES2["IMG"]="img";TAG_NAMES2["IMAGE"]="image";TAG_NAMES2["INPUT"]="input";TAG_NAMES2["IFRAME"]="iframe";TAG_NAMES2["KEYGEN"]="keygen";TAG_NAMES2["LABEL"]="label";TAG_NAMES2["LI"]="li";TAG_NAMES2["LINK"]="link";TAG_NAMES2["LISTING"]="listing";TAG_NAMES2["MAIN"]="main";TAG_NAMES2["MALIGNMARK"]="malignmark";TAG_NAMES2["MARQUEE"]="marquee";TAG_NAMES2["MATH"]="math";TAG_NAMES2["MENU"]="menu";TAG_NAMES2["META"]="meta";TAG_NAMES2["MGLYPH"]="mglyph";TAG_NAMES2["MI"]="mi";TAG_NAMES2["MO"]="mo";TAG_NAMES2["MN"]="mn";TAG_NAMES2["MS"]="ms";TAG_NAMES2["MTEXT"]="mtext";TAG_NAMES2["NAV"]="nav";TAG_NAMES2["NOBR"]="nobr";TAG_NAMES2["NOFRAMES"]="noframes";TAG_NAMES2["NOEMBED"]="noembed";TAG_NAMES2["NOSCRIPT"]="noscript";TAG_NAMES2["OBJECT"]="object";TAG_NAMES2["OL"]="ol";TAG_NAMES2["OPTGROUP"]="optgroup";TAG_NAMES2["OPTION"]="option";TAG_NAMES2["P"]="p";TAG_NAMES2["PARAM"]="param";TAG_NAMES2["PLAINTEXT"]="plaintext";TAG_NAMES2["PRE"]="pre";TAG_NAMES2["RB"]="rb";TAG_NAMES2["RP"]="rp";TAG_NAMES2["RT"]="rt";TAG_NAMES2["RTC"]="rtc";TAG_NAMES2["RUBY"]="ruby";TAG_NAMES2["S"]="s";TAG_NAMES2["SCRIPT"]="script";TAG_NAMES2["SEARCH"]="search";TAG_NAMES2["SECTION"]="section";TAG_NAMES2["SELECT"]="select";TAG_NAMES2["SOURCE"]="source";TAG_NAMES2["SMALL"]="small";TAG_NAMES2["SPAN"]="span";TAG_NAMES2["STRIKE"]="strike";TAG_NAMES2["STRONG"]="strong";TAG_NAMES2["STYLE"]="style";TAG_NAMES2["SUB"]="sub";TAG_NAMES2["SUMMARY"]="summary";TAG_NAMES2["SUP"]="sup";TAG_NAMES2["TABLE"]="table";TAG_NAMES2["TBODY"]="tbody";TAG_NAMES2["TEMPLATE"]="template";TAG_NAMES2["TEXTAREA"]="textarea";TAG_NAMES2["TFOOT"]="tfoot";TAG_NAMES2["TD"]="td";TAG_NAMES2["TH"]="th";TAG_NAMES2["THEAD"]="thead";TAG_NAMES2["TITLE"]="title";TAG_NAMES2["TR"]="tr";TAG_NAMES2["TRACK"]="track";TAG_NAMES2["TT"]="tt";TAG_NAMES2["U"]="u";TAG_NAMES2["UL"]="ul";TAG_NAMES2["SVG"]="svg";TAG_NAMES2["VAR"]="var";TAG_NAMES2["WBR"]="wbr";TAG_NAMES2["XMP"]="xmp"})(TAG_NAMES||(TAG_NAMES={}));var TAG_ID;(function(TAG_ID2){TAG_ID2[TAG_ID2["UNKNOWN"]=0]="UNKNOWN";TAG_ID2[TAG_ID2["A"]=1]="A";TAG_ID2[TAG_ID2["ADDRESS"]=2]="ADDRESS";TAG_ID2[TAG_ID2["ANNOTATION_XML"]=3]="ANNOTATION_XML";TAG_ID2[TAG_ID2["APPLET"]=4]="APPLET";TAG_ID2[TAG_ID2["AREA"]=5]="AREA";TAG_ID2[TAG_ID2["ARTICLE"]=6]="ARTICLE";TAG_ID2[TAG_ID2["ASIDE"]=7]="ASIDE";TAG_ID2[TAG_ID2["B"]=8]="B";TAG_ID2[TAG_ID2["BASE"]=9]="BASE";TAG_ID2[TAG_ID2["BASEFONT"]=10]="BASEFONT";TAG_ID2[TAG_ID2["BGSOUND"]=11]="BGSOUND";TAG_ID2[TAG_ID2["BIG"]=12]="BIG";TAG_ID2[TAG_ID2["BLOCKQUOTE"]=13]="BLOCKQUOTE";TAG_ID2[TAG_ID2["BODY"]=14]="BODY";TAG_ID2[TAG_ID2["BR"]=15]="BR";TAG_ID2[TAG_ID2["BUTTON"]=16]="BUTTON";TAG_ID2[TAG_ID2["CAPTION"]=17]="CAPTION";TAG_ID2[TAG_ID2["CENTER"]=18]="CENTER";TAG_ID2[TAG_ID2["CODE"]=19]="CODE";TAG_ID2[TAG_ID2["COL"]=20]="COL";TAG_ID2[TAG_ID2["COLGROUP"]=21]="COLGROUP";TAG_ID2[TAG_ID2["DD"]=22]="DD";TAG_ID2[TAG_ID2["DESC"]=23]="DESC";TAG_ID2[TAG_ID2["DETAILS"]=24]="DETAILS";TAG_ID2[TAG_ID2["DIALOG"]=25]="DIALOG";TAG_ID2[TAG_ID2["DIR"]=26]="DIR";TAG_ID2[TAG_ID2["DIV"]=27]="DIV";TAG_ID2[TAG_ID2["DL"]=28]="DL";TAG_ID2[TAG_ID2["DT"]=29]="DT";TAG_ID2[TAG_ID2["EM"]=30]="EM";TAG_ID2[TAG_ID2["EMBED"]=31]="EMBED";TAG_ID2[TAG_ID2["FIELDSET"]=32]="FIELDSET";TAG_ID2[TAG_ID2["FIGCAPTION"]=33]="FIGCAPTION";TAG_ID2[TAG_ID2["FIGURE"]=34]="FIGURE";TAG_ID2[TAG_ID2["FONT"]=35]="FONT";TAG_ID2[TAG_ID2["FOOTER"]=36]="FOOTER";TAG_ID2[TAG_ID2["FOREIGN_OBJECT"]=37]="FOREIGN_OBJECT";TAG_ID2[TAG_ID2["FORM"]=38]="FORM";TAG_ID2[TAG_ID2["FRAME"]=39]="FRAME";TAG_ID2[TAG_ID2["FRAMESET"]=40]="FRAMESET";TAG_ID2[TAG_ID2["H1"]=41]="H1";TAG_ID2[TAG_ID2["H2"]=42]="H2";TAG_ID2[TAG_ID2["H3"]=43]="H3";TAG_ID2[TAG_ID2["H4"]=44]="H4";TAG_ID2[TAG_ID2["H5"]=45]="H5";TAG_ID2[TAG_ID2["H6"]=46]="H6";TAG_ID2[TAG_ID2["HEAD"]=47]="HEAD";TAG_ID2[TAG_ID2["HEADER"]=48]="HEADER";TAG_ID2[TAG_ID2["HGROUP"]=49]="HGROUP";TAG_ID2[TAG_ID2["HR"]=50]="HR";TAG_ID2[TAG_ID2["HTML"]=51]="HTML";TAG_ID2[TAG_ID2["I"]=52]="I";TAG_ID2[TAG_ID2["IMG"]=53]="IMG";TAG_ID2[TAG_ID2["IMAGE"]=54]="IMAGE";TAG_ID2[TAG_ID2["INPUT"]=55]="INPUT";TAG_ID2[TAG_ID2["IFRAME"]=56]="IFRAME";TAG_ID2[TAG_ID2["KEYGEN"]=57]="KEYGEN";TAG_ID2[TAG_ID2["LABEL"]=58]="LABEL";TAG_ID2[TAG_ID2["LI"]=59]="LI";TAG_ID2[TAG_ID2["LINK"]=60]="LINK";TAG_ID2[TAG_ID2["LISTING"]=61]="LISTING";TAG_ID2[TAG_ID2["MAIN"]=62]="MAIN";TAG_ID2[TAG_ID2["MALIGNMARK"]=63]="MALIGNMARK";TAG_ID2[TAG_ID2["MARQUEE"]=64]="MARQUEE";TAG_ID2[TAG_ID2["MATH"]=65]="MATH";TAG_ID2[TAG_ID2["MENU"]=66]="MENU";TAG_ID2[TAG_ID2["META"]=67]="META";TAG_ID2[TAG_ID2["MGLYPH"]=68]="MGLYPH";TAG_ID2[TAG_ID2["MI"]=69]="MI";TAG_ID2[TAG_ID2["MO"]=70]="MO";TAG_ID2[TAG_ID2["MN"]=71]="MN";TAG_ID2[TAG_ID2["MS"]=72]="MS";TAG_ID2[TAG_ID2["MTEXT"]=73]="MTEXT";TAG_ID2[TAG_ID2["NAV"]=74]="NAV";TAG_ID2[TAG_ID2["NOBR"]=75]="NOBR";TAG_ID2[TAG_ID2["NOFRAMES"]=76]="NOFRAMES";TAG_ID2[TAG_ID2["NOEMBED"]=77]="NOEMBED";TAG_ID2[TAG_ID2["NOSCRIPT"]=78]="NOSCRIPT";TAG_ID2[TAG_ID2["OBJECT"]=79]="OBJECT";TAG_ID2[TAG_ID2["OL"]=80]="OL";TAG_ID2[TAG_ID2["OPTGROUP"]=81]="OPTGROUP";TAG_ID2[TAG_ID2["OPTION"]=82]="OPTION";TAG_ID2[TAG_ID2["P"]=83]="P";TAG_ID2[TAG_ID2["PARAM"]=84]="PARAM";TAG_ID2[TAG_ID2["PLAINTEXT"]=85]="PLAINTEXT";TAG_ID2[TAG_ID2["PRE"]=86]="PRE";TAG_ID2[TAG_ID2["RB"]=87]="RB";TAG_ID2[TAG_ID2["RP"]=88]="RP";TAG_ID2[TAG_ID2["RT"]=89]="RT";TAG_ID2[TAG_ID2["RTC"]=90]="RTC";TAG_ID2[TAG_ID2["RUBY"]=91]="RUBY";TAG_ID2[TAG_ID2["S"]=92]="S";TAG_ID2[TAG_ID2["SCRIPT"]=93]="SCRIPT";TAG_ID2[TAG_ID2["SEARCH"]=94]="SEARCH";TAG_ID2[TAG_ID2["SECTION"]=95]="SECTION";TAG_ID2[TAG_ID2["SELECT"]=96]="SELECT";TAG_ID2[TAG_ID2["SOURCE"]=97]="SOURCE";TAG_ID2[TAG_ID2["SMALL"]=98]="SMALL";TAG_ID2[TAG_ID2["SPAN"]=99]="SPAN";TAG_ID2[TAG_ID2["STRIKE"]=100]="STRIKE";TAG_ID2[TAG_ID2["STRONG"]=101]="STRONG";TAG_ID2[TAG_ID2["STYLE"]=102]="STYLE";TAG_ID2[TAG_ID2["SUB"]=103]="SUB";TAG_ID2[TAG_ID2["SUMMARY"]=104]="SUMMARY";TAG_ID2[TAG_ID2["SUP"]=105]="SUP";TAG_ID2[TAG_ID2["TABLE"]=106]="TABLE";TAG_ID2[TAG_ID2["TBODY"]=107]="TBODY";TAG_ID2[TAG_ID2["TEMPLATE"]=108]="TEMPLATE";TAG_ID2[TAG_ID2["TEXTAREA"]=109]="TEXTAREA";TAG_ID2[TAG_ID2["TFOOT"]=110]="TFOOT";TAG_ID2[TAG_ID2["TD"]=111]="TD";TAG_ID2[TAG_ID2["TH"]=112]="TH";TAG_ID2[TAG_ID2["THEAD"]=113]="THEAD";TAG_ID2[TAG_ID2["TITLE"]=114]="TITLE";TAG_ID2[TAG_ID2["TR"]=115]="TR";TAG_ID2[TAG_ID2["TRACK"]=116]="TRACK";TAG_ID2[TAG_ID2["TT"]=117]="TT";TAG_ID2[TAG_ID2["U"]=118]="U";TAG_ID2[TAG_ID2["UL"]=119]="UL";TAG_ID2[TAG_ID2["SVG"]=120]="SVG";TAG_ID2[TAG_ID2["VAR"]=121]="VAR";TAG_ID2[TAG_ID2["WBR"]=122]="WBR";TAG_ID2[TAG_ID2["XMP"]=123]="XMP"})(TAG_ID||(TAG_ID={}));var TAG_NAME_TO_ID=new Map([[TAG_NAMES.A,TAG_ID.A],[TAG_NAMES.ADDRESS,TAG_ID.ADDRESS],[TAG_NAMES.ANNOTATION_XML,TAG_ID.ANNOTATION_XML],[TAG_NAMES.APPLET,TAG_ID.APPLET],[TAG_NAMES.AREA,TAG_ID.AREA],[TAG_NAMES.ARTICLE,TAG_ID.ARTICLE],[TAG_NAMES.ASIDE,TAG_ID.ASIDE],[TAG_NAMES.B,TAG_ID.B],[TAG_NAMES.BASE,TAG_ID.BASE],[TAG_NAMES.BASEFONT,TAG_ID.BASEFONT],[TAG_NAMES.BGSOUND,TAG_ID.BGSOUND],[TAG_NAMES.BIG,TAG_ID.BIG],[TAG_NAMES.BLOCKQUOTE,TAG_ID.BLOCKQUOTE],[TAG_NAMES.BODY,TAG_ID.BODY],[TAG_NAMES.BR,TAG_ID.BR],[TAG_NAMES.BUTTON,TAG_ID.BUTTON],[TAG_NAMES.CAPTION,TAG_ID.CAPTION],[TAG_NAMES.CENTER,TAG_ID.CENTER],[TAG_NAMES.CODE,TAG_ID.CODE],[TAG_NAMES.COL,TAG_ID.COL],[TAG_NAMES.COLGROUP,TAG_ID.COLGROUP],[TAG_NAMES.DD,TAG_ID.DD],[TAG_NAMES.DESC,TAG_ID.DESC],[TAG_NAMES.DETAILS,TAG_ID.DETAILS],[TAG_NAMES.DIALOG,TAG_ID.DIALOG],[TAG_NAMES.DIR,TAG_ID.DIR],[TAG_NAMES.DIV,TAG_ID.DIV],[TAG_NAMES.DL,TAG_ID.DL],[TAG_NAMES.DT,TAG_ID.DT],[TAG_NAMES.EM,TAG_ID.EM],[TAG_NAMES.EMBED,TAG_ID.EMBED],[TAG_NAMES.FIELDSET,TAG_ID.FIELDSET],[TAG_NAMES.FIGCAPTION,TAG_ID.FIGCAPTION],[TAG_NAMES.FIGURE,TAG_ID.FIGURE],[TAG_NAMES.FONT,TAG_ID.FONT],[TAG_NAMES.FOOTER,TAG_ID.FOOTER],[TAG_NAMES.FOREIGN_OBJECT,TAG_ID.FOREIGN_OBJECT],[TAG_NAMES.FORM,TAG_ID.FORM],[TAG_NAMES.FRAME,TAG_ID.FRAME],[TAG_NAMES.FRAMESET,TAG_ID.FRAMESET],[TAG_NAMES.H1,TAG_ID.H1],[TAG_NAMES.H2,TAG_ID.H2],[TAG_NAMES.H3,TAG_ID.H3],[TAG_NAMES.H4,TAG_ID.H4],[TAG_NAMES.H5,TAG_ID.H5],[TAG_NAMES.H6,TAG_ID.H6],[TAG_NAMES.HEAD,TAG_ID.HEAD],[TAG_NAMES.HEADER,TAG_ID.HEADER],[TAG_NAMES.HGROUP,TAG_ID.HGROUP],[TAG_NAMES.HR,TAG_ID.HR],[TAG_NAMES.HTML,TAG_ID.HTML],[TAG_NAMES.I,TAG_ID.I],[TAG_NAMES.IMG,TAG_ID.IMG],[TAG_NAMES.IMAGE,TAG_ID.IMAGE],[TAG_NAMES.INPUT,TAG_ID.INPUT],[TAG_NAMES.IFRAME,TAG_ID.IFRAME],[TAG_NAMES.KEYGEN,TAG_ID.KEYGEN],[TAG_NAMES.LABEL,TAG_ID.LABEL],[TAG_NAMES.LI,TAG_ID.LI],[TAG_NAMES.LINK,TAG_ID.LINK],[TAG_NAMES.LISTING,TAG_ID.LISTING],[TAG_NAMES.MAIN,TAG_ID.MAIN],[TAG_NAMES.MALIGNMARK,TAG_ID.MALIGNMARK],[TAG_NAMES.MARQUEE,TAG_ID.MARQUEE],[TAG_NAMES.MATH,TAG_ID.MATH],[TAG_NAMES.MENU,TAG_ID.MENU],[TAG_NAMES.META,TAG_ID.META],[TAG_NAMES.MGLYPH,TAG_ID.MGLYPH],[TAG_NAMES.MI,TAG_ID.MI],[TAG_NAMES.MO,TAG_ID.MO],[TAG_NAMES.MN,TAG_ID.MN],[TAG_NAMES.MS,TAG_ID.MS],[TAG_NAMES.MTEXT,TAG_ID.MTEXT],[TAG_NAMES.NAV,TAG_ID.NAV],[TAG_NAMES.NOBR,TAG_ID.NOBR],[TAG_NAMES.NOFRAMES,TAG_ID.NOFRAMES],[TAG_NAMES.NOEMBED,TAG_ID.NOEMBED],[TAG_NAMES.NOSCRIPT,TAG_ID.NOSCRIPT],[TAG_NAMES.OBJECT,TAG_ID.OBJECT],[TAG_NAMES.OL,TAG_ID.OL],[TAG_NAMES.OPTGROUP,TAG_ID.OPTGROUP],[TAG_NAMES.OPTION,TAG_ID.OPTION],[TAG_NAMES.P,TAG_ID.P],[TAG_NAMES.PARAM,TAG_ID.PARAM],[TAG_NAMES.PLAINTEXT,TAG_ID.PLAINTEXT],[TAG_NAMES.PRE,TAG_ID.PRE],[TAG_NAMES.RB,TAG_ID.RB],[TAG_NAMES.RP,TAG_ID.RP],[TAG_NAMES.RT,TAG_ID.RT],[TAG_NAMES.RTC,TAG_ID.RTC],[TAG_NAMES.RUBY,TAG_ID.RUBY],[TAG_NAMES.S,TAG_ID.S],[TAG_NAMES.SCRIPT,TAG_ID.SCRIPT],[TAG_NAMES.SEARCH,TAG_ID.SEARCH],[TAG_NAMES.SECTION,TAG_ID.SECTION],[TAG_NAMES.SELECT,TAG_ID.SELECT],[TAG_NAMES.SOURCE,TAG_ID.SOURCE],[TAG_NAMES.SMALL,TAG_ID.SMALL],[TAG_NAMES.SPAN,TAG_ID.SPAN],[TAG_NAMES.STRIKE,TAG_ID.STRIKE],[TAG_NAMES.STRONG,TAG_ID.STRONG],[TAG_NAMES.STYLE,TAG_ID.STYLE],[TAG_NAMES.SUB,TAG_ID.SUB],[TAG_NAMES.SUMMARY,TAG_ID.SUMMARY],[TAG_NAMES.SUP,TAG_ID.SUP],[TAG_NAMES.TABLE,TAG_ID.TABLE],[TAG_NAMES.TBODY,TAG_ID.TBODY],[TAG_NAMES.TEMPLATE,TAG_ID.TEMPLATE],[TAG_NAMES.TEXTAREA,TAG_ID.TEXTAREA],[TAG_NAMES.TFOOT,TAG_ID.TFOOT],[TAG_NAMES.TD,TAG_ID.TD],[TAG_NAMES.TH,TAG_ID.TH],[TAG_NAMES.THEAD,TAG_ID.THEAD],[TAG_NAMES.TITLE,TAG_ID.TITLE],[TAG_NAMES.TR,TAG_ID.TR],[TAG_NAMES.TRACK,TAG_ID.TRACK],[TAG_NAMES.TT,TAG_ID.TT],[TAG_NAMES.U,TAG_ID.U],[TAG_NAMES.UL,TAG_ID.UL],[TAG_NAMES.SVG,TAG_ID.SVG],[TAG_NAMES.VAR,TAG_ID.VAR],[TAG_NAMES.WBR,TAG_ID.WBR],[TAG_NAMES.XMP,TAG_ID.XMP]]);function getTagID(tagName){var _a;return(_a=TAG_NAME_TO_ID.get(tagName))!==null&&_a!==void 0?_a:TAG_ID.UNKNOWN}var $=TAG_ID;var SPECIAL_ELEMENTS={[NS.HTML]:new Set([$.ADDRESS,$.APPLET,$.AREA,$.ARTICLE,$.ASIDE,$.BASE,$.BASEFONT,$.BGSOUND,$.BLOCKQUOTE,$.BODY,$.BR,$.BUTTON,$.CAPTION,$.CENTER,$.COL,$.COLGROUP,$.DD,$.DETAILS,$.DIR,$.DIV,$.DL,$.DT,$.EMBED,$.FIELDSET,$.FIGCAPTION,$.FIGURE,$.FOOTER,$.FORM,$.FRAME,$.FRAMESET,$.H1,$.H2,$.H3,$.H4,$.H5,$.H6,$.HEAD,$.HEADER,$.HGROUP,$.HR,$.HTML,$.IFRAME,$.IMG,$.INPUT,$.LI,$.LINK,$.LISTING,$.MAIN,$.MARQUEE,$.MENU,$.META,$.NAV,$.NOEMBED,$.NOFRAMES,$.NOSCRIPT,$.OBJECT,$.OL,$.P,$.PARAM,$.PLAINTEXT,$.PRE,$.SCRIPT,$.SECTION,$.SELECT,$.SOURCE,$.STYLE,$.SUMMARY,$.TABLE,$.TBODY,$.TD,$.TEMPLATE,$.TEXTAREA,$.TFOOT,$.TH,$.THEAD,$.TITLE,$.TR,$.TRACK,$.UL,$.WBR,$.XMP]),[NS.MATHML]:new Set([$.MI,$.MO,$.MN,$.MS,$.MTEXT,$.ANNOTATION_XML]),[NS.SVG]:new Set([$.TITLE,$.FOREIGN_OBJECT,$.DESC]),[NS.XLINK]:new Set,[NS.XML]:new Set,[NS.XMLNS]:new Set};var NUMBERED_HEADERS=new Set([$.H1,$.H2,$.H3,$.H4,$.H5,$.H6]);var UNESCAPED_TEXT=new Set([TAG_NAMES.STYLE,TAG_NAMES.SCRIPT,TAG_NAMES.XMP,TAG_NAMES.IFRAME,TAG_NAMES.NOEMBED,TAG_NAMES.NOFRAMES,TAG_NAMES.PLAINTEXT]);var State;(function(State2){State2[State2["DATA"]=0]="DATA";State2[State2["RCDATA"]=1]="RCDATA";State2[State2["RAWTEXT"]=2]="RAWTEXT";State2[State2["SCRIPT_DATA"]=3]="SCRIPT_DATA";State2[State2["PLAINTEXT"]=4]="PLAINTEXT";State2[State2["TAG_OPEN"]=5]="TAG_OPEN";State2[State2["END_TAG_OPEN"]=6]="END_TAG_OPEN";State2[State2["TAG_NAME"]=7]="TAG_NAME";State2[State2["RCDATA_LESS_THAN_SIGN"]=8]="RCDATA_LESS_THAN_SIGN";State2[State2["RCDATA_END_TAG_OPEN"]=9]="RCDATA_END_TAG_OPEN";State2[State2["RCDATA_END_TAG_NAME"]=10]="RCDATA_END_TAG_NAME";State2[State2["RAWTEXT_LESS_THAN_SIGN"]=11]="RAWTEXT_LESS_THAN_SIGN";State2[State2["RAWTEXT_END_TAG_OPEN"]=12]="RAWTEXT_END_TAG_OPEN";State2[State2["RAWTEXT_END_TAG_NAME"]=13]="RAWTEXT_END_TAG_NAME";State2[State2["SCRIPT_DATA_LESS_THAN_SIGN"]=14]="SCRIPT_DATA_LESS_THAN_SIGN";State2[State2["SCRIPT_DATA_END_TAG_OPEN"]=15]="SCRIPT_DATA_END_TAG_OPEN";State2[State2["SCRIPT_DATA_END_TAG_NAME"]=16]="SCRIPT_DATA_END_TAG_NAME";State2[State2["SCRIPT_DATA_ESCAPE_START"]=17]="SCRIPT_DATA_ESCAPE_START";State2[State2["SCRIPT_DATA_ESCAPE_START_DASH"]=18]="SCRIPT_DATA_ESCAPE_START_DASH";State2[State2["SCRIPT_DATA_ESCAPED"]=19]="SCRIPT_DATA_ESCAPED";State2[State2["SCRIPT_DATA_ESCAPED_DASH"]=20]="SCRIPT_DATA_ESCAPED_DASH";State2[State2["SCRIPT_DATA_ESCAPED_DASH_DASH"]=21]="SCRIPT_DATA_ESCAPED_DASH_DASH";State2[State2["SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN"]=22]="SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN";State2[State2["SCRIPT_DATA_ESCAPED_END_TAG_OPEN"]=23]="SCRIPT_DATA_ESCAPED_END_TAG_OPEN";State2[State2["SCRIPT_DATA_ESCAPED_END_TAG_NAME"]=24]="SCRIPT_DATA_ESCAPED_END_TAG_NAME";State2[State2["SCRIPT_DATA_DOUBLE_ESCAPE_START"]=25]="SCRIPT_DATA_DOUBLE_ESCAPE_START";State2[State2["SCRIPT_DATA_DOUBLE_ESCAPED"]=26]="SCRIPT_DATA_DOUBLE_ESCAPED";State2[State2["SCRIPT_DATA_DOUBLE_ESCAPED_DASH"]=27]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH";State2[State2["SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH"]=28]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH";State2[State2["SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN"]=29]="SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN";State2[State2["SCRIPT_DATA_DOUBLE_ESCAPE_END"]=30]="SCRIPT_DATA_DOUBLE_ESCAPE_END";State2[State2["BEFORE_ATTRIBUTE_NAME"]=31]="BEFORE_ATTRIBUTE_NAME";State2[State2["ATTRIBUTE_NAME"]=32]="ATTRIBUTE_NAME";State2[State2["AFTER_ATTRIBUTE_NAME"]=33]="AFTER_ATTRIBUTE_NAME";State2[State2["BEFORE_ATTRIBUTE_VALUE"]=34]="BEFORE_ATTRIBUTE_VALUE";State2[State2["ATTRIBUTE_VALUE_DOUBLE_QUOTED"]=35]="ATTRIBUTE_VALUE_DOUBLE_QUOTED";State2[State2["ATTRIBUTE_VALUE_SINGLE_QUOTED"]=36]="ATTRIBUTE_VALUE_SINGLE_QUOTED";State2[State2["ATTRIBUTE_VALUE_UNQUOTED"]=37]="ATTRIBUTE_VALUE_UNQUOTED";State2[State2["AFTER_ATTRIBUTE_VALUE_QUOTED"]=38]="AFTER_ATTRIBUTE_VALUE_QUOTED";State2[State2["SELF_CLOSING_START_TAG"]=39]="SELF_CLOSING_START_TAG";State2[State2["BOGUS_COMMENT"]=40]="BOGUS_COMMENT";State2[State2["MARKUP_DECLARATION_OPEN"]=41]="MARKUP_DECLARATION_OPEN";State2[State2["COMMENT_START"]=42]="COMMENT_START";State2[State2["COMMENT_START_DASH"]=43]="COMMENT_START_DASH";State2[State2["COMMENT"]=44]="COMMENT";State2[State2["COMMENT_LESS_THAN_SIGN"]=45]="COMMENT_LESS_THAN_SIGN";State2[State2["COMMENT_LESS_THAN_SIGN_BANG"]=46]="COMMENT_LESS_THAN_SIGN_BANG";State2[State2["COMMENT_LESS_THAN_SIGN_BANG_DASH"]=47]="COMMENT_LESS_THAN_SIGN_BANG_DASH";State2[State2["COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH"]=48]="COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH";State2[State2["COMMENT_END_DASH"]=49]="COMMENT_END_DASH";State2[State2["COMMENT_END"]=50]="COMMENT_END";State2[State2["COMMENT_END_BANG"]=51]="COMMENT_END_BANG";State2[State2["DOCTYPE"]=52]="DOCTYPE";State2[State2["BEFORE_DOCTYPE_NAME"]=53]="BEFORE_DOCTYPE_NAME";State2[State2["DOCTYPE_NAME"]=54]="DOCTYPE_NAME";State2[State2["AFTER_DOCTYPE_NAME"]=55]="AFTER_DOCTYPE_NAME";State2[State2["AFTER_DOCTYPE_PUBLIC_KEYWORD"]=56]="AFTER_DOCTYPE_PUBLIC_KEYWORD";State2[State2["BEFORE_DOCTYPE_PUBLIC_IDENTIFIER"]=57]="BEFORE_DOCTYPE_PUBLIC_IDENTIFIER";State2[State2["DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED"]=58]="DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED";State2[State2["DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED"]=59]="DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED";State2[State2["AFTER_DOCTYPE_PUBLIC_IDENTIFIER"]=60]="AFTER_DOCTYPE_PUBLIC_IDENTIFIER";State2[State2["BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS"]=61]="BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS";State2[State2["AFTER_DOCTYPE_SYSTEM_KEYWORD"]=62]="AFTER_DOCTYPE_SYSTEM_KEYWORD";State2[State2["BEFORE_DOCTYPE_SYSTEM_IDENTIFIER"]=63]="BEFORE_DOCTYPE_SYSTEM_IDENTIFIER";State2[State2["DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED"]=64]="DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED";State2[State2["DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED"]=65]="DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED";State2[State2["AFTER_DOCTYPE_SYSTEM_IDENTIFIER"]=66]="AFTER_DOCTYPE_SYSTEM_IDENTIFIER";State2[State2["BOGUS_DOCTYPE"]=67]="BOGUS_DOCTYPE";State2[State2["CDATA_SECTION"]=68]="CDATA_SECTION";State2[State2["CDATA_SECTION_BRACKET"]=69]="CDATA_SECTION_BRACKET";State2[State2["CDATA_SECTION_END"]=70]="CDATA_SECTION_END";State2[State2["CHARACTER_REFERENCE"]=71]="CHARACTER_REFERENCE";State2[State2["AMBIGUOUS_AMPERSAND"]=72]="AMBIGUOUS_AMPERSAND"})(State||(State={}));var TokenizerMode={DATA:State.DATA,RCDATA:State.RCDATA,RAWTEXT:State.RAWTEXT,SCRIPT_DATA:State.SCRIPT_DATA,PLAINTEXT:State.PLAINTEXT,CDATA_SECTION:State.CDATA_SECTION};function isAsciiDigit(cp){return cp>=CODE_POINTS.DIGIT_0&&cp<=CODE_POINTS.DIGIT_9}function isAsciiUpper(cp){return cp>=CODE_POINTS.LATIN_CAPITAL_A&&cp<=CODE_POINTS.LATIN_CAPITAL_Z}function isAsciiLower(cp){return cp>=CODE_POINTS.LATIN_SMALL_A&&cp<=CODE_POINTS.LATIN_SMALL_Z}function isAsciiLetter(cp){return isAsciiLower(cp)||isAsciiUpper(cp)}function isAsciiAlphaNumeric2(cp){return isAsciiLetter(cp)||isAsciiDigit(cp)}function toAsciiLower(cp){return cp+32}function isWhitespace(cp){return cp===CODE_POINTS.SPACE||cp===CODE_POINTS.LINE_FEED||cp===CODE_POINTS.TABULATION||cp===CODE_POINTS.FORM_FEED}function isScriptDataDoubleEscapeSequenceEnd(cp){return isWhitespace(cp)||cp===CODE_POINTS.SOLIDUS||cp===CODE_POINTS.GREATER_THAN_SIGN}function getErrorForNumericCharacterReference(code){if(code===CODE_POINTS.NULL){return ERR.nullCharacterReference}else if(code>1114111){return ERR.characterReferenceOutsideUnicodeRange}else if(isSurrogate(code)){return ERR.surrogateCharacterReference}else if(isUndefinedCodePoint(code)){return ERR.noncharacterCharacterReference}else if(isControlCodePoint(code)||code===CODE_POINTS.CARRIAGE_RETURN){return ERR.controlCharacterReference}return null}var Tokenizer=class{constructor(options,handler){this.options=options;this.handler=handler;this.paused=false;this.inLoop=false;this.inForeignNode=false;this.lastStartTagName="";this.active=false;this.state=State.DATA;this.returnState=State.DATA;this.entityStartPos=0;this.consumedAfterSnapshot=-1;this.currentCharacterToken=null;this.currentToken=null;this.currentAttr={name:"",value:""};this.preprocessor=new Preprocessor(handler);this.currentLocation=this.getCurrentLocation(-1);this.entityDecoder=new EntityDecoder2(htmlDecodeTree,(cp,consumed)=>{this.preprocessor.pos=this.entityStartPos+consumed-1;this._flushCodePointConsumedAsCharacterReference(cp)},handler.onParseError?{missingSemicolonAfterCharacterReference:()=>{this._err(ERR.missingSemicolonAfterCharacterReference,1)},absenceOfDigitsInNumericCharacterReference:consumed=>{this._err(ERR.absenceOfDigitsInNumericCharacterReference,this.entityStartPos-this.preprocessor.pos+consumed)},validateNumericCharacterReference:code=>{const error=getErrorForNumericCharacterReference(code);if(error)this._err(error,1)}}:void 0)}_err(code,cpOffset=0){var _a,_b;(_b=(_a=this.handler).onParseError)===null||_b===void 0?void 0:_b.call(_a,this.preprocessor.getError(code,cpOffset))}getCurrentLocation(offset){if(!this.options.sourceCodeLocationInfo){return null}return{startLine:this.preprocessor.line,startCol:this.preprocessor.col-offset,startOffset:this.preprocessor.offset-offset,endLine:-1,endCol:-1,endOffset:-1}}_runParsingLoop(){if(this.inLoop)return;this.inLoop=true;while(this.active&&!this.paused){this.consumedAfterSnapshot=0;const cp=this._consume();if(!this._ensureHibernation()){this._callState(cp)}}this.inLoop=false}pause(){this.paused=true}resume(writeCallback){if(!this.paused){throw new Error("Parser was already resumed")}this.paused=false;if(this.inLoop)return;this._runParsingLoop();if(!this.paused){writeCallback===null||writeCallback===void 0?void 0:writeCallback()}}write(chunk,isLastChunk,writeCallback){this.active=true;this.preprocessor.write(chunk,isLastChunk);this._runParsingLoop();if(!this.paused){writeCallback===null||writeCallback===void 0?void 0:writeCallback()}}insertHtmlAtCurrentPos(chunk){this.active=true;this.preprocessor.insertHtmlAtCurrentPos(chunk);this._runParsingLoop()}_ensureHibernation(){if(this.preprocessor.endOfChunkHit){this.preprocessor.retreat(this.consumedAfterSnapshot);this.consumedAfterSnapshot=0;this.active=false;return true}return false}_consume(){this.consumedAfterSnapshot++;return this.preprocessor.advance()}_advanceBy(count){this.consumedAfterSnapshot+=count;for(let i=0;i<count;i++){this.preprocessor.advance()}}_consumeSequenceIfMatch(pattern,caseSensitive){if(this.preprocessor.startsWith(pattern,caseSensitive)){this._advanceBy(pattern.length-1);return true}return false}_createStartTagToken(){this.currentToken={type:TokenType.START_TAG,tagName:"",tagID:TAG_ID.UNKNOWN,selfClosing:false,ackSelfClosing:false,attrs:[],location:this.getCurrentLocation(1)}}_createEndTagToken(){this.currentToken={type:TokenType.END_TAG,tagName:"",tagID:TAG_ID.UNKNOWN,selfClosing:false,ackSelfClosing:false,attrs:[],location:this.getCurrentLocation(2)}}_createCommentToken(offset){this.currentToken={type:TokenType.COMMENT,data:"",location:this.getCurrentLocation(offset)}}_createDoctypeToken(initialName){this.currentToken={type:TokenType.DOCTYPE,name:initialName,forceQuirks:false,publicId:null,systemId:null,location:this.currentLocation}}_createCharacterToken(type,chars){this.currentCharacterToken={type,chars,location:this.currentLocation}}_createAttr(attrNameFirstCh){this.currentAttr={name:attrNameFirstCh,value:""};this.currentLocation=this.getCurrentLocation(0)}_leaveAttrName(){var _a;var _b;const token=this.currentToken;if(getTokenAttr(token,this.currentAttr.name)===null){token.attrs.push(this.currentAttr);if(token.location&&this.currentLocation){const attrLocations=(_a=(_b=token.location).attrs)!==null&&_a!==void 0?_a:_b.attrs=Object.create(null);attrLocations[this.currentAttr.name]=this.currentLocation;this._leaveAttrValue()}}else{this._err(ERR.duplicateAttribute)}}_leaveAttrValue(){if(this.currentLocation){this.currentLocation.endLine=this.preprocessor.line;this.currentLocation.endCol=this.preprocessor.col;this.currentLocation.endOffset=this.preprocessor.offset}}prepareToken(ct){this._emitCurrentCharacterToken(ct.location);this.currentToken=null;if(ct.location){ct.location.endLine=this.preprocessor.line;ct.location.endCol=this.preprocessor.col+1;ct.location.endOffset=this.preprocessor.offset+1}this.currentLocation=this.getCurrentLocation(-1)}emitCurrentTagToken(){const ct=this.currentToken;this.prepareToken(ct);ct.tagID=getTagID(ct.tagName);if(ct.type===TokenType.START_TAG){this.lastStartTagName=ct.tagName;this.handler.onStartTag(ct)}else{if(ct.attrs.length>0){this._err(ERR.endTagWithAttributes)}if(ct.selfClosing){this._err(ERR.endTagWithTrailingSolidus)}this.handler.onEndTag(ct)}this.preprocessor.dropParsedChunk()}emitCurrentComment(ct){this.prepareToken(ct);this.handler.onComment(ct);this.preprocessor.dropParsedChunk()}emitCurrentDoctype(ct){this.prepareToken(ct);this.handler.onDoctype(ct);this.preprocessor.dropParsedChunk()}_emitCurrentCharacterToken(nextLocation){if(this.currentCharacterToken){if(nextLocation&&this.currentCharacterToken.location){this.currentCharacterToken.location.endLine=nextLocation.startLine;this.currentCharacterToken.location.endCol=nextLocation.startCol;this.currentCharacterToken.location.endOffset=nextLocation.startOffset}switch(this.currentCharacterToken.type){case TokenType.CHARACTER:{this.handler.onCharacter(this.currentCharacterToken);break}case TokenType.NULL_CHARACTER:{this.handler.onNullCharacter(this.currentCharacterToken);break}case TokenType.WHITESPACE_CHARACTER:{this.handler.onWhitespaceCharacter(this.currentCharacterToken);break}}this.currentCharacterToken=null}}_emitEOFToken(){const location=this.getCurrentLocation(0);if(location){location.endLine=location.startLine;location.endCol=location.startCol;location.endOffset=location.startOffset}this._emitCurrentCharacterToken(location);this.handler.onEof({type:TokenType.EOF,location});this.active=false}_appendCharToCurrentCharacterToken(type,ch){if(this.currentCharacterToken){if(this.currentCharacterToken.type===type){this.currentCharacterToken.chars+=ch;return}else{this.currentLocation=this.getCurrentLocation(0);this._emitCurrentCharacterToken(this.currentLocation);this.preprocessor.dropParsedChunk()}}this._createCharacterToken(type,ch)}_emitCodePoint(cp){const type=isWhitespace(cp)?TokenType.WHITESPACE_CHARACTER:cp===CODE_POINTS.NULL?TokenType.NULL_CHARACTER:TokenType.CHARACTER;this._appendCharToCurrentCharacterToken(type,cp<65536?String.fromCharCode(cp):String.fromCodePoint(cp))}_emitChars(ch){this._appendCharToCurrentCharacterToken(TokenType.CHARACTER,ch)}_startCharacterReference(){this.returnState=this.state;this.state=State.CHARACTER_REFERENCE;this.entityStartPos=this.preprocessor.pos;this.entityDecoder.startEntity(this._isCharacterReferenceInAttribute()?DecodingMode.Attribute:DecodingMode.Legacy)}_isCharacterReferenceInAttribute(){return this.returnState===State.ATTRIBUTE_VALUE_DOUBLE_QUOTED||this.returnState===State.ATTRIBUTE_VALUE_SINGLE_QUOTED||this.returnState===State.ATTRIBUTE_VALUE_UNQUOTED}_flushCodePointConsumedAsCharacterReference(cp){if(this._isCharacterReferenceInAttribute()){this.currentAttr.value+=String.fromCodePoint(cp)}else{this._emitCodePoint(cp)}}_callState(cp){switch(this.state){case State.DATA:{this._stateData(cp);break}case State.RCDATA:{this._stateRcdata(cp);break}case State.RAWTEXT:{this._stateRawtext(cp);break}case State.SCRIPT_DATA:{this._stateScriptData(cp);break}case State.PLAINTEXT:{this._statePlaintext(cp);break}case State.TAG_OPEN:{this._stateTagOpen(cp);break}case State.END_TAG_OPEN:{this._stateEndTagOpen(cp);break}case State.TAG_NAME:{this._stateTagName(cp);break}case State.RCDATA_LESS_THAN_SIGN:{this._stateRcdataLessThanSign(cp);break}case State.RCDATA_END_TAG_OPEN:{this._stateRcdataEndTagOpen(cp);break}case State.RCDATA_END_TAG_NAME:{this._stateRcdataEndTagName(cp);break}case State.RAWTEXT_LESS_THAN_SIGN:{this._stateRawtextLessThanSign(cp);break}case State.RAWTEXT_END_TAG_OPEN:{this._stateRawtextEndTagOpen(cp);break}case State.RAWTEXT_END_TAG_NAME:{this._stateRawtextEndTagName(cp);break}case State.SCRIPT_DATA_LESS_THAN_SIGN:{this._stateScriptDataLessThanSign(cp);break}case State.SCRIPT_DATA_END_TAG_OPEN:{this._stateScriptDataEndTagOpen(cp);break}case State.SCRIPT_DATA_END_TAG_NAME:{this._stateScriptDataEndTagName(cp);break}case State.SCRIPT_DATA_ESCAPE_START:{this._stateScriptDataEscapeStart(cp);break}case State.SCRIPT_DATA_ESCAPE_START_DASH:{this._stateScriptDataEscapeStartDash(cp);break}case State.SCRIPT_DATA_ESCAPED:{this._stateScriptDataEscaped(cp);break}case State.SCRIPT_DATA_ESCAPED_DASH:{this._stateScriptDataEscapedDash(cp);break}case State.SCRIPT_DATA_ESCAPED_DASH_DASH:{this._stateScriptDataEscapedDashDash(cp);break}case State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:{this._stateScriptDataEscapedLessThanSign(cp);break}case State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN:{this._stateScriptDataEscapedEndTagOpen(cp);break}case State.SCRIPT_DATA_ESCAPED_END_TAG_NAME:{this._stateScriptDataEscapedEndTagName(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPE_START:{this._stateScriptDataDoubleEscapeStart(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED:{this._stateScriptDataDoubleEscaped(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH:{this._stateScriptDataDoubleEscapedDash(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:{this._stateScriptDataDoubleEscapedDashDash(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:{this._stateScriptDataDoubleEscapedLessThanSign(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPE_END:{this._stateScriptDataDoubleEscapeEnd(cp);break}case State.BEFORE_ATTRIBUTE_NAME:{this._stateBeforeAttributeName(cp);break}case State.ATTRIBUTE_NAME:{this._stateAttributeName(cp);break}case State.AFTER_ATTRIBUTE_NAME:{this._stateAfterAttributeName(cp);break}case State.BEFORE_ATTRIBUTE_VALUE:{this._stateBeforeAttributeValue(cp);break}case State.ATTRIBUTE_VALUE_DOUBLE_QUOTED:{this._stateAttributeValueDoubleQuoted(cp);break}case State.ATTRIBUTE_VALUE_SINGLE_QUOTED:{this._stateAttributeValueSingleQuoted(cp);break}case State.ATTRIBUTE_VALUE_UNQUOTED:{this._stateAttributeValueUnquoted(cp);break}case State.AFTER_ATTRIBUTE_VALUE_QUOTED:{this._stateAfterAttributeValueQuoted(cp);break}case State.SELF_CLOSING_START_TAG:{this._stateSelfClosingStartTag(cp);break}case State.BOGUS_COMMENT:{this._stateBogusComment(cp);break}case State.MARKUP_DECLARATION_OPEN:{this._stateMarkupDeclarationOpen(cp);break}case State.COMMENT_START:{this._stateCommentStart(cp);break}case State.COMMENT_START_DASH:{this._stateCommentStartDash(cp);break}case State.COMMENT:{this._stateComment(cp);break}case State.COMMENT_LESS_THAN_SIGN:{this._stateCommentLessThanSign(cp);break}case State.COMMENT_LESS_THAN_SIGN_BANG:{this._stateCommentLessThanSignBang(cp);break}case State.COMMENT_LESS_THAN_SIGN_BANG_DASH:{this._stateCommentLessThanSignBangDash(cp);break}case State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH:{this._stateCommentLessThanSignBangDashDash(cp);break}case State.COMMENT_END_DASH:{this._stateCommentEndDash(cp);break}case State.COMMENT_END:{this._stateCommentEnd(cp);break}case State.COMMENT_END_BANG:{this._stateCommentEndBang(cp);break}case State.DOCTYPE:{this._stateDoctype(cp);break}case State.BEFORE_DOCTYPE_NAME:{this._stateBeforeDoctypeName(cp);break}case State.DOCTYPE_NAME:{this._stateDoctypeName(cp);break}case State.AFTER_DOCTYPE_NAME:{this._stateAfterDoctypeName(cp);break}case State.AFTER_DOCTYPE_PUBLIC_KEYWORD:{this._stateAfterDoctypePublicKeyword(cp);break}case State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:{this._stateBeforeDoctypePublicIdentifier(cp);break}case State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:{this._stateDoctypePublicIdentifierDoubleQuoted(cp);break}case State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:{this._stateDoctypePublicIdentifierSingleQuoted(cp);break}case State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER:{this._stateAfterDoctypePublicIdentifier(cp);break}case State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:{this._stateBetweenDoctypePublicAndSystemIdentifiers(cp);break}case State.AFTER_DOCTYPE_SYSTEM_KEYWORD:{this._stateAfterDoctypeSystemKeyword(cp);break}case State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:{this._stateBeforeDoctypeSystemIdentifier(cp);break}case State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:{this._stateDoctypeSystemIdentifierDoubleQuoted(cp);break}case State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:{this._stateDoctypeSystemIdentifierSingleQuoted(cp);break}case State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER:{this._stateAfterDoctypeSystemIdentifier(cp);break}case State.BOGUS_DOCTYPE:{this._stateBogusDoctype(cp);break}case State.CDATA_SECTION:{this._stateCdataSection(cp);break}case State.CDATA_SECTION_BRACKET:{this._stateCdataSectionBracket(cp);break}case State.CDATA_SECTION_END:{this._stateCdataSectionEnd(cp);break}case State.CHARACTER_REFERENCE:{this._stateCharacterReference();break}case State.AMBIGUOUS_AMPERSAND:{this._stateAmbiguousAmpersand(cp);break}default:{throw new Error("Unknown state")}}}_stateData(cp){switch(cp){case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.TAG_OPEN;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._emitCodePoint(cp);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_stateRcdata(cp){switch(cp){case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.RCDATA_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_stateRawtext(cp){switch(cp){case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.RAWTEXT_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_stateScriptData(cp){switch(cp){case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_statePlaintext(cp){switch(cp){case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_stateTagOpen(cp){if(isAsciiLetter(cp)){this._createStartTagToken();this.state=State.TAG_NAME;this._stateTagName(cp)}else switch(cp){case CODE_POINTS.EXCLAMATION_MARK:{this.state=State.MARKUP_DECLARATION_OPEN;break}case CODE_POINTS.SOLIDUS:{this.state=State.END_TAG_OPEN;break}case CODE_POINTS.QUESTION_MARK:{this._err(ERR.unexpectedQuestionMarkInsteadOfTagName);this._createCommentToken(1);this.state=State.BOGUS_COMMENT;this._stateBogusComment(cp);break}case CODE_POINTS.EOF:{this._err(ERR.eofBeforeTagName);this._emitChars("<");this._emitEOFToken();break}default:{this._err(ERR.invalidFirstCharacterOfTagName);this._emitChars("<");this.state=State.DATA;this._stateData(cp)}}}_stateEndTagOpen(cp){if(isAsciiLetter(cp)){this._createEndTagToken();this.state=State.TAG_NAME;this._stateTagName(cp)}else switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingEndTagName);this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofBeforeTagName);this._emitChars("</");this._emitEOFToken();break}default:{this._err(ERR.invalidFirstCharacterOfTagName);this._createCommentToken(2);this.state=State.BOGUS_COMMENT;this._stateBogusComment(cp)}}}_stateTagName(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_ATTRIBUTE_NAME;break}case CODE_POINTS.SOLIDUS:{this.state=State.SELF_CLOSING_START_TAG;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;this.emitCurrentTagToken();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.tagName+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag);this._emitEOFToken();break}default:{token.tagName+=String.fromCodePoint(isAsciiUpper(cp)?toAsciiLower(cp):cp)}}}_stateRcdataLessThanSign(cp){if(cp===CODE_POINTS.SOLIDUS){this.state=State.RCDATA_END_TAG_OPEN}else{this._emitChars("<");this.state=State.RCDATA;this._stateRcdata(cp)}}_stateRcdataEndTagOpen(cp){if(isAsciiLetter(cp)){this.state=State.RCDATA_END_TAG_NAME;this._stateRcdataEndTagName(cp)}else{this._emitChars("</");this.state=State.RCDATA;this._stateRcdata(cp)}}handleSpecialEndTag(_cp){if(!this.preprocessor.startsWith(this.lastStartTagName,false)){return!this._ensureHibernation()}this._createEndTagToken();const token=this.currentToken;token.tagName=this.lastStartTagName;const cp=this.preprocessor.peek(this.lastStartTagName.length);switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this._advanceBy(this.lastStartTagName.length);this.state=State.BEFORE_ATTRIBUTE_NAME;return false}case CODE_POINTS.SOLIDUS:{this._advanceBy(this.lastStartTagName.length);this.state=State.SELF_CLOSING_START_TAG;return false}case CODE_POINTS.GREATER_THAN_SIGN:{this._advanceBy(this.lastStartTagName.length);this.emitCurrentTagToken();this.state=State.DATA;return false}default:{return!this._ensureHibernation()}}}_stateRcdataEndTagName(cp){if(this.handleSpecialEndTag(cp)){this._emitChars("</");this.state=State.RCDATA;this._stateRcdata(cp)}}_stateRawtextLessThanSign(cp){if(cp===CODE_POINTS.SOLIDUS){this.state=State.RAWTEXT_END_TAG_OPEN}else{this._emitChars("<");this.state=State.RAWTEXT;this._stateRawtext(cp)}}_stateRawtextEndTagOpen(cp){if(isAsciiLetter(cp)){this.state=State.RAWTEXT_END_TAG_NAME;this._stateRawtextEndTagName(cp)}else{this._emitChars("</");this.state=State.RAWTEXT;this._stateRawtext(cp)}}_stateRawtextEndTagName(cp){if(this.handleSpecialEndTag(cp)){this._emitChars("</");this.state=State.RAWTEXT;this._stateRawtext(cp)}}_stateScriptDataLessThanSign(cp){switch(cp){case CODE_POINTS.SOLIDUS:{this.state=State.SCRIPT_DATA_END_TAG_OPEN;break}case CODE_POINTS.EXCLAMATION_MARK:{this.state=State.SCRIPT_DATA_ESCAPE_START;this._emitChars("<!");break}default:{this._emitChars("<");this.state=State.SCRIPT_DATA;this._stateScriptData(cp)}}}_stateScriptDataEndTagOpen(cp){if(isAsciiLetter(cp)){this.state=State.SCRIPT_DATA_END_TAG_NAME;this._stateScriptDataEndTagName(cp)}else{this._emitChars("</");this.state=State.SCRIPT_DATA;this._stateScriptData(cp)}}_stateScriptDataEndTagName(cp){if(this.handleSpecialEndTag(cp)){this._emitChars("</");this.state=State.SCRIPT_DATA;this._stateScriptData(cp)}}_stateScriptDataEscapeStart(cp){if(cp===CODE_POINTS.HYPHEN_MINUS){this.state=State.SCRIPT_DATA_ESCAPE_START_DASH;this._emitChars("-")}else{this.state=State.SCRIPT_DATA;this._stateScriptData(cp)}}_stateScriptDataEscapeStartDash(cp){if(cp===CODE_POINTS.HYPHEN_MINUS){this.state=State.SCRIPT_DATA_ESCAPED_DASH_DASH;this._emitChars("-")}else{this.state=State.SCRIPT_DATA;this._stateScriptData(cp)}}_stateScriptDataEscaped(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_ESCAPED_DASH;this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText);this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_stateScriptDataEscapedDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_ESCAPED_DASH_DASH;this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.state=State.SCRIPT_DATA_ESCAPED;this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText);this._emitEOFToken();break}default:{this.state=State.SCRIPT_DATA_ESCAPED;this._emitCodePoint(cp)}}}_stateScriptDataEscapedDashDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.SCRIPT_DATA;this._emitChars(">");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.state=State.SCRIPT_DATA_ESCAPED;this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText);this._emitEOFToken();break}default:{this.state=State.SCRIPT_DATA_ESCAPED;this._emitCodePoint(cp)}}}_stateScriptDataEscapedLessThanSign(cp){if(cp===CODE_POINTS.SOLIDUS){this.state=State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN}else if(isAsciiLetter(cp)){this._emitChars("<");this.state=State.SCRIPT_DATA_DOUBLE_ESCAPE_START;this._stateScriptDataDoubleEscapeStart(cp)}else{this._emitChars("<");this.state=State.SCRIPT_DATA_ESCAPED;this._stateScriptDataEscaped(cp)}}_stateScriptDataEscapedEndTagOpen(cp){if(isAsciiLetter(cp)){this.state=State.SCRIPT_DATA_ESCAPED_END_TAG_NAME;this._stateScriptDataEscapedEndTagName(cp)}else{this._emitChars("</");this.state=State.SCRIPT_DATA_ESCAPED;this._stateScriptDataEscaped(cp)}}_stateScriptDataEscapedEndTagName(cp){if(this.handleSpecialEndTag(cp)){this._emitChars("</");this.state=State.SCRIPT_DATA_ESCAPED;this._stateScriptDataEscaped(cp)}}_stateScriptDataDoubleEscapeStart(cp){if(this.preprocessor.startsWith(SEQUENCES.SCRIPT,false)&&isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(SEQUENCES.SCRIPT.length))){this._emitCodePoint(cp);for(let i=0;i<SEQUENCES.SCRIPT.length;i++){this._emitCodePoint(this._consume())}this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED}else if(!this._ensureHibernation()){this.state=State.SCRIPT_DATA_ESCAPED;this._stateScriptDataEscaped(cp)}}_stateScriptDataDoubleEscaped(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH;this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN;this._emitChars("<");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText);this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_stateScriptDataDoubleEscapedDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH;this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN;this._emitChars("<");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED;this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText);this._emitEOFToken();break}default:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED;this._emitCodePoint(cp)}}}_stateScriptDataDoubleEscapedDashDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN;this._emitChars("<");break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.SCRIPT_DATA;this._emitChars(">");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED;this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText);this._emitEOFToken();break}default:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED;this._emitCodePoint(cp)}}}_stateScriptDataDoubleEscapedLessThanSign(cp){if(cp===CODE_POINTS.SOLIDUS){this.state=State.SCRIPT_DATA_DOUBLE_ESCAPE_END;this._emitChars("/")}else{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED;this._stateScriptDataDoubleEscaped(cp)}}_stateScriptDataDoubleEscapeEnd(cp){if(this.preprocessor.startsWith(SEQUENCES.SCRIPT,false)&&isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(SEQUENCES.SCRIPT.length))){this._emitCodePoint(cp);for(let i=0;i<SEQUENCES.SCRIPT.length;i++){this._emitCodePoint(this._consume())}this.state=State.SCRIPT_DATA_ESCAPED}else if(!this._ensureHibernation()){this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED;this._stateScriptDataDoubleEscaped(cp)}}_stateBeforeAttributeName(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.SOLIDUS:case CODE_POINTS.GREATER_THAN_SIGN:case CODE_POINTS.EOF:{this.state=State.AFTER_ATTRIBUTE_NAME;this._stateAfterAttributeName(cp);break}case CODE_POINTS.EQUALS_SIGN:{this._err(ERR.unexpectedEqualsSignBeforeAttributeName);this._createAttr("=");this.state=State.ATTRIBUTE_NAME;break}default:{this._createAttr("");this.state=State.ATTRIBUTE_NAME;this._stateAttributeName(cp)}}}_stateAttributeName(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:case CODE_POINTS.SOLIDUS:case CODE_POINTS.GREATER_THAN_SIGN:case CODE_POINTS.EOF:{this._leaveAttrName();this.state=State.AFTER_ATTRIBUTE_NAME;this._stateAfterAttributeName(cp);break}case CODE_POINTS.EQUALS_SIGN:{this._leaveAttrName();this.state=State.BEFORE_ATTRIBUTE_VALUE;break}case CODE_POINTS.QUOTATION_MARK:case CODE_POINTS.APOSTROPHE:case CODE_POINTS.LESS_THAN_SIGN:{this._err(ERR.unexpectedCharacterInAttributeName);this.currentAttr.name+=String.fromCodePoint(cp);break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.currentAttr.name+=REPLACEMENT_CHARACTER;break}default:{this.currentAttr.name+=String.fromCodePoint(isAsciiUpper(cp)?toAsciiLower(cp):cp)}}}_stateAfterAttributeName(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.SOLIDUS:{this.state=State.SELF_CLOSING_START_TAG;break}case CODE_POINTS.EQUALS_SIGN:{this.state=State.BEFORE_ATTRIBUTE_VALUE;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;this.emitCurrentTagToken();break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag);this._emitEOFToken();break}default:{this._createAttr("");this.state=State.ATTRIBUTE_NAME;this._stateAttributeName(cp)}}}_stateBeforeAttributeValue(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.QUOTATION_MARK:{this.state=State.ATTRIBUTE_VALUE_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this.state=State.ATTRIBUTE_VALUE_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingAttributeValue);this.state=State.DATA;this.emitCurrentTagToken();break}default:{this.state=State.ATTRIBUTE_VALUE_UNQUOTED;this._stateAttributeValueUnquoted(cp)}}}_stateAttributeValueDoubleQuoted(cp){switch(cp){case CODE_POINTS.QUOTATION_MARK:{this.state=State.AFTER_ATTRIBUTE_VALUE_QUOTED;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.currentAttr.value+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag);this._emitEOFToken();break}default:{this.currentAttr.value+=String.fromCodePoint(cp)}}}_stateAttributeValueSingleQuoted(cp){switch(cp){case CODE_POINTS.APOSTROPHE:{this.state=State.AFTER_ATTRIBUTE_VALUE_QUOTED;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.currentAttr.value+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag);this._emitEOFToken();break}default:{this.currentAttr.value+=String.fromCodePoint(cp)}}}_stateAttributeValueUnquoted(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this._leaveAttrValue();this.state=State.BEFORE_ATTRIBUTE_NAME;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.GREATER_THAN_SIGN:{this._leaveAttrValue();this.state=State.DATA;this.emitCurrentTagToken();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this.currentAttr.value+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.QUOTATION_MARK:case CODE_POINTS.APOSTROPHE:case CODE_POINTS.LESS_THAN_SIGN:case CODE_POINTS.EQUALS_SIGN:case CODE_POINTS.GRAVE_ACCENT:{this._err(ERR.unexpectedCharacterInUnquotedAttributeValue);this.currentAttr.value+=String.fromCodePoint(cp);break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag);this._emitEOFToken();break}default:{this.currentAttr.value+=String.fromCodePoint(cp)}}}_stateAfterAttributeValueQuoted(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this._leaveAttrValue();this.state=State.BEFORE_ATTRIBUTE_NAME;break}case CODE_POINTS.SOLIDUS:{this._leaveAttrValue();this.state=State.SELF_CLOSING_START_TAG;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._leaveAttrValue();this.state=State.DATA;this.emitCurrentTagToken();break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag);this._emitEOFToken();break}default:{this._err(ERR.missingWhitespaceBetweenAttributes);this.state=State.BEFORE_ATTRIBUTE_NAME;this._stateBeforeAttributeName(cp)}}}_stateSelfClosingStartTag(cp){switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{const token=this.currentToken;token.selfClosing=true;this.state=State.DATA;this.emitCurrentTagToken();break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag);this._emitEOFToken();break}default:{this._err(ERR.unexpectedSolidusInTag);this.state=State.BEFORE_ATTRIBUTE_NAME;this._stateBeforeAttributeName(cp)}}}_stateBogusComment(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;this.emitCurrentComment(token);break}case CODE_POINTS.EOF:{this.emitCurrentComment(token);this._emitEOFToken();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.data+=REPLACEMENT_CHARACTER;break}default:{token.data+=String.fromCodePoint(cp)}}}_stateMarkupDeclarationOpen(cp){if(this._consumeSequenceIfMatch(SEQUENCES.DASH_DASH,true)){this._createCommentToken(SEQUENCES.DASH_DASH.length+1);this.state=State.COMMENT_START}else if(this._consumeSequenceIfMatch(SEQUENCES.DOCTYPE,false)){this.currentLocation=this.getCurrentLocation(SEQUENCES.DOCTYPE.length+1);this.state=State.DOCTYPE}else if(this._consumeSequenceIfMatch(SEQUENCES.CDATA_START,true)){if(this.inForeignNode){this.state=State.CDATA_SECTION}else{this._err(ERR.cdataInHtmlContent);this._createCommentToken(SEQUENCES.CDATA_START.length+1);this.currentToken.data="[CDATA[";this.state=State.BOGUS_COMMENT}}else if(!this._ensureHibernation()){this._err(ERR.incorrectlyOpenedComment);this._createCommentToken(2);this.state=State.BOGUS_COMMENT;this._stateBogusComment(cp)}}_stateCommentStart(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_START_DASH;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptClosingOfEmptyComment);this.state=State.DATA;const token=this.currentToken;this.emitCurrentComment(token);break}default:{this.state=State.COMMENT;this._stateComment(cp)}}}_stateCommentStartDash(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_END;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptClosingOfEmptyComment);this.state=State.DATA;this.emitCurrentComment(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment);this.emitCurrentComment(token);this._emitEOFToken();break}default:{token.data+="-";this.state=State.COMMENT;this._stateComment(cp)}}}_stateComment(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_END_DASH;break}case CODE_POINTS.LESS_THAN_SIGN:{token.data+="<";this.state=State.COMMENT_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.data+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment);this.emitCurrentComment(token);this._emitEOFToken();break}default:{token.data+=String.fromCodePoint(cp)}}}_stateCommentLessThanSign(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.EXCLAMATION_MARK:{token.data+="!";this.state=State.COMMENT_LESS_THAN_SIGN_BANG;break}case CODE_POINTS.LESS_THAN_SIGN:{token.data+="<";break}default:{this.state=State.COMMENT;this._stateComment(cp)}}}_stateCommentLessThanSignBang(cp){if(cp===CODE_POINTS.HYPHEN_MINUS){this.state=State.COMMENT_LESS_THAN_SIGN_BANG_DASH}else{this.state=State.COMMENT;this._stateComment(cp)}}_stateCommentLessThanSignBangDash(cp){if(cp===CODE_POINTS.HYPHEN_MINUS){this.state=State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH}else{this.state=State.COMMENT_END_DASH;this._stateCommentEndDash(cp)}}_stateCommentLessThanSignBangDashDash(cp){if(cp!==CODE_POINTS.GREATER_THAN_SIGN&&cp!==CODE_POINTS.EOF){this._err(ERR.nestedComment)}this.state=State.COMMENT_END;this._stateCommentEnd(cp)}_stateCommentEndDash(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_END;break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment);this.emitCurrentComment(token);this._emitEOFToken();break}default:{token.data+="-";this.state=State.COMMENT;this._stateComment(cp)}}}_stateCommentEnd(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;this.emitCurrentComment(token);break}case CODE_POINTS.EXCLAMATION_MARK:{this.state=State.COMMENT_END_BANG;break}case CODE_POINTS.HYPHEN_MINUS:{token.data+="-";break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment);this.emitCurrentComment(token);this._emitEOFToken();break}default:{token.data+="--";this.state=State.COMMENT;this._stateComment(cp)}}}_stateCommentEndBang(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{token.data+="--!";this.state=State.COMMENT_END_DASH;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.incorrectlyClosedComment);this.state=State.DATA;this.emitCurrentComment(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment);this.emitCurrentComment(token);this._emitEOFToken();break}default:{token.data+="--!";this.state=State.COMMENT;this._stateComment(cp)}}}_stateDoctype(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_DOCTYPE_NAME;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.BEFORE_DOCTYPE_NAME;this._stateBeforeDoctypeName(cp);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);this._createDoctypeToken(null);const token=this.currentToken;token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.missingWhitespaceBeforeDoctypeName);this.state=State.BEFORE_DOCTYPE_NAME;this._stateBeforeDoctypeName(cp)}}}_stateBeforeDoctypeName(cp){if(isAsciiUpper(cp)){this._createDoctypeToken(String.fromCharCode(toAsciiLower(cp)));this.state=State.DOCTYPE_NAME}else switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);this._createDoctypeToken(REPLACEMENT_CHARACTER);this.state=State.DOCTYPE_NAME;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypeName);this._createDoctypeToken(null);const token=this.currentToken;token.forceQuirks=true;this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);this._createDoctypeToken(null);const token=this.currentToken;token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._createDoctypeToken(String.fromCodePoint(cp));this.state=State.DOCTYPE_NAME}}}_stateDoctypeName(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.AFTER_DOCTYPE_NAME;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;this.emitCurrentDoctype(token);break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.name+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{token.name+=String.fromCodePoint(isAsciiUpper(cp)?toAsciiLower(cp):cp)}}}_stateAfterDoctypeName(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{if(this._consumeSequenceIfMatch(SEQUENCES.PUBLIC,false)){this.state=State.AFTER_DOCTYPE_PUBLIC_KEYWORD}else if(this._consumeSequenceIfMatch(SEQUENCES.SYSTEM,false)){this.state=State.AFTER_DOCTYPE_SYSTEM_KEYWORD}else if(!this._ensureHibernation()){this._err(ERR.invalidCharacterSequenceAfterDoctypeName);token.forceQuirks=true;this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}}_stateAfterDoctypePublicKeyword(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER;break}case CODE_POINTS.QUOTATION_MARK:{this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword);token.publicId="";this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword);token.publicId="";this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypePublicIdentifier);token.forceQuirks=true;this.state=State.DATA;this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier);token.forceQuirks=true;this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}_stateBeforeDoctypePublicIdentifier(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.QUOTATION_MARK:{token.publicId="";this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{token.publicId="";this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypePublicIdentifier);token.forceQuirks=true;this.state=State.DATA;this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier);token.forceQuirks=true;this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}_stateDoctypePublicIdentifierDoubleQuoted(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.QUOTATION_MARK:{this.state=State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.publicId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypePublicIdentifier);token.forceQuirks=true;this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{token.publicId+=String.fromCodePoint(cp)}}}_stateDoctypePublicIdentifierSingleQuoted(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.APOSTROPHE:{this.state=State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.publicId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypePublicIdentifier);token.forceQuirks=true;this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{token.publicId+=String.fromCodePoint(cp)}}}_stateAfterDoctypePublicIdentifier(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;this.emitCurrentDoctype(token);break}case CODE_POINTS.QUOTATION_MARK:{this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);token.forceQuirks=true;this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}_stateBetweenDoctypePublicAndSystemIdentifiers(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.GREATER_THAN_SIGN:{this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.QUOTATION_MARK:{token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);token.forceQuirks=true;this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}_stateAfterDoctypeSystemKeyword(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER;break}case CODE_POINTS.QUOTATION_MARK:{this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword);token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword);token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypeSystemIdentifier);token.forceQuirks=true;this.state=State.DATA;this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);token.forceQuirks=true;this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}_stateBeforeDoctypeSystemIdentifier(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.QUOTATION_MARK:{token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{token.systemId="";this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypeSystemIdentifier);token.forceQuirks=true;this.state=State.DATA;this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);token.forceQuirks=true;this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}_stateDoctypeSystemIdentifierDoubleQuoted(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.QUOTATION_MARK:{this.state=State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.systemId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypeSystemIdentifier);token.forceQuirks=true;this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{token.systemId+=String.fromCodePoint(cp)}}}_stateDoctypeSystemIdentifierSingleQuoted(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.APOSTROPHE:{this.state=State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);token.systemId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypeSystemIdentifier);token.forceQuirks=true;this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{token.systemId+=String.fromCodePoint(cp)}}}_stateAfterDoctypeSystemIdentifier(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{break}case CODE_POINTS.GREATER_THAN_SIGN:{this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype);token.forceQuirks=true;this.emitCurrentDoctype(token);this._emitEOFToken();break}default:{this._err(ERR.unexpectedCharacterAfterDoctypeSystemIdentifier);this.state=State.BOGUS_DOCTYPE;this._stateBogusDoctype(cp)}}}_stateBogusDoctype(cp){const token=this.currentToken;switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.emitCurrentDoctype(token);this.state=State.DATA;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);break}case CODE_POINTS.EOF:{this.emitCurrentDoctype(token);this._emitEOFToken();break}default:}}_stateCdataSection(cp){switch(cp){case CODE_POINTS.RIGHT_SQUARE_BRACKET:{this.state=State.CDATA_SECTION_BRACKET;break}case CODE_POINTS.EOF:{this._err(ERR.eofInCdata);this._emitEOFToken();break}default:{this._emitCodePoint(cp)}}}_stateCdataSectionBracket(cp){if(cp===CODE_POINTS.RIGHT_SQUARE_BRACKET){this.state=State.CDATA_SECTION_END}else{this._emitChars("]");this.state=State.CDATA_SECTION;this._stateCdataSection(cp)}}_stateCdataSectionEnd(cp){switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;break}case CODE_POINTS.RIGHT_SQUARE_BRACKET:{this._emitChars("]");break}default:{this._emitChars("]]");this.state=State.CDATA_SECTION;this._stateCdataSection(cp)}}}_stateCharacterReference(){let length=this.entityDecoder.write(this.preprocessor.html,this.preprocessor.pos);if(length<0){if(this.preprocessor.lastChunkWritten){length=this.entityDecoder.end()}else{this.active=false;this.preprocessor.pos=this.preprocessor.html.length-1;this.consumedAfterSnapshot=0;this.preprocessor.endOfChunkHit=true;return}}if(length===0){this.preprocessor.pos=this.entityStartPos;this._flushCodePointConsumedAsCharacterReference(CODE_POINTS.AMPERSAND);this.state=!this._isCharacterReferenceInAttribute()&&isAsciiAlphaNumeric2(this.preprocessor.peek(1))?State.AMBIGUOUS_AMPERSAND:this.returnState}else{this.state=this.returnState}}_stateAmbiguousAmpersand(cp){if(isAsciiAlphaNumeric2(cp)){this._flushCodePointConsumedAsCharacterReference(cp)}else{if(cp===CODE_POINTS.SEMICOLON){this._err(ERR.unknownNamedCharacterReference)}this.state=this.returnState;this._callState(cp)}}};var IMPLICIT_END_TAG_REQUIRED=new Set([TAG_ID.DD,TAG_ID.DT,TAG_ID.LI,TAG_ID.OPTGROUP,TAG_ID.OPTION,TAG_ID.P,TAG_ID.RB,TAG_ID.RP,TAG_ID.RT,TAG_ID.RTC]);var IMPLICIT_END_TAG_REQUIRED_THOROUGHLY=new Set([...IMPLICIT_END_TAG_REQUIRED,TAG_ID.CAPTION,TAG_ID.COLGROUP,TAG_ID.TBODY,TAG_ID.TD,TAG_ID.TFOOT,TAG_ID.TH,TAG_ID.THEAD,TAG_ID.TR]);var SCOPING_ELEMENTS_HTML=new Set([TAG_ID.APPLET,TAG_ID.CAPTION,TAG_ID.HTML,TAG_ID.MARQUEE,TAG_ID.OBJECT,TAG_ID.TABLE,TAG_ID.TD,TAG_ID.TEMPLATE,TAG_ID.TH]);var SCOPING_ELEMENTS_HTML_LIST=new Set([...SCOPING_ELEMENTS_HTML,TAG_ID.OL,TAG_ID.UL]);var SCOPING_ELEMENTS_HTML_BUTTON=new Set([...SCOPING_ELEMENTS_HTML,TAG_ID.BUTTON]);var SCOPING_ELEMENTS_MATHML=new Set([TAG_ID.ANNOTATION_XML,TAG_ID.MI,TAG_ID.MN,TAG_ID.MO,TAG_ID.MS,TAG_ID.MTEXT]);var SCOPING_ELEMENTS_SVG=new Set([TAG_ID.DESC,TAG_ID.FOREIGN_OBJECT,TAG_ID.TITLE]);var TABLE_ROW_CONTEXT=new Set([TAG_ID.TR,TAG_ID.TEMPLATE,TAG_ID.HTML]);var TABLE_BODY_CONTEXT=new Set([TAG_ID.TBODY,TAG_ID.TFOOT,TAG_ID.THEAD,TAG_ID.TEMPLATE,TAG_ID.HTML]);var TABLE_CONTEXT=new Set([TAG_ID.TABLE,TAG_ID.TEMPLATE,TAG_ID.HTML]);var TABLE_CELLS=new Set([TAG_ID.TD,TAG_ID.TH]);var OpenElementStack=class{get currentTmplContentOrNode(){return this._isInTemplate()?this.treeAdapter.getTemplateContent(this.current):this.current}constructor(document,treeAdapter,handler){this.treeAdapter=treeAdapter;this.handler=handler;this.items=[];this.tagIDs=[];this.stackTop=-1;this.tmplCount=0;this.currentTagId=TAG_ID.UNKNOWN;this.current=document}_indexOf(element){return this.items.lastIndexOf(element,this.stackTop)}_isInTemplate(){return this.currentTagId===TAG_ID.TEMPLATE&&this.treeAdapter.getNamespaceURI(this.current)===NS.HTML}_updateCurrentElement(){this.current=this.items[this.stackTop];this.currentTagId=this.tagIDs[this.stackTop]}push(element,tagID){this.stackTop++;this.items[this.stackTop]=element;this.current=element;this.tagIDs[this.stackTop]=tagID;this.currentTagId=tagID;if(this._isInTemplate()){this.tmplCount++}this.handler.onItemPush(element,tagID,true)}pop(){const popped=this.current;if(this.tmplCount>0&&this._isInTemplate()){this.tmplCount--}this.stackTop--;this._updateCurrentElement();this.handler.onItemPop(popped,true)}replace(oldElement,newElement){const idx=this._indexOf(oldElement);this.items[idx]=newElement;if(idx===this.stackTop){this.current=newElement}}insertAfter(referenceElement,newElement,newElementID){const insertionIdx=this._indexOf(referenceElement)+1;this.items.splice(insertionIdx,0,newElement);this.tagIDs.splice(insertionIdx,0,newElementID);this.stackTop++;if(insertionIdx===this.stackTop){this._updateCurrentElement()}if(this.current&&this.currentTagId!==void 0){this.handler.onItemPush(this.current,this.currentTagId,insertionIdx===this.stackTop)}}popUntilTagNamePopped(tagName){let targetIdx=this.stackTop+1;do{targetIdx=this.tagIDs.lastIndexOf(tagName,targetIdx-1)}while(targetIdx>0&&this.treeAdapter.getNamespaceURI(this.items[targetIdx])!==NS.HTML);this.shortenToLength(Math.max(targetIdx,0))}shortenToLength(idx){while(this.stackTop>=idx){const popped=this.current;if(this.tmplCount>0&&this._isInTemplate()){this.tmplCount-=1}this.stackTop--;this._updateCurrentElement();this.handler.onItemPop(popped,this.stackTop<idx)}}popUntilElementPopped(element){const idx=this._indexOf(element);this.shortenToLength(Math.max(idx,0))}popUntilPopped(tagNames,targetNS){const idx=this._indexOfTagNames(tagNames,targetNS);this.shortenToLength(Math.max(idx,0))}popUntilNumberedHeaderPopped(){this.popUntilPopped(NUMBERED_HEADERS,NS.HTML)}popUntilTableCellPopped(){this.popUntilPopped(TABLE_CELLS,NS.HTML)}popAllUpToHtmlElement(){this.tmplCount=0;this.shortenToLength(1)}_indexOfTagNames(tagNames,namespace){for(let i=this.stackTop;i>=0;i--){if(tagNames.has(this.tagIDs[i])&&this.treeAdapter.getNamespaceURI(this.items[i])===namespace){return i}}return-1}clearBackTo(tagNames,targetNS){const idx=this._indexOfTagNames(tagNames,targetNS);this.shortenToLength(idx+1)}clearBackToTableContext(){this.clearBackTo(TABLE_CONTEXT,NS.HTML)}clearBackToTableBodyContext(){this.clearBackTo(TABLE_BODY_CONTEXT,NS.HTML)}clearBackToTableRowContext(){this.clearBackTo(TABLE_ROW_CONTEXT,NS.HTML)}remove(element){const idx=this._indexOf(element);if(idx>=0){if(idx===this.stackTop){this.pop()}else{this.items.splice(idx,1);this.tagIDs.splice(idx,1);this.stackTop--;this._updateCurrentElement();this.handler.onItemPop(element,false)}}}tryPeekProperlyNestedBodyElement(){return this.stackTop>=1&&this.tagIDs[1]===TAG_ID.BODY?this.items[1]:null}contains(element){return this._indexOf(element)>-1}getCommonAncestor(element){const elementIdx=this._indexOf(element)-1;return elementIdx>=0?this.items[elementIdx]:null}isRootHtmlElementCurrent(){return this.stackTop===0&&this.tagIDs[0]===TAG_ID.HTML}hasInDynamicScope(tagName,htmlScope){for(let i=this.stackTop;i>=0;i--){const tn=this.tagIDs[i];switch(this.treeAdapter.getNamespaceURI(this.items[i])){case NS.HTML:{if(tn===tagName)return true;if(htmlScope.has(tn))return false;break}case NS.SVG:{if(SCOPING_ELEMENTS_SVG.has(tn))return false;break}case NS.MATHML:{if(SCOPING_ELEMENTS_MATHML.has(tn))return false;break}}}return true}hasInScope(tagName){return this.hasInDynamicScope(tagName,SCOPING_ELEMENTS_HTML)}hasInListItemScope(tagName){return this.hasInDynamicScope(tagName,SCOPING_ELEMENTS_HTML_LIST)}hasInButtonScope(tagName){return this.hasInDynamicScope(tagName,SCOPING_ELEMENTS_HTML_BUTTON)}hasNumberedHeaderInScope(){for(let i=this.stackTop;i>=0;i--){const tn=this.tagIDs[i];switch(this.treeAdapter.getNamespaceURI(this.items[i])){case NS.HTML:{if(NUMBERED_HEADERS.has(tn))return true;if(SCOPING_ELEMENTS_HTML.has(tn))return false;break}case NS.SVG:{if(SCOPING_ELEMENTS_SVG.has(tn))return false;break}case NS.MATHML:{if(SCOPING_ELEMENTS_MATHML.has(tn))return false;break}}}return true}hasInTableScope(tagName){for(let i=this.stackTop;i>=0;i--){if(this.treeAdapter.getNamespaceURI(this.items[i])!==NS.HTML){continue}switch(this.tagIDs[i]){case tagName:{return true}case TAG_ID.TABLE:case TAG_ID.HTML:{return false}}}return true}hasTableBodyContextInTableScope(){for(let i=this.stackTop;i>=0;i--){if(this.treeAdapter.getNamespaceURI(this.items[i])!==NS.HTML){continue}switch(this.tagIDs[i]){case TAG_ID.TBODY:case TAG_ID.THEAD:case TAG_ID.TFOOT:{return true}case TAG_ID.TABLE:case TAG_ID.HTML:{return false}}}return true}hasInSelectScope(tagName){for(let i=this.stackTop;i>=0;i--){if(this.treeAdapter.getNamespaceURI(this.items[i])!==NS.HTML){continue}switch(this.tagIDs[i]){case tagName:{return true}case TAG_ID.OPTION:case TAG_ID.OPTGROUP:{break}default:{return false}}}return true}generateImpliedEndTags(){while(this.currentTagId!==void 0&&IMPLICIT_END_TAG_REQUIRED.has(this.currentTagId)){this.pop()}}generateImpliedEndTagsThoroughly(){while(this.currentTagId!==void 0&&IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId)){this.pop()}}generateImpliedEndTagsWithExclusion(exclusionId){while(this.currentTagId!==void 0&&this.currentTagId!==exclusionId&&IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId)){this.pop()}}};var NOAH_ARK_CAPACITY=3;var EntryType;(function(EntryType2){EntryType2[EntryType2["Marker"]=0]="Marker";EntryType2[EntryType2["Element"]=1]="Element"})(EntryType||(EntryType={}));var MARKER={type:EntryType.Marker};var FormattingElementList=class{constructor(treeAdapter){this.treeAdapter=treeAdapter;this.entries=[];this.bookmark=null}_getNoahArkConditionCandidates(newElement,neAttrs){const candidates=[];const neAttrsLength=neAttrs.length;const neTagName=this.treeAdapter.getTagName(newElement);const neNamespaceURI=this.treeAdapter.getNamespaceURI(newElement);for(let i=0;i<this.entries.length;i++){const entry=this.entries[i];if(entry.type===EntryType.Marker){break}const{element}=entry;if(this.treeAdapter.getTagName(element)===neTagName&&this.treeAdapter.getNamespaceURI(element)===neNamespaceURI){const elementAttrs=this.treeAdapter.getAttrList(element);if(elementAttrs.length===neAttrsLength){candidates.push({idx:i,attrs:elementAttrs})}}}return candidates}_ensureNoahArkCondition(newElement){if(this.entries.length<NOAH_ARK_CAPACITY)return;const neAttrs=this.treeAdapter.getAttrList(newElement);const candidates=this._getNoahArkConditionCandidates(newElement,neAttrs);if(candidates.length<NOAH_ARK_CAPACITY)return;const neAttrsMap=new Map(neAttrs.map(neAttr=>[neAttr.name,neAttr.value]));let validCandidates=0;for(let i=0;i<candidates.length;i++){const candidate=candidates[i];if(candidate.attrs.every(cAttr=>neAttrsMap.get(cAttr.name)===cAttr.value)){validCandidates+=1;if(validCandidates>=NOAH_ARK_CAPACITY){this.entries.splice(candidate.idx,1)}}}}insertMarker(){this.entries.unshift(MARKER)}pushElement(element,token){this._ensureNoahArkCondition(element);this.entries.unshift({type:EntryType.Element,element,token})}insertElementAfterBookmark(element,token){const bookmarkIdx=this.entries.indexOf(this.bookmark);this.entries.splice(bookmarkIdx,0,{type:EntryType.Element,element,token})}removeEntry(entry){const entryIndex=this.entries.indexOf(entry);if(entryIndex!==-1){this.entries.splice(entryIndex,1)}}clearToLastMarker(){const markerIdx=this.entries.indexOf(MARKER);if(markerIdx===-1){this.entries.length=0}else{this.entries.splice(0,markerIdx+1)}}getElementEntryInScopeWithTagName(tagName){const entry=this.entries.find(entry2=>entry2.type===EntryType.Marker||this.treeAdapter.getTagName(entry2.element)===tagName);return entry&&entry.type===EntryType.Element?entry:null}getElementEntry(element){return this.entries.find(entry=>entry.type===EntryType.Element&&entry.element===element)}};var defaultTreeAdapter={createDocument(){return{nodeName:"#document",mode:DOCUMENT_MODE.NO_QUIRKS,childNodes:[]}},createDocumentFragment(){return{nodeName:"#document-fragment",childNodes:[]}},createElement(tagName,namespaceURI,attrs){return{nodeName:tagName,tagName,attrs,namespaceURI,childNodes:[],parentNode:null}},createCommentNode(data){return{nodeName:"#comment",data,parentNode:null}},createTextNode(value){return{nodeName:"#text",value,parentNode:null}},appendChild(parentNode,newNode){parentNode.childNodes.push(newNode);newNode.parentNode=parentNode},insertBefore(parentNode,newNode,referenceNode){const insertionIdx=parentNode.childNodes.indexOf(referenceNode);parentNode.childNodes.splice(insertionIdx,0,newNode);newNode.parentNode=parentNode},setTemplateContent(templateElement,contentElement){templateElement.content=contentElement},getTemplateContent(templateElement){return templateElement.content},setDocumentType(document,name,publicId,systemId){const doctypeNode=document.childNodes.find(node=>node.nodeName==="#documentType");if(doctypeNode){doctypeNode.name=name;doctypeNode.publicId=publicId;doctypeNode.systemId=systemId}else{const node={nodeName:"#documentType",name,publicId,systemId,parentNode:null};defaultTreeAdapter.appendChild(document,node)}},setDocumentMode(document,mode){document.mode=mode},getDocumentMode(document){return document.mode},detachNode(node){if(node.parentNode){const idx=node.parentNode.childNodes.indexOf(node);node.parentNode.childNodes.splice(idx,1);node.parentNode=null}},insertText(parentNode,text){if(parentNode.childNodes.length>0){const prevNode=parentNode.childNodes[parentNode.childNodes.length-1];if(defaultTreeAdapter.isTextNode(prevNode)){prevNode.value+=text;return}}defaultTreeAdapter.appendChild(parentNode,defaultTreeAdapter.createTextNode(text))},insertTextBefore(parentNode,text,referenceNode){const prevNode=parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode)-1];if(prevNode&&defaultTreeAdapter.isTextNode(prevNode)){prevNode.value+=text}else{defaultTreeAdapter.insertBefore(parentNode,defaultTreeAdapter.createTextNode(text),referenceNode)}},adoptAttributes(recipient,attrs){const recipientAttrsMap=new Set(recipient.attrs.map(attr=>attr.name));for(let j=0;j<attrs.length;j++){if(!recipientAttrsMap.has(attrs[j].name)){recipient.attrs.push(attrs[j])}}},getFirstChild(node){return node.childNodes[0]},getChildNodes(node){return node.childNodes},getParentNode(node){return node.parentNode},getAttrList(element){return element.attrs},getTagName(element){return element.tagName},getNamespaceURI(element){return element.namespaceURI},getTextNodeContent(textNode){return textNode.value},getCommentNodeContent(commentNode){return commentNode.data},getDocumentTypeNodeName(doctypeNode){return doctypeNode.name},getDocumentTypeNodePublicId(doctypeNode){return doctypeNode.publicId},getDocumentTypeNodeSystemId(doctypeNode){return doctypeNode.systemId},isTextNode(node){return node.nodeName==="#text"},isCommentNode(node){return node.nodeName==="#comment"},isDocumentTypeNode(node){return node.nodeName==="#documentType"},isElementNode(node){return Object.prototype.hasOwnProperty.call(node,"tagName")},setNodeSourceCodeLocation(node,location){node.sourceCodeLocation=location},getNodeSourceCodeLocation(node){return node.sourceCodeLocation},updateNodeSourceCodeLocation(node,endLocation){node.sourceCodeLocation={...node.sourceCodeLocation,...endLocation}}};var VALID_DOCTYPE_NAME="html";var VALID_SYSTEM_ID="about:legacy-compat";var QUIRKS_MODE_SYSTEM_ID="http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd";var QUIRKS_MODE_PUBLIC_ID_PREFIXES=["+//silmaril//dtd html pro v0r11 19970101//","-//as//dtd html 3.0 aswedit + extensions//","-//advasoft ltd//dtd html 3.0 aswedit + extensions//","-//ietf//dtd html 2.0 level 1//","-//ietf//dtd html 2.0 level 2//","-//ietf//dtd html 2.0 strict level 1//","-//ietf//dtd html 2.0 strict level 2//","-//ietf//dtd html 2.0 strict//","-//ietf//dtd html 2.0//","-//ietf//dtd html 2.1e//","-//ietf//dtd html 3.0//","-//ietf//dtd html 3.2 final//","-//ietf//dtd html 3.2//","-//ietf//dtd html 3//","-//ietf//dtd html level 0//","-//ietf//dtd html level 1//","-//ietf//dtd html level 2//","-//ietf//dtd html level 3//","-//ietf//dtd html strict level 0//","-//ietf//dtd html strict level 1//","-//ietf//dtd html strict level 2//","-//ietf//dtd html strict level 3//","-//ietf//dtd html strict//","-//ietf//dtd html//","-//metrius//dtd metrius presentational//","-//microsoft//dtd internet explorer 2.0 html strict//","-//microsoft//dtd internet explorer 2.0 html//","-//microsoft//dtd internet explorer 2.0 tables//","-//microsoft//dtd internet explorer 3.0 html strict//","-//microsoft//dtd internet explorer 3.0 html//","-//microsoft//dtd internet explorer 3.0 tables//","-//netscape comm. corp.//dtd html//","-//netscape comm. corp.//dtd strict html//","-//o'reilly and associates//dtd html 2.0//","-//o'reilly and associates//dtd html extended 1.0//","-//o'reilly and associates//dtd html extended relaxed 1.0//","-//sq//dtd html 2.0 hotmetal + extensions//","-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//","-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//","-//spyglass//dtd html 2.0 extended//","-//sun microsystems corp.//dtd hotjava html//","-//sun microsystems corp.//dtd hotjava strict html//","-//w3c//dtd html 3 1995-03-24//","-//w3c//dtd html 3.2 draft//","-//w3c//dtd html 3.2 final//","-//w3c//dtd html 3.2//","-//w3c//dtd html 3.2s draft//","-//w3c//dtd html 4.0 frameset//","-//w3c//dtd html 4.0 transitional//","-//w3c//dtd html experimental 19960712//","-//w3c//dtd html experimental 970421//","-//w3c//dtd w3 html//","-//w3o//dtd w3 html 3.0//","-//webtechs//dtd mozilla html 2.0//","-//webtechs//dtd mozilla html//"];var QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES=[...QUIRKS_MODE_PUBLIC_ID_PREFIXES,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"];var QUIRKS_MODE_PUBLIC_IDS=new Set(["-//w3o//dtd w3 html strict 3.0//en//","-/w3c/dtd html 4.0 transitional/en","html"]);var LIMITED_QUIRKS_PUBLIC_ID_PREFIXES=["-//w3c//dtd xhtml 1.0 frameset//","-//w3c//dtd xhtml 1.0 transitional//"];var LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES=[...LIMITED_QUIRKS_PUBLIC_ID_PREFIXES,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"];function hasPrefix(publicId,prefixes){return prefixes.some(prefix=>publicId.startsWith(prefix))}function isConforming(token){return token.name===VALID_DOCTYPE_NAME&&token.publicId===null&&(token.systemId===null||token.systemId===VALID_SYSTEM_ID)}function getDocumentMode(token){if(token.name!==VALID_DOCTYPE_NAME){return DOCUMENT_MODE.QUIRKS}const{systemId}=token;if(systemId&&systemId.toLowerCase()===QUIRKS_MODE_SYSTEM_ID){return DOCUMENT_MODE.QUIRKS}let{publicId}=token;if(publicId!==null){publicId=publicId.toLowerCase();if(QUIRKS_MODE_PUBLIC_IDS.has(publicId)){return DOCUMENT_MODE.QUIRKS}let prefixes=systemId===null?QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES:QUIRKS_MODE_PUBLIC_ID_PREFIXES;if(hasPrefix(publicId,prefixes)){return DOCUMENT_MODE.QUIRKS}prefixes=systemId===null?LIMITED_QUIRKS_PUBLIC_ID_PREFIXES:LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES;if(hasPrefix(publicId,prefixes)){return DOCUMENT_MODE.LIMITED_QUIRKS}}return DOCUMENT_MODE.NO_QUIRKS}var MIME_TYPES={TEXT_HTML:"text/html",APPLICATION_XML:"application/xhtml+xml"};var DEFINITION_URL_ATTR="definitionurl";var ADJUSTED_DEFINITION_URL_ATTR="definitionURL";var SVG_ATTRS_ADJUSTMENT_MAP=new Map(["attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","diffuseConstant","edgeMode","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"].map(attr=>[attr.toLowerCase(),attr]));var XML_ATTRS_ADJUSTMENT_MAP=new 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: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}]]);var SVG_TAG_NAMES_ADJUSTMENT_MAP=new Map(["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"].map(tn=>[tn.toLowerCase(),tn]));var EXITS_FOREIGN_CONTENT=new Set([TAG_ID.B,TAG_ID.BIG,TAG_ID.BLOCKQUOTE,TAG_ID.BODY,TAG_ID.BR,TAG_ID.CENTER,TAG_ID.CODE,TAG_ID.DD,TAG_ID.DIV,TAG_ID.DL,TAG_ID.DT,TAG_ID.EM,TAG_ID.EMBED,TAG_ID.H1,TAG_ID.H2,TAG_ID.H3,TAG_ID.H4,TAG_ID.H5,TAG_ID.H6,TAG_ID.HEAD,TAG_ID.HR,TAG_ID.I,TAG_ID.IMG,TAG_ID.LI,TAG_ID.LISTING,TAG_ID.MENU,TAG_ID.META,TAG_ID.NOBR,TAG_ID.OL,TAG_ID.P,TAG_ID.PRE,TAG_ID.RUBY,TAG_ID.S,TAG_ID.SMALL,TAG_ID.SPAN,TAG_ID.STRONG,TAG_ID.STRIKE,TAG_ID.SUB,TAG_ID.SUP,TAG_ID.TABLE,TAG_ID.TT,TAG_ID.U,TAG_ID.UL,TAG_ID.VAR]);function causesExit(startTagToken){const tn=startTagToken.tagID;const isFontWithAttrs=tn===TAG_ID.FONT&&startTagToken.attrs.some(({name})=>name===ATTRS.COLOR||name===ATTRS.SIZE||name===ATTRS.FACE);return isFontWithAttrs||EXITS_FOREIGN_CONTENT.has(tn)}function adjustTokenMathMLAttrs(token){for(let i=0;i<token.attrs.length;i++){if(token.attrs[i].name===DEFINITION_URL_ATTR){token.attrs[i].name=ADJUSTED_DEFINITION_URL_ATTR;break}}}function adjustTokenSVGAttrs(token){for(let i=0;i<token.attrs.length;i++){const adjustedAttrName=SVG_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);if(adjustedAttrName!=null){token.attrs[i].name=adjustedAttrName}}}function adjustTokenXMLAttrs(token){for(let i=0;i<token.attrs.length;i++){const adjustedAttrEntry=XML_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);if(adjustedAttrEntry){token.attrs[i].prefix=adjustedAttrEntry.prefix;token.attrs[i].name=adjustedAttrEntry.name;token.attrs[i].namespace=adjustedAttrEntry.namespace}}}function adjustTokenSVGTagName(token){const adjustedTagName=SVG_TAG_NAMES_ADJUSTMENT_MAP.get(token.tagName);if(adjustedTagName!=null){token.tagName=adjustedTagName;token.tagID=getTagID(token.tagName)}}function isMathMLTextIntegrationPoint(tn,ns){return ns===NS.MATHML&&(tn===TAG_ID.MI||tn===TAG_ID.MO||tn===TAG_ID.MN||tn===TAG_ID.MS||tn===TAG_ID.MTEXT)}function isHtmlIntegrationPoint(tn,ns,attrs){if(ns===NS.MATHML&&tn===TAG_ID.ANNOTATION_XML){for(let i=0;i<attrs.length;i++){if(attrs[i].name===ATTRS.ENCODING){const value=attrs[i].value.toLowerCase();return value===MIME_TYPES.TEXT_HTML||value===MIME_TYPES.APPLICATION_XML}}}return ns===NS.SVG&&(tn===TAG_ID.FOREIGN_OBJECT||tn===TAG_ID.DESC||tn===TAG_ID.TITLE)}function isIntegrationPoint(tn,ns,attrs,foreignNS){return(!foreignNS||foreignNS===NS.HTML)&&isHtmlIntegrationPoint(tn,ns,attrs)||(!foreignNS||foreignNS===NS.MATHML)&&isMathMLTextIntegrationPoint(tn,ns)}var HIDDEN_INPUT_TYPE="hidden";var AA_OUTER_LOOP_ITER=8;var AA_INNER_LOOP_ITER=3;var InsertionMode;(function(InsertionMode2){InsertionMode2[InsertionMode2["INITIAL"]=0]="INITIAL";InsertionMode2[InsertionMode2["BEFORE_HTML"]=1]="BEFORE_HTML";InsertionMode2[InsertionMode2["BEFORE_HEAD"]=2]="BEFORE_HEAD";InsertionMode2[InsertionMode2["IN_HEAD"]=3]="IN_HEAD";InsertionMode2[InsertionMode2["IN_HEAD_NO_SCRIPT"]=4]="IN_HEAD_NO_SCRIPT";InsertionMode2[InsertionMode2["AFTER_HEAD"]=5]="AFTER_HEAD";InsertionMode2[InsertionMode2["IN_BODY"]=6]="IN_BODY";InsertionMode2[InsertionMode2["TEXT"]=7]="TEXT";InsertionMode2[InsertionMode2["IN_TABLE"]=8]="IN_TABLE";InsertionMode2[InsertionMode2["IN_TABLE_TEXT"]=9]="IN_TABLE_TEXT";InsertionMode2[InsertionMode2["IN_CAPTION"]=10]="IN_CAPTION";InsertionMode2[InsertionMode2["IN_COLUMN_GROUP"]=11]="IN_COLUMN_GROUP";InsertionMode2[InsertionMode2["IN_TABLE_BODY"]=12]="IN_TABLE_BODY";InsertionMode2[InsertionMode2["IN_ROW"]=13]="IN_ROW";InsertionMode2[InsertionMode2["IN_CELL"]=14]="IN_CELL";InsertionMode2[InsertionMode2["IN_SELECT"]=15]="IN_SELECT";InsertionMode2[InsertionMode2["IN_SELECT_IN_TABLE"]=16]="IN_SELECT_IN_TABLE";InsertionMode2[InsertionMode2["IN_TEMPLATE"]=17]="IN_TEMPLATE";InsertionMode2[InsertionMode2["AFTER_BODY"]=18]="AFTER_BODY";InsertionMode2[InsertionMode2["IN_FRAMESET"]=19]="IN_FRAMESET";InsertionMode2[InsertionMode2["AFTER_FRAMESET"]=20]="AFTER_FRAMESET";InsertionMode2[InsertionMode2["AFTER_AFTER_BODY"]=21]="AFTER_AFTER_BODY";InsertionMode2[InsertionMode2["AFTER_AFTER_FRAMESET"]=22]="AFTER_AFTER_FRAMESET"})(InsertionMode||(InsertionMode={}));var BASE_LOC={startLine:-1,startCol:-1,startOffset:-1,endLine:-1,endCol:-1,endOffset:-1};var TABLE_STRUCTURE_TAGS=new Set([TAG_ID.TABLE,TAG_ID.TBODY,TAG_ID.TFOOT,TAG_ID.THEAD,TAG_ID.TR]);var defaultParserOptions={scriptingEnabled:true,sourceCodeLocationInfo:false,treeAdapter:defaultTreeAdapter,onParseError:null};var Parser=class{constructor(options,document,fragmentContext=null,scriptHandler=null){this.fragmentContext=fragmentContext;this.scriptHandler=scriptHandler;this.currentToken=null;this.stopped=false;this.insertionMode=InsertionMode.INITIAL;this.originalInsertionMode=InsertionMode.INITIAL;this.headElement=null;this.formElement=null;this.currentNotInHTML=false;this.tmplInsertionModeStack=[];this.pendingCharacterTokens=[];this.hasNonWhitespacePendingCharacterToken=false;this.framesetOk=true;this.skipNextNewLine=false;this.fosterParentingEnabled=false;this.options={...defaultParserOptions,...options};this.treeAdapter=this.options.treeAdapter;this.onParseError=this.options.onParseError;if(this.onParseError){this.options.sourceCodeLocationInfo=true}this.document=document!==null&&document!==void 0?document:this.treeAdapter.createDocument();this.tokenizer=new Tokenizer(this.options,this);this.activeFormattingElements=new FormattingElementList(this.treeAdapter);this.fragmentContextID=fragmentContext?getTagID(this.treeAdapter.getTagName(fragmentContext)):TAG_ID.UNKNOWN;this._setContextModes(fragmentContext!==null&&fragmentContext!==void 0?fragmentContext:this.document,this.fragmentContextID);this.openElements=new OpenElementStack(this.document,this.treeAdapter,this)}static parse(html,options){const parser2=new this(options);parser2.tokenizer.write(html,true);return parser2.document}static getFragmentParser(fragmentContext,options){const opts={...defaultParserOptions,...options};fragmentContext!==null&&fragmentContext!==void 0?fragmentContext:fragmentContext=opts.treeAdapter.createElement(TAG_NAMES.TEMPLATE,NS.HTML,[]);const documentMock=opts.treeAdapter.createElement("documentmock",NS.HTML,[]);const parser2=new this(opts,documentMock,fragmentContext);if(parser2.fragmentContextID===TAG_ID.TEMPLATE){parser2.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE)}parser2._initTokenizerForFragmentParsing();parser2._insertFakeRootElement();parser2._resetInsertionMode();parser2._findFormInFragmentContext();return parser2}getFragment(){const rootElement=this.treeAdapter.getFirstChild(this.document);const fragment=this.treeAdapter.createDocumentFragment();this._adoptNodes(rootElement,fragment);return fragment}_err(token,code,beforeToken){var _a;if(!this.onParseError)return;const loc=(_a=token.location)!==null&&_a!==void 0?_a:BASE_LOC;const err={code,startLine:loc.startLine,startCol:loc.startCol,startOffset:loc.startOffset,endLine:beforeToken?loc.startLine:loc.endLine,endCol:beforeToken?loc.startCol:loc.endCol,endOffset:beforeToken?loc.startOffset:loc.endOffset};this.onParseError(err)}onItemPush(node,tid,isTop){var _a,_b;(_b=(_a=this.treeAdapter).onItemPush)===null||_b===void 0?void 0:_b.call(_a,node);if(isTop&&this.openElements.stackTop>0)this._setContextModes(node,tid)}onItemPop(node,isTop){var _a,_b;if(this.options.sourceCodeLocationInfo){this._setEndLocation(node,this.currentToken)}(_b=(_a=this.treeAdapter).onItemPop)===null||_b===void 0?void 0:_b.call(_a,node,this.openElements.current);if(isTop){let current;let currentTagId;if(this.openElements.stackTop===0&&this.fragmentContext){current=this.fragmentContext;currentTagId=this.fragmentContextID}else{({current,currentTagId}=this.openElements)}this._setContextModes(current,currentTagId)}}_setContextModes(current,tid){const isHTML=current===this.document||current&&this.treeAdapter.getNamespaceURI(current)===NS.HTML;this.currentNotInHTML=!isHTML;this.tokenizer.inForeignNode=!isHTML&&current!==void 0&&tid!==void 0&&!this._isIntegrationPoint(tid,current)}_switchToTextParsing(currentToken,nextTokenizerState){this._insertElement(currentToken,NS.HTML);this.tokenizer.state=nextTokenizerState;this.originalInsertionMode=this.insertionMode;this.insertionMode=InsertionMode.TEXT}switchToPlaintextParsing(){this.insertionMode=InsertionMode.TEXT;this.originalInsertionMode=InsertionMode.IN_BODY;this.tokenizer.state=TokenizerMode.PLAINTEXT}_getAdjustedCurrentElement(){return this.openElements.stackTop===0&&this.fragmentContext?this.fragmentContext:this.openElements.current}_findFormInFragmentContext(){let node=this.fragmentContext;while(node){if(this.treeAdapter.getTagName(node)===TAG_NAMES.FORM){this.formElement=node;break}node=this.treeAdapter.getParentNode(node)}}_initTokenizerForFragmentParsing(){if(!this.fragmentContext||this.treeAdapter.getNamespaceURI(this.fragmentContext)!==NS.HTML){return}switch(this.fragmentContextID){case TAG_ID.TITLE:case TAG_ID.TEXTAREA:{this.tokenizer.state=TokenizerMode.RCDATA;break}case TAG_ID.STYLE:case TAG_ID.XMP:case TAG_ID.IFRAME:case TAG_ID.NOEMBED:case TAG_ID.NOFRAMES:case TAG_ID.NOSCRIPT:{this.tokenizer.state=TokenizerMode.RAWTEXT;break}case TAG_ID.SCRIPT:{this.tokenizer.state=TokenizerMode.SCRIPT_DATA;break}case TAG_ID.PLAINTEXT:{this.tokenizer.state=TokenizerMode.PLAINTEXT;break}default:}}_setDocumentType(token){const name=token.name||"";const publicId=token.publicId||"";const systemId=token.systemId||"";this.treeAdapter.setDocumentType(this.document,name,publicId,systemId);if(token.location){const documentChildren=this.treeAdapter.getChildNodes(this.document);const docTypeNode=documentChildren.find(node=>this.treeAdapter.isDocumentTypeNode(node));if(docTypeNode){this.treeAdapter.setNodeSourceCodeLocation(docTypeNode,token.location)}}}_attachElementToTree(element,location){if(this.options.sourceCodeLocationInfo){const loc=location&&{...location,startTag:location};this.treeAdapter.setNodeSourceCodeLocation(element,loc)}if(this._shouldFosterParentOnInsertion()){this._fosterParentElement(element)}else{const parent=this.openElements.currentTmplContentOrNode;this.treeAdapter.appendChild(parent!==null&&parent!==void 0?parent:this.document,element)}}_appendElement(token,namespaceURI){const element=this.treeAdapter.createElement(token.tagName,namespaceURI,token.attrs);this._attachElementToTree(element,token.location)}_insertElement(token,namespaceURI){const element=this.treeAdapter.createElement(token.tagName,namespaceURI,token.attrs);this._attachElementToTree(element,token.location);this.openElements.push(element,token.tagID)}_insertFakeElement(tagName,tagID){const element=this.treeAdapter.createElement(tagName,NS.HTML,[]);this._attachElementToTree(element,null);this.openElements.push(element,tagID)}_insertTemplate(token){const tmpl=this.treeAdapter.createElement(token.tagName,NS.HTML,token.attrs);const content=this.treeAdapter.createDocumentFragment();this.treeAdapter.setTemplateContent(tmpl,content);this._attachElementToTree(tmpl,token.location);this.openElements.push(tmpl,token.tagID);if(this.options.sourceCodeLocationInfo)this.treeAdapter.setNodeSourceCodeLocation(content,null)}_insertFakeRootElement(){const element=this.treeAdapter.createElement(TAG_NAMES.HTML,NS.HTML,[]);if(this.options.sourceCodeLocationInfo)this.treeAdapter.setNodeSourceCodeLocation(element,null);this.treeAdapter.appendChild(this.openElements.current,element);this.openElements.push(element,TAG_ID.HTML)}_appendCommentNode(token,parent){const commentNode=this.treeAdapter.createCommentNode(token.data);this.treeAdapter.appendChild(parent,commentNode);if(this.options.sourceCodeLocationInfo){this.treeAdapter.setNodeSourceCodeLocation(commentNode,token.location)}}_insertCharacters(token){let parent;let beforeElement;if(this._shouldFosterParentOnInsertion()){({parent,beforeElement}=this._findFosterParentingLocation());if(beforeElement){this.treeAdapter.insertTextBefore(parent,token.chars,beforeElement)}else{this.treeAdapter.insertText(parent,token.chars)}}else{parent=this.openElements.currentTmplContentOrNode;this.treeAdapter.insertText(parent,token.chars)}if(!token.location)return;const siblings=this.treeAdapter.getChildNodes(parent);const textNodeIdx=beforeElement?siblings.lastIndexOf(beforeElement):siblings.length;const textNode=siblings[textNodeIdx-1];const tnLoc=this.treeAdapter.getNodeSourceCodeLocation(textNode);if(tnLoc){const{endLine,endCol,endOffset}=token.location;this.treeAdapter.updateNodeSourceCodeLocation(textNode,{endLine,endCol,endOffset})}else if(this.options.sourceCodeLocationInfo){this.treeAdapter.setNodeSourceCodeLocation(textNode,token.location)}}_adoptNodes(donor,recipient){for(let child=this.treeAdapter.getFirstChild(donor);child;child=this.treeAdapter.getFirstChild(donor)){this.treeAdapter.detachNode(child);this.treeAdapter.appendChild(recipient,child)}}_setEndLocation(element,closingToken){if(this.treeAdapter.getNodeSourceCodeLocation(element)&&closingToken.location){const ctLoc=closingToken.location;const tn=this.treeAdapter.getTagName(element);const endLoc=closingToken.type===TokenType.END_TAG&&tn===closingToken.tagName?{endTag:{...ctLoc},endLine:ctLoc.endLine,endCol:ctLoc.endCol,endOffset:ctLoc.endOffset}:{endLine:ctLoc.startLine,endCol:ctLoc.startCol,endOffset:ctLoc.startOffset};this.treeAdapter.updateNodeSourceCodeLocation(element,endLoc)}}shouldProcessStartTagTokenInForeignContent(token){if(!this.currentNotInHTML)return false;let current;let currentTagId;if(this.openElements.stackTop===0&&this.fragmentContext){current=this.fragmentContext;currentTagId=this.fragmentContextID}else{({current,currentTagId}=this.openElements)}if(token.tagID===TAG_ID.SVG&&this.treeAdapter.getTagName(current)===TAG_NAMES.ANNOTATION_XML&&this.treeAdapter.getNamespaceURI(current)===NS.MATHML){return false}return this.tokenizer.inForeignNode||(token.tagID===TAG_ID.MGLYPH||token.tagID===TAG_ID.MALIGNMARK)&&currentTagId!==void 0&&!this._isIntegrationPoint(currentTagId,current,NS.HTML)}_processToken(token){switch(token.type){case TokenType.CHARACTER:{this.onCharacter(token);break}case TokenType.NULL_CHARACTER:{this.onNullCharacter(token);break}case TokenType.COMMENT:{this.onComment(token);break}case TokenType.DOCTYPE:{this.onDoctype(token);break}case TokenType.START_TAG:{this._processStartTag(token);break}case TokenType.END_TAG:{this.onEndTag(token);break}case TokenType.EOF:{this.onEof(token);break}case TokenType.WHITESPACE_CHARACTER:{this.onWhitespaceCharacter(token);break}}}_isIntegrationPoint(tid,element,foreignNS){const ns=this.treeAdapter.getNamespaceURI(element);const attrs=this.treeAdapter.getAttrList(element);return isIntegrationPoint(tid,ns,attrs,foreignNS)}_reconstructActiveFormattingElements(){const listLength=this.activeFormattingElements.entries.length;if(listLength){const endIndex=this.activeFormattingElements.entries.findIndex(entry=>entry.type===EntryType.Marker||this.openElements.contains(entry.element));const unopenIdx=endIndex===-1?listLength-1:endIndex-1;for(let i=unopenIdx;i>=0;i--){const entry=this.activeFormattingElements.entries[i];this._insertElement(entry.token,this.treeAdapter.getNamespaceURI(entry.element));entry.element=this.openElements.current}}}_closeTableCell(){this.openElements.generateImpliedEndTags();this.openElements.popUntilTableCellPopped();this.activeFormattingElements.clearToLastMarker();this.insertionMode=InsertionMode.IN_ROW}_closePElement(){this.openElements.generateImpliedEndTagsWithExclusion(TAG_ID.P);this.openElements.popUntilTagNamePopped(TAG_ID.P)}_resetInsertionMode(){for(let i=this.openElements.stackTop;i>=0;i--){switch(i===0&&this.fragmentContext?this.fragmentContextID:this.openElements.tagIDs[i]){case TAG_ID.TR:{this.insertionMode=InsertionMode.IN_ROW;return}case TAG_ID.TBODY:case TAG_ID.THEAD:case TAG_ID.TFOOT:{this.insertionMode=InsertionMode.IN_TABLE_BODY;return}case TAG_ID.CAPTION:{this.insertionMode=InsertionMode.IN_CAPTION;return}case TAG_ID.COLGROUP:{this.insertionMode=InsertionMode.IN_COLUMN_GROUP;return}case TAG_ID.TABLE:{this.insertionMode=InsertionMode.IN_TABLE;return}case TAG_ID.BODY:{this.insertionMode=InsertionMode.IN_BODY;return}case TAG_ID.FRAMESET:{this.insertionMode=InsertionMode.IN_FRAMESET;return}case TAG_ID.SELECT:{this._resetInsertionModeForSelect(i);return}case TAG_ID.TEMPLATE:{this.insertionMode=this.tmplInsertionModeStack[0];return}case TAG_ID.HTML:{this.insertionMode=this.headElement?InsertionMode.AFTER_HEAD:InsertionMode.BEFORE_HEAD;return}case TAG_ID.TD:case TAG_ID.TH:{if(i>0){this.insertionMode=InsertionMode.IN_CELL;return}break}case TAG_ID.HEAD:{if(i>0){this.insertionMode=InsertionMode.IN_HEAD;return}break}}}this.insertionMode=InsertionMode.IN_BODY}_resetInsertionModeForSelect(selectIdx){if(selectIdx>0){for(let i=selectIdx-1;i>0;i--){const tn=this.openElements.tagIDs[i];if(tn===TAG_ID.TEMPLATE){break}else if(tn===TAG_ID.TABLE){this.insertionMode=InsertionMode.IN_SELECT_IN_TABLE;return}}}this.insertionMode=InsertionMode.IN_SELECT}_isElementCausesFosterParenting(tn){return TABLE_STRUCTURE_TAGS.has(tn)}_shouldFosterParentOnInsertion(){return this.fosterParentingEnabled&&this.openElements.currentTagId!==void 0&&this._isElementCausesFosterParenting(this.openElements.currentTagId)}_findFosterParentingLocation(){for(let i=this.openElements.stackTop;i>=0;i--){const openElement=this.openElements.items[i];switch(this.openElements.tagIDs[i]){case TAG_ID.TEMPLATE:{if(this.treeAdapter.getNamespaceURI(openElement)===NS.HTML){return{parent:this.treeAdapter.getTemplateContent(openElement),beforeElement:null}}break}case TAG_ID.TABLE:{const parent=this.treeAdapter.getParentNode(openElement);if(parent){return{parent,beforeElement:openElement}}return{parent:this.openElements.items[i-1],beforeElement:null}}default:}}return{parent:this.openElements.items[0],beforeElement:null}}_fosterParentElement(element){const location=this._findFosterParentingLocation();if(location.beforeElement){this.treeAdapter.insertBefore(location.parent,element,location.beforeElement)}else{this.treeAdapter.appendChild(location.parent,element)}}_isSpecialElement(element,id){const ns=this.treeAdapter.getNamespaceURI(element);return SPECIAL_ELEMENTS[ns].has(id)}onCharacter(token){this.skipNextNewLine=false;if(this.tokenizer.inForeignNode){characterInForeignContent(this,token);return}switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{tokenBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{tokenBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{tokenInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{tokenInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{tokenAfterHead(this,token);break}case InsertionMode.IN_BODY:case InsertionMode.IN_CAPTION:case InsertionMode.IN_CELL:case InsertionMode.IN_TEMPLATE:{characterInBody(this,token);break}case InsertionMode.TEXT:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:{this._insertCharacters(token);break}case InsertionMode.IN_TABLE:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:{characterInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{characterInTableText(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{tokenInColumnGroup(this,token);break}case InsertionMode.AFTER_BODY:{tokenAfterBody(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{tokenAfterAfterBody(this,token);break}default:}}onNullCharacter(token){this.skipNextNewLine=false;if(this.tokenizer.inForeignNode){nullCharacterInForeignContent(this,token);return}switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{tokenBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{tokenBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{tokenInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{tokenInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{tokenAfterHead(this,token);break}case InsertionMode.TEXT:{this._insertCharacters(token);break}case InsertionMode.IN_TABLE:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:{characterInTable(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{tokenInColumnGroup(this,token);break}case InsertionMode.AFTER_BODY:{tokenAfterBody(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{tokenAfterAfterBody(this,token);break}default:}}onComment(token){this.skipNextNewLine=false;if(this.currentNotInHTML){appendComment(this,token);return}switch(this.insertionMode){case InsertionMode.INITIAL:case InsertionMode.BEFORE_HTML:case InsertionMode.BEFORE_HEAD:case InsertionMode.IN_HEAD:case InsertionMode.IN_HEAD_NO_SCRIPT:case InsertionMode.AFTER_HEAD:case InsertionMode.IN_BODY:case InsertionMode.IN_TABLE:case InsertionMode.IN_CAPTION:case InsertionMode.IN_COLUMN_GROUP:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:case InsertionMode.IN_CELL:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:case InsertionMode.IN_TEMPLATE:case InsertionMode.IN_FRAMESET:case InsertionMode.AFTER_FRAMESET:{appendComment(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.AFTER_BODY:{appendCommentToRootHtmlElement(this,token);break}case InsertionMode.AFTER_AFTER_BODY:case InsertionMode.AFTER_AFTER_FRAMESET:{appendCommentToDocument(this,token);break}default:}}onDoctype(token){this.skipNextNewLine=false;switch(this.insertionMode){case InsertionMode.INITIAL:{doctypeInInitialMode(this,token);break}case InsertionMode.BEFORE_HEAD:case InsertionMode.IN_HEAD:case InsertionMode.IN_HEAD_NO_SCRIPT:case InsertionMode.AFTER_HEAD:{this._err(token,ERR.misplacedDoctype);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}default:}}onStartTag(token){this.skipNextNewLine=false;this.currentToken=token;this._processStartTag(token);if(token.selfClosing&&!token.ackSelfClosing){this._err(token,ERR.nonVoidHtmlElementStartTagWithTrailingSolidus)}}_processStartTag(token){if(this.shouldProcessStartTagTokenInForeignContent(token)){startTagInForeignContent(this,token)}else{this._startTagOutsideForeignContent(token)}}_startTagOutsideForeignContent(token){switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{startTagBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{startTagBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{startTagInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{startTagInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{startTagAfterHead(this,token);break}case InsertionMode.IN_BODY:{startTagInBody(this,token);break}case InsertionMode.IN_TABLE:{startTagInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.IN_CAPTION:{startTagInCaption(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{startTagInColumnGroup(this,token);break}case InsertionMode.IN_TABLE_BODY:{startTagInTableBody(this,token);break}case InsertionMode.IN_ROW:{startTagInRow(this,token);break}case InsertionMode.IN_CELL:{startTagInCell(this,token);break}case InsertionMode.IN_SELECT:{startTagInSelect(this,token);break}case InsertionMode.IN_SELECT_IN_TABLE:{startTagInSelectInTable(this,token);break}case InsertionMode.IN_TEMPLATE:{startTagInTemplate(this,token);break}case InsertionMode.AFTER_BODY:{startTagAfterBody(this,token);break}case InsertionMode.IN_FRAMESET:{startTagInFrameset(this,token);break}case InsertionMode.AFTER_FRAMESET:{startTagAfterFrameset(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{startTagAfterAfterBody(this,token);break}case InsertionMode.AFTER_AFTER_FRAMESET:{startTagAfterAfterFrameset(this,token);break}default:}}onEndTag(token){this.skipNextNewLine=false;this.currentToken=token;if(this.currentNotInHTML){endTagInForeignContent(this,token)}else{this._endTagOutsideForeignContent(token)}}_endTagOutsideForeignContent(token){switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{endTagBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{endTagBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{endTagInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{endTagInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{endTagAfterHead(this,token);break}case InsertionMode.IN_BODY:{endTagInBody(this,token);break}case InsertionMode.TEXT:{endTagInText(this,token);break}case InsertionMode.IN_TABLE:{endTagInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.IN_CAPTION:{endTagInCaption(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{endTagInColumnGroup(this,token);break}case InsertionMode.IN_TABLE_BODY:{endTagInTableBody(this,token);break}case InsertionMode.IN_ROW:{endTagInRow(this,token);break}case InsertionMode.IN_CELL:{endTagInCell(this,token);break}case InsertionMode.IN_SELECT:{endTagInSelect(this,token);break}case InsertionMode.IN_SELECT_IN_TABLE:{endTagInSelectInTable(this,token);break}case InsertionMode.IN_TEMPLATE:{endTagInTemplate(this,token);break}case InsertionMode.AFTER_BODY:{endTagAfterBody(this,token);break}case InsertionMode.IN_FRAMESET:{endTagInFrameset(this,token);break}case InsertionMode.AFTER_FRAMESET:{endTagAfterFrameset(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{tokenAfterAfterBody(this,token);break}default:}}onEof(token){switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{tokenBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{tokenBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{tokenInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{tokenInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{tokenAfterHead(this,token);break}case InsertionMode.IN_BODY:case InsertionMode.IN_TABLE:case InsertionMode.IN_CAPTION:case InsertionMode.IN_COLUMN_GROUP:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:case InsertionMode.IN_CELL:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:{eofInBody(this,token);break}case InsertionMode.TEXT:{eofInText(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.IN_TEMPLATE:{eofInTemplate(this,token);break}case InsertionMode.AFTER_BODY:case InsertionMode.IN_FRAMESET:case InsertionMode.AFTER_FRAMESET:case InsertionMode.AFTER_AFTER_BODY:case InsertionMode.AFTER_AFTER_FRAMESET:{stopParsing(this,token);break}default:}}onWhitespaceCharacter(token){if(this.skipNextNewLine){this.skipNextNewLine=false;if(token.chars.charCodeAt(0)===CODE_POINTS.LINE_FEED){if(token.chars.length===1){return}token.chars=token.chars.substr(1)}}if(this.tokenizer.inForeignNode){this._insertCharacters(token);return}switch(this.insertionMode){case InsertionMode.IN_HEAD:case InsertionMode.IN_HEAD_NO_SCRIPT:case InsertionMode.AFTER_HEAD:case InsertionMode.TEXT:case InsertionMode.IN_COLUMN_GROUP:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:case InsertionMode.IN_FRAMESET:case InsertionMode.AFTER_FRAMESET:{this._insertCharacters(token);break}case InsertionMode.IN_BODY:case InsertionMode.IN_CAPTION:case InsertionMode.IN_CELL:case InsertionMode.IN_TEMPLATE:case InsertionMode.AFTER_BODY:case InsertionMode.AFTER_AFTER_BODY:case InsertionMode.AFTER_AFTER_FRAMESET:{whitespaceCharacterInBody(this,token);break}case InsertionMode.IN_TABLE:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:{characterInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{whitespaceCharacterInTableText(this,token);break}default:}}};function aaObtainFormattingElementEntry(p,token){let 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.tagID)){formattingElementEntry=null}}else{genericEndTagInBody(p,token)}return formattingElementEntry}function aaObtainFurthestBlock(p,formattingElementEntry){let furthestBlock=null;let idx=p.openElements.stackTop;for(;idx>=0;idx--){const element=p.openElements.items[idx];if(element===formattingElementEntry.element){break}if(p._isSpecialElement(element,p.openElements.tagIDs[idx])){furthestBlock=element}}if(!furthestBlock){p.openElements.shortenToLength(Math.max(idx,0));p.activeFormattingElements.removeEntry(formattingElementEntry)}return furthestBlock}function aaInnerLoop(p,furthestBlock,formattingElement){let lastElement=furthestBlock;let nextElement=p.openElements.getCommonAncestor(furthestBlock);for(let i=0,element=nextElement;element!==formattingElement;i++,element=nextElement){nextElement=p.openElements.getCommonAncestor(element);const elementEntry=p.activeFormattingElements.getElementEntry(element);const counterOverflow=elementEntry&&i>=AA_INNER_LOOP_ITER;const shouldRemoveFromOpenElements=!elementEntry||counterOverflow;if(shouldRemoveFromOpenElements){if(counterOverflow){p.activeFormattingElements.removeEntry(elementEntry)}p.openElements.remove(element)}else{element=aaRecreateElementFromEntry(p,elementEntry);if(lastElement===furthestBlock){p.activeFormattingElements.bookmark=elementEntry}p.treeAdapter.detachNode(lastElement);p.treeAdapter.appendChild(element,lastElement);lastElement=element}}return lastElement}function aaRecreateElementFromEntry(p,elementEntry){const ns=p.treeAdapter.getNamespaceURI(elementEntry.element);const newElement=p.treeAdapter.createElement(elementEntry.token.tagName,ns,elementEntry.token.attrs);p.openElements.replace(elementEntry.element,newElement);elementEntry.element=newElement;return newElement}function aaInsertLastNodeInCommonAncestor(p,commonAncestor,lastElement){const tn=p.treeAdapter.getTagName(commonAncestor);const tid=getTagID(tn);if(p._isElementCausesFosterParenting(tid)){p._fosterParentElement(lastElement)}else{const ns=p.treeAdapter.getNamespaceURI(commonAncestor);if(tid===TAG_ID.TEMPLATE&&ns===NS.HTML){commonAncestor=p.treeAdapter.getTemplateContent(commonAncestor)}p.treeAdapter.appendChild(commonAncestor,lastElement)}}function aaReplaceFormattingElement(p,furthestBlock,formattingElementEntry){const ns=p.treeAdapter.getNamespaceURI(formattingElementEntry.element);const{token}=formattingElementEntry;const newElement=p.treeAdapter.createElement(token.tagName,ns,token.attrs);p._adoptNodes(furthestBlock,newElement);p.treeAdapter.appendChild(furthestBlock,newElement);p.activeFormattingElements.insertElementAfterBookmark(newElement,token);p.activeFormattingElements.removeEntry(formattingElementEntry);p.openElements.remove(formattingElementEntry.element);p.openElements.insertAfter(furthestBlock,newElement,token.tagID)}function callAdoptionAgency(p,token){for(let i=0;i<AA_OUTER_LOOP_ITER;i++){const formattingElementEntry=aaObtainFormattingElementEntry(p,token);if(!formattingElementEntry){break}const furthestBlock=aaObtainFurthestBlock(p,formattingElementEntry);if(!furthestBlock){break}p.activeFormattingElements.bookmark=formattingElementEntry;const lastElement=aaInnerLoop(p,furthestBlock,formattingElementEntry.element);const commonAncestor=p.openElements.getCommonAncestor(formattingElementEntry.element);p.treeAdapter.detachNode(lastElement);if(commonAncestor)aaInsertLastNodeInCommonAncestor(p,commonAncestor,lastElement);aaReplaceFormattingElement(p,furthestBlock,formattingElementEntry)}}function appendComment(p,token){p._appendCommentNode(token,p.openElements.currentTmplContentOrNode)}function appendCommentToRootHtmlElement(p,token){p._appendCommentNode(token,p.openElements.items[0])}function appendCommentToDocument(p,token){p._appendCommentNode(token,p.document)}function stopParsing(p,token){p.stopped=true;if(token.location){const target=p.fragmentContext?0:2;for(let i=p.openElements.stackTop;i>=target;i--){p._setEndLocation(p.openElements.items[i],token)}if(!p.fragmentContext&&p.openElements.stackTop>=0){const htmlElement=p.openElements.items[0];const htmlLocation=p.treeAdapter.getNodeSourceCodeLocation(htmlElement);if(htmlLocation&&!htmlLocation.endTag){p._setEndLocation(htmlElement,token);if(p.openElements.stackTop>=1){const bodyElement=p.openElements.items[1];const bodyLocation=p.treeAdapter.getNodeSourceCodeLocation(bodyElement);if(bodyLocation&&!bodyLocation.endTag){p._setEndLocation(bodyElement,token)}}}}}}function doctypeInInitialMode(p,token){p._setDocumentType(token);const mode=token.forceQuirks?DOCUMENT_MODE.QUIRKS:getDocumentMode(token);if(!isConforming(token)){p._err(token,ERR.nonConformingDoctype)}p.treeAdapter.setDocumentMode(p.document,mode);p.insertionMode=InsertionMode.BEFORE_HTML}function tokenInInitialMode(p,token){p._err(token,ERR.missingDoctype,true);p.treeAdapter.setDocumentMode(p.document,DOCUMENT_MODE.QUIRKS);p.insertionMode=InsertionMode.BEFORE_HTML;p._processToken(token)}function startTagBeforeHtml(p,token){if(token.tagID===TAG_ID.HTML){p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.BEFORE_HEAD}else{tokenBeforeHtml(p,token)}}function endTagBeforeHtml(p,token){const tn=token.tagID;if(tn===TAG_ID.HTML||tn===TAG_ID.HEAD||tn===TAG_ID.BODY||tn===TAG_ID.BR){tokenBeforeHtml(p,token)}}function tokenBeforeHtml(p,token){p._insertFakeRootElement();p.insertionMode=InsertionMode.BEFORE_HEAD;p._processToken(token)}function startTagBeforeHead(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.HEAD:{p._insertElement(token,NS.HTML);p.headElement=p.openElements.current;p.insertionMode=InsertionMode.IN_HEAD;break}default:{tokenBeforeHead(p,token)}}}function endTagBeforeHead(p,token){const tn=token.tagID;if(tn===TAG_ID.HEAD||tn===TAG_ID.BODY||tn===TAG_ID.HTML||tn===TAG_ID.BR){tokenBeforeHead(p,token)}else{p._err(token,ERR.endTagWithoutMatchingOpenElement)}}function tokenBeforeHead(p,token){p._insertFakeElement(TAG_NAMES.HEAD,TAG_ID.HEAD);p.headElement=p.openElements.current;p.insertionMode=InsertionMode.IN_HEAD;p._processToken(token)}function startTagInHead(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.BASE:case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.LINK:case TAG_ID.META:{p._appendElement(token,NS.HTML);token.ackSelfClosing=true;break}case TAG_ID.TITLE:{p._switchToTextParsing(token,TokenizerMode.RCDATA);break}case TAG_ID.NOSCRIPT:{if(p.options.scriptingEnabled){p._switchToTextParsing(token,TokenizerMode.RAWTEXT)}else{p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_HEAD_NO_SCRIPT}break}case TAG_ID.NOFRAMES:case TAG_ID.STYLE:{p._switchToTextParsing(token,TokenizerMode.RAWTEXT);break}case TAG_ID.SCRIPT:{p._switchToTextParsing(token,TokenizerMode.SCRIPT_DATA);break}case TAG_ID.TEMPLATE:{p._insertTemplate(token);p.activeFormattingElements.insertMarker();p.framesetOk=false;p.insertionMode=InsertionMode.IN_TEMPLATE;p.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);break}case TAG_ID.HEAD:{p._err(token,ERR.misplacedStartTagForHeadElement);break}default:{tokenInHead(p,token)}}}function endTagInHead(p,token){switch(token.tagID){case TAG_ID.HEAD:{p.openElements.pop();p.insertionMode=InsertionMode.AFTER_HEAD;break}case TAG_ID.BODY:case TAG_ID.BR:case TAG_ID.HTML:{tokenInHead(p,token);break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:{p._err(token,ERR.endTagWithoutMatchingOpenElement)}}}function templateEndTagInHead(p,token){if(p.openElements.tmplCount>0){p.openElements.generateImpliedEndTagsThoroughly();if(p.openElements.currentTagId!==TAG_ID.TEMPLATE){p._err(token,ERR.closingOfElementWithOpenChildElements)}p.openElements.popUntilTagNamePopped(TAG_ID.TEMPLATE);p.activeFormattingElements.clearToLastMarker();p.tmplInsertionModeStack.shift();p._resetInsertionMode()}else{p._err(token,ERR.endTagWithoutMatchingOpenElement)}}function tokenInHead(p,token){p.openElements.pop();p.insertionMode=InsertionMode.AFTER_HEAD;p._processToken(token)}function startTagInHeadNoScript(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.HEAD:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.NOFRAMES:case TAG_ID.STYLE:{startTagInHead(p,token);break}case TAG_ID.NOSCRIPT:{p._err(token,ERR.nestedNoscriptInHead);break}default:{tokenInHeadNoScript(p,token)}}}function endTagInHeadNoScript(p,token){switch(token.tagID){case TAG_ID.NOSCRIPT:{p.openElements.pop();p.insertionMode=InsertionMode.IN_HEAD;break}case TAG_ID.BR:{tokenInHeadNoScript(p,token);break}default:{p._err(token,ERR.endTagWithoutMatchingOpenElement)}}}function tokenInHeadNoScript(p,token){const errCode=token.type===TokenType.EOF?ERR.openElementsLeftAfterEof:ERR.disallowedContentInNoscriptInHead;p._err(token,errCode);p.openElements.pop();p.insertionMode=InsertionMode.IN_HEAD;p._processToken(token)}function startTagAfterHead(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.BODY:{p._insertElement(token,NS.HTML);p.framesetOk=false;p.insertionMode=InsertionMode.IN_BODY;break}case TAG_ID.FRAMESET:{p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_FRAMESET;break}case TAG_ID.BASE:case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.NOFRAMES:case TAG_ID.SCRIPT:case TAG_ID.STYLE:case TAG_ID.TEMPLATE:case TAG_ID.TITLE:{p._err(token,ERR.abandonedHeadElementChild);p.openElements.push(p.headElement,TAG_ID.HEAD);startTagInHead(p,token);p.openElements.remove(p.headElement);break}case TAG_ID.HEAD:{p._err(token,ERR.misplacedStartTagForHeadElement);break}default:{tokenAfterHead(p,token)}}}function endTagAfterHead(p,token){switch(token.tagID){case TAG_ID.BODY:case TAG_ID.HTML:case TAG_ID.BR:{tokenAfterHead(p,token);break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:{p._err(token,ERR.endTagWithoutMatchingOpenElement)}}}function tokenAfterHead(p,token){p._insertFakeElement(TAG_NAMES.BODY,TAG_ID.BODY);p.insertionMode=InsertionMode.IN_BODY;modeInBody(p,token)}function modeInBody(p,token){switch(token.type){case TokenType.CHARACTER:{characterInBody(p,token);break}case TokenType.WHITESPACE_CHARACTER:{whitespaceCharacterInBody(p,token);break}case TokenType.COMMENT:{appendComment(p,token);break}case TokenType.START_TAG:{startTagInBody(p,token);break}case TokenType.END_TAG:{endTagInBody(p,token);break}case TokenType.EOF:{eofInBody(p,token);break}default:}}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){const bodyElement=p.openElements.tryPeekProperlyNestedBodyElement();if(bodyElement&&p.openElements.tmplCount===0){p.framesetOk=false;p.treeAdapter.adoptAttributes(bodyElement,token.attrs)}}function framesetStartTagInBody(p,token){const bodyElement=p.openElements.tryPeekProperlyNestedBodyElement();if(p.framesetOk&&bodyElement){p.treeAdapter.detachNode(bodyElement);p.openElements.popAllUpToHtmlElement();p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_FRAMESET}}function addressStartTagInBody(p,token){if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._insertElement(token,NS.HTML)}function numberedHeaderStartTagInBody(p,token){if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}if(p.openElements.currentTagId!==void 0&&NUMBERED_HEADERS.has(p.openElements.currentTagId)){p.openElements.pop()}p._insertElement(token,NS.HTML)}function preStartTagInBody(p,token){if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._insertElement(token,NS.HTML);p.skipNextNewLine=true;p.framesetOk=false}function formStartTagInBody(p,token){const inTemplate=p.openElements.tmplCount>0;if(!p.formElement||inTemplate){if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._insertElement(token,NS.HTML);if(!inTemplate){p.formElement=p.openElements.current}}}function listItemStartTagInBody(p,token){p.framesetOk=false;const tn=token.tagID;for(let i=p.openElements.stackTop;i>=0;i--){const elementId=p.openElements.tagIDs[i];if(tn===TAG_ID.LI&&elementId===TAG_ID.LI||(tn===TAG_ID.DD||tn===TAG_ID.DT)&&(elementId===TAG_ID.DD||elementId===TAG_ID.DT)){p.openElements.generateImpliedEndTagsWithExclusion(elementId);p.openElements.popUntilTagNamePopped(elementId);break}if(elementId!==TAG_ID.ADDRESS&&elementId!==TAG_ID.DIV&&elementId!==TAG_ID.P&&p._isSpecialElement(p.openElements.items[i],elementId)){break}}if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._insertElement(token,NS.HTML)}function plaintextStartTagInBody(p,token){if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._insertElement(token,NS.HTML);p.tokenizer.state=TokenizerMode.PLAINTEXT}function buttonStartTagInBody(p,token){if(p.openElements.hasInScope(TAG_ID.BUTTON)){p.openElements.generateImpliedEndTags();p.openElements.popUntilTagNamePopped(TAG_ID.BUTTON)}p._reconstructActiveFormattingElements();p._insertElement(token,NS.HTML);p.framesetOk=false}function aStartTagInBody(p,token){const activeElementEntry=p.activeFormattingElements.getElementEntryInScopeWithTagName(TAG_NAMES.A);if(activeElementEntry){callAdoptionAgency(p,token);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(TAG_ID.NOBR)){callAdoptionAgency(p,token);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.getDocumentMode(p.document)!==DOCUMENT_MODE.QUIRKS&&p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._insertElement(token,NS.HTML);p.framesetOk=false;p.insertionMode=InsertionMode.IN_TABLE}function areaStartTagInBody(p,token){p._reconstructActiveFormattingElements();p._appendElement(token,NS.HTML);p.framesetOk=false;token.ackSelfClosing=true}function isHiddenInput(token){const inputType=getTokenAttr(token,ATTRS.TYPE);return inputType!=null&&inputType.toLowerCase()===HIDDEN_INPUT_TYPE}function inputStartTagInBody(p,token){p._reconstructActiveFormattingElements();p._appendElement(token,NS.HTML);if(!isHiddenInput(token)){p.framesetOk=false}token.ackSelfClosing=true}function paramStartTagInBody(p,token){p._appendElement(token,NS.HTML);token.ackSelfClosing=true}function hrStartTagInBody(p,token){if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._appendElement(token,NS.HTML);p.framesetOk=false;token.ackSelfClosing=true}function imageStartTagInBody(p,token){token.tagName=TAG_NAMES.IMG;token.tagID=TAG_ID.IMG;areaStartTagInBody(p,token)}function textareaStartTagInBody(p,token){p._insertElement(token,NS.HTML);p.skipNextNewLine=true;p.tokenizer.state=TokenizerMode.RCDATA;p.originalInsertionMode=p.insertionMode;p.framesetOk=false;p.insertionMode=InsertionMode.TEXT}function xmpStartTagInBody(p,token){if(p.openElements.hasInButtonScope(TAG_ID.P)){p._closePElement()}p._reconstructActiveFormattingElements();p.framesetOk=false;p._switchToTextParsing(token,TokenizerMode.RAWTEXT)}function iframeStartTagInBody(p,token){p.framesetOk=false;p._switchToTextParsing(token,TokenizerMode.RAWTEXT)}function rawTextStartTagInBody(p,token){p._switchToTextParsing(token,TokenizerMode.RAWTEXT)}function selectStartTagInBody(p,token){p._reconstructActiveFormattingElements();p._insertElement(token,NS.HTML);p.framesetOk=false;p.insertionMode=p.insertionMode===InsertionMode.IN_TABLE||p.insertionMode===InsertionMode.IN_CAPTION||p.insertionMode===InsertionMode.IN_TABLE_BODY||p.insertionMode===InsertionMode.IN_ROW||p.insertionMode===InsertionMode.IN_CELL?InsertionMode.IN_SELECT_IN_TABLE:InsertionMode.IN_SELECT}function optgroupStartTagInBody(p,token){if(p.openElements.currentTagId===TAG_ID.OPTION){p.openElements.pop()}p._reconstructActiveFormattingElements();p._insertElement(token,NS.HTML)}function rbStartTagInBody(p,token){if(p.openElements.hasInScope(TAG_ID.RUBY)){p.openElements.generateImpliedEndTags()}p._insertElement(token,NS.HTML)}function rtStartTagInBody(p,token){if(p.openElements.hasInScope(TAG_ID.RUBY)){p.openElements.generateImpliedEndTagsWithExclusion(TAG_ID.RTC)}p._insertElement(token,NS.HTML)}function mathStartTagInBody(p,token){p._reconstructActiveFormattingElements();adjustTokenMathMLAttrs(token);adjustTokenXMLAttrs(token);if(token.selfClosing){p._appendElement(token,NS.MATHML)}else{p._insertElement(token,NS.MATHML)}token.ackSelfClosing=true}function svgStartTagInBody(p,token){p._reconstructActiveFormattingElements();adjustTokenSVGAttrs(token);adjustTokenXMLAttrs(token);if(token.selfClosing){p._appendElement(token,NS.SVG)}else{p._insertElement(token,NS.SVG)}token.ackSelfClosing=true}function genericStartTagInBody(p,token){p._reconstructActiveFormattingElements();p._insertElement(token,NS.HTML)}function startTagInBody(p,token){switch(token.tagID){case TAG_ID.I:case TAG_ID.S:case TAG_ID.B:case TAG_ID.U:case TAG_ID.EM:case TAG_ID.TT:case TAG_ID.BIG:case TAG_ID.CODE:case TAG_ID.FONT:case TAG_ID.SMALL:case TAG_ID.STRIKE:case TAG_ID.STRONG:{bStartTagInBody(p,token);break}case TAG_ID.A:{aStartTagInBody(p,token);break}case TAG_ID.H1:case TAG_ID.H2:case TAG_ID.H3:case TAG_ID.H4:case TAG_ID.H5:case TAG_ID.H6:{numberedHeaderStartTagInBody(p,token);break}case TAG_ID.P:case TAG_ID.DL:case TAG_ID.OL:case TAG_ID.UL:case TAG_ID.DIV:case TAG_ID.DIR:case TAG_ID.NAV:case TAG_ID.MAIN:case TAG_ID.MENU:case TAG_ID.ASIDE:case TAG_ID.CENTER:case TAG_ID.FIGURE:case TAG_ID.FOOTER:case TAG_ID.HEADER:case TAG_ID.HGROUP:case TAG_ID.DIALOG:case TAG_ID.DETAILS:case TAG_ID.ADDRESS:case TAG_ID.ARTICLE:case TAG_ID.SEARCH:case TAG_ID.SECTION:case TAG_ID.SUMMARY:case TAG_ID.FIELDSET:case TAG_ID.BLOCKQUOTE:case TAG_ID.FIGCAPTION:{addressStartTagInBody(p,token);break}case TAG_ID.LI:case TAG_ID.DD:case TAG_ID.DT:{listItemStartTagInBody(p,token);break}case TAG_ID.BR:case TAG_ID.IMG:case TAG_ID.WBR:case TAG_ID.AREA:case TAG_ID.EMBED:case TAG_ID.KEYGEN:{areaStartTagInBody(p,token);break}case TAG_ID.HR:{hrStartTagInBody(p,token);break}case TAG_ID.RB:case TAG_ID.RTC:{rbStartTagInBody(p,token);break}case TAG_ID.RT:case TAG_ID.RP:{rtStartTagInBody(p,token);break}case TAG_ID.PRE:case TAG_ID.LISTING:{preStartTagInBody(p,token);break}case TAG_ID.XMP:{xmpStartTagInBody(p,token);break}case TAG_ID.SVG:{svgStartTagInBody(p,token);break}case TAG_ID.HTML:{htmlStartTagInBody(p,token);break}case TAG_ID.BASE:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.STYLE:case TAG_ID.TITLE:case TAG_ID.SCRIPT:case TAG_ID.BGSOUND:case TAG_ID.BASEFONT:case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}case TAG_ID.BODY:{bodyStartTagInBody(p,token);break}case TAG_ID.FORM:{formStartTagInBody(p,token);break}case TAG_ID.NOBR:{nobrStartTagInBody(p,token);break}case TAG_ID.MATH:{mathStartTagInBody(p,token);break}case TAG_ID.TABLE:{tableStartTagInBody(p,token);break}case TAG_ID.INPUT:{inputStartTagInBody(p,token);break}case TAG_ID.PARAM:case TAG_ID.TRACK:case TAG_ID.SOURCE:{paramStartTagInBody(p,token);break}case TAG_ID.IMAGE:{imageStartTagInBody(p,token);break}case TAG_ID.BUTTON:{buttonStartTagInBody(p,token);break}case TAG_ID.APPLET:case TAG_ID.OBJECT:case TAG_ID.MARQUEE:{appletStartTagInBody(p,token);break}case TAG_ID.IFRAME:{iframeStartTagInBody(p,token);break}case TAG_ID.SELECT:{selectStartTagInBody(p,token);break}case TAG_ID.OPTION:case TAG_ID.OPTGROUP:{optgroupStartTagInBody(p,token);break}case TAG_ID.NOEMBED:case TAG_ID.NOFRAMES:{rawTextStartTagInBody(p,token);break}case TAG_ID.FRAMESET:{framesetStartTagInBody(p,token);break}case TAG_ID.TEXTAREA:{textareaStartTagInBody(p,token);break}case TAG_ID.NOSCRIPT:{if(p.options.scriptingEnabled){rawTextStartTagInBody(p,token)}else{genericStartTagInBody(p,token)}break}case TAG_ID.PLAINTEXT:{plaintextStartTagInBody(p,token);break}case TAG_ID.COL:case TAG_ID.TH:case TAG_ID.TD:case TAG_ID.TR:case TAG_ID.HEAD:case TAG_ID.FRAME:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:case TAG_ID.CAPTION:case TAG_ID.COLGROUP:{break}default:{genericStartTagInBody(p,token)}}}function bodyEndTagInBody(p,token){if(p.openElements.hasInScope(TAG_ID.BODY)){p.insertionMode=InsertionMode.AFTER_BODY;if(p.options.sourceCodeLocationInfo){const bodyElement=p.openElements.tryPeekProperlyNestedBodyElement();if(bodyElement){p._setEndLocation(bodyElement,token)}}}}function htmlEndTagInBody(p,token){if(p.openElements.hasInScope(TAG_ID.BODY)){p.insertionMode=InsertionMode.AFTER_BODY;endTagAfterBody(p,token)}}function addressEndTagInBody(p,token){const tn=token.tagID;if(p.openElements.hasInScope(tn)){p.openElements.generateImpliedEndTags();p.openElements.popUntilTagNamePopped(tn)}}function formEndTagInBody(p){const inTemplate=p.openElements.tmplCount>0;const{formElement}=p;if(!inTemplate){p.formElement=null}if((formElement||inTemplate)&&p.openElements.hasInScope(TAG_ID.FORM)){p.openElements.generateImpliedEndTags();if(inTemplate){p.openElements.popUntilTagNamePopped(TAG_ID.FORM)}else if(formElement){p.openElements.remove(formElement)}}}function pEndTagInBody(p){if(!p.openElements.hasInButtonScope(TAG_ID.P)){p._insertFakeElement(TAG_NAMES.P,TAG_ID.P)}p._closePElement()}function liEndTagInBody(p){if(p.openElements.hasInListItemScope(TAG_ID.LI)){p.openElements.generateImpliedEndTagsWithExclusion(TAG_ID.LI);p.openElements.popUntilTagNamePopped(TAG_ID.LI)}}function ddEndTagInBody(p,token){const tn=token.tagID;if(p.openElements.hasInScope(tn)){p.openElements.generateImpliedEndTagsWithExclusion(tn);p.openElements.popUntilTagNamePopped(tn)}}function numberedHeaderEndTagInBody(p){if(p.openElements.hasNumberedHeaderInScope()){p.openElements.generateImpliedEndTags();p.openElements.popUntilNumberedHeaderPopped()}}function appletEndTagInBody(p,token){const tn=token.tagID;if(p.openElements.hasInScope(tn)){p.openElements.generateImpliedEndTags();p.openElements.popUntilTagNamePopped(tn);p.activeFormattingElements.clearToLastMarker()}}function brEndTagInBody(p){p._reconstructActiveFormattingElements();p._insertFakeElement(TAG_NAMES.BR,TAG_ID.BR);p.openElements.pop();p.framesetOk=false}function genericEndTagInBody(p,token){const tn=token.tagName;const tid=token.tagID;for(let i=p.openElements.stackTop;i>0;i--){const element=p.openElements.items[i];const elementId=p.openElements.tagIDs[i];if(tid===elementId&&(tid!==TAG_ID.UNKNOWN||p.treeAdapter.getTagName(element)===tn)){p.openElements.generateImpliedEndTagsWithExclusion(tid);if(p.openElements.stackTop>=i)p.openElements.shortenToLength(i);break}if(p._isSpecialElement(element,elementId)){break}}}function endTagInBody(p,token){switch(token.tagID){case TAG_ID.A:case TAG_ID.B:case TAG_ID.I:case TAG_ID.S:case TAG_ID.U:case TAG_ID.EM:case TAG_ID.TT:case TAG_ID.BIG:case TAG_ID.CODE:case TAG_ID.FONT:case TAG_ID.NOBR:case TAG_ID.SMALL:case TAG_ID.STRIKE:case TAG_ID.STRONG:{callAdoptionAgency(p,token);break}case TAG_ID.P:{pEndTagInBody(p);break}case TAG_ID.DL:case TAG_ID.UL:case TAG_ID.OL:case TAG_ID.DIR:case TAG_ID.DIV:case TAG_ID.NAV:case TAG_ID.PRE:case TAG_ID.MAIN:case TAG_ID.MENU:case TAG_ID.ASIDE:case TAG_ID.BUTTON:case TAG_ID.CENTER:case TAG_ID.FIGURE:case TAG_ID.FOOTER:case TAG_ID.HEADER:case TAG_ID.HGROUP:case TAG_ID.DIALOG:case TAG_ID.ADDRESS:case TAG_ID.ARTICLE:case TAG_ID.DETAILS:case TAG_ID.SEARCH:case TAG_ID.SECTION:case TAG_ID.SUMMARY:case TAG_ID.LISTING:case TAG_ID.FIELDSET:case TAG_ID.BLOCKQUOTE:case TAG_ID.FIGCAPTION:{addressEndTagInBody(p,token);break}case TAG_ID.LI:{liEndTagInBody(p);break}case TAG_ID.DD:case TAG_ID.DT:{ddEndTagInBody(p,token);break}case TAG_ID.H1:case TAG_ID.H2:case TAG_ID.H3:case TAG_ID.H4:case TAG_ID.H5:case TAG_ID.H6:{numberedHeaderEndTagInBody(p);break}case TAG_ID.BR:{brEndTagInBody(p);break}case TAG_ID.BODY:{bodyEndTagInBody(p,token);break}case TAG_ID.HTML:{htmlEndTagInBody(p,token);break}case TAG_ID.FORM:{formEndTagInBody(p);break}case TAG_ID.APPLET:case TAG_ID.OBJECT:case TAG_ID.MARQUEE:{appletEndTagInBody(p,token);break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:{genericEndTagInBody(p,token)}}}function eofInBody(p,token){if(p.tmplInsertionModeStack.length>0){eofInTemplate(p,token)}else{stopParsing(p,token)}}function endTagInText(p,token){var _a;if(token.tagID===TAG_ID.SCRIPT){(_a=p.scriptHandler)===null||_a===void 0?void 0:_a.call(p,p.openElements.current)}p.openElements.pop();p.insertionMode=p.originalInsertionMode}function eofInText(p,token){p._err(token,ERR.eofInElementThatCanContainOnlyText);p.openElements.pop();p.insertionMode=p.originalInsertionMode;p.onEof(token)}function characterInTable(p,token){if(p.openElements.currentTagId!==void 0&&TABLE_STRUCTURE_TAGS.has(p.openElements.currentTagId)){p.pendingCharacterTokens.length=0;p.hasNonWhitespacePendingCharacterToken=false;p.originalInsertionMode=p.insertionMode;p.insertionMode=InsertionMode.IN_TABLE_TEXT;switch(token.type){case TokenType.CHARACTER:{characterInTableText(p,token);break}case TokenType.WHITESPACE_CHARACTER:{whitespaceCharacterInTableText(p,token);break}}}else{tokenInTable(p,token)}}function captionStartTagInTable(p,token){p.openElements.clearBackToTableContext();p.activeFormattingElements.insertMarker();p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_CAPTION}function colgroupStartTagInTable(p,token){p.openElements.clearBackToTableContext();p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_COLUMN_GROUP}function colStartTagInTable(p,token){p.openElements.clearBackToTableContext();p._insertFakeElement(TAG_NAMES.COLGROUP,TAG_ID.COLGROUP);p.insertionMode=InsertionMode.IN_COLUMN_GROUP;startTagInColumnGroup(p,token)}function tbodyStartTagInTable(p,token){p.openElements.clearBackToTableContext();p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_TABLE_BODY}function tdStartTagInTable(p,token){p.openElements.clearBackToTableContext();p._insertFakeElement(TAG_NAMES.TBODY,TAG_ID.TBODY);p.insertionMode=InsertionMode.IN_TABLE_BODY;startTagInTableBody(p,token)}function tableStartTagInTable(p,token){if(p.openElements.hasInTableScope(TAG_ID.TABLE)){p.openElements.popUntilTagNamePopped(TAG_ID.TABLE);p._resetInsertionMode();p._processStartTag(token)}}function inputStartTagInTable(p,token){if(isHiddenInput(token)){p._appendElement(token,NS.HTML)}else{tokenInTable(p,token)}token.ackSelfClosing=true}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){switch(token.tagID){case TAG_ID.TD:case TAG_ID.TH:case TAG_ID.TR:{tdStartTagInTable(p,token);break}case TAG_ID.STYLE:case TAG_ID.SCRIPT:case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}case TAG_ID.COL:{colStartTagInTable(p,token);break}case TAG_ID.FORM:{formStartTagInTable(p,token);break}case TAG_ID.TABLE:{tableStartTagInTable(p,token);break}case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{tbodyStartTagInTable(p,token);break}case TAG_ID.INPUT:{inputStartTagInTable(p,token);break}case TAG_ID.CAPTION:{captionStartTagInTable(p,token);break}case TAG_ID.COLGROUP:{colgroupStartTagInTable(p,token);break}default:{tokenInTable(p,token)}}}function endTagInTable(p,token){switch(token.tagID){case TAG_ID.TABLE:{if(p.openElements.hasInTableScope(TAG_ID.TABLE)){p.openElements.popUntilTagNamePopped(TAG_ID.TABLE);p._resetInsertionMode()}break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TBODY:case TAG_ID.TD:case TAG_ID.TFOOT:case TAG_ID.TH:case TAG_ID.THEAD:case TAG_ID.TR:{break}default:{tokenInTable(p,token)}}}function tokenInTable(p,token){const savedFosterParentingState=p.fosterParentingEnabled;p.fosterParentingEnabled=true;modeInBody(p,token);p.fosterParentingEnabled=savedFosterParentingState}function whitespaceCharacterInTableText(p,token){p.pendingCharacterTokens.push(token)}function characterInTableText(p,token){p.pendingCharacterTokens.push(token);p.hasNonWhitespacePendingCharacterToken=true}function tokenInTableText(p,token){let i=0;if(p.hasNonWhitespacePendingCharacterToken){for(;i<p.pendingCharacterTokens.length;i++){tokenInTable(p,p.pendingCharacterTokens[i])}}else{for(;i<p.pendingCharacterTokens.length;i++){p._insertCharacters(p.pendingCharacterTokens[i])}}p.insertionMode=p.originalInsertionMode;p._processToken(token)}var TABLE_VOID_ELEMENTS=new Set([TAG_ID.CAPTION,TAG_ID.COL,TAG_ID.COLGROUP,TAG_ID.TBODY,TAG_ID.TD,TAG_ID.TFOOT,TAG_ID.TH,TAG_ID.THEAD,TAG_ID.TR]);function startTagInCaption(p,token){const tn=token.tagID;if(TABLE_VOID_ELEMENTS.has(tn)){if(p.openElements.hasInTableScope(TAG_ID.CAPTION)){p.openElements.generateImpliedEndTags();p.openElements.popUntilTagNamePopped(TAG_ID.CAPTION);p.activeFormattingElements.clearToLastMarker();p.insertionMode=InsertionMode.IN_TABLE;startTagInTable(p,token)}}else{startTagInBody(p,token)}}function endTagInCaption(p,token){const tn=token.tagID;switch(tn){case TAG_ID.CAPTION:case TAG_ID.TABLE:{if(p.openElements.hasInTableScope(TAG_ID.CAPTION)){p.openElements.generateImpliedEndTags();p.openElements.popUntilTagNamePopped(TAG_ID.CAPTION);p.activeFormattingElements.clearToLastMarker();p.insertionMode=InsertionMode.IN_TABLE;if(tn===TAG_ID.TABLE){endTagInTable(p,token)}}break}case TAG_ID.BODY:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TBODY:case TAG_ID.TD:case TAG_ID.TFOOT:case TAG_ID.TH:case TAG_ID.THEAD:case TAG_ID.TR:{break}default:{endTagInBody(p,token)}}}function startTagInColumnGroup(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.COL:{p._appendElement(token,NS.HTML);token.ackSelfClosing=true;break}case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}default:{tokenInColumnGroup(p,token)}}}function endTagInColumnGroup(p,token){switch(token.tagID){case TAG_ID.COLGROUP:{if(p.openElements.currentTagId===TAG_ID.COLGROUP){p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE}break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}case TAG_ID.COL:{break}default:{tokenInColumnGroup(p,token)}}}function tokenInColumnGroup(p,token){if(p.openElements.currentTagId===TAG_ID.COLGROUP){p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE;p._processToken(token)}}function startTagInTableBody(p,token){switch(token.tagID){case TAG_ID.TR:{p.openElements.clearBackToTableBodyContext();p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_ROW;break}case TAG_ID.TH:case TAG_ID.TD:{p.openElements.clearBackToTableBodyContext();p._insertFakeElement(TAG_NAMES.TR,TAG_ID.TR);p.insertionMode=InsertionMode.IN_ROW;startTagInRow(p,token);break}case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{if(p.openElements.hasTableBodyContextInTableScope()){p.openElements.clearBackToTableBodyContext();p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE;startTagInTable(p,token)}break}default:{startTagInTable(p,token)}}}function endTagInTableBody(p,token){const tn=token.tagID;switch(token.tagID){case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{if(p.openElements.hasInTableScope(tn)){p.openElements.clearBackToTableBodyContext();p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE}break}case TAG_ID.TABLE:{if(p.openElements.hasTableBodyContextInTableScope()){p.openElements.clearBackToTableBodyContext();p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE;endTagInTable(p,token)}break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TD:case TAG_ID.TH:case TAG_ID.TR:{break}default:{endTagInTable(p,token)}}}function startTagInRow(p,token){switch(token.tagID){case TAG_ID.TH:case TAG_ID.TD:{p.openElements.clearBackToTableRowContext();p._insertElement(token,NS.HTML);p.insertionMode=InsertionMode.IN_CELL;p.activeFormattingElements.insertMarker();break}case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:case TAG_ID.TR:{if(p.openElements.hasInTableScope(TAG_ID.TR)){p.openElements.clearBackToTableRowContext();p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE_BODY;startTagInTableBody(p,token)}break}default:{startTagInTable(p,token)}}}function endTagInRow(p,token){switch(token.tagID){case TAG_ID.TR:{if(p.openElements.hasInTableScope(TAG_ID.TR)){p.openElements.clearBackToTableRowContext();p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE_BODY}break}case TAG_ID.TABLE:{if(p.openElements.hasInTableScope(TAG_ID.TR)){p.openElements.clearBackToTableRowContext();p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE_BODY;endTagInTableBody(p,token)}break}case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{if(p.openElements.hasInTableScope(token.tagID)||p.openElements.hasInTableScope(TAG_ID.TR)){p.openElements.clearBackToTableRowContext();p.openElements.pop();p.insertionMode=InsertionMode.IN_TABLE_BODY;endTagInTableBody(p,token)}break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TD:case TAG_ID.TH:{break}default:{endTagInTable(p,token)}}}function startTagInCell(p,token){const tn=token.tagID;if(TABLE_VOID_ELEMENTS.has(tn)){if(p.openElements.hasInTableScope(TAG_ID.TD)||p.openElements.hasInTableScope(TAG_ID.TH)){p._closeTableCell();startTagInRow(p,token)}}else{startTagInBody(p,token)}}function endTagInCell(p,token){const tn=token.tagID;switch(tn){case TAG_ID.TD:case TAG_ID.TH:{if(p.openElements.hasInTableScope(tn)){p.openElements.generateImpliedEndTags();p.openElements.popUntilTagNamePopped(tn);p.activeFormattingElements.clearToLastMarker();p.insertionMode=InsertionMode.IN_ROW}break}case TAG_ID.TABLE:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:case TAG_ID.TR:{if(p.openElements.hasInTableScope(tn)){p._closeTableCell();endTagInRow(p,token)}break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:{break}default:{endTagInBody(p,token)}}}function startTagInSelect(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.OPTION:{if(p.openElements.currentTagId===TAG_ID.OPTION){p.openElements.pop()}p._insertElement(token,NS.HTML);break}case TAG_ID.OPTGROUP:{if(p.openElements.currentTagId===TAG_ID.OPTION){p.openElements.pop()}if(p.openElements.currentTagId===TAG_ID.OPTGROUP){p.openElements.pop()}p._insertElement(token,NS.HTML);break}case TAG_ID.HR:{if(p.openElements.currentTagId===TAG_ID.OPTION){p.openElements.pop()}if(p.openElements.currentTagId===TAG_ID.OPTGROUP){p.openElements.pop()}p._appendElement(token,NS.HTML);token.ackSelfClosing=true;break}case TAG_ID.INPUT:case TAG_ID.KEYGEN:case TAG_ID.TEXTAREA:case TAG_ID.SELECT:{if(p.openElements.hasInSelectScope(TAG_ID.SELECT)){p.openElements.popUntilTagNamePopped(TAG_ID.SELECT);p._resetInsertionMode();if(token.tagID!==TAG_ID.SELECT){p._processStartTag(token)}}break}case TAG_ID.SCRIPT:case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}default:}}function endTagInSelect(p,token){switch(token.tagID){case TAG_ID.OPTGROUP:{if(p.openElements.stackTop>0&&p.openElements.currentTagId===TAG_ID.OPTION&&p.openElements.tagIDs[p.openElements.stackTop-1]===TAG_ID.OPTGROUP){p.openElements.pop()}if(p.openElements.currentTagId===TAG_ID.OPTGROUP){p.openElements.pop()}break}case TAG_ID.OPTION:{if(p.openElements.currentTagId===TAG_ID.OPTION){p.openElements.pop()}break}case TAG_ID.SELECT:{if(p.openElements.hasInSelectScope(TAG_ID.SELECT)){p.openElements.popUntilTagNamePopped(TAG_ID.SELECT);p._resetInsertionMode()}break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:}}function startTagInSelectInTable(p,token){const tn=token.tagID;if(tn===TAG_ID.CAPTION||tn===TAG_ID.TABLE||tn===TAG_ID.TBODY||tn===TAG_ID.TFOOT||tn===TAG_ID.THEAD||tn===TAG_ID.TR||tn===TAG_ID.TD||tn===TAG_ID.TH){p.openElements.popUntilTagNamePopped(TAG_ID.SELECT);p._resetInsertionMode();p._processStartTag(token)}else{startTagInSelect(p,token)}}function endTagInSelectInTable(p,token){const tn=token.tagID;if(tn===TAG_ID.CAPTION||tn===TAG_ID.TABLE||tn===TAG_ID.TBODY||tn===TAG_ID.TFOOT||tn===TAG_ID.THEAD||tn===TAG_ID.TR||tn===TAG_ID.TD||tn===TAG_ID.TH){if(p.openElements.hasInTableScope(tn)){p.openElements.popUntilTagNamePopped(TAG_ID.SELECT);p._resetInsertionMode();p.onEndTag(token)}}else{endTagInSelect(p,token)}}function startTagInTemplate(p,token){switch(token.tagID){case TAG_ID.BASE:case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.NOFRAMES:case TAG_ID.SCRIPT:case TAG_ID.STYLE:case TAG_ID.TEMPLATE:case TAG_ID.TITLE:{startTagInHead(p,token);break}case TAG_ID.CAPTION:case TAG_ID.COLGROUP:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{p.tmplInsertionModeStack[0]=InsertionMode.IN_TABLE;p.insertionMode=InsertionMode.IN_TABLE;startTagInTable(p,token);break}case TAG_ID.COL:{p.tmplInsertionModeStack[0]=InsertionMode.IN_COLUMN_GROUP;p.insertionMode=InsertionMode.IN_COLUMN_GROUP;startTagInColumnGroup(p,token);break}case TAG_ID.TR:{p.tmplInsertionModeStack[0]=InsertionMode.IN_TABLE_BODY;p.insertionMode=InsertionMode.IN_TABLE_BODY;startTagInTableBody(p,token);break}case TAG_ID.TD:case TAG_ID.TH:{p.tmplInsertionModeStack[0]=InsertionMode.IN_ROW;p.insertionMode=InsertionMode.IN_ROW;startTagInRow(p,token);break}default:{p.tmplInsertionModeStack[0]=InsertionMode.IN_BODY;p.insertionMode=InsertionMode.IN_BODY;startTagInBody(p,token)}}}function endTagInTemplate(p,token){if(token.tagID===TAG_ID.TEMPLATE){templateEndTagInHead(p,token)}}function eofInTemplate(p,token){if(p.openElements.tmplCount>0){p.openElements.popUntilTagNamePopped(TAG_ID.TEMPLATE);p.activeFormattingElements.clearToLastMarker();p.tmplInsertionModeStack.shift();p._resetInsertionMode();p.onEof(token)}else{stopParsing(p,token)}}function startTagAfterBody(p,token){if(token.tagID===TAG_ID.HTML){startTagInBody(p,token)}else{tokenAfterBody(p,token)}}function endTagAfterBody(p,token){var _a;if(token.tagID===TAG_ID.HTML){if(!p.fragmentContext){p.insertionMode=InsertionMode.AFTER_AFTER_BODY}if(p.options.sourceCodeLocationInfo&&p.openElements.tagIDs[0]===TAG_ID.HTML){p._setEndLocation(p.openElements.items[0],token);const bodyElement=p.openElements.items[1];if(bodyElement&&!((_a=p.treeAdapter.getNodeSourceCodeLocation(bodyElement))===null||_a===void 0?void 0:_a.endTag)){p._setEndLocation(bodyElement,token)}}}else{tokenAfterBody(p,token)}}function tokenAfterBody(p,token){p.insertionMode=InsertionMode.IN_BODY;modeInBody(p,token)}function startTagInFrameset(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.FRAMESET:{p._insertElement(token,NS.HTML);break}case TAG_ID.FRAME:{p._appendElement(token,NS.HTML);token.ackSelfClosing=true;break}case TAG_ID.NOFRAMES:{startTagInHead(p,token);break}default:}}function endTagInFrameset(p,token){if(token.tagID===TAG_ID.FRAMESET&&!p.openElements.isRootHtmlElementCurrent()){p.openElements.pop();if(!p.fragmentContext&&p.openElements.currentTagId!==TAG_ID.FRAMESET){p.insertionMode=InsertionMode.AFTER_FRAMESET}}}function startTagAfterFrameset(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.NOFRAMES:{startTagInHead(p,token);break}default:}}function endTagAfterFrameset(p,token){if(token.tagID===TAG_ID.HTML){p.insertionMode=InsertionMode.AFTER_AFTER_FRAMESET}}function startTagAfterAfterBody(p,token){if(token.tagID===TAG_ID.HTML){startTagInBody(p,token)}else{tokenAfterAfterBody(p,token)}}function tokenAfterAfterBody(p,token){p.insertionMode=InsertionMode.IN_BODY;modeInBody(p,token)}function startTagAfterAfterFrameset(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.NOFRAMES:{startTagInHead(p,token);break}default:}}function nullCharacterInForeignContent(p,token){token.chars=REPLACEMENT_CHARACTER;p._insertCharacters(token)}function characterInForeignContent(p,token){p._insertCharacters(token);p.framesetOk=false}function popUntilHtmlOrIntegrationPoint(p){while(p.treeAdapter.getNamespaceURI(p.openElements.current)!==NS.HTML&&p.openElements.currentTagId!==void 0&&!p._isIntegrationPoint(p.openElements.currentTagId,p.openElements.current)){p.openElements.pop()}}function startTagInForeignContent(p,token){if(causesExit(token)){popUntilHtmlOrIntegrationPoint(p);p._startTagOutsideForeignContent(token)}else{const current=p._getAdjustedCurrentElement();const currentNs=p.treeAdapter.getNamespaceURI(current);if(currentNs===NS.MATHML){adjustTokenMathMLAttrs(token)}else if(currentNs===NS.SVG){adjustTokenSVGTagName(token);adjustTokenSVGAttrs(token)}adjustTokenXMLAttrs(token);if(token.selfClosing){p._appendElement(token,currentNs)}else{p._insertElement(token,currentNs)}token.ackSelfClosing=true}}function endTagInForeignContent(p,token){if(token.tagID===TAG_ID.P||token.tagID===TAG_ID.BR){popUntilHtmlOrIntegrationPoint(p);p._endTagOutsideForeignContent(token);return}for(let i=p.openElements.stackTop;i>0;i--){const element=p.openElements.items[i];if(p.treeAdapter.getNamespaceURI(element)===NS.HTML){p._endTagOutsideForeignContent(token);break}const tagName=p.treeAdapter.getTagName(element);if(tagName.toLowerCase()===token.tagName){token.tagName=tagName;p.openElements.shortenToLength(i);break}}}var VOID_ELEMENTS=new Set([TAG_NAMES.AREA,TAG_NAMES.BASE,TAG_NAMES.BASEFONT,TAG_NAMES.BGSOUND,TAG_NAMES.BR,TAG_NAMES.COL,TAG_NAMES.EMBED,TAG_NAMES.FRAME,TAG_NAMES.HR,TAG_NAMES.IMG,TAG_NAMES.INPUT,TAG_NAMES.KEYGEN,TAG_NAMES.LINK,TAG_NAMES.META,TAG_NAMES.PARAM,TAG_NAMES.SOURCE,TAG_NAMES.TRACK,TAG_NAMES.WBR]);function parse(html,options){return Parser.parse(html,options)}function getAttribute(node,name){return node.attrs?.find(item=>item.name.toLowerCase()===name.toLowerCase())?.value??null}function getText(node){if(node.nodeName==="#text")return node.value??"";return(node.childNodes??[]).map(getText).join("")}function cleanText(value){const cleaned=value?.replace(/\s+/g," ").trim();return cleaned||null}function extractSeoData(html){const document=parse(html);const result={title:null,description:null,canonical:null,robots:null,lang:null,h1Count:0,openGraph:{title:null,description:null,image:null},twitter:{card:null,title:null,description:null,image:null},hreflang:[],jsonLd:[],images:[],links:[],wordCount:0,visibleText:""};const textParts=[];function visit(node,hidden=false){const tagName=node.tagName?.toLowerCase();const excludesText=hidden||tagName==="script"||tagName==="style"||tagName==="noscript"||tagName==="template";if(node.nodeName==="#text"&&!excludesText){const text=cleanText(node.value);if(text)textParts.push(text)}if(tagName==="html"&&result.lang===null)result.lang=cleanText(getAttribute(node,"lang"));if(tagName==="title"&&result.title===null)result.title=cleanText(getText(node));if(tagName==="h1")result.h1Count+=1;if(tagName==="meta"){const name=getAttribute(node,"name")?.toLowerCase();const property=getAttribute(node,"property")?.toLowerCase();const content=cleanText(getAttribute(node,"content"));if(name==="description"&&result.description===null)result.description=content;else if(name==="robots"&&result.robots===null)result.robots=content;else if(property==="og:title"&&result.openGraph.title===null)result.openGraph.title=content;else if(property==="og:description"&&result.openGraph.description===null)result.openGraph.description=content;else if(property==="og:image"&&result.openGraph.image===null)result.openGraph.image=content;else if(name==="twitter:card"&&result.twitter.card===null)result.twitter.card=content;else if(name==="twitter:title"&&result.twitter.title===null)result.twitter.title=content;else if(name==="twitter:description"&&result.twitter.description===null)result.twitter.description=content;else if(name==="twitter:image"&&result.twitter.image===null)result.twitter.image=content}if(tagName==="link"){const rel=getAttribute(node,"rel")?.toLowerCase().split(/\s+/).filter(Boolean)??[];if(rel.includes("canonical")&&result.canonical===null)result.canonical=cleanText(getAttribute(node,"href"));if(rel.includes("alternate")){const lang=cleanText(getAttribute(node,"hreflang"));const url=cleanText(getAttribute(node,"href"));if(lang&&url)result.hreflang.push({lang,url})}}if(tagName==="a"){const href=getAttribute(node,"href");if(href)result.links.push(href)}if(tagName==="img"){result.images.push({src:cleanText(getAttribute(node,"src")),alt:getAttribute(node,"alt")})}if(tagName==="script"&&getAttribute(node,"type")?.toLowerCase()==="application/ld+json"){const source=getText(node).trim();if(source){try{result.jsonLd.push({valid:true,value:JSON.parse(source)})}catch(error){result.jsonLd.push({valid:false,error:error instanceof Error?error.message:String(error)})}}}for(const child of node.childNodes??[])visit(child,excludesText)}visit(document);result.visibleText=textParts.join(" ");result.wordCount=result.visibleText?result.visibleText.split(/\s+/u).length:0;return result}function emptyPage(url,depth){return{url,finalUrl:null,status:null,contentType:null,blockedByRobots:false,error:null,title:null,description:null,canonical:null,canonicalRaw:null,robots:null,xRobotsTag:null,lang:null,h1Count:0,openGraph:{title:null,description:null,image:null},twitter:{card:null,title:null,description:null,image:null},hreflang:[],jsonLd:[],images:[],links:[],internalLinks:[],externalLinks:[],wordCount:0,contentHash:null,depth,redirectChain:[],responseBytes:0}}async function emit2(options,event){await options.onEvent?.(event)}async function fetchPage(requestUrl,depth,siteOrigin,options,robots){const page=emptyPage(requestUrl,depth);if(options.respectRobots&&!isAllowedByRobots(requestUrl,robots)){page.blockedByRobots=true;return page}try{const{response,redirectChain}=await fetchWithRetry(requestUrl,{headers:{accept:"text/html,application/xhtml+xml;q=0.9,*/*;q=0.1","user-agent":options.userAgent}},{...options,gate:options.requestGate,onEvent:options.onEvent});const contentType=response.headers.get("content-type")??"";const isHtml=contentType.includes("text/html")||contentType.includes("application/xhtml+xml");const finalUrl=normalizeUrl(response.url,void 0,{includeQuery:options.includeQuery});page.finalUrl=finalUrl;page.status=response.status;page.contentType=contentType||null;page.xRobotsTag=response.headers.get("x-robots-tag");page.redirectChain=redirectChain;if(!isHtml){await response.body?.cancel();return page}const{text:body,bytes}=await readResponseBody(response,options.maxResponseBytes);const seo=extractSeoData(body);const baseUrl=finalUrl??requestUrl;const canonical=seo.canonical?normalizeUrl(seo.canonical,baseUrl,{includeQuery:true}):null;const links=[...new Set(seo.links.map(link=>normalizeUrl(link,baseUrl,{includeQuery:options.includeQuery})).filter(link=>Boolean(link)))].sort();const hreflang=seo.hreflang.map(item=>({lang:item.lang,url:normalizeUrl(item.url,baseUrl,{includeQuery:true})}));Object.assign(page,{...seo,visibleText:void 0,canonical,canonicalRaw:seo.canonical,links,internalLinks:links.filter(link=>isSameOrigin(link,siteOrigin)),externalLinks:links.filter(link=>!isSameOrigin(link,siteOrigin)),hreflang,contentHash:seo.visibleText?createHash4("sha256").update(seo.visibleText.toLowerCase()).digest("hex"):null,responseBytes:bytes});return page}catch(error){if(options.signal?.aborted)throw error;page.error=error instanceof Error?error.message:String(error);if(error instanceof RequestFailure)page.redirectChain=error.redirectChain;return page}}function withDefaults(raw={}){const requestDelay=raw.requestDelay??raw.delay??100;const providedGate=raw.requestGate;return{...raw,maxPages:raw.maxPages??100,concurrency:Math.max(1,raw.concurrency??5),timeout:raw.timeout??1e4,includeQuery:raw.includeQuery??false,respectRobots:raw.respectRobots??true,sitemap:raw.sitemap??null,sitemapData:raw.sitemapData??null,userAgent:raw.userAgent??DEFAULT_USER_AGENT,requestDelay,requestGate:providedGate?async url=>providedGate(url):createPerOriginRequestGate(requestDelay),maxRedirects:raw.maxRedirects??10,maxResponseBytes:raw.maxResponseBytes??5*1024*1024,retries:raw.retries??2,fetch:raw.fetch??globalThis.fetch,logger:raw.logger??NOOP_LOGGER}}async function runPool(concurrency,next){const output=[];const workers=Array.from({length:concurrency},async()=>{while(true){const value=await next();if(value===null)return;output.push(value)}});await Promise.all(workers);return output}async function crawlSite(inputUrl,rawOptions={}){const startedAt=Date.now();const options=withDefaults(rawOptions);const startUrl=normalizeUrl(inputUrl,void 0,{includeQuery:options.includeQuery});if(!startUrl)throw new Error(`invalid start URL: ${inputUrl}`);const origin=new URL(startUrl).origin;await emit2(options,{type:"scan-start",url:startUrl,total:options.maxPages});const robots=rawOptions.robots??await fetchRobots(startUrl,options);let sitemap=options.sitemapData;if(!sitemap&&options.sitemap){try{sitemap=await loadSitemapUrls(options.sitemap,{...options,maxUrls:rawOptions.sitemapMaxUrls??5e4,siteOrigin:origin})}catch(error){sitemap={url:options.sitemap,urls:[],sitemapCount:0,truncated:false,error:error instanceof Error?error.message:String(error)};options.logger.warn(`Could not load sitemap ${options.sitemap}: ${sitemap.error}`)}}const seeds=[...new Set([startUrl,...sitemap?.urls??[]])];let frontier=seeds.slice(0,options.maxPages).map(url=>({url,depth:0}));const scheduled=new Set(frontier.map(item=>item.url));const cached=new Map((rawOptions.cachedPages??[]).map(page=>[page.url,page]));const pages=new Map;const maxQueueSize=Math.max(options.maxPages*10,options.maxPages);let hasMore=false;while(frontier.length>0&&pages.size<options.maxPages&&!options.signal?.aborted){frontier.sort((left,right)=>left.url.localeCompare(right.url));const remaining=options.maxPages-pages.size;const current=frontier.slice(0,remaining);if(frontier.length>current.length)hasMore=true;let cursor=0;const completed=await runPool(options.concurrency,async()=>{if(options.signal?.aborted||cursor>=current.length)return null;const item=current[cursor++];if(!item)return null;let page=cached.get(item.url);if(!page){try{page=await fetchPage(item.url,item.depth,origin,options,robots)}catch(error){if(options.signal?.aborted)return null;throw error}}pages.set(item.url,page);if(!cached.has(item.url)){await rawOptions.onBatch?.([page]);await options.storage?.saveCheckpoint?.(startUrl,page);await emit2(options,{type:"checkpoint",page,completed:pages.size,total:options.maxPages})}rawOptions.onProgress?.(pages.size,options.maxPages);await emit2(options,{type:"page",completed:pages.size,total:options.maxPages,page});await emit2(options,{type:"progress",completed:pages.size,total:options.maxPages,page});return{item,page}});const next=new Map;for(const{item,page}of completed.sort((left,right)=>left.item.url.localeCompare(right.item.url))){const discoveredLinks=page.internalLinks?.length?page.internalLinks:(page.links??[]).filter(link=>isSameOrigin(link,origin));for(const link of[...discoveredLinks].sort()){if(scheduled.size>=maxQueueSize||scheduled.has(link)||!isCrawlableUrl(link))continue;scheduled.add(link);next.set(link,{url:link,depth:item.depth+1})}}frontier=[...next.values()]}const sortedPages=[...pages.values()].sort((left,right)=>left.url.localeCompare(right.url));const partial=Boolean(options.signal?.aborted);const truncated=partial||hasMore||frontier.length>0||(sitemap?sitemap.urls.length>sortedPages.length:false)||(sitemap?.truncated??false);const result={startUrl,pages:sortedPages,robots,sitemap,truncated,partial,durationMs:Date.now()-startedAt,options};result.snapshot=createBaseline(result);if(!partial)await options.storage?.removeCheckpoint?.(startUrl);if(partial)await emit2(options,{type:"cancelled",completed:sortedPages.length,total:options.maxPages,partial:true});else await emit2(options,{type:"complete",completed:sortedPages.length,total:options.maxPages});return result}function isPlan(input){return"planVersion"in input}function checkpointIdentity(plan){return{schemaVersion:2,pageSchemaVersion:1,siteUrl:plan.startUrl,sitemapUrl:plan.sitemap?.url??null,includeQuery:plan.config.includeQuery,respectRobots:plan.config.respectRobots,timeout:plan.config.timeout,maxRedirects:plan.config.maxRedirects,maxResponseBytes:plan.config.maxResponseBytes,userAgent:plan.userAgent}}function reusableCheckpointPage(page){return!page.error&&(page.status===null||page.status<500)}async function scan(input,options={}){let plannedRobots=null;let plannedSitemap=null;let plan;try{plan=isPlan(input)?input:await planScan(input,{...options,async onEvent(event){if(event.type==="robots")plannedRobots=event.robots;if(event.type==="sitemap")plannedSitemap=event.sitemap;await options.onEvent?.(event)}})}catch(error){if(isPlan(input)||!options.signal?.aborted)throw error;const config2=resolveConfig(input);const startUrl=normalizeUrl(config2.url,void 0,{includeQuery:config2.includeQuery});if(!startUrl)throw new Error(`invalid start URL: ${config2.url}`,{cause:error});const robots=plannedRobots??{url:new URL("/robots.txt",startUrl).href,status:null,sha256:null,error:"Scan cancelled before robots.txt planning completed",denyAll:false};const snapshot=createBaseline({startUrl,pages:[],robots,sitemap:plannedSitemap,options:config2,partial:true,truncated:true});await options.checkpointStore?.flush?.();await options.onEvent?.({type:"cancelled",completed:0,total:config2.maxPages,partial:true});return{snapshot,startUrl,pages:[],robots,sitemap:plannedSitemap,truncated:true,partial:true,durationMs:0,options:config2}}if(plan.planVersion!==1)throw new Error(`unsupported scan plan version: ${String(plan.planVersion)}`);const limit=options.limit??plan.config.maxPages;if(!Number.isInteger(limit)||limit<=0)throw new Error("scan limit must be a positive integer");const config={...plan.config,maxPages:limit};const requestGate=createPerOriginRequestGate(config.delay);const identity=checkpointIdentity(plan);const checkpoint=options.checkpointStore&&options.resume!==false?await options.checkpointStore.load(identity):null;const cachedPages=[...options.cachedPages??[],...checkpoint?.pages.filter(reusableCheckpointPage)??[]];const uniqueCachedPages=[...new Map(cachedPages.map(page=>[page.url,page])).values()];if(uniqueCachedPages.length>0){await options.onEvent?.({type:"resume",completed:uniqueCachedPages.length,total:limit})}const result=await crawlSite(plan.startUrl,{...options,maxPages:limit,concurrency:config.concurrency,requestDelay:config.delay,timeout:config.timeout,respectRobots:config.respectRobots,includeQuery:config.includeQuery,maxRedirects:config.maxRedirects,maxResponseBytes:config.maxResponseBytes,enabledRules:config.enabledRules,severityOverrides:config.severityOverrides,suppressions:config.suppressions,regressionBudgets:config.regressionBudgets,report:config.report,requestGate,robots:plan.robots,sitemap:plan.sitemap?.url??null,sitemapData:plan.sitemap,userAgent:plan.userAgent,cachedPages:uniqueCachedPages,async onBatch(pages){for(const page of pages)await options.checkpointStore?.append(identity,page);await options.onBatch?.(pages)}});await options.checkpointStore?.flush?.();if(!result.partial&&!options.retainCheckpoint){await options.checkpointStore?.clear(identity)}return result}function segmentToken(segment){if(/^\d+$/.test(segment))return":id";if(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(segment))return":uuid";if(/^\d{4}-\d{2}-\d{2}$/.test(segment))return":date";if(/^[0-9a-f]{16,}$/i.test(segment))return":hash";return null}function parseIssueUrls(issues){return issues.flatMap(issue=>{try{const url=new URL(issue.url);return[{issue,url,segments:url.pathname.split("/").filter(Boolean)}]}catch{return[]}})}function dynamicSegments(pages){const siblings=new Map;for(const page of pages){for(let index=1;index<page.segments.length;index+=1){if(segmentToken(page.segments[index]))continue;const prefix=page.segments.slice(0,index).join("/");const key=`${page.url.origin}|${page.segments.length}|${index}|${prefix}`;const values=siblings.get(key)??new Set;values.add(page.segments[index]);siblings.set(key,values)}}return new Set([...siblings].filter(([,values])=>values.size>=2).map(([key])=>key))}function templateFor(page,dynamic){const segments=page.segments.map((segment,index)=>{const token=segmentToken(segment);if(token)return token;const prefix=page.segments.slice(0,index).join("/");const key=`${page.url.origin}|${page.segments.length}|${index}|${prefix}`;return index>0&&dynamic.has(key)?":slug":segment});return`/${segments.join("/")}${page.url.pathname.endsWith("/")&&segments.length>0?"/":""}`}function groupIssuesByTemplate(issues){const pages=parseIssueUrls(issues);const dynamic=dynamicSegments(pages);const grouped=new Map;for(const page of pages){const template=templateFor(page,dynamic);const key=`${page.url.origin}${template}`;const group=grouped.get(key)??{origin:page.url.origin,template,issues:[],urls:new Set};group.issues.push(page.issue);group.urls.add(page.issue.url);grouped.set(key,group)}return[...grouped.values()].map(group=>{const severities={error:0,warning:0,info:0};const rules={};const owners={};for(const issue of group.issues){severities[issue.severity]+=1;rules[issue.ruleId]=(rules[issue.ruleId]??0)+1;owners[issue.owner]=(owners[issue.owner]??0)+1}const urls=[...group.urls].sort();return{origin:group.origin,template:group.template,issueCount:group.issues.length,affectedPages:urls.length,severities,rules,owners,urls,representativeUrls:urls.slice(0,3)}}).sort((left,right)=>right.issueCount-left.issueCount||left.template.localeCompare(right.template)||left.origin.localeCompare(right.origin))}function englishRuleLabel(ruleId){const text=ruleId.replaceAll("-"," ");return text.charAt(0).toUpperCase()+text.slice(1)}var UK_RULE_LABELS={"page-unreachable":"\u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430","http-error":"HTTP-\u043F\u043E\u043C\u0438\u043B\u043A\u0430",noindex:"Noindex","x-robots-noindex":"Noindex \u0443 X-Robots-Tag","robots-blocked":"\u0417\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E robots.txt","missing-canonical":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 canonical","invalid-canonical":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 canonical","cross-domain-canonical":"Canonical \u043D\u0430 \u0456\u043D\u0448\u043E\u043C\u0443 \u0434\u043E\u043C\u0435\u043D\u0456","canonical-target-error":"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0446\u0456\u043B\u0456 canonical","redirect-loop":"\u0426\u0438\u043A\u043B \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","long-redirect-chain":"\u0414\u043E\u0432\u0433\u0438\u0439 \u043B\u0430\u043D\u0446\u044E\u0436\u043E\u043A \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","sitemap-unavailable":"Sitemap \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439","noindex-in-sitemap":"Noindex \u0443 sitemap","redirect-in-sitemap":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0443 sitemap","missing-title":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 title","duplicate-title":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 title","title-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title","missing-description":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 description","duplicate-description":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 description","description-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description","missing-h1":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 H1","broken-internal-link":"\u041D\u0435\u0440\u043E\u0431\u043E\u0447\u0435 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F","orphan-sitemap-page":"\u0406\u0437\u043E\u043B\u044C\u043E\u0432\u0430\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 sitemap","crawlable-not-in-sitemap":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap","invalid-hreflang":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 hreflang","malformed-json-ld":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON-LD","http-on-https-site":"HTTP URL \u043D\u0430 HTTPS-\u0441\u0430\u0439\u0442\u0456","invalid-language":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435 \u043E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438","duplicate-content":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442","multiple-h1":"\u041A\u0456\u043B\u044C\u043A\u0430 H1","missing-open-graph":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Open Graph metadata","missing-twitter-metadata":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Twitter metadata","image-missing-alt":"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0431\u0435\u0437 alt","low-word-count":"\u041C\u0430\u043B\u043E \u0442\u0435\u043A\u0441\u0442\u0443","robots-changed":"robots.txt \u0437\u043C\u0456\u043D\u0435\u043D\u043E","page-missing":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E","status-regression":"\u0420\u0435\u0433\u0440\u0435\u0441\u0456\u044F HTTP-\u0441\u0442\u0430\u0442\u0443\u0441\u0443","new-noindex":"\u041D\u043E\u0432\u0438\u0439 noindex","title-removed":"Title \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","title-changed":"Title \u0437\u043C\u0456\u043D\u0435\u043D\u043E","description-removed":"Description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-removed":"Canonical \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-changed":"Canonical \u0437\u043C\u0456\u043D\u0435\u043D\u043E","h1-removed":"H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","redirect-changed":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E","sitemap-url-count-drop":"\u0417\u043C\u0435\u043D\u0448\u0435\u043D\u043D\u044F URL \u0443 sitemap"};var UK_REMEDIATIONS={"page-unreachable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u043D\u0435\u0457.","http-error":"\u041F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u0443\u0441\u043F\u0456\u0448\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u0435 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F.",noindex:"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0437\u2019\u044F\u0432\u043B\u044F\u0442\u0438\u0441\u044F \u0432 \u043F\u043E\u0448\u0443\u043A\u0443.","x-robots-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex \u0456\u0437 X-Robots-Tag, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0456\u043D\u0434\u0435\u043A\u0441\u0443\u0432\u0430\u0442\u0438\u0441\u044F.","robots-blocked":"\u0414\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 URL \u0443 robots.txt, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438.","missing-canonical":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u0431\u0430\u0436\u0430\u043D\u0438\u0439 canonical URL, \u044F\u043A\u0449\u043E \u043C\u043E\u0436\u043B\u0438\u0432\u0456 \u0434\u0443\u0431\u043B\u0456\u043A\u0430\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0438.","invalid-canonical":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0438\u0439 \u0430\u0431\u043E \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0432\u0456\u0434\u043D\u043E\u0441\u043D\u0438\u0439 HTTP(S) canonical URL.","cross-domain-canonical":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043E\u0432\u043D\u0456\u0448\u043D\u0456\u0439 canonical \u0430\u0431\u043E \u0432\u043A\u0430\u0436\u0456\u0442\u044C \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0438\u0439 URL \u0446\u044C\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0443.","canonical-target-error":"\u0421\u043F\u0440\u044F\u043C\u0443\u0439\u0442\u0435 canonical \u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 URL, \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u0438\u0439 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457.","redirect-loop":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0446\u0438\u043A\u043B\u0456\u0447\u043D\u0438\u0439 \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C.","long-redirect-chain":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0439\u0442\u0435 \u043E\u0434\u0440\u0430\u0437\u0443 \u043D\u0430 \u043A\u0456\u043D\u0446\u0435\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.","sitemap-unavailable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0456 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 XML sitemap.","noindex-in-sitemap":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C URL \u0456\u0437 sitemap \u0430\u0431\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 \u0439\u043E\u0433\u043E \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u044E.","redirect-in-sitemap":"\u0417\u0430\u043C\u0456\u043D\u0456\u0442\u044C URL \u0443 sitemap \u043D\u0430 \u0439\u043E\u0433\u043E \u043A\u0456\u043D\u0446\u0435\u0432\u0443 canonical-\u0430\u0434\u0440\u0435\u0441\u0443.","missing-title":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 \u043E\u043F\u0438\u0441\u043E\u0432\u0438\u0439 HTML title.","duplicate-title":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C title, \u044F\u043A\u0438\u0439 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u043E \u043E\u043F\u0438\u0441\u0443\u0454 \u0446\u044E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443.","title-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C title \u0441\u0442\u0438\u0441\u043B\u0438\u043C \u0456 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u043C, \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 10\u201360 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-description":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","duplicate-description":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 meta description \u0434\u043B\u044F \u0446\u0456\u0454\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.","description-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C description \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043C \u0456 \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0434\u043E\u0432\u0436\u0438\u043D\u043E\u044E 50\u2013160 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-h1":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","broken-internal-link":"\u041E\u043D\u043E\u0432\u0456\u0442\u044C \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0447\u0438 \u0432\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0439\u043E\u0433\u043E \u0446\u0456\u043B\u044C.","orphan-sitemap-page":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0456 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap.","crawlable-not-in-sitemap":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E sitemap \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E \u0432\u0438\u043A\u043B\u044E\u0447\u0456\u0442\u044C \u0457\u0457.","invalid-hreflang":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0456 \u043C\u043E\u0432\u043D\u0456 \u0442\u0435\u0433\u0438 \u0442\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456 HTTP(S) alternate URL.","malformed-json-ld":"\u0412\u0438\u043F\u0440\u0430\u0432\u0442\u0435 JSON-\u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441 \u0443 \u0431\u043B\u043E\u0446\u0456 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043E\u0432\u0430\u043D\u0438\u0445 \u0434\u0430\u043D\u0438\u0445.","http-on-https-site":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 HTTPS \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 URL \u0456 metadata.","invalid-language":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u043C\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u0433 BCP 47 \u0432 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456 html.","duplicate-content":"\u041E\u0431\u2019\u0454\u0434\u043D\u0430\u0439\u0442\u0435 \u0434\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0430\u0431\u043E \u0437\u0440\u043E\u0431\u0456\u0442\u044C \u0457\u0445\u043D\u0456\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0438\u043C.","multiple-h1":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u043E\u0434\u0438\u043D \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 H1 \u043D\u0435 \u0437\u0440\u043E\u0431\u0438\u0442\u044C \u0456\u0454\u0440\u0430\u0440\u0445\u0456\u044E \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0456\u0448\u043E\u044E.","missing-open-graph":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Open Graph title, description \u0442\u0430 image \u0434\u043B\u044F \u043F\u043E\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0432 \u0441\u043E\u0446\u043C\u0435\u0440\u0435\u0436\u0430\u0445.","missing-twitter-metadata":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Twitter card metadata, \u044F\u043A\u0449\u043E \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u0441\u043E\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043F\u0440\u0435\u0432\u2019\u044E.","image-missing-alt":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 alt \u0430\u0431\u043E \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u0439 alt \u0434\u043B\u044F \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u0438\u0445 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C.","low-word-count":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0430\u0442\u043D\u044C\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u043E\u0433\u043E \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0443.","robots-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0437\u043C\u0456\u043D\u0443 robots.txt \u0456 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","page-missing":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0430\u0431\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0457\u0457 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","status-regression":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044E \u0443\u0441\u043F\u0456\u0448\u043D\u0443 HTTP-\u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C.","new-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043D\u043E\u0432\u0438\u0439 noindex, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043D\u0435 \u0434\u043E\u0434\u0430\u043D\u043E \u043D\u0430\u0432\u043C\u0438\u0441\u043D\u043E.","title-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 title.","title-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043C\u0456\u043D\u0435\u043D\u0438\u0439 title.","description-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","canonical-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C canonical.","canonical-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C canonical \u0441\u0432\u0456\u0434\u043E\u043C\u0430 \u0439 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0430.","h1-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","redirect-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0441\u0432\u0456\u0434\u043E\u043C\u0430.","sitemap-url-count-drop":"\u0414\u043E\u0441\u043B\u0456\u0434\u0456\u0442\u044C \u0432\u0442\u0440\u0430\u0442\u0443 URL \u0443 sitemap \u0456 \u043F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u043F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457."};function actual(issue){return issue.evidence?.actual??issue.after}function ukrainianMessage(issue,ruleId){const value=actual(issue);switch(ruleId){case"page-unreachable":case"redirect-loop":return`\u0417\u0430\u043F\u0438\u0442 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430")}`;case"http-error":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u043B\u0430 HTTP ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")}`;case"noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex \u0443 meta";case"x-robots-noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C noindex \u0443 X-Robots-Tag";case"robots-blocked":return issue.before===false?"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt";case"missing-canonical":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C canonical URL";case"invalid-canonical":return"Canonical URL \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439";case"cross-domain-canonical":return"Canonical \u0432\u043A\u0430\u0437\u0443\u0454 \u043D\u0430 \u0456\u043D\u0448\u0438\u0439 \u0434\u043E\u043C\u0435\u043D";case"canonical-target-error":return"\u0426\u0456\u043B\u044C canonical \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430";case"long-redirect-chain":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454 ${String(value??0)} \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C`;case"sitemap-unavailable":return"\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u0438\u0439 sitemap";case"noindex-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 noindex";case"redirect-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0454\u0442\u044C\u0441\u044F";case"missing-title":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 title";case"duplicate-title":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 title";case"title-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-description":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 meta description";case"duplicate-description":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 meta description";case"description-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-h1":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 H1";case"multiple-h1":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C H1 \u0443 \u043A\u0456\u043B\u044C\u043A\u043E\u0441\u0442\u0456: ${String(value??0)}`;case"broken-internal-link":return"\u0412\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0435\u0434\u0435 \u043D\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443";case"orphan-sitemap-page":return"\u041D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C";case"crawlable-not-in-sitemap":return"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap";case"invalid-hreflang":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F hreflang \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"malformed-json-ld":return"\u0411\u043B\u043E\u043A JSON-LD \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON";case"http-on-https-site":return"HTTPS-\u0441\u0430\u0439\u0442 \u043F\u043E\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0439 HTTP URL";case"invalid-language":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438 HTML \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"duplicate-content":return"\u041E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0454 \u0442\u043E\u0447\u043D\u0438\u043C \u0434\u0443\u0431\u043B\u0435\u043C \u0456\u043D\u0448\u043E\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438";case"missing-open-graph":return"Open Graph metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"missing-twitter-metadata":return"Twitter card metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"image-missing-alt":return`${Array.isArray(value)?value.length:String(value??0)} \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C \u043D\u0435 \u043C\u0430\u044E\u0442\u044C \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 alt`;case"low-word-count":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u043E ${String(value??0)} \u0432\u0438\u0434\u0438\u043C\u0438\u0445 \u0441\u043B\u0456\u0432`;case"robots-changed":return"\u0412\u043C\u0456\u0441\u0442 robots.txt \u0437\u043C\u0456\u043D\u0438\u0432\u0441\u044F";case"page-missing":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u0431\u0443\u043B\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E";case"status-regression":return`HTTP-\u0441\u0442\u0430\u0442\u0443\u0441 \u043F\u043E\u0433\u0456\u0440\u0448\u0438\u0432\u0441\u044F \u0437 ${String(issue.before??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")} \u0434\u043E ${String(issue.after??"\u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439")}`;case"new-noindex":return"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex";case"title-removed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"title-changed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"description-removed":return"Meta description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-removed":return"Canonical URL \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-changed":return"Canonical URL \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"h1-removed":return"\u0423\u0441\u0456 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"redirect-changed":return"\u041A\u0456\u043D\u0446\u0435\u0432\u0438\u0439 URL \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"sitemap-url-count-drop":return`\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C URL \u0443 sitemap \u0437\u043C\u0435\u043D\u0448\u0438\u043B\u0430\u0441\u044F \u043D\u0430 ${String((Number(issue.before)||0)-(Number(issue.after)||0))}`;default:return issue.message??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}function localizeIssue(issue,ruleId){const englishRemediation=issue.remediation??"Review the finding and confirm the intended behavior.";return{en:{rule:englishRuleLabel(ruleId),message:issue.message??"",remediation:englishRemediation},uk:{rule:UK_RULE_LABELS[ruleId]??englishRuleLabel(ruleId),message:ukrainianMessage(issue,ruleId),remediation:UK_REMEDIATIONS[ruleId]??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}}var REPORT_COPY={en:{language:"Language",titles:{partial:"Partial SEO scan report",check:"SEO regression report",scan:"SEO baseline audit"},generated:"Generated",engine:"Engine",rules:"Rules",issueLifecycle:"Issue lifecycle",partialTitle:"Partial results.",partialMessage:"This report contains the pages saved so far. Run the same scan command again to resume without requesting them twice.",incompleteTitle:"Incomplete comparison.",incompleteMessage:"Regressions found on checked pages are shown, but unchecked pages are not marked missing or resolved.",previewTitle:"Preview deployment comparison.",production:"Production",preview:"Preview",cards:{pages:"Pages checked",error:"Errors",warning:"Warnings",info:"Info",affected:"Affected pages"},analytics:{title:"Issue statistics",hint:"Select a chart item to filter the issue table.",severity:"By severity",topRules:"Most frequent checks",owners:"By owner",lifecycle:"By lifecycle",templates:"Affected page templates",total:"Total issues",noData:"No issues to chart.",filterBy:"Filter by"},history:{title:"Local scan history",hint:"Issue trends from snapshots stored on this device.",chartLabel:"Issue trend across runs.",runs:"Runs",pages:"Latest pages",newIssues:"New issues",resolvedIssues:"Resolved issues",sitemapUrls:"Sitemap URLs",maxDepth:"Maximum crawl depth"},tabs:{current:"Current / all",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},filters:{search:"URL or text",searchPlaceholder:"URL, check, or message",severity:"Severity",rule:"Check",template:"Page template",owner:"Owner",rows:"Rows"},all:{severity:"All severities",rule:"All checks",template:"All templates",owner:"All owners"},severities:{error:"Error",warning:"Warning",info:"Info"},owners:{seo:"SEO",content:"Content",developer:"Developer"},rows:{100:"100 per page",250:"250 per page",500:"500 per page"},guide:{error:"Errors",errorText:"need attention first.",warning:"Warnings",warningText:"are important improvements.",info:"Info",infoText:"is useful context.",score:"No opaque SEO score is used."},exportCsv:"Export CSV",previous:"Previous",next:"Next",table:{severity:"Severity",lifecycle:"Lifecycle",ruleOwner:"Check / owner",page:"Page",finding:"What was found",change:"Change",before:"Before",evidence:"Evidence / after",remediation:"Remediation",fingerprint:"Fingerprint"},empty:{cleanTitle:"No SEO issues found",cleanMessage:"The scanned pages passed all current checks.",filteredTitle:"No matching issues",filteredMessage:"Try a different lifecycle tab or clear the selected filters.",clear:"Clear filters"},lifecycle:{current:"Current",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},notPresent:"Not present",page:"Page",of:"of",issue:"issue",issues:"issues",docs:"docs",footer:"Generated locally. No report data was uploaded."},uk:{language:"\u041C\u043E\u0432\u0430",titles:{partial:"\u0417\u0432\u0456\u0442 \u0447\u0430\u0441\u0442\u043A\u043E\u0432\u043E\u0433\u043E SEO-\u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",check:"\u0417\u0432\u0456\u0442 \u043F\u0440\u043E SEO-\u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457",scan:"\u0411\u0430\u0437\u043E\u0432\u0438\u0439 SEO-\u0430\u0443\u0434\u0438\u0442"},generated:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E",engine:"\u0420\u0443\u0448\u0456\u0439",rules:"\u041F\u0440\u0430\u0432\u0438\u043B\u0430",issueLifecycle:"\u0421\u0442\u0430\u043D\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",partialTitle:"\u0427\u0430\u0441\u0442\u043A\u043E\u0432\u0456 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0438.",partialMessage:"\u0417\u0432\u0456\u0442 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0443\u0436\u0435 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438. \u0417\u0430\u043F\u0443\u0441\u0442\u0456\u0442\u044C \u0442\u0443 \u0441\u0430\u043C\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0449\u0435 \u0440\u0430\u0437, \u0449\u043E\u0431 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0431\u0435\u0437 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0438\u0445 \u0437\u0430\u043F\u0438\u0442\u0456\u0432.",incompleteTitle:"\u041D\u0435\u043F\u043E\u0432\u043D\u0435 \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F.",incompleteMessage:"\u041F\u043E\u043A\u0430\u0437\u0430\u043D\u043E \u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457 \u043D\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430\u0445, \u0430\u043B\u0435 \u043D\u0435\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043D\u0435 \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u044F\u043A \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456 \u0447\u0438 \u0432\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456.",previewTitle:"\u041F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F production \u0456 preview.",production:"Production",preview:"Preview",cards:{pages:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A",error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",affected:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438"},analytics:{title:"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",hint:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u0433\u0440\u0430\u0444\u0456\u043A\u0430, \u0449\u043E\u0431 \u0432\u0456\u0434\u0444\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044E \u043F\u0440\u043E\u0431\u043B\u0435\u043C.",severity:"\u0417\u0430 \u0432\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044E",topRules:"\u041D\u0430\u0439\u0447\u0430\u0441\u0442\u0456\u0448\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",owners:"\u0417\u0430 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u043C\u0438",lifecycle:"\u0417\u0430 \u0441\u0442\u0430\u043D\u043E\u043C",templates:"\u0428\u0430\u0431\u043B\u043E\u043D\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0456\u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438",total:"\u0423\u0441\u044C\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C",noData:"\u041D\u0435\u043C\u0430\u0454 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0434\u043B\u044F \u0432\u0456\u0434\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F.",filterBy:"\u0424\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0437\u0430"},history:{title:"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u0430 \u0456\u0441\u0442\u043E\u0440\u0456\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u044C",hint:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0456 snapshot-\u0444\u0430\u0439\u043B\u0456\u0432, \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0445 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457.",chartLabel:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u043C\u0438.",runs:"\u0417\u0430\u043F\u0443\u0441\u043A\u0438",pages:"\u0421\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0432\u043E\u0441\u0442\u0430\u043D\u043D\u0454",newIssues:"\u041D\u043E\u0432\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",resolvedIssues:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",sitemapUrls:"URL \u0443 sitemap",maxDepth:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u0433\u043B\u0438\u0431\u0438\u043D\u0430"},tabs:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0456 / \u0443\u0441\u0456",new:"\u041D\u043E\u0432\u0456",ongoing:"\u0422\u0440\u0438\u0432\u0430\u044E\u0442\u044C",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},filters:{search:"URL \u0430\u0431\u043E \u0442\u0435\u043A\u0441\u0442",searchPlaceholder:"URL, \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0430\u0431\u043E \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",rule:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430",template:"\u0428\u0430\u0431\u043B\u043E\u043D \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438",owner:"\u0412\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",rows:"\u0420\u044F\u0434\u043A\u0438"},all:{severity:"\u0423\u0441\u0456 \u0440\u0456\u0432\u043D\u0456",rule:"\u0423\u0441\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",template:"\u0423\u0441\u0456 \u0448\u0430\u0431\u043B\u043E\u043D\u0438",owner:"\u0423\u0441\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0456"},severities:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F"},owners:{seo:"SEO",content:"\u041A\u043E\u043D\u0442\u0435\u043D\u0442",developer:"\u0420\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A"},rows:{100:"100 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",250:"250 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",500:"500 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443"},guide:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",errorText:"\u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u043F\u0435\u0440\u0448\u043E\u0447\u0435\u0440\u0433\u043E\u0432\u043E\u0457 \u0443\u0432\u0430\u0433\u0438.",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",warningText:"\u043F\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442\u044C \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u043F\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u043D\u044F.",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",infoText:"\u0434\u0430\u0454 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442.",score:"\u041D\u0435\u043F\u0440\u043E\u0437\u043E\u0440\u0430 SEO-\u043E\u0446\u0456\u043D\u043A\u0430 \u043D\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F."},exportCsv:"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 CSV",previous:"\u041D\u0430\u0437\u0430\u0434",next:"\u0414\u0430\u043B\u0456",table:{severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",lifecycle:"\u0421\u0442\u0430\u043D",ruleOwner:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 / \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",finding:"\u0429\u043E \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",change:"\u0417\u043C\u0456\u043D\u0430",before:"\u0411\u0443\u043B\u043E",evidence:"\u0414\u043E\u043A\u0430\u0437 / \u0441\u0442\u0430\u043B\u043E",remediation:"\u042F\u043A \u0432\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438",fingerprint:"\u0412\u0456\u0434\u0431\u0438\u0442\u043E\u043A"},empty:{cleanTitle:"SEO-\u043F\u0440\u043E\u0431\u043B\u0435\u043C \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",cleanMessage:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043F\u0440\u043E\u0439\u0448\u043B\u0438 \u0432\u0441\u0456 \u0430\u043A\u0442\u0438\u0432\u043D\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438.",filteredTitle:"\u0417\u0431\u0456\u0433\u0456\u0432 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",filteredMessage:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0456\u043D\u0448\u0438\u0439 \u0441\u0442\u0430\u043D \u0430\u0431\u043E \u043E\u0447\u0438\u0441\u0442\u044C\u0442\u0435 \u0444\u0456\u043B\u044C\u0442\u0440\u0438.",clear:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0438"},lifecycle:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0430",new:"\u041D\u043E\u0432\u0430",ongoing:"\u0422\u0440\u0438\u0432\u0430\u0454",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},notPresent:"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0454",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",of:"\u0437",issue:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430",issues:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C",docs:"\u0434\u043E\u0432\u0456\u0434\u043A\u0430",footer:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E. \u0414\u0430\u043D\u0456 \u0437\u0432\u0456\u0442\u0443 \u043D\u0456\u043A\u0443\u0434\u0438 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0443\u0432\u0430\u043B\u0438\u0441\u044F."}};function escapeHtml(value){return String(value??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#039;")}function safeJson(value){return JSON.stringify(value).replaceAll("<","\\u003c").replaceAll(">","\\u003e").replaceAll("&","\\u0026")}function normalizeIssue(candidate,fallbackLifecycle="current"){const ruleId=candidate.ruleId??candidate.rule??"unknown";return{fingerprint:candidate.fingerprint??"legacy",ruleId,rule:candidate.rule??candidate.ruleId??"unknown",severity:candidate.severity??"info",scope:candidate.scope??"page",url:candidate.url??"",message:candidate.message??"",evidence:candidate.evidence??{actual:candidate.after},owner:candidate.owner??"seo",remediation:candidate.remediation??"Review the finding and confirm the intended behavior.",documentationUrl:candidate.documentationUrl??"https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md",before:candidate.before,after:candidate.after,lifecycle:candidate.lifecycle??fallbackLifecycle,template:"",localized:localizeIssue(candidate,ruleId)}}function countIssues(issues,key){return issues.reduce((counts,issue)=>{const value=String(issue[key]);counts[value]=(counts[value]??0)+1;return counts},{})}function renderHtmlReport(input,options={}){const mode=input.mode??"scan";const pages=input.pages??[];const current=(input.issues??[]).map(item=>normalizeIssue(item));const lifecycle2=[...(input.newIssues??[]).map(item=>normalizeIssue(item,"new")),...(input.ongoingIssues??[]).map(item=>normalizeIssue(item,"ongoing")),...(input.resolvedIssues??[]).map(item=>normalizeIssue(item,"resolved")),...(input.unchangedIssues??[]).map(item=>normalizeIssue(item,"unchanged"))];const issues=lifecycle2.length>0?lifecycle2:current;const templateGroups=groupIssuesByTemplate(issues);const templateByUrl=new Map(templateGroups.flatMap(group=>group.urls.map(url=>[url,group.template])));for(const issue of issues)issue.template=templateByUrl.get(issue.url)??"";const counts=issues.reduce((summary,item)=>{summary[item.severity]+=1;return summary},{error:0,warning:0,info:0});const affectedPages=new Set(issues.map(item=>item.url)).size;const ruleCounts=countIssues(issues,"rule");const statistics={total:issues.length,pagesChecked:pages.length,targetPages:input.targetPages??null,affectedPages,severity:counts,rules:Object.entries(ruleCounts).map(([id,count])=>({id,count})).sort((left,right)=>right.count-left.count||left.id.localeCompare(right.id)),owners:countIssues(issues,"owner"),lifecycle:countIssues(issues,"lifecycle"),templates:templateGroups.map(({template,issueCount,affectedPages:affectedPages2})=>({template,issueCount,affectedPages:affectedPages2}))};const partial=input.partial??false;const incompleteComparison=mode==="check"&&input.complete===false;const reportTitle=partial?"Partial SEO scan report":mode==="check"?"SEO regression report":"SEO baseline audit";const branding={...input.branding??{},...options.branding??{}};const primaryColor=/^#[0-9a-f]{6}$/i.test(branding.primaryColor??"")?branding.primaryColor:"#3157d5";const logo=branding.logo&&(/^data:image\//.test(branding.logo)||/^https:\/\//.test(branding.logo))?`<img class="logo" src="${escapeHtml(branding.logo)}" alt="${escapeHtml(branding.agencyName??"Report logo")}">`:"";const data=safeJson({mode,issues,statistics,copy:REPORT_COPY,partial,incompleteComparison,comparison:input.comparison??null,history:input.history??null});const generatedAt=input.generatedAt??new Date().toISOString();const startUrl=input.startUrl??"";const targetPages=input.targetPages??null;const isCheck=mode==="check";return`<!doctype html>
4
+ ${stableStringify(identity??null)}`).digest("hex").slice(0,24)}function createIssue(ruleId,url,message,evidence={},identity){let definition=RULES.get(ruleId);if(!definition)throw new Error(`unknown rule: ${ruleId}`);return{fingerprint:issueFingerprint(ruleId,definition.scope,url,identity),ruleId,rule:ruleId,severity:definition.severity,scope:definition.scope,url,message,evidence,owner:definition.owner,remediation:definition.remediation,documentationUrl:`${DOCS_BASE}#${ruleId}`,after:evidence.actual}}function hasDirective(value,directive){return new RegExp(`(^|[\\s,])${directive}($|[\\s,])`,"i").test(value??"")}function validLanguage(language){if(language.toLowerCase()==="x-default")return!0;try{return new Intl.Locale(language),!0}catch{return!1}}function duplicateMap(pages,select){let groups=new Map;for(let page of pages){let value=select(page)?.trim().toLowerCase();if(!value)continue;let urls=groups.get(value)??[];urls.push(page.url),groups.set(value,urls)}return new Map([...groups].filter(([,urls])=>urls.length>1))}function evaluateCurrentRules(snapshot){let issues=[],add=candidate=>{issues.push(candidate)},pageByUrl=new Map(snapshot.pages.map(page=>[page.url,page])),sitemapUrls=new Set(snapshot.sitemap?.urls??[]),titles=duplicateMap(snapshot.pages,page=>page.title),descriptions=duplicateMap(snapshot.pages,page=>page.description),content=duplicateMap(snapshot.pages,page=>page.contentHash);snapshot.sitemap?.error&&add(createIssue("sitemap-unavailable",snapshot.sitemap.url,"The configured sitemap could not be loaded",{actual:snapshot.sitemap.error}));for(let page of snapshot.pages){if(page.blockedByRobots){add(createIssue("robots-blocked",page.url,"Page is blocked by robots.txt",{actual:!0}));continue}if(page.error){add(createIssue(page.error.includes("redirect loop")?"redirect-loop":"page-unreachable",page.url,`Page request failed: ${page.error}`,{actual:page.error,redirectChain:page.redirectChain}));continue}if((page.status===null||page.status>=400)&&add(createIssue("http-error",page.url,`Page returned HTTP ${page.status??"unknown"}`,{actual:page.status})),hasDirective(page.robots,"noindex")&&add(createIssue("noindex",page.url,"Page contains a noindex meta directive",{actual:page.robots})),hasDirective(page.xRobotsTag,"noindex")&&add(createIssue("x-robots-noindex",page.url,"Page contains a noindex X-Robots-Tag",{actual:page.xRobotsTag})),!page.canonicalRaw&&!page.canonical&&add(createIssue("missing-canonical",page.url,"Page does not declare a canonical URL",{actual:null})),page.canonicalRaw&&!page.canonical&&add(createIssue("invalid-canonical",page.url,"Canonical URL is invalid",{actual:page.canonicalRaw})),page.canonical&&new URL(page.canonical).origin!==new URL(snapshot.siteUrl).origin&&add(createIssue("cross-domain-canonical",page.url,"Canonical points to another origin",{actual:page.canonical})),page.canonical){let target=pageByUrl.get(page.canonical);target&&(target.error||(target.status??500)>=400)&&add(createIssue("canonical-target-error",page.url,"Canonical target is unavailable",{target:page.canonical,actual:target.status??target.error},page.canonical))}page.redirectChain.length>3&&add(createIssue("long-redirect-chain",page.url,`Page uses ${page.redirectChain.length} redirects`,{actual:page.redirectChain.length,redirectChain:page.redirectChain})),sitemapUrls.has(page.url)&&(hasDirective(page.robots,"noindex")||hasDirective(page.xRobotsTag,"noindex"))&&add(createIssue("noindex-in-sitemap",page.url,"Sitemap URL is marked noindex",{actual:page.robots??page.xRobotsTag})),sitemapUrls.has(page.url)&&page.redirectChain.length>0&&add(createIssue("redirect-in-sitemap",page.url,"Sitemap URL redirects",{actual:page.finalUrl,redirectChain:page.redirectChain})),page.title?(titles.get(page.title.trim().toLowerCase())&&add(createIssue("duplicate-title",page.url,"Title is shared by multiple pages",{actual:page.title,urls:titles.get(page.title.trim().toLowerCase())},page.title.trim().toLowerCase())),(page.title.length<10||page.title.length>60)&&add(createIssue("title-length",page.url,`Title length is ${page.title.length} characters`,{actual:page.title.length,value:page.title}))):add(createIssue("missing-title",page.url,"Page does not have a title",{actual:null})),page.description?(descriptions.get(page.description.trim().toLowerCase())&&add(createIssue("duplicate-description",page.url,"Meta description is shared by multiple pages",{actual:page.description,urls:descriptions.get(page.description.trim().toLowerCase())},page.description.trim().toLowerCase())),(page.description.length<50||page.description.length>160)&&add(createIssue("description-length",page.url,`Description length is ${page.description.length} characters`,{actual:page.description.length,value:page.description}))):add(createIssue("missing-description",page.url,"Page does not have a meta description",{actual:null})),page.h1Count===0?add(createIssue("missing-h1",page.url,"Page does not contain an H1 heading",{actual:0})):page.h1Count>1&&add(createIssue("multiple-h1",page.url,`Page contains ${page.h1Count} H1 headings`,{actual:page.h1Count}));for(let targetUrl of page.internalLinks){let target=pageByUrl.get(targetUrl);target&&(target.error||(target.status??500)>=400)&&add(createIssue("broken-internal-link",page.url,"Internal link points to an unavailable page",{target:targetUrl,actual:target.status??target.error},targetUrl))}sitemapUrls.has(page.url)&&page.url!==snapshot.siteUrl&&snapshot.linkGraph.orphanUrls.includes(page.url)&&add(createIssue("orphan-sitemap-page",page.url,"Sitemap page has no discovered internal links",{actual:!0})),snapshot.sitemap&&!sitemapUrls.has(page.url)&&!hasDirective(page.robots,"noindex")&&(page.status??500)<400&&add(createIssue("crawlable-not-in-sitemap",page.url,"Crawlable page is absent from the sitemap",{actual:!1}));for(let alternate of page.hreflang)(!validLanguage(alternate.lang)||!alternate.url)&&add(createIssue("invalid-hreflang",page.url,"Hreflang declaration is invalid",{actual:alternate},alternate));for(let[index,block]of page.jsonLd.entries())block.valid||add(createIssue("malformed-json-ld",page.url,"JSON-LD block contains invalid JSON",{actual:block.error,index},index));snapshot.siteUrl.startsWith("https:")&&[page.url,page.canonical,...page.internalLinks].some(url=>url?.startsWith("http:"))&&add(createIssue("http-on-https-site",page.url,"HTTPS site references an internal HTTP URL",{actual:[page.url,page.canonical,...page.internalLinks].filter(url=>url?.startsWith("http:"))})),page.lang&&!validLanguage(page.lang)&&add(createIssue("invalid-language",page.url,"HTML language declaration is invalid",{actual:page.lang})),page.contentHash&&content.get(page.contentHash)&&add(createIssue("duplicate-content",page.url,"Main text is an exact duplicate of another page",{urls:content.get(page.contentHash)},page.contentHash)),(!page.openGraph.title||!page.openGraph.description||!page.openGraph.image)&&add(createIssue("missing-open-graph",page.url,"Open Graph metadata is incomplete",{actual:page.openGraph})),(!page.twitter.card||!page.twitter.title||!page.twitter.description||!page.twitter.image)&&add(createIssue("missing-twitter-metadata",page.url,"Twitter card metadata is incomplete",{actual:page.twitter}));let missingAlt=page.images.filter(image=>image.alt===null).map(image=>image.src);missingAlt.length>0&&add(createIssue("image-missing-alt",page.url,`${missingAlt.length} image(s) do not have an alt attribute`,{actual:missingAlt})),page.wordCount<200&&add(createIssue("low-word-count",page.url,`Page contains approximately ${page.wordCount} visible words`,{actual:page.wordCount}))}return issues}var severityOrder={error:0,warning:1,info:2};function globMatches(url,pattern){let pathname=(()=>{try{return new URL(url).pathname}catch{return url}})(),expression=pattern.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("**","\0").replaceAll("*","[^/]*").replaceAll("\0",".*"),regex=new RegExp(`^${expression}$`);return regex.test(pathname)||regex.test(url)}function activeSuppression(issue,suppressions,now){return suppressions.find(suppression=>suppression.rule!==issue.ruleId||!globMatches(issue.url,suppression.urlPattern)?!1:suppression.expiresAt?new Date(`${suppression.expiresAt}T23:59:59.999Z`).getTime()>=now.getTime():!0)??null}function sortIssues(issues){return issues.sort((left,right)=>severityOrder[left.severity]-severityOrder[right.severity]||left.url.localeCompare(right.url)||left.ruleId.localeCompare(right.ruleId)||left.fingerprint.localeCompare(right.fingerprint))}function applyRulePolicy(issues,snapshot,ruleSet={}){let enabled=ruleSet.enabledRules??snapshot.config.enabledRules,enabledSet=enabled?new Set(enabled):null,overrides={...snapshot.config.severityOverrides,...ruleSet.severityOverrides??{}},suppressions=ruleSet.suppressions??snapshot.config.suppressions,now=new Date(ruleSet.now??Date.now());return sortIssues(issues.filter(candidate=>!enabledSet||enabledSet.has(candidate.ruleId)).map(candidate=>({...candidate,severity:overrides[candidate.ruleId]??candidate.severity})).filter(candidate=>!activeSuppression(candidate,suppressions,now)))}import{createHash as createHash2}from"node:crypto";var ENGINE_VERSION="0.9.0",RULE_SET_VERSION="1.1.0",PRODUCT_NAME="seo-crawl-audit",DEFAULT_USER_AGENT=`${PRODUCT_NAME}/${ENGINE_VERSION}`;var DEFAULT_OPEN_GRAPH={title:null,description:null,image:null},DEFAULT_TWITTER={card:null,title:null,description:null,image:null};function baselineInput(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("snapshot must be an object");return value}function pageInput(value){if(!value||typeof value!="object"||typeof value.url!="string")throw new Error("snapshot page URL must be a string");return value}function stableJson(value){return Array.isArray(value)?`[${value.map(stableJson).join(",")}]`:value&&typeof value=="object"?`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,child])=>`${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`:JSON.stringify(value)}function hashConfiguration(config){return createHash2("sha256").update(stableJson(config)).digest("hex")}function normalizePage(page){return{url:page.url,finalUrl:page.finalUrl??null,status:page.status??null,contentType:page.contentType??null,blockedByRobots:page.blockedByRobots??!1,error:page.error??null,title:page.title??null,description:page.description??null,canonical:page.canonical??null,canonicalRaw:page.canonicalRaw??page.canonical??null,robots:page.robots??null,xRobotsTag:page.xRobotsTag??null,lang:page.lang??null,h1Count:page.h1Count??0,openGraph:page.openGraph??DEFAULT_OPEN_GRAPH,twitter:page.twitter??DEFAULT_TWITTER,hreflang:page.hreflang??[],jsonLd:page.jsonLd??[],images:page.images??[],links:[...page.links??[]].sort(),internalLinks:[...page.internalLinks??[]].sort(),externalLinks:[...page.externalLinks??[]].sort(),wordCount:page.wordCount??0,contentHash:page.contentHash??null,depth:page.depth??0,redirectChain:page.redirectChain??[],responseBytes:page.responseBytes??0}}function defaultConfig(input){let source=input.source??{},options=input.options??{},firstPage=input.pages?.[0],firstPageUrl=firstPage&&typeof firstPage=="object"?firstPage.url:void 0,url=input.siteUrl??input.startUrl??source.startUrl??(typeof firstPageUrl=="string"?firstPageUrl:void 0);if(!url)throw new Error("snapshot site URL must be a string");return{schemaVersion:1,url,sitemap:options.sitemap??source.sitemap??"auto",maxPages:options.maxPages??source.maxPages??100,concurrency:options.concurrency??5,delay:options.requestDelay??source.requestDelay??100,timeout:options.timeout??1e4,respectRobots:options.respectRobots??source.respectRobots??!0,includeQuery:options.includeQuery??source.includeQuery??!1,maxRedirects:options.maxRedirects??10,maxResponseBytes:options.maxResponseBytes??5*1024*1024,enabledRules:options.enabledRules??null,severityOverrides:options.severityOverrides??{},suppressions:options.suppressions??[],regressionBudgets:options.regressionBudgets??{},report:options.report??{}}}function createLinkGraph(pages,sitemapUrls){let known=new Set(pages.map(page=>page.url)),linked=new Set(pages.flatMap(page=>page.internalLinks)),broken=new Set;for(let page of pages)(page.error||page.blockedByRobots||(page.status??500)>=400)&&broken.add(page.url);return{internalEdges:pages.reduce((sum,page)=>sum+page.internalLinks.length,0),externalEdges:pages.reduce((sum,page)=>sum+page.externalLinks.length,0),orphanUrls:sitemapUrls.filter(url=>known.has(url)&&!linked.has(url)),brokenInternalUrls:[...broken].sort()}}function createStatistics(input,pages){let blockedByRobots=pages.filter(page=>page.blockedByRobots).length,failed=pages.filter(page=>page.error||(page.status??500)>=400).length;return{requested:input.requested??pages.length,completed:pages.length,succeeded:pages.length-failed-blockedByRobots,failed,blockedByRobots,redirected:pages.filter(page=>page.redirectChain.length>0||page.url!==page.finalUrl).length,durationMs:input.durationMs??0,truncated:input.truncated??!1,partial:input.partial??!1}}function createBaseline(scanInput){let scan2=baselineInput(scanInput),config=defaultConfig(scan2),pages=(scan2.pages??[]).map(page=>normalizePage(pageInput(page))).sort((left,right)=>left.url.localeCompare(right.url)),sitemapUrls=scan2.sitemap?.urls??[];if(scan2.sitemap&&!scan2.sitemap.url)throw new Error("snapshot sitemap URL must be a string");let sitemap=scan2.sitemap?{url:scan2.sitemap.url,urls:[...sitemapUrls].sort(),sitemapCount:scan2.sitemap.sitemapCount??0,truncated:scan2.sitemap.truncated??!1,error:scan2.sitemap.error??null}:null,siteUrl=scan2.startUrl??config.url,truncated=scan2.truncated??!1;return{schemaVersion:2,engineVersion:ENGINE_VERSION,ruleSetVersion:RULE_SET_VERSION,generatedAt:scan2.generatedAt??new Date().toISOString(),siteUrl,configurationHash:hashConfiguration(config),config,robots:{url:scan2.robots?.url??new URL("/robots.txt",siteUrl).href,status:scan2.robots?.status??null,sha256:scan2.robots?.sha256??null,error:scan2.robots?.error??null,denyAll:scan2.robots?.denyAll??!1},sitemap,pages,linkGraph:scan2.linkGraph??createLinkGraph(pages,sitemapUrls),statistics:scan2.statistics??createStatistics(scan2,pages),partial:scan2.partial??!1,source:{startUrl:siteUrl,maxPages:config.maxPages,requestDelay:config.delay,includeQuery:config.includeQuery,respectRobots:config.respectRobots,sitemap:typeof config.sitemap=="string"&&!["auto","none"].includes(config.sitemap)?config.sitemap:null},truncated}}function migrateSnapshot(input){let value=baselineInput(input);if(!Array.isArray(value.pages))throw new Error("snapshot pages must be an array");if(value.schemaVersion===2)return createBaseline({...value,startUrl:value.siteUrl,options:value.config,pages:value.pages,generatedAt:value.generatedAt,partial:value.partial,statistics:value.statistics,linkGraph:value.linkGraph});if(value.schemaVersion===1)return createBaseline(value);throw new Error(`unsupported snapshot schema version: ${String(value.schemaVersion)}`)}function normalizeSnapshotInput(input){if(input.schemaVersion===2)return input;let legacy=input,firstPage=legacy.pages?.[0],firstPageUrl=firstPage&&typeof firstPage=="object"?firstPage.url:void 0,firstUrl=typeof firstPageUrl=="string"?firstPageUrl:legacy.source?.startUrl??"https://invalid.local/";return createBaseline({...legacy,startUrl:legacy.siteUrl??legacy.source?.startUrl??firstUrl,robots:legacy.robots??{url:new URL("/robots.txt",firstUrl).href,status:null,sha256:null,error:null},options:legacy.config??legacy.options??{}})}function audit(snapshotInput,ruleSet={}){let snapshot=normalizeSnapshotInput(snapshotInput);return applyRulePolicy(evaluateCurrentRules(snapshot),snapshot,ruleSet)}function hasDirective2(value,directive){return new RegExp(`(^|[\\s,])${directive}($|[\\s,])`,"i").test(value??"")}function changedIssue(ruleId,url,message,before,after){let candidate=createIssue(ruleId,url,message,{before,after,actual:after});return candidate.before=before,candidate.after=after,candidate}function evaluateRegressionRules(baseline,current){let complete=!current.partial&&!current.truncated,issues=[],currentPages=new Map(current.pages.map(page=>[page.url,page]));baseline.robots.sha256&&current.robots.sha256&&baseline.robots.sha256!==current.robots.sha256&&issues.push(changedIssue("robots-changed",current.robots.url,"robots.txt content changed",baseline.robots.sha256,current.robots.sha256));let previousSitemapCount=baseline.sitemap?.urls.length??0,currentSitemapCount=current.sitemap?.urls.length??0,sitemapDrop=previousSitemapCount-currentSitemapCount;complete&&previousSitemapCount>0&&sitemapDrop>=Math.max(5,Math.ceil(previousSitemapCount*.2))&&issues.push(changedIssue("sitemap-url-count-drop",current.sitemap?.url??baseline.sitemap?.url??current.siteUrl,`Sitemap URL count dropped by ${sitemapDrop}`,previousSitemapCount,currentSitemapCount));for(let before of baseline.pages){let after=currentPages.get(before.url);if(!after){complete&&issues.push(changedIssue("page-missing",before.url,"Page was not checked",before.status,null));continue}if(after.blockedByRobots&&!before.blockedByRobots){issues.push(changedIssue("robots-blocked",before.url,"Page is now blocked by robots.txt",!1,!0));continue}if(after.error&&!before.error){issues.push(changedIssue(after.error.includes("redirect loop")?"redirect-loop":"page-unreachable",before.url,`Page request failed: ${after.error}`,before.error,after.error));continue}before.status!==null&&before.status<400&&(after.status===null||after.status>=400)&&issues.push(changedIssue("status-regression",before.url,`HTTP status regressed from ${before.status} to ${after.status??"none"}`,before.status,after.status));let beforeRobots=`${before.robots??""},${before.xRobotsTag??""}`,afterRobots=`${after.robots??""},${after.xRobotsTag??""}`;if(!hasDirective2(beforeRobots,"noindex")&&hasDirective2(afterRobots,"noindex")&&issues.push(changedIssue("new-noindex",before.url,"Page now contains a noindex directive",beforeRobots,afterRobots)),before.title&&!after.title?issues.push(changedIssue("title-removed",before.url,"Page title was removed",before.title,after.title)):before.title&&after.title&&before.title!==after.title&&issues.push(changedIssue("title-changed",before.url,"Page title changed",before.title,after.title)),before.description&&!after.description&&issues.push(changedIssue("description-removed",before.url,"Meta description was removed",before.description,after.description)),before.canonical&&!after.canonical)issues.push(changedIssue("canonical-removed",before.url,"Canonical URL was removed",before.canonical,after.canonical));else if(before.canonical&&after.canonical&&before.canonical!==after.canonical){let candidate=changedIssue("canonical-changed",before.url,"Canonical URL changed",before.canonical,after.canonical);new URL(after.canonical).origin!==new URL(before.url).origin&&(candidate.severity="error"),issues.push(candidate)}if(before.h1Count>0&&after.h1Count===0&&issues.push(changedIssue("h1-removed",before.url,"All H1 headings were removed",before.h1Count,after.h1Count)),before.finalUrl&&after.finalUrl&&before.finalUrl!==after.finalUrl){let candidate=changedIssue("redirect-changed",before.url,"Final redirect URL changed",before.finalUrl,after.finalUrl);new URL(after.finalUrl).origin!==new URL(before.url).origin&&(candidate.severity="error"),issues.push(candidate)}}return issues}function compareBaselines(baselineInput2,currentInput,ruleSet={}){let baseline=normalizeSnapshotInput(baselineInput2),current=normalizeSnapshotInput(currentInput);return applyRulePolicy(evaluateRegressionRules(baseline,current),current,ruleSet)}function lifecycle(issue,value){return{...issue,lifecycle:value}}function diff(previousInput,currentInput,ruleSet={}){let previous=normalizeSnapshotInput(previousInput),current=normalizeSnapshotInput(currentInput),complete=!current.partial&&!current.truncated,checkedUrls=new Set(current.pages.map(page=>page.url)),previousIssues=new Map(audit(previous,ruleSet).map(candidate=>[candidate.fingerprint,candidate])),currentIssues=new Map(audit(current,ruleSet).map(candidate=>[candidate.fingerprint,candidate])),newIssues=[],ongoingIssues=[],unchangedIssues=[],resolvedIssues=[];for(let[fingerprint,candidate]of currentIssues){let before=previousIssues.get(fingerprint);before?JSON.stringify(before.evidence)===JSON.stringify(candidate.evidence)?unchangedIssues.push(lifecycle(candidate,"unchanged")):ongoingIssues.push(lifecycle({...candidate,before:before.evidence,after:candidate.evidence},"ongoing")):newIssues.push(lifecycle(candidate,"new"))}for(let[fingerprint,candidate]of previousIssues)(candidate.scope==="page"?checkedUrls.has(candidate.url):complete)&&!currentIssues.has(fingerprint)&&resolvedIssues.push(lifecycle(candidate,"resolved"));let known=new Set(newIssues.map(candidate=>candidate.fingerprint));for(let regression of compareBaselines(previous,current,ruleSet))known.has(regression.fingerprint)||newIssues.push(lifecycle(regression,"new"));let budgets={...previous.config.regressionBudgets,...current.config.regressionBudgets},budgetExceeded=Object.entries(budgets).flatMap(([budget,allowed])=>{let actual2=newIssues.filter(candidate=>candidate.severity===budget||candidate.ruleId===budget).length;return actual2>allowed?[{budget,allowed,actual:actual2}]:[]});return sortIssues(newIssues),sortIssues(ongoingIssues),sortIssues(unchangedIssues),sortIssues(resolvedIssues),{complete,newIssues,ongoingIssues,resolvedIssues,unchangedIssues,issues:[...newIssues,...ongoingIssues],budgetExceeded}}var DEFAULT_CONFIG_FILE="seo-audit.config.json",DEFAULT_SCAN_CONFIG=Object.freeze({schemaVersion:1,url:"",sitemap:"auto",maxPages:100,concurrency:5,delay:100,timeout:1e4,respectRobots:!0,includeQuery:!1,maxRedirects:10,maxResponseBytes:5242880,enabledRules:null,severityOverrides:{},suppressions:[],regressionBudgets:{},report:{}});function object(value,field){if(!value||typeof value!="object"||Array.isArray(value))throw new Error(`${field} must be an object`);return value}function integer(value,field,minimum,maximum=Number.MAX_SAFE_INTEGER){if(!Number.isInteger(value)||value<minimum||value>maximum)throw new Error(`${field} must be an integer between ${minimum} and ${maximum}`);return value}function optionalString(value,field){if(value!==void 0){if(typeof value!="string")throw new Error(`${field} must be a string`);return value}}function validateConfig(input){let value=object(input,"config"),allowed=new Set(["$schema","schemaVersion","url","sitemap","maxPages","concurrency","delay","timeout","respectRobots","includeQuery","maxRedirects","maxResponseBytes","enabledRules","severityOverrides","suppressions","regressionBudgets","report"]);for(let key of Object.keys(value))if(!allowed.has(key))throw new Error(`unknown config property: ${key}`);let result={};if(value.schemaVersion!==void 0&&value.schemaVersion!==1)throw new Error("schemaVersion must be 1");if(value.url!==void 0){let url=optionalString(value.url,"url");if(!/^https?:\/\//i.test(url))throw new Error("url must be an HTTP(S) URL");result.url=url}if(value.sitemap!==void 0){let sitemap=optionalString(value.sitemap,"sitemap");if(!["auto","none"].includes(sitemap)&&!/^https?:\/\//i.test(sitemap))throw new Error("sitemap must be auto, none, or an HTTP(S) URL");result.sitemap=sitemap}value.maxPages!==void 0&&(result.maxPages=integer(value.maxPages,"maxPages",1)),value.concurrency!==void 0&&(result.concurrency=integer(value.concurrency,"concurrency",1,50)),value.delay!==void 0&&(result.delay=integer(value.delay,"delay",0)),value.timeout!==void 0&&(result.timeout=integer(value.timeout,"timeout",1)),value.maxRedirects!==void 0&&(result.maxRedirects=integer(value.maxRedirects,"maxRedirects",0,50)),value.maxResponseBytes!==void 0&&(result.maxResponseBytes=integer(value.maxResponseBytes,"maxResponseBytes",1024));for(let field of["respectRobots","includeQuery"])if(value[field]!==void 0){if(typeof value[field]!="boolean")throw new Error(`${field} must be a boolean`);result[field]=value[field]}if(value.enabledRules!==void 0){if(value.enabledRules!==null&&(!Array.isArray(value.enabledRules)||value.enabledRules.some(rule=>typeof rule!="string")))throw new Error("enabledRules must be null or an array of rule IDs");result.enabledRules=value.enabledRules}if(value.severityOverrides!==void 0){let overrides=object(value.severityOverrides,"severityOverrides");for(let[rule,severity]of Object.entries(overrides))if(!["error","warning","info"].includes(severity))throw new Error(`severityOverrides.${rule} must be error, warning, or info`);result.severityOverrides=overrides}if(value.suppressions!==void 0){if(!Array.isArray(value.suppressions))throw new Error("suppressions must be an array");result.suppressions=value.suppressions.map((entry,index)=>{let suppression=object(entry,`suppressions[${index}]`);for(let field of["rule","urlPattern","reason"])if(typeof suppression[field]!="string"||suppression[field]==="")throw new Error(`suppressions[${index}].${field} must be a non-empty string`);if(suppression.expiresAt!==void 0&&!/^\d{4}-\d{2}-\d{2}$/.test(String(suppression.expiresAt)))throw new Error(`suppressions[${index}].expiresAt must use YYYY-MM-DD`);return suppression})}if(value.regressionBudgets!==void 0){let budgets=object(value.regressionBudgets,"regressionBudgets");result.regressionBudgets=Object.fromEntries(Object.entries(budgets).map(([key,budget])=>[key,integer(budget,`regressionBudgets.${key}`,0)]))}if(value.report!==void 0){let report=object(value.report,"report"),branding={},agencyName=optionalString(report.agencyName,"report.agencyName"),logo=optionalString(report.logo,"report.logo"),primaryColor=optionalString(report.primaryColor,"report.primaryColor");if(agencyName!==void 0&&(branding.agencyName=agencyName),logo!==void 0&&(branding.logo=logo),primaryColor!==void 0&&(branding.primaryColor=primaryColor),branding.primaryColor&&!/^#[0-9a-f]{6}$/i.test(branding.primaryColor))throw new Error("report.primaryColor must be a six-digit hex color");result.report=Object.fromEntries(Object.entries(branding).filter(([,child])=>child!==void 0))}return result}function resolveConfig(cli,file={},baseline={}){return{...{...DEFAULT_SCAN_CONFIG,...baseline,...file,...cli},schemaVersion:1,severityOverrides:{...baseline.severityOverrides??{},...file.severityOverrides??{},...cli.severityOverrides??{}},regressionBudgets:{...baseline.regressionBudgets??{},...file.regressionBudgets??{},...cli.regressionBudgets??{}},report:{...baseline.report??{},...file.report??{},...cli.report??{}},suppressions:cli.suppressions??file.suppressions??baseline.suppressions??[]}}function noop(){}var NOOP_LOGGER=Object.freeze({debug:noop,info:noop,warn:noop,error:noop});import{setTimeout as sleep}from"node:timers/promises";function createRequestGate(intervalMs=0,{now=Date.now,wait=sleep}={}){let interval=Math.max(0,intervalMs),nextStartAt=0,queue=Promise.resolve();return function(){if(interval===0)return Promise.resolve();let slot=queue.then(async()=>{let remaining=Math.max(0,nextStartAt-now());remaining>0&&await wait(remaining),nextStartAt=now()+interval});return queue=slot.catch(()=>{}),slot}}function createPerOriginRequestGate(intervalMs=0,factory=createRequestGate){let gates=new Map;return url=>{let origin=new URL(url).origin,gate=gates.get(origin);return gate||(gate=factory(intervalMs),gates.set(origin,gate)),gate()}}import{createHash as createHash3}from"node:crypto";import{setTimeout as sleep2}from"node:timers/promises";var RequestFailure=class extends Error{redirectChain;constructor(message,redirectChain=[],options){super(message,options),this.name="RequestFailure",this.redirectChain=redirectChain}};function retryableStatus(status){return status===429||status===500||status===502||status===503||status===504}function retryAfterMs(value,now=Date.now()){if(!value)return null;let seconds=Number(value);if(Number.isFinite(seconds)&&seconds>=0)return Math.min(seconds*1e3,3e4);let date=Date.parse(value);return Number.isNaN(date)?null:Math.min(Math.max(0,date-now),3e4)}function requestSignal(timeout,signal){let timeoutSignal2=AbortSignal.timeout(timeout);return signal?AbortSignal.any([signal,timeoutSignal2]):timeoutSignal2}async function fetchRedirectChain(initialUrl,init,policy2){let chain=[],visited=new Set([initialUrl]),url=initialUrl;for(;;){policy2.signal?.throwIfAborted(),await policy2.gate?.(url);let response=await policy2.fetch(url,{...init,redirect:"manual",signal:requestSignal(policy2.timeout,policy2.signal)}),location=response.headers.get("location");if(response.status<300||response.status>=400||!location)return{response,redirectChain:chain};let next=new URL(location,url).href;if(chain.push({url,status:response.status,location:next}),await response.body?.cancel(),visited.has(next))throw new RequestFailure(`redirect loop detected at ${next}`,chain);if(chain.length>policy2.maxRedirects)throw new RequestFailure(`redirect limit of ${policy2.maxRedirects} exceeded`,chain);visited.add(next),url=next}}async function fetchWithRetry(url,init,policy2){let lastError;for(let attempt=0;attempt<=policy2.retries;attempt+=1)try{let result=await fetchRedirectChain(url,init,policy2);if(!retryableStatus(result.response.status)||attempt===policy2.retries)return result;let serverDelay=retryAfterMs(result.response.headers.get("retry-after"));await result.response.body?.cancel();let jitter=Math.floor((policy2.random??Math.random)()*100),delayMs=serverDelay??Math.min(250*2**attempt+jitter,3e4);await policy2.onEvent?.({type:"retry",url,attempt:attempt+1,delayMs}),await sleep2(delayMs,void 0,{signal:policy2.signal})}catch(error){if(policy2.signal?.aborted)throw policy2.signal.reason??error;if(lastError=error,error instanceof RequestFailure||attempt===policy2.retries)break;let jitter=Math.floor((policy2.random??Math.random)()*100),delayMs=Math.min(250*2**attempt+jitter,3e4);await policy2.onEvent?.({type:"retry",url,attempt:attempt+1,delayMs}),await sleep2(delayMs,void 0,{signal:policy2.signal})}throw lastError instanceof RequestFailure?lastError:new RequestFailure(lastError instanceof Error?lastError.message:String(lastError),[],{cause:lastError})}async function readResponseBody(response,maxBytes){if(!response.body)return{text:"",bytes:0,buffer:Buffer.alloc(0)};let reader=response.body.getReader(),chunks=[],total=0;for(;;){let{done,value}=await reader.read();if(done)break;if(total+=value.byteLength,total>maxBytes)throw await reader.cancel(),new RequestFailure(`response exceeds ${maxBytes} bytes`);chunks.push(Buffer.from(value))}let buffer=Buffer.concat(chunks);return{text:buffer.toString("utf8"),bytes:total,buffer}}function patternMatches(pathWithQuery,pattern){if(!pattern)return!1;let anchored=pattern.endsWith("$"),escaped=(anchored?pattern.slice(0,-1):pattern).replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${escaped}${anchored?"$":""}`).test(pathWithQuery)}function parseRobots(body,userAgent){let groups=[],current=null;for(let rawLine of body.replace(/^\uFEFF/,"").split(/\r?\n/)){let line=rawLine.replace(/#.*$/,"").trim(),separator=line.indexOf(":");if(!line||separator<0)continue;let field=line.slice(0,separator).trim().toLowerCase(),value=line.slice(separator+1).trim();if(field==="user-agent"){(!current||current.hasRules)&&(current={agents:[],rules:[],hasRules:!1},groups.push(current)),value&&current.agents.push(value.toLowerCase());continue}current&&(field==="allow"||field==="disallow")&&value&&(current.rules.push({type:field,path:value}),current.hasRules=!0)}let normalizedAgent=userAgent.toLowerCase(),specific=groups.filter(group=>group.agents.some(agent=>agent!=="*"&&normalizedAgent.includes(agent)));return(specific.length>0?specific:groups.filter(group=>group.agents.includes("*"))).flatMap(group=>group.rules)}function isAllowedByRobots(url,robots){if(robots.denyAll)return!1;let parsed=new URL(url),pathWithQuery=`${parsed.pathname}${parsed.search}`,matches=(robots.rules??[]).filter(rule=>patternMatches(pathWithQuery,rule.path)).sort((left,right)=>right.path.length-left.path.length||(left.type==="allow"?-1:1));return matches.length===0||matches[0]?.type==="allow"}async function fetchRobots(startUrl,options){let robotsUrl=new URL("/robots.txt",startUrl).href;try{let{response}=await fetchWithRetry(robotsUrl,{headers:{accept:"text/plain,*/*;q=0.1","user-agent":options.userAgent}},{fetch:options.fetch,timeout:options.timeout,maxRedirects:options.maxRedirects,retries:options.retries,signal:options.signal,gate:options.requestGate,onEvent:options.onEvent}),{text:body}=await readResponseBody(response,MAX_ROBOTS_BYTES);return{url:robotsUrl,status:response.status,body,sha256:createHash3("sha256").update(body).digest("hex"),rules:response.ok?parseRobots(body,options.userAgent):[],denyAll:response.status===401||response.status===403,error:null}}catch(error){if(options.signal?.aborted)throw error;return{url:robotsUrl,status:null,body:"",sha256:null,rules:[],denyAll:!1,error:error instanceof Error?error.message:String(error)}}}var MAX_ROBOTS_BYTES=512*1024;import{gunzipSync}from"node:zlib";var nameStartChar=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",nameChar=nameStartChar+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040",nameRegexp="["+nameStartChar+"]["+nameChar+"]*",regexName=new RegExp("^"+nameRegexp+"$");function getAllMatches(string,regex){let matches=[],match=regex.exec(string);for(;match;){let allmatches=[];allmatches.startIndex=regex.lastIndex-match[0].length;let len=match.length;for(let index=0;index<len;index++)allmatches.push(match[index]);matches.push(allmatches),match=regex.exec(string)}return matches}var isName=function(string){let match=regexName.exec(string);return!(match===null||typeof match>"u")};function isExist(v){return typeof v<"u"}var DANGEROUS_PROPERTY_NAMES=["hasOwnProperty","toString","valueOf","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"],criticalProperties=["__proto__","constructor","prototype"];var defaultOptions={allowBooleanAttributes:!1,unpairedTags:[]};function validate(xmlData,options){options=Object.assign({},defaultOptions,options);let tags=[],tagFound=!1,reachedRoot=!1;xmlData[0]==="\uFEFF"&&(xmlData=xmlData.substr(1));for(let i=0;i<xmlData.length;i++)if(xmlData[i]==="<"&&xmlData[i+1]==="?"){if(i+=2,i=readPI(xmlData,i),i.err)return i}else if(xmlData[i]==="<"){let tagStartPos=i;if(i++,xmlData[i]==="!"){i=readCommentAndCDATA(xmlData,i);continue}else{let closingTag=!1;xmlData[i]==="/"&&(closingTag=!0,i++);let tagName="";for(;i<xmlData.length&&xmlData[i]!==">"&&xmlData[i]!==" "&&xmlData[i]!==" "&&xmlData[i]!==`
5
+ `&&xmlData[i]!=="\r";i++)tagName+=xmlData[i];if(tagName=tagName.trim(),tagName[tagName.length-1]==="/"&&(tagName=tagName.substring(0,tagName.length-1),i--),!validateTagName(tagName)){let msg;return tagName.trim().length===0?msg="Invalid space after '<'.":msg="Tag '"+tagName+"' is an invalid name.",getErrorObject("InvalidTag",msg,getLineNumberForPosition(xmlData,i))}let result=readAttributeStr(xmlData,i);if(result===!1)return getErrorObject("InvalidAttr","Attributes for '"+tagName+"' have open quote.",getLineNumberForPosition(xmlData,i));let attrStr=result.value;if(i=result.index,attrStr[attrStr.length-1]==="/"){let attrStrStart=i-attrStr.length;attrStr=attrStr.substring(0,attrStr.length-1);let isValid=validateAttributeString(attrStr,options);if(isValid===!0)tagFound=!0;else return getErrorObject(isValid.err.code,isValid.err.msg,getLineNumberForPosition(xmlData,attrStrStart+isValid.err.line))}else if(closingTag)if(result.tagClosed){if(attrStr.trim().length>0)return getErrorObject("InvalidTag","Closing tag '"+tagName+"' can't have attributes or invalid starting.",getLineNumberForPosition(xmlData,tagStartPos));if(tags.length===0)return getErrorObject("InvalidTag","Closing tag '"+tagName+"' has not been opened.",getLineNumberForPosition(xmlData,tagStartPos));{let otg=tags.pop();if(tagName!==otg.tagName){let openPos=getLineNumberForPosition(xmlData,otg.tagStartPos);return getErrorObject("InvalidTag","Expected closing tag '"+otg.tagName+"' (opened in line "+openPos.line+", col "+openPos.col+") instead of closing tag '"+tagName+"'.",getLineNumberForPosition(xmlData,tagStartPos))}tags.length==0&&(reachedRoot=!0)}}else return getErrorObject("InvalidTag","Closing tag '"+tagName+"' doesn't have proper closing.",getLineNumberForPosition(xmlData,i));else{let isValid=validateAttributeString(attrStr,options);if(isValid!==!0)return getErrorObject(isValid.err.code,isValid.err.msg,getLineNumberForPosition(xmlData,i-attrStr.length+isValid.err.line));if(reachedRoot===!0)return getErrorObject("InvalidXml","Multiple possible root nodes found.",getLineNumberForPosition(xmlData,i));options.unpairedTags.indexOf(tagName)!==-1||tags.push({tagName,tagStartPos}),tagFound=!0}for(i++;i<xmlData.length;i++)if(xmlData[i]==="<")if(xmlData[i+1]==="!"){i++,i=readCommentAndCDATA(xmlData,i);continue}else if(xmlData[i+1]==="?"){if(i=readPI(xmlData,++i),i.err)return i}else break;else if(xmlData[i]==="&"){let afterAmp=validateAmpersand(xmlData,i);if(afterAmp==-1)return getErrorObject("InvalidChar","char '&' is not expected.",getLineNumberForPosition(xmlData,i));i=afterAmp}else if(reachedRoot===!0&&!isWhiteSpace(xmlData[i]))return getErrorObject("InvalidXml","Extra text at the end",getLineNumberForPosition(xmlData,i));xmlData[i]==="<"&&i--}}else{if(isWhiteSpace(xmlData[i]))continue;return getErrorObject("InvalidChar","char '"+xmlData[i]+"' is not expected.",getLineNumberForPosition(xmlData,i))}if(tagFound){if(tags.length==1)return getErrorObject("InvalidTag","Unclosed tag '"+tags[0].tagName+"'.",getLineNumberForPosition(xmlData,tags[0].tagStartPos));if(tags.length>0)return getErrorObject("InvalidXml","Invalid '"+JSON.stringify(tags.map(t=>t.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1})}else return getErrorObject("InvalidXml","Start tag expected.",1);return!0}function isWhiteSpace(char){return char===" "||char===" "||char===`
6
+ `||char==="\r"}function readPI(xmlData,i){let start=i;for(;i<xmlData.length;i++)if(xmlData[i]=="?"||xmlData[i]==" "){let tagname=xmlData.substr(start,i-start);if(i>5&&tagname==="xml")return getErrorObject("InvalidXml","XML declaration allowed only at the start of the document.",getLineNumberForPosition(xmlData,i));if(xmlData[i]=="?"&&xmlData[i+1]==">"){i++;break}else continue}return i}function readCommentAndCDATA(xmlData,i){if(xmlData.length>i+5&&xmlData[i+1]==="-"&&xmlData[i+2]==="-"){for(i+=3;i<xmlData.length;i++)if(xmlData[i]==="-"&&xmlData[i+1]==="-"&&xmlData[i+2]===">"){i+=2;break}}else if(xmlData.length>i+8&&xmlData[i+1]==="D"&&xmlData[i+2]==="O"&&xmlData[i+3]==="C"&&xmlData[i+4]==="T"&&xmlData[i+5]==="Y"&&xmlData[i+6]==="P"&&xmlData[i+7]==="E"){let angleBracketsCount=1;for(i+=8;i<xmlData.length;i++)if(xmlData[i]==="<")angleBracketsCount++;else if(xmlData[i]===">"&&(angleBracketsCount--,angleBracketsCount===0))break}else if(xmlData.length>i+9&&xmlData[i+1]==="["&&xmlData[i+2]==="C"&&xmlData[i+3]==="D"&&xmlData[i+4]==="A"&&xmlData[i+5]==="T"&&xmlData[i+6]==="A"&&xmlData[i+7]==="["){for(i+=8;i<xmlData.length;i++)if(xmlData[i]==="]"&&xmlData[i+1]==="]"&&xmlData[i+2]===">"){i+=2;break}}return i}var doubleQuote='"',singleQuote="'";function readAttributeStr(xmlData,i){let attrStr="",startChar="",tagClosed=!1;for(;i<xmlData.length;i++){if(xmlData[i]===doubleQuote||xmlData[i]===singleQuote)startChar===""?startChar=xmlData[i]:startChar!==xmlData[i]||(startChar="");else if(xmlData[i]===">"&&startChar===""){tagClosed=!0;break}attrStr+=xmlData[i]}return startChar!==""?!1:{value:attrStr,index:i,tagClosed}}var validAttrStrRegxp=new RegExp(`(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['"])(([\\s\\S])*?)\\5)?`,"g");function validateAttributeString(attrStr,options){let matches=getAllMatches(attrStr,validAttrStrRegxp),attrNames={};for(let i=0;i<matches.length;i++){if(matches[i][1].length===0)return getErrorObject("InvalidAttr","Attribute '"+matches[i][2]+"' has no space in starting.",getPositionFromMatch(matches[i]));if(matches[i][3]!==void 0&&matches[i][4]===void 0)return getErrorObject("InvalidAttr","Attribute '"+matches[i][2]+"' is without value.",getPositionFromMatch(matches[i]));if(matches[i][3]===void 0&&!options.allowBooleanAttributes)return getErrorObject("InvalidAttr","boolean attribute '"+matches[i][2]+"' is not allowed.",getPositionFromMatch(matches[i]));let attrName=matches[i][2];if(!validateAttrName(attrName))return getErrorObject("InvalidAttr","Attribute '"+attrName+"' is an invalid name.",getPositionFromMatch(matches[i]));if(!Object.prototype.hasOwnProperty.call(attrNames,attrName))attrNames[attrName]=1;else return getErrorObject("InvalidAttr","Attribute '"+attrName+"' is repeated.",getPositionFromMatch(matches[i]))}return!0}function validateNumberAmpersand(xmlData,i){let re=/\d/;for(xmlData[i]==="x"&&(i++,re=/[\da-fA-F]/);i<xmlData.length;i++){if(xmlData[i]===";")return i;if(!xmlData[i].match(re))break}return-1}function validateAmpersand(xmlData,i){if(i++,xmlData[i]===";")return-1;if(xmlData[i]==="#")return i++,validateNumberAmpersand(xmlData,i);let count=0;for(;i<xmlData.length;i++,count++)if(!(xmlData[i].match(/\w/)&&count<20)){if(xmlData[i]===";")break;return-1}return i}function getErrorObject(code,message,lineNumber){return{err:{code,msg:message,line:lineNumber.line||lineNumber,col:lineNumber.col}}}function validateAttrName(attrName){return isName(attrName)}function validateTagName(tagname){return isName(tagname)}function getLineNumberForPosition(xmlData,index){let lines=xmlData.substring(0,index).split(/\r?\n/);return{line:lines.length,col:lines[lines.length-1].length+1}}function getPositionFromMatch(match){return match.startIndex+match[1].length}var CURRENCY={cent:"\xA2",pound:"\xA3",curren:"\xA4",yen:"\xA5",euro:"\u20AC",dollar:"$",fnof:"\u0192",inr:"\u20B9",af:"\u060B",birr:"\u1265\u122D",peso:"\u20B1",rub:"\u20BD",won:"\u20A9",yuan:"\xA5",cedil:"\xB8"};var XML={amp:"&",apos:"'",gt:">",lt:"<",quot:'"'},COMMON_HTML={nbsp:"\xA0",copy:"\xA9",reg:"\xAE",trade:"\u2122",mdash:"\u2014",ndash:"\u2013",hellip:"\u2026",laquo:"\xAB",raquo:"\xBB",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",bull:"\u2022",para:"\xB6",sect:"\xA7",deg:"\xB0",frac12:"\xBD",frac14:"\xBC",frac34:"\xBE"};var ENTITY_ACTION=Object.freeze({ALLOW:"allow",BLOCK:"block",THROW:"throw"}),SPECIAL_CHARS=new Set("!?\\\\/[]$%{}^&*()<>|+");function validateEntityName(name){if(name[0]==="#")throw new Error(`[EntityReplacer] Invalid character '#' in entity name: "${name}"`);for(let ch of name)if(SPECIAL_CHARS.has(ch))throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: "${name}"`);return name}function mergeEntityMaps(...maps){let out=Object.create(null);for(let map of maps)if(map)for(let key of Object.keys(map)){let raw=map[key];if(typeof raw=="string")out[key]=raw;else if(raw&&typeof raw=="object"&&raw.val!==void 0){let val=raw.val;typeof val=="string"&&(out[key]=val)}}return out}var LIMIT_TIER_EXTERNAL="external",LIMIT_TIER_BASE="base",LIMIT_TIER_ALL="all";function parseLimitTiers(raw){return!raw||raw===LIMIT_TIER_EXTERNAL?new Set([LIMIT_TIER_EXTERNAL]):raw===LIMIT_TIER_ALL?new Set([LIMIT_TIER_ALL]):raw===LIMIT_TIER_BASE?new Set([LIMIT_TIER_BASE]):Array.isArray(raw)?new Set(raw):new Set([LIMIT_TIER_EXTERNAL])}var NCR_LEVEL=Object.freeze({allow:0,leave:1,remove:2,throw:3}),XML10_ALLOWED_C0=new Set([9,10,13]);function parseNCRConfig(ncr){if(!ncr)return{xmlVersion:1,onLevel:NCR_LEVEL.allow,nullLevel:NCR_LEVEL.remove};let xmlVersion=ncr.xmlVersion===1.1?1.1:1,onLevel=NCR_LEVEL[ncr.onNCR]??NCR_LEVEL.allow,nullLevel=NCR_LEVEL[ncr.nullNCR]??NCR_LEVEL.remove,clampedNull=Math.max(nullLevel,NCR_LEVEL.remove);return{xmlVersion,onLevel,nullLevel:clampedNull}}var EntityDecoder=class{constructor(options={}){this._limit=options.limit||{},this._maxTotalExpansions=this._limit.maxTotalExpansions||0,this._maxExpandedLength=this._limit.maxExpandedLength||0,this._postCheck=typeof options.postCheck=="function"?options.postCheck:r=>r,this._limitTiers=parseLimitTiers(this._limit.applyLimitsTo??LIMIT_TIER_EXTERNAL),this._numericAllowed=options.numericAllowed??!0,this._baseMap=mergeEntityMaps(XML,options.namedEntities||null),this._externalMap=Object.create(null),this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this._removeSet=new Set(options.remove&&Array.isArray(options.remove)?options.remove:[]),this._leaveSet=new Set(options.leave&&Array.isArray(options.leave)?options.leave:[]);let ncrCfg=parseNCRConfig(options.ncr);this._ncrXmlVersion=ncrCfg.xmlVersion,this._ncrOnLevel=ncrCfg.onLevel,this._ncrNullLevel=ncrCfg.nullLevel,this._onExternalEntity=typeof options.onExternalEntity=="function"?options.onExternalEntity:null,this._onInputEntity=typeof options.onInputEntity=="function"?options.onInputEntity:null}_applyRegistrationHook(hook,name,value,context){if(!hook)return!0;let action=hook(name,value);if(action===ENTITY_ACTION.BLOCK)return!1;if(action===ENTITY_ACTION.THROW)throw new Error(`[EntityDecoder] Registration of ${context} entity "&${name};" was rejected by hook`);return!0}setExternalEntities(map){if(map)for(let key of Object.keys(map))validateEntityName(key);if(!this._onExternalEntity){this._externalMap=mergeEntityMaps(map);return}let flat=mergeEntityMaps(map),filtered=Object.create(null);for(let[name,value]of Object.entries(flat))this._applyRegistrationHook(this._onExternalEntity,name,value,"external")&&(filtered[name]=value);this._externalMap=filtered}addExternalEntity(key,value){validateEntityName(key),typeof value=="string"&&value.indexOf("&")===-1&&this._applyRegistrationHook(this._onExternalEntity,key,value,"external")&&(this._externalMap[key]=value)}addInputEntities(map){if(this._totalExpansions=0,this._expandedLength=0,!this._onInputEntity){this._inputMap=mergeEntityMaps(map);return}let flat=mergeEntityMaps(map),filtered=Object.create(null);for(let[name,value]of Object.entries(flat))this._applyRegistrationHook(this._onInputEntity,name,value,"input")&&(filtered[name]=value);this._inputMap=filtered}reset(){return this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this}setXmlVersion(version){this._ncrXmlVersion=version===1.1?1.1:1}decode(str){if(typeof str!="string"||str.length===0||str.indexOf("&")===-1)return str;let original=str,chunks=[],len=str.length,last=0,i=0,limitExpansions=this._maxTotalExpansions>0,limitLength=this._maxExpandedLength>0,checkLimits=limitExpansions||limitLength;for(;i<len;){if(str.charCodeAt(i)!==38){i++;continue}let j=i+1;for(;j<len&&str.charCodeAt(j)!==59&&j-i<=32;)j++;if(j>=len||str.charCodeAt(j)!==59){i++;continue}let token=str.slice(i+1,j);if(token.length===0){i++;continue}let replacement,tier;if(this._removeSet.has(token))replacement="",tier===void 0&&(tier=LIMIT_TIER_EXTERNAL);else if(this._leaveSet.has(token)){i++;continue}else if(token.charCodeAt(0)===35){let ncrResult=this._resolveNCR(token);if(ncrResult===void 0){i++;continue}replacement=ncrResult,tier=LIMIT_TIER_BASE}else{let resolved=this._resolveName(token);replacement=resolved?.value,tier=resolved?.tier}if(replacement===void 0){i++;continue}if(i>last&&chunks.push(str.slice(last,i)),chunks.push(replacement),last=j+1,i=last,checkLimits&&this._tierCounts(tier)){if(limitExpansions&&(this._totalExpansions++,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);if(limitLength){let delta=replacement.length-(token.length+2);if(delta>0&&(this._expandedLength+=delta,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}last<len&&chunks.push(str.slice(last));let result=chunks.length===0?str:chunks.join("");return this._postCheck(result,original)}_tierCounts(tier){return this._limitTiers.has(LIMIT_TIER_ALL)?!0:this._limitTiers.has(tier)}_resolveName(name){if(name in this._inputMap)return{value:this._inputMap[name],tier:LIMIT_TIER_EXTERNAL};if(name in this._externalMap)return{value:this._externalMap[name],tier:LIMIT_TIER_EXTERNAL};if(name in this._baseMap)return{value:this._baseMap[name],tier:LIMIT_TIER_BASE}}_classifyNCR(cp){return cp===0?this._ncrNullLevel:cp>=55296&&cp<=57343||this._ncrXmlVersion===1&&cp>=1&&cp<=31&&!XML10_ALLOWED_C0.has(cp)?NCR_LEVEL.remove:-1}_applyNCRAction(action,token,cp){switch(action){case NCR_LEVEL.allow:return String.fromCodePoint(cp);case NCR_LEVEL.remove:return"";case NCR_LEVEL.leave:return;case NCR_LEVEL.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${token}; (U+${cp.toString(16).toUpperCase().padStart(4,"0")})`);default:return String.fromCodePoint(cp)}}_resolveNCR(token){let second=token.charCodeAt(1),cp;if(second===120||second===88?cp=parseInt(token.slice(2),16):cp=parseInt(token.slice(1),10),Number.isNaN(cp)||cp<0||cp>1114111)return;let minimum=this._classifyNCR(cp);if(!this._numericAllowed&&minimum<NCR_LEVEL.remove)return;let effective=minimum===-1?this._ncrOnLevel:Math.max(this._ncrOnLevel,minimum);return this._applyNCRAction(effective,token,cp)}};var defaultOnDangerousProperty=name=>DANGEROUS_PROPERTY_NAMES.includes(name)?"__"+name:name,defaultOptions2={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0,unicode:!1},tagValueProcessor:function(tagName,val){return val},attributeValueProcessor:function(attrName,val){return val},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,entityDecoder:null,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(tagName,jPath,attrs){return tagName},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0,onDangerousProperty:defaultOnDangerousProperty};function validatePropertyName(propertyName,optionName){if(typeof propertyName!="string")return;let normalized=propertyName.toLowerCase();if(DANGEROUS_PROPERTY_NAMES.some(dangerous=>normalized===dangerous.toLowerCase()))throw new Error(`[SECURITY] Invalid ${optionName}: "${propertyName}" is a reserved JavaScript keyword that could cause prototype pollution`);if(criticalProperties.some(dangerous=>normalized===dangerous.toLowerCase()))throw new Error(`[SECURITY] Invalid ${optionName}: "${propertyName}" is a reserved JavaScript keyword that could cause prototype pollution`)}function normalizeProcessEntities(value,htmlEntities){return typeof value=="boolean"?{enabled:value,maxEntitySize:1e4,maxExpansionDepth:1e4,maxTotalExpansions:1/0,maxExpandedLength:1e5,maxEntityCount:1e3,allowedTags:null,tagFilter:null,appliesTo:"all"}:typeof value=="object"&&value!==null?{enabled:value.enabled!==!1,maxEntitySize:Math.max(1,value.maxEntitySize??1e4),maxExpansionDepth:Math.max(1,value.maxExpansionDepth??1e4),maxTotalExpansions:Math.max(1,value.maxTotalExpansions??1/0),maxExpandedLength:Math.max(1,value.maxExpandedLength??1e5),maxEntityCount:Math.max(1,value.maxEntityCount??1e3),allowedTags:value.allowedTags??null,tagFilter:value.tagFilter??null,appliesTo:value.appliesTo??"all"}:normalizeProcessEntities(!0)}var buildOptions=function(options){let built=Object.assign({},defaultOptions2,options),propertyNameOptions=[{value:built.attributeNamePrefix,name:"attributeNamePrefix"},{value:built.attributesGroupName,name:"attributesGroupName"},{value:built.textNodeName,name:"textNodeName"},{value:built.cdataPropName,name:"cdataPropName"},{value:built.commentPropName,name:"commentPropName"}];for(let{value,name}of propertyNameOptions)value&&validatePropertyName(value,name);return built.onDangerousProperty===null&&(built.onDangerousProperty=defaultOnDangerousProperty),built.processEntities=normalizeProcessEntities(built.processEntities,built.htmlEntities),built.unpairedTagsSet=new Set(built.unpairedTags),built.stopNodes&&Array.isArray(built.stopNodes)&&(built.stopNodes=built.stopNodes.map(node=>typeof node=="string"&&node.startsWith("*.")?".."+node.substring(2):node)),built};var METADATA_SYMBOL;typeof Symbol!="function"?METADATA_SYMBOL="@@xmlMetadata":METADATA_SYMBOL=Symbol("XML Node Metadata");var XmlNode=class{constructor(tagname){this.tagname=tagname,this.child=[],this[":@"]=Object.create(null)}add(key,val){key==="__proto__"&&(key="#__proto__"),this.child.push({[key]:val})}addChild(node,startIndex){node.tagname==="__proto__"&&(node.tagname="#__proto__"),node[":@"]&&Object.keys(node[":@"]).length>0?this.child.push({[node.tagname]:node.child,":@":node[":@"]}):this.child.push({[node.tagname]:node.child}),startIndex!==void 0&&(this.child[this.child.length-1][METADATA_SYMBOL]={startIndex})}static getMetaDataSymbol(){return METADATA_SYMBOL}};var nameStartChar10=":A-Za-z_\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD",nameChar10=nameStartChar10+"\\-\\.\\d\xB7\u0300-\u036F\u203F-\u2040",nameStartChar11=":A-Za-z_\xC0-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}",nameChar11=nameStartChar11+"\\-\\.\\d\xB7\u0300-\u036F\u0487\u203F-\u2040",buildRegexes=(startChar,char,flags="")=>{let ncStart=startChar.replace(":",""),ncChar=char.replace(":",""),ncNamePat=`[${ncStart}][${ncChar}]*`;return{name:new RegExp(`^[${startChar}][${char}]*$`,flags),ncName:new RegExp(`^${ncNamePat}$`,flags),qName:new RegExp(`^${ncNamePat}(?::${ncNamePat})?$`,flags),nmToken:new RegExp(`^[${char}]+$`,flags),nmTokens:new RegExp(`^[${char}]+(?:\\s+[${char}]+)*$`,flags)}},regexes10=buildRegexes(nameStartChar10,nameChar10),regexes11=buildRegexes(nameStartChar11,nameChar11,"u"),nameStartCharAscii=":A-Za-z_",nameCharAscii=nameStartCharAscii+"\\-\\.\\d",regexesAscii=buildRegexes(nameStartCharAscii,nameCharAscii),getRegexes=(xmlVersion="1.0",asciiOnly=!1)=>asciiOnly?regexesAscii:xmlVersion==="1.1"?regexes11:regexes10;var qName=(str,{xmlVersion="1.0",asciiOnly=!1}={})=>getRegexes(xmlVersion,asciiOnly).qName.test(str);var DocTypeReader=class{constructor(options,xmlVersion){this.suppressValidationErr=!options,this.options=options,this.xmlVersion=xmlVersion||1}setXmlVersion(xmlVersion=1){this.xmlVersion=xmlVersion}readDocType(xmlData,i){let entities=Object.create(null),entityCount=0;if(xmlData[i+3]==="O"&&xmlData[i+4]==="C"&&xmlData[i+5]==="T"&&xmlData[i+6]==="Y"&&xmlData[i+7]==="P"&&xmlData[i+8]==="E"){i=i+9;let angleBracketsCount=1,hasBody=!1,comment=!1,exp="";for(;i<xmlData.length;i++)if(xmlData[i]==="<"&&!comment){if(hasBody&&hasSeq(xmlData,"!ENTITY",i)){i+=7;let entityName,val;if([entityName,val,i]=this.readEntityExp(xmlData,i+1,this.suppressValidationErr),val.indexOf("&")===-1){if(this.options.enabled!==!1&&this.options.maxEntityCount!=null&&entityCount>=this.options.maxEntityCount)throw new Error(`Entity count (${entityCount+1}) exceeds maximum allowed (${this.options.maxEntityCount})`);entities[entityName]=val,entityCount++}}else if(hasBody&&hasSeq(xmlData,"!ELEMENT",i)){i+=8;let{index}=this.readElementExp(xmlData,i+1);i=index}else if(hasBody&&hasSeq(xmlData,"!ATTLIST",i))i+=8;else if(hasBody&&hasSeq(xmlData,"!NOTATION",i)){i+=9;let{index}=this.readNotationExp(xmlData,i+1,this.suppressValidationErr);i=index}else if(hasSeq(xmlData,"!--",i))comment=!0;else throw new Error("Invalid DOCTYPE");angleBracketsCount++,exp=""}else if(xmlData[i]===">"){if(comment?xmlData[i-1]==="-"&&xmlData[i-2]==="-"&&(comment=!1,angleBracketsCount--):angleBracketsCount--,angleBracketsCount===0)break}else xmlData[i]==="["?hasBody=!0:exp+=xmlData[i];if(angleBracketsCount!==0)throw new Error("Unclosed DOCTYPE")}else throw new Error("Invalid Tag instead of DOCTYPE");return{entities,i}}readEntityExp(xmlData,i){i=skipWhitespace(xmlData,i);let startIndex=i;for(;i<xmlData.length&&!/\s/.test(xmlData[i])&&xmlData[i]!=='"'&&xmlData[i]!=="'";)i++;let entityName=xmlData.substring(startIndex,i);if(validateEntityName2(entityName,{xmlVersion:this.xmlVersion}),i=skipWhitespace(xmlData,i),!this.suppressValidationErr){if(xmlData.substring(i,i+6).toUpperCase()==="SYSTEM")throw new Error("External entities are not supported");if(xmlData[i]==="%")throw new Error("Parameter entities are not supported")}let entityValue="";if([i,entityValue]=this.readIdentifierVal(xmlData,i,"entity"),this.options.enabled!==!1&&this.options.maxEntitySize!=null&&entityValue.length>this.options.maxEntitySize)throw new Error(`Entity "${entityName}" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`);return i--,[entityName,entityValue,i]}readNotationExp(xmlData,i){i=skipWhitespace(xmlData,i);let startIndex=i;for(;i<xmlData.length&&!/\s/.test(xmlData[i]);)i++;let notationName=xmlData.substring(startIndex,i);!this.suppressValidationErr&&validateEntityName2(notationName,{xmlVersion:this.xmlVersion}),i=skipWhitespace(xmlData,i);let identifierType=xmlData.substring(i,i+6).toUpperCase();if(!this.suppressValidationErr&&identifierType!=="SYSTEM"&&identifierType!=="PUBLIC")throw new Error(`Expected SYSTEM or PUBLIC, found "${identifierType}"`);i+=identifierType.length,i=skipWhitespace(xmlData,i);let publicIdentifier=null,systemIdentifier=null;if(identifierType==="PUBLIC")[i,publicIdentifier]=this.readIdentifierVal(xmlData,i,"publicIdentifier"),i=skipWhitespace(xmlData,i),(xmlData[i]==='"'||xmlData[i]==="'")&&([i,systemIdentifier]=this.readIdentifierVal(xmlData,i,"systemIdentifier"));else if(identifierType==="SYSTEM"&&([i,systemIdentifier]=this.readIdentifierVal(xmlData,i,"systemIdentifier"),!this.suppressValidationErr&&!systemIdentifier))throw new Error("Missing mandatory system identifier for SYSTEM notation");return{notationName,publicIdentifier,systemIdentifier,index:--i}}readIdentifierVal(xmlData,i,type){let identifierVal="",startChar=xmlData[i];if(startChar!=='"'&&startChar!=="'")throw new Error(`Expected quoted string, found "${startChar}"`);i++;let startIndex=i;for(;i<xmlData.length&&xmlData[i]!==startChar;)i++;if(identifierVal=xmlData.substring(startIndex,i),xmlData[i]!==startChar)throw new Error(`Unterminated ${type} value`);return i++,[i,identifierVal]}readElementExp(xmlData,i){i=skipWhitespace(xmlData,i);let startIndex=i;for(;i<xmlData.length&&!/\s/.test(xmlData[i]);)i++;let elementName=xmlData.substring(startIndex,i);if(!this.suppressValidationErr&&!qName(elementName,{xmlVersion:this.xmlVersion}))throw new Error(`Invalid element name: "${elementName}"`);i=skipWhitespace(xmlData,i);let contentModel="";if(xmlData[i]==="E"&&hasSeq(xmlData,"MPTY",i))i+=4;else if(xmlData[i]==="A"&&hasSeq(xmlData,"NY",i))i+=2;else if(xmlData[i]==="("){i++;let startIndex2=i;for(;i<xmlData.length&&xmlData[i]!==")";)i++;if(contentModel=xmlData.substring(startIndex2,i),xmlData[i]!==")")throw new Error("Unterminated content model")}else if(!this.suppressValidationErr)throw new Error(`Invalid Element Expression, found "${xmlData[i]}"`);return{elementName,contentModel:contentModel.trim(),index:i}}readAttlistExp(xmlData,i){i=skipWhitespace(xmlData,i);let startIndex=i;for(;i<xmlData.length&&!/\s/.test(xmlData[i]);)i++;let elementName=xmlData.substring(startIndex,i);for(validateEntityName2(elementName,{xmlVersion:this.xmlVersion}),i=skipWhitespace(xmlData,i),startIndex=i;i<xmlData.length&&!/\s/.test(xmlData[i]);)i++;let attributeName=xmlData.substring(startIndex,i);if(!validateEntityName2(attributeName,{xmlVersion:this.xmlVersion}))throw new Error(`Invalid attribute name: "${attributeName}"`);i=skipWhitespace(xmlData,i);let attributeType="";if(xmlData.substring(i,i+8).toUpperCase()==="NOTATION"){if(attributeType="NOTATION",i+=8,i=skipWhitespace(xmlData,i),xmlData[i]!=="(")throw new Error(`Expected '(', found "${xmlData[i]}"`);i++;let allowedNotations=[];for(;i<xmlData.length&&xmlData[i]!==")";){let startIndex2=i;for(;i<xmlData.length&&xmlData[i]!=="|"&&xmlData[i]!==")";)i++;let notation=xmlData.substring(startIndex2,i);if(notation=notation.trim(),!validateEntityName2(notation,{xmlVersion:this.xmlVersion}))throw new Error(`Invalid notation name: "${notation}"`);allowedNotations.push(notation),xmlData[i]==="|"&&(i++,i=skipWhitespace(xmlData,i))}if(xmlData[i]!==")")throw new Error("Unterminated list of notations");i++,attributeType+=" ("+allowedNotations.join("|")+")"}else{let startIndex2=i;for(;i<xmlData.length&&!/\s/.test(xmlData[i]);)i++;attributeType+=xmlData.substring(startIndex2,i);let validTypes=["CDATA","ID","IDREF","IDREFS","ENTITY","ENTITIES","NMTOKEN","NMTOKENS"];if(!this.suppressValidationErr&&!validTypes.includes(attributeType.toUpperCase()))throw new Error(`Invalid attribute type: "${attributeType}"`)}i=skipWhitespace(xmlData,i);let defaultValue="";return xmlData.substring(i,i+8).toUpperCase()==="#REQUIRED"?(defaultValue="#REQUIRED",i+=8):xmlData.substring(i,i+7).toUpperCase()==="#IMPLIED"?(defaultValue="#IMPLIED",i+=7):[i,defaultValue]=this.readIdentifierVal(xmlData,i,"ATTLIST"),{elementName,attributeName,attributeType,defaultValue,index:i}}},skipWhitespace=(data,index)=>{for(;index<data.length&&/\s/.test(data[index]);)index++;return index};function hasSeq(data,seq,i){for(let j=0;j<seq.length;j++)if(seq[j]!==data[i+j+1])return!1;return!0}function validateEntityName2(name,xmlVersion){if(qName(name,{xmlVersion}))return name;throw new Error(`Invalid entity name ${name}`)}var SCRIPT_ZEROS=[48,1632,1776,2406,2534,2662,2790,2918,3046,3174,3302,3430,3558,3664,3792,3872,4160,4240,6112,6160,6470,6608,6784,6800,6992,7088,7232,7248,65296,120782,120792,120802,120812,120822,66720,68912,69734,69872,69942,70096,70384,70736,70864,71248,71360,71472,71904,72016,72688,72784,73040,73120,73552,92768,92864,93008,123200,123632,124144,125264,130032],NOT_DIGIT=255,HIGH_MAP=new Map,LOW_MAX=65535,LOW_MIN=1632,TABLE_OFFSET=LOW_MIN,TABLE_SIZE=LOW_MAX-LOW_MIN+1,TABLE=new Uint8Array(TABLE_SIZE).fill(NOT_DIGIT);for(let zero of SCRIPT_ZEROS)for(let d=0;d<10;d++){let cp=zero+d;cp<=LOW_MAX?TABLE[cp-TABLE_OFFSET]=d:HIGH_MAP.set(cp,d)}var CHAR_0=48,CHAR_9=57,CHAR_MINUS=45,MINUS_SET=new Set([8722,65293,65123]);function anynum(str){if(typeof str!="string")return str;let len=str.length;if(len===0)return str;let firstHit=-1;for(let i=0;i<len;i++){let cc=str.charCodeAt(i);if(!(cc>=CHAR_0&&cc<=CHAR_9||cc===CHAR_MINUS)){if(cc<TABLE_OFFSET){if(MINUS_SET.has(cc)){firstHit=i;break}continue}if(cc>=55296&&cc<=56319){if(i+1<len){let low=str.charCodeAt(i+1);if(low>=56320&&low<=57343){let cp=65536+(cc-55296<<10)+(low-56320);if(HIGH_MAP.has(cp)){firstHit=i;break}}}continue}if(TABLE[cc-TABLE_OFFSET]!==NOT_DIGIT||MINUS_SET.has(cc)){firstHit=i;break}}}if(firstHit===-1)return str;let chars=[];firstHit>0&&chars.push(str.slice(0,firstHit));for(let i=firstHit;i<len;i++){let cc=str.charCodeAt(i);if(cc>=CHAR_0&&cc<=CHAR_9||cc===CHAR_MINUS){chars.push(str[i]);continue}if(cc<TABLE_OFFSET){chars.push(MINUS_SET.has(cc)?"-":str[i]);continue}if(cc>=55296&&cc<=56319){if(i+1<len){let low=str.charCodeAt(i+1);if(low>=56320&&low<=57343){let cp=65536+(cc-55296<<10)+(low-56320),d2=HIGH_MAP.get(cp);if(d2!==void 0){chars.push(String.fromCharCode(d2+48)),i++;continue}}}chars.push(str[i]);continue}if(MINUS_SET.has(cc)){chars.push("-");continue}let d=TABLE[cc-TABLE_OFFSET];chars.push(d!==NOT_DIGIT?String.fromCharCode(d+48):str[i])}return chars.join("")}var anynum_default=anynum;var hexRegex=/^[-+]?0x[a-fA-F0-9]+$/,binRegex=/^0b[01]+$/,octRegex=/^0o[0-7]+$/,numRegex=/^([\-\+])?(0*)([0-9]*(\.[0-9]*)?)$/,consider={hex:!0,binary:!1,octal:!1,leadingZeros:!0,decimalPoint:".",eNotation:!0,infinity:"original",unicode:!1};function toNumber(str,options={}){if(options=Object.assign({},consider,options),!str||typeof str!="string")return str;let trimmedStr=str.trim();if(trimmedStr.length===0)return str;if(options.skipLike!==void 0&&options.skipLike.test(trimmedStr))return str;if(trimmedStr==="0"||options.unicode&&(trimmedStr=anynum_default(trimmedStr),trimmedStr==="0"))return 0;if(options.hex&&hexRegex.test(trimmedStr))return parse_int(trimmedStr,16);if(options.binary&&binRegex.test(trimmedStr))return parse_int(trimmedStr,2);if(options.octal&&octRegex.test(trimmedStr))return parse_int(trimmedStr,8);if(isFinite(trimmedStr)){if(trimmedStr.includes("e")||trimmedStr.includes("E"))return resolveEnotation(str,trimmedStr,options);{let match=numRegex.exec(trimmedStr);if(match){let sign=match[1]||"",leadingZeros=match[2],numTrimmedByZeros=trimZeros(match[3]),decimalAdjacentToLeadingZeros=sign?str[leadingZeros.length+1]===".":str[leadingZeros.length]===".";if(!options.leadingZeros&&(leadingZeros.length>1||leadingZeros.length===1&&!decimalAdjacentToLeadingZeros))return str;{let num=Number(trimmedStr),parsedStr=String(num);if(num===0)return num;if(parsedStr.search(/[eE]/)!==-1)return options.eNotation?num:str;if(trimmedStr.indexOf(".")!==-1)return parsedStr==="0"||parsedStr===numTrimmedByZeros||parsedStr===`${sign}${numTrimmedByZeros}`?num:str;let n=leadingZeros?numTrimmedByZeros:trimmedStr;return leadingZeros?n===parsedStr||sign+n===parsedStr?num:str:n===parsedStr||n===sign+parsedStr?num:str}}else return str}}else return handleInfinity(str,Number(trimmedStr),options)}var eNotationRegx=/^([-+])?(0*)(\d*(\.\d*)?[eE][-\+]?\d+)$/;function resolveEnotation(str,trimmedStr,options){if(!options.eNotation)return str;let notation=trimmedStr.match(eNotationRegx);if(notation){let sign=notation[1]||"",eChar=notation[3].indexOf("e")===-1?"E":"e",leadingZeros=notation[2],eAdjacentToLeadingZeros=sign?str[leadingZeros.length+1]===eChar:str[leadingZeros.length]===eChar;return leadingZeros.length>1&&eAdjacentToLeadingZeros?str:leadingZeros.length===1&&(notation[3].startsWith(`.${eChar}`)||notation[3][0]===eChar)?Number(trimmedStr):leadingZeros.length>0?options.leadingZeros&&!eAdjacentToLeadingZeros?(trimmedStr=(notation[1]||"")+notation[3],Number(trimmedStr)):str:Number(trimmedStr)}else return str}function trimZeros(numStr){return numStr&&numStr.indexOf(".")!==-1&&(numStr=numStr.replace(/0+$/,""),numStr==="."?numStr="0":numStr[0]==="."?numStr="0"+numStr:numStr[numStr.length-1]==="."&&(numStr=numStr.substring(0,numStr.length-1))),numStr}function parse_int(numStr,base){let str=numStr.trim();if((base===2||base===8)&&(numStr=str.substring(2)),parseInt)return parseInt(numStr,base);if(Number.parseInt)return Number.parseInt(numStr,base);if(window&&window.parseInt)return window.parseInt(numStr,base);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}function handleInfinity(str,num,options){let isPositive=num===1/0;switch(options.infinity.toLowerCase()){case"null":return null;case"infinity":return num;case"string":return isPositive?"Infinity":"-Infinity";case"original":default:return str}}function getIgnoreAttributesFn(ignoreAttributes){return typeof ignoreAttributes=="function"?ignoreAttributes:Array.isArray(ignoreAttributes)?attrName=>{for(let pattern of ignoreAttributes)if(typeof pattern=="string"&&attrName===pattern||pattern instanceof RegExp&&pattern.test(attrName))return!0}:()=>!1}var Expression=class{constructor(pattern,options={},data){this.pattern=pattern,this.separator=options.separator||".",this.segments=this._parse(pattern),this.data=data,this._hasDeepWildcard=this.segments.some(seg=>seg.type==="deep-wildcard"),this._hasAttributeCondition=this.segments.some(seg=>seg.attrName!==void 0),this._hasPositionSelector=this.segments.some(seg=>seg.position!==void 0)}_parse(pattern){let segments=[],i=0,currentPart="";for(;i<pattern.length;)pattern[i]===this.separator?i+1<pattern.length&&pattern[i+1]===this.separator?(currentPart.trim()&&(segments.push(this._parseSegment(currentPart.trim())),currentPart=""),segments.push({type:"deep-wildcard"}),i+=2):(currentPart.trim()&&segments.push(this._parseSegment(currentPart.trim())),currentPart="",i++):(currentPart+=pattern[i],i++);return currentPart.trim()&&segments.push(this._parseSegment(currentPart.trim())),segments}_parseSegment(part){let segment={type:"tag"},bracketContent=null,withoutBrackets=part,bracketMatch=part.match(/^([^\[]+)(\[[^\]]*\])(.*)$/);if(bracketMatch&&(withoutBrackets=bracketMatch[1]+bracketMatch[3],bracketMatch[2])){let content=bracketMatch[2].slice(1,-1);content&&(bracketContent=content)}let namespace,tagAndPosition=withoutBrackets;if(withoutBrackets.includes("::")){let nsIndex=withoutBrackets.indexOf("::");if(namespace=withoutBrackets.substring(0,nsIndex).trim(),tagAndPosition=withoutBrackets.substring(nsIndex+2).trim(),!namespace)throw new Error(`Invalid namespace in pattern: ${part}`)}let tag,positionMatch=null;if(tagAndPosition.includes(":")){let colonIndex=tagAndPosition.lastIndexOf(":"),tagPart=tagAndPosition.substring(0,colonIndex).trim(),posPart=tagAndPosition.substring(colonIndex+1).trim();["first","last","odd","even"].includes(posPart)||/^nth\(\d+\)$/.test(posPart)?(tag=tagPart,positionMatch=posPart):tag=tagAndPosition}else tag=tagAndPosition;if(!tag)throw new Error(`Invalid segment pattern: ${part}`);if(segment.tag=tag,namespace&&(segment.namespace=namespace),bracketContent)if(bracketContent.includes("=")){let eqIndex=bracketContent.indexOf("=");segment.attrName=bracketContent.substring(0,eqIndex).trim(),segment.attrValue=bracketContent.substring(eqIndex+1).trim()}else segment.attrName=bracketContent.trim();if(positionMatch){let nthMatch=positionMatch.match(/^nth\((\d+)\)$/);nthMatch?(segment.position="nth",segment.positionValue=parseInt(nthMatch[1],10)):segment.position=positionMatch}return segment}get length(){return this.segments.length}hasDeepWildcard(){return this._hasDeepWildcard}hasAttributeCondition(){return this._hasAttributeCondition}hasPositionSelector(){return this._hasPositionSelector}toString(){return this.pattern}};var ExpressionSet=class{constructor(){this._byDepthAndTag=new Map,this._wildcardByDepth=new Map,this._deepWildcards=[],this._deepByTerminalTag=new Map,this._patterns=new Set,this._sealed=!1}add(expression){if(this._sealed)throw new TypeError("ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.");if(this._patterns.has(expression.pattern))return this;if(this._patterns.add(expression.pattern),expression.hasDeepWildcard()){let lastSeg2=expression.segments[expression.segments.length-1];if(lastSeg2&&lastSeg2.type!=="deep-wildcard"&&lastSeg2.tag!=="*"){let tag2=lastSeg2.tag;this._deepByTerminalTag.has(tag2)||this._deepByTerminalTag.set(tag2,[]),this._deepByTerminalTag.get(tag2).push(expression)}else this._deepWildcards.push(expression);return this}let depth=expression.length,tag=expression.segments[expression.segments.length-1]?.tag;if(!tag||tag==="*")this._wildcardByDepth.has(depth)||this._wildcardByDepth.set(depth,[]),this._wildcardByDepth.get(depth).push(expression);else{let key=`${depth}:${tag}`;this._byDepthAndTag.has(key)||this._byDepthAndTag.set(key,[]),this._byDepthAndTag.get(key).push(expression)}return this}addAll(expressions){for(let expr of expressions)this.add(expr);return this}has(expression){return this._patterns.has(expression.pattern)}get size(){return this._patterns.size}seal(){return this._sealed=!0,this}get isSealed(){return this._sealed}matchesAny(matcher){return this.findMatch(matcher)!==null}findMatch(matcher){let depth=matcher.getDepth(),tag=matcher.getCurrentTag(),exactKey=`${depth}:${tag}`,exactBucket=this._byDepthAndTag.get(exactKey);if(exactBucket){for(let i=0;i<exactBucket.length;i++)if(matcher.matches(exactBucket[i]))return exactBucket[i]}let wildcardBucket=this._wildcardByDepth.get(depth);if(wildcardBucket){for(let i=0;i<wildcardBucket.length;i++)if(matcher.matches(wildcardBucket[i]))return wildcardBucket[i]}let deepBucket=this._deepByTerminalTag.get(tag);if(deepBucket){for(let i=0;i<deepBucket.length;i++)if(matcher.matches(deepBucket[i]))return deepBucket[i]}for(let i=0;i<this._deepWildcards.length;i++)if(matcher.matches(this._deepWildcards[i]))return this._deepWildcards[i];return null}};var MatcherView=class{constructor(matcher){this._matcher=matcher}get separator(){return this._matcher.separator}getCurrentTag(){let path=this._matcher.path;return path.length>0?path[path.length-1].tag:void 0}getCurrentNamespace(){let path=this._matcher.path;return path.length>0?path[path.length-1].namespace:void 0}getAttrValue(attrName){let path=this._matcher.path;if(path.length!==0)return path[path.length-1].values?.[attrName]}hasAttr(attrName){let path=this._matcher.path;if(path.length===0)return!1;let current=path[path.length-1];return current.values!==void 0&&attrName in current.values}getAnyParentAttr(attrName){return this._matcher.getAnyParentAttr(attrName)}hasAnyParentAttr(attrName){return this._matcher.hasAnyParentAttr(attrName)}getPosition(){let path=this._matcher.path;return path.length===0?-1:path[path.length-1].position??0}getCounter(){let path=this._matcher.path;return path.length===0?-1:path[path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(separator,includeNamespace=!0){return this._matcher.toString(separator,includeNamespace)}toArray(){return this._matcher.path.map(n=>n.tag)}matches(expression){return this._matcher.matches(expression)}matchesAny(exprSet){return exprSet.matchesAny(this._matcher)}},Matcher=class{constructor(options={}){this.separator=options.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new MatcherView(this),this._keptAttrs=[]}push(tagName,attrValues=null,namespace=null,options=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);let currentLevel=this.path.length,level=this.siblingStacks[currentLevel];level||(level={counts:new Map,total:0},this.siblingStacks[currentLevel]=level);let siblingKey=namespace?`${namespace}:${tagName}`:tagName,counter=level.counts.get(siblingKey)||0,position=level.total;level.counts.set(siblingKey,counter+1),level.total++;let node={tag:tagName,position,counter};namespace!=null&&(node.namespace=namespace),attrValues!=null&&(node.values=attrValues),this.path.push(node);let depth=this.path.length,keep=options!==null?options.keep:null;if(keep!=null&&keep.length>0&&attrValues)for(let i=0;i<keep.length;i++){let name=keep[i];attrValues[name]!==void 0&&this._keptAttrs.push({depth,name,value:attrValues[name]})}}pop(){if(this.path.length===0)return;this._pathStringCache=null;let node=this.path.pop();this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1);let poppedDepth=this.path.length+1;for(;this._keptAttrs.length>0&&this._keptAttrs[this._keptAttrs.length-1].depth>=poppedDepth;)this._keptAttrs.pop();return node}updateCurrent(attrValues){if(this.path.length>0){let current=this.path[this.path.length-1];attrValues!=null&&(current.values=attrValues)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(attrName){if(this.path.length!==0)return this.path[this.path.length-1].values?.[attrName]}hasAttr(attrName){if(this.path.length===0)return!1;let current=this.path[this.path.length-1];return current.values!==void 0&&attrName in current.values}getAnyParentAttr(attrName){let kept=this._keptAttrs;for(let i=kept.length-1;i>=0;i--)if(kept[i].name===attrName)return kept[i].value}hasAnyParentAttr(attrName){let kept=this._keptAttrs;for(let i=kept.length-1;i>=0;i--)if(kept[i].name===attrName)return!0;return!1}getPosition(){return this.path.length===0?-1:this.path[this.path.length-1].position??0}getCounter(){return this.path.length===0?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(separator,includeNamespace=!0){let sep2=separator||this.separator;if(sep2===this.separator&&includeNamespace===!0){if(this._pathStringCache!==null)return this._pathStringCache;let result=this.path.map(n=>n.namespace?`${n.namespace}:${n.tag}`:n.tag).join(sep2);return this._pathStringCache=result,result}return this.path.map(n=>includeNamespace&&n.namespace?`${n.namespace}:${n.tag}`:n.tag).join(sep2)}toArray(){return this.path.map(n=>n.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[],this._keptAttrs=[]}matches(expression){let segments=expression.segments;return segments.length===0?!1:expression.hasDeepWildcard()?this._matchWithDeepWildcard(segments):this._matchSimple(segments)}_matchSimple(segments){if(this.path.length!==segments.length)return!1;for(let i=0;i<segments.length;i++)if(!this._matchSegment(segments[i],this.path[i],i===this.path.length-1))return!1;return!0}_matchWithDeepWildcard(segments){let pathIdx=this.path.length-1,segIdx=segments.length-1;for(;segIdx>=0&&pathIdx>=0;){let segment=segments[segIdx];if(segment.type==="deep-wildcard"){if(segIdx--,segIdx<0)return!0;let nextSeg=segments[segIdx],found=!1;for(let i=pathIdx;i>=0;i--)if(this._matchSegment(nextSeg,this.path[i],i===this.path.length-1)){pathIdx=i-1,segIdx--,found=!0;break}if(!found)return!1}else{if(!this._matchSegment(segment,this.path[pathIdx],pathIdx===this.path.length-1))return!1;pathIdx--,segIdx--}}return segIdx<0}_matchSegment(segment,node,isCurrentNode){if(segment.tag!=="*"&&segment.tag!==node.tag||segment.namespace!==void 0&&segment.namespace!=="*"&&segment.namespace!==node.namespace||segment.attrName!==void 0&&(!isCurrentNode||!node.values||!(segment.attrName in node.values)||segment.attrValue!==void 0&&String(node.values[segment.attrName])!==String(segment.attrValue)))return!1;if(segment.position!==void 0){if(!isCurrentNode)return!1;let counter=node.counter??0;if(segment.position==="first"&&counter!==0)return!1;if(segment.position==="odd"&&counter%2!==1)return!1;if(segment.position==="even"&&counter%2!==0)return!1;if(segment.position==="nth"&&counter!==segment.positionValue)return!1}return!0}matchesAny(exprSet){return exprSet.matchesAny(this)}snapshot(){return{path:this.path.map(node=>({...node})),siblingStacks:this.siblingStacks.map(level=>level&&{counts:new Map(level.counts),total:level.total}),keptAttrs:this._keptAttrs.map(entry=>({...entry}))}}restore(snapshot){this._pathStringCache=null,this.path=snapshot.path.map(node=>({...node})),this.siblingStacks=snapshot.siblingStacks.map(level=>level&&{counts:new Map(level.counts),total:level.total}),this._keptAttrs=(snapshot.keptAttrs||[]).map(entry=>({...entry}))}readOnly(){return this._view}};var HTML_PATTERNS=[{id:"html-script-open",description:"<script opening tag",pattern:/<script[\s>/]/i},{id:"html-script-close",description:"</script closing tag",pattern:/<\/script[\s>]/i},{id:"html-javascript-protocol",description:"javascript: URI scheme (with optional whitespace/encoding)",pattern:/j[\t\n\r ]*a[\t\n\r ]*v[\t\n\r ]*a[\t\n\r ]*s[\t\n\r ]*c[\t\n\r ]*r[\t\n\r ]*i[\t\n\r ]*p[\t\n\r ]*t[\t\n\r ]*:/i},{id:"html-vbscript-protocol",description:"vbscript: URI scheme",pattern:/vbscript[\t\n\r ]*:/i},{id:"html-data-html",description:"data:text/html URI \u2014 can execute scripts in browsers",pattern:/data[\t\n\r ]*:[\t\n\r ]*text\/html/i},{id:"html-data-xhtml",description:"data:application/xhtml+xml URI",pattern:/data[\t\n\r ]*:[\t\n\r ]*application\/xhtml/i},{id:"html-data-svg",description:"data:image/svg+xml URI \u2014 can execute scripts",pattern:/data[\t\n\r ]*:[\t\n\r ]*image\/svg\+xml/i},{id:"html-inline-event-handler",description:"Inline event handler attributes: onclick=, onerror=, onload=, etc.",pattern:/\bon\w{1,30}\s*=/i},{id:"html-entity-obfuscated-script",description:"HTML-entity-encoded <script (e.g. &#x3C;script or &lt;script)",pattern:/(?:&#x0*3[Cc];?|&#0*60;?|&lt;)\s*script/i},{id:"html-entity-obfuscated-javascript",description:'HTML-entity-encoded javascript: (partial \u2014 catches common &#106; or &#x6a; for "j")',pattern:/(?:&#x0*6[Aa];?|&#0*106;?)\s*(?:&#x0*61;?|a)[\s\S]{0,80}script\s*:/i},{id:"html-style-expression",description:"CSS expression() \u2014 IE-era code execution in style attributes",pattern:/style[\s\S]{0,20}expression\s*\(/i},{id:"html-object-embed",description:"<object or <embed tags that can load active content",pattern:/<(?:object|embed)[\s>/]/i},{id:"html-base-tag",description:"<base href= \u2014 can hijack all relative URLs on a page",pattern:/<base[\s>]/i},{id:"html-meta-refresh",description:'<meta http-equiv="refresh" \u2014 can redirect users',pattern:/<meta[\s\S]{0,40}http-equiv[\s\S]{0,20}refresh/i},{id:"html-srcdoc",description:"srcdoc= attribute on iframes \u2014 embeds HTML that can run scripts",pattern:/srcdoc\s*=/i},{id:"html-iframe",description:"<iframe tag",pattern:/<iframe[\s>/]/i},{id:"html-form",description:"<form tag \u2014 can be used for phishing / credential harvesting injection",pattern:/<form[\s>/]/i}],html_default=HTML_PATTERNS;var XML_PATTERNS=[{id:"xml-cdata-injection",description:"CDATA section injection: <![CDATA[ breaks out of text node context",pattern:/<!\[CDATA\[/i},{id:"xml-cdata-close",description:"CDATA close sequence: ]]> can terminate an enclosing CDATA section",pattern:/\]\]>/},{id:"xml-processing-instruction",description:"XML processing instruction: <?xml-stylesheet or <?php etc.",pattern:/<\?(?:xml[\- ]|php|asp)/i},{id:"xml-doctype-injection",description:"DOCTYPE declaration embedded in content \u2014 can define entities",pattern:/<!DOCTYPE(?:[\s[]|$)/i},{id:"xml-entity-system",description:"SYSTEM keyword \u2014 used in external entity declarations (XXE)",pattern:/\bSYSTEM\s+["']/i},{id:"xml-entity-public",description:"PUBLIC keyword \u2014 used in external entity declarations (XXE)",pattern:/\bPUBLIC\s+["']/i},{id:"xml-entity-declaration",description:"<!ENTITY declaration \u2014 defines entities, potential XXE or entity expansion",pattern:/<!ENTITY[\s%]/i},{id:"xml-billion-laughs",description:"Entity reference chaining / billion laughs: repeated &eX; style references",pattern:/(?:&\w{1,20};){3,}/},{id:"xml-namespace-confusion",description:"xmlns: attribute injection \u2014 can redefine namespaces to confuse parsers",pattern:/\bxmlns\s*(?::\w{1,40})?\s*=/i},{id:"xml-comment-injection",description:"<!-- comment injection \u2014 can hide content from some parsers",pattern:/<!--/},{id:"xml-comment-close",description:"--> closes an enclosing XML comment",pattern:/-->/},{id:"xml-pi-close",description:"?> closes an enclosing processing instruction",pattern:/\?>/}],xml_default=XML_PATTERNS;var SVG_PATTERNS=[{id:"svg-script-element",description:"<script element inside SVG executes JavaScript",pattern:/<script[\s>/]/i},{id:"svg-xlink-href-javascript",description:"xlink:href with javascript: \u2014 classic SVG XSS via <a> or <use>",pattern:/xlink\s*:\s*href\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-href-javascript",description:"href= with javascript: in SVG context (<a>, <animate>, etc.)",pattern:/href\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-foreignobject",description:"<foreignObject embeds HTML inside SVG \u2014 can execute scripts",pattern:/<foreignObject[\s>/]/i},{id:"svg-use-external",description:"<use xlink:href or href pointing to external resource (non-fragment URL)",pattern:/<use[\s\S]{0,60}(?:xlink\s*:\s*)?href\s*=\s*(?:["'][^#]|[^"'#\s>])/i},{id:"svg-animate-href",description:'<animate attributeName="href" \u2014 can dynamically change href to javascript:',pattern:/<animate[\s\S]{0,80}attributeName\s*=\s*["'][\s]*href["']/i},{id:"svg-animate-xlinkhref",description:'<animate attributeName="xlink:href"',pattern:/<animate[\s\S]{0,80}attributeName\s*=\s*["'][\s]*xlink\s*:\s*href["']/i},{id:"svg-set-javascript",description:'<set to="javascript:..." \u2014 sets an attribute to a javascript: URI',pattern:/<set[\s\S]{0,80}to\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-event-handler",description:"SVG-specific event handler attributes: onload=, onerror=, onactivate=, etc.",pattern:/\bon(?:load|error|activate|begin|end|repeat|focus|blur|click|mouse\w{1,20}|key\w{1,20})\s*=/i},{id:"svg-handler-generic",description:"Generic on* handler catch-all for SVG attributes",pattern:/\bon\w{1,30}\s*=/i},{id:"svg-filter-feimage",description:"<feImage href= \u2014 filter primitive that can load external resources",pattern:/<feImage[\s\S]{0,80}(?:xlink\s*:\s*)?href\s*=/i},{id:"svg-image-external",description:"<image xlink:href with http/https or javascript protocol",pattern:/<image[\s\S]{0,80}(?:xlink\s*:\s*)?href\s*=\s*["']?\s*(?:https?|javascript)\s*:/i},{id:"svg-style-javascript",description:"style= attribute containing javascript: (e.g. background:url(javascript:...))",pattern:/style\s*=[\s\S]{0,60}javascript\s*:/i}],svg_default=SVG_PATTERNS;var SQL_PATTERNS=[{id:"sql-block-comment-open",description:"SQL block comment open: /* ... */ \u2014 unusual in legitimate user text",pattern:/\/\*/},{id:"sql-union-select",description:"UNION SELECT \u2014 most common SQL injection aggregation attack",pattern:/\bUNION\s{1,20}(?:ALL\s{1,20})?SELECT\b/i},{id:"sql-drop-table",description:"DROP TABLE \u2014 destructive DDL injection",pattern:/\bDROP\s{1,20}TABLE\b/i},{id:"sql-drop-database",description:"DROP DATABASE \u2014 destructive DDL injection",pattern:/\bDROP\s{1,20}DATABASE\b/i},{id:"sql-insert-into",description:"INSERT INTO \u2014 data injection",pattern:/\bINSERT\s{1,20}INTO\b/i},{id:"sql-delete-from",description:"DELETE FROM \u2014 data deletion injection",pattern:/\bDELETE\s{1,20}FROM\b/i},{id:"sql-update-set",description:"UPDATE ... SET \u2014 data modification injection",pattern:/\bUPDATE\b[\s\S]{1,60}\bSET\b/i},{id:"sql-exec-xp",description:"EXEC xp_ \u2014 MSSQL extended stored procedure execution",pattern:/\bEXEC(?:UTE)?\s{1,20}xp_/i},{id:"sql-tautology-string",description:`Classic string tautology: ' OR '1'='1 or " OR "1"="1"`,pattern:/'\s{0,10}OR\s{0,10}'[^']{0,20}'\s*=\s*'[^']{0,20}/i},{id:"sql-tautology-numeric",description:"Numeric tautology: OR 1=1",pattern:/\bOR\s{1,10}1\s*=\s*1\b/i},{id:"sql-always-true-zero",description:"Numeric tautology: OR 0=0",pattern:/\bOR\s{1,10}0\s*=\s*0\b/i},{id:"sql-sleep-benchmark",description:"Time-based blind injection: SLEEP() or BENCHMARK()",pattern:/\b(?:SLEEP|BENCHMARK)\s*\(/i},{id:"sql-waitfor-delay",description:"MSSQL time-based blind injection: WAITFOR DELAY",pattern:/\bWAITFOR\s{1,20}DELAY\b/i},{id:"sql-char-function",description:"CHAR() function \u2014 used to obfuscate injected strings",pattern:/\bCHAR\s*\(\s*\d{1,3}/i},{id:"sql-information-schema",description:"INFORMATION_SCHEMA \u2014 reconnaissance query for table/column enumeration",pattern:/\bINFORMATION_SCHEMA\b/i}],sql_default=SQL_PATTERNS;var SHELL_PATTERNS=[{id:"shell-path-traversal-unix",description:"Unix path traversal: ../ \u2014 climbing the directory tree",pattern:/\.\.\//},{id:"shell-path-traversal-windows",description:"Windows path traversal: ..\\ \u2014 climbing the directory tree",pattern:/\.\.\\/},{id:"shell-path-traversal-encoded",description:"URL-encoded path traversal: %2e%2e or %2f variants",pattern:/%2e%2e|%2f\.\.|\.\.%2f/i},{id:"shell-null-byte",description:"Null byte injection: \\x00 or %00 \u2014 truncates strings in C-backed functions",pattern:/\x00|%00/},{id:"shell-semicolon",description:"Semicolon command separator: cmd1; cmd2",pattern:/;/},{id:"shell-pipe",description:"Pipe operator: cmd1 | cmd2",pattern:/\|/},{id:"shell-and-operator",description:"AND operator: cmd1 && cmd2",pattern:/&&/},{id:"shell-or-operator",description:"OR operator: cmd1 || cmd2",pattern:/\|\|/},{id:"shell-backtick",description:"Backtick command substitution: `cmd`",pattern:/`/},{id:"shell-dollar-paren",description:"Dollar-paren command substitution: $(cmd)",pattern:/\$\(/},{id:"shell-dollar-brace",description:"Dollar-brace variable expansion: ${var} \u2014 can be abused for injection",pattern:/\$\{/},{id:"shell-redirect-out",description:"Output redirection: cmd > file or cmd >> file",pattern:/>{1,2}/},{id:"shell-redirect-in",description:"Input redirection: cmd < file",pattern:/</},{id:"shell-newline-injection",description:"Newline injection: \\n or \\r \u2014 can inject new shell commands",pattern:/[\n\r]/},{id:"shell-glob-star",description:"Glob expansion: * or ? \u2014 can expand to unintended files",pattern:/[/\\][*?]/},{id:"shell-absolute-root",description:"Absolute root path injection: string starting with / or \\ (Windows UNC)",pattern:/^(?:\/|\\\\)/},{id:"shell-windows-drive",description:"Windows drive letter path injection: C:\\ or D:/",pattern:/^[a-zA-Z]:[/\\]/},{id:"shell-curl-wget",description:"curl/wget with URL or flags \u2014 can exfiltrate data or download payloads",pattern:/\b(?:curl|wget)\s+(?:https?:\/\/|ftp:\/\/|-)/i}],shell_default=SHELL_PATTERNS;var REDOS_PATTERNS=[{id:"redos-nested-quantifier-plus",description:"Nested + quantifier inside a group with outer quantifier: (a+)+, (.+b)*, etc.",pattern:/\([^)]*\+[^)]*\)[+*]/},{id:"redos-nested-quantifier-star",description:"Nested * quantifier: (a*)* or (a*)+ \u2014 catastrophic backtracking",pattern:/\([^)]*\*[^)]*\)[*+]/},{id:"redos-nested-groups",description:"Doubly nested quantified groups: ((a+)+) \u2014 guaranteed catastrophic",pattern:/\(\([^)]{0,40}\)[+*]\)[+*]/},{id:"redos-alternation-overlap",description:"Overlapping alternation under quantifier: (a|a)+ \u2014 ambiguous NFA paths",pattern:/\(([^|()]{1,20})\|(?:\1)(?:\|[^|()]{1,20}){0,5}\)[+*?]{1,2}/},{id:"redos-star-plus-concat",description:"(x*x)+ pattern \u2014 triggers super-linear backtracking",pattern:/\([^)]{0,10}\*[^)]{0,10}\)[+*]/},{id:"redos-dot-star-greedy",description:"(.*){n,} or (.+){n,} \u2014 repeated greedy dot quantifiers",pattern:/\(\.[*+]\)\{?\d/},{id:"redos-large-repetition",description:"Very large fixed or range repetition count {1000,} or {1000,n} \u2014 denial of service via backtracking",pattern:/\{\d{4,}(?:,\d*)?\}/},{id:"redos-catastrophic-alternation",description:"Long alternation with many similar branches \u2014 polynomial backtracking risk",pattern:/\([^)]{0,200}(?:\|[^|)]{0,50}){9,}\)/}],redos_default=REDOS_PATTERNS;var sep=`["'\\s]*:`,NOSQL_PATTERNS=[{id:"nosql-where-operator",description:"$where \u2014 executes arbitrary JavaScript server-side in MongoDB",pattern:new RegExp(`\\$where${sep}`,"i")},{id:"nosql-ne-operator",description:'$ne \u2014 "not equal" operator used to bypass equality checks',pattern:new RegExp(`\\$ne${sep}`,"i")},{id:"nosql-gt-operator",description:'$gt \u2014 "greater than" used to bypass password/value checks',pattern:new RegExp(`\\$gte?${sep}`,"i")},{id:"nosql-lt-operator",description:'$lt / $lte \u2014 "less than" bypass variants',pattern:new RegExp(`\\$lte?${sep}`,"i")},{id:"nosql-regex-operator",description:"$regex \u2014 can be used to extract data character by character (blind injection)",pattern:new RegExp(`\\$regex${sep}`,"i")},{id:"nosql-or-operator",description:"$or \u2014 logical OR; used to create always-true conditions",pattern:new RegExp(`\\$or${sep}\\s*\\[`,"i")},{id:"nosql-and-operator",description:"$and \u2014 logical AND operator injection",pattern:new RegExp(`\\$and${sep}\\s*\\[`,"i")},{id:"nosql-nor-operator",description:"$nor \u2014 logical NOR operator injection",pattern:new RegExp(`\\$nor${sep}\\s*\\[`,"i")},{id:"nosql-exists-operator",description:"$exists \u2014 can enumerate fields to determine schema",pattern:new RegExp(`\\$exists${sep}`,"i")},{id:"nosql-in-operator",description:"$in \u2014 matches any value in a list; can enumerate values",pattern:new RegExp(`\\$in${sep}\\s*\\[`,"i")},{id:"nosql-expr-operator",description:"$expr \u2014 allows aggregation expressions in queries (MongoDB 3.6+)",pattern:new RegExp(`\\$expr${sep}`,"i")},{id:"nosql-function-operator",description:"$function \u2014 executes arbitrary JavaScript in MongoDB 4.4+",pattern:new RegExp(`\\$function${sep}`,"i")},{id:"nosql-accumulator-operator",description:"$accumulator \u2014 custom aggregation with arbitrary JS execution",pattern:new RegExp(`\\$accumulator${sep}`,"i")},{id:"nosql-proto-pollution",description:"__proto__ \u2014 prototype pollution via object key injection",pattern:/__proto__/},{id:"nosql-constructor-prototype",description:"constructor.prototype \u2014 alternative prototype pollution vector (dot notation or JSON key)",pattern:/constructor[\s"':.,{\[]*prototype/i},{id:"nosql-proto-bracket",description:'["__proto__"] \u2014 bracket-notation prototype pollution',pattern:/\[["']__proto__["']\]/}],nosql_default=NOSQL_PATTERNS;var LOG_PATTERNS=[{id:"log-crlf-injection",description:"CRLF injection: literal \\r or \\n embeds fake log lines",pattern:/[\r\n]/},{id:"log-url-encoded-crlf",description:"URL-encoded CRLF: %0d, %0a, %0D, %0A \u2014 decoded by some log parsers",pattern:/%0[dDaA]/},{id:"log-unicode-newline",description:"Unicode newline variants: U+2028 (line separator), U+2029 (paragraph separator)",pattern:/[\u2028\u2029]/},{id:"log-log4shell-jndi",description:"Log4Shell: ${jndi:...} triggers remote code execution in Apache Log4j",pattern:/\$\{jndi\s*:/i},{id:"log-log4shell-obfuscated",description:"Obfuscated Log4Shell: ${::-j}... lookup-bypass prefix used to evade WAF detection",pattern:/\$\{::-/},{id:"log-log4j-lookup",description:"Log4j lookup syntax: ${env:...}, ${sys:...}, ${ctx:...} \u2014 data exfiltration",pattern:/\$\{(?:env|sys|ctx|main|map|sd|web|docker|k8s|spring)\s*:/i},{id:"log-ssti-double-brace",description:"SSTI double-brace: {{expression}} \u2014 Jinja2, Twig, Handlebars, etc.",pattern:/\{\{[\s\S]{0,80}\}\}/},{id:"log-ssti-hash-brace",description:"SSTI hash-brace: #{expression} \u2014 Thymeleaf, Velocity, Ruby ERB",pattern:/#\{[\s\S]{0,80}\}/},{id:"log-ssti-dollar-brace",description:"SSTI/EL injection: ${expression with operators or method calls} \u2014 JSP EL, Freemarker, SpEL",pattern:/\$\{[^}]*(?:\.|\(|\*|\+|\bclass\b|\bruntime\b|\bprocess\b|\bexec\b)[^}]{0,80}\}/i},{id:"log-ssti-percent-tag",description:"SSTI ERB/ASP tag: <%= expression %> \u2014 Ruby ERB, ASP",pattern:/<%=[\s\S]{0,80}%>/},{id:"log-null-byte",description:"Null byte: \\x00 or %00 \u2014 can truncate log entries in C-backed loggers",pattern:/\x00|%00/},{id:"log-ansi-escape",description:"ANSI escape sequence: ESC[ \u2014 can manipulate terminal output when logs are tailed",pattern:/\x1b\[/}],log_default=LOG_PATTERNS;var SQL_STRICT_EXTRA=[{id:"sql-line-comment",description:"SQL line comment: -- followed by whitespace or end of string",pattern:/--(?:\s|$)/},{id:"sql-stacked-query",description:"Stacked queries: semicolon immediately followed by a SQL keyword",pattern:/;\s{0,10}(?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC)\b/i},{id:"sql-hex-encoding",description:"Hex-encoded string injection: 0x41414141 style (MySQL)",pattern:/\b0x[0-9a-f]{4,}/i}],SQL_STRICT_PATTERNS=[...sql_default,...SQL_STRICT_EXTRA],sql_strict_default=SQL_STRICT_PATTERNS;html_default.label="HTML";xml_default.label="XML";svg_default.label="SVG";sql_default.label="SQL";sql_strict_default.label="SQL-STRICT";shell_default.label="SHELL";redos_default.label="REDOS";nosql_default.label="NOSQL";log_default.label="LOG";var VALID_CONTEXTS=Object.freeze({HTML:html_default,XML:xml_default,SVG:svg_default,SQL:sql_default,"SQL-STRICT":sql_strict_default,SHELL:shell_default,REDOS:redos_default,NOSQL:nosql_default,LOG:log_default});function assertString(value){if(typeof value!="string")throw new TypeError(`is-unsafe: first argument must be a string, got ${typeof value}`)}function assertContext(context){if(!(context instanceof RegExp)){if(Array.isArray(context)){if(context.length===0)throw new TypeError("is-unsafe: context must not be an empty array");if(Array.isArray(context[0])){for(let list of context)if(!Array.isArray(list)||list.length===0)throw new TypeError("is-unsafe: each context in the array must be a non-empty pattern array (PatternList)")}return}throw new TypeError(`is-unsafe: second argument must be a PatternList (e.g. HTML), an array of PatternLists (e.g. [HTML, XML]), or a RegExp. Got: ${typeof context}`)}}function normalise(context){return context instanceof RegExp?{lists:null,regex:context}:Array.isArray(context[0])?{lists:context,regex:null}:{lists:[context],regex:null}}function matchList(value,list){let label=list.label??"CUSTOM";for(let rule of list)if(rule.pattern.test(value))return{context:label,id:rule.id,description:rule.description,pattern:rule.pattern};return null}function isUnsafe(value,context){assertString(value),assertContext(context);let{lists,regex}=normalise(context);if(regex)return regex.test(value);for(let list of lists)if(matchList(value,list)!==null)return!0;return!1}function extractRawAttributes(prefixedAttrs,options){if(!prefixedAttrs)return{};let attrs=options.attributesGroupName?prefixedAttrs[options.attributesGroupName]:prefixedAttrs;if(!attrs)return{};let rawAttrs={};for(let key in attrs)if(key.startsWith(options.attributeNamePrefix)){let rawName=key.substring(options.attributeNamePrefix.length);rawAttrs[rawName]=attrs[key]}else rawAttrs[key]=attrs[key];return rawAttrs}function extractNamespace(rawTagName){if(!rawTagName||typeof rawTagName!="string")return;let colonIndex=rawTagName.indexOf(":");if(colonIndex!==-1&&colonIndex>0){let ns=rawTagName.substring(0,colonIndex);if(ns!=="xmlns")return ns}}var OrderedObjParser=class{constructor(options,externalEntities){this.options=options,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=parseXml,this.parseTextData=parseTextData,this.resolveNameSpace=resolveNameSpace,this.buildAttributesMap=buildAttributesMap,this.isItStopNode=isItStopNode,this.replaceEntitiesValue=replaceEntitiesValue,this.readStopNodeData=readStopNodeData,this.saveTextToParentTag=saveTextToParentTag,this.addChild=addChild,this.ignoreAttributesFn=getIgnoreAttributesFn(this.options.ignoreAttributes),this.entityExpansionCount=0,this.currentExpandedLength=0,this.doctypefound=!1;let namedEntities={...XML};this.options.entityDecoder?this.entityDecoder=this.options.entityDecoder:(typeof this.options.htmlEntities=="object"?namedEntities=this.options.htmlEntities:this.options.htmlEntities===!0&&(namedEntities={...COMMON_HTML,...CURRENCY}),this.entityDecoder=new EntityDecoder({namedEntities:{...namedEntities,...externalEntities},numericAllowed:this.options.htmlEntities,limit:{maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:this.options.processEntities.appliesTo},onInputEntity:(name,value)=>isUnsafe(value,[html_default,xml_default])?ENTITY_ACTION.BLOCK:ENTITY_ACTION.ALLOW})),this.matcher=new Matcher,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new ExpressionSet;let stopNodesOpts=this.options.stopNodes;if(stopNodesOpts&&stopNodesOpts.length>0){for(let i=0;i<stopNodesOpts.length;i++){let stopNodeExp=stopNodesOpts[i];typeof stopNodeExp=="string"?this.stopNodeExpressionsSet.add(new Expression(stopNodeExp)):stopNodeExp instanceof Expression&&this.stopNodeExpressionsSet.add(stopNodeExp)}this.stopNodeExpressionsSet.seal()}}};function parseTextData(val,tagName,jPath,dontTrim,hasAttributes,isLeafNode,escapeEntities){let options=this.options;if(val!==void 0&&(options.trimValues&&!dontTrim&&(val=val.trim()),val.length>0)){escapeEntities||(val=this.replaceEntitiesValue(val,tagName,jPath));let jPathOrMatcher=options.jPath?jPath.toString():jPath,newval=options.tagValueProcessor(tagName,val,jPathOrMatcher,hasAttributes,isLeafNode);return newval==null?val:typeof newval!=typeof val||newval!==val?newval:options.trimValues||val.trim()===val?parseValue(val,options.parseTagValue,options.numberParseOptions):val}}function resolveNameSpace(tagname){if(this.options.removeNSPrefix){let tags=tagname.split(":"),prefix=tagname.charAt(0)==="/"?"/":"";if(tags[0]==="xmlns")return"";tags.length===2&&(tagname=prefix+tags[1])}return tagname}var attrsRegx=new RegExp(`([^\\s=]+)\\s*(=\\s*(['"])([\\s\\S]*?)\\3)?`,"gm");function buildAttributesMap(attrStr,jPath,tagName,force=!1){let options=this.options;if(force===!0||options.ignoreAttributes!==!0&&typeof attrStr=="string"){let matches=getAllMatches(attrStr,attrsRegx),len=matches.length,attrs={},processedVals=new Array(len),hasRawAttrs=!1,rawAttrsForMatcher={};for(let i=0;i<len;i++){let attrName=this.resolveNameSpace(matches[i][1]),oldVal=matches[i][4];if(attrName.length&&oldVal!==void 0){let val=oldVal;options.trimValues&&(val=val.trim()),val=this.replaceEntitiesValue(val,tagName,this.readonlyMatcher),processedVals[i]=val,rawAttrsForMatcher[attrName]=val,hasRawAttrs=!0}}hasRawAttrs&&typeof jPath=="object"&&jPath.updateCurrent&&jPath.updateCurrent(rawAttrsForMatcher);let jPathStr=options.jPath?jPath.toString():this.readonlyMatcher,hasAttrs=!1;for(let i=0;i<len;i++){let attrName=this.resolveNameSpace(matches[i][1]);if(this.ignoreAttributesFn(attrName,jPathStr))continue;let aName=options.attributeNamePrefix+attrName;if(attrName.length)if(options.transformAttributeName&&(aName=options.transformAttributeName(aName)),aName=sanitizeName(aName,options),matches[i][4]!==void 0){let oldVal=processedVals[i],newVal=options.attributeValueProcessor(attrName,oldVal,jPathStr);newVal==null?attrs[aName]=oldVal:typeof newVal!=typeof oldVal||newVal!==oldVal?attrs[aName]=newVal:attrs[aName]=parseValue(oldVal,options.parseAttributeValue,options.numberParseOptions),hasAttrs=!0}else options.allowBooleanAttributes&&(attrs[aName]=!0,hasAttrs=!0)}if(!hasAttrs)return;if(options.attributesGroupName&&!options.preserveOrder){let attrCollection={};return attrCollection[options.attributesGroupName]=attrs,attrCollection}return attrs}}var parseXml=function(xmlData){xmlData=xmlData.replace(/\r\n?/g,`
7
+ `);let xmlObj=new XmlNode("!xml"),currentNode=xmlObj,textData="";this.matcher.reset(),this.entityDecoder.reset(),this.entityExpansionCount=0,this.currentExpandedLength=0,this.doctypefound=!1;let options=this.options,docTypeReader=new DocTypeReader(options.processEntities),xmlLen=xmlData.length;for(let i=0;i<xmlLen;i++)if(xmlData[i]==="<"){let c1=xmlData.charCodeAt(i+1);if(c1===47){let closeIndex=findClosingIndex(xmlData,">",i,"Closing Tag is not closed."),tagName=xmlData.substring(i+2,closeIndex).trim();if(options.removeNSPrefix){let colonIndex=tagName.indexOf(":");colonIndex!==-1&&(tagName=tagName.substr(colonIndex+1))}tagName=transformTagName(options.transformTagName,tagName,"",options).tagName,currentNode&&(textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher));let lastTagName=this.matcher.getCurrentTag();if(tagName&&options.unpairedTagsSet.has(tagName))throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`);lastTagName&&options.unpairedTagsSet.has(lastTagName)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,currentNode=this.tagsNodeStack.pop(),textData="",i=closeIndex}else if(c1===63){let tagData=readTagExp(xmlData,i,!1,"?>");if(!tagData)throw new Error("Pi Tag is not closed.");textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher);let attsMap=this.buildAttributesMap(tagData.tagExp,this.matcher,tagData.tagName,!0);if(attsMap){let ver=attsMap[this.options.attributeNamePrefix+"version"];this.entityDecoder.setXmlVersion(Number(ver)||1),docTypeReader.setXmlVersion(Number(ver)||1)}if(!(options.ignoreDeclaration&&tagData.tagName==="?xml"||options.ignorePiTags)){let childNode=new XmlNode(tagData.tagName);childNode.add(options.textNodeName,""),tagData.tagName!==tagData.tagExp&&tagData.attrExpPresent&&options.ignoreAttributes!==!0&&(childNode[":@"]=attsMap),this.addChild(currentNode,childNode,this.readonlyMatcher,i)}i=tagData.closeIndex+1}else if(c1===33&&xmlData.charCodeAt(i+2)===45&&xmlData.charCodeAt(i+3)===45){let endIndex=findClosingIndex(xmlData,"-->",i+4,"Comment is not closed.");if(options.commentPropName){let comment=xmlData.substring(i+4,endIndex-2);textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher),currentNode.add(options.commentPropName,[{[options.textNodeName]:comment}])}i=endIndex}else if(c1===33&&xmlData.charCodeAt(i+2)===68){if(this.doctypefound)throw new Error("Multiple DOCTYPE declarations found.");this.doctypefound=!0;let result=docTypeReader.readDocType(xmlData,i);this.entityDecoder.addInputEntities(result.entities),i=result.i}else if(c1===33&&xmlData.charCodeAt(i+2)===91){let closeIndex=findClosingIndex(xmlData,"]]>",i,"CDATA is not closed.")-2,tagExp=xmlData.substring(i+9,closeIndex);textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher);let val=this.parseTextData(tagExp,currentNode.tagname,this.readonlyMatcher,!0,!1,!0,!0);val==null&&(val=""),options.cdataPropName?currentNode.add(options.cdataPropName,[{[options.textNodeName]:tagExp}]):currentNode.add(options.textNodeName,val),i=closeIndex+2}else{let result=readTagExp(xmlData,i,options.removeNSPrefix);if(!result){let context=xmlData.substring(Math.max(0,i-50),Math.min(xmlLen,i+50));throw new Error(`readTagExp returned undefined at position ${i}. Context: "${context}"`)}let tagName=result.tagName,rawTagName=result.rawTagName,tagExp=result.tagExp,attrExpPresent=result.attrExpPresent,closeIndex=result.closeIndex;if({tagName,tagExp}=transformTagName(options.transformTagName,tagName,tagExp,options),options.strictReservedNames&&(tagName===options.commentPropName||tagName===options.cdataPropName||tagName===options.textNodeName||tagName===options.attributesGroupName))throw new Error(`Invalid tag name: ${tagName}`);currentNode&&textData&&currentNode.tagname!=="!xml"&&(textData=this.saveTextToParentTag(textData,currentNode,this.readonlyMatcher,!1));let lastTag=currentNode;lastTag&&options.unpairedTagsSet.has(lastTag.tagname)&&(currentNode=this.tagsNodeStack.pop(),this.matcher.pop());let isSelfClosing=!1;tagExp.length>0&&tagExp.lastIndexOf("/")===tagExp.length-1&&(isSelfClosing=!0,tagName[tagName.length-1]==="/"?(tagName=tagName.substr(0,tagName.length-1),tagExp=tagName):tagExp=tagExp.substr(0,tagExp.length-1),attrExpPresent=tagName!==tagExp);let prefixedAttrs=null,rawAttrs={},namespace;namespace=extractNamespace(rawTagName),tagName!==xmlObj.tagname&&this.matcher.push(tagName,{},namespace),tagName!==tagExp&&attrExpPresent&&(prefixedAttrs=this.buildAttributesMap(tagExp,this.matcher,tagName),prefixedAttrs&&(rawAttrs=extractRawAttributes(prefixedAttrs,options))),tagName!==xmlObj.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());let startIndex=i;if(this.isCurrentNodeStopNode){let tagContent="";if(isSelfClosing)i=result.closeIndex;else if(options.unpairedTagsSet.has(tagName))i=result.closeIndex;else{let result2=this.readStopNodeData(xmlData,rawTagName,closeIndex+1);if(!result2)throw new Error(`Unexpected end of ${rawTagName}`);i=result2.i,tagContent=result2.tagContent}let childNode=new XmlNode(tagName);prefixedAttrs&&(childNode[":@"]=prefixedAttrs),childNode.add(options.textNodeName,tagContent),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex)}else{if(isSelfClosing){({tagName,tagExp}=transformTagName(options.transformTagName,tagName,tagExp,options));let childNode=new XmlNode(tagName);prefixedAttrs&&(childNode[":@"]=prefixedAttrs),this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else if(options.unpairedTagsSet.has(tagName)){let childNode=new XmlNode(tagName);prefixedAttrs&&(childNode[":@"]=prefixedAttrs),this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex),this.matcher.pop(),this.isCurrentNodeStopNode=!1,i=result.closeIndex;continue}else{let childNode=new XmlNode(tagName);if(this.tagsNodeStack.length>options.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(currentNode),prefixedAttrs&&(childNode[":@"]=prefixedAttrs),this.addChild(currentNode,childNode,this.readonlyMatcher,startIndex),currentNode=childNode}textData="",i=closeIndex}}}else textData+=xmlData[i];return xmlObj.child};function addChild(currentNode,childNode,matcher,startIndex){this.options.captureMetaData||(startIndex=void 0);let jPathOrMatcher=this.options.jPath?matcher.toString():matcher,result=this.options.updateTag(childNode.tagname,jPathOrMatcher,childNode[":@"]);result===!1||(typeof result=="string"&&(childNode.tagname=result),currentNode.addChild(childNode,startIndex))}function replaceEntitiesValue(val,tagName,jPath){let entityConfig=this.options.processEntities;if(!entityConfig||!entityConfig.enabled)return val;if(entityConfig.allowedTags){let jPathOrMatcher=this.options.jPath?jPath.toString():jPath;if(!(Array.isArray(entityConfig.allowedTags)?entityConfig.allowedTags.includes(tagName):entityConfig.allowedTags(tagName,jPathOrMatcher)))return val}if(entityConfig.tagFilter){let jPathOrMatcher=this.options.jPath?jPath.toString():jPath;if(!entityConfig.tagFilter(tagName,jPathOrMatcher))return val}return this.entityDecoder.decode(val)}function saveTextToParentTag(textData,parentNode,matcher,isLeafNode){return textData&&(isLeafNode===void 0&&(isLeafNode=parentNode.child.length===0),textData=this.parseTextData(textData,parentNode.tagname,matcher,!1,parentNode[":@"]?Object.keys(parentNode[":@"]).length!==0:!1,isLeafNode),textData!==void 0&&textData!==""&&parentNode.add(this.options.textNodeName,textData),textData=""),textData}function isItStopNode(){return this.stopNodeExpressionsSet.size===0?!1:this.matcher.matchesAny(this.stopNodeExpressionsSet)}function tagExpWithClosingIndex(xmlData,i,closingChar=">"){let attrBoundary=0,len=xmlData.length,closeCode0=closingChar.charCodeAt(0),closeCode1=closingChar.length>1?closingChar.charCodeAt(1):-1,result="",segmentStart=i;for(let index=i;index<len;index++){let code=xmlData.charCodeAt(index);if(attrBoundary)code===attrBoundary&&(attrBoundary=0);else if(code===34||code===39)attrBoundary=code;else if(code===closeCode0)if(closeCode1!==-1){if(xmlData.charCodeAt(index+1)===closeCode1)return result+=xmlData.substring(segmentStart,index),{data:result,index}}else return result+=xmlData.substring(segmentStart,index),{data:result,index};else code===9&&!attrBoundary&&(result+=xmlData.substring(segmentStart,index)+" ",segmentStart=index+1)}}function findClosingIndex(xmlData,str,i,errMsg){let closingIndex=xmlData.indexOf(str,i);if(closingIndex===-1)throw new Error(errMsg);return closingIndex+str.length-1}function findClosingChar(xmlData,char,i,errMsg){let closingIndex=xmlData.indexOf(char,i);if(closingIndex===-1)throw new Error(errMsg);return closingIndex}function readTagExp(xmlData,i,removeNSPrefix,closingChar=">"){let result=tagExpWithClosingIndex(xmlData,i+1,closingChar);if(!result)return;let tagExp=result.data,closeIndex=result.index,separatorIndex=tagExp.search(/\s/),tagName=tagExp,attrExpPresent=!0;separatorIndex!==-1&&(tagName=tagExp.substring(0,separatorIndex),tagExp=tagExp.substring(separatorIndex+1).trimStart());let rawTagName=tagName;if(removeNSPrefix){let colonIndex=tagName.indexOf(":");colonIndex!==-1&&(tagName=tagName.substr(colonIndex+1),attrExpPresent=tagName!==result.data.substr(colonIndex+1))}return{tagName,tagExp,closeIndex,attrExpPresent,rawTagName}}function readStopNodeData(xmlData,tagName,i){let startIndex=i,openTagCount=1,xmllen=xmlData.length;for(;i<xmllen;i++)if(xmlData[i]==="<"){let c1=xmlData.charCodeAt(i+1);if(c1===47){let closeIndex=findClosingChar(xmlData,">",i,`${tagName} is not closed`);if(xmlData.substring(i+2,closeIndex).trim()===tagName&&(openTagCount--,openTagCount===0))return{tagContent:xmlData.substring(startIndex,i),i:closeIndex};i=closeIndex}else if(c1===63)i=findClosingIndex(xmlData,"?>",i+1,"StopNode is not closed.");else if(c1===33&&xmlData.charCodeAt(i+2)===45&&xmlData.charCodeAt(i+3)===45)i=findClosingIndex(xmlData,"-->",i+3,"StopNode is not closed.");else if(c1===33&&xmlData.charCodeAt(i+2)===91)i=findClosingIndex(xmlData,"]]>",i,"StopNode is not closed.")-2;else{let tagData=readTagExp(xmlData,i,!1);tagData&&((tagData&&tagData.tagName)===tagName&&tagData.tagExp[tagData.tagExp.length-1]!=="/"&&openTagCount++,i=tagData.closeIndex)}}}function parseValue(val,shouldParse,options){if(shouldParse&&typeof val=="string"){let newval=val.trim();return newval==="true"?!0:newval==="false"?!1:toNumber(val,options)}else return isExist(val)?val:""}function transformTagName(fn,tagName,tagExp,options){if(fn){let newTagName=fn(tagName);tagExp===tagName&&(tagExp=newTagName),tagName=newTagName}return tagName=sanitizeName(tagName,options),{tagName,tagExp}}function sanitizeName(name,options){if(criticalProperties.includes(name))throw new Error(`[SECURITY] Invalid name: "${name}" is a reserved JavaScript keyword that could cause prototype pollution`);return DANGEROUS_PROPERTY_NAMES.includes(name)?options.onDangerousProperty(name):name}var METADATA_SYMBOL2=XmlNode.getMetaDataSymbol();function stripAttributePrefix(attrs,prefix){if(!attrs||typeof attrs!="object")return{};if(!prefix)return attrs;let rawAttrs={};for(let key in attrs)if(key.startsWith(prefix)){let rawName=key.substring(prefix.length);rawAttrs[rawName]=attrs[key]}else rawAttrs[key]=attrs[key];return rawAttrs}function prettify(node,options,matcher,readonlyMatcher){return compress(node,options,matcher,readonlyMatcher)}function compress(arr,options,matcher,readonlyMatcher){let text,compressedObj={};for(let i=0;i<arr.length;i++){let tagObj=arr[i],property=propName(tagObj);if(property!==void 0&&property!==options.textNodeName){let rawAttrs=stripAttributePrefix(tagObj[":@"]||{},options.attributeNamePrefix);matcher.push(property,rawAttrs)}if(property===options.textNodeName)text===void 0?text=tagObj[property]:text+=""+tagObj[property];else{if(property===void 0)continue;if(tagObj[property]){let val=compress(tagObj[property],options,matcher,readonlyMatcher),isLeaf=isLeafTag(val,options);if(Object.keys(val).length===0&&options.alwaysCreateTextNode&&(val[options.textNodeName]=""),tagObj[":@"]?assignAttributes(val,tagObj[":@"],readonlyMatcher,options):Object.keys(val).length===1&&val[options.textNodeName]!==void 0&&!options.alwaysCreateTextNode?val=val[options.textNodeName]:Object.keys(val).length===0&&(options.alwaysCreateTextNode?val[options.textNodeName]="":val=""),tagObj[METADATA_SYMBOL2]!==void 0&&typeof val=="object"&&val!==null&&(val[METADATA_SYMBOL2]=tagObj[METADATA_SYMBOL2]),compressedObj[property]!==void 0&&Object.prototype.hasOwnProperty.call(compressedObj,property))Array.isArray(compressedObj[property])||(compressedObj[property]=[compressedObj[property]]),compressedObj[property].push(val);else{let jPathOrMatcher=options.jPath?readonlyMatcher.toString():readonlyMatcher;options.isArray(property,jPathOrMatcher,isLeaf)?compressedObj[property]=[val]:compressedObj[property]=val}property!==void 0&&property!==options.textNodeName&&matcher.pop()}}}return typeof text=="string"?text.length>0&&(compressedObj[options.textNodeName]=text):text!==void 0&&(compressedObj[options.textNodeName]=text),compressedObj}function propName(obj){let keys=Object.keys(obj);for(let i=0;i<keys.length;i++){let key=keys[i];if(key!==":@")return key}}function assignAttributes(obj,attrMap,readonlyMatcher,options){if(attrMap){let keys=Object.keys(attrMap),len=keys.length;for(let i=0;i<len;i++){let atrrName=keys[i],rawAttrName=atrrName.startsWith(options.attributeNamePrefix)?atrrName.substring(options.attributeNamePrefix.length):atrrName,jPathOrMatcher=options.jPath?readonlyMatcher.toString()+"."+rawAttrName:readonlyMatcher;options.isArray(atrrName,jPathOrMatcher,!0,!0)?obj[atrrName]=[attrMap[atrrName]]:obj[atrrName]=attrMap[atrrName]}}}function isLeafTag(obj,options){let{textNodeName}=options,propCount=Object.keys(obj).length;return!!(propCount===0||propCount===1&&(obj[textNodeName]||typeof obj[textNodeName]=="boolean"||obj[textNodeName]===0))}var XMLParser=class{constructor(options){this.externalEntities={},this.options=buildOptions(options)}parse(xmlData,validationOption){if(typeof xmlData!="string"&&xmlData.toString)xmlData=xmlData.toString();else if(typeof xmlData!="string")throw new Error("XML data is accepted in String or Bytes[] form.");if(validationOption){validationOption===!0&&(validationOption={});let result=validate(xmlData,validationOption);if(result!==!0)throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)}let orderedObjParser=new OrderedObjParser(this.options,this.externalEntities),orderedResult=orderedObjParser.parseXml(xmlData);return this.options.preserveOrder||orderedResult===void 0?orderedResult:prettify(orderedResult,this.options,orderedObjParser.matcher,orderedObjParser.readonlyMatcher)}addEntity(key,value){if(value.indexOf("&")!==-1)throw new Error("Entity value can't have '&'");if(key.indexOf("&")!==-1||key.indexOf(";")!==-1)throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'");if(value==="&")throw new Error("An entity with value '&' is not permitted");this.externalEntities[key]=value}static getMetaDataSymbol(){return XmlNode.getMetaDataSymbol()}};var XMLValidator={validate};var SKIPPED_EXTENSIONS=/\.(?:avif|bmp|css|csv|docx?|eot|gif|gz|ico|jpe?g|js|json|map|mp3|mp4|mov|ogg|otf|pdf|png|pptx?|rar|rss|svg|tar|tiff?|ttf|txt|wav|webm|webp|woff2?|xlsx?|xml|zip)$/i;function normalizeUrl(input,base,{includeQuery=!1}={}){let url;try{url=base?new URL(input,base):new URL(input)}catch{return null}return url.protocol!=="http:"&&url.protocol!=="https:"?null:(url.hash="",includeQuery||(url.search=""),url.pathname.length>1&&url.pathname.endsWith("/")&&(url.pathname=url.pathname.replace(/\/+$/,"")),url.href)}function isSameOrigin(url,origin){try{return new URL(url).origin===origin}catch{return!1}}function isCrawlableUrl(url){try{let parsed=new URL(url);return!SKIPPED_EXTENSIONS.test(parsed.pathname)}catch{return!1}}var MAX_SITEMAP_BYTES=10*1024*1024,MAX_SITEMAPS=100,DEFAULT_SITEMAP_LIMIT=5e4,parser=new XMLParser({ignoreAttributes:!1,removeNSPrefix:!0,trimValues:!0});function record(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function locations(value){return(value===void 0?[]:Array.isArray(value)?value:[value]).flatMap(entry=>{let location=record(entry)?.loc;return typeof location=="string"?[location]:[]})}function decodeSitemap(buffer,url,contentType){let decoded=url.toLowerCase().endsWith(".gz")||contentType.includes("gzip")||buffer[0]===31&&buffer[1]===139?gunzipSync(buffer):buffer;if(decoded.byteLength>MAX_SITEMAP_BYTES)throw new Error(`sitemap exceeds ${MAX_SITEMAP_BYTES} bytes after decompression: ${url}`);return decoded.toString("utf8").replace(/^\uFEFF/,"")}function parseSitemap(xml,url){let validation=XMLValidator.validate(xml);if(validation!==!0)throw new Error(`invalid sitemap XML at ${url}: ${validation.err.msg}`);let data=record(parser.parse(xml)),sitemapIndex=record(data?.sitemapindex);if(sitemapIndex)return{kind:"index",locations:locations(sitemapIndex.sitemap)};let urlSet=record(data?.urlset);if(urlSet)return{kind:"urlset",locations:locations(urlSet.url)};throw new Error(`XML is not a sitemap urlset or sitemapindex: ${url}`)}function policy(options){return{fetch:options.fetch??globalThis.fetch,timeout:options.timeout,maxRedirects:options.maxRedirects??10,retries:options.retries??2,signal:options.signal,gate:options.requestGate?async url=>options.requestGate?.(url):void 0,onEvent:options.onEvent}}async function fetchSitemap(url,options){let{response}=await fetchWithRetry(url,{headers:{accept:"application/xml,text/xml,application/gzip,text/plain;q=0.9,*/*;q=0.1","user-agent":options.userAgent}},policy(options));if(!response.ok)throw await response.body?.cancel(),new Error(`sitemap returned HTTP ${response.status}: ${url}`);let{buffer}=await readResponseBody(response,MAX_SITEMAP_BYTES);return decodeSitemap(buffer,url,response.headers.get("content-type")?.toLowerCase()??"")}async function isSitemapResponse(url,options){try{let xml=await fetchSitemap(url,options);return parseSitemap(xml,url),!0}catch{return!1}}async function discoverSitemapUrl(inputUrl,options){let startUrl=normalizeUrl(inputUrl,void 0);if(!startUrl)throw new Error(`invalid start URL: ${inputUrl}`);let origin=new URL(startUrl).origin,robotsUrl=new URL("/robots.txt",origin).href;try{if(options.robotsBody!==void 0)for(let match of options.robotsBody.matchAll(/^sitemap:\s*(\S+)\s*$/gim)){let location=match[1];if(!location)continue;let candidate=normalizeUrl(location,robotsUrl,{includeQuery:!0});if(candidate&&isSameOrigin(candidate,origin))return candidate}else{let{response}=await fetchWithRetry(robotsUrl,{headers:{accept:"text/plain,*/*;q=0.1","user-agent":options.userAgent}},policy({...options,siteOrigin:origin}));if(response.ok){let{text}=await readResponseBody(response,524288);for(let match of text.matchAll(/^sitemap:\s*(\S+)\s*$/gim)){let location=match[1];if(!location)continue;let candidate=normalizeUrl(location,robotsUrl,{includeQuery:!0});if(candidate&&isSameOrigin(candidate,origin))return candidate}}else await response.body?.cancel()}}catch{}for(let path of["/sitemap.xml","/sitemap.xml.gz","/sitemap_index.xml"]){let candidate=new URL(path,origin).href;if(await isSitemapResponse(candidate,{...options,siteOrigin:origin}))return candidate}return null}async function loadSitemapUrls(inputUrl,options){let sitemapUrl=normalizeUrl(inputUrl,void 0,{includeQuery:!0});if(!sitemapUrl)throw new Error(`invalid sitemap URL: ${inputUrl}`);let sitemapOrigin=new URL(sitemapUrl).origin,sitemapQueue=[sitemapUrl],visitedSitemaps=new Set,pageUrls=[],pageSet=new Set,limit=options.maxUrls??DEFAULT_SITEMAP_LIMIT,truncated=!1;for(;sitemapQueue.length>0&&visitedSitemaps.size<MAX_SITEMAPS&&pageUrls.length<limit;){let currentUrl=sitemapQueue.shift();if(visitedSitemaps.has(currentUrl))continue;visitedSitemaps.add(currentUrl);let parsed=parseSitemap(await fetchSitemap(currentUrl,options),currentUrl);if(parsed.kind==="index"){for(let location of parsed.locations){let child=normalizeUrl(location,currentUrl,{includeQuery:!0});child&&isSameOrigin(child,sitemapOrigin)&&!visitedSitemaps.has(child)&&!sitemapQueue.includes(child)&&sitemapQueue.push(child)}sitemapQueue.sort();continue}for(let location of parsed.locations){let pageUrl=normalizeUrl(location,currentUrl,{includeQuery:options.includeQuery??!1});if(!(!pageUrl||pageSet.has(pageUrl)||!isSameOrigin(pageUrl,options.siteOrigin)||!isCrawlableUrl(pageUrl))&&(pageSet.add(pageUrl),pageUrls.push(pageUrl),pageUrls.length>=limit)){truncated=!0;break}}}return(sitemapQueue.length>0||visitedSitemaps.size>=MAX_SITEMAPS)&&(truncated=!0),{url:sitemapUrl,urls:pageUrls.sort(),sitemapCount:visitedSitemaps.size,truncated,error:null}}async function emit(options,event){await options.onEvent?.(event)}async function planScan(configInput,options={}){let config=resolveConfig(configInput),startUrl=normalizeUrl(config.url,void 0,{includeQuery:config.includeQuery});if(!startUrl)throw new Error(`invalid start URL: ${config.url}`);let origin=new URL(startUrl).origin,fetch=options.fetch??globalThis.fetch,requestGate=createPerOriginRequestGate(config.delay),logger=options.logger??NOOP_LOGGER;await emit(options,{type:"plan-start",url:startUrl});let robots=await fetchRobots(startUrl,{userAgent:DEFAULT_USER_AGENT,timeout:config.timeout,maxRedirects:config.maxRedirects,retries:2,fetch,signal:options.signal,requestGate,onEvent:options.onEvent,logger});await emit(options,{type:"robots",robots});let sitemapUrl=null;config.sitemap==="auto"?sitemapUrl=await discoverSitemapUrl(startUrl,{timeout:config.timeout,maxRedirects:config.maxRedirects,userAgent:DEFAULT_USER_AGENT,fetch,signal:options.signal,requestGate,onEvent:options.onEvent,robotsBody:robots.body}):config.sitemap!=="none"&&(sitemapUrl=config.sitemap);let sitemap=null;if(sitemapUrl)try{sitemap=await loadSitemapUrls(sitemapUrl,{siteOrigin:origin,includeQuery:config.includeQuery,maxUrls:5e4,timeout:config.timeout,maxRedirects:config.maxRedirects,retries:2,userAgent:DEFAULT_USER_AGENT,fetch,signal:options.signal,requestGate,onEvent:options.onEvent})}catch(error){sitemap={url:sitemapUrl,urls:[],sitemapCount:0,truncated:!1,error:error instanceof Error?error.message:String(error)},logger.warn(`Could not load sitemap ${sitemapUrl}: ${sitemap.error}`)}let candidateUrls=sitemap?[...new Set([startUrl,...sitemap.urls])].sort((left,right)=>left===startUrl?-1:right===startUrl?1:left.localeCompare(right)):[startUrl],candidateCount=sitemap?candidateUrls.length:null;return await emit(options,{type:"sitemap",sitemap,candidateCount}),{planVersion:1,config,startUrl,origin,userAgent:DEFAULT_USER_AGENT,robots,sitemap,candidateUrls,candidateCount,mode:sitemap?"sitemap":"links"}}import{createHash as createHash4}from"node:crypto";var UNDEFINED_CODE_POINTS=new Set([65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]),REPLACEMENT_CHARACTER="\uFFFD",CODE_POINTS;(function(CODE_POINTS2){CODE_POINTS2[CODE_POINTS2.EOF=-1]="EOF",CODE_POINTS2[CODE_POINTS2.NULL=0]="NULL",CODE_POINTS2[CODE_POINTS2.TABULATION=9]="TABULATION",CODE_POINTS2[CODE_POINTS2.CARRIAGE_RETURN=13]="CARRIAGE_RETURN",CODE_POINTS2[CODE_POINTS2.LINE_FEED=10]="LINE_FEED",CODE_POINTS2[CODE_POINTS2.FORM_FEED=12]="FORM_FEED",CODE_POINTS2[CODE_POINTS2.SPACE=32]="SPACE",CODE_POINTS2[CODE_POINTS2.EXCLAMATION_MARK=33]="EXCLAMATION_MARK",CODE_POINTS2[CODE_POINTS2.QUOTATION_MARK=34]="QUOTATION_MARK",CODE_POINTS2[CODE_POINTS2.AMPERSAND=38]="AMPERSAND",CODE_POINTS2[CODE_POINTS2.APOSTROPHE=39]="APOSTROPHE",CODE_POINTS2[CODE_POINTS2.HYPHEN_MINUS=45]="HYPHEN_MINUS",CODE_POINTS2[CODE_POINTS2.SOLIDUS=47]="SOLIDUS",CODE_POINTS2[CODE_POINTS2.DIGIT_0=48]="DIGIT_0",CODE_POINTS2[CODE_POINTS2.DIGIT_9=57]="DIGIT_9",CODE_POINTS2[CODE_POINTS2.SEMICOLON=59]="SEMICOLON",CODE_POINTS2[CODE_POINTS2.LESS_THAN_SIGN=60]="LESS_THAN_SIGN",CODE_POINTS2[CODE_POINTS2.EQUALS_SIGN=61]="EQUALS_SIGN",CODE_POINTS2[CODE_POINTS2.GREATER_THAN_SIGN=62]="GREATER_THAN_SIGN",CODE_POINTS2[CODE_POINTS2.QUESTION_MARK=63]="QUESTION_MARK",CODE_POINTS2[CODE_POINTS2.LATIN_CAPITAL_A=65]="LATIN_CAPITAL_A",CODE_POINTS2[CODE_POINTS2.LATIN_CAPITAL_Z=90]="LATIN_CAPITAL_Z",CODE_POINTS2[CODE_POINTS2.RIGHT_SQUARE_BRACKET=93]="RIGHT_SQUARE_BRACKET",CODE_POINTS2[CODE_POINTS2.GRAVE_ACCENT=96]="GRAVE_ACCENT",CODE_POINTS2[CODE_POINTS2.LATIN_SMALL_A=97]="LATIN_SMALL_A",CODE_POINTS2[CODE_POINTS2.LATIN_SMALL_Z=122]="LATIN_SMALL_Z"})(CODE_POINTS||(CODE_POINTS={}));var SEQUENCES={DASH_DASH:"--",CDATA_START:"[CDATA[",DOCTYPE:"doctype",SCRIPT:"script",PUBLIC:"public",SYSTEM:"system"};function isSurrogate(cp){return cp>=55296&&cp<=57343}function isSurrogatePair(cp){return cp>=56320&&cp<=57343}function getSurrogatePairCodePoint(cp1,cp2){return(cp1-55296)*1024+9216+cp2}function isControlCodePoint(cp){return cp!==32&&cp!==10&&cp!==13&&cp!==9&&cp!==12&&cp>=1&&cp<=31||cp>=127&&cp<=159}function isUndefinedCodePoint(cp){return cp>=64976&&cp<=65007||UNDEFINED_CODE_POINTS.has(cp)}var ERR;(function(ERR2){ERR2.controlCharacterInInputStream="control-character-in-input-stream",ERR2.noncharacterInInputStream="noncharacter-in-input-stream",ERR2.surrogateInInputStream="surrogate-in-input-stream",ERR2.nonVoidHtmlElementStartTagWithTrailingSolidus="non-void-html-element-start-tag-with-trailing-solidus",ERR2.endTagWithAttributes="end-tag-with-attributes",ERR2.endTagWithTrailingSolidus="end-tag-with-trailing-solidus",ERR2.unexpectedSolidusInTag="unexpected-solidus-in-tag",ERR2.unexpectedNullCharacter="unexpected-null-character",ERR2.unexpectedQuestionMarkInsteadOfTagName="unexpected-question-mark-instead-of-tag-name",ERR2.invalidFirstCharacterOfTagName="invalid-first-character-of-tag-name",ERR2.unexpectedEqualsSignBeforeAttributeName="unexpected-equals-sign-before-attribute-name",ERR2.missingEndTagName="missing-end-tag-name",ERR2.unexpectedCharacterInAttributeName="unexpected-character-in-attribute-name",ERR2.unknownNamedCharacterReference="unknown-named-character-reference",ERR2.missingSemicolonAfterCharacterReference="missing-semicolon-after-character-reference",ERR2.unexpectedCharacterAfterDoctypeSystemIdentifier="unexpected-character-after-doctype-system-identifier",ERR2.unexpectedCharacterInUnquotedAttributeValue="unexpected-character-in-unquoted-attribute-value",ERR2.eofBeforeTagName="eof-before-tag-name",ERR2.eofInTag="eof-in-tag",ERR2.missingAttributeValue="missing-attribute-value",ERR2.missingWhitespaceBetweenAttributes="missing-whitespace-between-attributes",ERR2.missingWhitespaceAfterDoctypePublicKeyword="missing-whitespace-after-doctype-public-keyword",ERR2.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers="missing-whitespace-between-doctype-public-and-system-identifiers",ERR2.missingWhitespaceAfterDoctypeSystemKeyword="missing-whitespace-after-doctype-system-keyword",ERR2.missingQuoteBeforeDoctypePublicIdentifier="missing-quote-before-doctype-public-identifier",ERR2.missingQuoteBeforeDoctypeSystemIdentifier="missing-quote-before-doctype-system-identifier",ERR2.missingDoctypePublicIdentifier="missing-doctype-public-identifier",ERR2.missingDoctypeSystemIdentifier="missing-doctype-system-identifier",ERR2.abruptDoctypePublicIdentifier="abrupt-doctype-public-identifier",ERR2.abruptDoctypeSystemIdentifier="abrupt-doctype-system-identifier",ERR2.cdataInHtmlContent="cdata-in-html-content",ERR2.incorrectlyOpenedComment="incorrectly-opened-comment",ERR2.eofInScriptHtmlCommentLikeText="eof-in-script-html-comment-like-text",ERR2.eofInDoctype="eof-in-doctype",ERR2.nestedComment="nested-comment",ERR2.abruptClosingOfEmptyComment="abrupt-closing-of-empty-comment",ERR2.eofInComment="eof-in-comment",ERR2.incorrectlyClosedComment="incorrectly-closed-comment",ERR2.eofInCdata="eof-in-cdata",ERR2.absenceOfDigitsInNumericCharacterReference="absence-of-digits-in-numeric-character-reference",ERR2.nullCharacterReference="null-character-reference",ERR2.surrogateCharacterReference="surrogate-character-reference",ERR2.characterReferenceOutsideUnicodeRange="character-reference-outside-unicode-range",ERR2.controlCharacterReference="control-character-reference",ERR2.noncharacterCharacterReference="noncharacter-character-reference",ERR2.missingWhitespaceBeforeDoctypeName="missing-whitespace-before-doctype-name",ERR2.missingDoctypeName="missing-doctype-name",ERR2.invalidCharacterSequenceAfterDoctypeName="invalid-character-sequence-after-doctype-name",ERR2.duplicateAttribute="duplicate-attribute",ERR2.nonConformingDoctype="non-conforming-doctype",ERR2.missingDoctype="missing-doctype",ERR2.misplacedDoctype="misplaced-doctype",ERR2.endTagWithoutMatchingOpenElement="end-tag-without-matching-open-element",ERR2.closingOfElementWithOpenChildElements="closing-of-element-with-open-child-elements",ERR2.disallowedContentInNoscriptInHead="disallowed-content-in-noscript-in-head",ERR2.openElementsLeftAfterEof="open-elements-left-after-eof",ERR2.abandonedHeadElementChild="abandoned-head-element-child",ERR2.misplacedStartTagForHeadElement="misplaced-start-tag-for-head-element",ERR2.nestedNoscriptInHead="nested-noscript-in-head",ERR2.eofInElementThatCanContainOnlyText="eof-in-element-that-can-contain-only-text"})(ERR||(ERR={}));var DEFAULT_BUFFER_WATERLINE=65536,Preprocessor=class{constructor(handler){this.handler=handler,this.html="",this.pos=-1,this.lastGapPos=-2,this.gapStack=[],this.skipNextNewLine=!1,this.lastChunkWritten=!1,this.endOfChunkHit=!1,this.bufferWaterline=DEFAULT_BUFFER_WATERLINE,this.isEol=!1,this.lineStartPos=0,this.droppedBufferSize=0,this.line=1,this.lastErrOffset=-1}get col(){return this.pos-this.lineStartPos+ +(this.lastGapPos!==this.pos)}get offset(){return this.droppedBufferSize+this.pos}getError(code,cpOffset){let{line,col,offset}=this,startCol=col+cpOffset,startOffset=offset+cpOffset;return{code,startLine:line,endLine:line,startCol,endCol:startCol,startOffset,endOffset:startOffset}}_err(code){this.handler.onParseError&&this.lastErrOffset!==this.offset&&(this.lastErrOffset=this.offset,this.handler.onParseError(this.getError(code,0)))}_addGap(){this.gapStack.push(this.lastGapPos),this.lastGapPos=this.pos}_processSurrogate(cp){if(this.pos!==this.html.length-1){let nextCp=this.html.charCodeAt(this.pos+1);if(isSurrogatePair(nextCp))return this.pos++,this._addGap(),getSurrogatePairCodePoint(cp,nextCp)}else if(!this.lastChunkWritten)return this.endOfChunkHit=!0,CODE_POINTS.EOF;return this._err(ERR.surrogateInInputStream),cp}willDropParsedChunk(){return this.pos>this.bufferWaterline}dropParsedChunk(){this.willDropParsedChunk()&&(this.html=this.html.substring(this.pos),this.lineStartPos-=this.pos,this.droppedBufferSize+=this.pos,this.pos=0,this.lastGapPos=-2,this.gapStack.length=0)}write(chunk,isLastChunk){this.html.length>0?this.html+=chunk:this.html=chunk,this.endOfChunkHit=!1,this.lastChunkWritten=isLastChunk}insertHtmlAtCurrentPos(chunk){this.html=this.html.substring(0,this.pos+1)+chunk+this.html.substring(this.pos+1),this.endOfChunkHit=!1}startsWith(pattern,caseSensitive){if(this.pos+pattern.length>this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,!1;if(caseSensitive)return this.html.startsWith(pattern,this.pos);for(let i=0;i<pattern.length;i++)if((this.html.charCodeAt(this.pos+i)|32)!==pattern.charCodeAt(i))return!1;return!0}peek(offset){let pos=this.pos+offset;if(pos>=this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,CODE_POINTS.EOF;let code=this.html.charCodeAt(pos);return code===CODE_POINTS.CARRIAGE_RETURN?CODE_POINTS.LINE_FEED:code}advance(){if(this.pos++,this.isEol&&(this.isEol=!1,this.line++,this.lineStartPos=this.pos),this.pos>=this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,CODE_POINTS.EOF;let cp=this.html.charCodeAt(this.pos);return cp===CODE_POINTS.CARRIAGE_RETURN?(this.isEol=!0,this.skipNextNewLine=!0,CODE_POINTS.LINE_FEED):cp===CODE_POINTS.LINE_FEED&&(this.isEol=!0,this.skipNextNewLine)?(this.line--,this.skipNextNewLine=!1,this._addGap(),this.advance()):(this.skipNextNewLine=!1,isSurrogate(cp)&&(cp=this._processSurrogate(cp)),this.handler.onParseError===null||cp>31&&cp<127||cp===CODE_POINTS.LINE_FEED||cp===CODE_POINTS.CARRIAGE_RETURN||cp>159&&cp<64976||this._checkForProblematicCharacters(cp),cp)}_checkForProblematicCharacters(cp){isControlCodePoint(cp)?this._err(ERR.controlCharacterInInputStream):isUndefinedCodePoint(cp)&&this._err(ERR.noncharacterInInputStream)}retreat(count){for(this.pos-=count;this.pos<this.lastGapPos;)this.lastGapPos=this.gapStack.pop(),this.pos--;this.isEol=!1}};var TokenType;(function(TokenType2){TokenType2[TokenType2.CHARACTER=0]="CHARACTER",TokenType2[TokenType2.NULL_CHARACTER=1]="NULL_CHARACTER",TokenType2[TokenType2.WHITESPACE_CHARACTER=2]="WHITESPACE_CHARACTER",TokenType2[TokenType2.START_TAG=3]="START_TAG",TokenType2[TokenType2.END_TAG=4]="END_TAG",TokenType2[TokenType2.COMMENT=5]="COMMENT",TokenType2[TokenType2.DOCTYPE=6]="DOCTYPE",TokenType2[TokenType2.EOF=7]="EOF",TokenType2[TokenType2.HIBERNATION=8]="HIBERNATION"})(TokenType||(TokenType={}));function getTokenAttr(token,attrName){for(let i=token.attrs.length-1;i>=0;i--)if(token.attrs[i].name===attrName)return token.attrs[i].value;return null}var decodeMap=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]);function replaceCodePoint(codePoint){return codePoint>=55296&&codePoint<=57343||codePoint>1114111?65533:decodeMap.get(codePoint)??codePoint}function decodeBase64(input){let binary=atob(input),evenLength=binary.length&-2,out=new Uint16Array(evenLength/2);for(let index=0,outIndex=0;index<evenLength;index+=2){let lo=binary.charCodeAt(index),hi=binary.charCodeAt(index+1);out[outIndex++]=lo|hi<<8}return out}var htmlDecodeTree=decodeBase64("QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg");var BinTrieFlags;(function(BinTrieFlags2){BinTrieFlags2[BinTrieFlags2.VALUE_LENGTH=49152]="VALUE_LENGTH",BinTrieFlags2[BinTrieFlags2.FLAG13=8192]="FLAG13",BinTrieFlags2[BinTrieFlags2.BRANCH_LENGTH=8064]="BRANCH_LENGTH",BinTrieFlags2[BinTrieFlags2.JUMP_TABLE=127]="JUMP_TABLE"})(BinTrieFlags||(BinTrieFlags={}));var CharCodes;(function(CharCodes2){CharCodes2[CharCodes2.NUM=35]="NUM",CharCodes2[CharCodes2.SEMI=59]="SEMI",CharCodes2[CharCodes2.EQUALS=61]="EQUALS",CharCodes2[CharCodes2.ZERO=48]="ZERO",CharCodes2[CharCodes2.NINE=57]="NINE",CharCodes2[CharCodes2.LOWER_A=97]="LOWER_A",CharCodes2[CharCodes2.LOWER_F=102]="LOWER_F",CharCodes2[CharCodes2.LOWER_X=120]="LOWER_X",CharCodes2[CharCodes2.LOWER_Z=122]="LOWER_Z",CharCodes2[CharCodes2.UPPER_A=65]="UPPER_A",CharCodes2[CharCodes2.UPPER_F=70]="UPPER_F",CharCodes2[CharCodes2.UPPER_Z=90]="UPPER_Z"})(CharCodes||(CharCodes={}));var TO_LOWER_BIT=32;function isNumber(code){return code>=CharCodes.ZERO&&code<=CharCodes.NINE}function isHexadecimalCharacter(code){return code>=CharCodes.UPPER_A&&code<=CharCodes.UPPER_F||code>=CharCodes.LOWER_A&&code<=CharCodes.LOWER_F}function isAsciiAlphaNumeric(code){return code>=CharCodes.UPPER_A&&code<=CharCodes.UPPER_Z||code>=CharCodes.LOWER_A&&code<=CharCodes.LOWER_Z||isNumber(code)}function isEntityInAttributeInvalidEnd(code){return code===CharCodes.EQUALS||isAsciiAlphaNumeric(code)}var EntityDecoderState;(function(EntityDecoderState2){EntityDecoderState2[EntityDecoderState2.EntityStart=0]="EntityStart",EntityDecoderState2[EntityDecoderState2.NumericStart=1]="NumericStart",EntityDecoderState2[EntityDecoderState2.NumericDecimal=2]="NumericDecimal",EntityDecoderState2[EntityDecoderState2.NumericHex=3]="NumericHex",EntityDecoderState2[EntityDecoderState2.NamedEntity=4]="NamedEntity"})(EntityDecoderState||(EntityDecoderState={}));var DecodingMode;(function(DecodingMode2){DecodingMode2[DecodingMode2.Legacy=0]="Legacy",DecodingMode2[DecodingMode2.Strict=1]="Strict",DecodingMode2[DecodingMode2.Attribute=2]="Attribute"})(DecodingMode||(DecodingMode={}));var EntityDecoder2=class{decodeTree;emitCodePoint;errors;constructor(decodeTree,emitCodePoint,errors){this.decodeTree=decodeTree,this.emitCodePoint=emitCodePoint,this.errors=errors}state=EntityDecoderState.EntityStart;consumed=1;result=0;treeIndex=0;excess=1;decodeMode=DecodingMode.Strict;runConsumed=0;startEntity(decodeMode){this.decodeMode=decodeMode,this.state=EntityDecoderState.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1,this.runConsumed=0}write(input,offset){switch(this.state){case EntityDecoderState.EntityStart:return input.charCodeAt(offset)===CharCodes.NUM?(this.state=EntityDecoderState.NumericStart,this.consumed+=1,this.stateNumericStart(input,offset+1)):(this.state=EntityDecoderState.NamedEntity,this.stateNamedEntity(input,offset));case EntityDecoderState.NumericStart:return this.stateNumericStart(input,offset);case EntityDecoderState.NumericDecimal:return this.stateNumericDecimal(input,offset);case EntityDecoderState.NumericHex:return this.stateNumericHex(input,offset);case EntityDecoderState.NamedEntity:return this.stateNamedEntity(input,offset)}}stateNumericStart(input,offset){return offset>=input.length?-1:(input.charCodeAt(offset)|TO_LOWER_BIT)===CharCodes.LOWER_X?(this.state=EntityDecoderState.NumericHex,this.consumed+=1,this.stateNumericHex(input,offset+1)):(this.state=EntityDecoderState.NumericDecimal,this.stateNumericDecimal(input,offset))}stateNumericHex(input,offset){for(;offset<input.length;){let char=input.charCodeAt(offset);if(isNumber(char)||isHexadecimalCharacter(char)){let digit=char<=CharCodes.NINE?char-CharCodes.ZERO:(char|TO_LOWER_BIT)-CharCodes.LOWER_A+10;this.result=this.result*16+digit,this.consumed++,offset++}else return this.emitNumericEntity(char,3)}return-1}stateNumericDecimal(input,offset){for(;offset<input.length;){let char=input.charCodeAt(offset);if(isNumber(char))this.result=this.result*10+(char-CharCodes.ZERO),this.consumed++,offset++;else return this.emitNumericEntity(char,2)}return-1}emitNumericEntity(lastCp,expectedLength){if(this.consumed<=expectedLength)return this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed),0;if(lastCp===CharCodes.SEMI)this.consumed+=1;else if(this.decodeMode===DecodingMode.Strict)return 0;return this.emitCodePoint(replaceCodePoint(this.result),this.consumed),this.errors&&(lastCp!==CharCodes.SEMI&&this.errors.missingSemicolonAfterCharacterReference(),this.errors.validateNumericCharacterReference(this.result)),this.consumed}stateNamedEntity(input,offset){let{decodeTree}=this,current=decodeTree[this.treeIndex],valueLength=(current&BinTrieFlags.VALUE_LENGTH)>>14;for(;offset<input.length;){if(valueLength===0&&(current&BinTrieFlags.FLAG13)!==0){let runLength=(current&BinTrieFlags.BRANCH_LENGTH)>>7;if(this.runConsumed===0){let firstChar=current&BinTrieFlags.JUMP_TABLE;if(input.charCodeAt(offset)!==firstChar)return this.result===0?0:this.emitNotTerminatedNamedEntity();offset++,this.excess++,this.runConsumed++}for(;this.runConsumed<runLength;){if(offset>=input.length)return-1;let charIndexInPacked=this.runConsumed-1,packedWord=decodeTree[this.treeIndex+1+(charIndexInPacked>>1)],expectedChar=charIndexInPacked%2===0?packedWord&255:packedWord>>8&255;if(input.charCodeAt(offset)!==expectedChar)return this.runConsumed=0,this.result===0?0:this.emitNotTerminatedNamedEntity();offset++,this.excess++,this.runConsumed++}this.runConsumed=0,this.treeIndex+=1+(runLength>>1),current=decodeTree[this.treeIndex],valueLength=(current&BinTrieFlags.VALUE_LENGTH)>>14}if(offset>=input.length)break;let char=input.charCodeAt(offset);if(char===CharCodes.SEMI&&valueLength!==0&&(current&BinTrieFlags.FLAG13)!==0)return this.emitNamedEntityData(this.treeIndex,valueLength,this.consumed+this.excess);if(this.treeIndex=determineBranch(decodeTree,current,this.treeIndex+Math.max(1,valueLength),char),this.treeIndex<0)return this.result===0||this.decodeMode===DecodingMode.Attribute&&(valueLength===0||isEntityInAttributeInvalidEnd(char))?0:this.emitNotTerminatedNamedEntity();if(current=decodeTree[this.treeIndex],valueLength=(current&BinTrieFlags.VALUE_LENGTH)>>14,valueLength!==0){if(char===CharCodes.SEMI)return this.emitNamedEntityData(this.treeIndex,valueLength,this.consumed+this.excess);this.decodeMode!==DecodingMode.Strict&&(current&BinTrieFlags.FLAG13)===0&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}offset++,this.excess++}return-1}emitNotTerminatedNamedEntity(){let{result,decodeTree}=this,valueLength=(decodeTree[result]&BinTrieFlags.VALUE_LENGTH)>>14;return this.emitNamedEntityData(result,valueLength,this.consumed),this.errors?.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(result,valueLength,consumed){let{decodeTree}=this;return this.emitCodePoint(valueLength===1?decodeTree[result]&~(BinTrieFlags.VALUE_LENGTH|BinTrieFlags.FLAG13):decodeTree[result+1],consumed),valueLength===3&&this.emitCodePoint(decodeTree[result+2],consumed),consumed}end(){switch(this.state){case EntityDecoderState.NamedEntity:return this.result!==0&&(this.decodeMode!==DecodingMode.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case EntityDecoderState.NumericDecimal:return this.emitNumericEntity(0,2);case EntityDecoderState.NumericHex:return this.emitNumericEntity(0,3);case EntityDecoderState.NumericStart:return this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case EntityDecoderState.EntityStart:return 0}}};function determineBranch(decodeTree,current,nodeIndex,char){let branchCount=(current&BinTrieFlags.BRANCH_LENGTH)>>7,jumpOffset=current&BinTrieFlags.JUMP_TABLE;if(branchCount===0)return jumpOffset!==0&&char===jumpOffset?nodeIndex:-1;if(jumpOffset){let value=char-jumpOffset;return value<0||value>=branchCount?-1:decodeTree[nodeIndex+value]-1}let packedKeySlots=branchCount+1>>1,lo=0,hi=branchCount-1;for(;lo<=hi;){let mid=lo+hi>>>1,slot=mid>>1,midKey=decodeTree[nodeIndex+slot]>>(mid&1)*8&255;if(midKey<char)lo=mid+1;else if(midKey>char)hi=mid-1;else return decodeTree[nodeIndex+packedKeySlots+mid]}return-1}var NS;(function(NS2){NS2.HTML="http://www.w3.org/1999/xhtml",NS2.MATHML="http://www.w3.org/1998/Math/MathML",NS2.SVG="http://www.w3.org/2000/svg",NS2.XLINK="http://www.w3.org/1999/xlink",NS2.XML="http://www.w3.org/XML/1998/namespace",NS2.XMLNS="http://www.w3.org/2000/xmlns/"})(NS||(NS={}));var ATTRS;(function(ATTRS2){ATTRS2.TYPE="type",ATTRS2.ACTION="action",ATTRS2.ENCODING="encoding",ATTRS2.PROMPT="prompt",ATTRS2.NAME="name",ATTRS2.COLOR="color",ATTRS2.FACE="face",ATTRS2.SIZE="size"})(ATTRS||(ATTRS={}));var DOCUMENT_MODE;(function(DOCUMENT_MODE2){DOCUMENT_MODE2.NO_QUIRKS="no-quirks",DOCUMENT_MODE2.QUIRKS="quirks",DOCUMENT_MODE2.LIMITED_QUIRKS="limited-quirks"})(DOCUMENT_MODE||(DOCUMENT_MODE={}));var TAG_NAMES;(function(TAG_NAMES2){TAG_NAMES2.A="a",TAG_NAMES2.ADDRESS="address",TAG_NAMES2.ANNOTATION_XML="annotation-xml",TAG_NAMES2.APPLET="applet",TAG_NAMES2.AREA="area",TAG_NAMES2.ARTICLE="article",TAG_NAMES2.ASIDE="aside",TAG_NAMES2.B="b",TAG_NAMES2.BASE="base",TAG_NAMES2.BASEFONT="basefont",TAG_NAMES2.BGSOUND="bgsound",TAG_NAMES2.BIG="big",TAG_NAMES2.BLOCKQUOTE="blockquote",TAG_NAMES2.BODY="body",TAG_NAMES2.BR="br",TAG_NAMES2.BUTTON="button",TAG_NAMES2.CAPTION="caption",TAG_NAMES2.CENTER="center",TAG_NAMES2.CODE="code",TAG_NAMES2.COL="col",TAG_NAMES2.COLGROUP="colgroup",TAG_NAMES2.DD="dd",TAG_NAMES2.DESC="desc",TAG_NAMES2.DETAILS="details",TAG_NAMES2.DIALOG="dialog",TAG_NAMES2.DIR="dir",TAG_NAMES2.DIV="div",TAG_NAMES2.DL="dl",TAG_NAMES2.DT="dt",TAG_NAMES2.EM="em",TAG_NAMES2.EMBED="embed",TAG_NAMES2.FIELDSET="fieldset",TAG_NAMES2.FIGCAPTION="figcaption",TAG_NAMES2.FIGURE="figure",TAG_NAMES2.FONT="font",TAG_NAMES2.FOOTER="footer",TAG_NAMES2.FOREIGN_OBJECT="foreignObject",TAG_NAMES2.FORM="form",TAG_NAMES2.FRAME="frame",TAG_NAMES2.FRAMESET="frameset",TAG_NAMES2.H1="h1",TAG_NAMES2.H2="h2",TAG_NAMES2.H3="h3",TAG_NAMES2.H4="h4",TAG_NAMES2.H5="h5",TAG_NAMES2.H6="h6",TAG_NAMES2.HEAD="head",TAG_NAMES2.HEADER="header",TAG_NAMES2.HGROUP="hgroup",TAG_NAMES2.HR="hr",TAG_NAMES2.HTML="html",TAG_NAMES2.I="i",TAG_NAMES2.IMG="img",TAG_NAMES2.IMAGE="image",TAG_NAMES2.INPUT="input",TAG_NAMES2.IFRAME="iframe",TAG_NAMES2.KEYGEN="keygen",TAG_NAMES2.LABEL="label",TAG_NAMES2.LI="li",TAG_NAMES2.LINK="link",TAG_NAMES2.LISTING="listing",TAG_NAMES2.MAIN="main",TAG_NAMES2.MALIGNMARK="malignmark",TAG_NAMES2.MARQUEE="marquee",TAG_NAMES2.MATH="math",TAG_NAMES2.MENU="menu",TAG_NAMES2.META="meta",TAG_NAMES2.MGLYPH="mglyph",TAG_NAMES2.MI="mi",TAG_NAMES2.MO="mo",TAG_NAMES2.MN="mn",TAG_NAMES2.MS="ms",TAG_NAMES2.MTEXT="mtext",TAG_NAMES2.NAV="nav",TAG_NAMES2.NOBR="nobr",TAG_NAMES2.NOFRAMES="noframes",TAG_NAMES2.NOEMBED="noembed",TAG_NAMES2.NOSCRIPT="noscript",TAG_NAMES2.OBJECT="object",TAG_NAMES2.OL="ol",TAG_NAMES2.OPTGROUP="optgroup",TAG_NAMES2.OPTION="option",TAG_NAMES2.P="p",TAG_NAMES2.PARAM="param",TAG_NAMES2.PLAINTEXT="plaintext",TAG_NAMES2.PRE="pre",TAG_NAMES2.RB="rb",TAG_NAMES2.RP="rp",TAG_NAMES2.RT="rt",TAG_NAMES2.RTC="rtc",TAG_NAMES2.RUBY="ruby",TAG_NAMES2.S="s",TAG_NAMES2.SCRIPT="script",TAG_NAMES2.SEARCH="search",TAG_NAMES2.SECTION="section",TAG_NAMES2.SELECT="select",TAG_NAMES2.SOURCE="source",TAG_NAMES2.SMALL="small",TAG_NAMES2.SPAN="span",TAG_NAMES2.STRIKE="strike",TAG_NAMES2.STRONG="strong",TAG_NAMES2.STYLE="style",TAG_NAMES2.SUB="sub",TAG_NAMES2.SUMMARY="summary",TAG_NAMES2.SUP="sup",TAG_NAMES2.TABLE="table",TAG_NAMES2.TBODY="tbody",TAG_NAMES2.TEMPLATE="template",TAG_NAMES2.TEXTAREA="textarea",TAG_NAMES2.TFOOT="tfoot",TAG_NAMES2.TD="td",TAG_NAMES2.TH="th",TAG_NAMES2.THEAD="thead",TAG_NAMES2.TITLE="title",TAG_NAMES2.TR="tr",TAG_NAMES2.TRACK="track",TAG_NAMES2.TT="tt",TAG_NAMES2.U="u",TAG_NAMES2.UL="ul",TAG_NAMES2.SVG="svg",TAG_NAMES2.VAR="var",TAG_NAMES2.WBR="wbr",TAG_NAMES2.XMP="xmp"})(TAG_NAMES||(TAG_NAMES={}));var TAG_ID;(function(TAG_ID2){TAG_ID2[TAG_ID2.UNKNOWN=0]="UNKNOWN",TAG_ID2[TAG_ID2.A=1]="A",TAG_ID2[TAG_ID2.ADDRESS=2]="ADDRESS",TAG_ID2[TAG_ID2.ANNOTATION_XML=3]="ANNOTATION_XML",TAG_ID2[TAG_ID2.APPLET=4]="APPLET",TAG_ID2[TAG_ID2.AREA=5]="AREA",TAG_ID2[TAG_ID2.ARTICLE=6]="ARTICLE",TAG_ID2[TAG_ID2.ASIDE=7]="ASIDE",TAG_ID2[TAG_ID2.B=8]="B",TAG_ID2[TAG_ID2.BASE=9]="BASE",TAG_ID2[TAG_ID2.BASEFONT=10]="BASEFONT",TAG_ID2[TAG_ID2.BGSOUND=11]="BGSOUND",TAG_ID2[TAG_ID2.BIG=12]="BIG",TAG_ID2[TAG_ID2.BLOCKQUOTE=13]="BLOCKQUOTE",TAG_ID2[TAG_ID2.BODY=14]="BODY",TAG_ID2[TAG_ID2.BR=15]="BR",TAG_ID2[TAG_ID2.BUTTON=16]="BUTTON",TAG_ID2[TAG_ID2.CAPTION=17]="CAPTION",TAG_ID2[TAG_ID2.CENTER=18]="CENTER",TAG_ID2[TAG_ID2.CODE=19]="CODE",TAG_ID2[TAG_ID2.COL=20]="COL",TAG_ID2[TAG_ID2.COLGROUP=21]="COLGROUP",TAG_ID2[TAG_ID2.DD=22]="DD",TAG_ID2[TAG_ID2.DESC=23]="DESC",TAG_ID2[TAG_ID2.DETAILS=24]="DETAILS",TAG_ID2[TAG_ID2.DIALOG=25]="DIALOG",TAG_ID2[TAG_ID2.DIR=26]="DIR",TAG_ID2[TAG_ID2.DIV=27]="DIV",TAG_ID2[TAG_ID2.DL=28]="DL",TAG_ID2[TAG_ID2.DT=29]="DT",TAG_ID2[TAG_ID2.EM=30]="EM",TAG_ID2[TAG_ID2.EMBED=31]="EMBED",TAG_ID2[TAG_ID2.FIELDSET=32]="FIELDSET",TAG_ID2[TAG_ID2.FIGCAPTION=33]="FIGCAPTION",TAG_ID2[TAG_ID2.FIGURE=34]="FIGURE",TAG_ID2[TAG_ID2.FONT=35]="FONT",TAG_ID2[TAG_ID2.FOOTER=36]="FOOTER",TAG_ID2[TAG_ID2.FOREIGN_OBJECT=37]="FOREIGN_OBJECT",TAG_ID2[TAG_ID2.FORM=38]="FORM",TAG_ID2[TAG_ID2.FRAME=39]="FRAME",TAG_ID2[TAG_ID2.FRAMESET=40]="FRAMESET",TAG_ID2[TAG_ID2.H1=41]="H1",TAG_ID2[TAG_ID2.H2=42]="H2",TAG_ID2[TAG_ID2.H3=43]="H3",TAG_ID2[TAG_ID2.H4=44]="H4",TAG_ID2[TAG_ID2.H5=45]="H5",TAG_ID2[TAG_ID2.H6=46]="H6",TAG_ID2[TAG_ID2.HEAD=47]="HEAD",TAG_ID2[TAG_ID2.HEADER=48]="HEADER",TAG_ID2[TAG_ID2.HGROUP=49]="HGROUP",TAG_ID2[TAG_ID2.HR=50]="HR",TAG_ID2[TAG_ID2.HTML=51]="HTML",TAG_ID2[TAG_ID2.I=52]="I",TAG_ID2[TAG_ID2.IMG=53]="IMG",TAG_ID2[TAG_ID2.IMAGE=54]="IMAGE",TAG_ID2[TAG_ID2.INPUT=55]="INPUT",TAG_ID2[TAG_ID2.IFRAME=56]="IFRAME",TAG_ID2[TAG_ID2.KEYGEN=57]="KEYGEN",TAG_ID2[TAG_ID2.LABEL=58]="LABEL",TAG_ID2[TAG_ID2.LI=59]="LI",TAG_ID2[TAG_ID2.LINK=60]="LINK",TAG_ID2[TAG_ID2.LISTING=61]="LISTING",TAG_ID2[TAG_ID2.MAIN=62]="MAIN",TAG_ID2[TAG_ID2.MALIGNMARK=63]="MALIGNMARK",TAG_ID2[TAG_ID2.MARQUEE=64]="MARQUEE",TAG_ID2[TAG_ID2.MATH=65]="MATH",TAG_ID2[TAG_ID2.MENU=66]="MENU",TAG_ID2[TAG_ID2.META=67]="META",TAG_ID2[TAG_ID2.MGLYPH=68]="MGLYPH",TAG_ID2[TAG_ID2.MI=69]="MI",TAG_ID2[TAG_ID2.MO=70]="MO",TAG_ID2[TAG_ID2.MN=71]="MN",TAG_ID2[TAG_ID2.MS=72]="MS",TAG_ID2[TAG_ID2.MTEXT=73]="MTEXT",TAG_ID2[TAG_ID2.NAV=74]="NAV",TAG_ID2[TAG_ID2.NOBR=75]="NOBR",TAG_ID2[TAG_ID2.NOFRAMES=76]="NOFRAMES",TAG_ID2[TAG_ID2.NOEMBED=77]="NOEMBED",TAG_ID2[TAG_ID2.NOSCRIPT=78]="NOSCRIPT",TAG_ID2[TAG_ID2.OBJECT=79]="OBJECT",TAG_ID2[TAG_ID2.OL=80]="OL",TAG_ID2[TAG_ID2.OPTGROUP=81]="OPTGROUP",TAG_ID2[TAG_ID2.OPTION=82]="OPTION",TAG_ID2[TAG_ID2.P=83]="P",TAG_ID2[TAG_ID2.PARAM=84]="PARAM",TAG_ID2[TAG_ID2.PLAINTEXT=85]="PLAINTEXT",TAG_ID2[TAG_ID2.PRE=86]="PRE",TAG_ID2[TAG_ID2.RB=87]="RB",TAG_ID2[TAG_ID2.RP=88]="RP",TAG_ID2[TAG_ID2.RT=89]="RT",TAG_ID2[TAG_ID2.RTC=90]="RTC",TAG_ID2[TAG_ID2.RUBY=91]="RUBY",TAG_ID2[TAG_ID2.S=92]="S",TAG_ID2[TAG_ID2.SCRIPT=93]="SCRIPT",TAG_ID2[TAG_ID2.SEARCH=94]="SEARCH",TAG_ID2[TAG_ID2.SECTION=95]="SECTION",TAG_ID2[TAG_ID2.SELECT=96]="SELECT",TAG_ID2[TAG_ID2.SOURCE=97]="SOURCE",TAG_ID2[TAG_ID2.SMALL=98]="SMALL",TAG_ID2[TAG_ID2.SPAN=99]="SPAN",TAG_ID2[TAG_ID2.STRIKE=100]="STRIKE",TAG_ID2[TAG_ID2.STRONG=101]="STRONG",TAG_ID2[TAG_ID2.STYLE=102]="STYLE",TAG_ID2[TAG_ID2.SUB=103]="SUB",TAG_ID2[TAG_ID2.SUMMARY=104]="SUMMARY",TAG_ID2[TAG_ID2.SUP=105]="SUP",TAG_ID2[TAG_ID2.TABLE=106]="TABLE",TAG_ID2[TAG_ID2.TBODY=107]="TBODY",TAG_ID2[TAG_ID2.TEMPLATE=108]="TEMPLATE",TAG_ID2[TAG_ID2.TEXTAREA=109]="TEXTAREA",TAG_ID2[TAG_ID2.TFOOT=110]="TFOOT",TAG_ID2[TAG_ID2.TD=111]="TD",TAG_ID2[TAG_ID2.TH=112]="TH",TAG_ID2[TAG_ID2.THEAD=113]="THEAD",TAG_ID2[TAG_ID2.TITLE=114]="TITLE",TAG_ID2[TAG_ID2.TR=115]="TR",TAG_ID2[TAG_ID2.TRACK=116]="TRACK",TAG_ID2[TAG_ID2.TT=117]="TT",TAG_ID2[TAG_ID2.U=118]="U",TAG_ID2[TAG_ID2.UL=119]="UL",TAG_ID2[TAG_ID2.SVG=120]="SVG",TAG_ID2[TAG_ID2.VAR=121]="VAR",TAG_ID2[TAG_ID2.WBR=122]="WBR",TAG_ID2[TAG_ID2.XMP=123]="XMP"})(TAG_ID||(TAG_ID={}));var TAG_NAME_TO_ID=new Map([[TAG_NAMES.A,TAG_ID.A],[TAG_NAMES.ADDRESS,TAG_ID.ADDRESS],[TAG_NAMES.ANNOTATION_XML,TAG_ID.ANNOTATION_XML],[TAG_NAMES.APPLET,TAG_ID.APPLET],[TAG_NAMES.AREA,TAG_ID.AREA],[TAG_NAMES.ARTICLE,TAG_ID.ARTICLE],[TAG_NAMES.ASIDE,TAG_ID.ASIDE],[TAG_NAMES.B,TAG_ID.B],[TAG_NAMES.BASE,TAG_ID.BASE],[TAG_NAMES.BASEFONT,TAG_ID.BASEFONT],[TAG_NAMES.BGSOUND,TAG_ID.BGSOUND],[TAG_NAMES.BIG,TAG_ID.BIG],[TAG_NAMES.BLOCKQUOTE,TAG_ID.BLOCKQUOTE],[TAG_NAMES.BODY,TAG_ID.BODY],[TAG_NAMES.BR,TAG_ID.BR],[TAG_NAMES.BUTTON,TAG_ID.BUTTON],[TAG_NAMES.CAPTION,TAG_ID.CAPTION],[TAG_NAMES.CENTER,TAG_ID.CENTER],[TAG_NAMES.CODE,TAG_ID.CODE],[TAG_NAMES.COL,TAG_ID.COL],[TAG_NAMES.COLGROUP,TAG_ID.COLGROUP],[TAG_NAMES.DD,TAG_ID.DD],[TAG_NAMES.DESC,TAG_ID.DESC],[TAG_NAMES.DETAILS,TAG_ID.DETAILS],[TAG_NAMES.DIALOG,TAG_ID.DIALOG],[TAG_NAMES.DIR,TAG_ID.DIR],[TAG_NAMES.DIV,TAG_ID.DIV],[TAG_NAMES.DL,TAG_ID.DL],[TAG_NAMES.DT,TAG_ID.DT],[TAG_NAMES.EM,TAG_ID.EM],[TAG_NAMES.EMBED,TAG_ID.EMBED],[TAG_NAMES.FIELDSET,TAG_ID.FIELDSET],[TAG_NAMES.FIGCAPTION,TAG_ID.FIGCAPTION],[TAG_NAMES.FIGURE,TAG_ID.FIGURE],[TAG_NAMES.FONT,TAG_ID.FONT],[TAG_NAMES.FOOTER,TAG_ID.FOOTER],[TAG_NAMES.FOREIGN_OBJECT,TAG_ID.FOREIGN_OBJECT],[TAG_NAMES.FORM,TAG_ID.FORM],[TAG_NAMES.FRAME,TAG_ID.FRAME],[TAG_NAMES.FRAMESET,TAG_ID.FRAMESET],[TAG_NAMES.H1,TAG_ID.H1],[TAG_NAMES.H2,TAG_ID.H2],[TAG_NAMES.H3,TAG_ID.H3],[TAG_NAMES.H4,TAG_ID.H4],[TAG_NAMES.H5,TAG_ID.H5],[TAG_NAMES.H6,TAG_ID.H6],[TAG_NAMES.HEAD,TAG_ID.HEAD],[TAG_NAMES.HEADER,TAG_ID.HEADER],[TAG_NAMES.HGROUP,TAG_ID.HGROUP],[TAG_NAMES.HR,TAG_ID.HR],[TAG_NAMES.HTML,TAG_ID.HTML],[TAG_NAMES.I,TAG_ID.I],[TAG_NAMES.IMG,TAG_ID.IMG],[TAG_NAMES.IMAGE,TAG_ID.IMAGE],[TAG_NAMES.INPUT,TAG_ID.INPUT],[TAG_NAMES.IFRAME,TAG_ID.IFRAME],[TAG_NAMES.KEYGEN,TAG_ID.KEYGEN],[TAG_NAMES.LABEL,TAG_ID.LABEL],[TAG_NAMES.LI,TAG_ID.LI],[TAG_NAMES.LINK,TAG_ID.LINK],[TAG_NAMES.LISTING,TAG_ID.LISTING],[TAG_NAMES.MAIN,TAG_ID.MAIN],[TAG_NAMES.MALIGNMARK,TAG_ID.MALIGNMARK],[TAG_NAMES.MARQUEE,TAG_ID.MARQUEE],[TAG_NAMES.MATH,TAG_ID.MATH],[TAG_NAMES.MENU,TAG_ID.MENU],[TAG_NAMES.META,TAG_ID.META],[TAG_NAMES.MGLYPH,TAG_ID.MGLYPH],[TAG_NAMES.MI,TAG_ID.MI],[TAG_NAMES.MO,TAG_ID.MO],[TAG_NAMES.MN,TAG_ID.MN],[TAG_NAMES.MS,TAG_ID.MS],[TAG_NAMES.MTEXT,TAG_ID.MTEXT],[TAG_NAMES.NAV,TAG_ID.NAV],[TAG_NAMES.NOBR,TAG_ID.NOBR],[TAG_NAMES.NOFRAMES,TAG_ID.NOFRAMES],[TAG_NAMES.NOEMBED,TAG_ID.NOEMBED],[TAG_NAMES.NOSCRIPT,TAG_ID.NOSCRIPT],[TAG_NAMES.OBJECT,TAG_ID.OBJECT],[TAG_NAMES.OL,TAG_ID.OL],[TAG_NAMES.OPTGROUP,TAG_ID.OPTGROUP],[TAG_NAMES.OPTION,TAG_ID.OPTION],[TAG_NAMES.P,TAG_ID.P],[TAG_NAMES.PARAM,TAG_ID.PARAM],[TAG_NAMES.PLAINTEXT,TAG_ID.PLAINTEXT],[TAG_NAMES.PRE,TAG_ID.PRE],[TAG_NAMES.RB,TAG_ID.RB],[TAG_NAMES.RP,TAG_ID.RP],[TAG_NAMES.RT,TAG_ID.RT],[TAG_NAMES.RTC,TAG_ID.RTC],[TAG_NAMES.RUBY,TAG_ID.RUBY],[TAG_NAMES.S,TAG_ID.S],[TAG_NAMES.SCRIPT,TAG_ID.SCRIPT],[TAG_NAMES.SEARCH,TAG_ID.SEARCH],[TAG_NAMES.SECTION,TAG_ID.SECTION],[TAG_NAMES.SELECT,TAG_ID.SELECT],[TAG_NAMES.SOURCE,TAG_ID.SOURCE],[TAG_NAMES.SMALL,TAG_ID.SMALL],[TAG_NAMES.SPAN,TAG_ID.SPAN],[TAG_NAMES.STRIKE,TAG_ID.STRIKE],[TAG_NAMES.STRONG,TAG_ID.STRONG],[TAG_NAMES.STYLE,TAG_ID.STYLE],[TAG_NAMES.SUB,TAG_ID.SUB],[TAG_NAMES.SUMMARY,TAG_ID.SUMMARY],[TAG_NAMES.SUP,TAG_ID.SUP],[TAG_NAMES.TABLE,TAG_ID.TABLE],[TAG_NAMES.TBODY,TAG_ID.TBODY],[TAG_NAMES.TEMPLATE,TAG_ID.TEMPLATE],[TAG_NAMES.TEXTAREA,TAG_ID.TEXTAREA],[TAG_NAMES.TFOOT,TAG_ID.TFOOT],[TAG_NAMES.TD,TAG_ID.TD],[TAG_NAMES.TH,TAG_ID.TH],[TAG_NAMES.THEAD,TAG_ID.THEAD],[TAG_NAMES.TITLE,TAG_ID.TITLE],[TAG_NAMES.TR,TAG_ID.TR],[TAG_NAMES.TRACK,TAG_ID.TRACK],[TAG_NAMES.TT,TAG_ID.TT],[TAG_NAMES.U,TAG_ID.U],[TAG_NAMES.UL,TAG_ID.UL],[TAG_NAMES.SVG,TAG_ID.SVG],[TAG_NAMES.VAR,TAG_ID.VAR],[TAG_NAMES.WBR,TAG_ID.WBR],[TAG_NAMES.XMP,TAG_ID.XMP]]);function getTagID(tagName){var _a;return(_a=TAG_NAME_TO_ID.get(tagName))!==null&&_a!==void 0?_a:TAG_ID.UNKNOWN}var $=TAG_ID,SPECIAL_ELEMENTS={[NS.HTML]:new Set([$.ADDRESS,$.APPLET,$.AREA,$.ARTICLE,$.ASIDE,$.BASE,$.BASEFONT,$.BGSOUND,$.BLOCKQUOTE,$.BODY,$.BR,$.BUTTON,$.CAPTION,$.CENTER,$.COL,$.COLGROUP,$.DD,$.DETAILS,$.DIR,$.DIV,$.DL,$.DT,$.EMBED,$.FIELDSET,$.FIGCAPTION,$.FIGURE,$.FOOTER,$.FORM,$.FRAME,$.FRAMESET,$.H1,$.H2,$.H3,$.H4,$.H5,$.H6,$.HEAD,$.HEADER,$.HGROUP,$.HR,$.HTML,$.IFRAME,$.IMG,$.INPUT,$.LI,$.LINK,$.LISTING,$.MAIN,$.MARQUEE,$.MENU,$.META,$.NAV,$.NOEMBED,$.NOFRAMES,$.NOSCRIPT,$.OBJECT,$.OL,$.P,$.PARAM,$.PLAINTEXT,$.PRE,$.SCRIPT,$.SECTION,$.SELECT,$.SOURCE,$.STYLE,$.SUMMARY,$.TABLE,$.TBODY,$.TD,$.TEMPLATE,$.TEXTAREA,$.TFOOT,$.TH,$.THEAD,$.TITLE,$.TR,$.TRACK,$.UL,$.WBR,$.XMP]),[NS.MATHML]:new Set([$.MI,$.MO,$.MN,$.MS,$.MTEXT,$.ANNOTATION_XML]),[NS.SVG]:new Set([$.TITLE,$.FOREIGN_OBJECT,$.DESC]),[NS.XLINK]:new Set,[NS.XML]:new Set,[NS.XMLNS]:new Set},NUMBERED_HEADERS=new Set([$.H1,$.H2,$.H3,$.H4,$.H5,$.H6]),UNESCAPED_TEXT=new Set([TAG_NAMES.STYLE,TAG_NAMES.SCRIPT,TAG_NAMES.XMP,TAG_NAMES.IFRAME,TAG_NAMES.NOEMBED,TAG_NAMES.NOFRAMES,TAG_NAMES.PLAINTEXT]);var State;(function(State2){State2[State2.DATA=0]="DATA",State2[State2.RCDATA=1]="RCDATA",State2[State2.RAWTEXT=2]="RAWTEXT",State2[State2.SCRIPT_DATA=3]="SCRIPT_DATA",State2[State2.PLAINTEXT=4]="PLAINTEXT",State2[State2.TAG_OPEN=5]="TAG_OPEN",State2[State2.END_TAG_OPEN=6]="END_TAG_OPEN",State2[State2.TAG_NAME=7]="TAG_NAME",State2[State2.RCDATA_LESS_THAN_SIGN=8]="RCDATA_LESS_THAN_SIGN",State2[State2.RCDATA_END_TAG_OPEN=9]="RCDATA_END_TAG_OPEN",State2[State2.RCDATA_END_TAG_NAME=10]="RCDATA_END_TAG_NAME",State2[State2.RAWTEXT_LESS_THAN_SIGN=11]="RAWTEXT_LESS_THAN_SIGN",State2[State2.RAWTEXT_END_TAG_OPEN=12]="RAWTEXT_END_TAG_OPEN",State2[State2.RAWTEXT_END_TAG_NAME=13]="RAWTEXT_END_TAG_NAME",State2[State2.SCRIPT_DATA_LESS_THAN_SIGN=14]="SCRIPT_DATA_LESS_THAN_SIGN",State2[State2.SCRIPT_DATA_END_TAG_OPEN=15]="SCRIPT_DATA_END_TAG_OPEN",State2[State2.SCRIPT_DATA_END_TAG_NAME=16]="SCRIPT_DATA_END_TAG_NAME",State2[State2.SCRIPT_DATA_ESCAPE_START=17]="SCRIPT_DATA_ESCAPE_START",State2[State2.SCRIPT_DATA_ESCAPE_START_DASH=18]="SCRIPT_DATA_ESCAPE_START_DASH",State2[State2.SCRIPT_DATA_ESCAPED=19]="SCRIPT_DATA_ESCAPED",State2[State2.SCRIPT_DATA_ESCAPED_DASH=20]="SCRIPT_DATA_ESCAPED_DASH",State2[State2.SCRIPT_DATA_ESCAPED_DASH_DASH=21]="SCRIPT_DATA_ESCAPED_DASH_DASH",State2[State2.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN=22]="SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN",State2[State2.SCRIPT_DATA_ESCAPED_END_TAG_OPEN=23]="SCRIPT_DATA_ESCAPED_END_TAG_OPEN",State2[State2.SCRIPT_DATA_ESCAPED_END_TAG_NAME=24]="SCRIPT_DATA_ESCAPED_END_TAG_NAME",State2[State2.SCRIPT_DATA_DOUBLE_ESCAPE_START=25]="SCRIPT_DATA_DOUBLE_ESCAPE_START",State2[State2.SCRIPT_DATA_DOUBLE_ESCAPED=26]="SCRIPT_DATA_DOUBLE_ESCAPED",State2[State2.SCRIPT_DATA_DOUBLE_ESCAPED_DASH=27]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH",State2[State2.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH=28]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH",State2[State2.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN=29]="SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN",State2[State2.SCRIPT_DATA_DOUBLE_ESCAPE_END=30]="SCRIPT_DATA_DOUBLE_ESCAPE_END",State2[State2.BEFORE_ATTRIBUTE_NAME=31]="BEFORE_ATTRIBUTE_NAME",State2[State2.ATTRIBUTE_NAME=32]="ATTRIBUTE_NAME",State2[State2.AFTER_ATTRIBUTE_NAME=33]="AFTER_ATTRIBUTE_NAME",State2[State2.BEFORE_ATTRIBUTE_VALUE=34]="BEFORE_ATTRIBUTE_VALUE",State2[State2.ATTRIBUTE_VALUE_DOUBLE_QUOTED=35]="ATTRIBUTE_VALUE_DOUBLE_QUOTED",State2[State2.ATTRIBUTE_VALUE_SINGLE_QUOTED=36]="ATTRIBUTE_VALUE_SINGLE_QUOTED",State2[State2.ATTRIBUTE_VALUE_UNQUOTED=37]="ATTRIBUTE_VALUE_UNQUOTED",State2[State2.AFTER_ATTRIBUTE_VALUE_QUOTED=38]="AFTER_ATTRIBUTE_VALUE_QUOTED",State2[State2.SELF_CLOSING_START_TAG=39]="SELF_CLOSING_START_TAG",State2[State2.BOGUS_COMMENT=40]="BOGUS_COMMENT",State2[State2.MARKUP_DECLARATION_OPEN=41]="MARKUP_DECLARATION_OPEN",State2[State2.COMMENT_START=42]="COMMENT_START",State2[State2.COMMENT_START_DASH=43]="COMMENT_START_DASH",State2[State2.COMMENT=44]="COMMENT",State2[State2.COMMENT_LESS_THAN_SIGN=45]="COMMENT_LESS_THAN_SIGN",State2[State2.COMMENT_LESS_THAN_SIGN_BANG=46]="COMMENT_LESS_THAN_SIGN_BANG",State2[State2.COMMENT_LESS_THAN_SIGN_BANG_DASH=47]="COMMENT_LESS_THAN_SIGN_BANG_DASH",State2[State2.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH=48]="COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH",State2[State2.COMMENT_END_DASH=49]="COMMENT_END_DASH",State2[State2.COMMENT_END=50]="COMMENT_END",State2[State2.COMMENT_END_BANG=51]="COMMENT_END_BANG",State2[State2.DOCTYPE=52]="DOCTYPE",State2[State2.BEFORE_DOCTYPE_NAME=53]="BEFORE_DOCTYPE_NAME",State2[State2.DOCTYPE_NAME=54]="DOCTYPE_NAME",State2[State2.AFTER_DOCTYPE_NAME=55]="AFTER_DOCTYPE_NAME",State2[State2.AFTER_DOCTYPE_PUBLIC_KEYWORD=56]="AFTER_DOCTYPE_PUBLIC_KEYWORD",State2[State2.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER=57]="BEFORE_DOCTYPE_PUBLIC_IDENTIFIER",State2[State2.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED=58]="DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED",State2[State2.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED=59]="DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED",State2[State2.AFTER_DOCTYPE_PUBLIC_IDENTIFIER=60]="AFTER_DOCTYPE_PUBLIC_IDENTIFIER",State2[State2.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS=61]="BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS",State2[State2.AFTER_DOCTYPE_SYSTEM_KEYWORD=62]="AFTER_DOCTYPE_SYSTEM_KEYWORD",State2[State2.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER=63]="BEFORE_DOCTYPE_SYSTEM_IDENTIFIER",State2[State2.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED=64]="DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED",State2[State2.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED=65]="DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED",State2[State2.AFTER_DOCTYPE_SYSTEM_IDENTIFIER=66]="AFTER_DOCTYPE_SYSTEM_IDENTIFIER",State2[State2.BOGUS_DOCTYPE=67]="BOGUS_DOCTYPE",State2[State2.CDATA_SECTION=68]="CDATA_SECTION",State2[State2.CDATA_SECTION_BRACKET=69]="CDATA_SECTION_BRACKET",State2[State2.CDATA_SECTION_END=70]="CDATA_SECTION_END",State2[State2.CHARACTER_REFERENCE=71]="CHARACTER_REFERENCE",State2[State2.AMBIGUOUS_AMPERSAND=72]="AMBIGUOUS_AMPERSAND"})(State||(State={}));var TokenizerMode={DATA:State.DATA,RCDATA:State.RCDATA,RAWTEXT:State.RAWTEXT,SCRIPT_DATA:State.SCRIPT_DATA,PLAINTEXT:State.PLAINTEXT,CDATA_SECTION:State.CDATA_SECTION};function isAsciiDigit(cp){return cp>=CODE_POINTS.DIGIT_0&&cp<=CODE_POINTS.DIGIT_9}function isAsciiUpper(cp){return cp>=CODE_POINTS.LATIN_CAPITAL_A&&cp<=CODE_POINTS.LATIN_CAPITAL_Z}function isAsciiLower(cp){return cp>=CODE_POINTS.LATIN_SMALL_A&&cp<=CODE_POINTS.LATIN_SMALL_Z}function isAsciiLetter(cp){return isAsciiLower(cp)||isAsciiUpper(cp)}function isAsciiAlphaNumeric2(cp){return isAsciiLetter(cp)||isAsciiDigit(cp)}function toAsciiLower(cp){return cp+32}function isWhitespace(cp){return cp===CODE_POINTS.SPACE||cp===CODE_POINTS.LINE_FEED||cp===CODE_POINTS.TABULATION||cp===CODE_POINTS.FORM_FEED}function isScriptDataDoubleEscapeSequenceEnd(cp){return isWhitespace(cp)||cp===CODE_POINTS.SOLIDUS||cp===CODE_POINTS.GREATER_THAN_SIGN}function getErrorForNumericCharacterReference(code){return code===CODE_POINTS.NULL?ERR.nullCharacterReference:code>1114111?ERR.characterReferenceOutsideUnicodeRange:isSurrogate(code)?ERR.surrogateCharacterReference:isUndefinedCodePoint(code)?ERR.noncharacterCharacterReference:isControlCodePoint(code)||code===CODE_POINTS.CARRIAGE_RETURN?ERR.controlCharacterReference:null}var Tokenizer=class{constructor(options,handler){this.options=options,this.handler=handler,this.paused=!1,this.inLoop=!1,this.inForeignNode=!1,this.lastStartTagName="",this.active=!1,this.state=State.DATA,this.returnState=State.DATA,this.entityStartPos=0,this.consumedAfterSnapshot=-1,this.currentCharacterToken=null,this.currentToken=null,this.currentAttr={name:"",value:""},this.preprocessor=new Preprocessor(handler),this.currentLocation=this.getCurrentLocation(-1),this.entityDecoder=new EntityDecoder2(htmlDecodeTree,(cp,consumed)=>{this.preprocessor.pos=this.entityStartPos+consumed-1,this._flushCodePointConsumedAsCharacterReference(cp)},handler.onParseError?{missingSemicolonAfterCharacterReference:()=>{this._err(ERR.missingSemicolonAfterCharacterReference,1)},absenceOfDigitsInNumericCharacterReference:consumed=>{this._err(ERR.absenceOfDigitsInNumericCharacterReference,this.entityStartPos-this.preprocessor.pos+consumed)},validateNumericCharacterReference:code=>{let error=getErrorForNumericCharacterReference(code);error&&this._err(error,1)}}:void 0)}_err(code,cpOffset=0){var _a,_b;(_b=(_a=this.handler).onParseError)===null||_b===void 0||_b.call(_a,this.preprocessor.getError(code,cpOffset))}getCurrentLocation(offset){return this.options.sourceCodeLocationInfo?{startLine:this.preprocessor.line,startCol:this.preprocessor.col-offset,startOffset:this.preprocessor.offset-offset,endLine:-1,endCol:-1,endOffset:-1}:null}_runParsingLoop(){if(!this.inLoop){for(this.inLoop=!0;this.active&&!this.paused;){this.consumedAfterSnapshot=0;let cp=this._consume();this._ensureHibernation()||this._callState(cp)}this.inLoop=!1}}pause(){this.paused=!0}resume(writeCallback){if(!this.paused)throw new Error("Parser was already resumed");this.paused=!1,!this.inLoop&&(this._runParsingLoop(),this.paused||writeCallback?.())}write(chunk,isLastChunk,writeCallback){this.active=!0,this.preprocessor.write(chunk,isLastChunk),this._runParsingLoop(),this.paused||writeCallback?.()}insertHtmlAtCurrentPos(chunk){this.active=!0,this.preprocessor.insertHtmlAtCurrentPos(chunk),this._runParsingLoop()}_ensureHibernation(){return this.preprocessor.endOfChunkHit?(this.preprocessor.retreat(this.consumedAfterSnapshot),this.consumedAfterSnapshot=0,this.active=!1,!0):!1}_consume(){return this.consumedAfterSnapshot++,this.preprocessor.advance()}_advanceBy(count){this.consumedAfterSnapshot+=count;for(let i=0;i<count;i++)this.preprocessor.advance()}_consumeSequenceIfMatch(pattern,caseSensitive){return this.preprocessor.startsWith(pattern,caseSensitive)?(this._advanceBy(pattern.length-1),!0):!1}_createStartTagToken(){this.currentToken={type:TokenType.START_TAG,tagName:"",tagID:TAG_ID.UNKNOWN,selfClosing:!1,ackSelfClosing:!1,attrs:[],location:this.getCurrentLocation(1)}}_createEndTagToken(){this.currentToken={type:TokenType.END_TAG,tagName:"",tagID:TAG_ID.UNKNOWN,selfClosing:!1,ackSelfClosing:!1,attrs:[],location:this.getCurrentLocation(2)}}_createCommentToken(offset){this.currentToken={type:TokenType.COMMENT,data:"",location:this.getCurrentLocation(offset)}}_createDoctypeToken(initialName){this.currentToken={type:TokenType.DOCTYPE,name:initialName,forceQuirks:!1,publicId:null,systemId:null,location:this.currentLocation}}_createCharacterToken(type,chars){this.currentCharacterToken={type,chars,location:this.currentLocation}}_createAttr(attrNameFirstCh){this.currentAttr={name:attrNameFirstCh,value:""},this.currentLocation=this.getCurrentLocation(0)}_leaveAttrName(){var _a,_b;let token=this.currentToken;if(getTokenAttr(token,this.currentAttr.name)===null){if(token.attrs.push(this.currentAttr),token.location&&this.currentLocation){let attrLocations=(_a=(_b=token.location).attrs)!==null&&_a!==void 0?_a:_b.attrs=Object.create(null);attrLocations[this.currentAttr.name]=this.currentLocation,this._leaveAttrValue()}}else this._err(ERR.duplicateAttribute)}_leaveAttrValue(){this.currentLocation&&(this.currentLocation.endLine=this.preprocessor.line,this.currentLocation.endCol=this.preprocessor.col,this.currentLocation.endOffset=this.preprocessor.offset)}prepareToken(ct){this._emitCurrentCharacterToken(ct.location),this.currentToken=null,ct.location&&(ct.location.endLine=this.preprocessor.line,ct.location.endCol=this.preprocessor.col+1,ct.location.endOffset=this.preprocessor.offset+1),this.currentLocation=this.getCurrentLocation(-1)}emitCurrentTagToken(){let ct=this.currentToken;this.prepareToken(ct),ct.tagID=getTagID(ct.tagName),ct.type===TokenType.START_TAG?(this.lastStartTagName=ct.tagName,this.handler.onStartTag(ct)):(ct.attrs.length>0&&this._err(ERR.endTagWithAttributes),ct.selfClosing&&this._err(ERR.endTagWithTrailingSolidus),this.handler.onEndTag(ct)),this.preprocessor.dropParsedChunk()}emitCurrentComment(ct){this.prepareToken(ct),this.handler.onComment(ct),this.preprocessor.dropParsedChunk()}emitCurrentDoctype(ct){this.prepareToken(ct),this.handler.onDoctype(ct),this.preprocessor.dropParsedChunk()}_emitCurrentCharacterToken(nextLocation){if(this.currentCharacterToken){switch(nextLocation&&this.currentCharacterToken.location&&(this.currentCharacterToken.location.endLine=nextLocation.startLine,this.currentCharacterToken.location.endCol=nextLocation.startCol,this.currentCharacterToken.location.endOffset=nextLocation.startOffset),this.currentCharacterToken.type){case TokenType.CHARACTER:{this.handler.onCharacter(this.currentCharacterToken);break}case TokenType.NULL_CHARACTER:{this.handler.onNullCharacter(this.currentCharacterToken);break}case TokenType.WHITESPACE_CHARACTER:{this.handler.onWhitespaceCharacter(this.currentCharacterToken);break}}this.currentCharacterToken=null}}_emitEOFToken(){let location=this.getCurrentLocation(0);location&&(location.endLine=location.startLine,location.endCol=location.startCol,location.endOffset=location.startOffset),this._emitCurrentCharacterToken(location),this.handler.onEof({type:TokenType.EOF,location}),this.active=!1}_appendCharToCurrentCharacterToken(type,ch){if(this.currentCharacterToken)if(this.currentCharacterToken.type===type){this.currentCharacterToken.chars+=ch;return}else this.currentLocation=this.getCurrentLocation(0),this._emitCurrentCharacterToken(this.currentLocation),this.preprocessor.dropParsedChunk();this._createCharacterToken(type,ch)}_emitCodePoint(cp){let type=isWhitespace(cp)?TokenType.WHITESPACE_CHARACTER:cp===CODE_POINTS.NULL?TokenType.NULL_CHARACTER:TokenType.CHARACTER;this._appendCharToCurrentCharacterToken(type,cp<65536?String.fromCharCode(cp):String.fromCodePoint(cp))}_emitChars(ch){this._appendCharToCurrentCharacterToken(TokenType.CHARACTER,ch)}_startCharacterReference(){this.returnState=this.state,this.state=State.CHARACTER_REFERENCE,this.entityStartPos=this.preprocessor.pos,this.entityDecoder.startEntity(this._isCharacterReferenceInAttribute()?DecodingMode.Attribute:DecodingMode.Legacy)}_isCharacterReferenceInAttribute(){return this.returnState===State.ATTRIBUTE_VALUE_DOUBLE_QUOTED||this.returnState===State.ATTRIBUTE_VALUE_SINGLE_QUOTED||this.returnState===State.ATTRIBUTE_VALUE_UNQUOTED}_flushCodePointConsumedAsCharacterReference(cp){this._isCharacterReferenceInAttribute()?this.currentAttr.value+=String.fromCodePoint(cp):this._emitCodePoint(cp)}_callState(cp){switch(this.state){case State.DATA:{this._stateData(cp);break}case State.RCDATA:{this._stateRcdata(cp);break}case State.RAWTEXT:{this._stateRawtext(cp);break}case State.SCRIPT_DATA:{this._stateScriptData(cp);break}case State.PLAINTEXT:{this._statePlaintext(cp);break}case State.TAG_OPEN:{this._stateTagOpen(cp);break}case State.END_TAG_OPEN:{this._stateEndTagOpen(cp);break}case State.TAG_NAME:{this._stateTagName(cp);break}case State.RCDATA_LESS_THAN_SIGN:{this._stateRcdataLessThanSign(cp);break}case State.RCDATA_END_TAG_OPEN:{this._stateRcdataEndTagOpen(cp);break}case State.RCDATA_END_TAG_NAME:{this._stateRcdataEndTagName(cp);break}case State.RAWTEXT_LESS_THAN_SIGN:{this._stateRawtextLessThanSign(cp);break}case State.RAWTEXT_END_TAG_OPEN:{this._stateRawtextEndTagOpen(cp);break}case State.RAWTEXT_END_TAG_NAME:{this._stateRawtextEndTagName(cp);break}case State.SCRIPT_DATA_LESS_THAN_SIGN:{this._stateScriptDataLessThanSign(cp);break}case State.SCRIPT_DATA_END_TAG_OPEN:{this._stateScriptDataEndTagOpen(cp);break}case State.SCRIPT_DATA_END_TAG_NAME:{this._stateScriptDataEndTagName(cp);break}case State.SCRIPT_DATA_ESCAPE_START:{this._stateScriptDataEscapeStart(cp);break}case State.SCRIPT_DATA_ESCAPE_START_DASH:{this._stateScriptDataEscapeStartDash(cp);break}case State.SCRIPT_DATA_ESCAPED:{this._stateScriptDataEscaped(cp);break}case State.SCRIPT_DATA_ESCAPED_DASH:{this._stateScriptDataEscapedDash(cp);break}case State.SCRIPT_DATA_ESCAPED_DASH_DASH:{this._stateScriptDataEscapedDashDash(cp);break}case State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:{this._stateScriptDataEscapedLessThanSign(cp);break}case State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN:{this._stateScriptDataEscapedEndTagOpen(cp);break}case State.SCRIPT_DATA_ESCAPED_END_TAG_NAME:{this._stateScriptDataEscapedEndTagName(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPE_START:{this._stateScriptDataDoubleEscapeStart(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED:{this._stateScriptDataDoubleEscaped(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH:{this._stateScriptDataDoubleEscapedDash(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:{this._stateScriptDataDoubleEscapedDashDash(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:{this._stateScriptDataDoubleEscapedLessThanSign(cp);break}case State.SCRIPT_DATA_DOUBLE_ESCAPE_END:{this._stateScriptDataDoubleEscapeEnd(cp);break}case State.BEFORE_ATTRIBUTE_NAME:{this._stateBeforeAttributeName(cp);break}case State.ATTRIBUTE_NAME:{this._stateAttributeName(cp);break}case State.AFTER_ATTRIBUTE_NAME:{this._stateAfterAttributeName(cp);break}case State.BEFORE_ATTRIBUTE_VALUE:{this._stateBeforeAttributeValue(cp);break}case State.ATTRIBUTE_VALUE_DOUBLE_QUOTED:{this._stateAttributeValueDoubleQuoted(cp);break}case State.ATTRIBUTE_VALUE_SINGLE_QUOTED:{this._stateAttributeValueSingleQuoted(cp);break}case State.ATTRIBUTE_VALUE_UNQUOTED:{this._stateAttributeValueUnquoted(cp);break}case State.AFTER_ATTRIBUTE_VALUE_QUOTED:{this._stateAfterAttributeValueQuoted(cp);break}case State.SELF_CLOSING_START_TAG:{this._stateSelfClosingStartTag(cp);break}case State.BOGUS_COMMENT:{this._stateBogusComment(cp);break}case State.MARKUP_DECLARATION_OPEN:{this._stateMarkupDeclarationOpen(cp);break}case State.COMMENT_START:{this._stateCommentStart(cp);break}case State.COMMENT_START_DASH:{this._stateCommentStartDash(cp);break}case State.COMMENT:{this._stateComment(cp);break}case State.COMMENT_LESS_THAN_SIGN:{this._stateCommentLessThanSign(cp);break}case State.COMMENT_LESS_THAN_SIGN_BANG:{this._stateCommentLessThanSignBang(cp);break}case State.COMMENT_LESS_THAN_SIGN_BANG_DASH:{this._stateCommentLessThanSignBangDash(cp);break}case State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH:{this._stateCommentLessThanSignBangDashDash(cp);break}case State.COMMENT_END_DASH:{this._stateCommentEndDash(cp);break}case State.COMMENT_END:{this._stateCommentEnd(cp);break}case State.COMMENT_END_BANG:{this._stateCommentEndBang(cp);break}case State.DOCTYPE:{this._stateDoctype(cp);break}case State.BEFORE_DOCTYPE_NAME:{this._stateBeforeDoctypeName(cp);break}case State.DOCTYPE_NAME:{this._stateDoctypeName(cp);break}case State.AFTER_DOCTYPE_NAME:{this._stateAfterDoctypeName(cp);break}case State.AFTER_DOCTYPE_PUBLIC_KEYWORD:{this._stateAfterDoctypePublicKeyword(cp);break}case State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:{this._stateBeforeDoctypePublicIdentifier(cp);break}case State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:{this._stateDoctypePublicIdentifierDoubleQuoted(cp);break}case State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:{this._stateDoctypePublicIdentifierSingleQuoted(cp);break}case State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER:{this._stateAfterDoctypePublicIdentifier(cp);break}case State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:{this._stateBetweenDoctypePublicAndSystemIdentifiers(cp);break}case State.AFTER_DOCTYPE_SYSTEM_KEYWORD:{this._stateAfterDoctypeSystemKeyword(cp);break}case State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:{this._stateBeforeDoctypeSystemIdentifier(cp);break}case State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:{this._stateDoctypeSystemIdentifierDoubleQuoted(cp);break}case State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:{this._stateDoctypeSystemIdentifierSingleQuoted(cp);break}case State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER:{this._stateAfterDoctypeSystemIdentifier(cp);break}case State.BOGUS_DOCTYPE:{this._stateBogusDoctype(cp);break}case State.CDATA_SECTION:{this._stateCdataSection(cp);break}case State.CDATA_SECTION_BRACKET:{this._stateCdataSectionBracket(cp);break}case State.CDATA_SECTION_END:{this._stateCdataSectionEnd(cp);break}case State.CHARACTER_REFERENCE:{this._stateCharacterReference();break}case State.AMBIGUOUS_AMPERSAND:{this._stateAmbiguousAmpersand(cp);break}default:throw new Error("Unknown state")}}_stateData(cp){switch(cp){case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.TAG_OPEN;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._emitCodePoint(cp);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_stateRcdata(cp){switch(cp){case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.RCDATA_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_stateRawtext(cp){switch(cp){case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.RAWTEXT_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_stateScriptData(cp){switch(cp){case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_statePlaintext(cp){switch(cp){case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_stateTagOpen(cp){if(isAsciiLetter(cp))this._createStartTagToken(),this.state=State.TAG_NAME,this._stateTagName(cp);else switch(cp){case CODE_POINTS.EXCLAMATION_MARK:{this.state=State.MARKUP_DECLARATION_OPEN;break}case CODE_POINTS.SOLIDUS:{this.state=State.END_TAG_OPEN;break}case CODE_POINTS.QUESTION_MARK:{this._err(ERR.unexpectedQuestionMarkInsteadOfTagName),this._createCommentToken(1),this.state=State.BOGUS_COMMENT,this._stateBogusComment(cp);break}case CODE_POINTS.EOF:{this._err(ERR.eofBeforeTagName),this._emitChars("<"),this._emitEOFToken();break}default:this._err(ERR.invalidFirstCharacterOfTagName),this._emitChars("<"),this.state=State.DATA,this._stateData(cp)}}_stateEndTagOpen(cp){if(isAsciiLetter(cp))this._createEndTagToken(),this.state=State.TAG_NAME,this._stateTagName(cp);else switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingEndTagName),this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofBeforeTagName),this._emitChars("</"),this._emitEOFToken();break}default:this._err(ERR.invalidFirstCharacterOfTagName),this._createCommentToken(2),this.state=State.BOGUS_COMMENT,this._stateBogusComment(cp)}}_stateTagName(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_ATTRIBUTE_NAME;break}case CODE_POINTS.SOLIDUS:{this.state=State.SELF_CLOSING_START_TAG;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA,this.emitCurrentTagToken();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.tagName+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag),this._emitEOFToken();break}default:token.tagName+=String.fromCodePoint(isAsciiUpper(cp)?toAsciiLower(cp):cp)}}_stateRcdataLessThanSign(cp){cp===CODE_POINTS.SOLIDUS?this.state=State.RCDATA_END_TAG_OPEN:(this._emitChars("<"),this.state=State.RCDATA,this._stateRcdata(cp))}_stateRcdataEndTagOpen(cp){isAsciiLetter(cp)?(this.state=State.RCDATA_END_TAG_NAME,this._stateRcdataEndTagName(cp)):(this._emitChars("</"),this.state=State.RCDATA,this._stateRcdata(cp))}handleSpecialEndTag(_cp){if(!this.preprocessor.startsWith(this.lastStartTagName,!1))return!this._ensureHibernation();this._createEndTagToken();let token=this.currentToken;switch(token.tagName=this.lastStartTagName,this.preprocessor.peek(this.lastStartTagName.length)){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:return this._advanceBy(this.lastStartTagName.length),this.state=State.BEFORE_ATTRIBUTE_NAME,!1;case CODE_POINTS.SOLIDUS:return this._advanceBy(this.lastStartTagName.length),this.state=State.SELF_CLOSING_START_TAG,!1;case CODE_POINTS.GREATER_THAN_SIGN:return this._advanceBy(this.lastStartTagName.length),this.emitCurrentTagToken(),this.state=State.DATA,!1;default:return!this._ensureHibernation()}}_stateRcdataEndTagName(cp){this.handleSpecialEndTag(cp)&&(this._emitChars("</"),this.state=State.RCDATA,this._stateRcdata(cp))}_stateRawtextLessThanSign(cp){cp===CODE_POINTS.SOLIDUS?this.state=State.RAWTEXT_END_TAG_OPEN:(this._emitChars("<"),this.state=State.RAWTEXT,this._stateRawtext(cp))}_stateRawtextEndTagOpen(cp){isAsciiLetter(cp)?(this.state=State.RAWTEXT_END_TAG_NAME,this._stateRawtextEndTagName(cp)):(this._emitChars("</"),this.state=State.RAWTEXT,this._stateRawtext(cp))}_stateRawtextEndTagName(cp){this.handleSpecialEndTag(cp)&&(this._emitChars("</"),this.state=State.RAWTEXT,this._stateRawtext(cp))}_stateScriptDataLessThanSign(cp){switch(cp){case CODE_POINTS.SOLIDUS:{this.state=State.SCRIPT_DATA_END_TAG_OPEN;break}case CODE_POINTS.EXCLAMATION_MARK:{this.state=State.SCRIPT_DATA_ESCAPE_START,this._emitChars("<!");break}default:this._emitChars("<"),this.state=State.SCRIPT_DATA,this._stateScriptData(cp)}}_stateScriptDataEndTagOpen(cp){isAsciiLetter(cp)?(this.state=State.SCRIPT_DATA_END_TAG_NAME,this._stateScriptDataEndTagName(cp)):(this._emitChars("</"),this.state=State.SCRIPT_DATA,this._stateScriptData(cp))}_stateScriptDataEndTagName(cp){this.handleSpecialEndTag(cp)&&(this._emitChars("</"),this.state=State.SCRIPT_DATA,this._stateScriptData(cp))}_stateScriptDataEscapeStart(cp){cp===CODE_POINTS.HYPHEN_MINUS?(this.state=State.SCRIPT_DATA_ESCAPE_START_DASH,this._emitChars("-")):(this.state=State.SCRIPT_DATA,this._stateScriptData(cp))}_stateScriptDataEscapeStartDash(cp){cp===CODE_POINTS.HYPHEN_MINUS?(this.state=State.SCRIPT_DATA_ESCAPED_DASH_DASH,this._emitChars("-")):(this.state=State.SCRIPT_DATA,this._stateScriptData(cp))}_stateScriptDataEscaped(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_ESCAPED_DASH,this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_stateScriptDataEscapedDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_ESCAPED_DASH_DASH,this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.state=State.SCRIPT_DATA_ESCAPED,this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=State.SCRIPT_DATA_ESCAPED,this._emitCodePoint(cp)}}_stateScriptDataEscapedDashDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.SCRIPT_DATA,this._emitChars(">");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.state=State.SCRIPT_DATA_ESCAPED,this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=State.SCRIPT_DATA_ESCAPED,this._emitCodePoint(cp)}}_stateScriptDataEscapedLessThanSign(cp){cp===CODE_POINTS.SOLIDUS?this.state=State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN:isAsciiLetter(cp)?(this._emitChars("<"),this.state=State.SCRIPT_DATA_DOUBLE_ESCAPE_START,this._stateScriptDataDoubleEscapeStart(cp)):(this._emitChars("<"),this.state=State.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(cp))}_stateScriptDataEscapedEndTagOpen(cp){isAsciiLetter(cp)?(this.state=State.SCRIPT_DATA_ESCAPED_END_TAG_NAME,this._stateScriptDataEscapedEndTagName(cp)):(this._emitChars("</"),this.state=State.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(cp))}_stateScriptDataEscapedEndTagName(cp){this.handleSpecialEndTag(cp)&&(this._emitChars("</"),this.state=State.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(cp))}_stateScriptDataDoubleEscapeStart(cp){if(this.preprocessor.startsWith(SEQUENCES.SCRIPT,!1)&&isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(SEQUENCES.SCRIPT.length))){this._emitCodePoint(cp);for(let i=0;i<SEQUENCES.SCRIPT.length;i++)this._emitCodePoint(this._consume());this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED}else this._ensureHibernation()||(this.state=State.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(cp))}_stateScriptDataDoubleEscaped(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH,this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_stateScriptDataDoubleEscapedDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitCodePoint(cp)}}_stateScriptDataDoubleEscapedDashDash(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this._emitChars("-");break}case CODE_POINTS.LESS_THAN_SIGN:{this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.SCRIPT_DATA,this._emitChars(">");break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitChars(REPLACEMENT_CHARACTER);break}case CODE_POINTS.EOF:{this._err(ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitCodePoint(cp)}}_stateScriptDataDoubleEscapedLessThanSign(cp){cp===CODE_POINTS.SOLIDUS?(this.state=State.SCRIPT_DATA_DOUBLE_ESCAPE_END,this._emitChars("/")):(this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED,this._stateScriptDataDoubleEscaped(cp))}_stateScriptDataDoubleEscapeEnd(cp){if(this.preprocessor.startsWith(SEQUENCES.SCRIPT,!1)&&isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(SEQUENCES.SCRIPT.length))){this._emitCodePoint(cp);for(let i=0;i<SEQUENCES.SCRIPT.length;i++)this._emitCodePoint(this._consume());this.state=State.SCRIPT_DATA_ESCAPED}else this._ensureHibernation()||(this.state=State.SCRIPT_DATA_DOUBLE_ESCAPED,this._stateScriptDataDoubleEscaped(cp))}_stateBeforeAttributeName(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.SOLIDUS:case CODE_POINTS.GREATER_THAN_SIGN:case CODE_POINTS.EOF:{this.state=State.AFTER_ATTRIBUTE_NAME,this._stateAfterAttributeName(cp);break}case CODE_POINTS.EQUALS_SIGN:{this._err(ERR.unexpectedEqualsSignBeforeAttributeName),this._createAttr("="),this.state=State.ATTRIBUTE_NAME;break}default:this._createAttr(""),this.state=State.ATTRIBUTE_NAME,this._stateAttributeName(cp)}}_stateAttributeName(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:case CODE_POINTS.SOLIDUS:case CODE_POINTS.GREATER_THAN_SIGN:case CODE_POINTS.EOF:{this._leaveAttrName(),this.state=State.AFTER_ATTRIBUTE_NAME,this._stateAfterAttributeName(cp);break}case CODE_POINTS.EQUALS_SIGN:{this._leaveAttrName(),this.state=State.BEFORE_ATTRIBUTE_VALUE;break}case CODE_POINTS.QUOTATION_MARK:case CODE_POINTS.APOSTROPHE:case CODE_POINTS.LESS_THAN_SIGN:{this._err(ERR.unexpectedCharacterInAttributeName),this.currentAttr.name+=String.fromCodePoint(cp);break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.currentAttr.name+=REPLACEMENT_CHARACTER;break}default:this.currentAttr.name+=String.fromCodePoint(isAsciiUpper(cp)?toAsciiLower(cp):cp)}}_stateAfterAttributeName(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.SOLIDUS:{this.state=State.SELF_CLOSING_START_TAG;break}case CODE_POINTS.EQUALS_SIGN:{this.state=State.BEFORE_ATTRIBUTE_VALUE;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA,this.emitCurrentTagToken();break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag),this._emitEOFToken();break}default:this._createAttr(""),this.state=State.ATTRIBUTE_NAME,this._stateAttributeName(cp)}}_stateBeforeAttributeValue(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.QUOTATION_MARK:{this.state=State.ATTRIBUTE_VALUE_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this.state=State.ATTRIBUTE_VALUE_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingAttributeValue),this.state=State.DATA,this.emitCurrentTagToken();break}default:this.state=State.ATTRIBUTE_VALUE_UNQUOTED,this._stateAttributeValueUnquoted(cp)}}_stateAttributeValueDoubleQuoted(cp){switch(cp){case CODE_POINTS.QUOTATION_MARK:{this.state=State.AFTER_ATTRIBUTE_VALUE_QUOTED;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.currentAttr.value+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag),this._emitEOFToken();break}default:this.currentAttr.value+=String.fromCodePoint(cp)}}_stateAttributeValueSingleQuoted(cp){switch(cp){case CODE_POINTS.APOSTROPHE:{this.state=State.AFTER_ATTRIBUTE_VALUE_QUOTED;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.currentAttr.value+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag),this._emitEOFToken();break}default:this.currentAttr.value+=String.fromCodePoint(cp)}}_stateAttributeValueUnquoted(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this._leaveAttrValue(),this.state=State.BEFORE_ATTRIBUTE_NAME;break}case CODE_POINTS.AMPERSAND:{this._startCharacterReference();break}case CODE_POINTS.GREATER_THAN_SIGN:{this._leaveAttrValue(),this.state=State.DATA,this.emitCurrentTagToken();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this.currentAttr.value+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.QUOTATION_MARK:case CODE_POINTS.APOSTROPHE:case CODE_POINTS.LESS_THAN_SIGN:case CODE_POINTS.EQUALS_SIGN:case CODE_POINTS.GRAVE_ACCENT:{this._err(ERR.unexpectedCharacterInUnquotedAttributeValue),this.currentAttr.value+=String.fromCodePoint(cp);break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag),this._emitEOFToken();break}default:this.currentAttr.value+=String.fromCodePoint(cp)}}_stateAfterAttributeValueQuoted(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this._leaveAttrValue(),this.state=State.BEFORE_ATTRIBUTE_NAME;break}case CODE_POINTS.SOLIDUS:{this._leaveAttrValue(),this.state=State.SELF_CLOSING_START_TAG;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._leaveAttrValue(),this.state=State.DATA,this.emitCurrentTagToken();break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag),this._emitEOFToken();break}default:this._err(ERR.missingWhitespaceBetweenAttributes),this.state=State.BEFORE_ATTRIBUTE_NAME,this._stateBeforeAttributeName(cp)}}_stateSelfClosingStartTag(cp){switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{let token=this.currentToken;token.selfClosing=!0,this.state=State.DATA,this.emitCurrentTagToken();break}case CODE_POINTS.EOF:{this._err(ERR.eofInTag),this._emitEOFToken();break}default:this._err(ERR.unexpectedSolidusInTag),this.state=State.BEFORE_ATTRIBUTE_NAME,this._stateBeforeAttributeName(cp)}}_stateBogusComment(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA,this.emitCurrentComment(token);break}case CODE_POINTS.EOF:{this.emitCurrentComment(token),this._emitEOFToken();break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.data+=REPLACEMENT_CHARACTER;break}default:token.data+=String.fromCodePoint(cp)}}_stateMarkupDeclarationOpen(cp){this._consumeSequenceIfMatch(SEQUENCES.DASH_DASH,!0)?(this._createCommentToken(SEQUENCES.DASH_DASH.length+1),this.state=State.COMMENT_START):this._consumeSequenceIfMatch(SEQUENCES.DOCTYPE,!1)?(this.currentLocation=this.getCurrentLocation(SEQUENCES.DOCTYPE.length+1),this.state=State.DOCTYPE):this._consumeSequenceIfMatch(SEQUENCES.CDATA_START,!0)?this.inForeignNode?this.state=State.CDATA_SECTION:(this._err(ERR.cdataInHtmlContent),this._createCommentToken(SEQUENCES.CDATA_START.length+1),this.currentToken.data="[CDATA[",this.state=State.BOGUS_COMMENT):this._ensureHibernation()||(this._err(ERR.incorrectlyOpenedComment),this._createCommentToken(2),this.state=State.BOGUS_COMMENT,this._stateBogusComment(cp))}_stateCommentStart(cp){switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_START_DASH;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptClosingOfEmptyComment),this.state=State.DATA;let token=this.currentToken;this.emitCurrentComment(token);break}default:this.state=State.COMMENT,this._stateComment(cp)}}_stateCommentStartDash(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_END;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptClosingOfEmptyComment),this.state=State.DATA,this.emitCurrentComment(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment),this.emitCurrentComment(token),this._emitEOFToken();break}default:token.data+="-",this.state=State.COMMENT,this._stateComment(cp)}}_stateComment(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_END_DASH;break}case CODE_POINTS.LESS_THAN_SIGN:{token.data+="<",this.state=State.COMMENT_LESS_THAN_SIGN;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.data+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment),this.emitCurrentComment(token),this._emitEOFToken();break}default:token.data+=String.fromCodePoint(cp)}}_stateCommentLessThanSign(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.EXCLAMATION_MARK:{token.data+="!",this.state=State.COMMENT_LESS_THAN_SIGN_BANG;break}case CODE_POINTS.LESS_THAN_SIGN:{token.data+="<";break}default:this.state=State.COMMENT,this._stateComment(cp)}}_stateCommentLessThanSignBang(cp){cp===CODE_POINTS.HYPHEN_MINUS?this.state=State.COMMENT_LESS_THAN_SIGN_BANG_DASH:(this.state=State.COMMENT,this._stateComment(cp))}_stateCommentLessThanSignBangDash(cp){cp===CODE_POINTS.HYPHEN_MINUS?this.state=State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH:(this.state=State.COMMENT_END_DASH,this._stateCommentEndDash(cp))}_stateCommentLessThanSignBangDashDash(cp){cp!==CODE_POINTS.GREATER_THAN_SIGN&&cp!==CODE_POINTS.EOF&&this._err(ERR.nestedComment),this.state=State.COMMENT_END,this._stateCommentEnd(cp)}_stateCommentEndDash(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{this.state=State.COMMENT_END;break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment),this.emitCurrentComment(token),this._emitEOFToken();break}default:token.data+="-",this.state=State.COMMENT,this._stateComment(cp)}}_stateCommentEnd(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA,this.emitCurrentComment(token);break}case CODE_POINTS.EXCLAMATION_MARK:{this.state=State.COMMENT_END_BANG;break}case CODE_POINTS.HYPHEN_MINUS:{token.data+="-";break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment),this.emitCurrentComment(token),this._emitEOFToken();break}default:token.data+="--",this.state=State.COMMENT,this._stateComment(cp)}}_stateCommentEndBang(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.HYPHEN_MINUS:{token.data+="--!",this.state=State.COMMENT_END_DASH;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.incorrectlyClosedComment),this.state=State.DATA,this.emitCurrentComment(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInComment),this.emitCurrentComment(token),this._emitEOFToken();break}default:token.data+="--!",this.state=State.COMMENT,this._stateComment(cp)}}_stateDoctype(cp){switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_DOCTYPE_NAME;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.BEFORE_DOCTYPE_NAME,this._stateBeforeDoctypeName(cp);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),this._createDoctypeToken(null);let token=this.currentToken;token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.missingWhitespaceBeforeDoctypeName),this.state=State.BEFORE_DOCTYPE_NAME,this._stateBeforeDoctypeName(cp)}}_stateBeforeDoctypeName(cp){if(isAsciiUpper(cp))this._createDoctypeToken(String.fromCharCode(toAsciiLower(cp))),this.state=State.DOCTYPE_NAME;else switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),this._createDoctypeToken(REPLACEMENT_CHARACTER),this.state=State.DOCTYPE_NAME;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypeName),this._createDoctypeToken(null);let token=this.currentToken;token.forceQuirks=!0,this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),this._createDoctypeToken(null);let token=this.currentToken;token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._createDoctypeToken(String.fromCodePoint(cp)),this.state=State.DOCTYPE_NAME}}_stateDoctypeName(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.AFTER_DOCTYPE_NAME;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA,this.emitCurrentDoctype(token);break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.name+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:token.name+=String.fromCodePoint(isAsciiUpper(cp)?toAsciiLower(cp):cp)}}_stateAfterDoctypeName(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA,this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._consumeSequenceIfMatch(SEQUENCES.PUBLIC,!1)?this.state=State.AFTER_DOCTYPE_PUBLIC_KEYWORD:this._consumeSequenceIfMatch(SEQUENCES.SYSTEM,!1)?this.state=State.AFTER_DOCTYPE_SYSTEM_KEYWORD:this._ensureHibernation()||(this._err(ERR.invalidCharacterSequenceAfterDoctypeName),token.forceQuirks=!0,this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp))}}_stateAfterDoctypePublicKeyword(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER;break}case CODE_POINTS.QUOTATION_MARK:{this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword),token.publicId="",this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword),token.publicId="",this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypePublicIdentifier),token.forceQuirks=!0,this.state=State.DATA,this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier),token.forceQuirks=!0,this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp)}}_stateBeforeDoctypePublicIdentifier(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.QUOTATION_MARK:{token.publicId="",this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{token.publicId="",this.state=State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypePublicIdentifier),token.forceQuirks=!0,this.state=State.DATA,this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier),token.forceQuirks=!0,this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp)}}_stateDoctypePublicIdentifierDoubleQuoted(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.QUOTATION_MARK:{this.state=State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.publicId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypePublicIdentifier),token.forceQuirks=!0,this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:token.publicId+=String.fromCodePoint(cp)}}_stateDoctypePublicIdentifierSingleQuoted(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.APOSTROPHE:{this.state=State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.publicId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypePublicIdentifier),token.forceQuirks=!0,this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:token.publicId+=String.fromCodePoint(cp)}}_stateAfterDoctypePublicIdentifier(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS;break}case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA,this.emitCurrentDoctype(token);break}case CODE_POINTS.QUOTATION_MARK:{this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier),token.forceQuirks=!0,this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp)}}_stateBetweenDoctypePublicAndSystemIdentifiers(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.GREATER_THAN_SIGN:{this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.QUOTATION_MARK:{token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier),token.forceQuirks=!0,this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp)}}_stateAfterDoctypeSystemKeyword(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:{this.state=State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER;break}case CODE_POINTS.QUOTATION_MARK:{this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword),token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword),token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypeSystemIdentifier),token.forceQuirks=!0,this.state=State.DATA,this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier),token.forceQuirks=!0,this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp)}}_stateBeforeDoctypeSystemIdentifier(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.QUOTATION_MARK:{token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case CODE_POINTS.APOSTROPHE:{token.systemId="",this.state=State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.missingDoctypeSystemIdentifier),token.forceQuirks=!0,this.state=State.DATA,this.emitCurrentDoctype(token);break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier),token.forceQuirks=!0,this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp)}}_stateDoctypeSystemIdentifierDoubleQuoted(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.QUOTATION_MARK:{this.state=State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.systemId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypeSystemIdentifier),token.forceQuirks=!0,this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:token.systemId+=String.fromCodePoint(cp)}}_stateDoctypeSystemIdentifierSingleQuoted(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.APOSTROPHE:{this.state=State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter),token.systemId+=REPLACEMENT_CHARACTER;break}case CODE_POINTS.GREATER_THAN_SIGN:{this._err(ERR.abruptDoctypeSystemIdentifier),token.forceQuirks=!0,this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:token.systemId+=String.fromCodePoint(cp)}}_stateAfterDoctypeSystemIdentifier(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.SPACE:case CODE_POINTS.LINE_FEED:case CODE_POINTS.TABULATION:case CODE_POINTS.FORM_FEED:break;case CODE_POINTS.GREATER_THAN_SIGN:{this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.EOF:{this._err(ERR.eofInDoctype),token.forceQuirks=!0,this.emitCurrentDoctype(token),this._emitEOFToken();break}default:this._err(ERR.unexpectedCharacterAfterDoctypeSystemIdentifier),this.state=State.BOGUS_DOCTYPE,this._stateBogusDoctype(cp)}}_stateBogusDoctype(cp){let token=this.currentToken;switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.emitCurrentDoctype(token),this.state=State.DATA;break}case CODE_POINTS.NULL:{this._err(ERR.unexpectedNullCharacter);break}case CODE_POINTS.EOF:{this.emitCurrentDoctype(token),this._emitEOFToken();break}default:}}_stateCdataSection(cp){switch(cp){case CODE_POINTS.RIGHT_SQUARE_BRACKET:{this.state=State.CDATA_SECTION_BRACKET;break}case CODE_POINTS.EOF:{this._err(ERR.eofInCdata),this._emitEOFToken();break}default:this._emitCodePoint(cp)}}_stateCdataSectionBracket(cp){cp===CODE_POINTS.RIGHT_SQUARE_BRACKET?this.state=State.CDATA_SECTION_END:(this._emitChars("]"),this.state=State.CDATA_SECTION,this._stateCdataSection(cp))}_stateCdataSectionEnd(cp){switch(cp){case CODE_POINTS.GREATER_THAN_SIGN:{this.state=State.DATA;break}case CODE_POINTS.RIGHT_SQUARE_BRACKET:{this._emitChars("]");break}default:this._emitChars("]]"),this.state=State.CDATA_SECTION,this._stateCdataSection(cp)}}_stateCharacterReference(){let length=this.entityDecoder.write(this.preprocessor.html,this.preprocessor.pos);if(length<0)if(this.preprocessor.lastChunkWritten)length=this.entityDecoder.end();else{this.active=!1,this.preprocessor.pos=this.preprocessor.html.length-1,this.consumedAfterSnapshot=0,this.preprocessor.endOfChunkHit=!0;return}length===0?(this.preprocessor.pos=this.entityStartPos,this._flushCodePointConsumedAsCharacterReference(CODE_POINTS.AMPERSAND),this.state=!this._isCharacterReferenceInAttribute()&&isAsciiAlphaNumeric2(this.preprocessor.peek(1))?State.AMBIGUOUS_AMPERSAND:this.returnState):this.state=this.returnState}_stateAmbiguousAmpersand(cp){isAsciiAlphaNumeric2(cp)?this._flushCodePointConsumedAsCharacterReference(cp):(cp===CODE_POINTS.SEMICOLON&&this._err(ERR.unknownNamedCharacterReference),this.state=this.returnState,this._callState(cp))}};var IMPLICIT_END_TAG_REQUIRED=new Set([TAG_ID.DD,TAG_ID.DT,TAG_ID.LI,TAG_ID.OPTGROUP,TAG_ID.OPTION,TAG_ID.P,TAG_ID.RB,TAG_ID.RP,TAG_ID.RT,TAG_ID.RTC]),IMPLICIT_END_TAG_REQUIRED_THOROUGHLY=new Set([...IMPLICIT_END_TAG_REQUIRED,TAG_ID.CAPTION,TAG_ID.COLGROUP,TAG_ID.TBODY,TAG_ID.TD,TAG_ID.TFOOT,TAG_ID.TH,TAG_ID.THEAD,TAG_ID.TR]),SCOPING_ELEMENTS_HTML=new Set([TAG_ID.APPLET,TAG_ID.CAPTION,TAG_ID.HTML,TAG_ID.MARQUEE,TAG_ID.OBJECT,TAG_ID.TABLE,TAG_ID.TD,TAG_ID.TEMPLATE,TAG_ID.TH]),SCOPING_ELEMENTS_HTML_LIST=new Set([...SCOPING_ELEMENTS_HTML,TAG_ID.OL,TAG_ID.UL]),SCOPING_ELEMENTS_HTML_BUTTON=new Set([...SCOPING_ELEMENTS_HTML,TAG_ID.BUTTON]),SCOPING_ELEMENTS_MATHML=new Set([TAG_ID.ANNOTATION_XML,TAG_ID.MI,TAG_ID.MN,TAG_ID.MO,TAG_ID.MS,TAG_ID.MTEXT]),SCOPING_ELEMENTS_SVG=new Set([TAG_ID.DESC,TAG_ID.FOREIGN_OBJECT,TAG_ID.TITLE]),TABLE_ROW_CONTEXT=new Set([TAG_ID.TR,TAG_ID.TEMPLATE,TAG_ID.HTML]),TABLE_BODY_CONTEXT=new Set([TAG_ID.TBODY,TAG_ID.TFOOT,TAG_ID.THEAD,TAG_ID.TEMPLATE,TAG_ID.HTML]),TABLE_CONTEXT=new Set([TAG_ID.TABLE,TAG_ID.TEMPLATE,TAG_ID.HTML]),TABLE_CELLS=new Set([TAG_ID.TD,TAG_ID.TH]),OpenElementStack=class{get currentTmplContentOrNode(){return this._isInTemplate()?this.treeAdapter.getTemplateContent(this.current):this.current}constructor(document,treeAdapter,handler){this.treeAdapter=treeAdapter,this.handler=handler,this.items=[],this.tagIDs=[],this.stackTop=-1,this.tmplCount=0,this.currentTagId=TAG_ID.UNKNOWN,this.current=document}_indexOf(element){return this.items.lastIndexOf(element,this.stackTop)}_isInTemplate(){return this.currentTagId===TAG_ID.TEMPLATE&&this.treeAdapter.getNamespaceURI(this.current)===NS.HTML}_updateCurrentElement(){this.current=this.items[this.stackTop],this.currentTagId=this.tagIDs[this.stackTop]}push(element,tagID){this.stackTop++,this.items[this.stackTop]=element,this.current=element,this.tagIDs[this.stackTop]=tagID,this.currentTagId=tagID,this._isInTemplate()&&this.tmplCount++,this.handler.onItemPush(element,tagID,!0)}pop(){let popped=this.current;this.tmplCount>0&&this._isInTemplate()&&this.tmplCount--,this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(popped,!0)}replace(oldElement,newElement){let idx=this._indexOf(oldElement);this.items[idx]=newElement,idx===this.stackTop&&(this.current=newElement)}insertAfter(referenceElement,newElement,newElementID){let insertionIdx=this._indexOf(referenceElement)+1;this.items.splice(insertionIdx,0,newElement),this.tagIDs.splice(insertionIdx,0,newElementID),this.stackTop++,insertionIdx===this.stackTop&&this._updateCurrentElement(),this.current&&this.currentTagId!==void 0&&this.handler.onItemPush(this.current,this.currentTagId,insertionIdx===this.stackTop)}popUntilTagNamePopped(tagName){let targetIdx=this.stackTop+1;do targetIdx=this.tagIDs.lastIndexOf(tagName,targetIdx-1);while(targetIdx>0&&this.treeAdapter.getNamespaceURI(this.items[targetIdx])!==NS.HTML);this.shortenToLength(Math.max(targetIdx,0))}shortenToLength(idx){for(;this.stackTop>=idx;){let popped=this.current;this.tmplCount>0&&this._isInTemplate()&&(this.tmplCount-=1),this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(popped,this.stackTop<idx)}}popUntilElementPopped(element){let idx=this._indexOf(element);this.shortenToLength(Math.max(idx,0))}popUntilPopped(tagNames,targetNS){let idx=this._indexOfTagNames(tagNames,targetNS);this.shortenToLength(Math.max(idx,0))}popUntilNumberedHeaderPopped(){this.popUntilPopped(NUMBERED_HEADERS,NS.HTML)}popUntilTableCellPopped(){this.popUntilPopped(TABLE_CELLS,NS.HTML)}popAllUpToHtmlElement(){this.tmplCount=0,this.shortenToLength(1)}_indexOfTagNames(tagNames,namespace){for(let i=this.stackTop;i>=0;i--)if(tagNames.has(this.tagIDs[i])&&this.treeAdapter.getNamespaceURI(this.items[i])===namespace)return i;return-1}clearBackTo(tagNames,targetNS){let idx=this._indexOfTagNames(tagNames,targetNS);this.shortenToLength(idx+1)}clearBackToTableContext(){this.clearBackTo(TABLE_CONTEXT,NS.HTML)}clearBackToTableBodyContext(){this.clearBackTo(TABLE_BODY_CONTEXT,NS.HTML)}clearBackToTableRowContext(){this.clearBackTo(TABLE_ROW_CONTEXT,NS.HTML)}remove(element){let idx=this._indexOf(element);idx>=0&&(idx===this.stackTop?this.pop():(this.items.splice(idx,1),this.tagIDs.splice(idx,1),this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(element,!1)))}tryPeekProperlyNestedBodyElement(){return this.stackTop>=1&&this.tagIDs[1]===TAG_ID.BODY?this.items[1]:null}contains(element){return this._indexOf(element)>-1}getCommonAncestor(element){let elementIdx=this._indexOf(element)-1;return elementIdx>=0?this.items[elementIdx]:null}isRootHtmlElementCurrent(){return this.stackTop===0&&this.tagIDs[0]===TAG_ID.HTML}hasInDynamicScope(tagName,htmlScope){for(let i=this.stackTop;i>=0;i--){let tn=this.tagIDs[i];switch(this.treeAdapter.getNamespaceURI(this.items[i])){case NS.HTML:{if(tn===tagName)return!0;if(htmlScope.has(tn))return!1;break}case NS.SVG:{if(SCOPING_ELEMENTS_SVG.has(tn))return!1;break}case NS.MATHML:{if(SCOPING_ELEMENTS_MATHML.has(tn))return!1;break}}}return!0}hasInScope(tagName){return this.hasInDynamicScope(tagName,SCOPING_ELEMENTS_HTML)}hasInListItemScope(tagName){return this.hasInDynamicScope(tagName,SCOPING_ELEMENTS_HTML_LIST)}hasInButtonScope(tagName){return this.hasInDynamicScope(tagName,SCOPING_ELEMENTS_HTML_BUTTON)}hasNumberedHeaderInScope(){for(let i=this.stackTop;i>=0;i--){let tn=this.tagIDs[i];switch(this.treeAdapter.getNamespaceURI(this.items[i])){case NS.HTML:{if(NUMBERED_HEADERS.has(tn))return!0;if(SCOPING_ELEMENTS_HTML.has(tn))return!1;break}case NS.SVG:{if(SCOPING_ELEMENTS_SVG.has(tn))return!1;break}case NS.MATHML:{if(SCOPING_ELEMENTS_MATHML.has(tn))return!1;break}}}return!0}hasInTableScope(tagName){for(let i=this.stackTop;i>=0;i--)if(this.treeAdapter.getNamespaceURI(this.items[i])===NS.HTML)switch(this.tagIDs[i]){case tagName:return!0;case TAG_ID.TABLE:case TAG_ID.HTML:return!1}return!0}hasTableBodyContextInTableScope(){for(let i=this.stackTop;i>=0;i--)if(this.treeAdapter.getNamespaceURI(this.items[i])===NS.HTML)switch(this.tagIDs[i]){case TAG_ID.TBODY:case TAG_ID.THEAD:case TAG_ID.TFOOT:return!0;case TAG_ID.TABLE:case TAG_ID.HTML:return!1}return!0}hasInSelectScope(tagName){for(let i=this.stackTop;i>=0;i--)if(this.treeAdapter.getNamespaceURI(this.items[i])===NS.HTML)switch(this.tagIDs[i]){case tagName:return!0;case TAG_ID.OPTION:case TAG_ID.OPTGROUP:break;default:return!1}return!0}generateImpliedEndTags(){for(;this.currentTagId!==void 0&&IMPLICIT_END_TAG_REQUIRED.has(this.currentTagId);)this.pop()}generateImpliedEndTagsThoroughly(){for(;this.currentTagId!==void 0&&IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId);)this.pop()}generateImpliedEndTagsWithExclusion(exclusionId){for(;this.currentTagId!==void 0&&this.currentTagId!==exclusionId&&IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId);)this.pop()}};var EntryType;(function(EntryType2){EntryType2[EntryType2.Marker=0]="Marker",EntryType2[EntryType2.Element=1]="Element"})(EntryType||(EntryType={}));var MARKER={type:EntryType.Marker},FormattingElementList=class{constructor(treeAdapter){this.treeAdapter=treeAdapter,this.entries=[],this.bookmark=null}_getNoahArkConditionCandidates(newElement,neAttrs){let candidates=[],neAttrsLength=neAttrs.length,neTagName=this.treeAdapter.getTagName(newElement),neNamespaceURI=this.treeAdapter.getNamespaceURI(newElement);for(let i=0;i<this.entries.length;i++){let entry=this.entries[i];if(entry.type===EntryType.Marker)break;let{element}=entry;if(this.treeAdapter.getTagName(element)===neTagName&&this.treeAdapter.getNamespaceURI(element)===neNamespaceURI){let elementAttrs=this.treeAdapter.getAttrList(element);elementAttrs.length===neAttrsLength&&candidates.push({idx:i,attrs:elementAttrs})}}return candidates}_ensureNoahArkCondition(newElement){if(this.entries.length<3)return;let neAttrs=this.treeAdapter.getAttrList(newElement),candidates=this._getNoahArkConditionCandidates(newElement,neAttrs);if(candidates.length<3)return;let neAttrsMap=new Map(neAttrs.map(neAttr=>[neAttr.name,neAttr.value])),validCandidates=0;for(let i=0;i<candidates.length;i++){let candidate=candidates[i];candidate.attrs.every(cAttr=>neAttrsMap.get(cAttr.name)===cAttr.value)&&(validCandidates+=1,validCandidates>=3&&this.entries.splice(candidate.idx,1))}}insertMarker(){this.entries.unshift(MARKER)}pushElement(element,token){this._ensureNoahArkCondition(element),this.entries.unshift({type:EntryType.Element,element,token})}insertElementAfterBookmark(element,token){let bookmarkIdx=this.entries.indexOf(this.bookmark);this.entries.splice(bookmarkIdx,0,{type:EntryType.Element,element,token})}removeEntry(entry){let entryIndex=this.entries.indexOf(entry);entryIndex!==-1&&this.entries.splice(entryIndex,1)}clearToLastMarker(){let markerIdx=this.entries.indexOf(MARKER);markerIdx===-1?this.entries.length=0:this.entries.splice(0,markerIdx+1)}getElementEntryInScopeWithTagName(tagName){let entry=this.entries.find(entry2=>entry2.type===EntryType.Marker||this.treeAdapter.getTagName(entry2.element)===tagName);return entry&&entry.type===EntryType.Element?entry:null}getElementEntry(element){return this.entries.find(entry=>entry.type===EntryType.Element&&entry.element===element)}};var defaultTreeAdapter={createDocument(){return{nodeName:"#document",mode:DOCUMENT_MODE.NO_QUIRKS,childNodes:[]}},createDocumentFragment(){return{nodeName:"#document-fragment",childNodes:[]}},createElement(tagName,namespaceURI,attrs){return{nodeName:tagName,tagName,attrs,namespaceURI,childNodes:[],parentNode:null}},createCommentNode(data){return{nodeName:"#comment",data,parentNode:null}},createTextNode(value){return{nodeName:"#text",value,parentNode:null}},appendChild(parentNode,newNode){parentNode.childNodes.push(newNode),newNode.parentNode=parentNode},insertBefore(parentNode,newNode,referenceNode){let insertionIdx=parentNode.childNodes.indexOf(referenceNode);parentNode.childNodes.splice(insertionIdx,0,newNode),newNode.parentNode=parentNode},setTemplateContent(templateElement,contentElement){templateElement.content=contentElement},getTemplateContent(templateElement){return templateElement.content},setDocumentType(document,name,publicId,systemId){let doctypeNode=document.childNodes.find(node=>node.nodeName==="#documentType");if(doctypeNode)doctypeNode.name=name,doctypeNode.publicId=publicId,doctypeNode.systemId=systemId;else{let node={nodeName:"#documentType",name,publicId,systemId,parentNode:null};defaultTreeAdapter.appendChild(document,node)}},setDocumentMode(document,mode){document.mode=mode},getDocumentMode(document){return document.mode},detachNode(node){if(node.parentNode){let idx=node.parentNode.childNodes.indexOf(node);node.parentNode.childNodes.splice(idx,1),node.parentNode=null}},insertText(parentNode,text){if(parentNode.childNodes.length>0){let prevNode=parentNode.childNodes[parentNode.childNodes.length-1];if(defaultTreeAdapter.isTextNode(prevNode)){prevNode.value+=text;return}}defaultTreeAdapter.appendChild(parentNode,defaultTreeAdapter.createTextNode(text))},insertTextBefore(parentNode,text,referenceNode){let prevNode=parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode)-1];prevNode&&defaultTreeAdapter.isTextNode(prevNode)?prevNode.value+=text:defaultTreeAdapter.insertBefore(parentNode,defaultTreeAdapter.createTextNode(text),referenceNode)},adoptAttributes(recipient,attrs){let recipientAttrsMap=new Set(recipient.attrs.map(attr=>attr.name));for(let j=0;j<attrs.length;j++)recipientAttrsMap.has(attrs[j].name)||recipient.attrs.push(attrs[j])},getFirstChild(node){return node.childNodes[0]},getChildNodes(node){return node.childNodes},getParentNode(node){return node.parentNode},getAttrList(element){return element.attrs},getTagName(element){return element.tagName},getNamespaceURI(element){return element.namespaceURI},getTextNodeContent(textNode){return textNode.value},getCommentNodeContent(commentNode){return commentNode.data},getDocumentTypeNodeName(doctypeNode){return doctypeNode.name},getDocumentTypeNodePublicId(doctypeNode){return doctypeNode.publicId},getDocumentTypeNodeSystemId(doctypeNode){return doctypeNode.systemId},isTextNode(node){return node.nodeName==="#text"},isCommentNode(node){return node.nodeName==="#comment"},isDocumentTypeNode(node){return node.nodeName==="#documentType"},isElementNode(node){return Object.prototype.hasOwnProperty.call(node,"tagName")},setNodeSourceCodeLocation(node,location){node.sourceCodeLocation=location},getNodeSourceCodeLocation(node){return node.sourceCodeLocation},updateNodeSourceCodeLocation(node,endLocation){node.sourceCodeLocation={...node.sourceCodeLocation,...endLocation}}};var VALID_DOCTYPE_NAME="html",VALID_SYSTEM_ID="about:legacy-compat",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//","-//as//dtd html 3.0 aswedit + extensions//","-//advasoft ltd//dtd html 3.0 aswedit + extensions//","-//ietf//dtd html 2.0 level 1//","-//ietf//dtd html 2.0 level 2//","-//ietf//dtd html 2.0 strict level 1//","-//ietf//dtd html 2.0 strict level 2//","-//ietf//dtd html 2.0 strict//","-//ietf//dtd html 2.0//","-//ietf//dtd html 2.1e//","-//ietf//dtd html 3.0//","-//ietf//dtd html 3.2 final//","-//ietf//dtd html 3.2//","-//ietf//dtd html 3//","-//ietf//dtd html level 0//","-//ietf//dtd html level 1//","-//ietf//dtd html level 2//","-//ietf//dtd html level 3//","-//ietf//dtd html strict level 0//","-//ietf//dtd html strict level 1//","-//ietf//dtd html strict level 2//","-//ietf//dtd html strict level 3//","-//ietf//dtd html strict//","-//ietf//dtd html//","-//metrius//dtd metrius presentational//","-//microsoft//dtd internet explorer 2.0 html strict//","-//microsoft//dtd internet explorer 2.0 html//","-//microsoft//dtd internet explorer 2.0 tables//","-//microsoft//dtd internet explorer 3.0 html strict//","-//microsoft//dtd internet explorer 3.0 html//","-//microsoft//dtd internet explorer 3.0 tables//","-//netscape comm. corp.//dtd html//","-//netscape comm. corp.//dtd strict html//","-//o'reilly and associates//dtd html 2.0//","-//o'reilly and associates//dtd html extended 1.0//","-//o'reilly and associates//dtd html extended relaxed 1.0//","-//sq//dtd html 2.0 hotmetal + extensions//","-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//","-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//","-//spyglass//dtd html 2.0 extended//","-//sun microsystems corp.//dtd hotjava html//","-//sun microsystems corp.//dtd hotjava strict html//","-//w3c//dtd html 3 1995-03-24//","-//w3c//dtd html 3.2 draft//","-//w3c//dtd html 3.2 final//","-//w3c//dtd html 3.2//","-//w3c//dtd html 3.2s draft//","-//w3c//dtd html 4.0 frameset//","-//w3c//dtd html 4.0 transitional//","-//w3c//dtd html experimental 19960712//","-//w3c//dtd html experimental 970421//","-//w3c//dtd w3 html//","-//w3o//dtd w3 html 3.0//","-//webtechs//dtd mozilla html 2.0//","-//webtechs//dtd mozilla html//"],QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES=[...QUIRKS_MODE_PUBLIC_ID_PREFIXES,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"],QUIRKS_MODE_PUBLIC_IDS=new Set(["-//w3o//dtd w3 html strict 3.0//en//","-/w3c/dtd html 4.0 transitional/en","html"]),LIMITED_QUIRKS_PUBLIC_ID_PREFIXES=["-//w3c//dtd xhtml 1.0 frameset//","-//w3c//dtd xhtml 1.0 transitional//"],LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES=[...LIMITED_QUIRKS_PUBLIC_ID_PREFIXES,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"];function hasPrefix(publicId,prefixes){return prefixes.some(prefix=>publicId.startsWith(prefix))}function isConforming(token){return token.name===VALID_DOCTYPE_NAME&&token.publicId===null&&(token.systemId===null||token.systemId===VALID_SYSTEM_ID)}function getDocumentMode(token){if(token.name!==VALID_DOCTYPE_NAME)return DOCUMENT_MODE.QUIRKS;let{systemId}=token;if(systemId&&systemId.toLowerCase()===QUIRKS_MODE_SYSTEM_ID)return DOCUMENT_MODE.QUIRKS;let{publicId}=token;if(publicId!==null){if(publicId=publicId.toLowerCase(),QUIRKS_MODE_PUBLIC_IDS.has(publicId))return DOCUMENT_MODE.QUIRKS;let prefixes=systemId===null?QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES:QUIRKS_MODE_PUBLIC_ID_PREFIXES;if(hasPrefix(publicId,prefixes))return DOCUMENT_MODE.QUIRKS;if(prefixes=systemId===null?LIMITED_QUIRKS_PUBLIC_ID_PREFIXES:LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES,hasPrefix(publicId,prefixes))return DOCUMENT_MODE.LIMITED_QUIRKS}return DOCUMENT_MODE.NO_QUIRKS}var MIME_TYPES={TEXT_HTML:"text/html",APPLICATION_XML:"application/xhtml+xml"},DEFINITION_URL_ATTR="definitionurl",ADJUSTED_DEFINITION_URL_ATTR="definitionURL",SVG_ATTRS_ADJUSTMENT_MAP=new Map(["attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","diffuseConstant","edgeMode","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"].map(attr=>[attr.toLowerCase(),attr])),XML_ATTRS_ADJUSTMENT_MAP=new 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: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=new Map(["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"].map(tn=>[tn.toLowerCase(),tn])),EXITS_FOREIGN_CONTENT=new Set([TAG_ID.B,TAG_ID.BIG,TAG_ID.BLOCKQUOTE,TAG_ID.BODY,TAG_ID.BR,TAG_ID.CENTER,TAG_ID.CODE,TAG_ID.DD,TAG_ID.DIV,TAG_ID.DL,TAG_ID.DT,TAG_ID.EM,TAG_ID.EMBED,TAG_ID.H1,TAG_ID.H2,TAG_ID.H3,TAG_ID.H4,TAG_ID.H5,TAG_ID.H6,TAG_ID.HEAD,TAG_ID.HR,TAG_ID.I,TAG_ID.IMG,TAG_ID.LI,TAG_ID.LISTING,TAG_ID.MENU,TAG_ID.META,TAG_ID.NOBR,TAG_ID.OL,TAG_ID.P,TAG_ID.PRE,TAG_ID.RUBY,TAG_ID.S,TAG_ID.SMALL,TAG_ID.SPAN,TAG_ID.STRONG,TAG_ID.STRIKE,TAG_ID.SUB,TAG_ID.SUP,TAG_ID.TABLE,TAG_ID.TT,TAG_ID.U,TAG_ID.UL,TAG_ID.VAR]);function causesExit(startTagToken){let tn=startTagToken.tagID;return tn===TAG_ID.FONT&&startTagToken.attrs.some(({name})=>name===ATTRS.COLOR||name===ATTRS.SIZE||name===ATTRS.FACE)||EXITS_FOREIGN_CONTENT.has(tn)}function adjustTokenMathMLAttrs(token){for(let i=0;i<token.attrs.length;i++)if(token.attrs[i].name===DEFINITION_URL_ATTR){token.attrs[i].name=ADJUSTED_DEFINITION_URL_ATTR;break}}function adjustTokenSVGAttrs(token){for(let i=0;i<token.attrs.length;i++){let adjustedAttrName=SVG_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);adjustedAttrName!=null&&(token.attrs[i].name=adjustedAttrName)}}function adjustTokenXMLAttrs(token){for(let i=0;i<token.attrs.length;i++){let adjustedAttrEntry=XML_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);adjustedAttrEntry&&(token.attrs[i].prefix=adjustedAttrEntry.prefix,token.attrs[i].name=adjustedAttrEntry.name,token.attrs[i].namespace=adjustedAttrEntry.namespace)}}function adjustTokenSVGTagName(token){let adjustedTagName=SVG_TAG_NAMES_ADJUSTMENT_MAP.get(token.tagName);adjustedTagName!=null&&(token.tagName=adjustedTagName,token.tagID=getTagID(token.tagName))}function isMathMLTextIntegrationPoint(tn,ns){return ns===NS.MATHML&&(tn===TAG_ID.MI||tn===TAG_ID.MO||tn===TAG_ID.MN||tn===TAG_ID.MS||tn===TAG_ID.MTEXT)}function isHtmlIntegrationPoint(tn,ns,attrs){if(ns===NS.MATHML&&tn===TAG_ID.ANNOTATION_XML){for(let i=0;i<attrs.length;i++)if(attrs[i].name===ATTRS.ENCODING){let value=attrs[i].value.toLowerCase();return value===MIME_TYPES.TEXT_HTML||value===MIME_TYPES.APPLICATION_XML}}return ns===NS.SVG&&(tn===TAG_ID.FOREIGN_OBJECT||tn===TAG_ID.DESC||tn===TAG_ID.TITLE)}function isIntegrationPoint(tn,ns,attrs,foreignNS){return(!foreignNS||foreignNS===NS.HTML)&&isHtmlIntegrationPoint(tn,ns,attrs)||(!foreignNS||foreignNS===NS.MATHML)&&isMathMLTextIntegrationPoint(tn,ns)}var HIDDEN_INPUT_TYPE="hidden",AA_OUTER_LOOP_ITER=8,AA_INNER_LOOP_ITER=3,InsertionMode;(function(InsertionMode2){InsertionMode2[InsertionMode2.INITIAL=0]="INITIAL",InsertionMode2[InsertionMode2.BEFORE_HTML=1]="BEFORE_HTML",InsertionMode2[InsertionMode2.BEFORE_HEAD=2]="BEFORE_HEAD",InsertionMode2[InsertionMode2.IN_HEAD=3]="IN_HEAD",InsertionMode2[InsertionMode2.IN_HEAD_NO_SCRIPT=4]="IN_HEAD_NO_SCRIPT",InsertionMode2[InsertionMode2.AFTER_HEAD=5]="AFTER_HEAD",InsertionMode2[InsertionMode2.IN_BODY=6]="IN_BODY",InsertionMode2[InsertionMode2.TEXT=7]="TEXT",InsertionMode2[InsertionMode2.IN_TABLE=8]="IN_TABLE",InsertionMode2[InsertionMode2.IN_TABLE_TEXT=9]="IN_TABLE_TEXT",InsertionMode2[InsertionMode2.IN_CAPTION=10]="IN_CAPTION",InsertionMode2[InsertionMode2.IN_COLUMN_GROUP=11]="IN_COLUMN_GROUP",InsertionMode2[InsertionMode2.IN_TABLE_BODY=12]="IN_TABLE_BODY",InsertionMode2[InsertionMode2.IN_ROW=13]="IN_ROW",InsertionMode2[InsertionMode2.IN_CELL=14]="IN_CELL",InsertionMode2[InsertionMode2.IN_SELECT=15]="IN_SELECT",InsertionMode2[InsertionMode2.IN_SELECT_IN_TABLE=16]="IN_SELECT_IN_TABLE",InsertionMode2[InsertionMode2.IN_TEMPLATE=17]="IN_TEMPLATE",InsertionMode2[InsertionMode2.AFTER_BODY=18]="AFTER_BODY",InsertionMode2[InsertionMode2.IN_FRAMESET=19]="IN_FRAMESET",InsertionMode2[InsertionMode2.AFTER_FRAMESET=20]="AFTER_FRAMESET",InsertionMode2[InsertionMode2.AFTER_AFTER_BODY=21]="AFTER_AFTER_BODY",InsertionMode2[InsertionMode2.AFTER_AFTER_FRAMESET=22]="AFTER_AFTER_FRAMESET"})(InsertionMode||(InsertionMode={}));var BASE_LOC={startLine:-1,startCol:-1,startOffset:-1,endLine:-1,endCol:-1,endOffset:-1},TABLE_STRUCTURE_TAGS=new Set([TAG_ID.TABLE,TAG_ID.TBODY,TAG_ID.TFOOT,TAG_ID.THEAD,TAG_ID.TR]),defaultParserOptions={scriptingEnabled:!0,sourceCodeLocationInfo:!1,treeAdapter:defaultTreeAdapter,onParseError:null},Parser=class{constructor(options,document,fragmentContext=null,scriptHandler=null){this.fragmentContext=fragmentContext,this.scriptHandler=scriptHandler,this.currentToken=null,this.stopped=!1,this.insertionMode=InsertionMode.INITIAL,this.originalInsertionMode=InsertionMode.INITIAL,this.headElement=null,this.formElement=null,this.currentNotInHTML=!1,this.tmplInsertionModeStack=[],this.pendingCharacterTokens=[],this.hasNonWhitespacePendingCharacterToken=!1,this.framesetOk=!0,this.skipNextNewLine=!1,this.fosterParentingEnabled=!1,this.options={...defaultParserOptions,...options},this.treeAdapter=this.options.treeAdapter,this.onParseError=this.options.onParseError,this.onParseError&&(this.options.sourceCodeLocationInfo=!0),this.document=document??this.treeAdapter.createDocument(),this.tokenizer=new Tokenizer(this.options,this),this.activeFormattingElements=new FormattingElementList(this.treeAdapter),this.fragmentContextID=fragmentContext?getTagID(this.treeAdapter.getTagName(fragmentContext)):TAG_ID.UNKNOWN,this._setContextModes(fragmentContext??this.document,this.fragmentContextID),this.openElements=new OpenElementStack(this.document,this.treeAdapter,this)}static parse(html,options){let parser2=new this(options);return parser2.tokenizer.write(html,!0),parser2.document}static getFragmentParser(fragmentContext,options){let opts={...defaultParserOptions,...options};fragmentContext??(fragmentContext=opts.treeAdapter.createElement(TAG_NAMES.TEMPLATE,NS.HTML,[]));let documentMock=opts.treeAdapter.createElement("documentmock",NS.HTML,[]),parser2=new this(opts,documentMock,fragmentContext);return parser2.fragmentContextID===TAG_ID.TEMPLATE&&parser2.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE),parser2._initTokenizerForFragmentParsing(),parser2._insertFakeRootElement(),parser2._resetInsertionMode(),parser2._findFormInFragmentContext(),parser2}getFragment(){let rootElement=this.treeAdapter.getFirstChild(this.document),fragment=this.treeAdapter.createDocumentFragment();return this._adoptNodes(rootElement,fragment),fragment}_err(token,code,beforeToken){var _a;if(!this.onParseError)return;let loc=(_a=token.location)!==null&&_a!==void 0?_a:BASE_LOC,err={code,startLine:loc.startLine,startCol:loc.startCol,startOffset:loc.startOffset,endLine:beforeToken?loc.startLine:loc.endLine,endCol:beforeToken?loc.startCol:loc.endCol,endOffset:beforeToken?loc.startOffset:loc.endOffset};this.onParseError(err)}onItemPush(node,tid,isTop){var _a,_b;(_b=(_a=this.treeAdapter).onItemPush)===null||_b===void 0||_b.call(_a,node),isTop&&this.openElements.stackTop>0&&this._setContextModes(node,tid)}onItemPop(node,isTop){var _a,_b;if(this.options.sourceCodeLocationInfo&&this._setEndLocation(node,this.currentToken),(_b=(_a=this.treeAdapter).onItemPop)===null||_b===void 0||_b.call(_a,node,this.openElements.current),isTop){let current,currentTagId;this.openElements.stackTop===0&&this.fragmentContext?(current=this.fragmentContext,currentTagId=this.fragmentContextID):{current,currentTagId}=this.openElements,this._setContextModes(current,currentTagId)}}_setContextModes(current,tid){let isHTML=current===this.document||current&&this.treeAdapter.getNamespaceURI(current)===NS.HTML;this.currentNotInHTML=!isHTML,this.tokenizer.inForeignNode=!isHTML&&current!==void 0&&tid!==void 0&&!this._isIntegrationPoint(tid,current)}_switchToTextParsing(currentToken,nextTokenizerState){this._insertElement(currentToken,NS.HTML),this.tokenizer.state=nextTokenizerState,this.originalInsertionMode=this.insertionMode,this.insertionMode=InsertionMode.TEXT}switchToPlaintextParsing(){this.insertionMode=InsertionMode.TEXT,this.originalInsertionMode=InsertionMode.IN_BODY,this.tokenizer.state=TokenizerMode.PLAINTEXT}_getAdjustedCurrentElement(){return this.openElements.stackTop===0&&this.fragmentContext?this.fragmentContext:this.openElements.current}_findFormInFragmentContext(){let node=this.fragmentContext;for(;node;){if(this.treeAdapter.getTagName(node)===TAG_NAMES.FORM){this.formElement=node;break}node=this.treeAdapter.getParentNode(node)}}_initTokenizerForFragmentParsing(){if(!(!this.fragmentContext||this.treeAdapter.getNamespaceURI(this.fragmentContext)!==NS.HTML))switch(this.fragmentContextID){case TAG_ID.TITLE:case TAG_ID.TEXTAREA:{this.tokenizer.state=TokenizerMode.RCDATA;break}case TAG_ID.STYLE:case TAG_ID.XMP:case TAG_ID.IFRAME:case TAG_ID.NOEMBED:case TAG_ID.NOFRAMES:case TAG_ID.NOSCRIPT:{this.tokenizer.state=TokenizerMode.RAWTEXT;break}case TAG_ID.SCRIPT:{this.tokenizer.state=TokenizerMode.SCRIPT_DATA;break}case TAG_ID.PLAINTEXT:{this.tokenizer.state=TokenizerMode.PLAINTEXT;break}default:}}_setDocumentType(token){let name=token.name||"",publicId=token.publicId||"",systemId=token.systemId||"";if(this.treeAdapter.setDocumentType(this.document,name,publicId,systemId),token.location){let docTypeNode=this.treeAdapter.getChildNodes(this.document).find(node=>this.treeAdapter.isDocumentTypeNode(node));docTypeNode&&this.treeAdapter.setNodeSourceCodeLocation(docTypeNode,token.location)}}_attachElementToTree(element,location){if(this.options.sourceCodeLocationInfo){let loc=location&&{...location,startTag:location};this.treeAdapter.setNodeSourceCodeLocation(element,loc)}if(this._shouldFosterParentOnInsertion())this._fosterParentElement(element);else{let parent=this.openElements.currentTmplContentOrNode;this.treeAdapter.appendChild(parent??this.document,element)}}_appendElement(token,namespaceURI){let element=this.treeAdapter.createElement(token.tagName,namespaceURI,token.attrs);this._attachElementToTree(element,token.location)}_insertElement(token,namespaceURI){let element=this.treeAdapter.createElement(token.tagName,namespaceURI,token.attrs);this._attachElementToTree(element,token.location),this.openElements.push(element,token.tagID)}_insertFakeElement(tagName,tagID){let element=this.treeAdapter.createElement(tagName,NS.HTML,[]);this._attachElementToTree(element,null),this.openElements.push(element,tagID)}_insertTemplate(token){let tmpl=this.treeAdapter.createElement(token.tagName,NS.HTML,token.attrs),content=this.treeAdapter.createDocumentFragment();this.treeAdapter.setTemplateContent(tmpl,content),this._attachElementToTree(tmpl,token.location),this.openElements.push(tmpl,token.tagID),this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(content,null)}_insertFakeRootElement(){let element=this.treeAdapter.createElement(TAG_NAMES.HTML,NS.HTML,[]);this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(element,null),this.treeAdapter.appendChild(this.openElements.current,element),this.openElements.push(element,TAG_ID.HTML)}_appendCommentNode(token,parent){let commentNode=this.treeAdapter.createCommentNode(token.data);this.treeAdapter.appendChild(parent,commentNode),this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(commentNode,token.location)}_insertCharacters(token){let parent,beforeElement;if(this._shouldFosterParentOnInsertion()?({parent,beforeElement}=this._findFosterParentingLocation(),beforeElement?this.treeAdapter.insertTextBefore(parent,token.chars,beforeElement):this.treeAdapter.insertText(parent,token.chars)):(parent=this.openElements.currentTmplContentOrNode,this.treeAdapter.insertText(parent,token.chars)),!token.location)return;let siblings=this.treeAdapter.getChildNodes(parent),textNodeIdx=beforeElement?siblings.lastIndexOf(beforeElement):siblings.length,textNode=siblings[textNodeIdx-1];if(this.treeAdapter.getNodeSourceCodeLocation(textNode)){let{endLine,endCol,endOffset}=token.location;this.treeAdapter.updateNodeSourceCodeLocation(textNode,{endLine,endCol,endOffset})}else this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(textNode,token.location)}_adoptNodes(donor,recipient){for(let child=this.treeAdapter.getFirstChild(donor);child;child=this.treeAdapter.getFirstChild(donor))this.treeAdapter.detachNode(child),this.treeAdapter.appendChild(recipient,child)}_setEndLocation(element,closingToken){if(this.treeAdapter.getNodeSourceCodeLocation(element)&&closingToken.location){let ctLoc=closingToken.location,tn=this.treeAdapter.getTagName(element),endLoc=closingToken.type===TokenType.END_TAG&&tn===closingToken.tagName?{endTag:{...ctLoc},endLine:ctLoc.endLine,endCol:ctLoc.endCol,endOffset:ctLoc.endOffset}:{endLine:ctLoc.startLine,endCol:ctLoc.startCol,endOffset:ctLoc.startOffset};this.treeAdapter.updateNodeSourceCodeLocation(element,endLoc)}}shouldProcessStartTagTokenInForeignContent(token){if(!this.currentNotInHTML)return!1;let current,currentTagId;return this.openElements.stackTop===0&&this.fragmentContext?(current=this.fragmentContext,currentTagId=this.fragmentContextID):{current,currentTagId}=this.openElements,token.tagID===TAG_ID.SVG&&this.treeAdapter.getTagName(current)===TAG_NAMES.ANNOTATION_XML&&this.treeAdapter.getNamespaceURI(current)===NS.MATHML?!1:this.tokenizer.inForeignNode||(token.tagID===TAG_ID.MGLYPH||token.tagID===TAG_ID.MALIGNMARK)&&currentTagId!==void 0&&!this._isIntegrationPoint(currentTagId,current,NS.HTML)}_processToken(token){switch(token.type){case TokenType.CHARACTER:{this.onCharacter(token);break}case TokenType.NULL_CHARACTER:{this.onNullCharacter(token);break}case TokenType.COMMENT:{this.onComment(token);break}case TokenType.DOCTYPE:{this.onDoctype(token);break}case TokenType.START_TAG:{this._processStartTag(token);break}case TokenType.END_TAG:{this.onEndTag(token);break}case TokenType.EOF:{this.onEof(token);break}case TokenType.WHITESPACE_CHARACTER:{this.onWhitespaceCharacter(token);break}}}_isIntegrationPoint(tid,element,foreignNS){let ns=this.treeAdapter.getNamespaceURI(element),attrs=this.treeAdapter.getAttrList(element);return isIntegrationPoint(tid,ns,attrs,foreignNS)}_reconstructActiveFormattingElements(){let listLength=this.activeFormattingElements.entries.length;if(listLength){let endIndex=this.activeFormattingElements.entries.findIndex(entry=>entry.type===EntryType.Marker||this.openElements.contains(entry.element)),unopenIdx=endIndex===-1?listLength-1:endIndex-1;for(let i=unopenIdx;i>=0;i--){let entry=this.activeFormattingElements.entries[i];this._insertElement(entry.token,this.treeAdapter.getNamespaceURI(entry.element)),entry.element=this.openElements.current}}}_closeTableCell(){this.openElements.generateImpliedEndTags(),this.openElements.popUntilTableCellPopped(),this.activeFormattingElements.clearToLastMarker(),this.insertionMode=InsertionMode.IN_ROW}_closePElement(){this.openElements.generateImpliedEndTagsWithExclusion(TAG_ID.P),this.openElements.popUntilTagNamePopped(TAG_ID.P)}_resetInsertionMode(){for(let i=this.openElements.stackTop;i>=0;i--)switch(i===0&&this.fragmentContext?this.fragmentContextID:this.openElements.tagIDs[i]){case TAG_ID.TR:{this.insertionMode=InsertionMode.IN_ROW;return}case TAG_ID.TBODY:case TAG_ID.THEAD:case TAG_ID.TFOOT:{this.insertionMode=InsertionMode.IN_TABLE_BODY;return}case TAG_ID.CAPTION:{this.insertionMode=InsertionMode.IN_CAPTION;return}case TAG_ID.COLGROUP:{this.insertionMode=InsertionMode.IN_COLUMN_GROUP;return}case TAG_ID.TABLE:{this.insertionMode=InsertionMode.IN_TABLE;return}case TAG_ID.BODY:{this.insertionMode=InsertionMode.IN_BODY;return}case TAG_ID.FRAMESET:{this.insertionMode=InsertionMode.IN_FRAMESET;return}case TAG_ID.SELECT:{this._resetInsertionModeForSelect(i);return}case TAG_ID.TEMPLATE:{this.insertionMode=this.tmplInsertionModeStack[0];return}case TAG_ID.HTML:{this.insertionMode=this.headElement?InsertionMode.AFTER_HEAD:InsertionMode.BEFORE_HEAD;return}case TAG_ID.TD:case TAG_ID.TH:{if(i>0){this.insertionMode=InsertionMode.IN_CELL;return}break}case TAG_ID.HEAD:{if(i>0){this.insertionMode=InsertionMode.IN_HEAD;return}break}}this.insertionMode=InsertionMode.IN_BODY}_resetInsertionModeForSelect(selectIdx){if(selectIdx>0)for(let i=selectIdx-1;i>0;i--){let tn=this.openElements.tagIDs[i];if(tn===TAG_ID.TEMPLATE)break;if(tn===TAG_ID.TABLE){this.insertionMode=InsertionMode.IN_SELECT_IN_TABLE;return}}this.insertionMode=InsertionMode.IN_SELECT}_isElementCausesFosterParenting(tn){return TABLE_STRUCTURE_TAGS.has(tn)}_shouldFosterParentOnInsertion(){return this.fosterParentingEnabled&&this.openElements.currentTagId!==void 0&&this._isElementCausesFosterParenting(this.openElements.currentTagId)}_findFosterParentingLocation(){for(let i=this.openElements.stackTop;i>=0;i--){let openElement=this.openElements.items[i];switch(this.openElements.tagIDs[i]){case TAG_ID.TEMPLATE:{if(this.treeAdapter.getNamespaceURI(openElement)===NS.HTML)return{parent:this.treeAdapter.getTemplateContent(openElement),beforeElement:null};break}case TAG_ID.TABLE:{let parent=this.treeAdapter.getParentNode(openElement);return parent?{parent,beforeElement:openElement}:{parent:this.openElements.items[i-1],beforeElement:null}}default:}}return{parent:this.openElements.items[0],beforeElement:null}}_fosterParentElement(element){let location=this._findFosterParentingLocation();location.beforeElement?this.treeAdapter.insertBefore(location.parent,element,location.beforeElement):this.treeAdapter.appendChild(location.parent,element)}_isSpecialElement(element,id){let ns=this.treeAdapter.getNamespaceURI(element);return SPECIAL_ELEMENTS[ns].has(id)}onCharacter(token){if(this.skipNextNewLine=!1,this.tokenizer.inForeignNode){characterInForeignContent(this,token);return}switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{tokenBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{tokenBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{tokenInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{tokenInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{tokenAfterHead(this,token);break}case InsertionMode.IN_BODY:case InsertionMode.IN_CAPTION:case InsertionMode.IN_CELL:case InsertionMode.IN_TEMPLATE:{characterInBody(this,token);break}case InsertionMode.TEXT:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:{this._insertCharacters(token);break}case InsertionMode.IN_TABLE:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:{characterInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{characterInTableText(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{tokenInColumnGroup(this,token);break}case InsertionMode.AFTER_BODY:{tokenAfterBody(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{tokenAfterAfterBody(this,token);break}default:}}onNullCharacter(token){if(this.skipNextNewLine=!1,this.tokenizer.inForeignNode){nullCharacterInForeignContent(this,token);return}switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{tokenBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{tokenBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{tokenInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{tokenInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{tokenAfterHead(this,token);break}case InsertionMode.TEXT:{this._insertCharacters(token);break}case InsertionMode.IN_TABLE:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:{characterInTable(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{tokenInColumnGroup(this,token);break}case InsertionMode.AFTER_BODY:{tokenAfterBody(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{tokenAfterAfterBody(this,token);break}default:}}onComment(token){if(this.skipNextNewLine=!1,this.currentNotInHTML){appendComment(this,token);return}switch(this.insertionMode){case InsertionMode.INITIAL:case InsertionMode.BEFORE_HTML:case InsertionMode.BEFORE_HEAD:case InsertionMode.IN_HEAD:case InsertionMode.IN_HEAD_NO_SCRIPT:case InsertionMode.AFTER_HEAD:case InsertionMode.IN_BODY:case InsertionMode.IN_TABLE:case InsertionMode.IN_CAPTION:case InsertionMode.IN_COLUMN_GROUP:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:case InsertionMode.IN_CELL:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:case InsertionMode.IN_TEMPLATE:case InsertionMode.IN_FRAMESET:case InsertionMode.AFTER_FRAMESET:{appendComment(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.AFTER_BODY:{appendCommentToRootHtmlElement(this,token);break}case InsertionMode.AFTER_AFTER_BODY:case InsertionMode.AFTER_AFTER_FRAMESET:{appendCommentToDocument(this,token);break}default:}}onDoctype(token){switch(this.skipNextNewLine=!1,this.insertionMode){case InsertionMode.INITIAL:{doctypeInInitialMode(this,token);break}case InsertionMode.BEFORE_HEAD:case InsertionMode.IN_HEAD:case InsertionMode.IN_HEAD_NO_SCRIPT:case InsertionMode.AFTER_HEAD:{this._err(token,ERR.misplacedDoctype);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}default:}}onStartTag(token){this.skipNextNewLine=!1,this.currentToken=token,this._processStartTag(token),token.selfClosing&&!token.ackSelfClosing&&this._err(token,ERR.nonVoidHtmlElementStartTagWithTrailingSolidus)}_processStartTag(token){this.shouldProcessStartTagTokenInForeignContent(token)?startTagInForeignContent(this,token):this._startTagOutsideForeignContent(token)}_startTagOutsideForeignContent(token){switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{startTagBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{startTagBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{startTagInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{startTagInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{startTagAfterHead(this,token);break}case InsertionMode.IN_BODY:{startTagInBody(this,token);break}case InsertionMode.IN_TABLE:{startTagInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.IN_CAPTION:{startTagInCaption(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{startTagInColumnGroup(this,token);break}case InsertionMode.IN_TABLE_BODY:{startTagInTableBody(this,token);break}case InsertionMode.IN_ROW:{startTagInRow(this,token);break}case InsertionMode.IN_CELL:{startTagInCell(this,token);break}case InsertionMode.IN_SELECT:{startTagInSelect(this,token);break}case InsertionMode.IN_SELECT_IN_TABLE:{startTagInSelectInTable(this,token);break}case InsertionMode.IN_TEMPLATE:{startTagInTemplate(this,token);break}case InsertionMode.AFTER_BODY:{startTagAfterBody(this,token);break}case InsertionMode.IN_FRAMESET:{startTagInFrameset(this,token);break}case InsertionMode.AFTER_FRAMESET:{startTagAfterFrameset(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{startTagAfterAfterBody(this,token);break}case InsertionMode.AFTER_AFTER_FRAMESET:{startTagAfterAfterFrameset(this,token);break}default:}}onEndTag(token){this.skipNextNewLine=!1,this.currentToken=token,this.currentNotInHTML?endTagInForeignContent(this,token):this._endTagOutsideForeignContent(token)}_endTagOutsideForeignContent(token){switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{endTagBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{endTagBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{endTagInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{endTagInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{endTagAfterHead(this,token);break}case InsertionMode.IN_BODY:{endTagInBody(this,token);break}case InsertionMode.TEXT:{endTagInText(this,token);break}case InsertionMode.IN_TABLE:{endTagInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.IN_CAPTION:{endTagInCaption(this,token);break}case InsertionMode.IN_COLUMN_GROUP:{endTagInColumnGroup(this,token);break}case InsertionMode.IN_TABLE_BODY:{endTagInTableBody(this,token);break}case InsertionMode.IN_ROW:{endTagInRow(this,token);break}case InsertionMode.IN_CELL:{endTagInCell(this,token);break}case InsertionMode.IN_SELECT:{endTagInSelect(this,token);break}case InsertionMode.IN_SELECT_IN_TABLE:{endTagInSelectInTable(this,token);break}case InsertionMode.IN_TEMPLATE:{endTagInTemplate(this,token);break}case InsertionMode.AFTER_BODY:{endTagAfterBody(this,token);break}case InsertionMode.IN_FRAMESET:{endTagInFrameset(this,token);break}case InsertionMode.AFTER_FRAMESET:{endTagAfterFrameset(this,token);break}case InsertionMode.AFTER_AFTER_BODY:{tokenAfterAfterBody(this,token);break}default:}}onEof(token){switch(this.insertionMode){case InsertionMode.INITIAL:{tokenInInitialMode(this,token);break}case InsertionMode.BEFORE_HTML:{tokenBeforeHtml(this,token);break}case InsertionMode.BEFORE_HEAD:{tokenBeforeHead(this,token);break}case InsertionMode.IN_HEAD:{tokenInHead(this,token);break}case InsertionMode.IN_HEAD_NO_SCRIPT:{tokenInHeadNoScript(this,token);break}case InsertionMode.AFTER_HEAD:{tokenAfterHead(this,token);break}case InsertionMode.IN_BODY:case InsertionMode.IN_TABLE:case InsertionMode.IN_CAPTION:case InsertionMode.IN_COLUMN_GROUP:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:case InsertionMode.IN_CELL:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:{eofInBody(this,token);break}case InsertionMode.TEXT:{eofInText(this,token);break}case InsertionMode.IN_TABLE_TEXT:{tokenInTableText(this,token);break}case InsertionMode.IN_TEMPLATE:{eofInTemplate(this,token);break}case InsertionMode.AFTER_BODY:case InsertionMode.IN_FRAMESET:case InsertionMode.AFTER_FRAMESET:case InsertionMode.AFTER_AFTER_BODY:case InsertionMode.AFTER_AFTER_FRAMESET:{stopParsing(this,token);break}default:}}onWhitespaceCharacter(token){if(this.skipNextNewLine&&(this.skipNextNewLine=!1,token.chars.charCodeAt(0)===CODE_POINTS.LINE_FEED)){if(token.chars.length===1)return;token.chars=token.chars.substr(1)}if(this.tokenizer.inForeignNode){this._insertCharacters(token);return}switch(this.insertionMode){case InsertionMode.IN_HEAD:case InsertionMode.IN_HEAD_NO_SCRIPT:case InsertionMode.AFTER_HEAD:case InsertionMode.TEXT:case InsertionMode.IN_COLUMN_GROUP:case InsertionMode.IN_SELECT:case InsertionMode.IN_SELECT_IN_TABLE:case InsertionMode.IN_FRAMESET:case InsertionMode.AFTER_FRAMESET:{this._insertCharacters(token);break}case InsertionMode.IN_BODY:case InsertionMode.IN_CAPTION:case InsertionMode.IN_CELL:case InsertionMode.IN_TEMPLATE:case InsertionMode.AFTER_BODY:case InsertionMode.AFTER_AFTER_BODY:case InsertionMode.AFTER_AFTER_FRAMESET:{whitespaceCharacterInBody(this,token);break}case InsertionMode.IN_TABLE:case InsertionMode.IN_TABLE_BODY:case InsertionMode.IN_ROW:{characterInTable(this,token);break}case InsertionMode.IN_TABLE_TEXT:{whitespaceCharacterInTableText(this,token);break}default:}}};function aaObtainFormattingElementEntry(p,token){let formattingElementEntry=p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName);return formattingElementEntry?p.openElements.contains(formattingElementEntry.element)?p.openElements.hasInScope(token.tagID)||(formattingElementEntry=null):(p.activeFormattingElements.removeEntry(formattingElementEntry),formattingElementEntry=null):genericEndTagInBody(p,token),formattingElementEntry}function aaObtainFurthestBlock(p,formattingElementEntry){let furthestBlock=null,idx=p.openElements.stackTop;for(;idx>=0;idx--){let element=p.openElements.items[idx];if(element===formattingElementEntry.element)break;p._isSpecialElement(element,p.openElements.tagIDs[idx])&&(furthestBlock=element)}return furthestBlock||(p.openElements.shortenToLength(Math.max(idx,0)),p.activeFormattingElements.removeEntry(formattingElementEntry)),furthestBlock}function aaInnerLoop(p,furthestBlock,formattingElement){let lastElement=furthestBlock,nextElement=p.openElements.getCommonAncestor(furthestBlock);for(let i=0,element=nextElement;element!==formattingElement;i++,element=nextElement){nextElement=p.openElements.getCommonAncestor(element);let elementEntry=p.activeFormattingElements.getElementEntry(element),counterOverflow=elementEntry&&i>=AA_INNER_LOOP_ITER;!elementEntry||counterOverflow?(counterOverflow&&p.activeFormattingElements.removeEntry(elementEntry),p.openElements.remove(element)):(element=aaRecreateElementFromEntry(p,elementEntry),lastElement===furthestBlock&&(p.activeFormattingElements.bookmark=elementEntry),p.treeAdapter.detachNode(lastElement),p.treeAdapter.appendChild(element,lastElement),lastElement=element)}return lastElement}function aaRecreateElementFromEntry(p,elementEntry){let ns=p.treeAdapter.getNamespaceURI(elementEntry.element),newElement=p.treeAdapter.createElement(elementEntry.token.tagName,ns,elementEntry.token.attrs);return p.openElements.replace(elementEntry.element,newElement),elementEntry.element=newElement,newElement}function aaInsertLastNodeInCommonAncestor(p,commonAncestor,lastElement){let tn=p.treeAdapter.getTagName(commonAncestor),tid=getTagID(tn);if(p._isElementCausesFosterParenting(tid))p._fosterParentElement(lastElement);else{let ns=p.treeAdapter.getNamespaceURI(commonAncestor);tid===TAG_ID.TEMPLATE&&ns===NS.HTML&&(commonAncestor=p.treeAdapter.getTemplateContent(commonAncestor)),p.treeAdapter.appendChild(commonAncestor,lastElement)}}function aaReplaceFormattingElement(p,furthestBlock,formattingElementEntry){let ns=p.treeAdapter.getNamespaceURI(formattingElementEntry.element),{token}=formattingElementEntry,newElement=p.treeAdapter.createElement(token.tagName,ns,token.attrs);p._adoptNodes(furthestBlock,newElement),p.treeAdapter.appendChild(furthestBlock,newElement),p.activeFormattingElements.insertElementAfterBookmark(newElement,token),p.activeFormattingElements.removeEntry(formattingElementEntry),p.openElements.remove(formattingElementEntry.element),p.openElements.insertAfter(furthestBlock,newElement,token.tagID)}function callAdoptionAgency(p,token){for(let i=0;i<AA_OUTER_LOOP_ITER;i++){let formattingElementEntry=aaObtainFormattingElementEntry(p,token);if(!formattingElementEntry)break;let furthestBlock=aaObtainFurthestBlock(p,formattingElementEntry);if(!furthestBlock)break;p.activeFormattingElements.bookmark=formattingElementEntry;let lastElement=aaInnerLoop(p,furthestBlock,formattingElementEntry.element),commonAncestor=p.openElements.getCommonAncestor(formattingElementEntry.element);p.treeAdapter.detachNode(lastElement),commonAncestor&&aaInsertLastNodeInCommonAncestor(p,commonAncestor,lastElement),aaReplaceFormattingElement(p,furthestBlock,formattingElementEntry)}}function appendComment(p,token){p._appendCommentNode(token,p.openElements.currentTmplContentOrNode)}function appendCommentToRootHtmlElement(p,token){p._appendCommentNode(token,p.openElements.items[0])}function appendCommentToDocument(p,token){p._appendCommentNode(token,p.document)}function stopParsing(p,token){if(p.stopped=!0,token.location){let target=p.fragmentContext?0:2;for(let i=p.openElements.stackTop;i>=target;i--)p._setEndLocation(p.openElements.items[i],token);if(!p.fragmentContext&&p.openElements.stackTop>=0){let htmlElement=p.openElements.items[0],htmlLocation=p.treeAdapter.getNodeSourceCodeLocation(htmlElement);if(htmlLocation&&!htmlLocation.endTag&&(p._setEndLocation(htmlElement,token),p.openElements.stackTop>=1)){let bodyElement=p.openElements.items[1],bodyLocation=p.treeAdapter.getNodeSourceCodeLocation(bodyElement);bodyLocation&&!bodyLocation.endTag&&p._setEndLocation(bodyElement,token)}}}}function doctypeInInitialMode(p,token){p._setDocumentType(token);let mode=token.forceQuirks?DOCUMENT_MODE.QUIRKS:getDocumentMode(token);isConforming(token)||p._err(token,ERR.nonConformingDoctype),p.treeAdapter.setDocumentMode(p.document,mode),p.insertionMode=InsertionMode.BEFORE_HTML}function tokenInInitialMode(p,token){p._err(token,ERR.missingDoctype,!0),p.treeAdapter.setDocumentMode(p.document,DOCUMENT_MODE.QUIRKS),p.insertionMode=InsertionMode.BEFORE_HTML,p._processToken(token)}function startTagBeforeHtml(p,token){token.tagID===TAG_ID.HTML?(p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.BEFORE_HEAD):tokenBeforeHtml(p,token)}function endTagBeforeHtml(p,token){let tn=token.tagID;(tn===TAG_ID.HTML||tn===TAG_ID.HEAD||tn===TAG_ID.BODY||tn===TAG_ID.BR)&&tokenBeforeHtml(p,token)}function tokenBeforeHtml(p,token){p._insertFakeRootElement(),p.insertionMode=InsertionMode.BEFORE_HEAD,p._processToken(token)}function startTagBeforeHead(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.HEAD:{p._insertElement(token,NS.HTML),p.headElement=p.openElements.current,p.insertionMode=InsertionMode.IN_HEAD;break}default:tokenBeforeHead(p,token)}}function endTagBeforeHead(p,token){let tn=token.tagID;tn===TAG_ID.HEAD||tn===TAG_ID.BODY||tn===TAG_ID.HTML||tn===TAG_ID.BR?tokenBeforeHead(p,token):p._err(token,ERR.endTagWithoutMatchingOpenElement)}function tokenBeforeHead(p,token){p._insertFakeElement(TAG_NAMES.HEAD,TAG_ID.HEAD),p.headElement=p.openElements.current,p.insertionMode=InsertionMode.IN_HEAD,p._processToken(token)}function startTagInHead(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.BASE:case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.LINK:case TAG_ID.META:{p._appendElement(token,NS.HTML),token.ackSelfClosing=!0;break}case TAG_ID.TITLE:{p._switchToTextParsing(token,TokenizerMode.RCDATA);break}case TAG_ID.NOSCRIPT:{p.options.scriptingEnabled?p._switchToTextParsing(token,TokenizerMode.RAWTEXT):(p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_HEAD_NO_SCRIPT);break}case TAG_ID.NOFRAMES:case TAG_ID.STYLE:{p._switchToTextParsing(token,TokenizerMode.RAWTEXT);break}case TAG_ID.SCRIPT:{p._switchToTextParsing(token,TokenizerMode.SCRIPT_DATA);break}case TAG_ID.TEMPLATE:{p._insertTemplate(token),p.activeFormattingElements.insertMarker(),p.framesetOk=!1,p.insertionMode=InsertionMode.IN_TEMPLATE,p.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);break}case TAG_ID.HEAD:{p._err(token,ERR.misplacedStartTagForHeadElement);break}default:tokenInHead(p,token)}}function endTagInHead(p,token){switch(token.tagID){case TAG_ID.HEAD:{p.openElements.pop(),p.insertionMode=InsertionMode.AFTER_HEAD;break}case TAG_ID.BODY:case TAG_ID.BR:case TAG_ID.HTML:{tokenInHead(p,token);break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:p._err(token,ERR.endTagWithoutMatchingOpenElement)}}function templateEndTagInHead(p,token){p.openElements.tmplCount>0?(p.openElements.generateImpliedEndTagsThoroughly(),p.openElements.currentTagId!==TAG_ID.TEMPLATE&&p._err(token,ERR.closingOfElementWithOpenChildElements),p.openElements.popUntilTagNamePopped(TAG_ID.TEMPLATE),p.activeFormattingElements.clearToLastMarker(),p.tmplInsertionModeStack.shift(),p._resetInsertionMode()):p._err(token,ERR.endTagWithoutMatchingOpenElement)}function tokenInHead(p,token){p.openElements.pop(),p.insertionMode=InsertionMode.AFTER_HEAD,p._processToken(token)}function startTagInHeadNoScript(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.HEAD:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.NOFRAMES:case TAG_ID.STYLE:{startTagInHead(p,token);break}case TAG_ID.NOSCRIPT:{p._err(token,ERR.nestedNoscriptInHead);break}default:tokenInHeadNoScript(p,token)}}function endTagInHeadNoScript(p,token){switch(token.tagID){case TAG_ID.NOSCRIPT:{p.openElements.pop(),p.insertionMode=InsertionMode.IN_HEAD;break}case TAG_ID.BR:{tokenInHeadNoScript(p,token);break}default:p._err(token,ERR.endTagWithoutMatchingOpenElement)}}function tokenInHeadNoScript(p,token){let errCode=token.type===TokenType.EOF?ERR.openElementsLeftAfterEof:ERR.disallowedContentInNoscriptInHead;p._err(token,errCode),p.openElements.pop(),p.insertionMode=InsertionMode.IN_HEAD,p._processToken(token)}function startTagAfterHead(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.BODY:{p._insertElement(token,NS.HTML),p.framesetOk=!1,p.insertionMode=InsertionMode.IN_BODY;break}case TAG_ID.FRAMESET:{p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_FRAMESET;break}case TAG_ID.BASE:case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.NOFRAMES:case TAG_ID.SCRIPT:case TAG_ID.STYLE:case TAG_ID.TEMPLATE:case TAG_ID.TITLE:{p._err(token,ERR.abandonedHeadElementChild),p.openElements.push(p.headElement,TAG_ID.HEAD),startTagInHead(p,token),p.openElements.remove(p.headElement);break}case TAG_ID.HEAD:{p._err(token,ERR.misplacedStartTagForHeadElement);break}default:tokenAfterHead(p,token)}}function endTagAfterHead(p,token){switch(token.tagID){case TAG_ID.BODY:case TAG_ID.HTML:case TAG_ID.BR:{tokenAfterHead(p,token);break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:p._err(token,ERR.endTagWithoutMatchingOpenElement)}}function tokenAfterHead(p,token){p._insertFakeElement(TAG_NAMES.BODY,TAG_ID.BODY),p.insertionMode=InsertionMode.IN_BODY,modeInBody(p,token)}function modeInBody(p,token){switch(token.type){case TokenType.CHARACTER:{characterInBody(p,token);break}case TokenType.WHITESPACE_CHARACTER:{whitespaceCharacterInBody(p,token);break}case TokenType.COMMENT:{appendComment(p,token);break}case TokenType.START_TAG:{startTagInBody(p,token);break}case TokenType.END_TAG:{endTagInBody(p,token);break}case TokenType.EOF:{eofInBody(p,token);break}default:}}function whitespaceCharacterInBody(p,token){p._reconstructActiveFormattingElements(),p._insertCharacters(token)}function characterInBody(p,token){p._reconstructActiveFormattingElements(),p._insertCharacters(token),p.framesetOk=!1}function htmlStartTagInBody(p,token){p.openElements.tmplCount===0&&p.treeAdapter.adoptAttributes(p.openElements.items[0],token.attrs)}function bodyStartTagInBody(p,token){let bodyElement=p.openElements.tryPeekProperlyNestedBodyElement();bodyElement&&p.openElements.tmplCount===0&&(p.framesetOk=!1,p.treeAdapter.adoptAttributes(bodyElement,token.attrs))}function framesetStartTagInBody(p,token){let bodyElement=p.openElements.tryPeekProperlyNestedBodyElement();p.framesetOk&&bodyElement&&(p.treeAdapter.detachNode(bodyElement),p.openElements.popAllUpToHtmlElement(),p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_FRAMESET)}function addressStartTagInBody(p,token){p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._insertElement(token,NS.HTML)}function numberedHeaderStartTagInBody(p,token){p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p.openElements.currentTagId!==void 0&&NUMBERED_HEADERS.has(p.openElements.currentTagId)&&p.openElements.pop(),p._insertElement(token,NS.HTML)}function preStartTagInBody(p,token){p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._insertElement(token,NS.HTML),p.skipNextNewLine=!0,p.framesetOk=!1}function formStartTagInBody(p,token){let inTemplate=p.openElements.tmplCount>0;(!p.formElement||inTemplate)&&(p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._insertElement(token,NS.HTML),inTemplate||(p.formElement=p.openElements.current))}function listItemStartTagInBody(p,token){p.framesetOk=!1;let tn=token.tagID;for(let i=p.openElements.stackTop;i>=0;i--){let elementId=p.openElements.tagIDs[i];if(tn===TAG_ID.LI&&elementId===TAG_ID.LI||(tn===TAG_ID.DD||tn===TAG_ID.DT)&&(elementId===TAG_ID.DD||elementId===TAG_ID.DT)){p.openElements.generateImpliedEndTagsWithExclusion(elementId),p.openElements.popUntilTagNamePopped(elementId);break}if(elementId!==TAG_ID.ADDRESS&&elementId!==TAG_ID.DIV&&elementId!==TAG_ID.P&&p._isSpecialElement(p.openElements.items[i],elementId))break}p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._insertElement(token,NS.HTML)}function plaintextStartTagInBody(p,token){p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._insertElement(token,NS.HTML),p.tokenizer.state=TokenizerMode.PLAINTEXT}function buttonStartTagInBody(p,token){p.openElements.hasInScope(TAG_ID.BUTTON)&&(p.openElements.generateImpliedEndTags(),p.openElements.popUntilTagNamePopped(TAG_ID.BUTTON)),p._reconstructActiveFormattingElements(),p._insertElement(token,NS.HTML),p.framesetOk=!1}function aStartTagInBody(p,token){let activeElementEntry=p.activeFormattingElements.getElementEntryInScopeWithTagName(TAG_NAMES.A);activeElementEntry&&(callAdoptionAgency(p,token),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(),p.openElements.hasInScope(TAG_ID.NOBR)&&(callAdoptionAgency(p,token),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=!1}function tableStartTagInBody(p,token){p.treeAdapter.getDocumentMode(p.document)!==DOCUMENT_MODE.QUIRKS&&p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._insertElement(token,NS.HTML),p.framesetOk=!1,p.insertionMode=InsertionMode.IN_TABLE}function areaStartTagInBody(p,token){p._reconstructActiveFormattingElements(),p._appendElement(token,NS.HTML),p.framesetOk=!1,token.ackSelfClosing=!0}function isHiddenInput(token){let inputType=getTokenAttr(token,ATTRS.TYPE);return inputType!=null&&inputType.toLowerCase()===HIDDEN_INPUT_TYPE}function inputStartTagInBody(p,token){p._reconstructActiveFormattingElements(),p._appendElement(token,NS.HTML),isHiddenInput(token)||(p.framesetOk=!1),token.ackSelfClosing=!0}function paramStartTagInBody(p,token){p._appendElement(token,NS.HTML),token.ackSelfClosing=!0}function hrStartTagInBody(p,token){p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._appendElement(token,NS.HTML),p.framesetOk=!1,token.ackSelfClosing=!0}function imageStartTagInBody(p,token){token.tagName=TAG_NAMES.IMG,token.tagID=TAG_ID.IMG,areaStartTagInBody(p,token)}function textareaStartTagInBody(p,token){p._insertElement(token,NS.HTML),p.skipNextNewLine=!0,p.tokenizer.state=TokenizerMode.RCDATA,p.originalInsertionMode=p.insertionMode,p.framesetOk=!1,p.insertionMode=InsertionMode.TEXT}function xmpStartTagInBody(p,token){p.openElements.hasInButtonScope(TAG_ID.P)&&p._closePElement(),p._reconstructActiveFormattingElements(),p.framesetOk=!1,p._switchToTextParsing(token,TokenizerMode.RAWTEXT)}function iframeStartTagInBody(p,token){p.framesetOk=!1,p._switchToTextParsing(token,TokenizerMode.RAWTEXT)}function rawTextStartTagInBody(p,token){p._switchToTextParsing(token,TokenizerMode.RAWTEXT)}function selectStartTagInBody(p,token){p._reconstructActiveFormattingElements(),p._insertElement(token,NS.HTML),p.framesetOk=!1,p.insertionMode=p.insertionMode===InsertionMode.IN_TABLE||p.insertionMode===InsertionMode.IN_CAPTION||p.insertionMode===InsertionMode.IN_TABLE_BODY||p.insertionMode===InsertionMode.IN_ROW||p.insertionMode===InsertionMode.IN_CELL?InsertionMode.IN_SELECT_IN_TABLE:InsertionMode.IN_SELECT}function optgroupStartTagInBody(p,token){p.openElements.currentTagId===TAG_ID.OPTION&&p.openElements.pop(),p._reconstructActiveFormattingElements(),p._insertElement(token,NS.HTML)}function rbStartTagInBody(p,token){p.openElements.hasInScope(TAG_ID.RUBY)&&p.openElements.generateImpliedEndTags(),p._insertElement(token,NS.HTML)}function rtStartTagInBody(p,token){p.openElements.hasInScope(TAG_ID.RUBY)&&p.openElements.generateImpliedEndTagsWithExclusion(TAG_ID.RTC),p._insertElement(token,NS.HTML)}function mathStartTagInBody(p,token){p._reconstructActiveFormattingElements(),adjustTokenMathMLAttrs(token),adjustTokenXMLAttrs(token),token.selfClosing?p._appendElement(token,NS.MATHML):p._insertElement(token,NS.MATHML),token.ackSelfClosing=!0}function svgStartTagInBody(p,token){p._reconstructActiveFormattingElements(),adjustTokenSVGAttrs(token),adjustTokenXMLAttrs(token),token.selfClosing?p._appendElement(token,NS.SVG):p._insertElement(token,NS.SVG),token.ackSelfClosing=!0}function genericStartTagInBody(p,token){p._reconstructActiveFormattingElements(),p._insertElement(token,NS.HTML)}function startTagInBody(p,token){switch(token.tagID){case TAG_ID.I:case TAG_ID.S:case TAG_ID.B:case TAG_ID.U:case TAG_ID.EM:case TAG_ID.TT:case TAG_ID.BIG:case TAG_ID.CODE:case TAG_ID.FONT:case TAG_ID.SMALL:case TAG_ID.STRIKE:case TAG_ID.STRONG:{bStartTagInBody(p,token);break}case TAG_ID.A:{aStartTagInBody(p,token);break}case TAG_ID.H1:case TAG_ID.H2:case TAG_ID.H3:case TAG_ID.H4:case TAG_ID.H5:case TAG_ID.H6:{numberedHeaderStartTagInBody(p,token);break}case TAG_ID.P:case TAG_ID.DL:case TAG_ID.OL:case TAG_ID.UL:case TAG_ID.DIV:case TAG_ID.DIR:case TAG_ID.NAV:case TAG_ID.MAIN:case TAG_ID.MENU:case TAG_ID.ASIDE:case TAG_ID.CENTER:case TAG_ID.FIGURE:case TAG_ID.FOOTER:case TAG_ID.HEADER:case TAG_ID.HGROUP:case TAG_ID.DIALOG:case TAG_ID.DETAILS:case TAG_ID.ADDRESS:case TAG_ID.ARTICLE:case TAG_ID.SEARCH:case TAG_ID.SECTION:case TAG_ID.SUMMARY:case TAG_ID.FIELDSET:case TAG_ID.BLOCKQUOTE:case TAG_ID.FIGCAPTION:{addressStartTagInBody(p,token);break}case TAG_ID.LI:case TAG_ID.DD:case TAG_ID.DT:{listItemStartTagInBody(p,token);break}case TAG_ID.BR:case TAG_ID.IMG:case TAG_ID.WBR:case TAG_ID.AREA:case TAG_ID.EMBED:case TAG_ID.KEYGEN:{areaStartTagInBody(p,token);break}case TAG_ID.HR:{hrStartTagInBody(p,token);break}case TAG_ID.RB:case TAG_ID.RTC:{rbStartTagInBody(p,token);break}case TAG_ID.RT:case TAG_ID.RP:{rtStartTagInBody(p,token);break}case TAG_ID.PRE:case TAG_ID.LISTING:{preStartTagInBody(p,token);break}case TAG_ID.XMP:{xmpStartTagInBody(p,token);break}case TAG_ID.SVG:{svgStartTagInBody(p,token);break}case TAG_ID.HTML:{htmlStartTagInBody(p,token);break}case TAG_ID.BASE:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.STYLE:case TAG_ID.TITLE:case TAG_ID.SCRIPT:case TAG_ID.BGSOUND:case TAG_ID.BASEFONT:case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}case TAG_ID.BODY:{bodyStartTagInBody(p,token);break}case TAG_ID.FORM:{formStartTagInBody(p,token);break}case TAG_ID.NOBR:{nobrStartTagInBody(p,token);break}case TAG_ID.MATH:{mathStartTagInBody(p,token);break}case TAG_ID.TABLE:{tableStartTagInBody(p,token);break}case TAG_ID.INPUT:{inputStartTagInBody(p,token);break}case TAG_ID.PARAM:case TAG_ID.TRACK:case TAG_ID.SOURCE:{paramStartTagInBody(p,token);break}case TAG_ID.IMAGE:{imageStartTagInBody(p,token);break}case TAG_ID.BUTTON:{buttonStartTagInBody(p,token);break}case TAG_ID.APPLET:case TAG_ID.OBJECT:case TAG_ID.MARQUEE:{appletStartTagInBody(p,token);break}case TAG_ID.IFRAME:{iframeStartTagInBody(p,token);break}case TAG_ID.SELECT:{selectStartTagInBody(p,token);break}case TAG_ID.OPTION:case TAG_ID.OPTGROUP:{optgroupStartTagInBody(p,token);break}case TAG_ID.NOEMBED:case TAG_ID.NOFRAMES:{rawTextStartTagInBody(p,token);break}case TAG_ID.FRAMESET:{framesetStartTagInBody(p,token);break}case TAG_ID.TEXTAREA:{textareaStartTagInBody(p,token);break}case TAG_ID.NOSCRIPT:{p.options.scriptingEnabled?rawTextStartTagInBody(p,token):genericStartTagInBody(p,token);break}case TAG_ID.PLAINTEXT:{plaintextStartTagInBody(p,token);break}case TAG_ID.COL:case TAG_ID.TH:case TAG_ID.TD:case TAG_ID.TR:case TAG_ID.HEAD:case TAG_ID.FRAME:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:case TAG_ID.CAPTION:case TAG_ID.COLGROUP:break;default:genericStartTagInBody(p,token)}}function bodyEndTagInBody(p,token){if(p.openElements.hasInScope(TAG_ID.BODY)&&(p.insertionMode=InsertionMode.AFTER_BODY,p.options.sourceCodeLocationInfo)){let bodyElement=p.openElements.tryPeekProperlyNestedBodyElement();bodyElement&&p._setEndLocation(bodyElement,token)}}function htmlEndTagInBody(p,token){p.openElements.hasInScope(TAG_ID.BODY)&&(p.insertionMode=InsertionMode.AFTER_BODY,endTagAfterBody(p,token))}function addressEndTagInBody(p,token){let tn=token.tagID;p.openElements.hasInScope(tn)&&(p.openElements.generateImpliedEndTags(),p.openElements.popUntilTagNamePopped(tn))}function formEndTagInBody(p){let inTemplate=p.openElements.tmplCount>0,{formElement}=p;inTemplate||(p.formElement=null),(formElement||inTemplate)&&p.openElements.hasInScope(TAG_ID.FORM)&&(p.openElements.generateImpliedEndTags(),inTemplate?p.openElements.popUntilTagNamePopped(TAG_ID.FORM):formElement&&p.openElements.remove(formElement))}function pEndTagInBody(p){p.openElements.hasInButtonScope(TAG_ID.P)||p._insertFakeElement(TAG_NAMES.P,TAG_ID.P),p._closePElement()}function liEndTagInBody(p){p.openElements.hasInListItemScope(TAG_ID.LI)&&(p.openElements.generateImpliedEndTagsWithExclusion(TAG_ID.LI),p.openElements.popUntilTagNamePopped(TAG_ID.LI))}function ddEndTagInBody(p,token){let tn=token.tagID;p.openElements.hasInScope(tn)&&(p.openElements.generateImpliedEndTagsWithExclusion(tn),p.openElements.popUntilTagNamePopped(tn))}function numberedHeaderEndTagInBody(p){p.openElements.hasNumberedHeaderInScope()&&(p.openElements.generateImpliedEndTags(),p.openElements.popUntilNumberedHeaderPopped())}function appletEndTagInBody(p,token){let tn=token.tagID;p.openElements.hasInScope(tn)&&(p.openElements.generateImpliedEndTags(),p.openElements.popUntilTagNamePopped(tn),p.activeFormattingElements.clearToLastMarker())}function brEndTagInBody(p){p._reconstructActiveFormattingElements(),p._insertFakeElement(TAG_NAMES.BR,TAG_ID.BR),p.openElements.pop(),p.framesetOk=!1}function genericEndTagInBody(p,token){let tn=token.tagName,tid=token.tagID;for(let i=p.openElements.stackTop;i>0;i--){let element=p.openElements.items[i],elementId=p.openElements.tagIDs[i];if(tid===elementId&&(tid!==TAG_ID.UNKNOWN||p.treeAdapter.getTagName(element)===tn)){p.openElements.generateImpliedEndTagsWithExclusion(tid),p.openElements.stackTop>=i&&p.openElements.shortenToLength(i);break}if(p._isSpecialElement(element,elementId))break}}function endTagInBody(p,token){switch(token.tagID){case TAG_ID.A:case TAG_ID.B:case TAG_ID.I:case TAG_ID.S:case TAG_ID.U:case TAG_ID.EM:case TAG_ID.TT:case TAG_ID.BIG:case TAG_ID.CODE:case TAG_ID.FONT:case TAG_ID.NOBR:case TAG_ID.SMALL:case TAG_ID.STRIKE:case TAG_ID.STRONG:{callAdoptionAgency(p,token);break}case TAG_ID.P:{pEndTagInBody(p);break}case TAG_ID.DL:case TAG_ID.UL:case TAG_ID.OL:case TAG_ID.DIR:case TAG_ID.DIV:case TAG_ID.NAV:case TAG_ID.PRE:case TAG_ID.MAIN:case TAG_ID.MENU:case TAG_ID.ASIDE:case TAG_ID.BUTTON:case TAG_ID.CENTER:case TAG_ID.FIGURE:case TAG_ID.FOOTER:case TAG_ID.HEADER:case TAG_ID.HGROUP:case TAG_ID.DIALOG:case TAG_ID.ADDRESS:case TAG_ID.ARTICLE:case TAG_ID.DETAILS:case TAG_ID.SEARCH:case TAG_ID.SECTION:case TAG_ID.SUMMARY:case TAG_ID.LISTING:case TAG_ID.FIELDSET:case TAG_ID.BLOCKQUOTE:case TAG_ID.FIGCAPTION:{addressEndTagInBody(p,token);break}case TAG_ID.LI:{liEndTagInBody(p);break}case TAG_ID.DD:case TAG_ID.DT:{ddEndTagInBody(p,token);break}case TAG_ID.H1:case TAG_ID.H2:case TAG_ID.H3:case TAG_ID.H4:case TAG_ID.H5:case TAG_ID.H6:{numberedHeaderEndTagInBody(p);break}case TAG_ID.BR:{brEndTagInBody(p);break}case TAG_ID.BODY:{bodyEndTagInBody(p,token);break}case TAG_ID.HTML:{htmlEndTagInBody(p,token);break}case TAG_ID.FORM:{formEndTagInBody(p);break}case TAG_ID.APPLET:case TAG_ID.OBJECT:case TAG_ID.MARQUEE:{appletEndTagInBody(p,token);break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:genericEndTagInBody(p,token)}}function eofInBody(p,token){p.tmplInsertionModeStack.length>0?eofInTemplate(p,token):stopParsing(p,token)}function endTagInText(p,token){var _a;token.tagID===TAG_ID.SCRIPT&&((_a=p.scriptHandler)===null||_a===void 0||_a.call(p,p.openElements.current)),p.openElements.pop(),p.insertionMode=p.originalInsertionMode}function eofInText(p,token){p._err(token,ERR.eofInElementThatCanContainOnlyText),p.openElements.pop(),p.insertionMode=p.originalInsertionMode,p.onEof(token)}function characterInTable(p,token){if(p.openElements.currentTagId!==void 0&&TABLE_STRUCTURE_TAGS.has(p.openElements.currentTagId))switch(p.pendingCharacterTokens.length=0,p.hasNonWhitespacePendingCharacterToken=!1,p.originalInsertionMode=p.insertionMode,p.insertionMode=InsertionMode.IN_TABLE_TEXT,token.type){case TokenType.CHARACTER:{characterInTableText(p,token);break}case TokenType.WHITESPACE_CHARACTER:{whitespaceCharacterInTableText(p,token);break}}else tokenInTable(p,token)}function captionStartTagInTable(p,token){p.openElements.clearBackToTableContext(),p.activeFormattingElements.insertMarker(),p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_CAPTION}function colgroupStartTagInTable(p,token){p.openElements.clearBackToTableContext(),p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_COLUMN_GROUP}function colStartTagInTable(p,token){p.openElements.clearBackToTableContext(),p._insertFakeElement(TAG_NAMES.COLGROUP,TAG_ID.COLGROUP),p.insertionMode=InsertionMode.IN_COLUMN_GROUP,startTagInColumnGroup(p,token)}function tbodyStartTagInTable(p,token){p.openElements.clearBackToTableContext(),p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_TABLE_BODY}function tdStartTagInTable(p,token){p.openElements.clearBackToTableContext(),p._insertFakeElement(TAG_NAMES.TBODY,TAG_ID.TBODY),p.insertionMode=InsertionMode.IN_TABLE_BODY,startTagInTableBody(p,token)}function tableStartTagInTable(p,token){p.openElements.hasInTableScope(TAG_ID.TABLE)&&(p.openElements.popUntilTagNamePopped(TAG_ID.TABLE),p._resetInsertionMode(),p._processStartTag(token))}function inputStartTagInTable(p,token){isHiddenInput(token)?p._appendElement(token,NS.HTML):tokenInTable(p,token),token.ackSelfClosing=!0}function formStartTagInTable(p,token){!p.formElement&&p.openElements.tmplCount===0&&(p._insertElement(token,NS.HTML),p.formElement=p.openElements.current,p.openElements.pop())}function startTagInTable(p,token){switch(token.tagID){case TAG_ID.TD:case TAG_ID.TH:case TAG_ID.TR:{tdStartTagInTable(p,token);break}case TAG_ID.STYLE:case TAG_ID.SCRIPT:case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}case TAG_ID.COL:{colStartTagInTable(p,token);break}case TAG_ID.FORM:{formStartTagInTable(p,token);break}case TAG_ID.TABLE:{tableStartTagInTable(p,token);break}case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{tbodyStartTagInTable(p,token);break}case TAG_ID.INPUT:{inputStartTagInTable(p,token);break}case TAG_ID.CAPTION:{captionStartTagInTable(p,token);break}case TAG_ID.COLGROUP:{colgroupStartTagInTable(p,token);break}default:tokenInTable(p,token)}}function endTagInTable(p,token){switch(token.tagID){case TAG_ID.TABLE:{p.openElements.hasInTableScope(TAG_ID.TABLE)&&(p.openElements.popUntilTagNamePopped(TAG_ID.TABLE),p._resetInsertionMode());break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TBODY:case TAG_ID.TD:case TAG_ID.TFOOT:case TAG_ID.TH:case TAG_ID.THEAD:case TAG_ID.TR:break;default:tokenInTable(p,token)}}function tokenInTable(p,token){let savedFosterParentingState=p.fosterParentingEnabled;p.fosterParentingEnabled=!0,modeInBody(p,token),p.fosterParentingEnabled=savedFosterParentingState}function whitespaceCharacterInTableText(p,token){p.pendingCharacterTokens.push(token)}function characterInTableText(p,token){p.pendingCharacterTokens.push(token),p.hasNonWhitespacePendingCharacterToken=!0}function tokenInTableText(p,token){let i=0;if(p.hasNonWhitespacePendingCharacterToken)for(;i<p.pendingCharacterTokens.length;i++)tokenInTable(p,p.pendingCharacterTokens[i]);else for(;i<p.pendingCharacterTokens.length;i++)p._insertCharacters(p.pendingCharacterTokens[i]);p.insertionMode=p.originalInsertionMode,p._processToken(token)}var TABLE_VOID_ELEMENTS=new Set([TAG_ID.CAPTION,TAG_ID.COL,TAG_ID.COLGROUP,TAG_ID.TBODY,TAG_ID.TD,TAG_ID.TFOOT,TAG_ID.TH,TAG_ID.THEAD,TAG_ID.TR]);function startTagInCaption(p,token){let tn=token.tagID;TABLE_VOID_ELEMENTS.has(tn)?p.openElements.hasInTableScope(TAG_ID.CAPTION)&&(p.openElements.generateImpliedEndTags(),p.openElements.popUntilTagNamePopped(TAG_ID.CAPTION),p.activeFormattingElements.clearToLastMarker(),p.insertionMode=InsertionMode.IN_TABLE,startTagInTable(p,token)):startTagInBody(p,token)}function endTagInCaption(p,token){let tn=token.tagID;switch(tn){case TAG_ID.CAPTION:case TAG_ID.TABLE:{p.openElements.hasInTableScope(TAG_ID.CAPTION)&&(p.openElements.generateImpliedEndTags(),p.openElements.popUntilTagNamePopped(TAG_ID.CAPTION),p.activeFormattingElements.clearToLastMarker(),p.insertionMode=InsertionMode.IN_TABLE,tn===TAG_ID.TABLE&&endTagInTable(p,token));break}case TAG_ID.BODY:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TBODY:case TAG_ID.TD:case TAG_ID.TFOOT:case TAG_ID.TH:case TAG_ID.THEAD:case TAG_ID.TR:break;default:endTagInBody(p,token)}}function startTagInColumnGroup(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.COL:{p._appendElement(token,NS.HTML),token.ackSelfClosing=!0;break}case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}default:tokenInColumnGroup(p,token)}}function endTagInColumnGroup(p,token){switch(token.tagID){case TAG_ID.COLGROUP:{p.openElements.currentTagId===TAG_ID.COLGROUP&&(p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE);break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}case TAG_ID.COL:break;default:tokenInColumnGroup(p,token)}}function tokenInColumnGroup(p,token){p.openElements.currentTagId===TAG_ID.COLGROUP&&(p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE,p._processToken(token))}function startTagInTableBody(p,token){switch(token.tagID){case TAG_ID.TR:{p.openElements.clearBackToTableBodyContext(),p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_ROW;break}case TAG_ID.TH:case TAG_ID.TD:{p.openElements.clearBackToTableBodyContext(),p._insertFakeElement(TAG_NAMES.TR,TAG_ID.TR),p.insertionMode=InsertionMode.IN_ROW,startTagInRow(p,token);break}case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{p.openElements.hasTableBodyContextInTableScope()&&(p.openElements.clearBackToTableBodyContext(),p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE,startTagInTable(p,token));break}default:startTagInTable(p,token)}}function endTagInTableBody(p,token){let tn=token.tagID;switch(token.tagID){case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{p.openElements.hasInTableScope(tn)&&(p.openElements.clearBackToTableBodyContext(),p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE);break}case TAG_ID.TABLE:{p.openElements.hasTableBodyContextInTableScope()&&(p.openElements.clearBackToTableBodyContext(),p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE,endTagInTable(p,token));break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TD:case TAG_ID.TH:case TAG_ID.TR:break;default:endTagInTable(p,token)}}function startTagInRow(p,token){switch(token.tagID){case TAG_ID.TH:case TAG_ID.TD:{p.openElements.clearBackToTableRowContext(),p._insertElement(token,NS.HTML),p.insertionMode=InsertionMode.IN_CELL,p.activeFormattingElements.insertMarker();break}case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:case TAG_ID.TR:{p.openElements.hasInTableScope(TAG_ID.TR)&&(p.openElements.clearBackToTableRowContext(),p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE_BODY,startTagInTableBody(p,token));break}default:startTagInTable(p,token)}}function endTagInRow(p,token){switch(token.tagID){case TAG_ID.TR:{p.openElements.hasInTableScope(TAG_ID.TR)&&(p.openElements.clearBackToTableRowContext(),p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE_BODY);break}case TAG_ID.TABLE:{p.openElements.hasInTableScope(TAG_ID.TR)&&(p.openElements.clearBackToTableRowContext(),p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE_BODY,endTagInTableBody(p,token));break}case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{(p.openElements.hasInTableScope(token.tagID)||p.openElements.hasInTableScope(TAG_ID.TR))&&(p.openElements.clearBackToTableRowContext(),p.openElements.pop(),p.insertionMode=InsertionMode.IN_TABLE_BODY,endTagInTableBody(p,token));break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:case TAG_ID.TD:case TAG_ID.TH:break;default:endTagInTable(p,token)}}function startTagInCell(p,token){let tn=token.tagID;TABLE_VOID_ELEMENTS.has(tn)?(p.openElements.hasInTableScope(TAG_ID.TD)||p.openElements.hasInTableScope(TAG_ID.TH))&&(p._closeTableCell(),startTagInRow(p,token)):startTagInBody(p,token)}function endTagInCell(p,token){let tn=token.tagID;switch(tn){case TAG_ID.TD:case TAG_ID.TH:{p.openElements.hasInTableScope(tn)&&(p.openElements.generateImpliedEndTags(),p.openElements.popUntilTagNamePopped(tn),p.activeFormattingElements.clearToLastMarker(),p.insertionMode=InsertionMode.IN_ROW);break}case TAG_ID.TABLE:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:case TAG_ID.TR:{p.openElements.hasInTableScope(tn)&&(p._closeTableCell(),endTagInRow(p,token));break}case TAG_ID.BODY:case TAG_ID.CAPTION:case TAG_ID.COL:case TAG_ID.COLGROUP:case TAG_ID.HTML:break;default:endTagInBody(p,token)}}function startTagInSelect(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.OPTION:{p.openElements.currentTagId===TAG_ID.OPTION&&p.openElements.pop(),p._insertElement(token,NS.HTML);break}case TAG_ID.OPTGROUP:{p.openElements.currentTagId===TAG_ID.OPTION&&p.openElements.pop(),p.openElements.currentTagId===TAG_ID.OPTGROUP&&p.openElements.pop(),p._insertElement(token,NS.HTML);break}case TAG_ID.HR:{p.openElements.currentTagId===TAG_ID.OPTION&&p.openElements.pop(),p.openElements.currentTagId===TAG_ID.OPTGROUP&&p.openElements.pop(),p._appendElement(token,NS.HTML),token.ackSelfClosing=!0;break}case TAG_ID.INPUT:case TAG_ID.KEYGEN:case TAG_ID.TEXTAREA:case TAG_ID.SELECT:{p.openElements.hasInSelectScope(TAG_ID.SELECT)&&(p.openElements.popUntilTagNamePopped(TAG_ID.SELECT),p._resetInsertionMode(),token.tagID!==TAG_ID.SELECT&&p._processStartTag(token));break}case TAG_ID.SCRIPT:case TAG_ID.TEMPLATE:{startTagInHead(p,token);break}default:}}function endTagInSelect(p,token){switch(token.tagID){case TAG_ID.OPTGROUP:{p.openElements.stackTop>0&&p.openElements.currentTagId===TAG_ID.OPTION&&p.openElements.tagIDs[p.openElements.stackTop-1]===TAG_ID.OPTGROUP&&p.openElements.pop(),p.openElements.currentTagId===TAG_ID.OPTGROUP&&p.openElements.pop();break}case TAG_ID.OPTION:{p.openElements.currentTagId===TAG_ID.OPTION&&p.openElements.pop();break}case TAG_ID.SELECT:{p.openElements.hasInSelectScope(TAG_ID.SELECT)&&(p.openElements.popUntilTagNamePopped(TAG_ID.SELECT),p._resetInsertionMode());break}case TAG_ID.TEMPLATE:{templateEndTagInHead(p,token);break}default:}}function startTagInSelectInTable(p,token){let tn=token.tagID;tn===TAG_ID.CAPTION||tn===TAG_ID.TABLE||tn===TAG_ID.TBODY||tn===TAG_ID.TFOOT||tn===TAG_ID.THEAD||tn===TAG_ID.TR||tn===TAG_ID.TD||tn===TAG_ID.TH?(p.openElements.popUntilTagNamePopped(TAG_ID.SELECT),p._resetInsertionMode(),p._processStartTag(token)):startTagInSelect(p,token)}function endTagInSelectInTable(p,token){let tn=token.tagID;tn===TAG_ID.CAPTION||tn===TAG_ID.TABLE||tn===TAG_ID.TBODY||tn===TAG_ID.TFOOT||tn===TAG_ID.THEAD||tn===TAG_ID.TR||tn===TAG_ID.TD||tn===TAG_ID.TH?p.openElements.hasInTableScope(tn)&&(p.openElements.popUntilTagNamePopped(TAG_ID.SELECT),p._resetInsertionMode(),p.onEndTag(token)):endTagInSelect(p,token)}function startTagInTemplate(p,token){switch(token.tagID){case TAG_ID.BASE:case TAG_ID.BASEFONT:case TAG_ID.BGSOUND:case TAG_ID.LINK:case TAG_ID.META:case TAG_ID.NOFRAMES:case TAG_ID.SCRIPT:case TAG_ID.STYLE:case TAG_ID.TEMPLATE:case TAG_ID.TITLE:{startTagInHead(p,token);break}case TAG_ID.CAPTION:case TAG_ID.COLGROUP:case TAG_ID.TBODY:case TAG_ID.TFOOT:case TAG_ID.THEAD:{p.tmplInsertionModeStack[0]=InsertionMode.IN_TABLE,p.insertionMode=InsertionMode.IN_TABLE,startTagInTable(p,token);break}case TAG_ID.COL:{p.tmplInsertionModeStack[0]=InsertionMode.IN_COLUMN_GROUP,p.insertionMode=InsertionMode.IN_COLUMN_GROUP,startTagInColumnGroup(p,token);break}case TAG_ID.TR:{p.tmplInsertionModeStack[0]=InsertionMode.IN_TABLE_BODY,p.insertionMode=InsertionMode.IN_TABLE_BODY,startTagInTableBody(p,token);break}case TAG_ID.TD:case TAG_ID.TH:{p.tmplInsertionModeStack[0]=InsertionMode.IN_ROW,p.insertionMode=InsertionMode.IN_ROW,startTagInRow(p,token);break}default:p.tmplInsertionModeStack[0]=InsertionMode.IN_BODY,p.insertionMode=InsertionMode.IN_BODY,startTagInBody(p,token)}}function endTagInTemplate(p,token){token.tagID===TAG_ID.TEMPLATE&&templateEndTagInHead(p,token)}function eofInTemplate(p,token){p.openElements.tmplCount>0?(p.openElements.popUntilTagNamePopped(TAG_ID.TEMPLATE),p.activeFormattingElements.clearToLastMarker(),p.tmplInsertionModeStack.shift(),p._resetInsertionMode(),p.onEof(token)):stopParsing(p,token)}function startTagAfterBody(p,token){token.tagID===TAG_ID.HTML?startTagInBody(p,token):tokenAfterBody(p,token)}function endTagAfterBody(p,token){var _a;if(token.tagID===TAG_ID.HTML){if(p.fragmentContext||(p.insertionMode=InsertionMode.AFTER_AFTER_BODY),p.options.sourceCodeLocationInfo&&p.openElements.tagIDs[0]===TAG_ID.HTML){p._setEndLocation(p.openElements.items[0],token);let bodyElement=p.openElements.items[1];bodyElement&&!(!((_a=p.treeAdapter.getNodeSourceCodeLocation(bodyElement))===null||_a===void 0)&&_a.endTag)&&p._setEndLocation(bodyElement,token)}}else tokenAfterBody(p,token)}function tokenAfterBody(p,token){p.insertionMode=InsertionMode.IN_BODY,modeInBody(p,token)}function startTagInFrameset(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.FRAMESET:{p._insertElement(token,NS.HTML);break}case TAG_ID.FRAME:{p._appendElement(token,NS.HTML),token.ackSelfClosing=!0;break}case TAG_ID.NOFRAMES:{startTagInHead(p,token);break}default:}}function endTagInFrameset(p,token){token.tagID===TAG_ID.FRAMESET&&!p.openElements.isRootHtmlElementCurrent()&&(p.openElements.pop(),!p.fragmentContext&&p.openElements.currentTagId!==TAG_ID.FRAMESET&&(p.insertionMode=InsertionMode.AFTER_FRAMESET))}function startTagAfterFrameset(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.NOFRAMES:{startTagInHead(p,token);break}default:}}function endTagAfterFrameset(p,token){token.tagID===TAG_ID.HTML&&(p.insertionMode=InsertionMode.AFTER_AFTER_FRAMESET)}function startTagAfterAfterBody(p,token){token.tagID===TAG_ID.HTML?startTagInBody(p,token):tokenAfterAfterBody(p,token)}function tokenAfterAfterBody(p,token){p.insertionMode=InsertionMode.IN_BODY,modeInBody(p,token)}function startTagAfterAfterFrameset(p,token){switch(token.tagID){case TAG_ID.HTML:{startTagInBody(p,token);break}case TAG_ID.NOFRAMES:{startTagInHead(p,token);break}default:}}function nullCharacterInForeignContent(p,token){token.chars=REPLACEMENT_CHARACTER,p._insertCharacters(token)}function characterInForeignContent(p,token){p._insertCharacters(token),p.framesetOk=!1}function popUntilHtmlOrIntegrationPoint(p){for(;p.treeAdapter.getNamespaceURI(p.openElements.current)!==NS.HTML&&p.openElements.currentTagId!==void 0&&!p._isIntegrationPoint(p.openElements.currentTagId,p.openElements.current);)p.openElements.pop()}function startTagInForeignContent(p,token){if(causesExit(token))popUntilHtmlOrIntegrationPoint(p),p._startTagOutsideForeignContent(token);else{let current=p._getAdjustedCurrentElement(),currentNs=p.treeAdapter.getNamespaceURI(current);currentNs===NS.MATHML?adjustTokenMathMLAttrs(token):currentNs===NS.SVG&&(adjustTokenSVGTagName(token),adjustTokenSVGAttrs(token)),adjustTokenXMLAttrs(token),token.selfClosing?p._appendElement(token,currentNs):p._insertElement(token,currentNs),token.ackSelfClosing=!0}}function endTagInForeignContent(p,token){if(token.tagID===TAG_ID.P||token.tagID===TAG_ID.BR){popUntilHtmlOrIntegrationPoint(p),p._endTagOutsideForeignContent(token);return}for(let i=p.openElements.stackTop;i>0;i--){let element=p.openElements.items[i];if(p.treeAdapter.getNamespaceURI(element)===NS.HTML){p._endTagOutsideForeignContent(token);break}let tagName=p.treeAdapter.getTagName(element);if(tagName.toLowerCase()===token.tagName){token.tagName=tagName,p.openElements.shortenToLength(i);break}}}var VOID_ELEMENTS=new Set([TAG_NAMES.AREA,TAG_NAMES.BASE,TAG_NAMES.BASEFONT,TAG_NAMES.BGSOUND,TAG_NAMES.BR,TAG_NAMES.COL,TAG_NAMES.EMBED,TAG_NAMES.FRAME,TAG_NAMES.HR,TAG_NAMES.IMG,TAG_NAMES.INPUT,TAG_NAMES.KEYGEN,TAG_NAMES.LINK,TAG_NAMES.META,TAG_NAMES.PARAM,TAG_NAMES.SOURCE,TAG_NAMES.TRACK,TAG_NAMES.WBR]);function parse(html,options){return Parser.parse(html,options)}function getAttribute(node,name){return node.attrs?.find(item=>item.name.toLowerCase()===name.toLowerCase())?.value??null}function getText(node){return node.nodeName==="#text"?node.value??"":(node.childNodes??[]).map(getText).join("")}function cleanText(value){return value?.replace(/\s+/g," ").trim()||null}function extractSeoData(html){let document=parse(html),result={title:null,description:null,canonical:null,robots:null,lang:null,h1Count:0,openGraph:{title:null,description:null,image:null},twitter:{card:null,title:null,description:null,image:null},hreflang:[],jsonLd:[],images:[],links:[],wordCount:0,visibleText:""},textParts=[];function visit(node,hidden=!1){let tagName=node.tagName?.toLowerCase(),excludesText=hidden||tagName==="script"||tagName==="style"||tagName==="noscript"||tagName==="template";if(node.nodeName==="#text"&&!excludesText){let text=cleanText(node.value);text&&textParts.push(text)}if(tagName==="html"&&result.lang===null&&(result.lang=cleanText(getAttribute(node,"lang"))),tagName==="title"&&result.title===null&&(result.title=cleanText(getText(node))),tagName==="h1"&&(result.h1Count+=1),tagName==="meta"){let name=getAttribute(node,"name")?.toLowerCase(),property=getAttribute(node,"property")?.toLowerCase(),content=cleanText(getAttribute(node,"content"));name==="description"&&result.description===null?result.description=content:name==="robots"&&result.robots===null?result.robots=content:property==="og:title"&&result.openGraph.title===null?result.openGraph.title=content:property==="og:description"&&result.openGraph.description===null?result.openGraph.description=content:property==="og:image"&&result.openGraph.image===null?result.openGraph.image=content:name==="twitter:card"&&result.twitter.card===null?result.twitter.card=content:name==="twitter:title"&&result.twitter.title===null?result.twitter.title=content:name==="twitter:description"&&result.twitter.description===null?result.twitter.description=content:name==="twitter:image"&&result.twitter.image===null&&(result.twitter.image=content)}if(tagName==="link"){let rel=getAttribute(node,"rel")?.toLowerCase().split(/\s+/).filter(Boolean)??[];if(rel.includes("canonical")&&result.canonical===null&&(result.canonical=cleanText(getAttribute(node,"href"))),rel.includes("alternate")){let lang=cleanText(getAttribute(node,"hreflang")),url=cleanText(getAttribute(node,"href"));lang&&url&&result.hreflang.push({lang,url})}}if(tagName==="a"){let href=getAttribute(node,"href");href&&result.links.push(href)}if(tagName==="img"&&result.images.push({src:cleanText(getAttribute(node,"src")),alt:getAttribute(node,"alt")}),tagName==="script"&&getAttribute(node,"type")?.toLowerCase()==="application/ld+json"){let source=getText(node).trim();if(source)try{result.jsonLd.push({valid:!0,value:JSON.parse(source)})}catch(error){result.jsonLd.push({valid:!1,error:error instanceof Error?error.message:String(error)})}}for(let child of node.childNodes??[])visit(child,excludesText)}return visit(document),result.visibleText=textParts.join(" "),result.wordCount=result.visibleText?result.visibleText.split(/\s+/u).length:0,result}function emptyPage(url,depth){return{url,finalUrl:null,status:null,contentType:null,blockedByRobots:!1,error:null,title:null,description:null,canonical:null,canonicalRaw:null,robots:null,xRobotsTag:null,lang:null,h1Count:0,openGraph:{title:null,description:null,image:null},twitter:{card:null,title:null,description:null,image:null},hreflang:[],jsonLd:[],images:[],links:[],internalLinks:[],externalLinks:[],wordCount:0,contentHash:null,depth,redirectChain:[],responseBytes:0}}async function emit2(options,event){await options.onEvent?.(event)}async function fetchPage(requestUrl,depth,siteOrigin,options,robots){let page=emptyPage(requestUrl,depth);if(options.respectRobots&&!isAllowedByRobots(requestUrl,robots))return page.blockedByRobots=!0,page;try{let{response,redirectChain}=await fetchWithRetry(requestUrl,{headers:{accept:"text/html,application/xhtml+xml;q=0.9,*/*;q=0.1","user-agent":options.userAgent}},{...options,gate:options.requestGate,onEvent:options.onEvent}),contentType=response.headers.get("content-type")??"",isHtml=contentType.includes("text/html")||contentType.includes("application/xhtml+xml"),finalUrl=normalizeUrl(response.url,void 0,{includeQuery:options.includeQuery});if(page.finalUrl=finalUrl,page.status=response.status,page.contentType=contentType||null,page.xRobotsTag=response.headers.get("x-robots-tag"),page.redirectChain=redirectChain,!isHtml)return await response.body?.cancel(),page;let{text:body,bytes}=await readResponseBody(response,options.maxResponseBytes),seo=extractSeoData(body),baseUrl=finalUrl??requestUrl,canonical=seo.canonical?normalizeUrl(seo.canonical,baseUrl,{includeQuery:!0}):null,links=[...new Set(seo.links.map(link=>normalizeUrl(link,baseUrl,{includeQuery:options.includeQuery})).filter(link=>!!link))].sort(),hreflang=seo.hreflang.map(item=>({lang:item.lang,url:normalizeUrl(item.url,baseUrl,{includeQuery:!0})}));return Object.assign(page,{...seo,visibleText:void 0,canonical,canonicalRaw:seo.canonical,links,internalLinks:links.filter(link=>isSameOrigin(link,siteOrigin)),externalLinks:links.filter(link=>!isSameOrigin(link,siteOrigin)),hreflang,contentHash:seo.visibleText?createHash4("sha256").update(seo.visibleText.toLowerCase()).digest("hex"):null,responseBytes:bytes}),page}catch(error){if(options.signal?.aborted)throw error;return page.error=error instanceof Error?error.message:String(error),error instanceof RequestFailure&&(page.redirectChain=error.redirectChain),page}}function withDefaults(raw={}){let requestDelay=raw.requestDelay??raw.delay??100,providedGate=raw.requestGate;return{...raw,maxPages:raw.maxPages??100,concurrency:Math.max(1,raw.concurrency??5),timeout:raw.timeout??1e4,includeQuery:raw.includeQuery??!1,respectRobots:raw.respectRobots??!0,sitemap:raw.sitemap??null,sitemapData:raw.sitemapData??null,userAgent:raw.userAgent??DEFAULT_USER_AGENT,requestDelay,requestGate:providedGate?async url=>providedGate(url):createPerOriginRequestGate(requestDelay),maxRedirects:raw.maxRedirects??10,maxResponseBytes:raw.maxResponseBytes??5*1024*1024,retries:raw.retries??2,fetch:raw.fetch??globalThis.fetch,logger:raw.logger??NOOP_LOGGER}}async function runPool(concurrency,next){let output=[],workers=Array.from({length:concurrency},async()=>{for(;;){let value=await next();if(value===null)return;output.push(value)}});return await Promise.all(workers),output}async function crawlSite(inputUrl,rawOptions={}){let startedAt=Date.now(),options=withDefaults(rawOptions),startUrl=normalizeUrl(inputUrl,void 0,{includeQuery:options.includeQuery});if(!startUrl)throw new Error(`invalid start URL: ${inputUrl}`);let origin=new URL(startUrl).origin;await emit2(options,{type:"scan-start",url:startUrl,total:options.maxPages});let robots=rawOptions.robots??await fetchRobots(startUrl,options),sitemap=options.sitemapData;if(!sitemap&&options.sitemap)try{sitemap=await loadSitemapUrls(options.sitemap,{...options,maxUrls:rawOptions.sitemapMaxUrls??5e4,siteOrigin:origin})}catch(error){sitemap={url:options.sitemap,urls:[],sitemapCount:0,truncated:!1,error:error instanceof Error?error.message:String(error)},options.logger.warn(`Could not load sitemap ${options.sitemap}: ${sitemap.error}`)}let frontier=[...new Set([startUrl,...sitemap?.urls??[]])].slice(0,options.maxPages).map(url=>({url,depth:0})),scheduled=new Set(frontier.map(item=>item.url)),cached=new Map((rawOptions.cachedPages??[]).map(page=>[page.url,page])),pages=new Map,maxQueueSize=Math.max(options.maxPages*10,options.maxPages),hasMore=!1;for(;frontier.length>0&&pages.size<options.maxPages&&!options.signal?.aborted;){frontier.sort((left,right)=>left.url.localeCompare(right.url));let remaining=options.maxPages-pages.size,current=frontier.slice(0,remaining);frontier.length>current.length&&(hasMore=!0);let cursor=0,completed=await runPool(options.concurrency,async()=>{if(options.signal?.aborted||cursor>=current.length)return null;let item=current[cursor++];if(!item)return null;let page=cached.get(item.url);if(!page)try{page=await fetchPage(item.url,item.depth,origin,options,robots)}catch(error){if(options.signal?.aborted)return null;throw error}return pages.set(item.url,page),cached.has(item.url)||(await rawOptions.onBatch?.([page]),await options.storage?.saveCheckpoint?.(startUrl,page),await emit2(options,{type:"checkpoint",page,completed:pages.size,total:options.maxPages})),rawOptions.onProgress?.(pages.size,options.maxPages),await emit2(options,{type:"page",completed:pages.size,total:options.maxPages,page}),await emit2(options,{type:"progress",completed:pages.size,total:options.maxPages,page}),{item,page}}),next=new Map;for(let{item,page}of completed.sort((left,right)=>left.item.url.localeCompare(right.item.url))){let discoveredLinks=page.internalLinks?.length?page.internalLinks:(page.links??[]).filter(link=>isSameOrigin(link,origin));for(let link of[...discoveredLinks].sort())scheduled.size>=maxQueueSize||scheduled.has(link)||!isCrawlableUrl(link)||(scheduled.add(link),next.set(link,{url:link,depth:item.depth+1}))}frontier=[...next.values()]}let sortedPages=[...pages.values()].sort((left,right)=>left.url.localeCompare(right.url)),partial=!!options.signal?.aborted,truncated=partial||hasMore||frontier.length>0||(sitemap?sitemap.urls.length>sortedPages.length:!1)||(sitemap?.truncated??!1),result={startUrl,pages:sortedPages,robots,sitemap,truncated,partial,durationMs:Date.now()-startedAt,options};return result.snapshot=createBaseline(result),partial||await options.storage?.removeCheckpoint?.(startUrl),partial?await emit2(options,{type:"cancelled",completed:sortedPages.length,total:options.maxPages,partial:!0}):await emit2(options,{type:"complete",completed:sortedPages.length,total:options.maxPages}),result}function isPlan(input){return"planVersion"in input}function checkpointIdentity(plan){return{schemaVersion:2,pageSchemaVersion:1,siteUrl:plan.startUrl,sitemapUrl:plan.sitemap?.url??null,includeQuery:plan.config.includeQuery,respectRobots:plan.config.respectRobots,timeout:plan.config.timeout,maxRedirects:plan.config.maxRedirects,maxResponseBytes:plan.config.maxResponseBytes,userAgent:plan.userAgent}}function reusableCheckpointPage(page){return!page.error&&(page.status===null||page.status<500)}async function scan(input,options={}){let plannedRobots=null,plannedSitemap=null,plan;try{plan=isPlan(input)?input:await planScan(input,{...options,async onEvent(event){event.type==="robots"&&(plannedRobots=event.robots),event.type==="sitemap"&&(plannedSitemap=event.sitemap),await options.onEvent?.(event)}})}catch(error){if(isPlan(input)||!options.signal?.aborted)throw error;let config2=resolveConfig(input),startUrl=normalizeUrl(config2.url,void 0,{includeQuery:config2.includeQuery});if(!startUrl)throw new Error(`invalid start URL: ${config2.url}`,{cause:error});let robots=plannedRobots??{url:new URL("/robots.txt",startUrl).href,status:null,sha256:null,error:"Scan cancelled before robots.txt planning completed",denyAll:!1},snapshot=createBaseline({startUrl,pages:[],robots,sitemap:plannedSitemap,options:config2,partial:!0,truncated:!0});return await options.checkpointStore?.flush?.(),await options.onEvent?.({type:"cancelled",completed:0,total:config2.maxPages,partial:!0}),{snapshot,startUrl,pages:[],robots,sitemap:plannedSitemap,truncated:!0,partial:!0,durationMs:0,options:config2}}if(plan.planVersion!==1)throw new Error(`unsupported scan plan version: ${String(plan.planVersion)}`);let limit=options.limit??plan.config.maxPages;if(!Number.isInteger(limit)||limit<=0)throw new Error("scan limit must be a positive integer");let config={...plan.config,maxPages:limit},requestGate=createPerOriginRequestGate(config.delay),identity=checkpointIdentity(plan),checkpoint=options.checkpointStore&&options.resume!==!1?await options.checkpointStore.load(identity):null,cachedPages=[...options.cachedPages??[],...checkpoint?.pages.filter(reusableCheckpointPage)??[]],uniqueCachedPages=[...new Map(cachedPages.map(page=>[page.url,page])).values()];uniqueCachedPages.length>0&&await options.onEvent?.({type:"resume",completed:uniqueCachedPages.length,total:limit});let result=await crawlSite(plan.startUrl,{...options,maxPages:limit,concurrency:config.concurrency,requestDelay:config.delay,timeout:config.timeout,respectRobots:config.respectRobots,includeQuery:config.includeQuery,maxRedirects:config.maxRedirects,maxResponseBytes:config.maxResponseBytes,enabledRules:config.enabledRules,severityOverrides:config.severityOverrides,suppressions:config.suppressions,regressionBudgets:config.regressionBudgets,report:config.report,requestGate,robots:plan.robots,sitemap:plan.sitemap?.url??null,sitemapData:plan.sitemap,userAgent:plan.userAgent,cachedPages:uniqueCachedPages,async onBatch(pages){for(let page of pages)await options.checkpointStore?.append(identity,page);await options.onBatch?.(pages)}});return await options.checkpointStore?.flush?.(),!result.partial&&!options.retainCheckpoint&&await options.checkpointStore?.clear(identity),result}function segmentToken(segment){return/^\d+$/.test(segment)?":id":/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(segment)?":uuid":/^\d{4}-\d{2}-\d{2}$/.test(segment)?":date":/^[0-9a-f]{16,}$/i.test(segment)?":hash":null}function parseIssueUrls(issues){return issues.flatMap(issue=>{try{let url=new URL(issue.url);return[{issue,url,segments:url.pathname.split("/").filter(Boolean)}]}catch{return[]}})}function dynamicSegments(pages){let siblings=new Map;for(let page of pages)for(let index=1;index<page.segments.length;index+=1){if(segmentToken(page.segments[index]))continue;let prefix=page.segments.slice(0,index).join("/"),key=`${page.url.origin}|${page.segments.length}|${index}|${prefix}`,values=siblings.get(key)??new Set;values.add(page.segments[index]),siblings.set(key,values)}return new Set([...siblings].filter(([,values])=>values.size>=2).map(([key])=>key))}function templateFor(page,dynamic){let segments=page.segments.map((segment,index)=>{let token=segmentToken(segment);if(token)return token;let prefix=page.segments.slice(0,index).join("/"),key=`${page.url.origin}|${page.segments.length}|${index}|${prefix}`;return index>0&&dynamic.has(key)?":slug":segment});return`/${segments.join("/")}${page.url.pathname.endsWith("/")&&segments.length>0?"/":""}`}function groupIssuesByTemplate(issues){let pages=parseIssueUrls(issues),dynamic=dynamicSegments(pages),grouped=new Map;for(let page of pages){let template=templateFor(page,dynamic),key=`${page.url.origin}${template}`,group=grouped.get(key)??{origin:page.url.origin,template,issues:[],urls:new Set};group.issues.push(page.issue),group.urls.add(page.issue.url),grouped.set(key,group)}return[...grouped.values()].map(group=>{let severities={error:0,warning:0,info:0},rules={},owners={};for(let issue of group.issues)severities[issue.severity]+=1,rules[issue.ruleId]=(rules[issue.ruleId]??0)+1,owners[issue.owner]=(owners[issue.owner]??0)+1;let urls=[...group.urls].sort();return{origin:group.origin,template:group.template,issueCount:group.issues.length,affectedPages:urls.length,severities,rules,owners,urls,representativeUrls:urls.slice(0,3)}}).sort((left,right)=>right.issueCount-left.issueCount||left.template.localeCompare(right.template)||left.origin.localeCompare(right.origin))}function englishRuleLabel(ruleId){let text=ruleId.replaceAll("-"," ");return text.charAt(0).toUpperCase()+text.slice(1)}var UK_RULE_LABELS={"page-unreachable":"\u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430","http-error":"HTTP-\u043F\u043E\u043C\u0438\u043B\u043A\u0430",noindex:"Noindex","x-robots-noindex":"Noindex \u0443 X-Robots-Tag","robots-blocked":"\u0417\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E robots.txt","missing-canonical":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 canonical","invalid-canonical":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 canonical","cross-domain-canonical":"Canonical \u043D\u0430 \u0456\u043D\u0448\u043E\u043C\u0443 \u0434\u043E\u043C\u0435\u043D\u0456","canonical-target-error":"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0446\u0456\u043B\u0456 canonical","redirect-loop":"\u0426\u0438\u043A\u043B \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","long-redirect-chain":"\u0414\u043E\u0432\u0433\u0438\u0439 \u043B\u0430\u043D\u0446\u044E\u0436\u043E\u043A \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","sitemap-unavailable":"Sitemap \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439","noindex-in-sitemap":"Noindex \u0443 sitemap","redirect-in-sitemap":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0443 sitemap","missing-title":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 title","duplicate-title":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 title","title-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title","missing-description":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 description","duplicate-description":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 description","description-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description","missing-h1":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 H1","broken-internal-link":"\u041D\u0435\u0440\u043E\u0431\u043E\u0447\u0435 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F","orphan-sitemap-page":"\u0406\u0437\u043E\u043B\u044C\u043E\u0432\u0430\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 sitemap","crawlable-not-in-sitemap":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap","invalid-hreflang":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 hreflang","malformed-json-ld":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON-LD","http-on-https-site":"HTTP URL \u043D\u0430 HTTPS-\u0441\u0430\u0439\u0442\u0456","invalid-language":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435 \u043E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438","duplicate-content":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442","multiple-h1":"\u041A\u0456\u043B\u044C\u043A\u0430 H1","missing-open-graph":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Open Graph metadata","missing-twitter-metadata":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Twitter metadata","image-missing-alt":"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0431\u0435\u0437 alt","low-word-count":"\u041C\u0430\u043B\u043E \u0442\u0435\u043A\u0441\u0442\u0443","robots-changed":"robots.txt \u0437\u043C\u0456\u043D\u0435\u043D\u043E","page-missing":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E","status-regression":"\u0420\u0435\u0433\u0440\u0435\u0441\u0456\u044F HTTP-\u0441\u0442\u0430\u0442\u0443\u0441\u0443","new-noindex":"\u041D\u043E\u0432\u0438\u0439 noindex","title-removed":"Title \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","title-changed":"Title \u0437\u043C\u0456\u043D\u0435\u043D\u043E","description-removed":"Description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-removed":"Canonical \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-changed":"Canonical \u0437\u043C\u0456\u043D\u0435\u043D\u043E","h1-removed":"H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","redirect-changed":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E","sitemap-url-count-drop":"\u0417\u043C\u0435\u043D\u0448\u0435\u043D\u043D\u044F URL \u0443 sitemap"},UK_REMEDIATIONS={"page-unreachable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u043D\u0435\u0457.","http-error":"\u041F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u0443\u0441\u043F\u0456\u0448\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u0435 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F.",noindex:"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0437\u2019\u044F\u0432\u043B\u044F\u0442\u0438\u0441\u044F \u0432 \u043F\u043E\u0448\u0443\u043A\u0443.","x-robots-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex \u0456\u0437 X-Robots-Tag, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0456\u043D\u0434\u0435\u043A\u0441\u0443\u0432\u0430\u0442\u0438\u0441\u044F.","robots-blocked":"\u0414\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 URL \u0443 robots.txt, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438.","missing-canonical":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u0431\u0430\u0436\u0430\u043D\u0438\u0439 canonical URL, \u044F\u043A\u0449\u043E \u043C\u043E\u0436\u043B\u0438\u0432\u0456 \u0434\u0443\u0431\u043B\u0456\u043A\u0430\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0438.","invalid-canonical":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0438\u0439 \u0430\u0431\u043E \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0432\u0456\u0434\u043D\u043E\u0441\u043D\u0438\u0439 HTTP(S) canonical URL.","cross-domain-canonical":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043E\u0432\u043D\u0456\u0448\u043D\u0456\u0439 canonical \u0430\u0431\u043E \u0432\u043A\u0430\u0436\u0456\u0442\u044C \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0438\u0439 URL \u0446\u044C\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0443.","canonical-target-error":"\u0421\u043F\u0440\u044F\u043C\u0443\u0439\u0442\u0435 canonical \u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 URL, \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u0438\u0439 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457.","redirect-loop":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0446\u0438\u043A\u043B\u0456\u0447\u043D\u0438\u0439 \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C.","long-redirect-chain":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0439\u0442\u0435 \u043E\u0434\u0440\u0430\u0437\u0443 \u043D\u0430 \u043A\u0456\u043D\u0446\u0435\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.","sitemap-unavailable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0456 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 XML sitemap.","noindex-in-sitemap":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C URL \u0456\u0437 sitemap \u0430\u0431\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 \u0439\u043E\u0433\u043E \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u044E.","redirect-in-sitemap":"\u0417\u0430\u043C\u0456\u043D\u0456\u0442\u044C URL \u0443 sitemap \u043D\u0430 \u0439\u043E\u0433\u043E \u043A\u0456\u043D\u0446\u0435\u0432\u0443 canonical-\u0430\u0434\u0440\u0435\u0441\u0443.","missing-title":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 \u043E\u043F\u0438\u0441\u043E\u0432\u0438\u0439 HTML title.","duplicate-title":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C title, \u044F\u043A\u0438\u0439 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u043E \u043E\u043F\u0438\u0441\u0443\u0454 \u0446\u044E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443.","title-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C title \u0441\u0442\u0438\u0441\u043B\u0438\u043C \u0456 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u043C, \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 10\u201360 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-description":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","duplicate-description":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 meta description \u0434\u043B\u044F \u0446\u0456\u0454\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.","description-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C description \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043C \u0456 \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0434\u043E\u0432\u0436\u0438\u043D\u043E\u044E 50\u2013160 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-h1":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","broken-internal-link":"\u041E\u043D\u043E\u0432\u0456\u0442\u044C \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0447\u0438 \u0432\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0439\u043E\u0433\u043E \u0446\u0456\u043B\u044C.","orphan-sitemap-page":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0456 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap.","crawlable-not-in-sitemap":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E sitemap \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E \u0432\u0438\u043A\u043B\u044E\u0447\u0456\u0442\u044C \u0457\u0457.","invalid-hreflang":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0456 \u043C\u043E\u0432\u043D\u0456 \u0442\u0435\u0433\u0438 \u0442\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456 HTTP(S) alternate URL.","malformed-json-ld":"\u0412\u0438\u043F\u0440\u0430\u0432\u0442\u0435 JSON-\u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441 \u0443 \u0431\u043B\u043E\u0446\u0456 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043E\u0432\u0430\u043D\u0438\u0445 \u0434\u0430\u043D\u0438\u0445.","http-on-https-site":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 HTTPS \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 URL \u0456 metadata.","invalid-language":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u043C\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u0433 BCP 47 \u0432 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456 html.","duplicate-content":"\u041E\u0431\u2019\u0454\u0434\u043D\u0430\u0439\u0442\u0435 \u0434\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0430\u0431\u043E \u0437\u0440\u043E\u0431\u0456\u0442\u044C \u0457\u0445\u043D\u0456\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0438\u043C.","multiple-h1":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u043E\u0434\u0438\u043D \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 H1 \u043D\u0435 \u0437\u0440\u043E\u0431\u0438\u0442\u044C \u0456\u0454\u0440\u0430\u0440\u0445\u0456\u044E \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0456\u0448\u043E\u044E.","missing-open-graph":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Open Graph title, description \u0442\u0430 image \u0434\u043B\u044F \u043F\u043E\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0432 \u0441\u043E\u0446\u043C\u0435\u0440\u0435\u0436\u0430\u0445.","missing-twitter-metadata":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Twitter card metadata, \u044F\u043A\u0449\u043E \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u0441\u043E\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043F\u0440\u0435\u0432\u2019\u044E.","image-missing-alt":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 alt \u0430\u0431\u043E \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u0439 alt \u0434\u043B\u044F \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u0438\u0445 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C.","low-word-count":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0430\u0442\u043D\u044C\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u043E\u0433\u043E \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0443.","robots-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0437\u043C\u0456\u043D\u0443 robots.txt \u0456 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","page-missing":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0430\u0431\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0457\u0457 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","status-regression":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044E \u0443\u0441\u043F\u0456\u0448\u043D\u0443 HTTP-\u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C.","new-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043D\u043E\u0432\u0438\u0439 noindex, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043D\u0435 \u0434\u043E\u0434\u0430\u043D\u043E \u043D\u0430\u0432\u043C\u0438\u0441\u043D\u043E.","title-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 title.","title-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043C\u0456\u043D\u0435\u043D\u0438\u0439 title.","description-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","canonical-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C canonical.","canonical-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C canonical \u0441\u0432\u0456\u0434\u043E\u043C\u0430 \u0439 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0430.","h1-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","redirect-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0441\u0432\u0456\u0434\u043E\u043C\u0430.","sitemap-url-count-drop":"\u0414\u043E\u0441\u043B\u0456\u0434\u0456\u0442\u044C \u0432\u0442\u0440\u0430\u0442\u0443 URL \u0443 sitemap \u0456 \u043F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u043F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457."};function actual(issue){return issue.evidence?.actual??issue.after}function ukrainianMessage(issue,ruleId){let value=actual(issue);switch(ruleId){case"page-unreachable":case"redirect-loop":return`\u0417\u0430\u043F\u0438\u0442 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430")}`;case"http-error":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u043B\u0430 HTTP ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")}`;case"noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex \u0443 meta";case"x-robots-noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C noindex \u0443 X-Robots-Tag";case"robots-blocked":return issue.before===!1?"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt";case"missing-canonical":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C canonical URL";case"invalid-canonical":return"Canonical URL \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439";case"cross-domain-canonical":return"Canonical \u0432\u043A\u0430\u0437\u0443\u0454 \u043D\u0430 \u0456\u043D\u0448\u0438\u0439 \u0434\u043E\u043C\u0435\u043D";case"canonical-target-error":return"\u0426\u0456\u043B\u044C canonical \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430";case"long-redirect-chain":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454 ${String(value??0)} \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C`;case"sitemap-unavailable":return"\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u0438\u0439 sitemap";case"noindex-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 noindex";case"redirect-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0454\u0442\u044C\u0441\u044F";case"missing-title":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 title";case"duplicate-title":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 title";case"title-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-description":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 meta description";case"duplicate-description":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 meta description";case"description-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-h1":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 H1";case"multiple-h1":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C H1 \u0443 \u043A\u0456\u043B\u044C\u043A\u043E\u0441\u0442\u0456: ${String(value??0)}`;case"broken-internal-link":return"\u0412\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0435\u0434\u0435 \u043D\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443";case"orphan-sitemap-page":return"\u041D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C";case"crawlable-not-in-sitemap":return"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap";case"invalid-hreflang":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F hreflang \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"malformed-json-ld":return"\u0411\u043B\u043E\u043A JSON-LD \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON";case"http-on-https-site":return"HTTPS-\u0441\u0430\u0439\u0442 \u043F\u043E\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0439 HTTP URL";case"invalid-language":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438 HTML \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"duplicate-content":return"\u041E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0454 \u0442\u043E\u0447\u043D\u0438\u043C \u0434\u0443\u0431\u043B\u0435\u043C \u0456\u043D\u0448\u043E\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438";case"missing-open-graph":return"Open Graph metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"missing-twitter-metadata":return"Twitter card metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"image-missing-alt":return`${Array.isArray(value)?value.length:String(value??0)} \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C \u043D\u0435 \u043C\u0430\u044E\u0442\u044C \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 alt`;case"low-word-count":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u043E ${String(value??0)} \u0432\u0438\u0434\u0438\u043C\u0438\u0445 \u0441\u043B\u0456\u0432`;case"robots-changed":return"\u0412\u043C\u0456\u0441\u0442 robots.txt \u0437\u043C\u0456\u043D\u0438\u0432\u0441\u044F";case"page-missing":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u0431\u0443\u043B\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E";case"status-regression":return`HTTP-\u0441\u0442\u0430\u0442\u0443\u0441 \u043F\u043E\u0433\u0456\u0440\u0448\u0438\u0432\u0441\u044F \u0437 ${String(issue.before??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")} \u0434\u043E ${String(issue.after??"\u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439")}`;case"new-noindex":return"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex";case"title-removed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"title-changed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"description-removed":return"Meta description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-removed":return"Canonical URL \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-changed":return"Canonical URL \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"h1-removed":return"\u0423\u0441\u0456 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"redirect-changed":return"\u041A\u0456\u043D\u0446\u0435\u0432\u0438\u0439 URL \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"sitemap-url-count-drop":return`\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C URL \u0443 sitemap \u0437\u043C\u0435\u043D\u0448\u0438\u043B\u0430\u0441\u044F \u043D\u0430 ${String((Number(issue.before)||0)-(Number(issue.after)||0))}`;default:return issue.message??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}function localizeIssue(issue,ruleId){let englishRemediation=issue.remediation??"Review the finding and confirm the intended behavior.";return{en:{rule:englishRuleLabel(ruleId),message:issue.message??"",remediation:englishRemediation},uk:{rule:UK_RULE_LABELS[ruleId]??englishRuleLabel(ruleId),message:ukrainianMessage(issue,ruleId),remediation:UK_REMEDIATIONS[ruleId]??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}}var REPORT_COPY={en:{language:"Language",titles:{partial:"Partial SEO scan report",check:"SEO regression report",scan:"SEO baseline audit"},generated:"Generated",engine:"Engine",rules:"Rules",issueLifecycle:"Issue lifecycle",partialTitle:"Partial results.",partialMessage:"This report contains the pages saved so far. Run the same scan command again to resume without requesting them twice.",incompleteTitle:"Incomplete comparison.",incompleteMessage:"Regressions found on checked pages are shown, but unchecked pages are not marked missing or resolved.",previewTitle:"Preview deployment comparison.",production:"Production",preview:"Preview",cards:{pages:"Pages checked",error:"Errors",warning:"Warnings",info:"Info",affected:"Affected pages"},analytics:{title:"Issue statistics",hint:"Select a chart item to filter the issue table.",severity:"By severity",topRules:"Most frequent checks",owners:"By owner",lifecycle:"By lifecycle",templates:"Affected page templates",total:"Total issues",noData:"No issues to chart.",filterBy:"Filter by"},history:{title:"Local scan history",hint:"Issue trends from snapshots stored on this device.",chartLabel:"Issue trend across runs.",runs:"Runs",pages:"Latest pages",newIssues:"New issues",resolvedIssues:"Resolved issues",sitemapUrls:"Sitemap URLs",maxDepth:"Maximum crawl depth"},tabs:{current:"Current / all",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},filters:{search:"URL or text",searchPlaceholder:"URL, check, or message",severity:"Severity",rule:"Check",template:"Page template",owner:"Owner",rows:"Rows"},all:{severity:"All severities",rule:"All checks",template:"All templates",owner:"All owners"},severities:{error:"Error",warning:"Warning",info:"Info"},owners:{seo:"SEO",content:"Content",developer:"Developer"},rows:{100:"100 per page",250:"250 per page",500:"500 per page"},guide:{error:"Errors",errorText:"need attention first.",warning:"Warnings",warningText:"are important improvements.",info:"Info",infoText:"is useful context.",score:"No opaque SEO score is used."},exportCsv:"Export CSV",previous:"Previous",next:"Next",table:{severity:"Severity",lifecycle:"Lifecycle",ruleOwner:"Check / owner",page:"Page",finding:"What was found",change:"Change",before:"Before",evidence:"Evidence / after",remediation:"Remediation",fingerprint:"Fingerprint"},empty:{cleanTitle:"No SEO issues found",cleanMessage:"The scanned pages passed all current checks.",filteredTitle:"No matching issues",filteredMessage:"Try a different lifecycle tab or clear the selected filters.",clear:"Clear filters"},lifecycle:{current:"Current",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},notPresent:"Not present",page:"Page",of:"of",issue:"issue",issues:"issues",docs:"docs",footer:"Generated locally. No report data was uploaded."},uk:{language:"\u041C\u043E\u0432\u0430",titles:{partial:"\u0417\u0432\u0456\u0442 \u0447\u0430\u0441\u0442\u043A\u043E\u0432\u043E\u0433\u043E SEO-\u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",check:"\u0417\u0432\u0456\u0442 \u043F\u0440\u043E SEO-\u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457",scan:"\u0411\u0430\u0437\u043E\u0432\u0438\u0439 SEO-\u0430\u0443\u0434\u0438\u0442"},generated:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E",engine:"\u0420\u0443\u0448\u0456\u0439",rules:"\u041F\u0440\u0430\u0432\u0438\u043B\u0430",issueLifecycle:"\u0421\u0442\u0430\u043D\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",partialTitle:"\u0427\u0430\u0441\u0442\u043A\u043E\u0432\u0456 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0438.",partialMessage:"\u0417\u0432\u0456\u0442 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0443\u0436\u0435 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438. \u0417\u0430\u043F\u0443\u0441\u0442\u0456\u0442\u044C \u0442\u0443 \u0441\u0430\u043C\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0449\u0435 \u0440\u0430\u0437, \u0449\u043E\u0431 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0431\u0435\u0437 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0438\u0445 \u0437\u0430\u043F\u0438\u0442\u0456\u0432.",incompleteTitle:"\u041D\u0435\u043F\u043E\u0432\u043D\u0435 \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F.",incompleteMessage:"\u041F\u043E\u043A\u0430\u0437\u0430\u043D\u043E \u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457 \u043D\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430\u0445, \u0430\u043B\u0435 \u043D\u0435\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043D\u0435 \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u044F\u043A \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456 \u0447\u0438 \u0432\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456.",previewTitle:"\u041F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F production \u0456 preview.",production:"Production",preview:"Preview",cards:{pages:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A",error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",affected:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438"},analytics:{title:"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",hint:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u0433\u0440\u0430\u0444\u0456\u043A\u0430, \u0449\u043E\u0431 \u0432\u0456\u0434\u0444\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044E \u043F\u0440\u043E\u0431\u043B\u0435\u043C.",severity:"\u0417\u0430 \u0432\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044E",topRules:"\u041D\u0430\u0439\u0447\u0430\u0441\u0442\u0456\u0448\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",owners:"\u0417\u0430 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u043C\u0438",lifecycle:"\u0417\u0430 \u0441\u0442\u0430\u043D\u043E\u043C",templates:"\u0428\u0430\u0431\u043B\u043E\u043D\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0456\u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438",total:"\u0423\u0441\u044C\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C",noData:"\u041D\u0435\u043C\u0430\u0454 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0434\u043B\u044F \u0432\u0456\u0434\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F.",filterBy:"\u0424\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0437\u0430"},history:{title:"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u0430 \u0456\u0441\u0442\u043E\u0440\u0456\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u044C",hint:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0456 snapshot-\u0444\u0430\u0439\u043B\u0456\u0432, \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0445 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457.",chartLabel:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u043C\u0438.",runs:"\u0417\u0430\u043F\u0443\u0441\u043A\u0438",pages:"\u0421\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0432\u043E\u0441\u0442\u0430\u043D\u043D\u0454",newIssues:"\u041D\u043E\u0432\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",resolvedIssues:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",sitemapUrls:"URL \u0443 sitemap",maxDepth:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u0433\u043B\u0438\u0431\u0438\u043D\u0430"},tabs:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0456 / \u0443\u0441\u0456",new:"\u041D\u043E\u0432\u0456",ongoing:"\u0422\u0440\u0438\u0432\u0430\u044E\u0442\u044C",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},filters:{search:"URL \u0430\u0431\u043E \u0442\u0435\u043A\u0441\u0442",searchPlaceholder:"URL, \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0430\u0431\u043E \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",rule:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430",template:"\u0428\u0430\u0431\u043B\u043E\u043D \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438",owner:"\u0412\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",rows:"\u0420\u044F\u0434\u043A\u0438"},all:{severity:"\u0423\u0441\u0456 \u0440\u0456\u0432\u043D\u0456",rule:"\u0423\u0441\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",template:"\u0423\u0441\u0456 \u0448\u0430\u0431\u043B\u043E\u043D\u0438",owner:"\u0423\u0441\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0456"},severities:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F"},owners:{seo:"SEO",content:"\u041A\u043E\u043D\u0442\u0435\u043D\u0442",developer:"\u0420\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A"},rows:{100:"100 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",250:"250 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",500:"500 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443"},guide:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",errorText:"\u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u043F\u0435\u0440\u0448\u043E\u0447\u0435\u0440\u0433\u043E\u0432\u043E\u0457 \u0443\u0432\u0430\u0433\u0438.",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",warningText:"\u043F\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442\u044C \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u043F\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u043D\u044F.",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",infoText:"\u0434\u0430\u0454 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442.",score:"\u041D\u0435\u043F\u0440\u043E\u0437\u043E\u0440\u0430 SEO-\u043E\u0446\u0456\u043D\u043A\u0430 \u043D\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F."},exportCsv:"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 CSV",previous:"\u041D\u0430\u0437\u0430\u0434",next:"\u0414\u0430\u043B\u0456",table:{severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",lifecycle:"\u0421\u0442\u0430\u043D",ruleOwner:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 / \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",finding:"\u0429\u043E \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",change:"\u0417\u043C\u0456\u043D\u0430",before:"\u0411\u0443\u043B\u043E",evidence:"\u0414\u043E\u043A\u0430\u0437 / \u0441\u0442\u0430\u043B\u043E",remediation:"\u042F\u043A \u0432\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438",fingerprint:"\u0412\u0456\u0434\u0431\u0438\u0442\u043E\u043A"},empty:{cleanTitle:"SEO-\u043F\u0440\u043E\u0431\u043B\u0435\u043C \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",cleanMessage:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043F\u0440\u043E\u0439\u0448\u043B\u0438 \u0432\u0441\u0456 \u0430\u043A\u0442\u0438\u0432\u043D\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438.",filteredTitle:"\u0417\u0431\u0456\u0433\u0456\u0432 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",filteredMessage:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0456\u043D\u0448\u0438\u0439 \u0441\u0442\u0430\u043D \u0430\u0431\u043E \u043E\u0447\u0438\u0441\u0442\u044C\u0442\u0435 \u0444\u0456\u043B\u044C\u0442\u0440\u0438.",clear:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0438"},lifecycle:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0430",new:"\u041D\u043E\u0432\u0430",ongoing:"\u0422\u0440\u0438\u0432\u0430\u0454",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},notPresent:"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0454",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",of:"\u0437",issue:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430",issues:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C",docs:"\u0434\u043E\u0432\u0456\u0434\u043A\u0430",footer:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E. \u0414\u0430\u043D\u0456 \u0437\u0432\u0456\u0442\u0443 \u043D\u0456\u043A\u0443\u0434\u0438 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0443\u0432\u0430\u043B\u0438\u0441\u044F."}};function escapeHtml(value){return String(value??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#039;")}function safeJson(value){return JSON.stringify(value).replaceAll("<","\\u003c").replaceAll(">","\\u003e").replaceAll("&","\\u0026")}function normalizeIssue(candidate,fallbackLifecycle="current"){let ruleId=candidate.ruleId??candidate.rule??"unknown";return{fingerprint:candidate.fingerprint??"legacy",ruleId,rule:candidate.rule??candidate.ruleId??"unknown",severity:candidate.severity??"info",scope:candidate.scope??"page",url:candidate.url??"",message:candidate.message??"",evidence:candidate.evidence??{actual:candidate.after},owner:candidate.owner??"seo",remediation:candidate.remediation??"Review the finding and confirm the intended behavior.",documentationUrl:candidate.documentationUrl??"https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md",before:candidate.before,after:candidate.after,lifecycle:candidate.lifecycle??fallbackLifecycle,template:"",localized:localizeIssue(candidate,ruleId)}}function countIssues(issues,key){return issues.reduce((counts,issue)=>{let value=String(issue[key]);return counts[value]=(counts[value]??0)+1,counts},{})}function renderHtmlReport(input,options={}){let mode=input.mode??"scan",pages=input.pages??[],current=(input.issues??[]).map(item=>normalizeIssue(item)),lifecycle2=[...(input.newIssues??[]).map(item=>normalizeIssue(item,"new")),...(input.ongoingIssues??[]).map(item=>normalizeIssue(item,"ongoing")),...(input.resolvedIssues??[]).map(item=>normalizeIssue(item,"resolved")),...(input.unchangedIssues??[]).map(item=>normalizeIssue(item,"unchanged"))],issues=lifecycle2.length>0?lifecycle2:current,templateGroups=groupIssuesByTemplate(issues),templateByUrl=new Map(templateGroups.flatMap(group=>group.urls.map(url=>[url,group.template])));for(let issue of issues)issue.template=templateByUrl.get(issue.url)??"";let counts=issues.reduce((summary,item)=>(summary[item.severity]+=1,summary),{error:0,warning:0,info:0}),affectedPages=new Set(issues.map(item=>item.url)).size,ruleCounts=countIssues(issues,"rule"),statistics={total:issues.length,pagesChecked:pages.length,targetPages:input.targetPages??null,affectedPages,severity:counts,rules:Object.entries(ruleCounts).map(([id,count])=>({id,count})).sort((left,right)=>right.count-left.count||left.id.localeCompare(right.id)),owners:countIssues(issues,"owner"),lifecycle:countIssues(issues,"lifecycle"),templates:templateGroups.map(({template,issueCount,affectedPages:affectedPages2})=>({template,issueCount,affectedPages:affectedPages2}))},partial=input.partial??!1,incompleteComparison=mode==="check"&&input.complete===!1,reportTitle=partial?"Partial SEO scan report":mode==="check"?"SEO regression report":"SEO baseline audit",branding={...input.branding??{},...options.branding??{}},primaryColor=/^#[0-9a-f]{6}$/i.test(branding.primaryColor??"")?branding.primaryColor:"#3157d5",logo=branding.logo&&(/^data:image\//.test(branding.logo)||/^https:\/\//.test(branding.logo))?`<img class="logo" src="${escapeHtml(branding.logo)}" alt="${escapeHtml(branding.agencyName??"Report logo")}">`:"",data=safeJson({mode,issues,statistics,copy:REPORT_COPY,partial,incompleteComparison,comparison:input.comparison??null,history:input.history??null}),generatedAt=input.generatedAt??new Date().toISOString(),startUrl=input.startUrl??"",targetPages=input.targetPages??null,isCheck=mode==="check";return`<!doctype html>
5
8
  <html lang="en">
6
9
  <head>
7
10
  <meta charset="utf-8">
@@ -19,11 +22,11 @@ ${stableStringify(identity??null)}`).digest("hex").slice(0,24)}function createIs
19
22
  </head>
20
23
  <body><main>
21
24
  <header><div class="brand">${logo}<div><div class="eyebrow">${escapeHtml(branding.agencyName??"SEO Crawl Audit")}</div><h1 id="report-title">${escapeHtml(reportTitle)}</h1><div class="meta">${escapeHtml(startUrl)}</div></div></div><div class="meta header-meta"><span id="generated-label">Generated</span> <time id="generated-at" datetime="${escapeHtml(generatedAt)}">${escapeHtml(generatedAt)}</time><br><span id="engine-label">Engine</span> ${escapeHtml(input.engineVersion??ENGINE_VERSION)} \xB7 <span id="rules-label">Rules</span> ${escapeHtml(input.ruleSetVersion??RULE_SET_VERSION)}<label class="language-control"><span id="language-label">Language</span><select id="language" aria-label="Language"><option value="en">English</option><option value="uk">\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430</option></select></label></div></header>
22
- ${partial?` <div class="notice"><strong id="partial-title">Partial results.</strong> <span id="partial-message">This report contains the pages saved so far. Run the same scan command again to resume without requesting them twice.</span></div>`:""}
23
- ${incompleteComparison?` <div class="notice"><strong id="incomplete-title">Incomplete comparison.</strong> <span id="incomplete-message">Regressions found on checked pages are shown, but unchecked pages are not marked missing or resolved.</span></div>`:""}
25
+ ${partial?' <div class="notice"><strong id="partial-title">Partial results.</strong> <span id="partial-message">This report contains the pages saved so far. Run the same scan command again to resume without requesting them twice.</span></div>':""}
26
+ ${incompleteComparison?' <div class="notice"><strong id="incomplete-title">Incomplete comparison.</strong> <span id="incomplete-message">Regressions found on checked pages are shown, but unchecked pages are not marked missing or resolved.</span></div>':""}
24
27
  ${input.comparison?.kind==="preview"?` <div class="notice"><strong id="preview-title">Preview deployment comparison.</strong> <span id="production-label">Production</span>: <a href="${escapeHtml(input.comparison.productionUrl)}">${escapeHtml(input.comparison.productionUrl)}</a> \xB7 <span id="preview-label">Preview</span>: <a href="${escapeHtml(input.comparison.previewUrl)}">${escapeHtml(input.comparison.previewUrl)}</a></div>`:""}
25
28
  <section class="cards"><div class="card"><strong id="pages-count">${pages.length.toLocaleString("en-US")}${targetPages?` / ${targetPages.toLocaleString("en-US")}`:""}</strong><span id="pages-label">Pages checked</span></div><div class="card error"><strong id="errors-count">${counts.error}</strong><span id="errors-label">Errors</span></div><div class="card warning"><strong id="warnings-count">${counts.warning}</strong><span id="warnings-label">Warnings</span></div><div class="card info"><strong id="info-count">${counts.info}</strong><span id="info-label">Info</span></div><div class="card"><strong id="affected-count">${affectedPages.toLocaleString("en-US")}</strong><span id="affected-label">Affected pages</span></div></section>
26
- ${input.history&&input.history.points.length>0?` <section id="history-panel" class="analytics" aria-labelledby="history-title"><div class="analytics-header"><div><h2 id="history-title">Local scan history</h2><div id="history-hint" class="meta">Issue trends from snapshots stored on this device.</div></div></div><div class="trend-layout"><div><svg id="history-chart" class="trend-chart" viewBox="0 0 760 240" role="img"></svg><div class="trend-legend"><span><i class="chart-key error"></i><span id="history-errors-label">Errors</span></span><span><i class="chart-key warning"></i><span id="history-warnings-label">Warnings</span></span><span><i class="chart-key info"></i><span id="history-info-label">Info</span></span></div></div><div id="history-summary" class="trend-summary"></div></div></section>`:""}
29
+ ${input.history&&input.history.points.length>0?' <section id="history-panel" class="analytics" aria-labelledby="history-title"><div class="analytics-header"><div><h2 id="history-title">Local scan history</h2><div id="history-hint" class="meta">Issue trends from snapshots stored on this device.</div></div></div><div class="trend-layout"><div><svg id="history-chart" class="trend-chart" viewBox="0 0 760 240" role="img"></svg><div class="trend-legend"><span><i class="chart-key error"></i><span id="history-errors-label">Errors</span></span><span><i class="chart-key warning"></i><span id="history-warnings-label">Warnings</span></span><span><i class="chart-key info"></i><span id="history-info-label">Info</span></span></div></div><div id="history-summary" class="trend-summary"></div></div></section>':""}
27
30
  <section id="analytics" class="analytics" aria-labelledby="analytics-title">
28
31
  <div class="analytics-header"><div><h2 id="analytics-title">Issue statistics</h2><div id="analytics-hint" class="meta">Select a chart item to filter the issue table.</div></div></div>
29
32
  <div class="analytics-grid">
@@ -84,13 +87,98 @@ ${input.history&&input.history.points.length>0?` <section id="history-panel" cl
84
87
  }
85
88
  for(const element of [search,severity,rule,template,owner,pageSize]){const update=()=>{currentPage=1;render()};element.addEventListener("input",update);element.addEventListener("change",update)}for(const tab of document.querySelectorAll("[data-tab]")){tab.addEventListener("click",()=>{setActiveTab(tab.dataset.tab);currentPage=1;render()})}previous.addEventListener("click",()=>{currentPage-=1;render()});next.addEventListener("click",()=>{currentPage+=1;render()});clearFilters.addEventListener("click",()=>{search.value="";severity.value="";rule.value="";template.value="";owner.value="";setActiveTab("");currentPage=1;render()});language.addEventListener("change",()=>{locale=language.value;applyLocale()});
86
89
  byId("export-csv").addEventListener("click",()=>{const text=copy();const quote=(value)=>'"'+String(value??"").replaceAll('"','""')+'"';const headers=[text.table.severity,text.table.lifecycle,text.table.ruleOwner,text.table.page,report.mode==="check"?text.table.change:text.table.finding,text.table.before,text.table.evidence,text.table.remediation,text.table.fingerprint];const rows=lastFiltered.map((item)=>{const localized=issueText(item);return [text.severities[item.severity],text.lifecycle[item.lifecycle]||item.lifecycle,localized.rule+" \xB7 "+text.owners[item.owner],item.url,localized.message,valueText(item.before),valueText(item.after!==undefined?item.after:item.evidence),localized.remediation,item.fingerprint]});const csv=[headers,...rows].map((row)=>row.map((value)=>quote(typeof value==="object"?JSON.stringify(value):value)).join(",")).join("\\n");const link=document.createElement("a");link.href=URL.createObjectURL(new Blob(["\\uFEFF",csv],{type:"text/csv;charset=utf-8"}));link.download="seo-crawl-audit-"+locale+".csv";link.click();URL.revokeObjectURL(link.href)});applyLocale();
87
- </script></body></html>`}function severityCounts(issues){return issues.reduce((counts,issue)=>{counts[issue.severity]+=1;return counts},{error:0,warning:0,info:0})}function buildHistorySeries(snapshots){if(snapshots.length===0)return null;const unique=new Map(snapshots.map(snapshot=>[`${snapshot.generatedAt}|${snapshot.configurationHash}|${snapshot.pages.length}`,snapshot]));const ordered=[...unique.values()].sort((left,right)=>left.generatedAt.localeCompare(right.generatedAt));const siteUrl=ordered.at(-1).siteUrl;const compatible2=ordered.filter(snapshot=>snapshot.siteUrl===siteUrl);const points=compatible2.map((snapshot,index)=>{const issues=audit(snapshot);const counts=severityCounts(issues);const previous=index>0?compatible2[index-1]:void 0;const comparison=previous?diff(previous,snapshot):null;return{generatedAt:snapshot.generatedAt,siteUrl:snapshot.siteUrl,pages:snapshot.pages.length,affectedPages:new Set(issues.map(issue=>issue.url)).size,errors:counts.error,warnings:counts.warning,info:counts.info,newIssues:comparison?.newIssues.length??0,resolvedIssues:comparison?.resolvedIssues.length??0,sitemapUrls:snapshot.sitemap?.urls.length??0,maxDepth:snapshot.pages.reduce((maximum,page)=>Math.max(maximum,page.depth),0),partial:snapshot.partial||snapshot.truncated}});return{siteUrl,points}}function audit2(snapshot,ruleSet={}){return audit(snapshot,ruleSet)}function diff2(previous,current,ruleSet={}){return diff(previous,current,ruleSet)}import{access,mkdir,readFile,readdir,rename,writeFile}from"node:fs/promises";import{join,resolve}from"node:path";async function findConfigFile(cwd=process.cwd()){const path=resolve(cwd,DEFAULT_CONFIG_FILE);try{await access(path);return path}catch{return null}}async function loadConfig(path){const resolvedPath=path?resolve(path):await findConfigFile();if(!resolvedPath)return{};try{return validateConfig(JSON.parse(await readFile(resolvedPath,"utf8")))}catch(error){throw new Error(`invalid config ${resolvedPath}: ${error instanceof Error?error.message:String(error)}`,{cause:error})}}async function writeSnapshot(path,snapshot){const temporaryPath=`${path}.${process.pid}.tmp`;await writeFile(temporaryPath,`${JSON.stringify(snapshot,null,2)}
88
- `,"utf8");await rename(temporaryPath,path)}async function readSnapshot(path){try{return migrateSnapshot(JSON.parse(await readFile(path,"utf8")))}catch(error){if(error instanceof SyntaxError){throw new Error(`invalid snapshot JSON: ${path}`,{cause:error})}if(error instanceof Error&&error.message.startsWith("unsupported")){throw new Error(`unsupported or invalid baseline: ${path}`,{cause:error})}throw error}}async function writeReport(path,data,options={}){const temporaryPath=`${path}.${process.pid}.tmp`;await writeFile(temporaryPath,renderHtmlReport(data,options),"utf8");await rename(temporaryPath,path)}function historyFileName(snapshot){const timestamp=snapshot.generatedAt.replaceAll(":","-").replaceAll(".","-");return`${timestamp}-${snapshot.configurationHash.slice(0,8)}.snapshot.json`}async function writeHistorySnapshot(directory,snapshot){const resolvedDirectory=resolve(directory);await mkdir(resolvedDirectory,{recursive:true});const path=join(resolvedDirectory,historyFileName(snapshot));await writeSnapshot(path,snapshot);return path}async function readHistorySnapshots(directory,siteUrl){const resolvedDirectory=resolve(directory);let names;try{names=await readdir(resolvedDirectory)}catch(error){if(error&&typeof error==="object"&&"code"in error&&error.code==="ENOENT")return[];throw error}const records=[];for(const name of names.filter(candidate=>candidate.endsWith(".snapshot.json")).sort()){const path=join(resolvedDirectory,name);const snapshot=await readSnapshot(path);if(!siteUrl||snapshot.siteUrl===siteUrl)records.push({path,snapshot})}return records.sort((left,right)=>left.snapshot.generatedAt.localeCompare(right.snapshot.generatedAt)||left.path.localeCompare(right.path))}import{appendFile,readFile as readFile2,rename as rename2,unlink,writeFile as writeFile2}from"node:fs/promises";function header(identity){return{type:"seo-audit-checkpoint",schemaVersion:2,identity}}function compatible(saved,identity){if(!saved||typeof saved!=="object")return false;const candidate=saved;if(candidate.type!=="seo-audit-checkpoint")return false;if(candidate.schemaVersion===2){return JSON.stringify(candidate.identity)===JSON.stringify(identity)}if(candidate.schemaVersion!==1)return false;const source=candidate.source;return source?.startUrl===identity.siteUrl&&(source.sitemap??null)===identity.sitemapUrl&&(source.includeQuery??false)===identity.includeQuery&&(source.respectRobots??true)===identity.respectRobots}var FileCheckpointStore=class{path;#identity=null;#writeQueue=Promise.resolve();constructor(path){this.path=path}async#replace(identity){const temporaryPath=`${this.path}.${process.pid}.${Date.now()}.tmp`;await writeFile2(temporaryPath,`${JSON.stringify(header(identity))}
89
- `,"utf8");await rename2(temporaryPath,this.path);this.#identity=identity}async load(identity){await this.flush();let content;try{content=await readFile2(this.path,"utf8")}catch(error){if(error.code!=="ENOENT")throw error;await this.#replace(identity);return null}const lines=content.split("\n");let savedHeader;try{savedHeader=JSON.parse(lines[0]??"")}catch{await this.#replace(identity);return null}if(!compatible(savedHeader,identity)){await this.#replace(identity);return null}this.#identity=identity;const pages=new Map;const records=lines.slice(1);let lastRecordIndex=records.length-1;while(lastRecordIndex>=0&&!records[lastRecordIndex]?.trim())lastRecordIndex-=1;for(const[index,line]of records.entries()){if(!line.trim())continue;try{const record2=JSON.parse(line);if(record2.type==="page"&&typeof record2.page?.url==="string"){pages.set(record2.page.url,record2.page)}}catch(error){if(index!==lastRecordIndex){throw new Error(`corrupt checkpoint record ${index+2} in ${this.path}`,{cause:error})}}}return{identity,pages:[...pages.values()]}}append(identity,page){this.#writeQueue=this.#writeQueue.then(async()=>{if(!this.#identity||JSON.stringify(this.#identity)!==JSON.stringify(identity)){await this.#replace(identity)}await appendFile(this.path,`${JSON.stringify({type:"page",page})}
90
- `,"utf8")});return this.#writeQueue}async clear(identity){await this.flush();if(this.#identity&&JSON.stringify(this.#identity)!==JSON.stringify(identity))return;try{await unlink(this.path)}catch(error){if(error.code!=="ENOENT")throw error}this.#identity=null}async flush(){await this.#writeQueue}};function createFileCheckpointStore(path){return new FileCheckpointStore(path)}import{extname}from"node:path";function checkpointPathForOutput(output){const extension=extname(output);if(!extension){return`${output}.checkpoint.ndjson`}return`${output.slice(0,-extension.length)}.checkpoint.ndjson`}import{parseArgs}from"node:util";function parseCliArgs(args){return parseArgs({args,allowPositionals:true,strict:true,options:{baseline:{type:"string"},config:{type:"string"},output:{type:"string"},report:{type:"string"},"no-report":{type:"boolean"},"no-cache":{type:"boolean"},pages:{type:"string"},all:{type:"boolean"},"max-pages":{type:"string"},concurrency:{type:"string"},delay:{type:"string"},timeout:{type:"string"},sitemap:{type:"string"},"no-sitemap":{type:"boolean"},"include-query":{type:"boolean"},"ignore-robots":{type:"boolean"},strict:{type:"boolean"},json:{type:"boolean"},help:{type:"boolean"},version:{type:"boolean"},production:{type:"string"},preview:{type:"string"},"production-headers-env":{type:"string"},"preview-headers-env":{type:"string"},"history-dir":{type:"string"},"no-history":{type:"boolean"},from:{type:"string"},to:{type:"string"}}})}function withFileConfig(values,config){return{...values,__config:config}}function integer2(value,name,fallback,allowZero=false){if(value===void 0)return fallback;const parsed=Number.parseInt(value,10);if(!Number.isInteger(parsed)||parsed<(allowZero?0:1)){throw new Error(`${name} must be a ${allowZero?"non-negative":"positive"} integer`)}return parsed}function scanConfig(url,values,baseline){if(values.sitemap&&values["no-sitemap"])throw new Error("--sitemap and --no-sitemap cannot be used together");const saved=baseline?.config??{};const file=values.__config??{};const cli={url,schemaVersion:1,maxPages:integer2(values.pages??values["max-pages"],values.pages!==void 0?"--pages":"--max-pages",file.maxPages??saved.maxPages??100),concurrency:integer2(values.concurrency,"--concurrency",file.concurrency??saved.concurrency??5),delay:integer2(values.delay,"--delay",file.delay??saved.delay??100,true),timeout:integer2(values.timeout,"--timeout",file.timeout??saved.timeout??1e4)};if(values["no-sitemap"])cli.sitemap="none";else if(values.sitemap)cli.sitemap=values.sitemap;if(values["include-query"]!==void 0)cli.includeQuery=values["include-query"];if(values["ignore-robots"]!==void 0)cli.respectRobots=!values["ignore-robots"];return resolveConfig(cli,file,saved)}import{dirname,join as join2,resolve as resolve2}from"node:path";var useColor=process.stdout.isTTY&&!process.env.NO_COLOR;function color(code,value){return useColor?`\x1B[${code}m${value}\x1B[0m`:value}function summarizeIssues(issues){return issues.reduce((summary,issue)=>{summary[issue.severity]+=1;return summary},{error:0,warning:0,info:0})}function printIssues(issues){if(issues.length===0){console.log(color("32","\u2713 No SEO regressions detected."));return}for(const issue of issues){const marker=issue.severity==="error"?color("31","\u2716 error"):issue.severity==="warning"?color("33","\u26A0 warning"):color("34","\u2139 info");console.log(`${marker} ${issue.rule} ${issue.url}`);console.log(` ${issue.message}`);if(issue.before!==void 0||issue.after!==void 0){console.log(` before: ${JSON.stringify(issue.before)}`);console.log(` after: ${JSON.stringify(issue.after)}`)}}const summary=summarizeIssues(issues);console.log(`
91
- ${summary.error} error(s), ${summary.warning} warning(s) detected.`)}import{createInterface}from"node:readline/promises";function parseScanMenuSelection(input,totalPages){const normalized=input.trim().toLowerCase();if(normalized===""||normalized==="1")return{mode:"fixed",target:Math.min(100,totalPages)};if(normalized==="2"||normalized==="all")return{mode:"all",target:totalPages};if(normalized==="3"||normalized==="step")return{mode:"step",target:totalPages};const number=Number.parseInt(normalized,10);return/^\d+$/.test(normalized)&&number>0?{mode:"fixed",target:Math.min(number,totalPages)}:null}async function ask(question){const readline=createInterface({input:process.stdin,output:process.stdout});try{return(await readline.question(question)).trim()}finally{readline.close()}}async function chooseScanPlan(totalPages){while(true){console.log(`
92
- Sitemap contains ${totalPages.toLocaleString("en-US")} page(s).`);console.log("How many pages should be scanned?");console.log(" 1) First 100");console.log(` 2) All ${totalPages.toLocaleString("en-US")}`);console.log(" 3) 100 at a time with confirmation");console.log(" Or enter an exact number, for example 500.");const selection=parseScanMenuSelection(await ask("Choose [1]: "),totalPages);if(!selection){console.log("Enter 1, 2, 3, all, step, or a positive number.");continue}if(selection.mode==="all"){const confirmation=await ask(`This will request ${totalPages.toLocaleString("en-US")} pages. Continue? [y/N] `);if(!["y","yes"].includes(confirmation.toLowerCase()))continue}return selection}}function printProgress(checked,target,persistent=false){const ratio=target===0?1:Math.min(checked/target,1);const percent=(ratio*100).toFixed(ratio<.1?1:0);const filled=Math.round(ratio*20);const message=`[${"\u2588".repeat(filled)}${"\u2591".repeat(20-filled)}] ${percent}% \xB7 ${checked.toLocaleString("en-US")} / ${target.toLocaleString("en-US")} pages`;if(process.stdout.isTTY&&!persistent){process.stdout.write(`\r${message}`);if(checked>=target)process.stdout.write("\n")}else if(process.stdout.isTTY||checked>=target||checked%1e3===0)console.log(message)}function health(pages){return pages.reduce((summary,page)=>{if(page.error||page.blockedByRobots||(page.status??500)>=400)summary.unavailable+=1;if(!page.title)summary.missingTitle+=1;if(!page.description)summary.missingDescription+=1;if(!page.canonical)summary.missingCanonical+=1;if(page.h1Count===0)summary.missingH1+=1;if(/(^|[\s,])noindex($|[\s,])/i.test(page.robots??""))summary.noindex+=1;return summary},{unavailable:0,missingTitle:0,missingDescription:0,missingCanonical:0,missingH1:0,noindex:0})}function printHealth(summary){console.log(`Current health: ${summary.unavailable} unavailable, ${summary.missingTitle} missing title, ${summary.missingDescription} missing description, ${summary.missingCanonical} missing canonical, ${summary.missingH1} missing H1, ${summary.noindex} noindex.`)}var DEFAULT_BASELINE=".seo-audit.json";var DEFAULT_REPORT="seo-audit-report.html";var DEFAULT_HISTORY_DIRECTORY=".seo-audit/history";function reportEnabled(values,force=false){return force||!values["no-report"]&&(values.report!==void 0||process.stdin.isTTY&&process.stdout.isTTY&&!values.json)}async function saveReport(values,data,force=false){if(!reportEnabled(values,force))return null;const output=resolve2(values.report??DEFAULT_REPORT);await writeReport(output,data);return output}function mapUrl(url,fromStart,toStart){if(!url)return url;try{const source=new URL(fromStart);const target=new URL(toStart);const candidate=new URL(url);if(candidate.origin!==source.origin)return url;candidate.protocol=target.protocol;candidate.host=target.host;const sourceRoot=source.pathname.replace(/\/$/,"");const targetRoot=target.pathname.replace(/\/$/,"");if(sourceRoot&&candidate.pathname.startsWith(sourceRoot)){candidate.pathname=`${targetRoot}${candidate.pathname.slice(sourceRoot.length)}`||"/"}return candidate.href}catch{return url}}function mapPage(page,fromStart,toStart){const mapList=values=>values.map(value=>mapUrl(value,fromStart,toStart)??value).sort();return{...page,url:mapUrl(page.url,fromStart,toStart)??page.url,finalUrl:mapUrl(page.finalUrl,fromStart,toStart),canonical:mapUrl(page.canonical,fromStart,toStart),canonicalRaw:mapUrl(page.canonicalRaw,fromStart,toStart),links:mapList(page.links),internalLinks:mapList(page.internalLinks),externalLinks:mapList(page.externalLinks),images:page.images.map(image=>({...image,src:mapUrl(image.src,fromStart,toStart)})),hreflang:page.hreflang.map(alternate=>({...alternate,url:mapUrl(alternate.url,fromStart,toStart)})),redirectChain:page.redirectChain.map(redirect=>({...redirect,url:mapUrl(redirect.url,fromStart,toStart)??redirect.url,location:mapUrl(redirect.location,fromStart,toStart)}))}}function headersFromEnvironment(variableName){if(!variableName)return{};const encoded=process.env[variableName];if(!encoded)throw new Error(`environment variable ${variableName} is empty or missing`);let parsed;try{parsed=JSON.parse(encoded)}catch(error){throw new Error(`environment variable ${variableName} must contain a JSON object`,{cause:error})}if(!parsed||typeof parsed!=="object"||Array.isArray(parsed)){throw new Error(`environment variable ${variableName} must contain a JSON object`)}const headers={};for(const[name,value]of Object.entries(parsed)){if(typeof value!=="string")throw new Error(`header ${name} in ${variableName} must be a string`);headers[name]=value}return headers}function fetchWithHeaders(headers){if(Object.keys(headers).length===0)return globalThis.fetch;return(input,init)=>{const merged=new Headers(init?.headers);for(const[name,value]of Object.entries(headers))merged.set(name,value);return globalThis.fetch(input,{...init,headers:merged})}}function reportData(snapshot,mode,issues=audit2(snapshot),extra={}){return{mode,startUrl:snapshot.siteUrl,generatedAt:snapshot.generatedAt,pages:snapshot.pages,issues,partial:snapshot.partial,engineVersion:snapshot.engineVersion,ruleSetVersion:snapshot.ruleSetVersion,branding:snapshot.config.report,...extra}}function historyDirectory(values,referencePath){if(values["history-dir"])return resolve2(values["history-dir"]);return referencePath?join2(dirname(referencePath),DEFAULT_HISTORY_DIRECTORY):resolve2(DEFAULT_HISTORY_DIRECTORY)}async function updateHistory(values,snapshot,referencePath,save){if(values["no-history"])return void 0;const directory=historyDirectory(values,referencePath);if(save&&!snapshot.partial)await writeHistorySnapshot(directory,snapshot);const records=await readHistorySnapshots(directory,snapshot.siteUrl);return buildHistorySeries(records.map(record2=>record2.snapshot))??void 0}async function resolvePlan(url,values,baseline,signal){let config=scanConfig(url,values,baseline);let plan=await planScan(config,{signal});if(plan.mode==="links"&&config.sitemap==="auto"&&process.stdin.isTTY&&process.stdout.isTTY&&!values.json){const entered=await ask("Sitemap was not found. Enter its full URL, or press Enter to crawl internal links: ");if(entered){config={...config,sitemap:entered};plan=await planScan(config,{signal})}}return plan}function selectScan(plan,values){if(plan.candidateCount===null){if(values.all)throw new Error("--all requires a sitemap");return{mode:"fixed",target:plan.config.maxPages}}if(values.all)return{mode:"all",target:plan.candidateCount};if(values.pages!==void 0||values["max-pages"]!==void 0){return{mode:"fixed",target:Math.min(plan.config.maxPages,plan.candidateCount)}}if(process.stdin.isTTY&&process.stdout.isTTY&&!values.json)return chooseScanPlan(plan.candidateCount);return{mode:"fixed",target:Math.min(100,plan.candidateCount)}}async function scanCommand(url,values,signal){if(!url)throw new Error("scan requires a URL");const output=resolve2(values.output??DEFAULT_BASELINE);const plan=await resolvePlan(url,values,void 0,signal);const selection=await selectScan(plan,values);const checkpointPath=checkpointPathForOutput(output);const store=values["no-cache"]?void 0:createFileCheckpointStore(checkpointPath);const collected=new Map;const partialReportPath=reportEnabled(values)?resolve2(values.report??DEFAULT_REPORT):null;let lastReportAt=0;let lastReportCount=-1;const writePartial=async(force=false)=>{if(!partialReportPath||collected.size===0)return;const now=Date.now();if(!force&&collected.size-lastReportCount<100&&now-lastReportAt<5e3)return;const partialSnapshot=migrateSnapshot({schemaVersion:1,startUrl:plan.startUrl,robots:plan.robots,sitemap:plan.sitemap,options:{...plan.config,maxPages:selection.target},pages:[...collected.values()],partial:true,truncated:true});await writeReport(partialReportPath,reportData(partialSnapshot,"scan",audit2(partialSnapshot),{partial:true,targetPages:selection.target}));lastReportAt=now;lastReportCount=collected.size};let requested=selection.mode==="step"?Math.min(100,selection.target):selection.target;let result=null;let stoppedEarly=false;while(requested>0){result=await scan(plan,{signal,limit:requested,checkpointStore:store,retainCheckpoint:selection.mode==="step"&&requested<selection.target,async onBatch(pages){for(const page of pages)collected.set(page.url,page);await writePartial()},onEvent(event){if(event.type==="progress"&&!values.json)printProgress(event.completed,requested,selection.mode==="step")}});for(const page of result.pages)collected.set(page.url,page);await writePartial(true);if(result.partial||selection.mode!=="step"||requested>=selection.target)break;printHealth(health(result.pages));const nextSize=Math.min(100,selection.target-requested);const answer=await ask(`Check the next ${nextSize} page(s)? [y/N] `);if(!["y","yes"].includes(answer.toLowerCase())){stoppedEarly=true;break}requested=Math.min(selection.target,requested+100)}if(!result)throw new Error("scan did not produce a result");await writeSnapshot(output,result.snapshot);const incomplete=result.partial||stoppedEarly;const history=await updateHistory(values,result.snapshot,output,!incomplete);const finalReport=incomplete?partialReportPath:await saveReport(values,reportData(result.snapshot,"scan",audit2(result.snapshot),history?{history}:{}));const summary=health(result.snapshot.pages);if(values.json){console.log(JSON.stringify({command:"scan",pages:result.snapshot.pages.length,truncated:result.snapshot.truncated,health:summary,output,report:finalReport,checkpoint:incomplete&&store?checkpointPath:null},null,2))}else{console.log(`Crawled ${result.snapshot.pages.length} page(s)${result.snapshot.truncated?" (limit reached)":""}.`);if(result.snapshot.sitemap)console.log(`Loaded ${result.snapshot.sitemap.sitemapCount} sitemap file(s) from ${result.snapshot.sitemap.url}.`);printHealth(summary);console.log(`Baseline saved to ${output}`);if(finalReport)console.log(`HTML report saved to ${finalReport}`);if(incomplete&&store)console.log(`Resume checkpoint saved to ${checkpointPath}`)}return result.partial?130:0}async function checkCommand(url,values,signal){const baselinePath=resolve2(values.baseline??DEFAULT_BASELINE);const baseline=await readSnapshot(baselinePath);const targetStart=url??baseline.siteUrl;const basePlan=await planScan({...scanConfig(targetStart,values,baseline),sitemap:"none"},{signal});const targets=baseline.pages.map(page=>({baselineUrl:page.url,targetUrl:mapUrl(page.url,baseline.siteUrl,basePlan.startUrl)??page.url}));const targetUrls=[...new Set(targets.map(({targetUrl})=>targetUrl))];const plan={...basePlan,mode:"sitemap",candidateUrls:targetUrls,candidateCount:targetUrls.length,sitemap:{url:`${basePlan.origin}/.seo-audit-targets`,urls:targetUrls,sitemapCount:0,truncated:false,error:null}};const result=await scan(plan,{signal,limit:targetUrls.length,onEvent(event){if(event.type==="progress"&&!values.json)printProgress(event.completed,targetUrls.length)}});const checked=new Map(result.pages.map(page=>[page.url,page]));const pages=targets.flatMap(({baselineUrl,targetUrl})=>{const page=checked.get(targetUrl);return page?[{...page,url:baselineUrl,finalUrl:mapUrl(page.finalUrl,basePlan.startUrl,baseline.siteUrl)}]:[]});const current=migrateSnapshot({...result.snapshot,siteUrl:baseline.siteUrl,config:{...result.snapshot.config,url:baseline.siteUrl},sitemap:baseline.sitemap,pages});const comparison=diff2(baseline,current,{enabledRules:current.config.enabledRules,severityOverrides:current.config.severityOverrides,suppressions:current.config.suppressions});const issues=comparison.newIssues;const summary=summarizeIssues(issues);const history=await updateHistory(values,current,baselinePath,!result.partial);const report=await saveReport(values,reportData(current,"check",issues,{...comparison,...history?{history}:{}}));if(values.json)console.log(JSON.stringify({command:"check",baseline:baselinePath,pages:current.pages.length,summary,issues,lifecycle:comparison,report},null,2));else{console.log(`Checked ${current.pages.length} page(s).
93
- `);printIssues(issues);if(report)console.log(`HTML report saved to ${report}`)}if(result.partial)return 130;return summary.error>0||comparison.budgetExceeded.length>0||values.strict&&summary.warning>0?1:0}async function compareCommand(values,signal){const productionUrl=values.production;const previewUrl=values.preview;if(!productionUrl||!previewUrl)throw new Error("compare requires --production and --preview URLs");const productionFetch=fetchWithHeaders(headersFromEnvironment(values["production-headers-env"]));const previewFetch=fetchWithHeaders(headersFromEnvironment(values["preview-headers-env"]));const productionPlan=await planScan(scanConfig(productionUrl,values),{signal,fetch:productionFetch});const selection=await selectScan(productionPlan,values);const production=await scan(productionPlan,{signal,fetch:productionFetch,limit:selection.target,onEvent(event){if(event.type==="progress"&&!values.json)printProgress(event.completed,selection.target)}});if(production.partial)return 130;const previewBasePlan=await planScan({...scanConfig(previewUrl,values),sitemap:"none"},{signal,fetch:previewFetch});const targetUrls=production.snapshot.pages.map(page=>mapUrl(page.url,productionUrl,previewUrl)??page.url);const previewPlan={...previewBasePlan,mode:"sitemap",candidateUrls:[...new Set(targetUrls)].sort(),candidateCount:targetUrls.length,sitemap:{url:`${previewBasePlan.origin}/.seo-audit-preview-targets`,urls:[...new Set(targetUrls)].sort(),sitemapCount:0,truncated:false,error:null}};const preview=await scan(previewPlan,{signal,fetch:previewFetch,limit:targetUrls.length,onEvent(event){if(event.type==="progress"&&!values.json)printProgress(event.completed,targetUrls.length)}});const previewPages=preview.snapshot.pages.map(page=>mapPage(page,previewUrl,productionUrl));const current=migrateSnapshot({...preview.snapshot,siteUrl:production.snapshot.siteUrl,startUrl:production.snapshot.siteUrl,config:{...preview.snapshot.config,url:production.snapshot.siteUrl},robots:{...preview.snapshot.robots,url:mapUrl(preview.snapshot.robots.url,previewUrl,productionUrl)??preview.snapshot.robots.url},sitemap:production.snapshot.sitemap,pages:previewPages,partial:preview.snapshot.partial});const comparison=diff2(production.snapshot,current,{enabledRules:current.config.enabledRules,severityOverrides:current.config.severityOverrides,suppressions:current.config.suppressions});const issues=comparison.newIssues;const summary=summarizeIssues(issues);const report=await saveReport(values,reportData(current,"check",issues,{...comparison,comparison:{kind:"preview",productionUrl,previewUrl}}),true);if(values.json){console.log(JSON.stringify({command:"compare",production:productionUrl,preview:previewUrl,pages:current.pages.length,summary,issues,lifecycle:comparison,report},null,2))}else{console.log(`Compared ${current.pages.length} production page(s) with preview.`);printIssues(issues);if(report)console.log(`HTML report saved to ${report}`)}if(preview.partial)return 130;return summary.error>0||comparison.budgetExceeded.length>0||values.strict&&summary.warning>0?1:0}async function reportCommand(inputPath,values){const baselinePath=resolve2(inputPath??values.baseline??DEFAULT_BASELINE);const baseline=await readSnapshot(baselinePath);const history=await updateHistory(values,baseline,baselinePath,false);const report=await saveReport(values,reportData(baseline,"scan",audit2(baseline),history?{history}:{}),true);if(values.json)console.log(JSON.stringify({command:"report",baseline:baselinePath,pages:baseline.pages.length,report},null,2));else console.log(`HTML report saved to ${report}`);return 0}async function historyCommand(siteUrl,values){if(Boolean(values.from)!==Boolean(values.to))throw new Error("history comparison requires both --from and --to");const directory=historyDirectory(values);if(values.from&&values.to){const previous=await readSnapshot(resolve2(values.from));const current=await readSnapshot(resolve2(values.to));if(previous.siteUrl!==current.siteUrl)throw new Error("history snapshots must belong to the same site URL");const records2=await readHistorySnapshots(directory,current.siteUrl);const history2=buildHistorySeries([...records2.map(record2=>record2.snapshot),previous,current]);const comparison=diff2(previous,current,{enabledRules:current.config.enabledRules,severityOverrides:current.config.severityOverrides,suppressions:current.config.suppressions});const report2=await saveReport(values,reportData(current,"check",comparison.newIssues,{...comparison,...history2?{history:history2}:{}}),true);const summary=summarizeIssues(comparison.newIssues);if(values.json)console.log(JSON.stringify({command:"history",from:resolve2(values.from),to:resolve2(values.to),summary,lifecycle:comparison,report:report2},null,2));else{console.log(`Compared local snapshots from ${previous.generatedAt} to ${current.generatedAt}.`);printIssues(comparison.newIssues);if(report2)console.log(`HTML report saved to ${report2}`)}return 0}let normalizedSiteUrl;if(siteUrl){try{normalizedSiteUrl=new URL(siteUrl).href}catch{throw new Error("history URL must be an HTTP(S) URL")}}let records=await readHistorySnapshots(directory,normalizedSiteUrl);if(records.length===0)throw new Error(`no local history snapshots found in ${directory}`);if(!normalizedSiteUrl){const latestSiteUrl=records.at(-1).snapshot.siteUrl;records=records.filter(record2=>record2.snapshot.siteUrl===latestSiteUrl)}const latest=records.at(-1);const history=buildHistorySeries(records.map(record2=>record2.snapshot));const report=await saveReport(values,reportData(latest.snapshot,"scan",audit2(latest.snapshot),history?{history}:{}),true);const points=history?.points??[];if(values.json)console.log(JSON.stringify({command:"history",directory,snapshots:records.map((record2,index)=>({path:record2.path,...points[index]})),report},null,2));else{console.log(`Local history for ${latest.snapshot.siteUrl}:`);for(const[index,record2]of records.entries()){const point=points[index];console.log(` ${record2.snapshot.generatedAt} ${point?.pages??record2.snapshot.pages.length} pages ${point?.errors??0} errors ${point?.warnings??0} warnings ${record2.path}`)}if(report)console.log(`HTML report saved to ${report}`)}return 0}var HELP=`seo-audit ${ENGINE_VERSION}
90
+ </script></body></html>`}function severityCounts(issues){return issues.reduce((counts,issue)=>(counts[issue.severity]+=1,counts),{error:0,warning:0,info:0})}function buildHistorySeries(snapshots){if(snapshots.length===0)return null;let ordered=[...new Map(snapshots.map(snapshot=>[`${snapshot.generatedAt}|${snapshot.configurationHash}|${snapshot.pages.length}`,snapshot])).values()].sort((left,right)=>left.generatedAt.localeCompare(right.generatedAt)),siteUrl=ordered.at(-1).siteUrl,compatible2=ordered.filter(snapshot=>snapshot.siteUrl===siteUrl),points=compatible2.map((snapshot,index)=>{let issues=audit(snapshot),counts=severityCounts(issues),previous=index>0?compatible2[index-1]:void 0,comparison=previous?diff(previous,snapshot):null;return{generatedAt:snapshot.generatedAt,siteUrl:snapshot.siteUrl,pages:snapshot.pages.length,affectedPages:new Set(issues.map(issue=>issue.url)).size,errors:counts.error,warnings:counts.warning,info:counts.info,newIssues:comparison?.newIssues.length??0,resolvedIssues:comparison?.resolvedIssues.length??0,sitemapUrls:snapshot.sitemap?.urls.length??0,maxDepth:snapshot.pages.reduce((maximum,page)=>Math.max(maximum,page.depth),0),partial:snapshot.partial||snapshot.truncated}});return{siteUrl,points}}function audit2(snapshot,ruleSet={}){return audit(snapshot,ruleSet)}function diff2(previous,current,ruleSet={}){return diff(previous,current,ruleSet)}import{access,mkdir,readFile,readdir,rename,writeFile}from"node:fs/promises";import{join,resolve}from"node:path";async function findConfigFile(cwd=process.cwd()){let path=resolve(cwd,DEFAULT_CONFIG_FILE);try{return await access(path),path}catch{return null}}async function loadConfig(path){let resolvedPath=path?resolve(path):await findConfigFile();if(!resolvedPath)return{};try{return validateConfig(JSON.parse(await readFile(resolvedPath,"utf8")))}catch(error){throw new Error(`invalid config ${resolvedPath}: ${error instanceof Error?error.message:String(error)}`,{cause:error})}}async function writeSnapshot(path,snapshot){let temporaryPath=`${path}.${process.pid}.tmp`;await writeFile(temporaryPath,`${JSON.stringify(snapshot,null,2)}
91
+ `,"utf8"),await rename(temporaryPath,path)}async function readSnapshot(path){try{return migrateSnapshot(JSON.parse(await readFile(path,"utf8")))}catch(error){throw error instanceof SyntaxError?new Error(`invalid snapshot JSON: ${path}`,{cause:error}):error instanceof Error&&error.message.startsWith("unsupported")?new Error(`unsupported or invalid baseline: ${path}`,{cause:error}):error}}async function writeReport(path,data,options={}){let temporaryPath=`${path}.${process.pid}.tmp`;await writeFile(temporaryPath,renderHtmlReport(data,options),"utf8"),await rename(temporaryPath,path)}function historyFileName(snapshot){return`${snapshot.generatedAt.replaceAll(":","-").replaceAll(".","-")}-${snapshot.configurationHash.slice(0,8)}.snapshot.json`}async function writeHistorySnapshot(directory,snapshot){let resolvedDirectory=resolve(directory);await mkdir(resolvedDirectory,{recursive:!0});let path=join(resolvedDirectory,historyFileName(snapshot));return await writeSnapshot(path,snapshot),path}async function readHistorySnapshots(directory,siteUrl){let resolvedDirectory=resolve(directory),names;try{names=await readdir(resolvedDirectory)}catch(error){if(error&&typeof error=="object"&&"code"in error&&error.code==="ENOENT")return[];throw error}let records=[];for(let name of names.filter(candidate=>candidate.endsWith(".snapshot.json")).sort()){let path=join(resolvedDirectory,name),snapshot=await readSnapshot(path);(!siteUrl||snapshot.siteUrl===siteUrl)&&records.push({path,snapshot})}return records.sort((left,right)=>left.snapshot.generatedAt.localeCompare(right.snapshot.generatedAt)||left.path.localeCompare(right.path))}import{appendFile,readFile as readFile2,rename as rename2,unlink,writeFile as writeFile2}from"node:fs/promises";function header(identity){return{type:"seo-audit-checkpoint",schemaVersion:2,identity}}function compatible(saved,identity){if(!saved||typeof saved!="object")return!1;let candidate=saved;if(candidate.type!=="seo-audit-checkpoint")return!1;if(candidate.schemaVersion===2)return JSON.stringify(candidate.identity)===JSON.stringify(identity);if(candidate.schemaVersion!==1)return!1;let source=candidate.source;return source?.startUrl===identity.siteUrl&&(source.sitemap??null)===identity.sitemapUrl&&(source.includeQuery??!1)===identity.includeQuery&&(source.respectRobots??!0)===identity.respectRobots}var FileCheckpointStore=class{path;#identity=null;#writeQueue=Promise.resolve();constructor(path){this.path=path}async#replace(identity){let temporaryPath=`${this.path}.${process.pid}.${Date.now()}.tmp`;await writeFile2(temporaryPath,`${JSON.stringify(header(identity))}
92
+ `,"utf8"),await rename2(temporaryPath,this.path),this.#identity=identity}async load(identity){await this.flush();let content;try{content=await readFile2(this.path,"utf8")}catch(error){if(error.code!=="ENOENT")throw error;return await this.#replace(identity),null}let lines=content.split(`
93
+ `),savedHeader;try{savedHeader=JSON.parse(lines[0]??"")}catch{return await this.#replace(identity),null}if(!compatible(savedHeader,identity))return await this.#replace(identity),null;this.#identity=identity;let pages=new Map,records=lines.slice(1),lastRecordIndex=records.length-1;for(;lastRecordIndex>=0&&!records[lastRecordIndex]?.trim();)lastRecordIndex-=1;for(let[index,line]of records.entries())if(line.trim())try{let record2=JSON.parse(line);record2.type==="page"&&typeof record2.page?.url=="string"&&pages.set(record2.page.url,record2.page)}catch(error){if(index!==lastRecordIndex)throw new Error(`corrupt checkpoint record ${index+2} in ${this.path}`,{cause:error})}return{identity,pages:[...pages.values()]}}append(identity,page){return this.#writeQueue=this.#writeQueue.then(async()=>{(!this.#identity||JSON.stringify(this.#identity)!==JSON.stringify(identity))&&await this.#replace(identity),await appendFile(this.path,`${JSON.stringify({type:"page",page})}
94
+ `,"utf8")}),this.#writeQueue}async clear(identity){if(await this.flush(),!(this.#identity&&JSON.stringify(this.#identity)!==JSON.stringify(identity))){try{await unlink(this.path)}catch(error){if(error.code!=="ENOENT")throw error}this.#identity=null}}async flush(){await this.#writeQueue}};function createFileCheckpointStore(path){return new FileCheckpointStore(path)}import{extname}from"node:path";function checkpointPathForOutput(output){let extension=extname(output);return extension?`${output.slice(0,-extension.length)}.checkpoint.ndjson`:`${output}.checkpoint.ndjson`}import{parseArgs}from"node:util";function parseCliArgs(args){return parseArgs({args,allowPositionals:!0,strict:!0,options:{baseline:{type:"string"},config:{type:"string"},output:{type:"string"},report:{type:"string"},"no-report":{type:"boolean"},"no-cache":{type:"boolean"},pages:{type:"string"},all:{type:"boolean"},"max-pages":{type:"string"},concurrency:{type:"string"},delay:{type:"string"},timeout:{type:"string"},sitemap:{type:"string"},"no-sitemap":{type:"boolean"},"include-query":{type:"boolean"},"ignore-robots":{type:"boolean"},strict:{type:"boolean"},json:{type:"boolean"},help:{type:"boolean"},version:{type:"boolean"},production:{type:"string"},preview:{type:"string"},"headers-env":{type:"string"},"production-headers-env":{type:"string"},"preview-headers-env":{type:"string"},"history-dir":{type:"string"},"no-history":{type:"boolean"},from:{type:"string"},to:{type:"string"},directory:{type:"string"},workflow:{type:"string"},yes:{type:"boolean"},force:{type:"boolean"},offline:{type:"boolean"},platform:{type:"string"}}})}function withFileConfig(values,config){return{...values,__config:config}}function integer2(value,name,fallback,allowZero=!1){if(value===void 0)return fallback;let parsed=Number.parseInt(value,10);if(!Number.isInteger(parsed)||parsed<(allowZero?0:1))throw new Error(`${name} must be a ${allowZero?"non-negative":"positive"} integer`);return parsed}function scanConfig(url,values,baseline){if(values.sitemap&&values["no-sitemap"])throw new Error("--sitemap and --no-sitemap cannot be used together");let saved=baseline?.config??{},file=values.__config??{},cli={url,schemaVersion:1,maxPages:integer2(values.pages??values["max-pages"],values.pages!==void 0?"--pages":"--max-pages",file.maxPages??saved.maxPages??100),concurrency:integer2(values.concurrency,"--concurrency",file.concurrency??saved.concurrency??5),delay:integer2(values.delay,"--delay",file.delay??saved.delay??100,!0),timeout:integer2(values.timeout,"--timeout",file.timeout??saved.timeout??1e4)};return values["no-sitemap"]?cli.sitemap="none":values.sitemap&&(cli.sitemap=values.sitemap),values["include-query"]!==void 0&&(cli.includeQuery=values["include-query"]),values["ignore-robots"]!==void 0&&(cli.respectRobots=!values["ignore-robots"]),resolveConfig(cli,file,saved)}import{dirname,join as join2,resolve as resolve2}from"node:path";var useColor=process.stdout.isTTY&&!process.env.NO_COLOR;function color(code,value){return useColor?`\x1B[${code}m${value}\x1B[0m`:value}function summarizeIssues(issues){return issues.reduce((summary,issue)=>(summary[issue.severity]+=1,summary),{error:0,warning:0,info:0})}function printIssues(issues){if(issues.length===0){console.log(color("32","\u2713 No SEO regressions detected."));return}for(let issue of issues){let marker=issue.severity==="error"?color("31","\u2716 error"):issue.severity==="warning"?color("33","\u26A0 warning"):color("34","\u2139 info");console.log(`${marker} ${issue.rule} ${issue.url}`),console.log(` ${issue.message}`),(issue.before!==void 0||issue.after!==void 0)&&(console.log(` before: ${JSON.stringify(issue.before)}`),console.log(` after: ${JSON.stringify(issue.after)}`))}let summary=summarizeIssues(issues);console.log(`
95
+ ${summary.error} error(s), ${summary.warning} warning(s) detected.`)}import{createHash as createHash5}from"node:crypto";function headersFromEnvironment(variableName){if(!variableName)return{};let encoded=process.env[variableName];if(!encoded)throw new Error(`environment variable ${variableName} is empty or missing`);let parsed;try{parsed=JSON.parse(encoded)}catch(error){throw new Error(`environment variable ${variableName} must contain a JSON object`,{cause:error})}if(!parsed||typeof parsed!="object"||Array.isArray(parsed))throw new Error(`environment variable ${variableName} must contain a JSON object`);let headers={};for(let[name,value]of Object.entries(parsed)){if(typeof value!="string")throw new Error(`header ${name} in ${variableName} must be a string`);try{new Headers({[name]:value})}catch(error){throw new Error(`header ${name} in ${variableName} is invalid`,{cause:error})}headers[name]=value}return headers}function fetchWithHeaders(headers,targetUrl,baseFetch=globalThis.fetch){if(Object.keys(headers).length===0)return baseFetch;let targetOrigin=new URL(targetUrl).origin;return(input,init)=>{let requestUrl=input instanceof Request?input.url:String(input);if(new URL(requestUrl).origin!==targetOrigin)return baseFetch(input,init);let merged=new Headers(input instanceof Request?input.headers:void 0);new Headers(init?.headers).forEach((value,name)=>merged.set(name,value));for(let[name,value]of Object.entries(headers))merged.set(name,value);return baseFetch(input,{...init,headers:merged})}}function requestFetch(variableName,targetUrl,baseFetch=globalThis.fetch){return fetchWithHeaders(headersFromEnvironment(variableName),targetUrl,baseFetch)}function checkpointPathForRequestHeaders(path,variableName){if(!variableName)return path;let profile=createHash5("sha256").update(variableName).digest("hex").slice(0,12);return path.endsWith(".ndjson")?`${path.slice(0,-7)}.auth-${profile}.ndjson`:`${path}.auth-${profile}`}import{createInterface}from"node:readline/promises";function parseScanMenuSelection(input,totalPages){let normalized=input.trim().toLowerCase();if(normalized===""||normalized==="1")return{mode:"fixed",target:Math.min(100,totalPages)};if(normalized==="2"||normalized==="all")return{mode:"all",target:totalPages};if(normalized==="3"||normalized==="step")return{mode:"step",target:totalPages};let number=Number.parseInt(normalized,10);return/^\d+$/.test(normalized)&&number>0?{mode:"fixed",target:Math.min(number,totalPages)}:null}async function ask(question){let readline=createInterface({input:process.stdin,output:process.stdout});try{return(await readline.question(question)).trim()}finally{readline.close()}}async function chooseScanPlan(totalPages){for(;;){console.log(`
96
+ Sitemap contains ${totalPages.toLocaleString("en-US")} page(s).`),console.log("How many pages should be scanned?"),console.log(" 1) First 100"),console.log(` 2) All ${totalPages.toLocaleString("en-US")}`),console.log(" 3) 100 at a time with confirmation"),console.log(" Or enter an exact number, for example 500.");let selection=parseScanMenuSelection(await ask("Choose [1]: "),totalPages);if(!selection){console.log("Enter 1, 2, 3, all, step, or a positive number.");continue}if(selection.mode==="all"){let confirmation=await ask(`This will request ${totalPages.toLocaleString("en-US")} pages. Continue? [y/N] `);if(!["y","yes"].includes(confirmation.toLowerCase()))continue}return selection}}function printProgress(checked,target,persistent=!1){let ratio=target===0?1:Math.min(checked/target,1),percent=(ratio*100).toFixed(ratio<.1?1:0),filled=Math.round(ratio*20),message=`[${"\u2588".repeat(filled)}${"\u2591".repeat(20-filled)}] ${percent}% \xB7 ${checked.toLocaleString("en-US")} / ${target.toLocaleString("en-US")} pages`;process.stdout.isTTY&&!persistent?(process.stdout.write(`\r${message}`),checked>=target&&process.stdout.write(`
97
+ `)):(process.stdout.isTTY||checked>=target||checked%1e3===0)&&console.log(message)}function health(pages){return pages.reduce((summary,page)=>((page.error||page.blockedByRobots||(page.status??500)>=400)&&(summary.unavailable+=1),page.title||(summary.missingTitle+=1),page.description||(summary.missingDescription+=1),page.canonical||(summary.missingCanonical+=1),page.h1Count===0&&(summary.missingH1+=1),/(^|[\s,])noindex($|[\s,])/i.test(page.robots??"")&&(summary.noindex+=1),summary),{unavailable:0,missingTitle:0,missingDescription:0,missingCanonical:0,missingH1:0,noindex:0})}function printHealth(summary){console.log(`Current health: ${summary.unavailable} unavailable, ${summary.missingTitle} missing title, ${summary.missingDescription} missing description, ${summary.missingCanonical} missing canonical, ${summary.missingH1} missing H1, ${summary.noindex} noindex.`)}var DEFAULT_BASELINE=".seo-audit.json",DEFAULT_REPORT="seo-audit-report.html",DEFAULT_HISTORY_DIRECTORY=".seo-audit/history";function reportEnabled(values,force=!1){return force||!values["no-report"]&&(values.report!==void 0||process.stdin.isTTY&&process.stdout.isTTY&&!values.json)}async function saveReport(values,data,force=!1){if(!reportEnabled(values,force))return null;let output=resolve2(values.report??DEFAULT_REPORT);return await writeReport(output,data),output}function mapUrl(url,fromStart,toStart){if(!url)return url;try{let source=new URL(fromStart),target=new URL(toStart),candidate=new URL(url);if(candidate.origin!==source.origin)return url;candidate.protocol=target.protocol,candidate.host=target.host;let sourceRoot=source.pathname.replace(/\/$/,""),targetRoot=target.pathname.replace(/\/$/,"");return sourceRoot&&candidate.pathname.startsWith(sourceRoot)&&(candidate.pathname=`${targetRoot}${candidate.pathname.slice(sourceRoot.length)}`||"/"),candidate.href}catch{return url}}function mapPage(page,fromStart,toStart){let mapList=values=>values.map(value=>mapUrl(value,fromStart,toStart)??value).sort();return{...page,url:mapUrl(page.url,fromStart,toStart)??page.url,finalUrl:mapUrl(page.finalUrl,fromStart,toStart),canonical:mapUrl(page.canonical,fromStart,toStart),canonicalRaw:mapUrl(page.canonicalRaw,fromStart,toStart),links:mapList(page.links),internalLinks:mapList(page.internalLinks),externalLinks:mapList(page.externalLinks),images:page.images.map(image=>({...image,src:mapUrl(image.src,fromStart,toStart)})),hreflang:page.hreflang.map(alternate=>({...alternate,url:mapUrl(alternate.url,fromStart,toStart)})),redirectChain:page.redirectChain.map(redirect=>({...redirect,url:mapUrl(redirect.url,fromStart,toStart)??redirect.url,location:mapUrl(redirect.location,fromStart,toStart)}))}}function reportData(snapshot,mode,issues=audit2(snapshot),extra={}){return{mode,startUrl:snapshot.siteUrl,generatedAt:snapshot.generatedAt,pages:snapshot.pages,issues,partial:snapshot.partial,engineVersion:snapshot.engineVersion,ruleSetVersion:snapshot.ruleSetVersion,branding:snapshot.config.report,...extra}}function historyDirectory(values,referencePath){return values["history-dir"]?resolve2(values["history-dir"]):referencePath?join2(dirname(referencePath),DEFAULT_HISTORY_DIRECTORY):resolve2(DEFAULT_HISTORY_DIRECTORY)}async function updateHistory(values,snapshot,referencePath,save){if(values["no-history"])return;let directory=historyDirectory(values,referencePath);save&&!snapshot.partial&&await writeHistorySnapshot(directory,snapshot);let records=await readHistorySnapshots(directory,snapshot.siteUrl);return buildHistorySeries(records.map(record2=>record2.snapshot))??void 0}async function resolvePlan(url,values,baseline,fetch,signal){let config=scanConfig(url,values,baseline),plan=await planScan(config,{signal,fetch});if(plan.mode==="links"&&config.sitemap==="auto"&&process.stdin.isTTY&&process.stdout.isTTY&&!values.json){let entered=await ask("Sitemap was not found. Enter its full URL, or press Enter to crawl internal links: ");entered&&(config={...config,sitemap:entered},plan=await planScan(config,{signal,fetch}))}return plan}function selectScan(plan,values){if(plan.candidateCount===null){if(values.all)throw new Error("--all requires a sitemap");return{mode:"fixed",target:plan.config.maxPages}}return values.all?{mode:"all",target:plan.candidateCount}:values.pages!==void 0||values["max-pages"]!==void 0?{mode:"fixed",target:Math.min(plan.config.maxPages,plan.candidateCount)}:process.stdin.isTTY&&process.stdout.isTTY&&!values.json?chooseScanPlan(plan.candidateCount):{mode:"fixed",target:Math.min(100,plan.candidateCount)}}async function scanCommand(url,values,signal){if(!url)throw new Error("scan requires a URL");let output=resolve2(values.output??DEFAULT_BASELINE),fetch=requestFetch(values["headers-env"],url),plan=await resolvePlan(url,values,void 0,fetch,signal),selection=await selectScan(plan,values),checkpointPath=checkpointPathForRequestHeaders(checkpointPathForOutput(output),values["headers-env"]),store=values["no-cache"]?void 0:createFileCheckpointStore(checkpointPath),collected=new Map,partialReportPath=reportEnabled(values)?resolve2(values.report??DEFAULT_REPORT):null,lastReportAt=0,lastReportCount=-1,writePartial=async(force=!1)=>{if(!partialReportPath||collected.size===0)return;let now=Date.now();if(!force&&collected.size-lastReportCount<100&&now-lastReportAt<5e3)return;let partialSnapshot=migrateSnapshot({schemaVersion:1,startUrl:plan.startUrl,robots:plan.robots,sitemap:plan.sitemap,options:{...plan.config,maxPages:selection.target},pages:[...collected.values()],partial:!0,truncated:!0});await writeReport(partialReportPath,reportData(partialSnapshot,"scan",audit2(partialSnapshot),{partial:!0,targetPages:selection.target})),lastReportAt=now,lastReportCount=collected.size},requested=selection.mode==="step"?Math.min(100,selection.target):selection.target,result=null,stoppedEarly=!1;for(;requested>0;){result=await scan(plan,{signal,fetch,limit:requested,checkpointStore:store,retainCheckpoint:selection.mode==="step"&&requested<selection.target,async onBatch(pages){for(let page of pages)collected.set(page.url,page);await writePartial()},onEvent(event){event.type==="progress"&&!values.json&&printProgress(event.completed,requested,selection.mode==="step")}});for(let page of result.pages)collected.set(page.url,page);if(await writePartial(!0),result.partial||selection.mode!=="step"||requested>=selection.target)break;printHealth(health(result.pages));let nextSize=Math.min(100,selection.target-requested),answer=await ask(`Check the next ${nextSize} page(s)? [y/N] `);if(!["y","yes"].includes(answer.toLowerCase())){stoppedEarly=!0;break}requested=Math.min(selection.target,requested+100)}if(!result)throw new Error("scan did not produce a result");await writeSnapshot(output,result.snapshot);let incomplete=result.partial||stoppedEarly,history=await updateHistory(values,result.snapshot,output,!incomplete),finalReport=incomplete?partialReportPath:await saveReport(values,reportData(result.snapshot,"scan",audit2(result.snapshot),history?{history}:{})),summary=health(result.snapshot.pages);return values.json?console.log(JSON.stringify({command:"scan",pages:result.snapshot.pages.length,truncated:result.snapshot.truncated,health:summary,output,report:finalReport,checkpoint:incomplete&&store?checkpointPath:null},null,2)):(console.log(`Crawled ${result.snapshot.pages.length} page(s)${result.snapshot.truncated?" (limit reached)":""}.`),result.snapshot.sitemap&&console.log(`Loaded ${result.snapshot.sitemap.sitemapCount} sitemap file(s) from ${result.snapshot.sitemap.url}.`),printHealth(summary),console.log(`Baseline saved to ${output}`),finalReport&&console.log(`HTML report saved to ${finalReport}`),incomplete&&store&&console.log(`Resume checkpoint saved to ${checkpointPath}`)),result.partial?130:0}async function checkCommand(url,values,signal){let baselinePath=resolve2(values.baseline??DEFAULT_BASELINE),baseline=await readSnapshot(baselinePath),targetStart=url??baseline.siteUrl,fetch=requestFetch(values["headers-env"],targetStart),basePlan=await planScan({...scanConfig(targetStart,values,baseline),sitemap:"none"},{signal,fetch}),targets=baseline.pages.map(page=>({baselineUrl:page.url,targetUrl:mapUrl(page.url,baseline.siteUrl,basePlan.startUrl)??page.url})),targetUrls=[...new Set(targets.map(({targetUrl})=>targetUrl))],plan={...basePlan,mode:"sitemap",candidateUrls:targetUrls,candidateCount:targetUrls.length,sitemap:{url:`${basePlan.origin}/.seo-audit-targets`,urls:targetUrls,sitemapCount:0,truncated:!1,error:null}},result=await scan(plan,{signal,fetch,limit:targetUrls.length,onEvent(event){event.type==="progress"&&!values.json&&printProgress(event.completed,targetUrls.length)}}),checked=new Map(result.pages.map(page=>[page.url,page])),pages=targets.flatMap(({baselineUrl,targetUrl})=>{let page=checked.get(targetUrl);return page?[{...page,url:baselineUrl,finalUrl:mapUrl(page.finalUrl,basePlan.startUrl,baseline.siteUrl)}]:[]}),current=migrateSnapshot({...result.snapshot,siteUrl:baseline.siteUrl,config:{...result.snapshot.config,url:baseline.siteUrl},sitemap:baseline.sitemap,pages}),comparison=diff2(baseline,current,{enabledRules:current.config.enabledRules,severityOverrides:current.config.severityOverrides,suppressions:current.config.suppressions}),issues=comparison.newIssues,summary=summarizeIssues(issues),history=await updateHistory(values,current,baselinePath,!result.partial),report=await saveReport(values,reportData(current,"check",issues,{...comparison,...history?{history}:{}}));return values.json?console.log(JSON.stringify({command:"check",baseline:baselinePath,pages:current.pages.length,summary,issues,lifecycle:comparison,report},null,2)):(console.log(`Checked ${current.pages.length} page(s).
98
+ `),printIssues(issues),report&&console.log(`HTML report saved to ${report}`)),result.partial?130:summary.error>0||comparison.budgetExceeded.length>0||values.strict&&summary.warning>0?1:0}async function compareCommand(values,signal){let productionUrl=values.production,previewUrl=values.preview;if(!productionUrl||!previewUrl)throw new Error("compare requires --production and --preview URLs");let productionFetch=requestFetch(values["production-headers-env"],productionUrl),previewFetch=requestFetch(values["preview-headers-env"],previewUrl),productionPlan=await planScan(scanConfig(productionUrl,values),{signal,fetch:productionFetch}),selection=await selectScan(productionPlan,values),production=await scan(productionPlan,{signal,fetch:productionFetch,limit:selection.target,onEvent(event){event.type==="progress"&&!values.json&&printProgress(event.completed,selection.target)}});if(production.partial)return 130;let previewBasePlan=await planScan({...scanConfig(previewUrl,values),sitemap:"none"},{signal,fetch:previewFetch}),targetUrls=production.snapshot.pages.map(page=>mapUrl(page.url,productionUrl,previewUrl)??page.url),previewPlan={...previewBasePlan,mode:"sitemap",candidateUrls:[...new Set(targetUrls)].sort(),candidateCount:targetUrls.length,sitemap:{url:`${previewBasePlan.origin}/.seo-audit-preview-targets`,urls:[...new Set(targetUrls)].sort(),sitemapCount:0,truncated:!1,error:null}},preview=await scan(previewPlan,{signal,fetch:previewFetch,limit:targetUrls.length,onEvent(event){event.type==="progress"&&!values.json&&printProgress(event.completed,targetUrls.length)}}),previewPages=preview.snapshot.pages.map(page=>mapPage(page,previewUrl,productionUrl)),current=migrateSnapshot({...preview.snapshot,siteUrl:production.snapshot.siteUrl,startUrl:production.snapshot.siteUrl,config:{...preview.snapshot.config,url:production.snapshot.siteUrl},robots:{...preview.snapshot.robots,url:mapUrl(preview.snapshot.robots.url,previewUrl,productionUrl)??preview.snapshot.robots.url},sitemap:production.snapshot.sitemap,pages:previewPages,partial:preview.snapshot.partial}),comparison=diff2(production.snapshot,current,{enabledRules:current.config.enabledRules,severityOverrides:current.config.severityOverrides,suppressions:current.config.suppressions}),issues=comparison.newIssues,summary=summarizeIssues(issues),report=await saveReport(values,reportData(current,"check",issues,{...comparison,comparison:{kind:"preview",productionUrl,previewUrl}}),!0);return values.json?console.log(JSON.stringify({command:"compare",production:productionUrl,preview:previewUrl,pages:current.pages.length,summary,issues,lifecycle:comparison,report},null,2)):(console.log(`Compared ${current.pages.length} production page(s) with preview.`),printIssues(issues),report&&console.log(`HTML report saved to ${report}`)),preview.partial?130:summary.error>0||comparison.budgetExceeded.length>0||values.strict&&summary.warning>0?1:0}async function reportCommand(inputPath,values){let baselinePath=resolve2(inputPath??values.baseline??DEFAULT_BASELINE),baseline=await readSnapshot(baselinePath),history=await updateHistory(values,baseline,baselinePath,!1),report=await saveReport(values,reportData(baseline,"scan",audit2(baseline),history?{history}:{}),!0);return values.json?console.log(JSON.stringify({command:"report",baseline:baselinePath,pages:baseline.pages.length,report},null,2)):console.log(`HTML report saved to ${report}`),0}async function historyCommand(siteUrl,values){if(!!values.from!=!!values.to)throw new Error("history comparison requires both --from and --to");let directory=historyDirectory(values);if(values.from&&values.to){let previous=await readSnapshot(resolve2(values.from)),current=await readSnapshot(resolve2(values.to));if(previous.siteUrl!==current.siteUrl)throw new Error("history snapshots must belong to the same site URL");let records2=await readHistorySnapshots(directory,current.siteUrl),history2=buildHistorySeries([...records2.map(record2=>record2.snapshot),previous,current]),comparison=diff2(previous,current,{enabledRules:current.config.enabledRules,severityOverrides:current.config.severityOverrides,suppressions:current.config.suppressions}),report2=await saveReport(values,reportData(current,"check",comparison.newIssues,{...comparison,...history2?{history:history2}:{}}),!0),summary=summarizeIssues(comparison.newIssues);return values.json?console.log(JSON.stringify({command:"history",from:resolve2(values.from),to:resolve2(values.to),summary,lifecycle:comparison,report:report2},null,2)):(console.log(`Compared local snapshots from ${previous.generatedAt} to ${current.generatedAt}.`),printIssues(comparison.newIssues),report2&&console.log(`HTML report saved to ${report2}`)),0}let normalizedSiteUrl;if(siteUrl)try{normalizedSiteUrl=new URL(siteUrl).href}catch{throw new Error("history URL must be an HTTP(S) URL")}let records=await readHistorySnapshots(directory,normalizedSiteUrl);if(records.length===0)throw new Error(`no local history snapshots found in ${directory}`);if(!normalizedSiteUrl){let latestSiteUrl=records.at(-1).snapshot.siteUrl;records=records.filter(record2=>record2.snapshot.siteUrl===latestSiteUrl)}let latest=records.at(-1),history=buildHistorySeries(records.map(record2=>record2.snapshot)),report=await saveReport(values,reportData(latest.snapshot,"scan",audit2(latest.snapshot),history?{history}:{}),!0),points=history?.points??[];if(values.json)console.log(JSON.stringify({command:"history",directory,snapshots:records.map((record2,index)=>({path:record2.path,...points[index]})),report},null,2));else{console.log(`Local history for ${latest.snapshot.siteUrl}:`);for(let[index,record2]of records.entries()){let point=points[index];console.log(` ${record2.snapshot.generatedAt} ${point?.pages??record2.snapshot.pages.length} pages ${point?.errors??0} errors ${point?.warnings??0} warnings ${record2.path}`)}report&&console.log(`HTML report saved to ${report}`)}return 0}import{mkdir as mkdir2,readFile as readFile3,writeFile as writeFile3}from"node:fs/promises";import{dirname as dirname2,isAbsolute,join as join3,resolve as resolve3}from"node:path";var CONFIG_SCHEMA_URL="https://raw.githubusercontent.com/MelnixDev/seo-crawl-audit/v0/packages/core/config.schema.json",DEFAULT_CONFIG_FILE2="seo-audit.config.json",DEFAULT_WORKFLOW_FILE=".github/workflows/seo-audit.yml",GITIGNORE_RECOMMENDATIONS=[".seo-audit.checkpoint.ndjson",".seo-audit/history/","seo-audit-report.html","seo-audit-report.html.json"];function normalizeSiteUrl(input){let url;try{url=new URL(input)}catch(error){throw new Error("init URL must be a full HTTP(S) URL",{cause:error})}if(!["http:","https:"].includes(url.protocol))throw new Error("init URL must be a full HTTP(S) URL");return url.hash="",url.href}function parseWorkflow(input){let normalized=(input??"none").trim().toLowerCase(),workflow={"":"none",none:"none",manual:"manual",scheduled:"scheduled",schedule:"scheduled","pull-request":"pull-request",pull_request:"pull-request",pr:"pull-request"}[normalized];if(!workflow)throw new Error("--workflow must be none, manual, scheduled, or pull-request");return workflow}function configContent(url){return`${JSON.stringify({$schema:CONFIG_SCHEMA_URL,url,sitemap:"auto",maxPages:100,concurrency:5,delay:100,timeout:1e4,respectRobots:!0,includeQuery:!1,maxRedirects:10,maxResponseBytes:5*1024*1024,enabledRules:null,severityOverrides:{},suppressions:[],regressionBudgets:{error:0},report:{}},null,2)}
99
+ `}function actionSteps(extraInputs="",preflight=""){return` - uses: actions/checkout@v6${preflight}
100
+ - name: Run SEO Crawl Audit
101
+ id: seo
102
+ uses: MelnixDev/seo-crawl-audit@v0
103
+ with:
104
+ config: seo-audit.config.json
105
+ fail-on: error
106
+ report: seo-audit-report.html${extraInputs}
107
+ - name: Upload SEO report
108
+ if: always()
109
+ uses: actions/upload-artifact@v4
110
+ with:
111
+ name: seo-crawl-audit-report
112
+ path: |
113
+ \${{ steps.seo.outputs.report }}
114
+ \${{ steps.seo.outputs.summary }}
115
+ if-no-files-found: warn
116
+ `}function workflowContent(workflow){return workflow==="manual"?`name: SEO audit
117
+
118
+ on:
119
+ workflow_dispatch:
120
+
121
+ permissions:
122
+ contents: read
123
+
124
+ jobs:
125
+ audit:
126
+ runs-on: ubuntu-latest
127
+ steps:
128
+ ${actionSteps()}`:workflow==="scheduled"?`name: Scheduled SEO audit
129
+
130
+ on:
131
+ workflow_dispatch:
132
+ schedule:
133
+ - cron: "0 6 * * 1"
134
+
135
+ permissions:
136
+ contents: read
137
+
138
+ jobs:
139
+ audit:
140
+ runs-on: ubuntu-latest
141
+ steps:
142
+ ${actionSteps()}`:`name: SEO preview regression check
143
+
144
+ on:
145
+ pull_request:
146
+
147
+ permissions:
148
+ contents: read
149
+
150
+ jobs:
151
+ audit:
152
+ runs-on: ubuntu-latest
153
+ steps:
154
+ ${actionSteps(`
155
+ url: \${{ vars.SEO_AUDIT_PREVIEW_URL }}
156
+ baseline: .seo-audit.json`,`
157
+ - name: Validate preview audit setup
158
+ env:
159
+ PREVIEW_URL: \${{ vars.SEO_AUDIT_PREVIEW_URL }}
160
+ run: |
161
+ if [ -z "$PREVIEW_URL" ]; then
162
+ echo "Set the SEO_AUDIT_PREVIEW_URL repository variable." >&2
163
+ exit 1
164
+ fi
165
+ if [ ! -f .seo-audit.json ]; then
166
+ echo "Commit .seo-audit.json as the production baseline." >&2
167
+ exit 1
168
+ fi`)}`}function errorCode(error){return error&&typeof error=="object"&&"code"in error&&typeof error.code=="string"?error.code:void 0}async function readExisting(path){try{return await readFile3(path,"utf8")}catch(error){if(errorCode(error)==="ENOENT")return null;throw error}}async function shouldReplace(path,options){if(options.force)return!0;if(!options.interactive||!options.ask)return!1;let answer=await options.ask(`${path} already exists. Replace it? [y/N] `);return["y","yes"].includes(answer.trim().toLowerCase())}async function writeProtectedFile(path,content,options){let existing=await readExisting(path);if(existing===content)return{path,status:"unchanged"};if(existing!==null&&!await shouldReplace(path,options))return{path,status:"skipped"};await mkdir2(dirname2(path),{recursive:!0});try{await writeFile3(path,content,existing===null?{encoding:"utf8",flag:"wx"}:{encoding:"utf8"})}catch(error){if(existing===null&&errorCode(error)==="EEXIST")return{path,status:"skipped"};throw error}return{path,status:existing===null?"created":"updated"}}async function updateGitignore(path,options){let existing=await readExisting(path),lines=new Set((existing??"").split(/\r?\n/u)),missing=GITIGNORE_RECOMMENDATIONS.filter(entry=>!lines.has(entry));if(missing.length===0)return{path,status:"unchanged"};if(existing!==null&&!options.force&&!options.yes){if(!options.interactive||!options.ask)return{path,status:"skipped"};let answer=await options.ask(`Add SEO Crawl Audit recommendations to ${path}? [Y/n] `);if(["n","no"].includes(answer.trim().toLowerCase()))return{path,status:"skipped"}}let prefix=existing&&!existing.endsWith(`
169
+ `)?`
170
+ `:"",heading=existing===null||!existing.includes("# SEO Crawl Audit")?`# SEO Crawl Audit
171
+ `:"",addition=`${prefix}${heading}${missing.join(`
172
+ `)}
173
+ `;return await mkdir2(dirname2(path),{recursive:!0}),await writeFile3(path,`${existing??""}${addition}`,"utf8"),{path,status:existing===null?"created":"updated"}}async function initializeProject(options={}){let directory=resolve3(options.directory??process.cwd()),interactive=options.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY),prompt=options.ask??ask,rawUrl=options.url?.trim()??"";if(!rawUrl&&interactive&&!options.yes&&(rawUrl=await prompt("Full site URL: ")),!rawUrl)throw new Error("init requires a full site URL");let url=normalizeSiteUrl(rawUrl),rawWorkflow=options.workflow;rawWorkflow===void 0&&interactive&&!options.yes&&(rawWorkflow=await prompt("GitHub workflow [none/manual/scheduled/pull-request] (none): "));let workflow=parseWorkflow(rawWorkflow),configPath=options.configPath?isAbsolute(options.configPath)?options.configPath:resolve3(directory,options.configPath):join3(directory,DEFAULT_CONFIG_FILE2),fileOptions={force:options.force??!1,yes:options.yes??!1,interactive,ask:prompt},files=[await writeProtectedFile(configPath,configContent(url),fileOptions),await updateGitignore(join3(directory,".gitignore"),fileOptions)];return workflow!=="none"&&files.push(await writeProtectedFile(join3(directory,DEFAULT_WORKFLOW_FILE),workflowContent(workflow),fileOptions)),{directory,url,workflow,files}}async function initCommand(url,values){let result=await initializeProject({...values.directory!==void 0?{directory:values.directory}:{},...url!==void 0?{url}:{},...values.config!==void 0?{configPath:values.config}:{},...values.workflow!==void 0?{workflow:values.workflow}:{},...values.yes!==void 0?{yes:values.yes}:{},...values.force!==void 0?{force:values.force}:{}});if(values.json)return console.log(JSON.stringify({command:"init",...result},null,2)),0;console.log(`Initialized SEO Crawl Audit for ${result.url}`);for(let file of result.files)console.log(` ${file.status.padEnd(9)} ${file.path}`);return result.workflow==="pull-request"&&console.log("Set the SEO_AUDIT_PREVIEW_URL repository variable and commit .seo-audit.json before enabling the PR check."),console.log("Review seo-audit.config.json, then run: seo-audit scan"),0}import{access as access2,stat}from"node:fs/promises";import{constants}from"node:fs";import{dirname as dirname3,isAbsolute as isAbsolute2,resolve as resolve4}from"node:path";var MINIMUM_NODE=[20,19,0],DEFAULT_BASELINE2=".seo-audit.json",DEFAULT_REPORT2="seo-audit-report.html",DEFAULT_HISTORY=".seo-audit/history";function versionParts(input){let match=/^(\d+)\.(\d+)\.(\d+)/u.exec(input);return match?[Number(match[1]),Number(match[2]),Number(match[3])]:[0,0,0]}function supportedNode(input){let current=versionParts(input);for(let index=0;index<MINIMUM_NODE.length;index+=1){let value=current[index]??0,minimum=MINIMUM_NODE[index]??0;if(value>minimum)return!0;if(value<minimum)return!1}return!0}function normalizedHttpUrl(input){try{let url=new URL(input);return["http:","https:"].includes(url.protocol)?(url.hash="",url.href):null}catch{return null}}function fromDirectory(directory,path){return isAbsolute2(path)?path:resolve4(directory,path)}async function nearestExistingDirectory(input){let candidate=resolve4(input);for(;;){try{if((await stat(candidate)).isDirectory())return candidate}catch(error){if(!error||typeof error!="object"||!("code"in error)||error.code!=="ENOENT")throw error}let parent=dirname3(candidate);if(parent===candidate)throw new Error(`no existing parent directory for ${input}`);candidate=parent}}async function storageCheck(directory,options){let targets=[dirname3(fromDirectory(directory,options.outputPath??DEFAULT_BASELINE2)),...options.reportEnabled===!1?[]:[dirname3(fromDirectory(directory,options.reportPath??DEFAULT_REPORT2))],...options.historyEnabled===!1?[]:[fromDirectory(directory,options.historyPath??DEFAULT_HISTORY)]];try{let parents=[...new Set(await Promise.all(targets.map(nearestExistingDirectory)))];return await Promise.all(parents.map(path=>access2(path,constants.W_OK))),{id:"storage",status:"pass",message:`Output locations are writable through ${parents.join(", ")}`,evidence:{directories:parents}}}catch(error){return{id:"storage",status:"fail",message:error instanceof Error?error.message:String(error),remediation:"Create the output directory or grant the current user write access."}}}function timeoutSignal(timeout,signal){let timeoutOnly=AbortSignal.timeout(timeout);return signal?AbortSignal.any([signal,timeoutOnly]):timeoutOnly}async function homepageCheck(url,config,fetch,signal){try{let response=await fetch(url,{headers:{accept:"text/html,application/xhtml+xml;q=0.9,*/*;q=0.1","user-agent":`SEO-Crawl-Audit-Doctor/${ENGINE_VERSION}`},redirect:"follow",signal:timeoutSignal(config.timeout,signal)}),contentType=response.headers.get("content-type")??"";return await response.body?.cancel(),response.status>=400?{id:"homepage",status:"fail",message:`Start URL returned HTTP ${response.status}`,remediation:response.status===401||response.status===403?"Configure authenticated request headers before auditing this site.":"Confirm that the URL is correct and publicly reachable.",evidence:{status:response.status,contentType}}:contentType.toLowerCase().includes("html")?{id:"homepage",status:"pass",message:`Start URL returned HTTP ${response.status} HTML`,evidence:{status:response.status,contentType}}:{id:"homepage",status:"warning",message:`Start URL returned ${contentType||"an unknown content type"}`,remediation:"Use a URL that returns server-rendered HTML.",evidence:{status:response.status,contentType}}}catch(error){return signal?.throwIfAborted(),{id:"homepage",status:"fail",message:`Could not request the start URL: ${error instanceof Error?error.message:String(error)}`,remediation:"Check DNS, TLS, firewall access, and the configured timeout."}}}function summarize(checks){return checks.reduce((summary,check)=>(summary[check.status]+=1,summary),{pass:0,warning:0,fail:0,skipped:0})}async function runDoctor(options={}){let directory=resolve4(options.directory??process.cwd()),checks=[],runtimeVersion=options.runtimeVersion??process.versions.node;checks.push(supportedNode(runtimeVersion)?{id:"runtime",status:"pass",message:`Node.js ${runtimeVersion} satisfies >=20.19`}:{id:"runtime",status:"fail",message:`Node.js ${runtimeVersion} is older than 20.19`,remediation:"Install Node.js 20.19 or newer on the machine running SEO Crawl Audit."});let discoveredConfigPath=(options.configPath?fromDirectory(directory,options.configPath):null)??await findConfigFile(directory),fileConfig={};if(!discoveredConfigPath)checks.push({id:"config",status:"warning",message:"seo-audit.config.json was not found",remediation:"Run seo-audit init <url> to create a safe project configuration."});else try{fileConfig=await loadConfig(discoveredConfigPath),checks.push({id:"config",status:"pass",message:`Configuration is valid: ${discoveredConfigPath}`,evidence:{path:discoveredConfigPath}})}catch(error){checks.push({id:"config",status:"fail",message:error instanceof Error?error.message:String(error),remediation:"Fix the reported property or regenerate the file with seo-audit init --force."})}let requestedUrl=options.url??fileConfig.url??"",url=normalizedHttpUrl(requestedUrl);url?checks.push({id:"target",status:"pass",message:`Target URL is ${url}`,evidence:{url}}):checks.push({id:"target",status:"fail",message:requestedUrl?"Target is not a full HTTP(S) URL":"No target URL was provided",remediation:"Pass seo-audit doctor https://example.com/ or set url in seo-audit.config.json."}),checks.push(await storageCheck(directory,options));let offline=options.offline??!1;if(offline||!url){let reason=offline?"Skipped by --offline":"Skipped because the target URL is invalid";for(let id of["homepage","robots","sitemap"])checks.push({id,status:"skipped",message:reason})}else{let config=resolveConfig({url},fileConfig),fetch=fetchWithHeaders(options.requestHeaders??{},url,options.fetch??globalThis.fetch);checks.push(await homepageCheck(url,config,fetch,options.signal));try{let plan=await planScan(config,{fetch,signal:options.signal});plan.robots.denyAll&&config.respectRobots?checks.push({id:"robots",status:"fail",message:`robots.txt returned HTTP ${plan.robots.status??"unknown"} and blocks crawling`,remediation:"Allow the audit user agent or explicitly choose --ignore-robots when authorized.",evidence:{url:plan.robots.url,status:plan.robots.status,denyAll:!0}}):plan.robots.error||plan.robots.status===null||(plan.robots.status??500)>=400?checks.push({id:"robots",status:"warning",message:plan.robots.error??`robots.txt returned HTTP ${plan.robots.status??"unknown"}`,remediation:"Publish a readable robots.txt when crawler policy needs to be explicit.",evidence:{url:plan.robots.url,status:plan.robots.status}}):checks.push({id:"robots",status:"pass",message:`robots.txt returned HTTP ${plan.robots.status}`,evidence:{url:plan.robots.url,status:plan.robots.status,denyAll:plan.robots.denyAll??!1}}),config.sitemap==="none"?checks.push({id:"sitemap",status:"skipped",message:"Sitemap discovery is disabled by configuration"}):plan.sitemap?plan.sitemap.error?checks.push({id:"sitemap",status:config.sitemap==="auto"?"warning":"fail",message:plan.sitemap.error,remediation:"Check the sitemap URL, XML syntax, response size, and HTTP status.",evidence:{url:plan.sitemap.url}}):plan.sitemap.urls.length===0?checks.push({id:"sitemap",status:"warning",message:`Sitemap contains no crawlable same-origin URLs: ${plan.sitemap.url}`,remediation:"Add canonical site URLs to the sitemap or verify the configured site origin."}):checks.push({id:"sitemap",status:"pass",message:`Loaded ${plan.sitemap.urls.length} URL(s) from ${plan.sitemap.sitemapCount} sitemap file(s)`,evidence:{url:plan.sitemap.url,urls:plan.sitemap.urls.length,sitemapCount:plan.sitemap.sitemapCount,truncated:plan.sitemap.truncated}}):checks.push({id:"sitemap",status:"warning",message:"No sitemap was discovered",remediation:"Publish a sitemap or set sitemap to none when link-only crawling is intentional."})}catch(error){options.signal?.throwIfAborted(),checks.push({id:"robots",status:"fail",message:`Planning failed: ${error instanceof Error?error.message:String(error)}`,remediation:"Check network access, robots.txt redirects, sitemap responses, and timeout settings."}),checks.push({id:"sitemap",status:"skipped",message:"Skipped because scan planning failed"})}}let summary=summarize(checks);return{healthy:summary.fail===0,offline,url,checks,summary}}function printDoctor(result){console.log("SEO Crawl Audit doctor");let labels={pass:"PASS",warning:"WARN",fail:"FAIL",skipped:"SKIP"};for(let check of result.checks)console.log(`[${labels[check.status]}] ${check.id}: ${check.message}`),check.remediation&&console.log(` Fix: ${check.remediation}`);console.log(result.healthy?`Ready with ${result.summary.warning} warning(s) and ${result.summary.skipped} skipped check(s).`:`Not ready: ${result.summary.fail} check(s) failed.`)}async function doctorCommand(url,values,signal){let result=await runDoctor({...values.directory!==void 0?{directory:values.directory}:{},...url!==void 0?{url}:{},...values.config!==void 0?{configPath:values.config}:{},...values.output!==void 0?{outputPath:values.output}:{},...values.report!==void 0?{reportPath:values.report}:{},...values["history-dir"]!==void 0?{historyPath:values["history-dir"]}:{},reportEnabled:values["no-report"]!==!0,historyEnabled:values["no-history"]!==!0,offline:values.offline===!0,requestHeaders:headersFromEnvironment(values["headers-env"]),...signal!==void 0?{signal}:{}});return values.json?console.log(JSON.stringify({command:"doctor",...result},null,2)):printDoctor(result),result.healthy?0:1}import{lstat,mkdir as mkdir3,readFile as readFile4,realpath,writeFile as writeFile4}from"node:fs/promises";import{dirname as dirname4,join as join4,relative,resolve as resolve5}from"node:path";import{fileURLToPath}from"node:url";var SKILL_SOURCE=resolve5(fileURLToPath(new URL("../agent-skill/seo-crawl-audit",import.meta.url)));async function assertProjectPath(directory,target){let realDirectory=await realpath(directory),current=target;for(;;)try{let realTarget=await realpath(current),rel=relative(realDirectory,realTarget);if(rel===".."||rel.startsWith(`..${process.platform==="win32"?"\\":"/"}`))throw new Error(`generated agent path escapes the project through a symlink: ${target}`);return}catch(error){if(error.code!=="ENOENT")throw error;try{if((await lstat(current)).isSymbolicLink())throw new Error(`generated agent path escapes the project through an unresolved symlink: ${target}`)}catch(statError){if(statError.code!=="ENOENT")throw statError}let parent=dirname4(current);if(parent===current)throw error;current=parent}}function platforms(value){let normalized=(value??"all").toLowerCase();if(normalized==="all")return["codex","claude","opencode"];if(["codex","claude","opencode"].includes(normalized))return[normalized];throw new Error("--platform must be codex, claude, opencode, or all")}async function copyIfMissing(source,target,force){let existing=null;try{existing=await readFile4(target,"utf8")}catch(error){if(error.code!=="ENOENT")throw error}let content=await readFile4(source,"utf8");return existing===content?{path:target,status:"unchanged"}:existing!==null&&!force?{path:target,status:"skipped"}:(await mkdir3(dirname4(target),{recursive:!0}),await writeFile4(target,content,"utf8"),{path:target,status:existing===null?"created":"updated"})}async function writeConfigIfMissing(target,content,force){let existing=null;try{existing=await readFile4(target,"utf8")}catch(error){if(error.code!=="ENOENT")throw error}return existing===content?{path:target,status:"unchanged"}:existing!==null&&!force?{path:target,status:"skipped"}:(await mkdir3(dirname4(target),{recursive:!0}),await writeFile4(target,content,"utf8"),{path:target,status:existing===null?"created":"updated"})}function codexConfig(){return`[mcp_servers.seo-crawl-audit]
174
+ command = "npx"
175
+ args = ["-y", "seo-crawl-audit@0.9", "mcp"]
176
+ tool_timeout_sec = 600
177
+ `}function claudeConfig(){return`${JSON.stringify({mcpServers:{"seo-crawl-audit":{command:"npx",args:["-y","seo-crawl-audit@0.9","mcp"]}}},null,2)}
178
+ `}function opencodeConfig(){return`${JSON.stringify({$schema:"https://opencode.ai/config.json",mcp:{"seo-crawl-audit":{type:"local",command:["npx","-y","seo-crawl-audit@0.9","mcp"],enabled:!0,timeout:6e5}}},null,2)}
179
+ `}async function initializeAgents(options={}){let directory=resolve5(options.directory??process.cwd()),selected=platforms(options.platform),files=[],snippets=[],installedSkills=new Set,targets=new Set;for(let platform of selected)targets.add(platform==="claude"?join4(directory,".claude/skills/seo-crawl-audit/SKILL.md"):join4(directory,".agents/skills/seo-crawl-audit/SKILL.md")),targets.add(platform==="codex"?join4(directory,".codex/config.toml"):platform==="claude"?join4(directory,".mcp.json"):join4(directory,"opencode.json"));await Promise.all([...targets].map(target=>assertProjectPath(directory,target)));for(let platform of selected){let skillTarget=platform==="claude"?join4(directory,".claude/skills/seo-crawl-audit/SKILL.md"):join4(directory,".agents/skills/seo-crawl-audit/SKILL.md");installedSkills.has(skillTarget)||(files.push(await copyIfMissing(join4(SKILL_SOURCE,"SKILL.md"),skillTarget,options.force??!1)),installedSkills.add(skillTarget));let configTarget=platform==="codex"?join4(directory,".codex/config.toml"):platform==="claude"?join4(directory,".mcp.json"):join4(directory,"opencode.json"),content=platform==="codex"?codexConfig():platform==="claude"?claudeConfig():opencodeConfig(),configResult=await writeConfigIfMissing(configTarget,content,options.force??!1);files.push(configResult),configResult.status==="skipped"&&snippets.push(`${platform} config snippet:
180
+ ${content}`)}return{directory,platform:options.platform==="all"||!options.platform?"all":selected[0],files,snippets}}async function agentInitCommand(values){let result=await initializeAgents({directory:values.directory,platform:values.platform,force:values.force});if(values.json)return console.log(JSON.stringify({command:"agent-init",...result},null,2)),0;console.log(`Prepared SEO Crawl Audit agent integration in ${result.directory}`);for(let file of result.files)console.log(` ${file.status.padEnd(7)} ${file.path}`);for(let snippet of result.snippets)console.log(`
181
+ ${snippet}`);return console.log("Restart the agent client after enabling its project MCP configuration."),0}var HELP=`seo-audit ${ENGINE_VERSION}
94
182
 
95
183
  Local-first SEO crawler, audit, and regression checker.
96
184
 
@@ -101,6 +189,10 @@ Usage:
101
189
  seo-audit compare --production <url> --preview <url> [options]
102
190
  seo-audit history [url] [options]
103
191
  seo-audit report [baseline] [options]
192
+ seo-audit init [url] [options]
193
+ seo-audit doctor [url] [options]
194
+ seo-audit agent-init [options]
195
+ seo-audit mcp
104
196
 
105
197
  Commands:
106
198
  <url> Shortcut for scan.
@@ -109,6 +201,10 @@ Commands:
109
201
  compare Compare a production site with a preview deployment.
110
202
  history View local scan trends or compare two saved history snapshots.
111
203
  report Generate HTML from an existing baseline without crawling.
204
+ init Create a safe local config and optional GitHub workflow.
205
+ doctor Diagnose runtime, config, storage, and site connectivity.
206
+ agent-init Install project-scoped MCP configuration and agent skill files.
207
+ mcp Start the local STDIO MCP server for coding agents.
112
208
 
113
209
  Options:
114
210
  --baseline <file> Baseline file for check (default: .seo-audit.json)
@@ -128,6 +224,7 @@ Options:
128
224
  --include-query Treat query-string URLs as separate pages
129
225
  --ignore-robots Crawl URLs disallowed by robots.txt
130
226
  --strict Fail check on warnings as well as errors
227
+ --headers-env <name> Read target request headers from a JSON environment variable
131
228
  --production <url> Production URL for compare
132
229
  --preview <url> Preview deployment URL for compare
133
230
  --production-headers-env <name>
@@ -138,6 +235,12 @@ Options:
138
235
  --no-history Do not save this scan to local history
139
236
  --from <snapshot> Older history snapshot for an explicit comparison
140
237
  --to <snapshot> Newer history snapshot for an explicit comparison
238
+ --directory <path> Project directory for init or doctor
239
+ --workflow <mode> Init workflow: none, manual, scheduled, or pull-request
240
+ --yes Accept safe init defaults without prompting
241
+ --force Allow init to replace existing generated files
242
+ --offline Skip doctor network checks
243
+ --platform <name> Agent integration: codex, claude, opencode, or all
141
244
  --json Print machine-readable command output
142
245
  --help Show this help
143
246
  --version Show the version
@@ -147,8 +250,8 @@ Exit codes:
147
250
  1 SEO regressions detected
148
251
  2 Invalid input or crawler failure
149
252
  130 Scan interrupted after saving partial results
150
- `;async function main(args=process.argv.slice(2),options={}){let parsed;try{parsed=parseCliArgs(args)}catch(error){console.error(`${error instanceof Error?error.message:String(error)}
253
+ `;async function main(args=process.argv.slice(2),options={}){let parsed;try{parsed=parseCliArgs(args)}catch(error){return console.error(`${error instanceof Error?error.message:String(error)}
151
254
 
152
- ${HELP}`);return 2}let{values}=parsed;const{positionals}=parsed;try{values=withFileConfig(values,await loadConfig(values.config))}catch(error){console.error(`seo-audit: ${error instanceof Error?error.message:String(error)}`);return 2}if(values.version){console.log(ENGINE_VERSION);return 0}if(values.help||positionals.length===0){console.log(HELP);return 0}let[command,url,...extra]=positionals;if(command&&/^https?:\/\//i.test(command)){extra=positionals.slice(1);url=command;command="scan"}if((command==="scan"||command==="check")&&!url&&values.__config?.url){url=values.__config.url}if(extra.length>0){console.error(`Unexpected argument: ${extra[0]}`);return 2}try{if(command==="scan")return await scanCommand(url,values,options.signal);if(command==="check")return await checkCommand(url,values,options.signal);if(command==="compare")return await compareCommand(values,options.signal);if(command==="history")return await historyCommand(url,values);if(command==="report")return await reportCommand(url,values);console.error(`Unknown command: ${String(command)}
255
+ ${HELP}`),2}let{values}=parsed,{positionals}=parsed;if(positionals[0]==="init"){if(values.help)return console.log(HELP),0;if(values.version)return console.log(ENGINE_VERSION),0;if(positionals.length>2)return console.error(`Unexpected argument: ${positionals[2]}`),2;try{return await initCommand(positionals[1],values)}catch(error){return console.error(`seo-audit: ${error instanceof Error?error.message:String(error)}`),2}}if(positionals[0]==="doctor"){if(positionals.length>2)return console.error(`Unexpected argument: ${positionals[2]}`),2;if(values.help)return console.log(HELP),0;if(values.version)return console.log(ENGINE_VERSION),0;try{return await doctorCommand(positionals[1],values,options.signal)}catch(error){return console.error(`seo-audit: ${error instanceof Error?error.message:String(error)}`),options.signal?.aborted?130:2}}if(positionals[0]==="agent-init"){if(positionals.length>1)return console.error(`Unexpected argument: ${positionals[1]}`),2;if(values.help)return console.log(HELP),0;if(values.version)return console.log(ENGINE_VERSION),0;try{return await agentInitCommand(values)}catch(error){return console.error(`seo-audit: ${error instanceof Error?error.message:String(error)}`),2}}try{values=withFileConfig(values,await loadConfig(values.config))}catch(error){return console.error(`seo-audit: ${error instanceof Error?error.message:String(error)}`),2}if(values.version)return console.log(ENGINE_VERSION),0;if(values.help||positionals.length===0)return console.log(HELP),0;let[command,url,...extra]=positionals;if(command&&/^https?:\/\//i.test(command)&&(extra=positionals.slice(1),url=command,command="scan"),(command==="scan"||command==="check")&&!url&&values.__config?.url&&(url=values.__config.url),extra.length>0)return console.error(`Unexpected argument: ${extra[0]}`),2;try{return command==="scan"?await scanCommand(url,values,options.signal):command==="check"?await checkCommand(url,values,options.signal):command==="compare"?await compareCommand(values,options.signal):command==="history"?await historyCommand(url,values):command==="report"?await reportCommand(url,values):(console.error(`Unknown command: ${String(command)}
153
256
 
154
- ${HELP}`);return 2}catch(error){console.error(`seo-audit: ${error instanceof Error?error.message:String(error)}`);return options.signal?.aborted?130:2}}export{main,parseScanMenuSelection};
257
+ ${HELP}`),2)}catch(error){return console.error(`seo-audit: ${error instanceof Error?error.message:String(error)}`),options.signal?.aborted?130:2}}export{main,parseScanMenuSelection};