UNPKG

@testplane/webdriverio

Version:

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

104 lines (103 loc) 16.2 kB
// src/scripts/isElementClickable.ts function isElementClickable(elem) { if (!elem.getBoundingClientRect || !elem.scrollIntoView || !elem.contains || !elem.getClientRects || !document.elementFromPoint) { return false; } const isOldEdge = !!window.StyleMedia; const scrollIntoViewFullSupport = !(window.safari || isOldEdge); function getOverlappingElement(elem2, context) { context = context || document; const elemDimension = elem2.getBoundingClientRect(); const x = elemDimension.left + elem2.clientWidth / 2; const y = elemDimension.top + elem2.clientHeight / 2; return context.elementFromPoint(x, y); } function getOverlappingRects(elem2, context) { context = context || document; const rects = elem2.getClientRects(); const rect = rects[0]; const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; return [context.elementFromPoint(x, y)]; } function getOverlappingElements(elem2, context) { return [getOverlappingElement(elem2, context)].concat(getOverlappingRects(elem2, context)); } function nodeContains(elem2, otherNode) { if (isOldEdge) { let tmpElement = otherNode; while (tmpElement) { if (tmpElement === elem2) { return true; } tmpElement = tmpElement.parentNode; if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) { tmpElement = tmpElement.host; } } return false; } return elem2.contains(otherNode); } function isOverlappingElementMatch(elementsFromPoint, elem2) { if (elementsFromPoint.some(function(elementFromPoint) { return elementFromPoint === elem2 || nodeContains(elem2, elementFromPoint); })) { return true; } let elemsWithShadowRoot = [].concat(elementsFromPoint); elemsWithShadowRoot = elemsWithShadowRoot.filter(function(x) { return x && x.shadowRoot && x.shadowRoot.elementFromPoint; }); let shadowElementsFromPoint = []; for (let i = 0; i < elemsWithShadowRoot.length; ++i) { const shadowElement = elemsWithShadowRoot[i]; shadowElementsFromPoint = shadowElementsFromPoint.concat( getOverlappingElements(elem2, shadowElement.shadowRoot) ); } shadowElementsFromPoint = [].concat(shadowElementsFromPoint); shadowElementsFromPoint = shadowElementsFromPoint.filter(function(x) { return !elementsFromPoint.includes(x); }); if (shadowElementsFromPoint.length === 0) { return false; } return isOverlappingElementMatch(shadowElementsFromPoint, elem2); } function isElementInViewport(elem2) { if (!elem2.getBoundingClientRect) { return false; } const rect = elem2.getBoundingClientRect(); const windowHeight = window.innerHeight || document.documentElement.clientHeight; const windowWidth = window.innerWidth || document.documentElement.clientWidth; const vertInView = rect.top <= windowHeight && rect.top + rect.height > 0; const horInView = rect.left <= windowWidth && rect.left + rect.width > 0; return vertInView && horInView; } function isEnabled(elem2) { return elem2.disabled !== true; } function hasOverlaps(elem2) { return !isOverlappingElementMatch(getOverlappingElements(elem2), elem2); } function isFullyDisplayedInViewport(elem2) { return isElementInViewport(elem2) && !hasOverlaps(elem2); } let _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem); if (!_isFullyDisplayedInViewport) { const { x: originalX, y: originalY } = elem.getBoundingClientRect(); elem.scrollIntoView(scrollIntoViewFullSupport ? { block: "center", inline: "center" } : false); _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem); const { x, y } = elem.getBoundingClientRect(); if (x !== originalX || y !== originalY) { elem.scroll(scrollX, scrollY); } } return _isFullyDisplayedInViewport && isEnabled(elem); } export { isElementClickable as default }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NjcmlwdHMvaXNFbGVtZW50Q2xpY2thYmxlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL1VzZXJzL2tyb21hbjUxMi9nZW1pbmktdGVzdGluZy93ZWJkcml2ZXJpby9wYWNrYWdlcy93ZWJkcml2ZXJpbyIsCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIGNoZWNrIGlmIGVsZW1lbnQgaXMgd2l0aGluIHRoZSB2aWV3cG9ydCBvciBpcyBvdmVybGFwcGVkIGJ5IGFub3RoZXIgZWxlbWVudCBvciBkaXNhYmxlZFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW0gIGVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICAgICBmYWxzZSBpZiBlbGVtZW50IGlzIG5vdCBvdmVybGFwcGVkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzRWxlbWVudENsaWNrYWJsZSAoZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHx8ICFlbGVtLnNjcm9sbEludG9WaWV3IHx8ICFlbGVtLmNvbnRhaW5zIHx8ICFlbGVtLmdldENsaWVudFJlY3RzIHx8ICFkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIEVkZ2UgYmVmb3JlIHN3aXRjaGluZyB0byBDaHJvbWl1bVxuICAgIGNvbnN0IGlzT2xkRWRnZSA9ICEhKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgU3R5bGVNZWRpYTogdW5rbm93biB9KS5TdHlsZU1lZGlhXG4gICAgLy8gcmV0dXJucyB0cnVlIGZvciBDaHJvbWUgYW5kIEZpcmVmb3ggYW5kIGZhbHNlIGZvciBTYWZhcmksIEVkZ2UgYW5kIElFXG4gICAgY29uc3Qgc2Nyb2xsSW50b1ZpZXdGdWxsU3VwcG9ydCA9ICEoKHdpbmRvdyBhcyB7IHNhZmFyaT86IGJvb2xlYW4gfSkuc2FmYXJpIHx8IGlzT2xkRWRnZSlcblxuICAgIC8vIGdldCBvdmVybGFwcGluZyBlbGVtZW50XG4gICAgZnVuY3Rpb24gZ2V0T3ZlcmxhcHBpbmdFbGVtZW50IChlbGVtOiBIVE1MRWxlbWVudCwgY29udGV4dD86IERvY3VtZW50KSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGVsZW1EaW1lbnNpb24gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGNvbnN0IHggPSBlbGVtRGltZW5zaW9uLmxlZnQgKyAoZWxlbS5jbGllbnRXaWR0aCAvIDIpXG4gICAgICAgIGNvbnN0IHkgPSBlbGVtRGltZW5zaW9uLnRvcCArIChlbGVtLmNsaWVudEhlaWdodCAvIDIpXG4gICAgICAgIHJldHVybiBjb250ZXh0LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSlcbiAgICB9XG5cbiAgICAvLyBnZXQgb3ZlcmxhcHBpbmcgZWxlbWVudCByZWN0cyAoY3VycmVudGx5IG9ubHkgdGhlIGZpcnN0KVxuICAgIC8vIGFwcGxpY2FibGUgaWYgZWxlbWVudCdzIHRleHQgaXMgbXVsdGlsaW5lLlxuICAgIGZ1bmN0aW9uIGdldE92ZXJsYXBwaW5nUmVjdHMgKGVsZW06IEhUTUxFbGVtZW50LCBjb250ZXh0PzogRG9jdW1lbnQpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnRcblxuICAgICAgICBjb25zdCByZWN0cyA9IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKVxuICAgICAgICAvLyB3ZWJkcml2ZXIgY2xpY2tzIG9uIGNlbnRlciBvZiB0aGUgZmlyc3QgZWxlbWVudCdzIHJlY3QgKGxpbmUgb2YgdGV4dCksIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmVcbiAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzWzBdXG4gICAgICAgIGNvbnN0IHggPSByZWN0LmxlZnQgKyAocmVjdC53aWR0aCAvIDIpXG4gICAgICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIChyZWN0LmhlaWdodCAvIDIpXG4gICAgICAgIHJldHVybiBbY29udGV4dC5lbGVtZW50RnJvbVBvaW50KHgsIHkpXVxuICAgIH1cblxuICAgIC8vIGdldCBvdmVybGFwcGluZyBlbGVtZW50c1xuICAgIGZ1bmN0aW9uIGdldE92ZXJsYXBwaW5nRWxlbWVudHMgKGVsZW06IEhUTUxFbGVtZW50LCBjb250ZXh0PzogRG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFtnZXRPdmVybGFwcGluZ0VsZW1lbnQoZWxlbSwgY29udGV4dCldLmNvbmNhdChnZXRPdmVybGFwcGluZ1JlY3RzKGVsZW0sIGNvbnRleHQpKVxuICAgIH1cblxuICAgIC8vIGlzIGEgbm9kZSBhIGRlc2NlbmRhbnQgb2YgYSBnaXZlbiBub2RlXG4gICAgZnVuY3Rpb24gbm9kZUNvbnRhaW5zIChlbGVtOiBIVE1MRWxlbWVudCwgb3RoZXJOb2RlOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBFZGdlIGRvZXNuJ3Qgc3VwcG9ydCBuZWl0aGVyIFNoYWRvdyBEb20gbm9yIGNvbnRhaW5zIGlmIFNoYWRvd1Jvb3QgcG9seWZpbGwgaXMgdXNlZFxuICAgICAgICBpZiAoaXNPbGRFZGdlKSB7XG4gICAgICAgICAgICBsZXQgdG1wRWxlbWVudCA9IG90aGVyTm9kZSBhcyBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBFbGVtZW50XG4gICAgICAgICAgICB3aGlsZSAodG1wRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmICh0bXBFbGVtZW50ID09PSBlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG1wRWxlbWVudCA9IHRtcEVsZW1lbnQucGFyZW50Tm9kZSBhcyBTaGFkb3dSb290XG4gICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRGcmFnbWVudCAvIFNoYWRvd1Jvb3QgcG9seWZpbGwgbGlrZSBTaGFkeVJvb3RcbiAgICAgICAgICAgICAgICBpZiAodG1wRWxlbWVudCAmJiB0bXBFbGVtZW50Lm5vZGVUeXBlID09PSAxMSAmJiB0bXBFbGVtZW50Lmhvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wRWxlbWVudCA9IHRtcEVsZW1lbnQuaG9zdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW0uY29udGFpbnMob3RoZXJOb2RlKVxuICAgIH1cblxuICAgIC8vIGlzIG9uZSBvZiBvdmVybGFwcGluZyBlbGVtZW50cyB0aGUgYGVsZW1gIG9yIG9uZSBvZiBpdHMgY2hpbGRcbiAgICBmdW5jdGlvbiBpc092ZXJsYXBwaW5nRWxlbWVudE1hdGNoIChlbGVtZW50c0Zyb21Qb2ludDogSFRNTEVsZW1lbnRbXSwgZWxlbTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzRnJvbVBvaW50LnNvbWUoZnVuY3Rpb24gKGVsZW1lbnRGcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50RnJvbVBvaW50ID09PSBlbGVtIHx8IG5vZGVDb250YWlucyhlbGVtLCBlbGVtZW50RnJvbVBvaW50KVxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNoYWRvdyByb290XG4gICAgICAgIC8vIGZpbHRlciB1bmlxdWUgZWxlbWVudHMgd2l0aCBzaGFkb3dSb290XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IGVsZW1zV2l0aFNoYWRvd1Jvb3QgPSBbXS5jb25jYXQoZWxlbWVudHNGcm9tUG9pbnQpXG4gICAgICAgIGVsZW1zV2l0aFNoYWRvd1Jvb3QgPSBlbGVtc1dpdGhTaGFkb3dSb290LmZpbHRlcihmdW5jdGlvbiAoeDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB4ICYmIHguc2hhZG93Um9vdCAmJiAoeC5zaGFkb3dSb290IGFzIFNoYWRvd1Jvb3QpLmVsZW1lbnRGcm9tUG9pbnRcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBnZXRPdmVybGFwcGluZ0VsZW1lbnRzIG9mIGV2ZXJ5IGVsZW1lbnQgd2l0aCBzaGFkb3dSb290XG4gICAgICAgIGxldCBzaGFkb3dFbGVtZW50c0Zyb21Qb2ludDogSFRNTEVsZW1lbnRbXSA9IFtdXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbXNXaXRoU2hhZG93Um9vdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93RWxlbWVudCA9IGVsZW1zV2l0aFNoYWRvd1Jvb3RbaV1cbiAgICAgICAgICAgIHNoYWRvd0VsZW1lbnRzRnJvbVBvaW50ID0gc2hhZG93RWxlbWVudHNGcm9tUG9pbnQuY29uY2F0KFxuICAgICAgICAgICAgICAgIGdldE92ZXJsYXBwaW5nRWxlbWVudHMoZWxlbSwgKHNoYWRvd0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnNoYWRvd1Jvb3QgYXMgdW5rbm93biBhcyBEb2N1bWVudCkgYXMgSFRNTEVsZW1lbnRbXVxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBkdXBsaWNhdGVzIGFuZCBwYXJlbnRzXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc2hhZG93RWxlbWVudHNGcm9tUG9pbnQgPSBbXS5jb25jYXQoc2hhZG93RWxlbWVudHNGcm9tUG9pbnQpXG4gICAgICAgIHNoYWRvd0VsZW1lbnRzRnJvbVBvaW50ID0gc2hhZG93RWxlbWVudHNGcm9tUG9pbnQuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnRzRnJvbVBvaW50LmluY2x1ZGVzKHgpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHNoYWRvd0VsZW1lbnRzRnJvbVBvaW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNPdmVybGFwcGluZ0VsZW1lbnRNYXRjaChzaGFkb3dFbGVtZW50c0Zyb21Qb2ludCwgZWxlbSlcbiAgICB9XG5cbiAgICAvLyBjb3BpZWQgZnJvbSBgaXNFbGVtZW50SW5WaWV3cG9ydC5qc2BcbiAgICBmdW5jdGlvbiBpc0VsZW1lbnRJblZpZXdwb3J0IChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KVxuICAgICAgICBjb25zdCB3aW5kb3dXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpXG5cbiAgICAgICAgY29uc3QgdmVydEluVmlldyA9IChyZWN0LnRvcCA8PSB3aW5kb3dIZWlnaHQpICYmICgocmVjdC50b3AgKyByZWN0LmhlaWdodCkgPiAwKVxuICAgICAgICBjb25zdCBob3JJblZpZXcgPSAocmVjdC5sZWZ0IDw9IHdpbmRvd1dpZHRoKSAmJiAoKHJlY3QubGVmdCArIHJlY3Qud2lkdGgpID4gMClcblxuICAgICAgICByZXR1cm4gKHZlcnRJblZpZXcgJiYgaG9ySW5WaWV3KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRW5hYmxlZChlbGVtOiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW0uZGlzYWJsZWQgIT09IHRydWVcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPdmVybGFwcyhlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gIWlzT3ZlcmxhcHBpbmdFbGVtZW50TWF0Y2goZ2V0T3ZlcmxhcHBpbmdFbGVtZW50cyhlbGVtKSBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50W10sIGVsZW0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNGdWxseURpc3BsYXllZEluVmlld3BvcnQoZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGlzRWxlbWVudEluVmlld3BvcnQoZWxlbSkgJiYgIWhhc092ZXJsYXBzKGVsZW0pXG4gICAgfVxuXG4gICAgLy8gc2Nyb2xsIHRoZSBlbGVtZW50IHRvIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0IHdoZW5cbiAgICAvLyBpdCBpcyBub3QgZnVsbHkgZGlzcGxheWVkIGluIHRoZSB2aWV3cG9ydCBvciBpcyBvdmVybGFwcGVkIGJ5IGFub3RoZXIgZWxlbWVudFxuICAgIC8vIHRvIGNoZWNrIGlmIGl0IHN0aWxsIG92ZXJsYXBwZWQvbm90IGluIHRoZSB2aWV3cG9ydFxuICAgIC8vIGFmdGVyd2FyZHMgd2Ugc2Nyb2xsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgbGV0IF9pc0Z1bGx5RGlzcGxheWVkSW5WaWV3cG9ydCA9IGlzRnVsbHlEaXNwbGF5ZWRJblZpZXdwb3J0KGVsZW0pXG4gICAgaWYgKCFfaXNGdWxseURpc3BsYXllZEluVmlld3BvcnQpIHtcbiAgICAgICAgY29uc3QgeyB4OiBvcmlnaW5hbFgsIHk6IG9yaWdpbmFsWSB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXG4gICAgICAgIGVsZW0uc2Nyb2xsSW50b1ZpZXcoc2Nyb2xsSW50b1ZpZXdGdWxsU3VwcG9ydCA/IHsgYmxvY2s6ICdjZW50ZXInLCBpbmxpbmU6ICdjZW50ZXInIH0gOiBmYWxzZSlcblxuICAgICAgICBfaXNGdWxseURpc3BsYXllZEluVmlld3BvcnQgPSBpc0Z1bGx5RGlzcGxheWVkSW5WaWV3cG9ydChlbGVtKVxuXG4gICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBpZiAoeCAhPT0gb3JpZ2luYWxYIHx8IHkgIT09IG9yaWdpbmFsWSkge1xuICAgICAgICAgICAgZWxlbS5zY3JvbGwoc2Nyb2xsWCwgc2Nyb2xsWSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfaXNGdWxseURpc3BsYXllZEluVmlld3BvcnQgJiYgaXNFbmFibGVkKGVsZW0gYXMgSFRNTEZvcm1FbGVtZW50KVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUtlLFNBQVIsbUJBQXFDLE1BQW1CO0FBQzNELE1BQUksQ0FBQyxLQUFLLHlCQUF5QixDQUFDLEtBQUssa0JBQWtCLENBQUMsS0FBSyxZQUFZLENBQUMsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTLGtCQUFrQjtBQUM3SCxXQUFPO0FBQUEsRUFDWDtBQUdBLFFBQU0sWUFBWSxDQUFDLENBQUUsT0FBOEM7QUFFbkUsUUFBTSw0QkFBNEIsRUFBRyxPQUFnQyxVQUFVO0FBRy9FLFdBQVMsc0JBQXVCQSxPQUFtQixTQUFvQjtBQUNuRSxjQUFVLFdBQVc7QUFDckIsVUFBTSxnQkFBZ0JBLE1BQUssc0JBQXNCO0FBQ2pELFVBQU0sSUFBSSxjQUFjLE9BQVFBLE1BQUssY0FBYztBQUNuRCxVQUFNLElBQUksY0FBYyxNQUFPQSxNQUFLLGVBQWU7QUFDbkQsV0FBTyxRQUFRLGlCQUFpQixHQUFHLENBQUM7QUFBQSxFQUN4QztBQUlBLFdBQVMsb0JBQXFCQSxPQUFtQixTQUFvQjtBQUNqRSxjQUFVLFdBQVc7QUFFckIsVUFBTSxRQUFRQSxNQUFLLGVBQWU7QUFFbEMsVUFBTSxPQUFPLE1BQU0sQ0FBQztBQUNwQixVQUFNLElBQUksS0FBSyxPQUFRLEtBQUssUUFBUTtBQUNwQyxVQUFNLElBQUksS0FBSyxNQUFPLEtBQUssU0FBUztBQUNwQyxXQUFPLENBQUMsUUFBUSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFBQSxFQUMxQztB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