UNPKG

@testplane/webdriverio

Version:

Next-gen browser and mobile automation test framework for Node.js

170 lines (169 loc) 24.8 kB
// src/scripts/isElementDisplayed.ts function isElementDisplayed(element) { function nodeIsElement(node) { if (!node) { return false; } switch (node.nodeType) { case Node.ELEMENT_NODE: case Node.DOCUMENT_NODE: case Node.DOCUMENT_FRAGMENT_NODE: return true; default: return false; } } function parentElementForElement(element2) { if (!element2) { return null; } return enclosingNodeOrSelfMatchingPredicate(element2.parentNode, nodeIsElement); } function enclosingNodeOrSelfMatchingPredicate(targetNode, predicate) { for (let node = targetNode; node && node !== targetNode.ownerDocument; node = node.parentNode) { if (predicate(node)) { return node; } } return null; } function enclosingElementOrSelfMatchingPredicate(targetElement, predicate) { for (let element2 = targetElement; element2 && element2 !== targetElement.ownerDocument; element2 = parentElementForElement(element2)) { if (predicate(element2)) { return element2; } } return null; } function cascadedStylePropertyForElement(element2, property) { if (!element2 || !property) { return null; } if ("ShadowRoot" in window && element2 instanceof window.ShadowRoot) { element2 = element2.host; } const computedStyle = window.getComputedStyle(element2); const computedStyleProperty = computedStyle.getPropertyValue(property); if (computedStyleProperty && computedStyleProperty !== "inherit") { return computedStyleProperty; } const parentElement = parentElementForElement(element2); return cascadedStylePropertyForElement(parentElement, property); } function elementHasBoundingBox(element2) { const boundingBox = element2.getBoundingClientRect(); return boundingBox.width > 0 && boundingBox.height > 0; } function elementSubtreeHasNonZeroDimensions(element2) { if (elementHasBoundingBox(element2)) { return true; } const boundingBox = element2.getBoundingClientRect(); if (element2.tagName.toUpperCase() === "PATH" && boundingBox.width + boundingBox.height > 0) { const strokeWidth = cascadedStylePropertyForElement(element2, "stroke-width"); return !!strokeWidth && parseInt(strokeWidth, 10) > 0; } const cascadedOverflow = cascadedStylePropertyForElement(element2, "overflow"); if (cascadedOverflow === "hidden") { return false; } return [].some.call(element2.childNodes, function(childNode) { if (childNode.nodeType === Node.TEXT_NODE) { return true; } if (nodeIsElement(childNode)) { return elementSubtreeHasNonZeroDimensions(childNode); } return false; }); } function elementOverflowsContainer(element2) { const cascadedOverflow = cascadedStylePropertyForElement(element2, "overflow"); if (cascadedOverflow !== "hidden") { return false; } return true; } function isElementSubtreeHiddenByOverflow(element2) { if (!element2) { return false; } if (!elementOverflowsContainer(element2)) { return false; } if (!element2.childNodes.length) { return false; } return [].every.call(element2.childNodes, function(childNode) { if (childNode.nodeType === Node.TEXT_NODE) { return false; } if (!nodeIsElement(childNode)) { return true; } if (!elementSubtreeHasNonZeroDimensions(childNode)) { return true; } return isElementSubtreeHiddenByOverflow(childNode); }); } function isElementInsideShadowRoot(element2) { if (!element2) { return false; } if (element2.parentNode && element2.parentNode.host) { return true; } return isElementInsideShadowRoot(element2.parentNode); } if (!isElementInsideShadowRoot(element) && // IE doesn't support document.contains, therefor check before using (typeof document.contains === "function" ? !document.contains(element) : !document.body.contains(element))) { return false; } switch (element.tagName.toUpperCase()) { case "BODY": return true; case "SCRIPT": case "NOSCRIPT": return false; case "OPTGROUP": case "OPTION": { const enclosingSelectElement = enclosingNodeOrSelfMatchingPredicate(element, function(e) { return e.tagName.toUpperCase() === "SELECT"; }); return isElementDisplayed(enclosingSelectElement); } case "INPUT": if (element.type === "hidden") { return false; } break; // case 'MAP': // FIXME: Selenium has special handling for <map> elements. We don't do anything now. default: break; } if (cascadedStylePropertyForElement(element, "visibility") !== "visible") { return false; } const hasAncestorWithZeroOpacity = !!enclosingElementOrSelfMatchingPredicate(element, function(e) { return Number(cascadedStylePropertyForElement(e, "opacity")) === 0; }); const hasAncestorWithDisplayNone = !!enclosingElementOrSelfMatchingPredicate(element, function(e) { return cascadedStylePropertyForElement(e, "display") === "none"; }); if (hasAncestorWithZeroOpacity || hasAncestorWithDisplayNone) { return false; } if (!elementSubtreeHasNonZeroDimensions(element)) { return false; } if (isElementSubtreeHiddenByOverflow(element) && !elementHasBoundingBox(element)) { return false; } return true; } export { isElementDisplayed as default }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NjcmlwdHMvaXNFbGVtZW50RGlzcGxheWVkLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL1VzZXJzL2R1ZGtldmljaC9qb2IvcHJvamVjdHMvZ2VtaW5pLXRlc3Rpbmcvd2ViZHJpdmVyaW8vcGFja2FnZXMvd2ViZHJpdmVyaW8iLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJ1xuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sXG4gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSXG4gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlNcbiAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRlxuICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qKlxuICogY2hlY2sgaWYgZWxlbWVudCBpcyB2aXNpYmxlXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxlbSAgZWxlbWVudCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgICAgIHRydWUgaWYgZWxlbWVudCBpcyB3aXRoaW4gdmlld3BvcnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNFbGVtZW50RGlzcGxheWVkIChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgZnVuY3Rpb24gbm9kZUlzRWxlbWVudChub2RlPzogRWxlbWVudCkge1xuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6XG4gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOlxuICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyZW50RWxlbWVudEZvckVsZW1lbnQoZWxlbWVudD86IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuY2xvc2luZ05vZGVPclNlbGZNYXRjaGluZ1ByZWRpY2F0ZShlbGVtZW50LnBhcmVudE5vZGUgYXMgUGFyZW50Tm9kZSwgbm9kZUlzRWxlbWVudClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmNsb3NpbmdOb2RlT3JTZWxmTWF0Y2hpbmdQcmVkaWNhdGUodGFyZ2V0Tm9kZTogUGFyZW50Tm9kZSB8IEhUTUxFbGVtZW50LCBwcmVkaWNhdGU6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgICBsZXQgbm9kZTogUGFyZW50Tm9kZSA9IHRhcmdldE5vZGU7XG4gICAgICAgICAgICBub2RlICYmIG5vZGUgIT09ICh0YXJnZXROb2RlIGFzIE5vZGUpLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBub2RlID0gKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnBhcmVudE5vZGUgYXMgUGFyZW50Tm9kZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmNsb3NpbmdFbGVtZW50T3JTZWxmTWF0Y2hpbmdQcmVkaWNhdGUodGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCwgcHJlZGljYXRlOiBGdW5jdGlvbikge1xuICAgICAgICBmb3IgKFxuICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgUGFyZW50Tm9kZSA9IHRhcmdldEVsZW1lbnQ7XG4gICAgICAgICAgICBlbGVtZW50ICYmIGVsZW1lbnQgIT09IHRhcmdldEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBwYXJlbnRFbGVtZW50Rm9yRWxlbWVudChlbGVtZW50IGFzIEhUTUxFbGVtZW50KSBhcyBIVE1MRWxlbWVudFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYXNjYWRlZFN0eWxlUHJvcGVydHlGb3JFbGVtZW50KFxuICAgICAgICBlbGVtZW50PzogRWxlbWVudCB8IFBhcmVudE5vZGUgfCBTaGFkb3dSb290LFxuICAgICAgICBwcm9wZXJ0eT86IHN0cmluZ1xuICAgICk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXByb3BlcnR5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGRvY3VtZW50LWZyYWdtZW50LCBza2lwIGl0IGFuZCB1c2UgZWxlbWVudC5ob3N0IGluc3RlYWQuIFRoaXMgaGFwcGVuc1xuICAgICAgICAvLyB3aGVuIHRoZSBlbGVtZW50IGlzIGluc2lkZSBhIHNoYWRvdyByb290LlxuICAgICAgICAvLyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSBlcnJvcnMgb24gZG9jdW1lbnQtZnJhZ21lbnQuXG4gICAgICAgIGlmICgnU2hhZG93Um9vdCcgaW4gd2luZG93ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuaG9zdFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQgYXMgRWxlbWVudClcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZVByb3BlcnR5ID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KVxuICAgICAgICBpZiAoY29tcHV0ZWRTdHlsZVByb3BlcnR5ICYmIGNvbXB1dGVkU3R5bGVQcm9wZXJ0eSAhPT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZWRTdHlsZVByb3BlcnR5XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZGVhbGx5IGdldFByb3BlcnR5VmFsdWUgd291bGQgcmV0dXJuIHRoZSAndXNlZCcgb3IgJ2FjdHVhbCcgdmFsdWUsIGJ1dFxuICAgICAgICAvLyBpdCBkb2Vzbid0IGZvciBsZWdhY3kgcmVhc29ucy4gU28gd2UgbmVlZCB0byBkbyBvdXIgb3duIHBvb3IgbWFuJ3MgY2FzY2FkZS5cbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBub24tJ2luaGVyaXQnIHZhbHVlIGZvdW5kIGluIGFuIGFuY2VzdG9yLlxuICAgICAgICAvLyBJbiBhbnkgY2FzZSwgZ2V0UHJvcGVydHlWYWx1ZSB3aWxsIG5vdCByZXR1cm4gJ2luaXRpYWwnLlxuXG4gICAgICAgIC8vIEZJWE1FOiB3aWxsIHRoaXMgaW5jb3JyZWN0bHkgaW5oZXJpdCBub24taW5oZXJpdGFibGUgQ1NTIHByb3BlcnRpZXM/XG4gICAgICAgIC8vIEkgdGhpbmsgYWxsIGltcG9ydGFudCBub24taW5oZXJpdGFibGUgcHJvcGVydGllcyAod2lkdGgsIGhlaWdodCwgZXRjLilcbiAgICAgICAgLy8gZm9yIG91ciBwdXJwb3NlcyBoZXJlIGFyZSBzcGVjaWFsbHkgcmVzb2x2ZWQsIHNvIHRoaXMgbWF5IG5vdCBiZSBhbiBpc3N1ZS5cbiAgICAgICAgLy8gU3BlY2lmaWNhdGlvbiBpcyBoZXJlOiBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudEZvckVsZW1lbnQoZWxlbWVudCBhcyBFbGVtZW50KSBhcyBQYXJlbnROb2RlXG4gICAgICAgIHJldHVybiBjYXNjYWRlZFN0eWxlUHJvcGVydHlGb3JFbGVtZW50KHBhcmVudEVsZW1lbnQsIHByb3BlcnR5KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVsZW1lbnRIYXNCb3VuZGluZ0JveChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICByZXR1cm4gYm91bmRpbmdCb3gud2lkdGggPiAwICYmIGJvdW5kaW5nQm94LmhlaWdodCA+IDBcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbGVtZW50U3VidHJlZUhhc05vblplcm9EaW1lbnNpb25zKGVsZW1lbnQ6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVsZW1lbnRIYXNCb3VuZGluZ0JveChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhdGhzIGNhbiBoYXZlIGEgemVybyB3aWR0aCBvciBoZWlnaHQuIFRyZWF0IHRoZW0gYXMgc2hvd24gaWYgdGhlIHN0cm9rZSB3aWR0aCBpcyBwb3NpdGl2ZS5cbiAgICAgICAgY29uc3QgYm91bmRpbmdCb3ggPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1BBVEgnICYmIGJvdW5kaW5nQm94LndpZHRoICsgYm91bmRpbmdCb3guaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBjYXNjYWRlZFN0eWxlUHJvcGVydHlGb3JFbGVtZW50KGVsZW1lbnQsICdzdHJva2Utd2lkdGgnKVxuICAgICAgICAgICAgcmV0dXJuICEhc3Ryb2tlV2lkdGggJiYgKHBhcnNlSW50KHN0cm9rZVdpZHRoLCAxMCkgPiAwKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FzY2FkZWRPdmVyZmxvdyA9IGNhc2NhZGVkU3R5bGVQcm9wZXJ0eUZvckVsZW1lbnQoZWxlbWVudCwgJ292ZXJmbG93JylcbiAgICAgICAgaWYgKGNhc2NhZGVkT3ZlcmZsb3cgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjb250YWluZXIncyBvdmVyZmxvdyBpcyBub3QgaGlkZGVuIGFuZCBpdCBoYXMgemVybyBzaXplLCBjb25zaWRlciB0aGVcbiAgICAgICAgLy8gY29udGFpbmVyIHRvIGhhdmUgbm9uLXplcm8gZGltZW5zaW9ucyBpZiBhIGNoaWxkIG5vZGUgaGFzIG5vbi16ZXJvIGRpbWVuc2lvbnMuXG4gICAgICAgIHJldHVybiBbXS5zb21lLmNhbGwoZWxlbWVudC5jaGlsZE5vZGVzLCBmdW5jdGlvbiAoY2hpbGROb2RlOiBFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlSXNFbGVtZW50KGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFN1YnRyZWVIYXNOb25aZXJvRGltZW5zaW9ucyhjaGlsZE5vZGUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVsZW1lbnRPdmVyZmxvd3NDb250YWluZXIoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjYXNjYWRlZE92ZXJmbG93ID0gY2FzY2FkZWRTdHlsZVByb3BlcnR5Rm9yRWxlbWVudChlbGVtZW50LCAnb3ZlcmZsb3cnKVxuICAgICAgICBpZiAoY2FzY2FkZWRPdmVyZmxvdyAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRklYTUU6IHRoaXMgbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCxcbiAgICAgICAgLy8gdGhlIGRpc3BsYXkgbW9kZXMgb2YgaXQgYW5kIGl0cyBhbmNlc3RvcnMsIGFuZCB0aGUgY29udGFpbmVyIGl0IG92ZXJmbG93cy5cbiAgICAgICAgLy8gU2VlIFNlbGVuaXVtJ3MgYm90LmRvbS5nZXRPdmVyZmxvd1N0YXRlIGF0b20gZm9yIGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBlZGdlIGNhc2VzLlxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRWxlbWVudFN1YnRyZWVIaWRkZW5CeU92ZXJmbG93IChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVsZW1lbnRPdmVyZmxvd3NDb250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgZWxlbWVudCdzIHN1YnRyZWUgaXMgaGlkZGVuIGJ5IG92ZXJmbG93IGlmIGFsbCBjaGlsZCBzdWJ0cmVlcyBhcmUgYXMgd2VsbC5cbiAgICAgICAgcmV0dXJuIFtdLmV2ZXJ5LmNhbGwoZWxlbWVudC5jaGlsZE5vZGVzLCBmdW5jdGlvbiAoY2hpbGROb2RlOiBFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNoaWxkIG5vZGUgaXMgb3ZlcmZsb3dlZCBvciBvdGhlcndpc2UgaGlkZGVuLlxuICAgICAgICAgICAgLy8gQmFzZSBjYXNlOiBub3QgYW4gZWxlbWVudCwgaGFzIHplcm8gc2l6ZSwgc2Nyb2xsZWQgb3V0LCBvciBkb2Vzbid0IG92ZXJmbG93IGNvbnRhaW5lci5cbiAgICAgICAgICAgIC8vIFZpc2liaWxpdHkgb2YgdGV4dCBub2RlcyBpcyBjb250cm9sbGVkIGJ5IHBhcmVudFxuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbm9kZUlzRWxlbWVudChjaGlsZE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFlbGVtZW50U3VidHJlZUhhc05vblplcm9EaW1lbnNpb25zKGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWN1cnNlLlxuICAgICAgICAgICAgcmV0dXJuIGlzRWxlbWVudFN1YnRyZWVIaWRkZW5CeU92ZXJmbG93KGNoaWxkTm9kZSlcbiAgICAgICAgfSlcbiAgICB9XG4gICAgLy8gd2FsayB1cCB0aGUgdHJlZSB0ZXN0aW5nIGZvciBhIHNoYWRvdyByb290XG4gICAgZnVuY3Rpb24gaXNFbGVtZW50SW5zaWRlU2hhZG93Um9vdCAoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgJiYgKGVsZW1lbnQucGFyZW50Tm9kZSBhcyBTaGFkb3dSb290KS5ob3N0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0VsZW1lbnRJbnNpZGVTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSBhcyBFbGVtZW50KVxuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgYSBwYXJ0aWFsIHJlaW1wbGVtZW50YXRpb24gb2YgU2VsZW5pdW0ncyBcImVsZW1lbnQgaXMgZGlzcGxheWVkXCIgYWxnb3JpdGhtLlxuICAgIC8vIFdoZW4gdGhlIFczQyBzcGVjaWZpY2F0aW9uJ3MgYWxnb3JpdGhtIHN0YWJpbGl6ZXMsIHdlIHNob3VsZCBpbXBsZW1lbnQgdGhhdC5cbiAgICAvLyBJZiB0aGlzIGNvbW1hbmQgaXMgbWlzZGlyZWN0ZWQgdG8gdGhlIHdyb25nIGRvY3VtZW50IChhbmQgaXMgTk9UIGluc2lkZSBhIHNoYWRvdyByb290KSwgdHJlYXQgaXQgYXMgbm90IHNob3duLlxuICAgIGlmIChcbiAgICAgICAgIWlzRWxlbWVudEluc2lkZVNoYWRvd1Jvb3QoZWxlbWVudCkgJiZcbiAgICAgICAgKFxuICAgICAgICAgICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IGRvY3VtZW50LmNvbnRhaW5zLCB0aGVyZWZvciBjaGVjayBiZWZvcmUgdXNpbmdcbiAgICAgICAgICAgIHR5cGVvZiBkb2N1bWVudC5jb250YWlucyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgID8gIWRvY3VtZW50LmNvbnRhaW5zKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgOiAhZG9jdW1lbnQuYm9keS5jb250YWlucyhlbGVtZW50KVxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgZm9yIHNwZWNpZmljIHRhZyBuYW1lcy5cbiAgICBzd2l0Y2ggKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICAgIHJldHVybiB0cnVlXG5cbiAgICBjYXNlICdTQ1JJUFQnOlxuICAgIGNhc2UgJ05PU0NSSVBUJzpcbiAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBjYXNlICdPUFRHUk9VUCc6XG4gICAgY2FzZSAnT1BUSU9OJzoge1xuICAgICAgICAvLyBPcHRpb24vb3B0Z3JvdXAgYXJlIGNvbnNpZGVyZWQgc2hvd24gaWYgdGhlIGNvbnRhaW5pbmcgPHNlbGVjdD4gaXMgc2hvd24uXG4gICAgICAgIGNvbnN0IGVuY2xvc2luZ1NlbGVjdEVsZW1lbnQgPSBlbmNsb3NpbmdOb2RlT3JTZWxmTWF0Y2hpbmdQcmVkaWNhdGUoZWxlbWVudCwgZnVuY3Rpb24gKGU6IEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NFTEVDVCdcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlzRWxlbWVudERpc3BsYXllZChlbmNsb3NpbmdTZWxlY3RFbGVtZW50IGFzIEVsZW1lbnQpXG4gICAgfVxuICAgIGNhc2UgJ0lOUFVUJzpcbiAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJoaWRkZW5cIj4gaXMgY29uc2lkZXJlZCBub3Qgc2hvd24uXG4gICAgICAgIGlmICgoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS50eXBlID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgICAgLy8gY2FzZSAnTUFQJzpcbiAgICAgICAgLy8gRklYTUU6IFNlbGVuaXVtIGhhcyBzcGVjaWFsIGhhbmRsaW5nIGZvciA8bWFwPiBlbGVtZW50cy4gV2UgZG9uJ3QgZG8gYW55dGhpbmcgbm93LlxuXG4gICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoY2FzY2FkZWRTdHlsZVByb3BlcnR5Rm9yRWxlbWVudChlbGVtZW50LCAndmlzaWJpbGl0eScpICE9PSAndmlzaWJsZScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgaGFzQW5jZXN0b3JXaXRoWmVyb09wYWNpdHkgPSAhIWVuY2xvc2luZ0VsZW1lbnRPclNlbGZNYXRjaGluZ1ByZWRpY2F0ZShlbGVtZW50IGFzIEhUTUxFbGVtZW50LCBmdW5jdGlvbiAoZTogRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKGNhc2NhZGVkU3R5bGVQcm9wZXJ0eUZvckVsZW1lbnQoZSwgJ29wYWNpdHknKSkgPT09IDBcbiAgICB9KVxuICAgIGNvbnN0IGhhc0FuY2VzdG9yV2l0aERpc3BsYXlOb25lID0gISFlbmNsb3NpbmdFbGVtZW50T3JTZWxmTWF0Y2hpbmdQcmVkaWNhdGUoZWxlbWVudCBhcyBIVE1MRWxlbWVudCwgZnVuY3Rpb24gKGU6IEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGNhc2NhZGVkU3R5bGVQcm9wZXJ0eUZvckVsZW1lbnQoZSwgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnXG4gICAgfSlcbiAgICBpZiAoaGFzQW5jZXN0b3JXaXRoWmVyb09wYWNpdHkgfHwgaGFzQW5jZXN0b3JXaXRoRGlzcGxheU5vbmUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50U3VidHJlZUhhc05vblplcm9EaW1lbnNpb25zKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChpc0VsZW1lbnRTdWJ0cmVlSGlkZGVuQnlPdmVyZmxvdyhlbGVtZW50KSAmJiAhZWxlbWVudEhhc0JvdW5kaW5nQm94KGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBOEJlLFNBQVIsbUJBQXFDLFNBQTJCO0FBQ25FLFdBQVMsY0FBYyxNQUFnQjtBQUNuQyxRQUFJLENBQUMsTUFBTTtBQUNQLGFBQU87QUFBQSxJQUNYO0FBRUEsWUFBUSxLQUFLLFVBQVU7QUFBQSxNQUN2QixLQUFLLEtBQUs7QUFBQSxNQUNWLEtBQUssS0FBSztBQUFBLE1BQ1YsS0FBSyxLQUFLO0FBQ04sZUFBTztBQUFBLE1BRVg7QUFDSSxlQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFFQSxXQUFTLHdCQUF3QkEsVUFBbUI7QUFDaEQsUUFBSSxDQUFDQSxVQUFTO0FBQ1YsYUFBTztBQUFBLElBQ1g7QUFFQSxXQUFPLHFDQUFxQ0EsU0FBUSxZQUEwQixhQUFhO0FBQUEsRUFDL0Y7QUFFQSxXQUFTLHFDQUFxQyxZQUFzQyxXQUFxQjtBQUNyRyxhQUNRLE9BQW1CLFlBQ3ZCLFFBQVEsU0FBVSxXQUFvQixlQUN0QyxPQUFRLEtBQXFCLFlBQy9CO0FBQ0UsVUFBSSxVQUFVLElBQUksR0FBRztBQUNqQixlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUVBLFdBQVMsd0NBQXdDLGVBQXVDLFdBQXFCO0FBQ3pHLGFBQ1FBLFdBQW9DLGVBQ3hDQSxZQUFXQSxhQUFZLGNBQWMsZUFDckNBLFdBQVUsd0JBQXdCQSxRQUFzQixHQUMxRDtBQUNFLFVBQUksVUFBVUEsUUFBTyxHQUFHO0FBQ3BCLGVBQU9BO0FBQUEsTUFDWDtBQUFBLElB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