site-metadata-extractor
Version:
web(site) resource metadata extractor
270 lines • 34.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sanitizeJsonLdString = void 0;
const cheerio_1 = __importDefault(require("cheerio"));
function cleanArticleTags(doc) {
const articles = doc("article");
articles.each((_index, element) => {
doc(element).removeAttr("id");
doc(element).removeAttr("name");
doc(element).removeAttr("class");
});
return doc;
}
function cleanBadTags(doc) {
const removeNodesRe = "^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|partner-gravity-ad|video-full-transcript|storytopbar-bucket|utility-bar|inline-share-tools|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|cnn_html_slideshow|cnn_strylftcntnt|links|meta$|shoutbox|sponsor|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text|legende|ajoutVideo|timestamp|js_replies";
const regex = new RegExp(removeNodesRe, "i");
const toRemove = doc("*").filter((_index, el) => {
const idEl = doc(el).attr("id");
const classEl = doc(el).attr("class");
const nameEl = doc(el).attr("name");
if (idEl) {
return idEl.match(regex) !== null;
}
else if (classEl) {
return classEl.match(regex) !== null;
}
else if (nameEl) {
return nameEl.match(regex) !== null;
}
return false;
});
doc(toRemove).remove();
return doc;
}
function cleanCodeBlocks(doc) {
const nodes = doc("[class*='highlight-'], pre code, code, pre, ul.task-list");
nodes.each((_index, element) => {
doc(element).replaceWith(doc(element).text());
});
return doc;
}
function cleanEmTags(doc) {
const ems = doc("em");
ems.each((_index, element) => {
const images = ems.find("img");
if (images.length === 0) {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
}
});
return doc;
}
function cleanErrantLineBreaks(doc) {
doc("p").each((_index, element) => {
const node = doc(element);
const contents = node.contents();
doc(contents).each((_cindex, cElement) => {
const contentsNode = doc(cElement);
if (contentsNode && contentsNode[0] && contentsNode[0].type === "text") {
contentsNode.replaceWith(contentsNode.text().replace(/([^\n])\n([^\n])/g, "$1 $2"));
}
});
});
return doc;
}
function cleanParaSpans(doc) {
const nodes = doc("p span");
nodes.each((_index, element) => {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
});
return doc;
}
function cleanUnderlines(doc) {
const nodes = doc("u");
nodes.each((_index, element) => {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
});
return doc;
}
function divToPara(doc, domType) {
const divs = doc(domType);
const tags = [
"a",
"blockquote",
"dl",
"div",
"img",
"ol",
"p",
"pre",
"table",
"ul",
];
divs.each((_index, element) => {
const div = doc(element);
const items = div.find(tags.join(", "));
if (items.length === 0) {
replaceWithPara(doc, element);
}
else {
const replaceNodes = getReplacementNodes(doc, div);
let html = "";
replaceNodes.forEach((node) => {
if (node.text() !== "") {
html += `<p>${node}</p>`;
}
});
div.empty();
doc(div).replaceWith(`${html}`);
}
});
return doc;
}
function getReplacementNodes(doc, div) {
let replacementText = [];
const nodesToReturn = [];
const nodesToRemove = [];
const children = div.contents();
children.each((_index, element) => {
const child = doc(element);
if (child.get(0) &&
child.get(0).tagName === "p" &&
replacementText.length > 0) {
const text = replacementText.join("");
const textNodeLoad = cheerio_1.default.load(`<p>${text}</p>`);
const textNode = doc(textNodeLoad);
// create a node out of text and push
nodesToReturn.push(textNode);
replacementText = [];
const childEl = doc(element);
if (childEl) {
nodesToReturn.push(childEl);
}
}
else if (child.get(0) && child.get(0).type === "text") {
const childTextNode = child;
const childText = child.text();
const replaceText = childText
.replace(/\n/g, "\n\n")
.replace(/\t/g, "")
.replace(/^\s+$/g, "");
if (replaceText.length > 1) {
let previousSiblingNode = childTextNode.prev();
while (previousSiblingNode.get(0) &&
previousSiblingNode.get(0).tagName === "a" &&
previousSiblingNode.attr("grv-usedalready") !== "yes") {
const outer = " " + doc.html(previousSiblingNode) + " ";
replacementText.push(outer);
nodesToRemove.push(previousSiblingNode);
previousSiblingNode.attr("grv-usedalready", "yes");
previousSiblingNode = previousSiblingNode.prev();
}
replacementText.push(replaceText);
const nextSiblingNode = childTextNode.next();
while (nextSiblingNode.get(0) &&
nextSiblingNode.get(0).tagName === "a" &&
nextSiblingNode.attr("grv-usedalready") !== "yes") {
const outer = " " + doc.html(nextSiblingNode) + " ";
replacementText.push(outer);
nodesToRemove.push(nextSiblingNode);
nextSiblingNode.attr("grv-usedalready", "yes");
previousSiblingNode = nextSiblingNode.next();
}
}
// otherwise
}
else {
const childEl = doc(child);
if (childEl) {
nodesToReturn.push(childEl);
}
}
});
// flush out anything still remaining
if (replacementText.length > 0) {
const text = replacementText.join("");
const textNodeLoad = cheerio_1.default.load(`<p>${text}</p>`);
const textNode = doc(textNodeLoad);
nodesToReturn.push(textNode);
replacementText = [];
}
nodesToRemove.forEach((node) => {
doc(node).remove();
});
return nodesToReturn;
}
function removeBodyClasses(doc) {
doc("body").removeClass();
return doc;
}
function removeDropCaps(doc) {
const nodes = doc("span[class~=dropcap], span[class~=drop_cap]");
nodes.each((_index, element) => {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
});
return doc;
}
function removeNodesRegex(doc, pattern) {
const toRemove = doc("div").filter((_index, element) => {
const idEl = doc(element).attr("id");
const classEl = doc(element).attr("class");
if (idEl) {
return idEl.match(pattern) !== null;
}
else if (classEl) {
return classEl.match(pattern) !== null;
}
return false;
});
doc(toRemove).remove();
return doc;
}
function removeScriptsStyles(doc) {
doc("script").remove();
doc("style").remove();
const comments = doc("*")
.contents()
.filter((_index, element) => {
return element.type === "comment";
});
return doc(comments).remove();
}
function replaceWithPara(doc, div) {
const divContent = doc(div).html();
doc(div).replaceWith(`<p>${divContent}</p>`);
return doc;
}
const cleaner = (doc) => {
removeBodyClasses(doc);
cleanArticleTags(doc);
cleanEmTags(doc);
cleanCodeBlocks(doc);
removeDropCaps(doc);
removeScriptsStyles(doc);
cleanBadTags(doc);
removeNodesRegex(doc, /^caption$/);
removeNodesRegex(doc, / google /);
removeNodesRegex(doc, /^[^entry-]more.*$/);
removeNodesRegex(doc, /[^-]facebook/);
removeNodesRegex(doc, /facebook-broadcasting/);
removeNodesRegex(doc, /[^-]twitter/);
cleanParaSpans(doc);
cleanUnderlines(doc);
cleanErrantLineBreaks(doc);
divToPara(doc, "div");
divToPara(doc, "span");
return doc;
};
// Sanitization function to remove HTML/XML tags
const sanitizeJsonLdString = (jsonLdString) => {
// Remove anything that looks like an HTML/XML tag (this is a basic example, might need adjustments)
return jsonLdString.replace(/<\/?[^>]+(>|$)/g, "").trim();
};
exports.sanitizeJsonLdString = sanitizeJsonLdString;
exports.default = cleaner;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGVhbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNEQUE4QjtBQUU5QixTQUFTLGdCQUFnQixDQUFDLEdBQWlCO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBYyxFQUFFLE9BQXdCLEVBQUUsRUFBRTtRQUN6RCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQWlCO0lBQ3JDLE1BQU0sYUFBYSxHQUNqQixpcEJBQWlwQixDQUFDO0lBQ3BwQixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFN0MsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUM5QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNw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QUMsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGLGdEQUFnRDtBQUN6QyxNQUFNLG9CQUFvQixHQUFHLENBQUMsWUFBb0IsRUFBVSxFQUFFO0lBQ25FLG9HQUFvRztJQUNwRyxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDNUQsQ0FBQyxDQUFDO0FBSFcsUUFBQSxvQkFBb0Isd0JBRy9CO0FBRUYsa0JBQWUsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoZWVyaW8gZnJvbSBcImNoZWVyaW9cIjtcblxuZnVuY3Rpb24gY2xlYW5BcnRpY2xlVGFncyhkb2M6IGNoZWVyaW8uUm9vdCkge1xuICBjb25zdCBhcnRpY2xlcyA9IGRvYyhcImFydGljbGVcIik7XG4gIGFydGljbGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBkb2MoZWxlbWVudCkucmVtb3ZlQXR0cihcImlkXCIpO1xuICAgIGRvYyhlbGVtZW50KS5yZW1vdmVBdHRyKFwibmFtZVwiKTtcbiAgICBkb2MoZWxlbWVudCkucmVtb3ZlQXR0cihcImNsYXNzXCIpO1xuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5CYWRUYWdzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGNvbnN0IHJlbW92ZU5vZGVzUmUgPVxuICAgIFwiXnNpZGUkfGNvbWJ4fHJldHdlZXR8bWVkaWFhcnRpY2xlcmVsYXRlZHxtZW51Y29udGFpbmVyfG5hdmJhcnxwYXJ0bmVyLWdyYXZpdHktYWR8dmlkZW8tZnVsbC10cmFuc2NyaXB0fHN0b3J5dG9wYmFyLWJ1Y2tldHx1dGlsaXR5LWJhcnxpbmxpbmUtc2hhcmUtdG9vbHN8Y29tbWVudHxQb3B1bGFyUXVlc3Rpb25zfGNvbnRhY3R8Zm9vdHxmb290ZXJ8Rm9vdGVyfGZvb3Rub3RlfGNubl9zdHJ5Y2FwdGlvbnR4dHxjbm5faHRtbF9zbGlkZXNob3d8Y25uX3N0cnlsZnRjbnRudHxsaW5rc3xtZXRhJHxzaG91dGJveHxzcG9uc29yfHRhZ3N8c29jaWFsbmV0d29ya2luZ3xzb2NpYWxOZXR3b3JraW5nfGNublN0cnlIZ2hMZ2h0fGNubl9zdHJ5c3BjdmJ4fF5pbnNldCR8cGFnZXRvb2xzfHBvc3QtYXR0cmlidXRlc3x3ZWxjb21lX2Zvcm18Y29udGVudFRvb2xzMnx0aGVfYW5zd2Vyc3xjb21tdW5pdHlwcm9tb3xydW5hcm91bmRMZWZ0fHN1YnNjcmliZXx2Y2FyZHxhcnRpY2xlaGVhZGluZ3N8ZGF0ZXxecHJpbnQkfHBvcHVwfGF1dGhvci1kcm9wZG93bnx0b29sc3xzb2NpYWx0b29sc3xieWxpbmV8a29uYWZpbHRlcnxLb25hRmlsdGVyfGJyZWFkY3J1bWJzfF5mbiR8d3AtY2FwdGlvbi10ZXh0fGxlZ2VuZGV8YWpvdXRWaWRlb3x0aW1lc3RhbXB8anNfcmVwbGllc1wiO1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmVtb3ZlTm9kZXNSZSwgXCJpXCIpO1xuXG4gIGNvbnN0IHRvUmVtb3ZlID0gZG9jKFwiKlwiKS5maWx0ZXIoKF9pbmRleCwgZWwpID0+IHtcbiAgICBjb25zdCBpZEVsID0gZG9jKGVsKS5hdHRyKFwiaWRcIik7XG4gICAgY29uc3QgY2xhc3NFbCA9IGRvYyhlbCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGNvbnN0IG5hbWVFbCA9IGRvYyhlbCkuYXR0cihcIm5hbWVcIik7XG4gICAgaWYgKGlkRWwpIHtcbiAgICAgIHJldHVybiBpZEVsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG5hbWVFbCkge1xuICAgICAgcmV0dXJuIG5hbWVFbC5tYXRjaChyZWdleCkgIT09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgZG9jKHRvUmVtb3ZlKS5yZW1vdmUoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5Db2RlQmxvY2tzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGNvbnN0IG5vZGVzID0gZG9jKFwiW2NsYXNzKj0naGlnaGxpZ2h0LSddLCBwcmUgY29kZSwgY29kZSwgcHJlLCB1bC50YXNrLWxpc3RcIik7XG4gIG5vZGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBkb2MoZWxlbWVudCkucmVwbGFjZVdpdGgoZG9jKGVsZW1lbnQpLnRleHQoKSk7XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBjbGVhbkVtVGFncyhkb2M6IGNoZWVyaW8uUm9vdCkge1xuICBjb25zdCBlbXMgPSBkb2MoXCJlbVwiKTtcbiAgZW1zLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBpbWFnZXMgPSBlbXMuZmluZChcImltZ1wiKTtcbiAgICBpZiAoaW1hZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgaHRtbEVsID0gZG9jKGVsZW1lbnQpLmh0bWwoKTtcbiAgICAgIGlmIChodG1sRWwpIHtcbiAgICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5FcnJhbnRMaW5lQnJlYWtzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGRvYyhcInBcIikuZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBkb2MoZWxlbWVudCk7XG4gICAgY29uc3QgY29udGVudHMgPSBub2RlLmNvbnRlbnRzKCk7XG5cbiAgICBkb2MoY29udGVudHMpLmVhY2goKF9jaW5kZXg6IG51bWJlciwgY0VsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgY29udGVudHNOb2RlID0gZG9jKGNFbGVtZW50KTtcbiAgICAgIGlmIChjb250ZW50c05vZGUgJiYgY29udGVudHNOb2RlWzBdICYmIGNvbnRlbnRzTm9kZVswXS50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICBjb250ZW50c05vZGUucmVwbGFjZVdpdGgoXG4gICAgICAgICAgY29udGVudHNOb2RlLnRleHQoKS5yZXBsYWNlKC8oW15cXG5dKVxcbihbXlxcbl0pL2csIFwiJDEgJDJcIiksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBjbGVhblBhcmFTcGFucyhkb2M6IGNoZWVyaW8uUm9vdCkge1xuICBjb25zdCBub2RlcyA9IGRvYyhcInAgc3BhblwiKTtcbiAgbm9kZXMuZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5VbmRlcmxpbmVzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGNvbnN0IG5vZGVzID0gZG9jKFwidVwiKTtcbiAgbm9kZXMuZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gZGl2VG9QYXJhKGRvYzogY2hlZXJpby5Sb290LCBkb21UeXBlOiBzdHJpbmcpIHtcbiAgY29uc3QgZGl2cyA9IGRvYyhkb21UeXBlKTtcblxuICBjb25zdCB0YWdzID0gW1xuICAgIFwiYVwiLFxuICAgIFwiYmxvY2txdW90ZVwiLFxuICAgIFwiZGxcIixcbiAgICBcImRpdlwiLFxuICAgIFwiaW1nXCIsXG4gICAgXCJvbFwiLFxuICAgIFwicFwiLFxuICAgIFwicHJlXCIsXG4gICAgXCJ0YWJsZVwiLFxuICAgIFwidWxcIixcbiAgXTtcblxuICBkaXZzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBkaXYgPSBkb2MoZWxlbWVudCk7XG4gICAgY29uc3QgaXRlbXMgPSBkaXYuZmluZCh0YWdzLmpvaW4oXCIsIFwiKSk7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXBsYWNlV2l0aFBhcmEoZG9jLCBlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVwbGFjZU5vZGVzID0gZ2V0UmVwbGFjZW1lbnROb2Rlcyhkb2MsIGRpdik7XG5cbiAgICAgIGxldCBodG1sID0gXCJcIjtcbiAgICAgIHJlcGxhY2VOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChub2RlLnRleHQoKSAhPT0gXCJcIikge1xuICAgICAgICAgIGh0bWwgKz0gYDxwPiR7bm9kZX08L3A+YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGRpdi5lbXB0eSgpO1xuICAgICAgZG9jKGRpdikucmVwbGFjZVdpdGgoYCR7aHRtbH1gKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBnZXRSZXBsYWNlbWVudE5vZGVzKFxuICBkb2M6IGNoZWVyaW8uUm9vdCxcbiAgZGl2OiBjaGVlcmlvLkNoZWVyaW8sXG4pOiBjaGVlcmlvLkNoZWVyaW9bXSB7XG4gIGxldCByZXBsYWNlbWVudFRleHQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IG5vZGVzVG9SZXR1cm46IGNoZWVyaW8uQ2hlZXJpb1tdID0gW107XG4gIGNvbnN0IG5vZGVzVG9SZW1vdmU6IGNoZWVyaW8uQ2hlZXJpb1tdID0gW107XG4gIGNvbnN0IGNoaWxkcmVuID0gZGl2LmNvbnRlbnRzKCk7XG5cbiAgY2hpbGRyZW4uZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGRvYyhlbGVtZW50KTtcblxuICAgIGlmIChcbiAgICAgIGNoaWxkLmdldCgwKSAmJlxuICAgICAgY2hpbGQuZ2V0KDApLnRhZ05hbWUgPT09IFwicFwiICYmXG4gICAgICByZXBsYWNlbWVudFRleHQubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgY29uc3QgdGV4dCA9IHJlcGxhY2VtZW50VGV4dC5qb2luKFwiXCIpO1xuICAgICAgY29uc3QgdGV4dE5vZGVMb2FkID0gY2hlZXJpby5sb2FkKGA8cD4ke3RleHR9PC9wPmApO1xuICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2ModGV4dE5vZGVMb2FkKTtcbiAgICAgIC8vIGNyZWF0ZSBhIG5vZGUgb3V0IG9mIHRleHQgYW5kIHB1c2hcbiAgICAgIG5vZGVzVG9SZXR1cm4ucHVzaCh0ZXh0Tm9kZSk7XG4gICAgICByZXBsYWNlbWVudFRleHQgPSBbXTtcbiAgICAgIGNvbnN0IGNoaWxkRWwgPSBkb2MoZWxlbWVudCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGlsZC5nZXQoMCkgJiYgY2hpbGQuZ2V0KDApLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICBjb25zdCBjaGlsZFRleHROb2RlID0gY2hpbGQ7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBjaGlsZC50ZXh0KCk7XG4gICAgICBjb25zdCByZXBsYWNlVGV4dCA9IGNoaWxkVGV4dFxuICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxuXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoL15cXHMrJC9nLCBcIlwiKTtcblxuICAgICAgaWYgKHJlcGxhY2VUZXh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IHByZXZpb3VzU2libGluZ05vZGUgPSBjaGlsZFRleHROb2RlLnByZXYoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgcHJldmlvdXNTaWJsaW5nTm9kZS5nZXQoMCkgJiZcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlLmdldCgwKS50YWdOYW1lID09PSBcImFcIiAmJlxuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUuYXR0cihcImdydi11c2VkYWxyZWFkeVwiKSAhPT0gXCJ5ZXNcIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBvdXRlciA9IFwiIFwiICsgZG9jLmh0bWwocHJldmlvdXNTaWJsaW5nTm9kZSkgKyBcIiBcIjtcbiAgICAgICAgICByZXBsYWNlbWVudFRleHQucHVzaChvdXRlcik7XG4gICAgICAgICAgbm9kZXNUb1JlbW92ZS5wdXNoKHByZXZpb3VzU2libGluZ05vZGUpO1xuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUuYXR0cihcImdydi11c2VkYWxyZWFkeVwiLCBcInllc1wiKTtcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlID0gcHJldmlvdXNTaWJsaW5nTm9kZS5wcmV2KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXBsYWNlbWVudFRleHQucHVzaChyZXBsYWNlVGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRTaWJsaW5nTm9kZSA9IGNoaWxkVGV4dE5vZGUubmV4dCgpO1xuXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICBuZXh0U2libGluZ05vZGUuZ2V0KDApICYmXG4gICAgICAgICAgbmV4dFNpYmxpbmdOb2RlLmdldCgwKS50YWdOYW1lID09PSBcImFcIiAmJlxuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIpICE9PSBcInllc1wiXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG91dGVyID0gXCIgXCIgKyBkb2MuaHRtbChuZXh0U2libGluZ05vZGUpICsgXCIgXCI7XG4gICAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gob3V0ZXIpO1xuICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChuZXh0U2libGluZ05vZGUpO1xuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIsIFwieWVzXCIpO1xuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUgPSBuZXh0U2libGluZ05vZGUubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvdGhlcndpc2VcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hpbGRFbCA9IGRvYyhjaGlsZCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBmbHVzaCBvdXQgYW55dGhpbmcgc3RpbGwgcmVtYWluaW5nXG4gIGlmIChyZXBsYWNlbWVudFRleHQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHRleHQgPSByZXBsYWNlbWVudFRleHQuam9pbihcIlwiKTtcbiAgICBjb25zdCB0ZXh0Tm9kZUxvYWQgPSBjaGVlcmlvLmxvYWQoYDxwPiR7dGV4dH08L3A+YCk7XG4gICAgY29uc3QgdGV4dE5vZGUgPSBkb2ModGV4dE5vZGVMb2FkKTtcbiAgICBub2Rlc1RvUmV0dXJuLnB1c2godGV4dE5vZGUpO1xuICAgIHJlcGxhY2VtZW50VGV4dCA9IFtdO1xuICB9XG5cbiAgbm9kZXNUb1JlbW92ZS5mb3JFYWNoKChub2RlOiBjaGVlcmlvLkNoZWVyaW8pID0+IHtcbiAgICBkb2Mobm9kZSkucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2Rlc1RvUmV0dXJuO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb2R5Q2xhc3Nlcyhkb2M6IGNoZWVyaW8uUm9vdCk6IGNoZWVyaW8uUm9vdCB7XG4gIGRvYyhcImJvZHlcIikucmVtb3ZlQ2xhc3MoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRHJvcENhcHMoZG9jOiBjaGVlcmlvLlJvb3QpOiBjaGVlcmlvLlJvb3Qge1xuICBjb25zdCBub2RlcyA9IGRvYyhcInNwYW5bY2xhc3N+PWRyb3BjYXBdLCBzcGFuW2NsYXNzfj1kcm9wX2NhcF1cIik7XG4gIG5vZGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBodG1sRWwgPSBkb2MoZWxlbWVudCkuaHRtbCgpO1xuICAgIGlmIChodG1sRWwpIHtcbiAgICAgIGRvYyhlbGVtZW50KS5yZXBsYWNlV2l0aChodG1sRWwpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVzUmVnZXgoZG9jOiBjaGVlcmlvLlJvb3QsIHBhdHRlcm46IFJlZ0V4cCkge1xuICBjb25zdCB0b1JlbW92ZSA9IGRvYyhcImRpdlwiKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGlkRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImlkXCIpO1xuICAgIGNvbnN0IGNsYXNzRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGlmIChpZEVsKSB7XG4gICAgICByZXR1cm4gaWRFbC5tYXRjaChwYXR0ZXJuKSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHBhdHRlcm4pICE9PSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuICBkb2ModG9SZW1vdmUpLnJlbW92ZSgpO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTY3JpcHRzU3R5bGVzKGRvYzogY2hlZXJpby5Sb290KTogY2hlZXJpby5DaGVlcmlvIHtcbiAgZG9jKFwic2NyaXB0XCIpLnJlbW92ZSgpO1xuICBkb2MoXCJzdHlsZVwiKS5yZW1vdmUoKTtcblxuICBjb25zdCBjb21tZW50cyA9IGRvYyhcIipcIilcbiAgICAuY29udGVudHMoKVxuICAgIC5maWx0ZXIoKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgPT09IFwiY29tbWVudFwiO1xuICAgIH0pO1xuXG4gIHJldHVybiBkb2MoY29tbWVudHMpLnJlbW92ZSgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aFBhcmEoXG4gIGRvYzogY2hlZXJpby5Sb290LFxuICBkaXY6IGNoZWVyaW8uRWxlbWVudCxcbik6IGNoZWVyaW8uUm9vdCB7XG4gIGNvbnN0IGRpdkNvbnRlbnQgPSBkb2MoZGl2KS5odG1sKCk7XG4gIGRvYyhkaXYpLnJlcGxhY2VXaXRoKGA8cD4ke2RpdkNvbnRlbnR9PC9wPmApO1xuICByZXR1cm4gZG9jO1xufVxuXG5jb25zdCBjbGVhbmVyID0gKGRvYzogY2hlZXJpby5Sb290KTogY2hlZXJpby5Sb290ID0+IHtcbiAgcmVtb3ZlQm9keUNsYXNzZXMoZG9jKTtcbiAgY2xlYW5BcnRpY2xlVGFncyhkb2MpO1xuICBjbGVhbkVtVGFncyhkb2MpO1xuICBjbGVhbkNvZGVCbG9ja3MoZG9jKTtcbiAgcmVtb3ZlRHJvcENhcHMoZG9jKTtcbiAgcmVtb3ZlU2NyaXB0c1N0eWxlcyhkb2MpO1xuICBjbGVhbkJhZFRhZ3MoZG9jKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9eY2FwdGlvbiQvKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC8gZ29vZ2xlIC8pO1xuICByZW1vdmVOb2Rlc1JlZ2V4KGRvYywgL15bXmVudHJ5LV1tb3JlLiokLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvW14tXWZhY2Vib29rLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvZmFjZWJvb2stYnJvYWRjYXN0aW5nLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvW14tXXR3aXR0ZXIvKTtcbiAgY2xlYW5QYXJhU3BhbnMoZG9jKTtcbiAgY2xlYW5VbmRlcmxpbmVzKGRvYyk7XG4gIGNsZWFuRXJyYW50TGluZUJyZWFrcyhkb2MpO1xuICBkaXZUb1BhcmEoZG9jLCBcImRpdlwiKTtcbiAgZGl2VG9QYXJhKGRvYywgXCJzcGFuXCIpO1xuICByZXR1cm4gZG9jO1xufTtcblxuLy8gU2FuaXRpemF0aW9uIGZ1bmN0aW9uIHRvIHJlbW92ZSBIVE1ML1hNTCB0YWdzXG5leHBvcnQgY29uc3Qgc2FuaXRpemVKc29uTGRTdHJpbmcgPSAoanNvbkxkU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBSZW1vdmUgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGFuIEhUTUwvWE1MIHRhZyAodGhpcyBpcyBhIGJhc2ljIGV4YW1wbGUsIG1pZ2h0IG5lZWQgYWRqdXN0bWVudHMpXG4gIHJldHVybiBqc29uTGRTdHJpbmcucmVwbGFjZSgvPFxcLz9bXj5dKyg+fCQpL2csIFwiXCIpLnRyaW0oKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsZWFuZXI7XG4iXX0=