ably-ui 4.5.0 → 5.0.0.dev.bf26560

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +13 -17
  4. data/lib/ably_ui/core/code/component.css +2 -0
  5. data/lib/ably_ui/core/code/component.js +7468 -1
  6. data/lib/ably_ui/core/connect_state_wrapper/component.js +22 -1
  7. data/lib/ably_ui/core/contact_footer/component.css +2 -0
  8. data/lib/ably_ui/core/contact_footer/component.js +211 -1
  9. data/lib/ably_ui/core/cookie_message/component.css +2 -0
  10. data/lib/ably_ui/core/cookie_message/component.js +82 -1
  11. data/lib/ably_ui/core/core.base.css +1 -0
  12. data/lib/ably_ui/core/core.components.css +49 -0
  13. data/lib/ably_ui/core/feature_footer/component.css +2 -0
  14. data/lib/ably_ui/core/feature_footer/component.js +211 -1
  15. data/lib/ably_ui/core/featured_link/component.css +2 -0
  16. data/lib/ably_ui/core/featured_link/component.js +82 -1
  17. data/lib/ably_ui/core/flash/component.css +2 -0
  18. data/lib/ably_ui/core/flash/component.js +82 -1
  19. data/lib/ably_ui/core/footer/component.css +2 -0
  20. data/lib/ably_ui/core/footer/component.js +82 -1
  21. data/lib/ably_ui/core/icon/component.css +1 -0
  22. data/lib/ably_ui/core/icon/component.js +22 -1
  23. data/lib/ably_ui/core/logo/component.js +22 -1
  24. data/lib/ably_ui/core/meganav/component.css +2 -0
  25. data/lib/ably_ui/core/meganav/component.js +1857 -1
  26. data/lib/ably_ui/core/meganav_blog_posts_list/component.js +1934 -1
  27. data/lib/ably_ui/core/meganav_content_developers/component.js +22 -1
  28. data/lib/ably_ui/core/meganav_content_platform/component.js +22 -1
  29. data/lib/ably_ui/core/meganav_content_use_cases/component.js +22 -1
  30. data/lib/ably_ui/core/meganav_content_why_ably/component.js +22 -1
  31. data/lib/ably_ui/core/meganav_control/component.js +208 -1
  32. data/lib/ably_ui/core/meganav_control_mobile_dropdown/component.js +975 -1
  33. data/lib/ably_ui/core/meganav_control_mobile_panel_close/component.js +142 -1
  34. data/lib/ably_ui/core/meganav_control_mobile_panel_open/component.js +170 -1
  35. data/lib/ably_ui/core/meganav_items_desktop/component.js +22 -1
  36. data/lib/ably_ui/core/meganav_items_mobile/component.js +22 -1
  37. data/lib/ably_ui/core/meganav_items_signed_in/component.js +22 -1
  38. data/lib/ably_ui/core/notice/component.css +2 -0
  39. data/lib/ably_ui/core/notice/component.js +4613 -2
  40. data/lib/ably_ui/core/scripts.js +1 -1
  41. data/lib/ably_ui/core/showcase/component.css +2 -0
  42. data/lib/ably_ui/core/showcase/component.js +343 -1
  43. data/lib/ably_ui/core/sign_out_link/component.js +22 -1
  44. data/lib/ably_ui/core/slider/component.css +2 -0
  45. data/lib/ably_ui/core/slider/component.js +38 -1
  46. data/lib/ably_ui/core/slider/slider.html.erb +1 -1
  47. data/lib/ably_ui/core/styles.base.css +1 -0
  48. data/lib/ably_ui/core/styles.components.css +49 -0
  49. data/lib/ably_ui/core/uptime/component.css +2 -0
  50. data/lib/ably_ui/core/uptime/component.js +82 -1
  51. data/lib/ably_ui/react/connect_state_wrapper/component.js +1 -0
  52. data/lib/ably_ui/react/scripts.js +1 -0
  53. data/lib/ably_ui/version.rb +1 -1
  54. metadata +15 -8
@@ -1 +1,1857 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AblyUi=t():(e.AblyUi=e.AblyUi||{},e.AblyUi.Core=e.AblyUi.Core||{},e.AblyUi.Core.Meganav=t())}(this,(function(){return(()=>{var e={2498:(e,t,r)=>{"use strict";r.d(t,{default:()=>l});var n=r(9581);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}const l=function(){var e=Array.from((0,n.n)("meganav-control")),t=Array.from((0,n.n)("meganav-panel")),r=getComputedStyle(document.documentElement).getPropertyValue("--bp-md"),l=function(t,n,l){if(window.matchMedia("(hover: hover) and (pointer: fine) and (min-width: ".concat(r,")")).matches&&!e.some((function(e){return e===document.activeElement}))){var i,a=["invisible","visible"];(i=n.classList).replace.apply(i,function(e){if(Array.isArray(e))return o(e)}(c=l?a:a.reverse())||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(c)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?o(e,t):void 0}}(c)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),t.setAttribute("aria-expanded",l)}var c};return e.map((function(r){var n=r.parentNode,o=document.querySelector("#".concat(r.getAttribute("aria-controls"))),i=function(r,n){return function(){e.forEach((function(e){return e!==r&&e.setAttribute("aria-expanded",!1)})),t.forEach((function(e){return e!==n&&e.classList.replace("visible","invisible")})),r.getAttribute("aria-expanded")?(r.setAttribute("aria-expanded",!0),n.classList.replace("invisible","visible")):(r.setAttribute("aria-expanded",!1),n.classList.replace("visible","invisible"))}}(r,o),a=function(e,t){return function(){return l(e,t,!0)}}(r,o),c=function(e,t){return function(){return l(e,t,!1)}}(r,o);return n.addEventListener("mouseenter",a),n.addEventListener("mouseleave",c),r.addEventListener("click",i),[{teardown:function(){n.removeEventListener("mouseenter",a),n.removeEventListener("mouseleave",c),r.removeEventListener("click",i)},clear:function(){r.setAttribute("aria-expanded",!1),o.classList.replace("visible","invisible")}}]})).flat()}},1792:(e,t,r)=>{"use strict";r.d(t,{default:()=>i});var n=r(6265),o=r.n(n),l=r(9581);const i=function(e){var t=e.clearPanels,r=(0,l.A)("meganav-control-mobile-dropdown"),n=(0,l.A)("meganav-mobile-dropdown"),i=(0,l.A)("meganav-control-mobile-dropdown-menu"),a=(0,l.A)("meganav-control-mobile-dropdown-close"),c=function(){"false"===r.getAttribute("aria-expanded")?(n.classList.replace("invisible","visible"),r.setAttribute("aria-expanded",!0),o().disablePageScroll()):(n.classList.replace("visible","invisible"),r.setAttribute("aria-expanded",!1),o().enablePageScroll(),t()),i.classList.toggle("hidden"),a.classList.toggle("hidden")};return r.addEventListener("click",c),{teardown:function(){r.removeEventListener("click",c),o().enablePageScroll()},clear:function(){n.classList.replace("visible","invisible"),r.setAttribute("aria-expanded",!1),i.classList.remove("hidden"),a.classList.add("hidden"),o().enablePageScroll()}}}},7359:(e,t,r)=>{"use strict";r.d(t,{default:()=>o});var n=r(9581);const o=function(){var e=Array.from((0,n.n)("meganav-control-mobile-panel-close")),t=Array.from((0,n.n)("meganav-control-mobile-panel-open"));return e.map((function(e){var r=t.find((function(t){return t.getAttribute("aria-controls")===e.getAttribute("aria-controls")})),n=document.querySelector("#".concat(e.getAttribute("aria-controls"))),o=function(e,t,r){return function(){e.setAttribute("aria-expanded",!1),t.setAttribute("aria-expanded",!1),r.classList.replace("block","hidden"),r.style.height=null}}(e,r,n);return e.addEventListener("click",o),{teardown:function(){return e.removeEventListener("click",o)},clear:function(){return e.setAttribute("aria-expanded",!1)}}}))}},9552:(e,t,r)=>{"use strict";r.d(t,{default:()=>o});var n=r(9581);const o=function(){var e,t=Array.from((0,n.n)("meganav-control-mobile-panel-close")),r=Array.from((0,n.n)("meganav-control-mobile-panel-open")),o=(0,n.A)("meganav-mobile-dropdown"),l=(e=getComputedStyle(document.documentElement).getPropertyValue("--ui-meganav-height"),parseFloat(e)*parseFloat(getComputedStyle(document.documentElement).fontSize));return r.map((function(e){var r=t.find((function(t){return t.getAttribute("aria-controls")===e.getAttribute("aria-controls")})),n=document.querySelector("#".concat(e.getAttribute("aria-controls"))),i=function(e,t,r){return function(){e.setAttribute("aria-expanded",!0),t.setAttribute("aria-expanded",!0),r.classList.replace("hidden","block"),r.style.height="".concat(window.innerHeight-l>r.offsetHeight?r.offsetHeight:window.innerHeight-l,"px")}}(e,r,n);return e.addEventListener("click",i),{teardown:function(){return e.removeEventListener("click",i)},clear:function(){n.classList.replace("block","hidden"),o.classList.remove("ui-meganav-mobile-dropdown-expand"),e.setAttribute("aria-expanded",!1),n.style.height=null}}}))}},9581:(e,t,r)=>{"use strict";r.d(t,{A:()=>n,n:()=>o});var n=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return t.querySelector("[data-id=".concat(e,"]"))},o=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return t.querySelectorAll("[data-id=".concat(e,"]"))}},3096:(e,t,r)=>{var n="Expected a function",o=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,a=/^0o[0-7]+$/i,c=parseInt,u="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g,s="object"==typeof self&&self&&self.Object===Object&&self,d=u||s||Function("return this")(),f=Object.prototype.toString,p=Math.max,g=Math.min,b=function(){return d.Date.now()};function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function m(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==f.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(o,"");var r=i.test(e);return r||a.test(e)?c(e.slice(2),r?2:8):l.test(e)?NaN:+e}e.exports=function(e,t,r){var o=!0,l=!0;if("function"!=typeof e)throw new TypeError(n);return v(r)&&(o="leading"in r?!!r.leading:o,l="trailing"in r?!!r.trailing:l),function(e,t,r){var o,l,i,a,c,u,s=0,d=!1,f=!1,h=!0;if("function"!=typeof e)throw new TypeError(n);function y(t){var r=o,n=l;return o=l=void 0,s=t,a=e.apply(n,r)}function S(e){return s=e,c=setTimeout(A,t),d?y(e):a}function w(e){var r=e-u;return void 0===u||r>=t||r<0||f&&e-s>=i}function A(){var e=b();if(w(e))return k(e);c=setTimeout(A,function(e){var r=t-(e-u);return f?g(r,i-(e-s)):r}(e))}function k(e){return c=void 0,h&&o?y(e):(o=l=void 0,a)}function L(){var e=b(),r=w(e);if(o=arguments,l=this,u=e,r){if(void 0===c)return S(u);if(f)return c=setTimeout(A,t),y(u)}return void 0===c&&(c=setTimeout(A,t)),a}return t=m(t)||0,v(r)&&(d=!!r.leading,i=(f="maxWait"in r)?p(m(r.maxWait)||0,t):i,h="trailing"in r?!!r.trailing:h),L.cancel=function(){void 0!==c&&clearTimeout(c),s=0,o=u=l=c=void 0},L.flush=function(){return void 0===c?a:k(b())},L}(e,t,{leading:o,maxWait:t,trailing:l})}},6265:function(e){var t;t=function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t);var n=function(e){return Array.isArray(e)?e:[e]},o=function(e){return e instanceof Node},l=function(e,t){if(e&&t){e=function(e){return e instanceof NodeList}(e)?e:[e];for(var r=0;r<e.length&&!0!==t(e[r],r,e.length);r++);}},i=function(e){return console.error("[scroll-lock] ".concat(e))},a=function(e){if(Array.isArray(e))return e.join(", ")},c=function(e){var t=[];return l(e,(function(e){return t.push(e)})),t},u=function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:document;if(r&&-1!==c(n.querySelectorAll(t)).indexOf(e))return e;for(;(e=e.parentElement)&&-1===c(n.querySelectorAll(t)).indexOf(e););return e},s=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:document,n=-1!==c(r.querySelectorAll(t)).indexOf(e);return n},d=function(e){if(e)return"hidden"===getComputedStyle(e).overflow},f=function(e){if(e)return!!d(e)||e.scrollTop<=0},p=function(e){if(e){if(d(e))return!0;var t=e.scrollTop,r=e.scrollHeight;return t+e.offsetHeight>=r}},g=function(e){if(e)return!!d(e)||e.scrollLeft<=0},b=function(e){if(e){if(d(e))return!0;var t=e.scrollLeft,r=e.scrollWidth;return t+e.offsetWidth>=r}},v=function(e){return s(e,'textarea, [contenteditable="true"]')},m=function(e){return s(e,'input[type="range"]')};function h(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}r.d(t,"disablePageScroll",(function(){return w})),r.d(t,"enablePageScroll",(function(){return A})),r.d(t,"getScrollState",(function(){return k})),r.d(t,"clearQueueScrollLocks",(function(){return L})),r.d(t,"getTargetScrollBarWidth",(function(){return x})),r.d(t,"getCurrentTargetScrollBarWidth",(function(){return E})),r.d(t,"getPageScrollBarWidth",(function(){return T})),r.d(t,"getCurrentPageScrollBarWidth",(function(){return j})),r.d(t,"addScrollableTarget",(function(){return O})),r.d(t,"removeScrollableTarget",(function(){return G})),r.d(t,"addScrollableSelector",(function(){return W})),r.d(t,"removeScrollableSelector",(function(){return F})),r.d(t,"addLockableTarget",(function(){return P})),r.d(t,"addLockableSelector",(function(){return Y})),r.d(t,"setFillGapMethod",(function(){return q})),r.d(t,"addFillGapTarget",(function(){return M})),r.d(t,"removeFillGapTarget",(function(){return C})),r.d(t,"addFillGapSelector",(function(){return N})),r.d(t,"removeFillGapSelector",(function(){return U})),r.d(t,"refillGaps",(function(){return B}));var y=["padding","margin","width","max-width","none"],S={scroll:!0,queue:0,scrollableSelectors:["[data-scroll-lock-scrollable]"],lockableSelectors:["body","[data-scroll-lock-lockable]"],fillGapSelectors:["body","[data-scroll-lock-fill-gap]","[data-scroll-lock-lockable]"],fillGapMethod:y[0],startTouchY:0,startTouchX:0},w=function(e){S.queue<=0&&(S.scroll=!1,K(),$()),O(e),S.queue++},A=function(e){S.queue>0&&S.queue--,S.queue<=0&&(S.scroll=!0,R(),D()),G(e)},k=function(){return S.scroll},L=function(){S.queue=0},x=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(o(e)){var r=e.style.overflowY;t?k()||(e.style.overflowY=e.getAttribute("data-scroll-lock-saved-overflow-y-property")):e.style.overflowY="scroll";var n=E(e);return e.style.overflowY=r,n}return 0},E=function(e){if(o(e)){if(e===document.body){var t=document.documentElement.clientWidth;return window.innerWidth-t}var r=e.style.borderLeftWidth,n=e.style.borderRightWidth;e.style.borderLeftWidth="0px",e.style.borderRightWidth="0px";var l=e.offsetWidth-e.clientWidth;return e.style.borderLeftWidth=r,e.style.borderRightWidth=n,l}return 0},T=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return x(document.body,e)},j=function(){return E(document.body)},O=function(e){e&&n(e).map((function(e){l(e,(function(e){o(e)?e.setAttribute("data-scroll-lock-scrollable",""):i('"'.concat(e,'" is not a Element.'))}))}))},G=function(e){e&&n(e).map((function(e){l(e,(function(e){o(e)?e.removeAttribute("data-scroll-lock-scrollable"):i('"'.concat(e,'" is not a Element.'))}))}))},W=function(e){e&&n(e).map((function(e){S.scrollableSelectors.push(e)}))},F=function(e){e&&n(e).map((function(e){S.scrollableSelectors=S.scrollableSelectors.filter((function(t){return t!==e}))}))},P=function(e){e&&(n(e).map((function(e){l(e,(function(e){o(e)?e.setAttribute("data-scroll-lock-lockable",""):i('"'.concat(e,'" is not a Element.'))}))})),k()||K())},Y=function(e){e&&(n(e).map((function(e){S.lockableSelectors.push(e)})),k()||K(),N(e))},q=function(e){if(e)if(-1!==y.indexOf(e))S.fillGapMethod=e,B();else{var t=y.join(", ");i('"'.concat(e,'" method is not available!\nAvailable fill gap methods: ').concat(t,"."))}},M=function(e){e&&n(e).map((function(e){l(e,(function(e){o(e)?(e.setAttribute("data-scroll-lock-fill-gap",""),S.scroll||z(e)):i('"'.concat(e,'" is not a Element.'))}))}))},C=function(e){e&&n(e).map((function(e){l(e,(function(e){o(e)?(e.removeAttribute("data-scroll-lock-fill-gap"),S.scroll||J(e)):i('"'.concat(e,'" is not a Element.'))}))}))},N=function(e){e&&n(e).map((function(e){-1===S.fillGapSelectors.indexOf(e)&&(S.fillGapSelectors.push(e),S.scroll||Q(e))}))},U=function(e){e&&n(e).map((function(e){S.fillGapSelectors=S.fillGapSelectors.filter((function(t){return t!==e})),S.scroll||V(e)}))},B=function(){S.scroll||$()},K=function(){var e=a(S.lockableSelectors);_(e)},R=function(){var e=a(S.lockableSelectors);I(e)},_=function(e){var t=document.querySelectorAll(e);l(t,(function(e){H(e)}))},I=function(e){var t=document.querySelectorAll(e);l(t,(function(e){X(e)}))},H=function(e){if(o(e)&&"true"!==e.getAttribute("data-scroll-lock-locked")){var t=window.getComputedStyle(e);e.setAttribute("data-scroll-lock-saved-overflow-y-property",t.overflowY),e.setAttribute("data-scroll-lock-saved-inline-overflow-property",e.style.overflow),e.setAttribute("data-scroll-lock-saved-inline-overflow-y-property",e.style.overflowY),e.style.overflow="hidden",e.setAttribute("data-scroll-lock-locked","true")}},X=function(e){o(e)&&"true"===e.getAttribute("data-scroll-lock-locked")&&(e.style.overflow=e.getAttribute("data-scroll-lock-saved-inline-overflow-property"),e.style.overflowY=e.getAttribute("data-scroll-lock-saved-inline-overflow-y-property"),e.removeAttribute("data-scroll-lock-saved-overflow-property"),e.removeAttribute("data-scroll-lock-saved-inline-overflow-property"),e.removeAttribute("data-scroll-lock-saved-inline-overflow-y-property"),e.removeAttribute("data-scroll-lock-locked"))},$=function(){S.fillGapSelectors.map((function(e){Q(e)}))},D=function(){S.fillGapSelectors.map((function(e){V(e)}))},Q=function(e){var t=document.querySelectorAll(e),r=-1!==S.lockableSelectors.indexOf(e);l(t,(function(e){z(e,r)}))},z=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(o(e)){var r;if(""===e.getAttribute("data-scroll-lock-lockable")||t)r=x(e,!0);else{var n=u(e,a(S.lockableSelectors));r=x(n,!0)}"true"===e.getAttribute("data-scroll-lock-filled-gap")&&J(e);var l=window.getComputedStyle(e);if(e.setAttribute("data-scroll-lock-filled-gap","true"),e.setAttribute("data-scroll-lock-current-fill-gap-method",S.fillGapMethod),"margin"===S.fillGapMethod){var i=parseFloat(l.marginRight);e.style.marginRight="".concat(i+r,"px")}else if("width"===S.fillGapMethod)e.style.width="calc(100% - ".concat(r,"px)");else if("max-width"===S.fillGapMethod)e.style.maxWidth="calc(100% - ".concat(r,"px)");else if("padding"===S.fillGapMethod){var c=parseFloat(l.paddingRight);e.style.paddingRight="".concat(c+r,"px")}}},V=function(e){var t=document.querySelectorAll(e);l(t,(function(e){J(e)}))},J=function(e){if(o(e)&&"true"===e.getAttribute("data-scroll-lock-filled-gap")){var t=e.getAttribute("data-scroll-lock-current-fill-gap-method");e.removeAttribute("data-scroll-lock-filled-gap"),e.removeAttribute("data-scroll-lock-current-fill-gap-method"),"margin"===t?e.style.marginRight="":"width"===t?e.style.width="":"max-width"===t?e.style.maxWidth="":"padding"===t&&(e.style.paddingRight="")}};"undefined"!=typeof window&&window.addEventListener("resize",(function(e){B()})),"undefined"!=typeof document&&(document.addEventListener("touchstart",(function(e){S.scroll||(S.startTouchY=e.touches[0].clientY,S.startTouchX=e.touches[0].clientX)})),document.addEventListener("touchmove",(function(e){if(!S.scroll){var t=S.startTouchY,r=S.startTouchX,n=e.touches[0].clientY,o=e.touches[0].clientX;if(e.touches.length<2){var l=a(S.scrollableSelectors),i={up:t<n,down:t>n,left:r<o,right:r>o},c={up:t+3<n,down:t-3>n,left:r+3<o,right:r-3>o};!function t(r){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(r){var o=u(r,l,!1);if(m(r))return!1;if(n||v(r)&&u(r,l)||s(r,l)){var a=!1;g(r)&&b(r)?(i.up&&f(r)||i.down&&p(r))&&(a=!0):f(r)&&p(r)?(i.left&&g(r)||i.right&&b(r))&&(a=!0):(c.up&&f(r)||c.down&&p(r)||c.left&&g(r)||c.right&&b(r))&&(a=!0),a&&(o?t(o,!0):e.cancelable&&e.preventDefault())}else t(o)}else e.cancelable&&e.preventDefault()}(e.target)}}}),{passive:!1}),document.addEventListener("touchend",(function(e){S.scroll||(S.startTouchY=0,S.startTouchX=0)})));var Z={hide:function(e){i('"hide" is deprecated! Use "disablePageScroll" instead. \n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget'),w(e)},show:function(e){i('"show" is deprecated! Use "enablePageScroll" instead. \n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget'),A(e)},toggle:function(e){i('"toggle" is deprecated! Do not use it.'),k()?w():A(e)},getState:function(){return i('"getState" is deprecated! Use "getScrollState" instead. \n https://github.com/FL3NKEY/scroll-lock#getscrollstate'),k()},getWidth:function(){return i('"getWidth" is deprecated! Use "getPageScrollBarWidth" instead. \n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth'),T()},getCurrentWidth:function(){return i('"getCurrentWidth" is deprecated! Use "getCurrentPageScrollBarWidth" instead. \n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth'),j()},setScrollableTargets:function(e){i('"setScrollableTargets" is deprecated! Use "addScrollableTarget" instead. \n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget'),O(e)},setFillGapSelectors:function(e){i('"setFillGapSelectors" is deprecated! Use "addFillGapSelector" instead. \n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector'),N(e)},setFillGapTargets:function(e){i('"setFillGapTargets" is deprecated! Use "addFillGapTarget" instead. \n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget'),M(e)},clearQueue:function(){i('"clearQueue" is deprecated! Use "clearQueueScrollLocks" instead. \n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks'),L()}},ee=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable})))),n.forEach((function(t){h(e,t,r[t])}))}return e}({disablePageScroll:w,enablePageScroll:A,getScrollState:k,clearQueueScrollLocks:L,getTargetScrollBarWidth:x,getCurrentTargetScrollBarWidth:E,getPageScrollBarWidth:T,getCurrentPageScrollBarWidth:j,addScrollableSelector:W,removeScrollableSelector:F,addScrollableTarget:O,removeScrollableTarget:G,addLockableSelector:Y,addLockableTarget:P,addFillGapSelector:N,removeFillGapSelector:U,addFillGapTarget:M,removeFillGapTarget:C,setFillGapMethod:q,refillGaps:B,_state:S},Z);t.default=ee}]).default},e.exports=t()}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var l=t[n]={exports:{}};return e[n].call(l.exports,l,l.exports,r),l.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";r.d(n,{default:()=>g});var e=r(3096),t=r.n(e),o=r(9581),l=r(2498),i=r(1792),a=r(9552),c=r(7359);function u(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?s(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var d=function(e){return window.onblur=function(){return e()},{teardown:function(){return window.onblur=null}}},f=function(e){var t=(0,o.A)("meganav"),r=function(r){t.contains(r.target)||e()};return document.addEventListener("click",r),{teardown:function(){return document.removeEventListener("click",r)}}},p=function(e){if("transparentToWhite"!==e)return{teardown:function(){}};var r=(0,o.A)("meganav"),n=(0,o.n)("meganav-link"),l=(0,o.A)("meganav-control-mobile-dropdown-menu"),i=(0,o.A)("meganav-control-mobile-dropdown-close"),a=(0,o.n)("meganav-control"),c=(0,o.A)("meganav-sign-up-btn"),s=[].concat(u(Array.from(a)),u(Array.from(n)),[(0,o.A)("meganav-logo")]),d=function(e){var t,r,n,o,a=["ui-icon-white","ui-icon-cool-black"],c=[].concat(a).reverse();e?(null==l||(t=l.classList).replace.apply(t,a),null==i||(r=i.classList).replace.apply(r,a)):(null==l||(n=l.classList).replace.apply(n,u(c)),null==i||(o=i.classList).replace.apply(o,u(c)))},f=function(e){e?(null==c||c.classList.replace("bg-white","bg-cool-black"),null==c||c.classList.replace("text-cool-black","text-white")):(null==c||c.classList.replace("bg-cool-black","bg-white"),null==c||c.classList.replace("text-white","text-cool-black"))},p=t()((function(){window.scrollY>5?(r.classList.replace("bg-transparent","bg-white"),f(!0),d(!0),s.forEach((function(e){return e.classList.replace("text-white","text-cool-black")}))):(r.classList.replace("bg-white","bg-transparent"),f(!1),d(!1),s.forEach((function(e){return e.classList.replace("text-cool-black","text-white")})))}),150);return document.addEventListener("scroll",p),{teardown:function(){return document.removeEventListener("scroll",p)}}};function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{themeName:null},t=e.themeName,r=(0,l.default)(),n=(0,a.default)(),o=(0,c.default)(),s=(0,i.default)({clearPanels:function(){return[].concat(u(n),u(o)).forEach((function(e){return e.clear()}))}}),g=function(){return[s].concat(u(n),u(o),u(r)).forEach((function(e){return e.clear()}))},b=[p(t),f(g),d(g),s].concat(u(r),u(n),u(o)).map((function(e){return e.teardown}));return function(){return b.forEach((function(e){return e()}))}}})(),n.default})()}));
1
+ (function webpackUniversalModuleDefinition(root, factory) {
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory();
4
+ else if(typeof define === 'function' && define.amd)
5
+ define([], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["AblyUi"] = factory();
8
+ else
9
+ root["AblyUi"] = root["AblyUi"] || {}, root["AblyUi"]["Core"] = root["AblyUi"]["Core"] || {}, root["AblyUi"]["Core"]["Meganav"] = factory();
10
+ })(this, function() {
11
+ return /******/ (() => { // webpackBootstrap
12
+ /******/ var __webpack_modules__ = ({
13
+
14
+ /***/ "./src/core/MeganavControl/component.js":
15
+ /*!**********************************************!*\
16
+ !*** ./src/core/MeganavControl/component.js ***!
17
+ \**********************************************/
18
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
19
+
20
+ "use strict";
21
+ __webpack_require__.r(__webpack_exports__);
22
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
24
+ /* harmony export */ });
25
+ /* harmony import */ var _dom_query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-query */ "./src/core/dom-query.js");
26
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
27
+
28
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
29
+
30
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
31
+
32
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
33
+
34
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
35
+
36
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
37
+
38
+
39
+
40
+ var MeganavControl = function MeganavControl() {
41
+ var controls = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_0__.queryIdAll)("meganav-control"));
42
+ var panels = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_0__.queryIdAll)("meganav-panel"));
43
+ var mdBreakpoint = getComputedStyle(document.documentElement).getPropertyValue("--bp-md");
44
+
45
+ var hoverEnabled = function hoverEnabled() {
46
+ return window.matchMedia("(hover: hover) and (pointer: fine) and (min-width: ".concat(mdBreakpoint, ")")).matches;
47
+ };
48
+
49
+ var controlsHaveFocus = function controlsHaveFocus() {
50
+ return controls.some(function (control) {
51
+ return control === document.activeElement;
52
+ });
53
+ };
54
+
55
+ var hover = function hover(control, panel, open) {
56
+ if (hoverEnabled() && !controlsHaveFocus()) {
57
+ var _panel$classList;
58
+
59
+ var classes = ["invisible", "visible"];
60
+
61
+ (_panel$classList = panel.classList).replace.apply(_panel$classList, _toConsumableArray(open ? classes : classes.reverse()));
62
+
63
+ control.setAttribute("aria-expanded", open);
64
+ }
65
+ };
66
+
67
+ var mouseenterHandler = function mouseenterHandler(control, panel) {
68
+ return function () {
69
+ return hover(control, panel, true);
70
+ };
71
+ };
72
+
73
+ var mouseleaveHandler = function mouseleaveHandler(control, panel) {
74
+ return function () {
75
+ return hover(control, panel, false);
76
+ };
77
+ };
78
+
79
+ var clickHandler = function clickHandler(control, panel) {
80
+ return function () {
81
+ controls.forEach(function (node) {
82
+ return node !== control && node.setAttribute("aria-expanded", false);
83
+ });
84
+ panels.forEach(function (node) {
85
+ return node !== panel && node.classList.replace("visible", "invisible");
86
+ });
87
+ var ariaExpanded = control.getAttribute("aria-expanded");
88
+
89
+ if (ariaExpanded) {
90
+ control.setAttribute("aria-expanded", true);
91
+ panel.classList.replace("invisible", "visible");
92
+ } else {
93
+ control.setAttribute("aria-expanded", false);
94
+ panel.classList.replace("visible", "invisible");
95
+ }
96
+ };
97
+ };
98
+
99
+ return controls.map(function (control) {
100
+ var item = control.parentNode;
101
+ var panel = document.querySelector("#".concat(control.getAttribute("aria-controls")));
102
+ var click = clickHandler(control, panel);
103
+ var mouseenter = mouseenterHandler(control, panel);
104
+ var mouseleave = mouseleaveHandler(control, panel);
105
+ item.addEventListener("mouseenter", mouseenter);
106
+ item.addEventListener("mouseleave", mouseleave);
107
+ control.addEventListener("click", click);
108
+ return [{
109
+ teardown: function teardown() {
110
+ item.removeEventListener("mouseenter", mouseenter);
111
+ item.removeEventListener("mouseleave", mouseleave);
112
+ control.removeEventListener("click", click);
113
+ },
114
+ clear: function clear() {
115
+ control.setAttribute("aria-expanded", false);
116
+ panel.classList.replace("visible", "invisible");
117
+ }
118
+ }];
119
+ }).flat();
120
+ };
121
+
122
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MeganavControl);
123
+
124
+ /***/ }),
125
+
126
+ /***/ "./src/core/MeganavControlMobileDropdown/component.js":
127
+ /*!************************************************************!*\
128
+ !*** ./src/core/MeganavControlMobileDropdown/component.js ***!
129
+ \************************************************************/
130
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
131
+
132
+ "use strict";
133
+ __webpack_require__.r(__webpack_exports__);
134
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
135
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
136
+ /* harmony export */ });
137
+ /* harmony import */ var scroll_lock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scroll-lock */ "./node_modules/scroll-lock/dist/scroll-lock.js");
138
+ /* harmony import */ var scroll_lock__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scroll_lock__WEBPACK_IMPORTED_MODULE_0__);
139
+ /* harmony import */ var _dom_query__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-query */ "./src/core/dom-query.js");
140
+
141
+
142
+
143
+ var MeganavControlMobileDropdown = function MeganavControlMobileDropdown(_ref) {
144
+ var clearPanels = _ref.clearPanels;
145
+ var control = (0,_dom_query__WEBPACK_IMPORTED_MODULE_1__.queryId)("meganav-control-mobile-dropdown");
146
+ var dropdown = (0,_dom_query__WEBPACK_IMPORTED_MODULE_1__.queryId)("meganav-mobile-dropdown");
147
+ var menuIcon = (0,_dom_query__WEBPACK_IMPORTED_MODULE_1__.queryId)("meganav-control-mobile-dropdown-menu");
148
+ var closeIcon = (0,_dom_query__WEBPACK_IMPORTED_MODULE_1__.queryId)("meganav-control-mobile-dropdown-close");
149
+
150
+ var clickHandler = function clickHandler() {
151
+ var ariaExpanded = control.getAttribute("aria-expanded");
152
+
153
+ if (ariaExpanded === "false") {
154
+ dropdown.classList.replace("invisible", "visible");
155
+ control.setAttribute("aria-expanded", true);
156
+ scroll_lock__WEBPACK_IMPORTED_MODULE_0___default().disablePageScroll();
157
+ } else {
158
+ dropdown.classList.replace("visible", "invisible");
159
+ control.setAttribute("aria-expanded", false);
160
+ scroll_lock__WEBPACK_IMPORTED_MODULE_0___default().enablePageScroll();
161
+ clearPanels();
162
+ }
163
+
164
+ menuIcon.classList.toggle("hidden");
165
+ closeIcon.classList.toggle("hidden");
166
+ };
167
+
168
+ control.addEventListener("click", clickHandler);
169
+ return {
170
+ teardown: function teardown() {
171
+ control.removeEventListener("click", clickHandler);
172
+ scroll_lock__WEBPACK_IMPORTED_MODULE_0___default().enablePageScroll();
173
+ },
174
+ clear: function clear() {
175
+ dropdown.classList.replace("visible", "invisible");
176
+ control.setAttribute("aria-expanded", false);
177
+ menuIcon.classList.remove("hidden");
178
+ closeIcon.classList.add("hidden");
179
+ scroll_lock__WEBPACK_IMPORTED_MODULE_0___default().enablePageScroll();
180
+ }
181
+ };
182
+ };
183
+
184
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MeganavControlMobileDropdown);
185
+
186
+ /***/ }),
187
+
188
+ /***/ "./src/core/MeganavControlMobilePanelClose/component.js":
189
+ /*!**************************************************************!*\
190
+ !*** ./src/core/MeganavControlMobilePanelClose/component.js ***!
191
+ \**************************************************************/
192
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
193
+
194
+ "use strict";
195
+ __webpack_require__.r(__webpack_exports__);
196
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
197
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
198
+ /* harmony export */ });
199
+ /* harmony import */ var _dom_query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-query */ "./src/core/dom-query.js");
200
+
201
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function () {
202
+ var closeControls = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_0__.queryIdAll)("meganav-control-mobile-panel-close"));
203
+ var openControls = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_0__.queryIdAll)("meganav-control-mobile-panel-open"));
204
+
205
+ var clickHandler = function clickHandler(btn, openBtn, panel) {
206
+ return function () {
207
+ btn.setAttribute("aria-expanded", false);
208
+ openBtn.setAttribute("aria-expanded", false);
209
+ panel.classList.replace("block", "hidden");
210
+ panel.style.height = null;
211
+ };
212
+ };
213
+
214
+ return closeControls.map(function (btn) {
215
+ var openBtn = openControls.find(function (open) {
216
+ return open.getAttribute("aria-controls") === btn.getAttribute("aria-controls");
217
+ });
218
+ var panel = document.querySelector("#".concat(btn.getAttribute("aria-controls")));
219
+ var handler = clickHandler(btn, openBtn, panel);
220
+ btn.addEventListener("click", handler);
221
+ return {
222
+ teardown: function teardown() {
223
+ return btn.removeEventListener("click", handler);
224
+ },
225
+ clear: function clear() {
226
+ return btn.setAttribute("aria-expanded", false);
227
+ }
228
+ };
229
+ });
230
+ });
231
+
232
+ /***/ }),
233
+
234
+ /***/ "./src/core/MeganavControlMobilePanelOpen/component.js":
235
+ /*!*************************************************************!*\
236
+ !*** ./src/core/MeganavControlMobilePanelOpen/component.js ***!
237
+ \*************************************************************/
238
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
239
+
240
+ "use strict";
241
+ __webpack_require__.r(__webpack_exports__);
242
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
243
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
244
+ /* harmony export */ });
245
+ /* harmony import */ var _dom_query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-query */ "./src/core/dom-query.js");
246
+ /* harmony import */ var _css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../css */ "./src/core/css.js");
247
+
248
+
249
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function () {
250
+ var closeControls = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_0__.queryIdAll)("meganav-control-mobile-panel-close"));
251
+ var openControls = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_0__.queryIdAll)("meganav-control-mobile-panel-open"));
252
+ var dropdown = (0,_dom_query__WEBPACK_IMPORTED_MODULE_0__.queryId)("meganav-mobile-dropdown"); // Height is defined in rem's so to get the pixel value we need to find the fontSize on root
253
+
254
+ var meganavHeight = (0,_css__WEBPACK_IMPORTED_MODULE_1__.remsToPixelValue)(getComputedStyle(document.documentElement).getPropertyValue("--ui-meganav-height"));
255
+
256
+ var clickHandler = function clickHandler(btn, closeBtn, panel) {
257
+ return function () {
258
+ btn.setAttribute("aria-expanded", true);
259
+ closeBtn.setAttribute("aria-expanded", true);
260
+ panel.classList.replace("hidden", "block"); // On devices where we don't have enough space for the panel, set it's height to
261
+ // the height of the viewport (minus the meganav height) - this will trigger a scroll.
262
+ // Otherwise just set it to the panel height. This handles the case where the ratio of vertical
263
+ // space to horizontal is especially high (think tablets, but not only).
264
+
265
+ panel.style.height = "".concat(window.innerHeight - meganavHeight > panel.offsetHeight ? panel.offsetHeight : window.innerHeight - meganavHeight, "px");
266
+ };
267
+ };
268
+
269
+ return openControls.map(function (btn) {
270
+ var closeBtn = closeControls.find(function (node) {
271
+ return node.getAttribute("aria-controls") === btn.getAttribute("aria-controls");
272
+ });
273
+ var panel = document.querySelector("#".concat(btn.getAttribute("aria-controls")));
274
+ var handler = clickHandler(btn, closeBtn, panel);
275
+ btn.addEventListener("click", handler);
276
+ return {
277
+ teardown: function teardown() {
278
+ return btn.removeEventListener("click", handler);
279
+ },
280
+ clear: function clear() {
281
+ panel.classList.replace("block", "hidden");
282
+ dropdown.classList.remove("ui-meganav-mobile-dropdown-expand");
283
+ btn.setAttribute("aria-expanded", false);
284
+ panel.style.height = null;
285
+ }
286
+ };
287
+ });
288
+ });
289
+
290
+ /***/ }),
291
+
292
+ /***/ "./src/core/css.js":
293
+ /*!*************************!*\
294
+ !*** ./src/core/css.js ***!
295
+ \*************************/
296
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
297
+
298
+ "use strict";
299
+ __webpack_require__.r(__webpack_exports__);
300
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
301
+ /* harmony export */ "remsToPixelValue": () => (/* binding */ remsToPixelValue)
302
+ /* harmony export */ });
303
+ var remsToPixelValue = function remsToPixelValue(remString) {
304
+ return parseFloat(remString) * parseFloat(getComputedStyle(document.documentElement).fontSize);
305
+ };
306
+
307
+ /***/ }),
308
+
309
+ /***/ "./src/core/dom-query.js":
310
+ /*!*******************************!*\
311
+ !*** ./src/core/dom-query.js ***!
312
+ \*******************************/
313
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
314
+
315
+ "use strict";
316
+ __webpack_require__.r(__webpack_exports__);
317
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
318
+ /* harmony export */ "queryId": () => (/* binding */ queryId),
319
+ /* harmony export */ "queryIdAll": () => (/* binding */ queryIdAll)
320
+ /* harmony export */ });
321
+ var queryId = function queryId(val) {
322
+ var root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
323
+ return root.querySelector("[data-id=".concat(val, "]"));
324
+ };
325
+ var queryIdAll = function queryIdAll(val) {
326
+ var root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
327
+ return root.querySelectorAll("[data-id=".concat(val, "]"));
328
+ };
329
+
330
+ /***/ }),
331
+
332
+ /***/ "./node_modules/lodash.throttle/index.js":
333
+ /*!***********************************************!*\
334
+ !*** ./node_modules/lodash.throttle/index.js ***!
335
+ \***********************************************/
336
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
337
+
338
+ /**
339
+ * lodash (Custom Build) <https://lodash.com/>
340
+ * Build: `lodash modularize exports="npm" -o ./`
341
+ * Copyright jQuery Foundation and other contributors <https://jquery.org/>
342
+ * Released under MIT license <https://lodash.com/license>
343
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
344
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
345
+ */
346
+
347
+ /** Used as the `TypeError` message for "Functions" methods. */
348
+ var FUNC_ERROR_TEXT = 'Expected a function';
349
+
350
+ /** Used as references for various `Number` constants. */
351
+ var NAN = 0 / 0;
352
+
353
+ /** `Object#toString` result references. */
354
+ var symbolTag = '[object Symbol]';
355
+
356
+ /** Used to match leading and trailing whitespace. */
357
+ var reTrim = /^\s+|\s+$/g;
358
+
359
+ /** Used to detect bad signed hexadecimal string values. */
360
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
361
+
362
+ /** Used to detect binary string values. */
363
+ var reIsBinary = /^0b[01]+$/i;
364
+
365
+ /** Used to detect octal string values. */
366
+ var reIsOctal = /^0o[0-7]+$/i;
367
+
368
+ /** Built-in method references without a dependency on `root`. */
369
+ var freeParseInt = parseInt;
370
+
371
+ /** Detect free variable `global` from Node.js. */
372
+ var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
373
+
374
+ /** Detect free variable `self`. */
375
+ var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
376
+
377
+ /** Used as a reference to the global object. */
378
+ var root = freeGlobal || freeSelf || Function('return this')();
379
+
380
+ /** Used for built-in method references. */
381
+ var objectProto = Object.prototype;
382
+
383
+ /**
384
+ * Used to resolve the
385
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
386
+ * of values.
387
+ */
388
+ var objectToString = objectProto.toString;
389
+
390
+ /* Built-in method references for those with the same name as other `lodash` methods. */
391
+ var nativeMax = Math.max,
392
+ nativeMin = Math.min;
393
+
394
+ /**
395
+ * Gets the timestamp of the number of milliseconds that have elapsed since
396
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
397
+ *
398
+ * @static
399
+ * @memberOf _
400
+ * @since 2.4.0
401
+ * @category Date
402
+ * @returns {number} Returns the timestamp.
403
+ * @example
404
+ *
405
+ * _.defer(function(stamp) {
406
+ * console.log(_.now() - stamp);
407
+ * }, _.now());
408
+ * // => Logs the number of milliseconds it took for the deferred invocation.
409
+ */
410
+ var now = function() {
411
+ return root.Date.now();
412
+ };
413
+
414
+ /**
415
+ * Creates a debounced function that delays invoking `func` until after `wait`
416
+ * milliseconds have elapsed since the last time the debounced function was
417
+ * invoked. The debounced function comes with a `cancel` method to cancel
418
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
419
+ * Provide `options` to indicate whether `func` should be invoked on the
420
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
421
+ * with the last arguments provided to the debounced function. Subsequent
422
+ * calls to the debounced function return the result of the last `func`
423
+ * invocation.
424
+ *
425
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
426
+ * invoked on the trailing edge of the timeout only if the debounced function
427
+ * is invoked more than once during the `wait` timeout.
428
+ *
429
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
430
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
431
+ *
432
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
433
+ * for details over the differences between `_.debounce` and `_.throttle`.
434
+ *
435
+ * @static
436
+ * @memberOf _
437
+ * @since 0.1.0
438
+ * @category Function
439
+ * @param {Function} func The function to debounce.
440
+ * @param {number} [wait=0] The number of milliseconds to delay.
441
+ * @param {Object} [options={}] The options object.
442
+ * @param {boolean} [options.leading=false]
443
+ * Specify invoking on the leading edge of the timeout.
444
+ * @param {number} [options.maxWait]
445
+ * The maximum time `func` is allowed to be delayed before it's invoked.
446
+ * @param {boolean} [options.trailing=true]
447
+ * Specify invoking on the trailing edge of the timeout.
448
+ * @returns {Function} Returns the new debounced function.
449
+ * @example
450
+ *
451
+ * // Avoid costly calculations while the window size is in flux.
452
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
453
+ *
454
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
455
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
456
+ * 'leading': true,
457
+ * 'trailing': false
458
+ * }));
459
+ *
460
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
461
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
462
+ * var source = new EventSource('/stream');
463
+ * jQuery(source).on('message', debounced);
464
+ *
465
+ * // Cancel the trailing debounced invocation.
466
+ * jQuery(window).on('popstate', debounced.cancel);
467
+ */
468
+ function debounce(func, wait, options) {
469
+ var lastArgs,
470
+ lastThis,
471
+ maxWait,
472
+ result,
473
+ timerId,
474
+ lastCallTime,
475
+ lastInvokeTime = 0,
476
+ leading = false,
477
+ maxing = false,
478
+ trailing = true;
479
+
480
+ if (typeof func != 'function') {
481
+ throw new TypeError(FUNC_ERROR_TEXT);
482
+ }
483
+ wait = toNumber(wait) || 0;
484
+ if (isObject(options)) {
485
+ leading = !!options.leading;
486
+ maxing = 'maxWait' in options;
487
+ maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
488
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
489
+ }
490
+
491
+ function invokeFunc(time) {
492
+ var args = lastArgs,
493
+ thisArg = lastThis;
494
+
495
+ lastArgs = lastThis = undefined;
496
+ lastInvokeTime = time;
497
+ result = func.apply(thisArg, args);
498
+ return result;
499
+ }
500
+
501
+ function leadingEdge(time) {
502
+ // Reset any `maxWait` timer.
503
+ lastInvokeTime = time;
504
+ // Start the timer for the trailing edge.
505
+ timerId = setTimeout(timerExpired, wait);
506
+ // Invoke the leading edge.
507
+ return leading ? invokeFunc(time) : result;
508
+ }
509
+
510
+ function remainingWait(time) {
511
+ var timeSinceLastCall = time - lastCallTime,
512
+ timeSinceLastInvoke = time - lastInvokeTime,
513
+ result = wait - timeSinceLastCall;
514
+
515
+ return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
516
+ }
517
+
518
+ function shouldInvoke(time) {
519
+ var timeSinceLastCall = time - lastCallTime,
520
+ timeSinceLastInvoke = time - lastInvokeTime;
521
+
522
+ // Either this is the first call, activity has stopped and we're at the
523
+ // trailing edge, the system time has gone backwards and we're treating
524
+ // it as the trailing edge, or we've hit the `maxWait` limit.
525
+ return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
526
+ (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
527
+ }
528
+
529
+ function timerExpired() {
530
+ var time = now();
531
+ if (shouldInvoke(time)) {
532
+ return trailingEdge(time);
533
+ }
534
+ // Restart the timer.
535
+ timerId = setTimeout(timerExpired, remainingWait(time));
536
+ }
537
+
538
+ function trailingEdge(time) {
539
+ timerId = undefined;
540
+
541
+ // Only invoke if we have `lastArgs` which means `func` has been
542
+ // debounced at least once.
543
+ if (trailing && lastArgs) {
544
+ return invokeFunc(time);
545
+ }
546
+ lastArgs = lastThis = undefined;
547
+ return result;
548
+ }
549
+
550
+ function cancel() {
551
+ if (timerId !== undefined) {
552
+ clearTimeout(timerId);
553
+ }
554
+ lastInvokeTime = 0;
555
+ lastArgs = lastCallTime = lastThis = timerId = undefined;
556
+ }
557
+
558
+ function flush() {
559
+ return timerId === undefined ? result : trailingEdge(now());
560
+ }
561
+
562
+ function debounced() {
563
+ var time = now(),
564
+ isInvoking = shouldInvoke(time);
565
+
566
+ lastArgs = arguments;
567
+ lastThis = this;
568
+ lastCallTime = time;
569
+
570
+ if (isInvoking) {
571
+ if (timerId === undefined) {
572
+ return leadingEdge(lastCallTime);
573
+ }
574
+ if (maxing) {
575
+ // Handle invocations in a tight loop.
576
+ timerId = setTimeout(timerExpired, wait);
577
+ return invokeFunc(lastCallTime);
578
+ }
579
+ }
580
+ if (timerId === undefined) {
581
+ timerId = setTimeout(timerExpired, wait);
582
+ }
583
+ return result;
584
+ }
585
+ debounced.cancel = cancel;
586
+ debounced.flush = flush;
587
+ return debounced;
588
+ }
589
+
590
+ /**
591
+ * Creates a throttled function that only invokes `func` at most once per
592
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
593
+ * method to cancel delayed `func` invocations and a `flush` method to
594
+ * immediately invoke them. Provide `options` to indicate whether `func`
595
+ * should be invoked on the leading and/or trailing edge of the `wait`
596
+ * timeout. The `func` is invoked with the last arguments provided to the
597
+ * throttled function. Subsequent calls to the throttled function return the
598
+ * result of the last `func` invocation.
599
+ *
600
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
601
+ * invoked on the trailing edge of the timeout only if the throttled function
602
+ * is invoked more than once during the `wait` timeout.
603
+ *
604
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
605
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
606
+ *
607
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
608
+ * for details over the differences between `_.throttle` and `_.debounce`.
609
+ *
610
+ * @static
611
+ * @memberOf _
612
+ * @since 0.1.0
613
+ * @category Function
614
+ * @param {Function} func The function to throttle.
615
+ * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
616
+ * @param {Object} [options={}] The options object.
617
+ * @param {boolean} [options.leading=true]
618
+ * Specify invoking on the leading edge of the timeout.
619
+ * @param {boolean} [options.trailing=true]
620
+ * Specify invoking on the trailing edge of the timeout.
621
+ * @returns {Function} Returns the new throttled function.
622
+ * @example
623
+ *
624
+ * // Avoid excessively updating the position while scrolling.
625
+ * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
626
+ *
627
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
628
+ * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
629
+ * jQuery(element).on('click', throttled);
630
+ *
631
+ * // Cancel the trailing throttled invocation.
632
+ * jQuery(window).on('popstate', throttled.cancel);
633
+ */
634
+ function throttle(func, wait, options) {
635
+ var leading = true,
636
+ trailing = true;
637
+
638
+ if (typeof func != 'function') {
639
+ throw new TypeError(FUNC_ERROR_TEXT);
640
+ }
641
+ if (isObject(options)) {
642
+ leading = 'leading' in options ? !!options.leading : leading;
643
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
644
+ }
645
+ return debounce(func, wait, {
646
+ 'leading': leading,
647
+ 'maxWait': wait,
648
+ 'trailing': trailing
649
+ });
650
+ }
651
+
652
+ /**
653
+ * Checks if `value` is the
654
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
655
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
656
+ *
657
+ * @static
658
+ * @memberOf _
659
+ * @since 0.1.0
660
+ * @category Lang
661
+ * @param {*} value The value to check.
662
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
663
+ * @example
664
+ *
665
+ * _.isObject({});
666
+ * // => true
667
+ *
668
+ * _.isObject([1, 2, 3]);
669
+ * // => true
670
+ *
671
+ * _.isObject(_.noop);
672
+ * // => true
673
+ *
674
+ * _.isObject(null);
675
+ * // => false
676
+ */
677
+ function isObject(value) {
678
+ var type = typeof value;
679
+ return !!value && (type == 'object' || type == 'function');
680
+ }
681
+
682
+ /**
683
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
684
+ * and has a `typeof` result of "object".
685
+ *
686
+ * @static
687
+ * @memberOf _
688
+ * @since 4.0.0
689
+ * @category Lang
690
+ * @param {*} value The value to check.
691
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
692
+ * @example
693
+ *
694
+ * _.isObjectLike({});
695
+ * // => true
696
+ *
697
+ * _.isObjectLike([1, 2, 3]);
698
+ * // => true
699
+ *
700
+ * _.isObjectLike(_.noop);
701
+ * // => false
702
+ *
703
+ * _.isObjectLike(null);
704
+ * // => false
705
+ */
706
+ function isObjectLike(value) {
707
+ return !!value && typeof value == 'object';
708
+ }
709
+
710
+ /**
711
+ * Checks if `value` is classified as a `Symbol` primitive or object.
712
+ *
713
+ * @static
714
+ * @memberOf _
715
+ * @since 4.0.0
716
+ * @category Lang
717
+ * @param {*} value The value to check.
718
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
719
+ * @example
720
+ *
721
+ * _.isSymbol(Symbol.iterator);
722
+ * // => true
723
+ *
724
+ * _.isSymbol('abc');
725
+ * // => false
726
+ */
727
+ function isSymbol(value) {
728
+ return typeof value == 'symbol' ||
729
+ (isObjectLike(value) && objectToString.call(value) == symbolTag);
730
+ }
731
+
732
+ /**
733
+ * Converts `value` to a number.
734
+ *
735
+ * @static
736
+ * @memberOf _
737
+ * @since 4.0.0
738
+ * @category Lang
739
+ * @param {*} value The value to process.
740
+ * @returns {number} Returns the number.
741
+ * @example
742
+ *
743
+ * _.toNumber(3.2);
744
+ * // => 3.2
745
+ *
746
+ * _.toNumber(Number.MIN_VALUE);
747
+ * // => 5e-324
748
+ *
749
+ * _.toNumber(Infinity);
750
+ * // => Infinity
751
+ *
752
+ * _.toNumber('3.2');
753
+ * // => 3.2
754
+ */
755
+ function toNumber(value) {
756
+ if (typeof value == 'number') {
757
+ return value;
758
+ }
759
+ if (isSymbol(value)) {
760
+ return NAN;
761
+ }
762
+ if (isObject(value)) {
763
+ var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
764
+ value = isObject(other) ? (other + '') : other;
765
+ }
766
+ if (typeof value != 'string') {
767
+ return value === 0 ? value : +value;
768
+ }
769
+ value = value.replace(reTrim, '');
770
+ var isBinary = reIsBinary.test(value);
771
+ return (isBinary || reIsOctal.test(value))
772
+ ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
773
+ : (reIsBadHex.test(value) ? NAN : +value);
774
+ }
775
+
776
+ module.exports = throttle;
777
+
778
+
779
+ /***/ }),
780
+
781
+ /***/ "./src/core/Meganav/component.css":
782
+ /*!****************************************!*\
783
+ !*** ./src/core/Meganav/component.css ***!
784
+ \****************************************/
785
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
786
+
787
+ "use strict";
788
+ __webpack_require__.r(__webpack_exports__);
789
+ // extracted by mini-css-extract-plugin
790
+
791
+
792
+ /***/ }),
793
+
794
+ /***/ "./node_modules/scroll-lock/dist/scroll-lock.js":
795
+ /*!******************************************************!*\
796
+ !*** ./node_modules/scroll-lock/dist/scroll-lock.js ***!
797
+ \******************************************************/
798
+ /***/ (function(module) {
799
+
800
+ (function webpackUniversalModuleDefinition(root, factory) {
801
+ if(true)
802
+ module.exports = factory();
803
+ else {}
804
+ })(this, function() {
805
+ return /******/ (function(modules) { // webpackBootstrap
806
+ /******/ // The module cache
807
+ /******/ var installedModules = {};
808
+ /******/
809
+ /******/ // The require function
810
+ /******/ function __nested_webpack_require_543__(moduleId) {
811
+ /******/
812
+ /******/ // Check if module is in cache
813
+ /******/ if(installedModules[moduleId]) {
814
+ /******/ return installedModules[moduleId].exports;
815
+ /******/ }
816
+ /******/ // Create a new module (and put it into the cache)
817
+ /******/ var module = installedModules[moduleId] = {
818
+ /******/ i: moduleId,
819
+ /******/ l: false,
820
+ /******/ exports: {}
821
+ /******/ };
822
+ /******/
823
+ /******/ // Execute the module function
824
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__);
825
+ /******/
826
+ /******/ // Flag the module as loaded
827
+ /******/ module.l = true;
828
+ /******/
829
+ /******/ // Return the exports of the module
830
+ /******/ return module.exports;
831
+ /******/ }
832
+ /******/
833
+ /******/
834
+ /******/ // expose the modules object (__webpack_modules__)
835
+ /******/ __nested_webpack_require_543__.m = modules;
836
+ /******/
837
+ /******/ // expose the module cache
838
+ /******/ __nested_webpack_require_543__.c = installedModules;
839
+ /******/
840
+ /******/ // define getter function for harmony exports
841
+ /******/ __nested_webpack_require_543__.d = function(exports, name, getter) {
842
+ /******/ if(!__nested_webpack_require_543__.o(exports, name)) {
843
+ /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
844
+ /******/ }
845
+ /******/ };
846
+ /******/
847
+ /******/ // define __esModule on exports
848
+ /******/ __nested_webpack_require_543__.r = function(exports) {
849
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
850
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
851
+ /******/ }
852
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
853
+ /******/ };
854
+ /******/
855
+ /******/ // create a fake namespace object
856
+ /******/ // mode & 1: value is a module id, require it
857
+ /******/ // mode & 2: merge all properties of value into the ns
858
+ /******/ // mode & 4: return value when already ns object
859
+ /******/ // mode & 8|1: behave like require
860
+ /******/ __nested_webpack_require_543__.t = function(value, mode) {
861
+ /******/ if(mode & 1) value = __nested_webpack_require_543__(value);
862
+ /******/ if(mode & 8) return value;
863
+ /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
864
+ /******/ var ns = Object.create(null);
865
+ /******/ __nested_webpack_require_543__.r(ns);
866
+ /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
867
+ /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_543__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
868
+ /******/ return ns;
869
+ /******/ };
870
+ /******/
871
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
872
+ /******/ __nested_webpack_require_543__.n = function(module) {
873
+ /******/ var getter = module && module.__esModule ?
874
+ /******/ function getDefault() { return module['default']; } :
875
+ /******/ function getModuleExports() { return module; };
876
+ /******/ __nested_webpack_require_543__.d(getter, 'a', getter);
877
+ /******/ return getter;
878
+ /******/ };
879
+ /******/
880
+ /******/ // Object.prototype.hasOwnProperty.call
881
+ /******/ __nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
882
+ /******/
883
+ /******/ // __webpack_public_path__
884
+ /******/ __nested_webpack_require_543__.p = "";
885
+ /******/
886
+ /******/
887
+ /******/ // Load entry module and return exports
888
+ /******/ return __nested_webpack_require_543__(__nested_webpack_require_543__.s = 0);
889
+ /******/ })
890
+ /************************************************************************/
891
+ /******/ ([
892
+ /* 0 */
893
+ /***/ (function(module, __webpack_exports__, __nested_webpack_require_4019__) {
894
+
895
+ "use strict";
896
+ __nested_webpack_require_4019__.r(__webpack_exports__);
897
+
898
+ // CONCATENATED MODULE: ./src/tools.js
899
+ var argumentAsArray = function argumentAsArray(argument) {
900
+ return Array.isArray(argument) ? argument : [argument];
901
+ };
902
+ var isElement = function isElement(target) {
903
+ return target instanceof Node;
904
+ };
905
+ var isElementList = function isElementList(nodeList) {
906
+ return nodeList instanceof NodeList;
907
+ };
908
+ var eachNode = function eachNode(nodeList, callback) {
909
+ if (nodeList && callback) {
910
+ nodeList = isElementList(nodeList) ? nodeList : [nodeList];
911
+
912
+ for (var i = 0; i < nodeList.length; i++) {
913
+ if (callback(nodeList[i], i, nodeList.length) === true) {
914
+ break;
915
+ }
916
+ }
917
+ }
918
+ };
919
+ var throwError = function throwError(message) {
920
+ return console.error("[scroll-lock] ".concat(message));
921
+ };
922
+ var arrayAsSelector = function arrayAsSelector(array) {
923
+ if (Array.isArray(array)) {
924
+ var selector = array.join(', ');
925
+ return selector;
926
+ }
927
+ };
928
+ var nodeListAsArray = function nodeListAsArray(nodeList) {
929
+ var nodes = [];
930
+ eachNode(nodeList, function (node) {
931
+ return nodes.push(node);
932
+ });
933
+ return nodes;
934
+ };
935
+ var findParentBySelector = function findParentBySelector($el, selector) {
936
+ var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
937
+ var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;
938
+
939
+ if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {
940
+ return $el;
941
+ }
942
+
943
+ while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {
944
+ ;
945
+ }
946
+
947
+ return $el;
948
+ };
949
+ var elementHasSelector = function elementHasSelector($el, selector) {
950
+ var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;
951
+ var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;
952
+ return has;
953
+ };
954
+ var elementHasOverflowHidden = function elementHasOverflowHidden($el) {
955
+ if ($el) {
956
+ var computedStyle = getComputedStyle($el);
957
+ var overflowIsHidden = computedStyle.overflow === 'hidden';
958
+ return overflowIsHidden;
959
+ }
960
+ };
961
+ var elementScrollTopOnStart = function elementScrollTopOnStart($el) {
962
+ if ($el) {
963
+ if (elementHasOverflowHidden($el)) {
964
+ return true;
965
+ }
966
+
967
+ var scrollTop = $el.scrollTop;
968
+ return scrollTop <= 0;
969
+ }
970
+ };
971
+ var elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {
972
+ if ($el) {
973
+ if (elementHasOverflowHidden($el)) {
974
+ return true;
975
+ }
976
+
977
+ var scrollTop = $el.scrollTop;
978
+ var scrollHeight = $el.scrollHeight;
979
+ var scrollTopWithHeight = scrollTop + $el.offsetHeight;
980
+ return scrollTopWithHeight >= scrollHeight;
981
+ }
982
+ };
983
+ var elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {
984
+ if ($el) {
985
+ if (elementHasOverflowHidden($el)) {
986
+ return true;
987
+ }
988
+
989
+ var scrollLeft = $el.scrollLeft;
990
+ return scrollLeft <= 0;
991
+ }
992
+ };
993
+ var elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {
994
+ if ($el) {
995
+ if (elementHasOverflowHidden($el)) {
996
+ return true;
997
+ }
998
+
999
+ var scrollLeft = $el.scrollLeft;
1000
+ var scrollWidth = $el.scrollWidth;
1001
+ var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;
1002
+ return scrollLeftWithWidth >= scrollWidth;
1003
+ }
1004
+ };
1005
+ var elementIsScrollableField = function elementIsScrollableField($el) {
1006
+ var selector = 'textarea, [contenteditable="true"]';
1007
+ return elementHasSelector($el, selector);
1008
+ };
1009
+ var elementIsInputRange = function elementIsInputRange($el) {
1010
+ var selector = 'input[type="range"]';
1011
+ return elementHasSelector($el, selector);
1012
+ };
1013
+ // CONCATENATED MODULE: ./src/scroll-lock.js
1014
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "disablePageScroll", function() { return disablePageScroll; });
1015
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "enablePageScroll", function() { return enablePageScroll; });
1016
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "getScrollState", function() { return getScrollState; });
1017
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "clearQueueScrollLocks", function() { return clearQueueScrollLocks; });
1018
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "getTargetScrollBarWidth", function() { return scroll_lock_getTargetScrollBarWidth; });
1019
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "getCurrentTargetScrollBarWidth", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });
1020
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "getPageScrollBarWidth", function() { return getPageScrollBarWidth; });
1021
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "getCurrentPageScrollBarWidth", function() { return getCurrentPageScrollBarWidth; });
1022
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "addScrollableTarget", function() { return scroll_lock_addScrollableTarget; });
1023
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "removeScrollableTarget", function() { return scroll_lock_removeScrollableTarget; });
1024
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "addScrollableSelector", function() { return scroll_lock_addScrollableSelector; });
1025
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "removeScrollableSelector", function() { return scroll_lock_removeScrollableSelector; });
1026
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "addLockableTarget", function() { return scroll_lock_addLockableTarget; });
1027
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "addLockableSelector", function() { return scroll_lock_addLockableSelector; });
1028
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "setFillGapMethod", function() { return scroll_lock_setFillGapMethod; });
1029
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "addFillGapTarget", function() { return scroll_lock_addFillGapTarget; });
1030
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "removeFillGapTarget", function() { return scroll_lock_removeFillGapTarget; });
1031
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "addFillGapSelector", function() { return scroll_lock_addFillGapSelector; });
1032
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "removeFillGapSelector", function() { return scroll_lock_removeFillGapSelector; });
1033
+ /* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, "refillGaps", function() { return refillGaps; });
1034
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
1035
+
1036
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
1037
+
1038
+
1039
+ var FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];
1040
+ var TOUCH_DIRECTION_DETECT_OFFSET = 3;
1041
+ var state = {
1042
+ scroll: true,
1043
+ queue: 0,
1044
+ scrollableSelectors: ['[data-scroll-lock-scrollable]'],
1045
+ lockableSelectors: ['body', '[data-scroll-lock-lockable]'],
1046
+ fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],
1047
+ fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],
1048
+ //
1049
+ startTouchY: 0,
1050
+ startTouchX: 0
1051
+ };
1052
+ var disablePageScroll = function disablePageScroll(target) {
1053
+ if (state.queue <= 0) {
1054
+ state.scroll = false;
1055
+ scroll_lock_hideLockableOverflow();
1056
+ fillGaps();
1057
+ }
1058
+
1059
+ scroll_lock_addScrollableTarget(target);
1060
+ state.queue++;
1061
+ };
1062
+ var enablePageScroll = function enablePageScroll(target) {
1063
+ state.queue > 0 && state.queue--;
1064
+
1065
+ if (state.queue <= 0) {
1066
+ state.scroll = true;
1067
+ scroll_lock_showLockableOverflow();
1068
+ unfillGaps();
1069
+ }
1070
+
1071
+ scroll_lock_removeScrollableTarget(target);
1072
+ };
1073
+ var getScrollState = function getScrollState() {
1074
+ return state.scroll;
1075
+ };
1076
+ var clearQueueScrollLocks = function clearQueueScrollLocks() {
1077
+ state.queue = 0;
1078
+ };
1079
+ var scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {
1080
+ var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1081
+
1082
+ if (isElement($target)) {
1083
+ var currentOverflowYProperty = $target.style.overflowY;
1084
+
1085
+ if (onlyExists) {
1086
+ if (!getScrollState()) {
1087
+ $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');
1088
+ }
1089
+ } else {
1090
+ $target.style.overflowY = 'scroll';
1091
+ }
1092
+
1093
+ var width = scroll_lock_getCurrentTargetScrollBarWidth($target);
1094
+ $target.style.overflowY = currentOverflowYProperty;
1095
+ return width;
1096
+ } else {
1097
+ return 0;
1098
+ }
1099
+ };
1100
+ var scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {
1101
+ if (isElement($target)) {
1102
+ if ($target === document.body) {
1103
+ var documentWidth = document.documentElement.clientWidth;
1104
+ var windowWidth = window.innerWidth;
1105
+ var currentWidth = windowWidth - documentWidth;
1106
+ return currentWidth;
1107
+ } else {
1108
+ var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;
1109
+ var borderRightWidthCurrentProperty = $target.style.borderRightWidth;
1110
+ $target.style.borderLeftWidth = '0px';
1111
+ $target.style.borderRightWidth = '0px';
1112
+
1113
+ var _currentWidth = $target.offsetWidth - $target.clientWidth;
1114
+
1115
+ $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;
1116
+ $target.style.borderRightWidth = borderRightWidthCurrentProperty;
1117
+ return _currentWidth;
1118
+ }
1119
+ } else {
1120
+ return 0;
1121
+ }
1122
+ };
1123
+ var getPageScrollBarWidth = function getPageScrollBarWidth() {
1124
+ var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
1125
+ return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);
1126
+ };
1127
+ var getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {
1128
+ return scroll_lock_getCurrentTargetScrollBarWidth(document.body);
1129
+ };
1130
+ var scroll_lock_addScrollableTarget = function addScrollableTarget(target) {
1131
+ if (target) {
1132
+ var targets = argumentAsArray(target);
1133
+ targets.map(function ($targets) {
1134
+ eachNode($targets, function ($target) {
1135
+ if (isElement($target)) {
1136
+ $target.setAttribute('data-scroll-lock-scrollable', '');
1137
+ } else {
1138
+ throwError("\"".concat($target, "\" is not a Element."));
1139
+ }
1140
+ });
1141
+ });
1142
+ }
1143
+ };
1144
+ var scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {
1145
+ if (target) {
1146
+ var targets = argumentAsArray(target);
1147
+ targets.map(function ($targets) {
1148
+ eachNode($targets, function ($target) {
1149
+ if (isElement($target)) {
1150
+ $target.removeAttribute('data-scroll-lock-scrollable');
1151
+ } else {
1152
+ throwError("\"".concat($target, "\" is not a Element."));
1153
+ }
1154
+ });
1155
+ });
1156
+ }
1157
+ };
1158
+ var scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {
1159
+ if (selector) {
1160
+ var selectors = argumentAsArray(selector);
1161
+ selectors.map(function (selector) {
1162
+ state.scrollableSelectors.push(selector);
1163
+ });
1164
+ }
1165
+ };
1166
+ var scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {
1167
+ if (selector) {
1168
+ var selectors = argumentAsArray(selector);
1169
+ selectors.map(function (selector) {
1170
+ state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {
1171
+ return sSelector !== selector;
1172
+ });
1173
+ });
1174
+ }
1175
+ };
1176
+ var scroll_lock_addLockableTarget = function addLockableTarget(target) {
1177
+ if (target) {
1178
+ var targets = argumentAsArray(target);
1179
+ targets.map(function ($targets) {
1180
+ eachNode($targets, function ($target) {
1181
+ if (isElement($target)) {
1182
+ $target.setAttribute('data-scroll-lock-lockable', '');
1183
+ } else {
1184
+ throwError("\"".concat($target, "\" is not a Element."));
1185
+ }
1186
+ });
1187
+ });
1188
+
1189
+ if (!getScrollState()) {
1190
+ scroll_lock_hideLockableOverflow();
1191
+ }
1192
+ }
1193
+ };
1194
+ var scroll_lock_addLockableSelector = function addLockableSelector(selector) {
1195
+ if (selector) {
1196
+ var selectors = argumentAsArray(selector);
1197
+ selectors.map(function (selector) {
1198
+ state.lockableSelectors.push(selector);
1199
+ });
1200
+
1201
+ if (!getScrollState()) {
1202
+ scroll_lock_hideLockableOverflow();
1203
+ }
1204
+
1205
+ scroll_lock_addFillGapSelector(selector);
1206
+ }
1207
+ };
1208
+ var scroll_lock_setFillGapMethod = function setFillGapMethod(method) {
1209
+ if (method) {
1210
+ if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {
1211
+ state.fillGapMethod = method;
1212
+ refillGaps();
1213
+ } else {
1214
+ var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');
1215
+ throwError("\"".concat(method, "\" method is not available!\nAvailable fill gap methods: ").concat(methods, "."));
1216
+ }
1217
+ }
1218
+ };
1219
+ var scroll_lock_addFillGapTarget = function addFillGapTarget(target) {
1220
+ if (target) {
1221
+ var targets = argumentAsArray(target);
1222
+ targets.map(function ($targets) {
1223
+ eachNode($targets, function ($target) {
1224
+ if (isElement($target)) {
1225
+ $target.setAttribute('data-scroll-lock-fill-gap', '');
1226
+
1227
+ if (!state.scroll) {
1228
+ scroll_lock_fillGapTarget($target);
1229
+ }
1230
+ } else {
1231
+ throwError("\"".concat($target, "\" is not a Element."));
1232
+ }
1233
+ });
1234
+ });
1235
+ }
1236
+ };
1237
+ var scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {
1238
+ if (target) {
1239
+ var targets = argumentAsArray(target);
1240
+ targets.map(function ($targets) {
1241
+ eachNode($targets, function ($target) {
1242
+ if (isElement($target)) {
1243
+ $target.removeAttribute('data-scroll-lock-fill-gap');
1244
+
1245
+ if (!state.scroll) {
1246
+ scroll_lock_unfillGapTarget($target);
1247
+ }
1248
+ } else {
1249
+ throwError("\"".concat($target, "\" is not a Element."));
1250
+ }
1251
+ });
1252
+ });
1253
+ }
1254
+ };
1255
+ var scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {
1256
+ if (selector) {
1257
+ var selectors = argumentAsArray(selector);
1258
+ selectors.map(function (selector) {
1259
+ if (state.fillGapSelectors.indexOf(selector) === -1) {
1260
+ state.fillGapSelectors.push(selector);
1261
+
1262
+ if (!state.scroll) {
1263
+ scroll_lock_fillGapSelector(selector);
1264
+ }
1265
+ }
1266
+ });
1267
+ }
1268
+ };
1269
+ var scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {
1270
+ if (selector) {
1271
+ var selectors = argumentAsArray(selector);
1272
+ selectors.map(function (selector) {
1273
+ state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {
1274
+ return fSelector !== selector;
1275
+ });
1276
+
1277
+ if (!state.scroll) {
1278
+ scroll_lock_unfillGapSelector(selector);
1279
+ }
1280
+ });
1281
+ }
1282
+ };
1283
+ var refillGaps = function refillGaps() {
1284
+ if (!state.scroll) {
1285
+ fillGaps();
1286
+ }
1287
+ };
1288
+
1289
+ var scroll_lock_hideLockableOverflow = function hideLockableOverflow() {
1290
+ var selector = arrayAsSelector(state.lockableSelectors);
1291
+ scroll_lock_hideLockableOverflowSelector(selector);
1292
+ };
1293
+
1294
+ var scroll_lock_showLockableOverflow = function showLockableOverflow() {
1295
+ var selector = arrayAsSelector(state.lockableSelectors);
1296
+ scroll_lock_showLockableOverflowSelector(selector);
1297
+ };
1298
+
1299
+ var scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {
1300
+ var $targets = document.querySelectorAll(selector);
1301
+ eachNode($targets, function ($target) {
1302
+ scroll_lock_hideLockableOverflowTarget($target);
1303
+ });
1304
+ };
1305
+
1306
+ var scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {
1307
+ var $targets = document.querySelectorAll(selector);
1308
+ eachNode($targets, function ($target) {
1309
+ scroll_lock_showLockableOverflowTarget($target);
1310
+ });
1311
+ };
1312
+
1313
+ var scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {
1314
+ if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {
1315
+ var computedStyle = window.getComputedStyle($target);
1316
+ $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);
1317
+ $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);
1318
+ $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);
1319
+ $target.style.overflow = 'hidden';
1320
+ $target.setAttribute('data-scroll-lock-locked', 'true');
1321
+ }
1322
+ };
1323
+
1324
+ var scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {
1325
+ if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {
1326
+ $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');
1327
+ $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');
1328
+ $target.removeAttribute('data-scroll-lock-saved-overflow-property');
1329
+ $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');
1330
+ $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');
1331
+ $target.removeAttribute('data-scroll-lock-locked');
1332
+ }
1333
+ };
1334
+
1335
+ var fillGaps = function fillGaps() {
1336
+ state.fillGapSelectors.map(function (selector) {
1337
+ scroll_lock_fillGapSelector(selector);
1338
+ });
1339
+ };
1340
+
1341
+ var unfillGaps = function unfillGaps() {
1342
+ state.fillGapSelectors.map(function (selector) {
1343
+ scroll_lock_unfillGapSelector(selector);
1344
+ });
1345
+ };
1346
+
1347
+ var scroll_lock_fillGapSelector = function fillGapSelector(selector) {
1348
+ var $targets = document.querySelectorAll(selector);
1349
+ var isLockable = state.lockableSelectors.indexOf(selector) !== -1;
1350
+ eachNode($targets, function ($target) {
1351
+ scroll_lock_fillGapTarget($target, isLockable);
1352
+ });
1353
+ };
1354
+
1355
+ var scroll_lock_fillGapTarget = function fillGapTarget($target) {
1356
+ var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1357
+
1358
+ if (isElement($target)) {
1359
+ var scrollBarWidth;
1360
+
1361
+ if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {
1362
+ scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);
1363
+ } else {
1364
+ var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));
1365
+ scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);
1366
+ }
1367
+
1368
+ if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {
1369
+ scroll_lock_unfillGapTarget($target);
1370
+ }
1371
+
1372
+ var computedStyle = window.getComputedStyle($target);
1373
+ $target.setAttribute('data-scroll-lock-filled-gap', 'true');
1374
+ $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);
1375
+
1376
+ if (state.fillGapMethod === 'margin') {
1377
+ var currentMargin = parseFloat(computedStyle.marginRight);
1378
+ $target.style.marginRight = "".concat(currentMargin + scrollBarWidth, "px");
1379
+ } else if (state.fillGapMethod === 'width') {
1380
+ $target.style.width = "calc(100% - ".concat(scrollBarWidth, "px)");
1381
+ } else if (state.fillGapMethod === 'max-width') {
1382
+ $target.style.maxWidth = "calc(100% - ".concat(scrollBarWidth, "px)");
1383
+ } else if (state.fillGapMethod === 'padding') {
1384
+ var currentPadding = parseFloat(computedStyle.paddingRight);
1385
+ $target.style.paddingRight = "".concat(currentPadding + scrollBarWidth, "px");
1386
+ }
1387
+ }
1388
+ };
1389
+
1390
+ var scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {
1391
+ var $targets = document.querySelectorAll(selector);
1392
+ eachNode($targets, function ($target) {
1393
+ scroll_lock_unfillGapTarget($target);
1394
+ });
1395
+ };
1396
+
1397
+ var scroll_lock_unfillGapTarget = function unfillGapTarget($target) {
1398
+ if (isElement($target)) {
1399
+ if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {
1400
+ var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');
1401
+ $target.removeAttribute('data-scroll-lock-filled-gap');
1402
+ $target.removeAttribute('data-scroll-lock-current-fill-gap-method');
1403
+
1404
+ if (currentFillGapMethod === 'margin') {
1405
+ $target.style.marginRight = "";
1406
+ } else if (currentFillGapMethod === 'width') {
1407
+ $target.style.width = "";
1408
+ } else if (currentFillGapMethod === 'max-width') {
1409
+ $target.style.maxWidth = "";
1410
+ } else if (currentFillGapMethod === 'padding') {
1411
+ $target.style.paddingRight = "";
1412
+ }
1413
+ }
1414
+ }
1415
+ };
1416
+
1417
+ var onResize = function onResize(e) {
1418
+ refillGaps();
1419
+ };
1420
+
1421
+ var onTouchStart = function onTouchStart(e) {
1422
+ if (!state.scroll) {
1423
+ state.startTouchY = e.touches[0].clientY;
1424
+ state.startTouchX = e.touches[0].clientX;
1425
+ }
1426
+ };
1427
+
1428
+ var scroll_lock_onTouchMove = function onTouchMove(e) {
1429
+ if (!state.scroll) {
1430
+ var startTouchY = state.startTouchY,
1431
+ startTouchX = state.startTouchX;
1432
+ var currentClientY = e.touches[0].clientY;
1433
+ var currentClientX = e.touches[0].clientX;
1434
+
1435
+ if (e.touches.length < 2) {
1436
+ var selector = arrayAsSelector(state.scrollableSelectors);
1437
+ var direction = {
1438
+ up: startTouchY < currentClientY,
1439
+ down: startTouchY > currentClientY,
1440
+ left: startTouchX < currentClientX,
1441
+ right: startTouchX > currentClientX
1442
+ };
1443
+ var directionWithOffset = {
1444
+ up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,
1445
+ down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,
1446
+ left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,
1447
+ right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX
1448
+ };
1449
+
1450
+ var handle = function handle($el) {
1451
+ var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1452
+
1453
+ if ($el) {
1454
+ var parentScrollableEl = findParentBySelector($el, selector, false);
1455
+
1456
+ if (elementIsInputRange($el)) {
1457
+ return false;
1458
+ }
1459
+
1460
+ if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {
1461
+ var prevent = false;
1462
+
1463
+ if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {
1464
+ if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {
1465
+ prevent = true;
1466
+ }
1467
+ } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {
1468
+ if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {
1469
+ prevent = true;
1470
+ }
1471
+ } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {
1472
+ prevent = true;
1473
+ }
1474
+
1475
+ if (prevent) {
1476
+ if (parentScrollableEl) {
1477
+ handle(parentScrollableEl, true);
1478
+ } else {
1479
+ if (e.cancelable) {
1480
+ e.preventDefault();
1481
+ }
1482
+ }
1483
+ }
1484
+ } else {
1485
+ handle(parentScrollableEl);
1486
+ }
1487
+ } else {
1488
+ if (e.cancelable) {
1489
+ e.preventDefault();
1490
+ }
1491
+ }
1492
+ };
1493
+
1494
+ handle(e.target);
1495
+ }
1496
+ }
1497
+ };
1498
+
1499
+ var onTouchEnd = function onTouchEnd(e) {
1500
+ if (!state.scroll) {
1501
+ state.startTouchY = 0;
1502
+ state.startTouchX = 0;
1503
+ }
1504
+ };
1505
+
1506
+ if (typeof window !== 'undefined') {
1507
+ window.addEventListener('resize', onResize);
1508
+ }
1509
+
1510
+ if (typeof document !== 'undefined') {
1511
+ document.addEventListener('touchstart', onTouchStart);
1512
+ document.addEventListener('touchmove', scroll_lock_onTouchMove, {
1513
+ passive: false
1514
+ });
1515
+ document.addEventListener('touchend', onTouchEnd);
1516
+ }
1517
+
1518
+ var deprecatedMethods = {
1519
+ hide: function hide(target) {
1520
+ throwError('"hide" is deprecated! Use "disablePageScroll" instead. \n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');
1521
+ disablePageScroll(target);
1522
+ },
1523
+ show: function show(target) {
1524
+ throwError('"show" is deprecated! Use "enablePageScroll" instead. \n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');
1525
+ enablePageScroll(target);
1526
+ },
1527
+ toggle: function toggle(target) {
1528
+ throwError('"toggle" is deprecated! Do not use it.');
1529
+
1530
+ if (getScrollState()) {
1531
+ disablePageScroll();
1532
+ } else {
1533
+ enablePageScroll(target);
1534
+ }
1535
+ },
1536
+ getState: function getState() {
1537
+ throwError('"getState" is deprecated! Use "getScrollState" instead. \n https://github.com/FL3NKEY/scroll-lock#getscrollstate');
1538
+ return getScrollState();
1539
+ },
1540
+ getWidth: function getWidth() {
1541
+ throwError('"getWidth" is deprecated! Use "getPageScrollBarWidth" instead. \n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');
1542
+ return getPageScrollBarWidth();
1543
+ },
1544
+ getCurrentWidth: function getCurrentWidth() {
1545
+ throwError('"getCurrentWidth" is deprecated! Use "getCurrentPageScrollBarWidth" instead. \n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');
1546
+ return getCurrentPageScrollBarWidth();
1547
+ },
1548
+ setScrollableTargets: function setScrollableTargets(target) {
1549
+ throwError('"setScrollableTargets" is deprecated! Use "addScrollableTarget" instead. \n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');
1550
+ scroll_lock_addScrollableTarget(target);
1551
+ },
1552
+ setFillGapSelectors: function setFillGapSelectors(selector) {
1553
+ throwError('"setFillGapSelectors" is deprecated! Use "addFillGapSelector" instead. \n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');
1554
+ scroll_lock_addFillGapSelector(selector);
1555
+ },
1556
+ setFillGapTargets: function setFillGapTargets(target) {
1557
+ throwError('"setFillGapTargets" is deprecated! Use "addFillGapTarget" instead. \n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');
1558
+ scroll_lock_addFillGapTarget(target);
1559
+ },
1560
+ clearQueue: function clearQueue() {
1561
+ throwError('"clearQueue" is deprecated! Use "clearQueueScrollLocks" instead. \n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');
1562
+ clearQueueScrollLocks();
1563
+ }
1564
+ };
1565
+
1566
+ var scrollLock = _objectSpread({
1567
+ disablePageScroll: disablePageScroll,
1568
+ enablePageScroll: enablePageScroll,
1569
+ getScrollState: getScrollState,
1570
+ clearQueueScrollLocks: clearQueueScrollLocks,
1571
+ getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,
1572
+ getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,
1573
+ getPageScrollBarWidth: getPageScrollBarWidth,
1574
+ getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,
1575
+ addScrollableSelector: scroll_lock_addScrollableSelector,
1576
+ removeScrollableSelector: scroll_lock_removeScrollableSelector,
1577
+ addScrollableTarget: scroll_lock_addScrollableTarget,
1578
+ removeScrollableTarget: scroll_lock_removeScrollableTarget,
1579
+ addLockableSelector: scroll_lock_addLockableSelector,
1580
+ addLockableTarget: scroll_lock_addLockableTarget,
1581
+ addFillGapSelector: scroll_lock_addFillGapSelector,
1582
+ removeFillGapSelector: scroll_lock_removeFillGapSelector,
1583
+ addFillGapTarget: scroll_lock_addFillGapTarget,
1584
+ removeFillGapTarget: scroll_lock_removeFillGapTarget,
1585
+ setFillGapMethod: scroll_lock_setFillGapMethod,
1586
+ refillGaps: refillGaps,
1587
+ _state: state
1588
+ }, deprecatedMethods);
1589
+
1590
+ /* harmony default export */ var scroll_lock = __webpack_exports__["default"] = (scrollLock);
1591
+
1592
+ /***/ })
1593
+ /******/ ])["default"];
1594
+ });
1595
+
1596
+ /***/ })
1597
+
1598
+ /******/ });
1599
+ /************************************************************************/
1600
+ /******/ // The module cache
1601
+ /******/ var __webpack_module_cache__ = {};
1602
+ /******/
1603
+ /******/ // The require function
1604
+ /******/ function __webpack_require__(moduleId) {
1605
+ /******/ // Check if module is in cache
1606
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
1607
+ /******/ if (cachedModule !== undefined) {
1608
+ /******/ return cachedModule.exports;
1609
+ /******/ }
1610
+ /******/ // Create a new module (and put it into the cache)
1611
+ /******/ var module = __webpack_module_cache__[moduleId] = {
1612
+ /******/ // no module.id needed
1613
+ /******/ // no module.loaded needed
1614
+ /******/ exports: {}
1615
+ /******/ };
1616
+ /******/
1617
+ /******/ // Execute the module function
1618
+ /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
1619
+ /******/
1620
+ /******/ // Return the exports of the module
1621
+ /******/ return module.exports;
1622
+ /******/ }
1623
+ /******/
1624
+ /************************************************************************/
1625
+ /******/ /* webpack/runtime/compat get default export */
1626
+ /******/ (() => {
1627
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
1628
+ /******/ __webpack_require__.n = (module) => {
1629
+ /******/ var getter = module && module.__esModule ?
1630
+ /******/ () => (module['default']) :
1631
+ /******/ () => (module);
1632
+ /******/ __webpack_require__.d(getter, { a: getter });
1633
+ /******/ return getter;
1634
+ /******/ };
1635
+ /******/ })();
1636
+ /******/
1637
+ /******/ /* webpack/runtime/define property getters */
1638
+ /******/ (() => {
1639
+ /******/ // define getter functions for harmony exports
1640
+ /******/ __webpack_require__.d = (exports, definition) => {
1641
+ /******/ for(var key in definition) {
1642
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
1643
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
1644
+ /******/ }
1645
+ /******/ }
1646
+ /******/ };
1647
+ /******/ })();
1648
+ /******/
1649
+ /******/ /* webpack/runtime/global */
1650
+ /******/ (() => {
1651
+ /******/ __webpack_require__.g = (function() {
1652
+ /******/ if (typeof globalThis === 'object') return globalThis;
1653
+ /******/ try {
1654
+ /******/ return this || new Function('return this')();
1655
+ /******/ } catch (e) {
1656
+ /******/ if (typeof window === 'object') return window;
1657
+ /******/ }
1658
+ /******/ })();
1659
+ /******/ })();
1660
+ /******/
1661
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
1662
+ /******/ (() => {
1663
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
1664
+ /******/ })();
1665
+ /******/
1666
+ /******/ /* webpack/runtime/make namespace object */
1667
+ /******/ (() => {
1668
+ /******/ // define __esModule on exports
1669
+ /******/ __webpack_require__.r = (exports) => {
1670
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
1671
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1672
+ /******/ }
1673
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
1674
+ /******/ };
1675
+ /******/ })();
1676
+ /******/
1677
+ /************************************************************************/
1678
+ var __webpack_exports__ = {};
1679
+ // This entry need to be wrapped in an IIFE because it need to be in strict mode.
1680
+ (() => {
1681
+ "use strict";
1682
+ /*!***************************************!*\
1683
+ !*** ./src/core/Meganav/component.js ***!
1684
+ \***************************************/
1685
+ __webpack_require__.r(__webpack_exports__);
1686
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1687
+ /* harmony export */ "default": () => (/* binding */ Meganav)
1688
+ /* harmony export */ });
1689
+ /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.throttle */ "./node_modules/lodash.throttle/index.js");
1690
+ /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_0__);
1691
+ /* harmony import */ var _component_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./component.css */ "./src/core/Meganav/component.css");
1692
+ /* harmony import */ var _dom_query__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-query */ "./src/core/dom-query.js");
1693
+ /* harmony import */ var _MeganavControl_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../MeganavControl/component */ "./src/core/MeganavControl/component.js");
1694
+ /* harmony import */ var _MeganavControlMobileDropdown_component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../MeganavControlMobileDropdown/component */ "./src/core/MeganavControlMobileDropdown/component.js");
1695
+ /* harmony import */ var _MeganavControlMobilePanelOpen_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../MeganavControlMobilePanelOpen/component */ "./src/core/MeganavControlMobilePanelOpen/component.js");
1696
+ /* harmony import */ var _MeganavControlMobilePanelClose_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../MeganavControlMobilePanelClose/component */ "./src/core/MeganavControlMobilePanelClose/component.js");
1697
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
1698
+
1699
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
1700
+
1701
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
1702
+
1703
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
1704
+
1705
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
1706
+
1707
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
1708
+
1709
+
1710
+ // Glossary:
1711
+ // item - is the element which contains both the control and the panel - these are adjacent
1712
+ // control - interactive element that controls showing and hiding of dropdown or panel
1713
+ // panel - container for meganav content
1714
+ // dropdown - container for top level items on mobile
1715
+ // clear - return to initial state
1716
+ // teardown - remove all event listeners (for example when removing nodes)
1717
+
1718
+
1719
+
1720
+
1721
+
1722
+ // Close menu when user clicks outside of viewport
1723
+
1724
+ var windowOnBlur = function windowOnBlur(closeAll) {
1725
+ window.onblur = function () {
1726
+ return closeAll();
1727
+ };
1728
+
1729
+ return {
1730
+ teardown: function teardown() {
1731
+ return window.onblur = null;
1732
+ }
1733
+ };
1734
+ }; // Close menu when click/tap outside of nav
1735
+
1736
+
1737
+ var documentClick = function documentClick(closeAll) {
1738
+ var meganav = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("meganav");
1739
+
1740
+ var clickHandler = function clickHandler(e) {
1741
+ if (meganav.contains(e.target)) return;
1742
+ closeAll();
1743
+ };
1744
+
1745
+ document.addEventListener("click", clickHandler);
1746
+ return {
1747
+ teardown: function teardown() {
1748
+ return document.removeEventListener("click", clickHandler);
1749
+ }
1750
+ };
1751
+ }; // Invert from transparent to white
1752
+
1753
+
1754
+ var documentScroll = function documentScroll(themeName) {
1755
+ if (themeName !== "transparentToWhite") return {
1756
+ teardown: function teardown() {}
1757
+ };
1758
+ var meganav = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("meganav");
1759
+ var navItems = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryIdAll)("meganav-link");
1760
+ var controlMobileDropdownMenu = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("meganav-control-mobile-dropdown-menu");
1761
+ var controlMobileDropdownClose = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("meganav-control-mobile-dropdown-close");
1762
+ var controls = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryIdAll)("meganav-control");
1763
+ var signUpBtn = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("meganav-sign-up-btn");
1764
+ var invertTextCollection = [].concat(_toConsumableArray(Array.from(controls)), _toConsumableArray(Array.from(navItems)), [(0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("meganav-logo")]);
1765
+
1766
+ var invertMobleDropdownColor = function invertMobleDropdownColor(invert) {
1767
+ var whiteToBlack = ["ui-icon-white", "ui-icon-cool-black"];
1768
+ var blackToWhite = [].concat(whiteToBlack).reverse();
1769
+
1770
+ if (invert) {
1771
+ var _controlMobileDropdow, _controlMobileDropdow2;
1772
+
1773
+ controlMobileDropdownMenu === null || controlMobileDropdownMenu === void 0 ? void 0 : (_controlMobileDropdow = controlMobileDropdownMenu.classList).replace.apply(_controlMobileDropdow, whiteToBlack);
1774
+ controlMobileDropdownClose === null || controlMobileDropdownClose === void 0 ? void 0 : (_controlMobileDropdow2 = controlMobileDropdownClose.classList).replace.apply(_controlMobileDropdow2, whiteToBlack);
1775
+ } else {
1776
+ var _controlMobileDropdow3, _controlMobileDropdow4;
1777
+
1778
+ controlMobileDropdownMenu === null || controlMobileDropdownMenu === void 0 ? void 0 : (_controlMobileDropdow3 = controlMobileDropdownMenu.classList).replace.apply(_controlMobileDropdow3, _toConsumableArray(blackToWhite));
1779
+ controlMobileDropdownClose === null || controlMobileDropdownClose === void 0 ? void 0 : (_controlMobileDropdow4 = controlMobileDropdownClose.classList).replace.apply(_controlMobileDropdow4, _toConsumableArray(blackToWhite));
1780
+ }
1781
+ };
1782
+
1783
+ var inverSignupBtnColors = function inverSignupBtnColors(invert) {
1784
+ if (invert) {
1785
+ signUpBtn === null || signUpBtn === void 0 ? void 0 : signUpBtn.classList.replace("bg-white", "bg-cool-black");
1786
+ signUpBtn === null || signUpBtn === void 0 ? void 0 : signUpBtn.classList.replace("text-cool-black", "text-white");
1787
+ } else {
1788
+ signUpBtn === null || signUpBtn === void 0 ? void 0 : signUpBtn.classList.replace("bg-cool-black", "bg-white");
1789
+ signUpBtn === null || signUpBtn === void 0 ? void 0 : signUpBtn.classList.replace("text-white", "text-cool-black");
1790
+ }
1791
+ };
1792
+
1793
+ var scrollHandler = lodash_throttle__WEBPACK_IMPORTED_MODULE_0___default()(function () {
1794
+ if (window.scrollY > 5) {
1795
+ meganav.classList.replace("bg-transparent", "bg-white");
1796
+ inverSignupBtnColors(true);
1797
+ invertMobleDropdownColor(true);
1798
+ invertTextCollection.forEach(function (n) {
1799
+ return n.classList.replace("text-white", "text-cool-black");
1800
+ });
1801
+ } else {
1802
+ meganav.classList.replace("bg-white", "bg-transparent");
1803
+ inverSignupBtnColors(false);
1804
+ invertMobleDropdownColor(false);
1805
+ invertTextCollection.forEach(function (n) {
1806
+ return n.classList.replace("text-cool-black", "text-white");
1807
+ });
1808
+ }
1809
+ }, 150);
1810
+ document.addEventListener("scroll", scrollHandler);
1811
+ return {
1812
+ teardown: function teardown() {
1813
+ return document.removeEventListener("scroll", scrollHandler);
1814
+ }
1815
+ };
1816
+ };
1817
+
1818
+ function Meganav() {
1819
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
1820
+ themeName: null
1821
+ },
1822
+ themeName = _ref.themeName;
1823
+
1824
+ var controls = (0,_MeganavControl_component__WEBPACK_IMPORTED_MODULE_3__.default)();
1825
+ var panelOpenControls = (0,_MeganavControlMobilePanelOpen_component__WEBPACK_IMPORTED_MODULE_5__.default)();
1826
+ var panelCloseControls = (0,_MeganavControlMobilePanelClose_component__WEBPACK_IMPORTED_MODULE_6__.default)();
1827
+ var mobileDropdownControl = (0,_MeganavControlMobileDropdown_component__WEBPACK_IMPORTED_MODULE_4__.default)({
1828
+ clearPanels: function clearPanels() {
1829
+ return [].concat(_toConsumableArray(panelOpenControls), _toConsumableArray(panelCloseControls)).forEach(function (i) {
1830
+ return i.clear();
1831
+ });
1832
+ }
1833
+ });
1834
+
1835
+ var closeAll = function closeAll() {
1836
+ return [mobileDropdownControl].concat(_toConsumableArray(panelOpenControls), _toConsumableArray(panelCloseControls), _toConsumableArray(controls)).forEach(function (i) {
1837
+ return i.clear();
1838
+ });
1839
+ };
1840
+
1841
+ var teardowns = [documentScroll(themeName), documentClick(closeAll), windowOnBlur(closeAll), mobileDropdownControl].concat(_toConsumableArray(controls), _toConsumableArray(panelOpenControls), _toConsumableArray(panelCloseControls)).map(function (i) {
1842
+ return i.teardown;
1843
+ });
1844
+ return function () {
1845
+ return teardowns.forEach(function (teardown) {
1846
+ return teardown();
1847
+ });
1848
+ };
1849
+ }
1850
+ })();
1851
+
1852
+ __webpack_exports__ = __webpack_exports__.default;
1853
+ /******/ return __webpack_exports__;
1854
+ /******/ })()
1855
+ ;
1856
+ });
1857
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS5bbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS8uL3NyYy9jb3JlL01lZ2FuYXZDb250cm9sL2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS5bbmFtZV0vLi9zcmMvY29yZS9NZWdhbmF2Q29udHJvbE1vYmlsZURyb3Bkb3duL2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS5bbmFtZV0vLi9zcmMvY29yZS9NZWdhbmF2Q29udHJvbE1vYmlsZVBhbmVsQ2xvc2UvY29tcG9uZW50LmpzIiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS8uL3NyYy9jb3JlL01lZ2FuYXZDb250cm9sTW9iaWxlUGFuZWxPcGVuL2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS5bbmFtZV0vLi9zcmMvY29yZS9jc3MuanMiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUuW25hbWVdLy4vc3JjL2NvcmUvZG9tLXF1ZXJ5LmpzIiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gudGhyb3R0bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUuW25hbWVdLy4vc3JjL2NvcmUvTWVnYW5hdi9jb21wb25lbnQuY3NzPzBjNjUiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUuW25hbWVdLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1sb2NrL2Rpc3Qvc2Nyb2xsLWxvY2suanMiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUuW25hbWVdL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS5bbmFtZV0vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0FibHlVaS5Db3JlLltuYW1lXS8uL3NyYy9jb3JlL01lZ2FuYXYvY29tcG9uZW50LmpzIl0sIm5hbWVzIjpbIk1lZ2FuYXZDb250cm9sIiwiY29udHJvbHMiLCJBcnJheSIsImZyb20iLCJxdWVyeUlkQWxsIiwicGFuZWxzIiwibWRCcmVha3BvaW50IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0UHJvcGVydHlWYWx1ZSIsImhvdmVyRW5hYmxlZCIsIndpbmRvdyIsIm1hdGNoTWVkaWEiLCJtYXRjaGVzIiwiY29udHJvbHNIYXZlRm9jdXMiLCJzb21lIiwiY29udHJvbCIsImFjdGl2ZUVsZW1lbnQiLCJob3ZlciIsInBhbmVsIiwib3BlbiIsImNsYXNzZXMiLCJjbGFzc0xpc3QiLCJyZXBsYWNlIiwicmV2ZXJzZSIsInNldEF0dHJpYnV0ZSIsIm1vdXNlZW50ZXJIYW5kbGVyIiwibW91c2VsZWF2ZUhhbmRsZXIiLCJjbGlja0hhbmRsZXIiLCJmb3JFYWNoIiwibm9kZSIsImFyaWFFeHBhbmRlZCIsImdldEF0dHJpYnV0ZSIsIm1hcCIsIml0ZW0iLCJwYXJlbnROb2RlIiwicXVlcnlTZWxlY3RvciIsImNsaWNrIiwibW91c2VlbnRlciIsIm1vdXNlbGVhdmUiLCJhZGRFdmVudExpc3RlbmVyIiwidGVhcmRvd24iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2xlYXIiLCJmbGF0IiwiTWVnYW5hdkNvbnRyb2xNb2JpbGVEcm9wZG93biIsImNsZWFyUGFuZWxzIiwicXVlcnlJZCIsImRyb3Bkb3duIiwibWVudUljb24iLCJjbG9zZUljb24iLCJzY3JvbGxMb2NrIiwidG9nZ2xlIiwicmVtb3ZlIiwiYWRkIiwiY2xvc2VDb250cm9scyIsIm9wZW5Db250cm9scyIsImJ0biIsIm9wZW5CdG4iLCJzdHlsZSIsImhlaWdodCIsImZpbmQiLCJoYW5kbGVyIiwibWVnYW5hdkhlaWdodCIsInJlbXNUb1BpeGVsVmFsdWUiLCJjbG9zZUJ0biIsImlubmVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0IiwicmVtU3RyaW5nIiwicGFyc2VGbG9hdCIsImZvbnRTaXplIiwidmFsIiwicm9vdCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ3aW5kb3dPbkJsdXIiLCJjbG9zZUFsbCIsIm9uYmx1ciIsImRvY3VtZW50Q2xpY2siLCJtZWdhbmF2IiwiZSIsImNvbnRhaW5zIiwidGFyZ2V0IiwiZG9jdW1lbnRTY3JvbGwiLCJ0aGVtZU5hbWUiLCJuYXZJdGVtcyIsImNvbnRyb2xNb2JpbGVEcm9wZG93bk1lbnUiLCJjb250cm9sTW9iaWxlRHJvcGRvd25DbG9zZSIsInNpZ25VcEJ0biIsImludmVydFRleHRDb2xsZWN0aW9uIiwiaW52ZXJ0TW9ibGVEcm9wZG93bkNvbG9yIiwiaW52ZXJ0Iiwid2hpdGVUb0JsYWNrIiwiYmxhY2tUb1doaXRlIiwiaW52ZXJTaWdudXBCdG5Db2xvcnMiLCJzY3JvbGxIYW5kbGVyIiwidGhyb3R0bGUiLCJzY3JvbGxZIiwibiIsIk1lZ2FuYXYiLCJwYW5lbE9wZW5Db250cm9scyIsIk1vYmlsZVBhbmVsT3BlbkNsaWNrIiwicGFuZWxDbG9zZUNvbnRyb2xzIiwiTW9iaWxlUGFuZWxDbG9zZUNsaWNrIiwibW9iaWxlRHJvcGRvd25Db250cm9sIiwiaSIsInRlYXJkb3ducyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx1REFBdUQ7QUFDOUYsQ0FBQztBQUNELE87Ozs7Ozs7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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NEIscUJBREYsNEJBRUtKLGlCQUZMLHNCQUdLRSxrQkFITCxzQkFJS3JHLFFBSkwsR0FLRTZCLE9BTEYsQ0FLVSxVQUFDMkUsQ0FBRDtBQUFBLGFBQU9BLENBQUMsQ0FBQzdELEtBQUYsRUFBUDtBQUFBLEtBTFYsQ0FEZTtBQUFBLEdBQWpCOztBQVFBLE1BQU04RCxTQUFTLEdBQUcsQ0FDaEJ2QixjQUFjLENBQUNDLFNBQUQsQ0FERSxFQUVoQk4sYUFBYSxDQUFDRixRQUFELENBRkcsRUFHaEJELFlBQVksQ0FBQ0MsUUFBRCxDQUhJLEVBSWhCNEIscUJBSmdCLDRCQUtidkcsUUFMYSxzQkFNYm1HLGlCQU5hLHNCQU9iRSxrQkFQYSxHQVFoQnBFLEdBUmdCLENBUVosVUFBQ3VFLENBQUQ7QUFBQSxXQUFPQSxDQUFDLENBQUMvRCxRQUFUO0FBQUEsR0FSWSxDQUFsQjtBQVVBLFNBQU87QUFBQSxXQUFNZ0UsU0FBUyxDQUFDNUUsT0FBVixDQUFrQixVQUFDWSxRQUFEO0FBQUEsYUFBY0EsUUFBUSxFQUF0QjtBQUFBLEtBQWxCLENBQU47QUFBQSxHQUFQO0FBQ0QsQyIsImZpbGUiOiJjb3JlL01lZ2FuYXYvY29tcG9uZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQWJseVVpXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkFibHlVaVwiXSA9IHJvb3RbXCJBYmx5VWlcIl0gfHwge30sIHJvb3RbXCJBYmx5VWlcIl1bXCJDb3JlXCJdID0gcm9vdFtcIkFibHlVaVwiXVtcIkNvcmVcIl0gfHwge30sIHJvb3RbXCJBYmx5VWlcIl1bXCJDb3JlXCJdW1wiTWVnYW5hdlwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsImltcG9ydCB7IHF1ZXJ5SWRBbGwgfSBmcm9tIFwiLi4vZG9tLXF1ZXJ5XCI7XG5cbmNvbnN0IE1lZ2FuYXZDb250cm9sID0gKCkgPT4ge1xuICBjb25zdCBjb250cm9scyA9IEFycmF5LmZyb20ocXVlcnlJZEFsbChcIm1lZ2FuYXYtY29udHJvbFwiKSk7XG4gIGNvbnN0IHBhbmVscyA9IEFycmF5LmZyb20ocXVlcnlJZEFsbChcIm1lZ2FuYXYtcGFuZWxcIikpO1xuICBjb25zdCBtZEJyZWFrcG9pbnQgPSBnZXRDb21wdXRlZFN0eWxlKFxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICApLmdldFByb3BlcnR5VmFsdWUoXCItLWJwLW1kXCIpO1xuXG4gIGNvbnN0IGhvdmVyRW5hYmxlZCA9ICgpID0+XG4gICAgd2luZG93Lm1hdGNoTWVkaWEoXG4gICAgICBgKGhvdmVyOiBob3ZlcikgYW5kIChwb2ludGVyOiBmaW5lKSBhbmQgKG1pbi13aWR0aDogJHttZEJyZWFrcG9pbnR9KWBcbiAgICApLm1hdGNoZXM7XG5cbiAgY29uc3QgY29udHJvbHNIYXZlRm9jdXMgPSAoKSA9PlxuICAgIGNvbnRyb2xzLnNvbWUoKGNvbnRyb2wpID0+IGNvbnRyb2wgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gIGNvbnN0IGhvdmVyID0gKGNvbnRyb2wsIHBhbmVsLCBvcGVuKSA9PiB7XG4gICAgaWYgKGhvdmVyRW5hYmxlZCgpICYmICFjb250cm9sc0hhdmVGb2N1cygpKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0gW1wiaW52aXNpYmxlXCIsIFwidmlzaWJsZVwiXTtcbiAgICAgIHBhbmVsLmNsYXNzTGlzdC5yZXBsYWNlKC4uLihvcGVuID8gY2xhc3NlcyA6IGNsYXNzZXMucmV2ZXJzZSgpKSk7XG4gICAgICBjb250cm9sLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgb3Blbik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1vdXNlZW50ZXJIYW5kbGVyID0gKGNvbnRyb2wsIHBhbmVsKSA9PiAoKSA9PlxuICAgIGhvdmVyKGNvbnRyb2wsIHBhbmVsLCB0cnVlKTtcblxuICBjb25zdCBtb3VzZWxlYXZlSGFuZGxlciA9IChjb250cm9sLCBwYW5lbCkgPT4gKCkgPT5cbiAgICBob3Zlcihjb250cm9sLCBwYW5lbCwgZmFsc2UpO1xuXG4gIGNvbnN0IGNsaWNrSGFuZGxlciA9IChjb250cm9sLCBwYW5lbCkgPT4gKCkgPT4ge1xuICAgIGNvbnRyb2xzLmZvckVhY2goXG4gICAgICAobm9kZSkgPT4gbm9kZSAhPT0gY29udHJvbCAmJiBub2RlLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgZmFsc2UpXG4gICAgKTtcblxuICAgIHBhbmVscy5mb3JFYWNoKFxuICAgICAgKG5vZGUpID0+IG5vZGUgIT09IHBhbmVsICYmIG5vZGUuY2xhc3NMaXN0LnJlcGxhY2UoXCJ2aXNpYmxlXCIsIFwiaW52aXNpYmxlXCIpXG4gICAgKTtcblxuICAgIGNvbnN0IGFyaWFFeHBhbmRlZCA9IGNvbnRyb2wuZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKTtcblxuICAgIGlmIChhcmlhRXhwYW5kZWQpIHtcbiAgICAgIGNvbnRyb2wuc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCB0cnVlKTtcbiAgICAgIHBhbmVsLmNsYXNzTGlzdC5yZXBsYWNlKFwiaW52aXNpYmxlXCIsIFwidmlzaWJsZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsIGZhbHNlKTtcbiAgICAgIHBhbmVsLmNsYXNzTGlzdC5yZXBsYWNlKFwidmlzaWJsZVwiLCBcImludmlzaWJsZVwiKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNvbnRyb2xzXG4gICAgLm1hcCgoY29udHJvbCkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IGNvbnRyb2wucGFyZW50Tm9kZTtcbiAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYCMke2NvbnRyb2wuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgY2xpY2sgPSBjbGlja0hhbmRsZXIoY29udHJvbCwgcGFuZWwpO1xuICAgICAgY29uc3QgbW91c2VlbnRlciA9IG1vdXNlZW50ZXJIYW5kbGVyKGNvbnRyb2wsIHBhbmVsKTtcbiAgICAgIGNvbnN0IG1vdXNlbGVhdmUgPSBtb3VzZWxlYXZlSGFuZGxlcihjb250cm9sLCBwYW5lbCk7XG5cbiAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgbW91c2VlbnRlcik7XG4gICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIG1vdXNlbGVhdmUpO1xuICAgICAgY29udHJvbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgY2xpY2spO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdGVhcmRvd246ICgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgbW91c2VlbnRlcik7XG4gICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIG1vdXNlbGVhdmUpO1xuICAgICAgICAgICAgY29udHJvbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgY2xpY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBmYWxzZSk7XG4gICAgICAgICAgICBwYW5lbC5jbGFzc0xpc3QucmVwbGFjZShcInZpc2libGVcIiwgXCJpbnZpc2libGVcIik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSlcbiAgICAuZmxhdCgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVnYW5hdkNvbnRyb2w7XG4iLCJpbXBvcnQgc2Nyb2xsTG9jayBmcm9tIFwic2Nyb2xsLWxvY2tcIjtcblxuaW1wb3J0IHsgcXVlcnlJZCB9IGZyb20gXCIuLi9kb20tcXVlcnlcIjtcblxuY29uc3QgTWVnYW5hdkNvbnRyb2xNb2JpbGVEcm9wZG93biA9ICh7IGNsZWFyUGFuZWxzIH0pID0+IHtcbiAgY29uc3QgY29udHJvbCA9IHF1ZXJ5SWQoXCJtZWdhbmF2LWNvbnRyb2wtbW9iaWxlLWRyb3Bkb3duXCIpO1xuICBjb25zdCBkcm9wZG93biA9IHF1ZXJ5SWQoXCJtZWdhbmF2LW1vYmlsZS1kcm9wZG93blwiKTtcbiAgY29uc3QgbWVudUljb24gPSBxdWVyeUlkKFwibWVnYW5hdi1jb250cm9sLW1vYmlsZS1kcm9wZG93bi1tZW51XCIpO1xuICBjb25zdCBjbG9zZUljb24gPSBxdWVyeUlkKFwibWVnYW5hdi1jb250cm9sLW1vYmlsZS1kcm9wZG93bi1jbG9zZVwiKTtcblxuICBjb25zdCBjbGlja0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgYXJpYUV4cGFuZGVkID0gY29udHJvbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpO1xuXG4gICAgaWYgKGFyaWFFeHBhbmRlZCA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBkcm9wZG93bi5jbGFzc0xpc3QucmVwbGFjZShcImludmlzaWJsZVwiLCBcInZpc2libGVcIik7XG4gICAgICBjb250cm9sLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgdHJ1ZSk7XG4gICAgICBzY3JvbGxMb2NrLmRpc2FibGVQYWdlU2Nyb2xsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5yZXBsYWNlKFwidmlzaWJsZVwiLCBcImludmlzaWJsZVwiKTtcbiAgICAgIGNvbnRyb2wuc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBmYWxzZSk7XG4gICAgICBzY3JvbGxMb2NrLmVuYWJsZVBhZ2VTY3JvbGwoKTtcbiAgICAgIGNsZWFyUGFuZWxzKCk7XG4gICAgfVxuXG4gICAgbWVudUljb24uY2xhc3NMaXN0LnRvZ2dsZShcImhpZGRlblwiKTtcbiAgICBjbG9zZUljb24uY2xhc3NMaXN0LnRvZ2dsZShcImhpZGRlblwiKTtcbiAgfTtcblxuICBjb250cm9sLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbGlja0hhbmRsZXIpO1xuXG4gIHJldHVybiB7XG4gICAgdGVhcmRvd246ICgpID0+IHtcbiAgICAgIGNvbnRyb2wucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsaWNrSGFuZGxlcik7XG4gICAgICBzY3JvbGxMb2NrLmVuYWJsZVBhZ2VTY3JvbGwoKTtcbiAgICB9LFxuICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICBkcm9wZG93bi5jbGFzc0xpc3QucmVwbGFjZShcInZpc2libGVcIiwgXCJpbnZpc2libGVcIik7XG4gICAgICBjb250cm9sLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgZmFsc2UpO1xuICAgICAgbWVudUljb24uY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgIGNsb3NlSWNvbi5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgc2Nyb2xsTG9jay5lbmFibGVQYWdlU2Nyb2xsKCk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1lZ2FuYXZDb250cm9sTW9iaWxlRHJvcGRvd247XG4iLCJpbXBvcnQgeyBxdWVyeUlkQWxsIH0gZnJvbSBcIi4uL2RvbS1xdWVyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCAoKSA9PiB7XG4gIGNvbnN0IGNsb3NlQ29udHJvbHMgPSBBcnJheS5mcm9tKFxuICAgIHF1ZXJ5SWRBbGwoXCJtZWdhbmF2LWNvbnRyb2wtbW9iaWxlLXBhbmVsLWNsb3NlXCIpXG4gICk7XG4gIGNvbnN0IG9wZW5Db250cm9scyA9IEFycmF5LmZyb20oXG4gICAgcXVlcnlJZEFsbChcIm1lZ2FuYXYtY29udHJvbC1tb2JpbGUtcGFuZWwtb3BlblwiKVxuICApO1xuXG4gIGNvbnN0IGNsaWNrSGFuZGxlciA9IChidG4sIG9wZW5CdG4sIHBhbmVsKSA9PiAoKSA9PiB7XG4gICAgYnRuLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgZmFsc2UpO1xuICAgIG9wZW5CdG4uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBmYWxzZSk7XG4gICAgcGFuZWwuY2xhc3NMaXN0LnJlcGxhY2UoXCJibG9ja1wiLCBcImhpZGRlblwiKTtcbiAgICBwYW5lbC5zdHlsZS5oZWlnaHQgPSBudWxsO1xuICB9O1xuXG4gIHJldHVybiBjbG9zZUNvbnRyb2xzLm1hcCgoYnRuKSA9PiB7XG4gICAgY29uc3Qgb3BlbkJ0biA9IG9wZW5Db250cm9scy5maW5kKFxuICAgICAgKG9wZW4pID0+XG4gICAgICAgIG9wZW4uZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSA9PT0gYnRuLmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIilcbiAgICApO1xuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGAjJHtidG4uZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKX1gXG4gICAgKTtcbiAgICBjb25zdCBoYW5kbGVyID0gY2xpY2tIYW5kbGVyKGJ0biwgb3BlbkJ0biwgcGFuZWwpO1xuXG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZWFyZG93bjogKCkgPT4gYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVyKSxcbiAgICAgIGNsZWFyOiAoKSA9PiBidG4uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBmYWxzZSksXG4gICAgfTtcbiAgfSk7XG59O1xuIiwiaW1wb3J0IHsgcXVlcnlJZCwgcXVlcnlJZEFsbCB9IGZyb20gXCIuLi9kb20tcXVlcnlcIjtcbmltcG9ydCB7IHJlbXNUb1BpeGVsVmFsdWUgfSBmcm9tIFwiLi4vY3NzXCI7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcbiAgY29uc3QgY2xvc2VDb250cm9scyA9IEFycmF5LmZyb20oXG4gICAgcXVlcnlJZEFsbChcIm1lZ2FuYXYtY29udHJvbC1tb2JpbGUtcGFuZWwtY2xvc2VcIilcbiAgKTtcbiAgY29uc3Qgb3BlbkNvbnRyb2xzID0gQXJyYXkuZnJvbShcbiAgICBxdWVyeUlkQWxsKFwibWVnYW5hdi1jb250cm9sLW1vYmlsZS1wYW5lbC1vcGVuXCIpXG4gICk7XG4gIGNvbnN0IGRyb3Bkb3duID0gcXVlcnlJZChcIm1lZ2FuYXYtbW9iaWxlLWRyb3Bkb3duXCIpO1xuXG4gIC8vIEhlaWdodCBpcyBkZWZpbmVkIGluIHJlbSdzIHNvIHRvIGdldCB0aGUgcGl4ZWwgdmFsdWUgd2UgbmVlZCB0byBmaW5kIHRoZSBmb250U2l6ZSBvbiByb290XG4gIGNvbnN0IG1lZ2FuYXZIZWlnaHQgPSByZW1zVG9QaXhlbFZhbHVlKFxuICAgIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgXCItLXVpLW1lZ2FuYXYtaGVpZ2h0XCJcbiAgICApXG4gICk7XG5cbiAgY29uc3QgY2xpY2tIYW5kbGVyID0gKGJ0biwgY2xvc2VCdG4sIHBhbmVsKSA9PiAoKSA9PiB7XG4gICAgYnRuLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgdHJ1ZSk7XG4gICAgY2xvc2VCdG4uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCB0cnVlKTtcbiAgICBwYW5lbC5jbGFzc0xpc3QucmVwbGFjZShcImhpZGRlblwiLCBcImJsb2NrXCIpO1xuXG4gICAgLy8gT24gZGV2aWNlcyB3aGVyZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHBhbmVsLCBzZXQgaXQncyBoZWlnaHQgdG9cbiAgICAvLyB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCAobWludXMgdGhlIG1lZ2FuYXYgaGVpZ2h0KSAtIHRoaXMgd2lsbCB0cmlnZ2VyIGEgc2Nyb2xsLlxuICAgIC8vIE90aGVyd2lzZSBqdXN0IHNldCBpdCB0byB0aGUgcGFuZWwgaGVpZ2h0LiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHJhdGlvIG9mIHZlcnRpY2FsXG4gICAgLy8gc3BhY2UgdG8gaG9yaXpvbnRhbCBpcyBlc3BlY2lhbGx5IGhpZ2ggKHRoaW5rIHRhYmxldHMsIGJ1dCBub3Qgb25seSkuXG4gICAgcGFuZWwuc3R5bGUuaGVpZ2h0ID0gYCR7XG4gICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgLSBtZWdhbmF2SGVpZ2h0ID4gcGFuZWwub2Zmc2V0SGVpZ2h0XG4gICAgICAgID8gcGFuZWwub2Zmc2V0SGVpZ2h0XG4gICAgICAgIDogd2luZG93LmlubmVySGVpZ2h0IC0gbWVnYW5hdkhlaWdodFxuICAgIH1weGA7XG4gIH07XG5cbiAgcmV0dXJuIG9wZW5Db250cm9scy5tYXAoKGJ0bikgPT4ge1xuICAgIGNvbnN0IGNsb3NlQnRuID0gY2xvc2VDb250cm9scy5maW5kKFxuICAgICAgKG5vZGUpID0+XG4gICAgICAgIG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSA9PT0gYnRuLmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIilcbiAgICApO1xuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGAjJHtidG4uZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKX1gXG4gICAgKTtcbiAgICBjb25zdCBoYW5kbGVyID0gY2xpY2tIYW5kbGVyKGJ0biwgY2xvc2VCdG4sIHBhbmVsKTtcblxuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVhcmRvd246ICgpID0+IGJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlciksXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICBwYW5lbC5jbGFzc0xpc3QucmVwbGFjZShcImJsb2NrXCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKFwidWktbWVnYW5hdi1tb2JpbGUtZHJvcGRvd24tZXhwYW5kXCIpO1xuICAgICAgICBidG4uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBmYWxzZSk7XG4gICAgICAgIHBhbmVsLnN0eWxlLmhlaWdodCA9IG51bGw7XG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufTtcbiIsImV4cG9ydCBjb25zdCByZW1zVG9QaXhlbFZhbHVlID0gKHJlbVN0cmluZykgPT5cbiAgcGFyc2VGbG9hdChyZW1TdHJpbmcpICpcbiAgcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZm9udFNpemUpO1xuIiwiZXhwb3J0IGNvbnN0IHF1ZXJ5SWQgPSAodmFsLCByb290ID0gZG9jdW1lbnQpID0+XG4gIHJvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtaWQ9JHt2YWx9XWApO1xuXG5leHBvcnQgY29uc3QgcXVlcnlJZEFsbCA9ICh2YWwsIHJvb3QgPSBkb2N1bWVudCkgPT5cbiAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS1pZD0ke3ZhbH1dYCk7XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzY3JvbGxMb2NrXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNjcm9sbExvY2tcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdG9vbHMuanNcbnZhciBhcmd1bWVudEFzQXJyYXkgPSBmdW5jdGlvbiBhcmd1bWVudEFzQXJyYXkoYXJndW1lbnQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJndW1lbnQpID8gYXJndW1lbnQgOiBbYXJndW1lbnRdO1xufTtcbnZhciBpc0VsZW1lbnQgPSBmdW5jdGlvbiBpc0VsZW1lbnQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBOb2RlO1xufTtcbnZhciBpc0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gaXNFbGVtZW50TGlzdChub2RlTGlzdCkge1xuICByZXR1cm4gbm9kZUxpc3QgaW5zdGFuY2VvZiBOb2RlTGlzdDtcbn07XG52YXIgZWFjaE5vZGUgPSBmdW5jdGlvbiBlYWNoTm9kZShub2RlTGlzdCwgY2FsbGJhY2spIHtcbiAgaWYgKG5vZGVMaXN0ICYmIGNhbGxiYWNrKSB7XG4gICAgbm9kZUxpc3QgPSBpc0VsZW1lbnRMaXN0KG5vZGVMaXN0KSA/IG5vZGVMaXN0IDogW25vZGVMaXN0XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChjYWxsYmFjayhub2RlTGlzdFtpXSwgaSwgbm9kZUxpc3QubGVuZ3RoKSA9PT0gdHJ1ZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgdGhyb3dFcnJvciA9IGZ1bmN0aW9uIHRocm93RXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gY29uc29sZS5lcnJvcihcIltzY3JvbGwtbG9ja10gXCIuY29uY2F0KG1lc3NhZ2UpKTtcbn07XG52YXIgYXJyYXlBc1NlbGVjdG9yID0gZnVuY3Rpb24gYXJyYXlBc1NlbGVjdG9yKGFycmF5KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgIHZhciBzZWxlY3RvciA9IGFycmF5LmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG59O1xudmFyIG5vZGVMaXN0QXNBcnJheSA9IGZ1bmN0aW9uIG5vZGVMaXN0QXNBcnJheShub2RlTGlzdCkge1xuICB2YXIgbm9kZXMgPSBbXTtcbiAgZWFjaE5vZGUobm9kZUxpc3QsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVzLnB1c2gobm9kZSk7XG4gIH0pO1xuICByZXR1cm4gbm9kZXM7XG59O1xudmFyIGZpbmRQYXJlbnRCeVNlbGVjdG9yID0gZnVuY3Rpb24gZmluZFBhcmVudEJ5U2VsZWN0b3IoJGVsLCBzZWxlY3Rvcikge1xuICB2YXIgc2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgdmFyICRyb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBkb2N1bWVudDtcblxuICBpZiAoc2VsZiAmJiBub2RlTGlzdEFzQXJyYXkoJHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmluZGV4T2YoJGVsKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gJGVsO1xuICB9XG5cbiAgd2hpbGUgKCgkZWwgPSAkZWwucGFyZW50RWxlbWVudCkgJiYgbm9kZUxpc3RBc0FycmF5KCRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5pbmRleE9mKCRlbCkgPT09IC0xKSB7XG4gICAgO1xuICB9XG5cbiAgcmV0dXJuICRlbDtcbn07XG52YXIgZWxlbWVudEhhc1NlbGVjdG9yID0gZnVuY3Rpb24gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpIHtcbiAgdmFyICRyb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBkb2N1bWVudDtcbiAgdmFyIGhhcyA9IG5vZGVMaXN0QXNBcnJheSgkcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuaW5kZXhPZigkZWwpICE9PSAtMTtcbiAgcmV0dXJuIGhhcztcbn07XG52YXIgZWxlbWVudEhhc092ZXJmbG93SGlkZGVuID0gZnVuY3Rpb24gZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCRlbCk7XG4gICAgdmFyIG92ZXJmbG93SXNIaWRkZW4gPSBjb21wdXRlZFN0eWxlLm92ZXJmbG93ID09PSAnaGlkZGVuJztcbiAgICByZXR1cm4gb3ZlcmZsb3dJc0hpZGRlbjtcbiAgfVxufTtcbnZhciBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxUb3BPblN0YXJ0KCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsVG9wID0gJGVsLnNjcm9sbFRvcDtcbiAgICByZXR1cm4gc2Nyb2xsVG9wIDw9IDA7XG4gIH1cbn07XG52YXIgZWxlbWVudFNjcm9sbFRvcE9uRW5kID0gZnVuY3Rpb24gZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsVG9wID0gJGVsLnNjcm9sbFRvcDtcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gJGVsLnNjcm9sbEhlaWdodDtcbiAgICB2YXIgc2Nyb2xsVG9wV2l0aEhlaWdodCA9IHNjcm9sbFRvcCArICRlbC5vZmZzZXRIZWlnaHQ7XG4gICAgcmV0dXJuIHNjcm9sbFRvcFdpdGhIZWlnaHQgPj0gc2Nyb2xsSGVpZ2h0O1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpIHtcbiAgaWYgKCRlbCkge1xuICAgIGlmIChlbGVtZW50SGFzT3ZlcmZsb3dIaWRkZW4oJGVsKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHNjcm9sbExlZnQgPSAkZWwuc2Nyb2xsTGVmdDtcbiAgICByZXR1cm4gc2Nyb2xsTGVmdCA8PSAwO1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQgPSBmdW5jdGlvbiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsTGVmdCA9ICRlbC5zY3JvbGxMZWZ0O1xuICAgIHZhciBzY3JvbGxXaWR0aCA9ICRlbC5zY3JvbGxXaWR0aDtcbiAgICB2YXIgc2Nyb2xsTGVmdFdpdGhXaWR0aCA9IHNjcm9sbExlZnQgKyAkZWwub2Zmc2V0V2lkdGg7XG4gICAgcmV0dXJuIHNjcm9sbExlZnRXaXRoV2lkdGggPj0gc2Nyb2xsV2lkdGg7XG4gIH1cbn07XG52YXIgZWxlbWVudElzU2Nyb2xsYWJsZUZpZWxkID0gZnVuY3Rpb24gZWxlbWVudElzU2Nyb2xsYWJsZUZpZWxkKCRlbCkge1xuICB2YXIgc2VsZWN0b3IgPSAndGV4dGFyZWEsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJztcbiAgcmV0dXJuIGVsZW1lbnRIYXNTZWxlY3RvcigkZWwsIHNlbGVjdG9yKTtcbn07XG52YXIgZWxlbWVudElzSW5wdXRSYW5nZSA9IGZ1bmN0aW9uIGVsZW1lbnRJc0lucHV0UmFuZ2UoJGVsKSB7XG4gIHZhciBzZWxlY3RvciA9ICdpbnB1dFt0eXBlPVwicmFuZ2VcIl0nO1xuICByZXR1cm4gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpO1xufTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3Njcm9sbC1sb2NrLmpzXG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZGlzYWJsZVBhZ2VTY3JvbGxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBkaXNhYmxlUGFnZVNjcm9sbDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZW5hYmxlUGFnZVNjcm9sbFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGVuYWJsZVBhZ2VTY3JvbGw7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldFNjcm9sbFN0YXRlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZ2V0U2Nyb2xsU3RhdGU7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNsZWFyUXVldWVTY3JvbGxMb2Nrc1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNsZWFyUXVldWVTY3JvbGxMb2NrczsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRQYWdlU2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGg7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRDdXJyZW50UGFnZVNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRTY3JvbGxhYmxlVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVtb3ZlU2Nyb2xsYWJsZVRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVUYXJnZXQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZFNjcm9sbGFibGVTZWxlY3RvclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRMb2NrYWJsZVRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRMb2NrYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwic2V0RmlsbEdhcE1ldGhvZFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3NldEZpbGxHYXBNZXRob2Q7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZEZpbGxHYXBUYXJnZXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRGaWxsR2FwVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVGaWxsR2FwVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlRmlsbEdhcFRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkRmlsbEdhcFNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVGaWxsR2FwU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwU2VsZWN0b3I7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInJlZmlsbEdhcHNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiByZWZpbGxHYXBzOyB9KTtcbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuXG52YXIgRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFMgPSBbJ3BhZGRpbmcnLCAnbWFyZ2luJywgJ3dpZHRoJywgJ21heC13aWR0aCcsICdub25lJ107XG52YXIgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPSAzO1xudmFyIHN0YXRlID0ge1xuICBzY3JvbGw6IHRydWUsXG4gIHF1ZXVlOiAwLFxuICBzY3JvbGxhYmxlU2VsZWN0b3JzOiBbJ1tkYXRhLXNjcm9sbC1sb2NrLXNjcm9sbGFibGVdJ10sXG4gIGxvY2thYmxlU2VsZWN0b3JzOiBbJ2JvZHknLCAnW2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGVdJ10sXG4gIGZpbGxHYXBTZWxlY3RvcnM6IFsnYm9keScsICdbZGF0YS1zY3JvbGwtbG9jay1maWxsLWdhcF0nLCAnW2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGVdJ10sXG4gIGZpbGxHYXBNZXRob2Q6IEZJTExfR0FQX0FWQUlMQUJMRV9NRVRIT0RTWzBdLFxuICAvL1xuICBzdGFydFRvdWNoWTogMCxcbiAgc3RhcnRUb3VjaFg6IDBcbn07XG52YXIgZGlzYWJsZVBhZ2VTY3JvbGwgPSBmdW5jdGlvbiBkaXNhYmxlUGFnZVNjcm9sbCh0YXJnZXQpIHtcbiAgaWYgKHN0YXRlLnF1ZXVlIDw9IDApIHtcbiAgICBzdGF0ZS5zY3JvbGwgPSBmYWxzZTtcbiAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIGZpbGxHYXBzKCk7XG4gIH1cblxuICBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG4gIHN0YXRlLnF1ZXVlKys7XG59O1xudmFyIGVuYWJsZVBhZ2VTY3JvbGwgPSBmdW5jdGlvbiBlbmFibGVQYWdlU2Nyb2xsKHRhcmdldCkge1xuICBzdGF0ZS5xdWV1ZSA+IDAgJiYgc3RhdGUucXVldWUtLTtcblxuICBpZiAoc3RhdGUucXVldWUgPD0gMCkge1xuICAgIHN0YXRlLnNjcm9sbCA9IHRydWU7XG4gICAgc2Nyb2xsX2xvY2tfc2hvd0xvY2thYmxlT3ZlcmZsb3coKTtcbiAgICB1bmZpbGxHYXBzKCk7XG4gIH1cblxuICBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG59O1xudmFyIGdldFNjcm9sbFN0YXRlID0gZnVuY3Rpb24gZ2V0U2Nyb2xsU3RhdGUoKSB7XG4gIHJldHVybiBzdGF0ZS5zY3JvbGw7XG59O1xudmFyIGNsZWFyUXVldWVTY3JvbGxMb2NrcyA9IGZ1bmN0aW9uIGNsZWFyUXVldWVTY3JvbGxMb2NrcygpIHtcbiAgc3RhdGUucXVldWUgPSAwO1xufTtcbnZhciBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCA9IGZ1bmN0aW9uIGdldFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpIHtcbiAgdmFyIG9ubHlFeGlzdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICB2YXIgY3VycmVudE92ZXJmbG93WVByb3BlcnR5ID0gJHRhcmdldC5zdHlsZS5vdmVyZmxvd1k7XG5cbiAgICBpZiAob25seUV4aXN0cykge1xuICAgICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9ICdzY3JvbGwnO1xuICAgIH1cblxuICAgIHZhciB3aWR0aCA9IHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkdGFyZ2V0KTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9IGN1cnJlbnRPdmVyZmxvd1lQcm9wZXJ0eTtcbiAgICByZXR1cm4gd2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpIHtcbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgIGlmICgkdGFyZ2V0ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICB2YXIgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgdmFyIGN1cnJlbnRXaWR0aCA9IHdpbmRvd1dpZHRoIC0gZG9jdW1lbnRXaWR0aDtcbiAgICAgIHJldHVybiBjdXJyZW50V2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBib3JkZXJMZWZ0V2lkdGhDdXJyZW50UHJvcGVydHkgPSAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aDtcbiAgICAgIHZhciBib3JkZXJSaWdodFdpZHRoQ3VycmVudFByb3BlcnR5ID0gJHRhcmdldC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoO1xuICAgICAgJHRhcmdldC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSAnMHB4JztcbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9ICcwcHgnO1xuXG4gICAgICB2YXIgX2N1cnJlbnRXaWR0aCA9ICR0YXJnZXQub2Zmc2V0V2lkdGggLSAkdGFyZ2V0LmNsaWVudFdpZHRoO1xuXG4gICAgICAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9IGJvcmRlckxlZnRXaWR0aEN1cnJlbnRQcm9wZXJ0eTtcbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9IGJvcmRlclJpZ2h0V2lkdGhDdXJyZW50UHJvcGVydHk7XG4gICAgICByZXR1cm4gX2N1cnJlbnRXaWR0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgZ2V0UGFnZVNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0UGFnZVNjcm9sbEJhcldpZHRoKCkge1xuICB2YXIgb25seUV4aXN0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHJldHVybiBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aChkb2N1bWVudC5ib2R5LCBvbmx5RXhpc3RzKTtcbn07XG52YXIgZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCA9IGZ1bmN0aW9uIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgoKSB7XG4gIHJldHVybiBzY3JvbGxfbG9ja19nZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGgoZG9jdW1lbnQuYm9keSk7XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVUYXJnZXQgPSBmdW5jdGlvbiBhZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldHMgPSBhcmd1bWVudEFzQXJyYXkodGFyZ2V0KTtcbiAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoJHRhcmdldHMpIHtcbiAgICAgIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgICAgICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgICAgICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2Nyb2xsYWJsZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNjcm9sbGFibGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlU2VsZWN0b3IgPSBmdW5jdGlvbiBhZGRTY3JvbGxhYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLnNjcm9sbGFibGVTZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yID0gZnVuY3Rpb24gcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmIChzZWxlY3Rvcikge1xuICAgIHZhciBzZWxlY3RvcnMgPSBhcmd1bWVudEFzQXJyYXkoc2VsZWN0b3IpO1xuICAgIHNlbGVjdG9ycy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICBzdGF0ZS5zY3JvbGxhYmxlU2VsZWN0b3JzID0gc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24gKHNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gc1NlbGVjdG9yICE9PSBzZWxlY3RvcjtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0ID0gZnVuY3Rpb24gYWRkTG9ja2FibGVUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICghZ2V0U2Nyb2xsU3RhdGUoKSkge1xuICAgICAgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3coKTtcbiAgICB9XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvciA9IGZ1bmN0aW9uIGFkZExvY2thYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLmxvY2thYmxlU2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIH1cblxuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfc2V0RmlsbEdhcE1ldGhvZCA9IGZ1bmN0aW9uIHNldEZpbGxHYXBNZXRob2QobWV0aG9kKSB7XG4gIGlmIChtZXRob2QpIHtcbiAgICBpZiAoRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFMuaW5kZXhPZihtZXRob2QpICE9PSAtMSkge1xuICAgICAgc3RhdGUuZmlsbEdhcE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIHJlZmlsbEdhcHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1ldGhvZHMgPSBGSUxMX0dBUF9BVkFJTEFCTEVfTUVUSE9EUy5qb2luKCcsICcpO1xuICAgICAgdGhyb3dFcnJvcihcIlxcXCJcIi5jb25jYXQobWV0aG9kLCBcIlxcXCIgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUhXFxuQXZhaWxhYmxlIGZpbGwgZ2FwIG1ldGhvZHM6IFwiKS5jb25jYXQobWV0aG9kcywgXCIuXCIpKTtcbiAgICB9XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFRhcmdldCA9IGZ1bmN0aW9uIGFkZEZpbGxHYXBUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsLWdhcCcsICcnKTtcblxuICAgICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgICBzY3JvbGxfbG9ja19maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlRmlsbEdhcFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGwtZ2FwJyk7XG5cbiAgICAgICAgICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgICAgICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRGaWxsR2FwU2VsZWN0b3IgPSBmdW5jdGlvbiBhZGRGaWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIGlmIChzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLmluZGV4T2Yoc2VsZWN0b3IpID09PSAtMSkge1xuICAgICAgICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgc2Nyb2xsX2xvY2tfZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIHJlbW92ZUZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgc3RhdGUuZmlsbEdhcFNlbGVjdG9ycyA9IHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uIChmU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZTZWxlY3RvciAhPT0gc2VsZWN0b3I7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xudmFyIHJlZmlsbEdhcHMgPSBmdW5jdGlvbiByZWZpbGxHYXBzKCkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIGZpbGxHYXBzKCk7XG4gIH1cbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdyA9IGZ1bmN0aW9uIGhpZGVMb2NrYWJsZU92ZXJmbG93KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUubG9ja2FibGVTZWxlY3RvcnMpO1xuICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvdyA9IGZ1bmN0aW9uIHNob3dMb2NrYWJsZU92ZXJmbG93KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUubG9ja2FibGVTZWxlY3RvcnMpO1xuICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yID0gZnVuY3Rpb24gaGlkZUxvY2thYmxlT3ZlcmZsb3dTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3dUYXJnZXQoJHRhcmdldCk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3IgPSBmdW5jdGlvbiBzaG93TG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3dUYXJnZXQgPSBmdW5jdGlvbiBoaWRlTG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KSB7XG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkgJiYgJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJykgIT09ICd0cnVlJykge1xuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoJHRhcmdldCk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3cteS1wcm9wZXJ0eScsIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dZKTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3ctcHJvcGVydHknLCAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93KTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScsICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZKTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJywgJ3RydWUnKTtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93VGFyZ2V0ID0gZnVuY3Rpb24gc2hvd0xvY2thYmxlT3ZlcmZsb3dUYXJnZXQoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpICYmICR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWxvY2tlZCcpID09PSAndHJ1ZScpIHtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93ID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5zdHlsZS5vdmVyZmxvd1kgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXktcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrZWQnKTtcbiAgfVxufTtcblxudmFyIGZpbGxHYXBzID0gZnVuY3Rpb24gZmlsbEdhcHMoKSB7XG4gIHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxudmFyIHVuZmlsbEdhcHMgPSBmdW5jdGlvbiB1bmZpbGxHYXBzKCkge1xuICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2ZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIGZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgdmFyIGlzTG9ja2FibGUgPSBzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycy5pbmRleE9mKHNlbGVjdG9yKSAhPT0gLTE7XG4gIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQoJHRhcmdldCwgaXNMb2NrYWJsZSk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiBmaWxsR2FwVGFyZ2V0KCR0YXJnZXQpIHtcbiAgdmFyIGlzTG9ja2FibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICB2YXIgc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICBpZiAoJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGUnKSA9PT0gJycgfHwgaXNMb2NrYWJsZSkge1xuICAgICAgc2Nyb2xsQmFyV2lkdGggPSBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkdGFyZ2V0LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyICRsb2NrYWJsZVBhcmVudCA9IGZpbmRQYXJlbnRCeVNlbGVjdG9yKCR0YXJnZXQsIGFycmF5QXNTZWxlY3RvcihzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycykpO1xuICAgICAgc2Nyb2xsQmFyV2lkdGggPSBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkbG9ja2FibGVQYXJlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICgkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsZWQtZ2FwJykgPT09ICd0cnVlJykge1xuICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgIH1cblxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoJHRhcmdldCk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcsICd0cnVlJyk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stY3VycmVudC1maWxsLWdhcC1tZXRob2QnLCBzdGF0ZS5maWxsR2FwTWV0aG9kKTtcblxuICAgIGlmIChzdGF0ZS5maWxsR2FwTWV0aG9kID09PSAnbWFyZ2luJykge1xuICAgICAgdmFyIGN1cnJlbnRNYXJnaW4gPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUubWFyZ2luUmlnaHQpO1xuICAgICAgJHRhcmdldC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiXCIuY29uY2F0KGN1cnJlbnRNYXJnaW4gKyBzY3JvbGxCYXJXaWR0aCwgXCJweFwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICd3aWR0aCcpIHtcbiAgICAgICR0YXJnZXQuc3R5bGUud2lkdGggPSBcImNhbGMoMTAwJSAtIFwiLmNvbmNhdChzY3JvbGxCYXJXaWR0aCwgXCJweClcIik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5maWxsR2FwTWV0aG9kID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgJHRhcmdldC5zdHlsZS5tYXhXaWR0aCA9IFwiY2FsYygxMDAlIC0gXCIuY29uY2F0KHNjcm9sbEJhcldpZHRoLCBcInB4KVwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICdwYWRkaW5nJykge1xuICAgICAgdmFyIGN1cnJlbnRQYWRkaW5nID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCk7XG4gICAgICAkdGFyZ2V0LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCIuY29uY2F0KGN1cnJlbnRQYWRkaW5nICsgc2Nyb2xsQmFyV2lkdGgsIFwicHhcIik7XG4gICAgfVxuICB9XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfdW5maWxsR2FwU2VsZWN0b3IgPSBmdW5jdGlvbiB1bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICB9KTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiB1bmZpbGxHYXBUYXJnZXQoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgaWYgKCR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGxlZC1nYXAnKSA9PT0gJ3RydWUnKSB7XG4gICAgICB2YXIgY3VycmVudEZpbGxHYXBNZXRob2QgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1jdXJyZW50LWZpbGwtZ2FwLW1ldGhvZCcpO1xuICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcpO1xuICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stY3VycmVudC1maWxsLWdhcC1tZXRob2QnKTtcblxuICAgICAgaWYgKGN1cnJlbnRGaWxsR2FwTWV0aG9kID09PSAnbWFyZ2luJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICd3aWR0aCcpIHtcbiAgICAgICAgJHRhcmdldC5zdHlsZS53aWR0aCA9IFwiXCI7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRGaWxsR2FwTWV0aG9kID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLm1heFdpZHRoID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICdwYWRkaW5nJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgb25SZXNpemUgPSBmdW5jdGlvbiBvblJlc2l6ZShlKSB7XG4gIHJlZmlsbEdhcHMoKTtcbn07XG5cbnZhciBvblRvdWNoU3RhcnQgPSBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIHN0YXRlLnN0YXJ0VG91Y2hZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX29uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIHZhciBzdGFydFRvdWNoWSA9IHN0YXRlLnN0YXJ0VG91Y2hZLFxuICAgICAgICBzdGFydFRvdWNoWCA9IHN0YXRlLnN0YXJ0VG91Y2hYO1xuICAgIHZhciBjdXJyZW50Q2xpZW50WSA9IGUudG91Y2hlc1swXS5jbGllbnRZO1xuICAgIHZhciBjdXJyZW50Q2xpZW50WCA9IGUudG91Y2hlc1swXS5jbGllbnRYO1xuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycyk7XG4gICAgICB2YXIgZGlyZWN0aW9uID0ge1xuICAgICAgICB1cDogc3RhcnRUb3VjaFkgPCBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgZG93bjogc3RhcnRUb3VjaFkgPiBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgbGVmdDogc3RhcnRUb3VjaFggPCBjdXJyZW50Q2xpZW50WCxcbiAgICAgICAgcmlnaHQ6IHN0YXJ0VG91Y2hYID4gY3VycmVudENsaWVudFhcbiAgICAgIH07XG4gICAgICB2YXIgZGlyZWN0aW9uV2l0aE9mZnNldCA9IHtcbiAgICAgICAgdXA6IHN0YXJ0VG91Y2hZICsgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPCBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgZG93bjogc3RhcnRUb3VjaFkgLSBUT1VDSF9ESVJFQ1RJT05fREVURUNUX09GRlNFVCA+IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBsZWZ0OiBzdGFydFRvdWNoWCArIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUIDwgY3VycmVudENsaWVudFgsXG4gICAgICAgIHJpZ2h0OiBzdGFydFRvdWNoWCAtIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUID4gY3VycmVudENsaWVudFhcbiAgICAgIH07XG5cbiAgICAgIHZhciBoYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUoJGVsKSB7XG4gICAgICAgIHZhciBza2lwID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgICAgICBpZiAoJGVsKSB7XG4gICAgICAgICAgdmFyIHBhcmVudFNjcm9sbGFibGVFbCA9IGZpbmRQYXJlbnRCeVNlbGVjdG9yKCRlbCwgc2VsZWN0b3IsIGZhbHNlKTtcblxuICAgICAgICAgIGlmIChlbGVtZW50SXNJbnB1dFJhbmdlKCRlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2tpcCB8fCBlbGVtZW50SXNTY3JvbGxhYmxlRmllbGQoJGVsKSAmJiBmaW5kUGFyZW50QnlTZWxlY3RvcigkZWwsIHNlbGVjdG9yKSB8fCBlbGVtZW50SGFzU2VsZWN0b3IoJGVsLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHZhciBwcmV2ZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50U2Nyb2xsTGVmdE9uU3RhcnQoJGVsKSAmJiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkpIHtcbiAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbi51cCAmJiBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbi5kb3duICYmIGVsZW1lbnRTY3JvbGxUb3BPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSAmJiBlbGVtZW50U2Nyb2xsVG9wT25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uLmxlZnQgJiYgZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0KCRlbCkgfHwgZGlyZWN0aW9uLnJpZ2h0ICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICAgIHByZXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbldpdGhPZmZzZXQudXAgJiYgZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSB8fCBkaXJlY3Rpb25XaXRoT2Zmc2V0LmRvd24gJiYgZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkgfHwgZGlyZWN0aW9uV2l0aE9mZnNldC5sZWZ0ICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbldpdGhPZmZzZXQucmlnaHQgJiYgZWxlbWVudFNjcm9sbExlZnRPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgIHByZXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmVudCkge1xuICAgICAgICAgICAgICBpZiAocGFyZW50U2Nyb2xsYWJsZUVsKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlKHBhcmVudFNjcm9sbGFibGVFbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUocGFyZW50U2Nyb2xsYWJsZUVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaGFuZGxlKGUudGFyZ2V0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBvblRvdWNoRW5kID0gZnVuY3Rpb24gb25Ub3VjaEVuZChlKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFkgPSAwO1xuICAgIHN0YXRlLnN0YXJ0VG91Y2hYID0gMDtcbiAgfVxufTtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzY3JvbGxfbG9ja19vblRvdWNoTW92ZSwge1xuICAgIHBhc3NpdmU6IGZhbHNlXG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQpO1xufVxuXG52YXIgZGVwcmVjYXRlZE1ldGhvZHMgPSB7XG4gIGhpZGU6IGZ1bmN0aW9uIGhpZGUodGFyZ2V0KSB7XG4gICAgdGhyb3dFcnJvcignXCJoaWRlXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZGlzYWJsZVBhZ2VTY3JvbGxcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjZGlzYWJsZXBhZ2VzY3JvbGxzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgZGlzYWJsZVBhZ2VTY3JvbGwodGFyZ2V0KTtcbiAgfSxcbiAgc2hvdzogZnVuY3Rpb24gc2hvdyh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNob3dcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJlbmFibGVQYWdlU2Nyb2xsXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2VuYWJsZXBhZ2VzY3JvbGxzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgZW5hYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICB9LFxuICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInRvZ2dsZVwiIGlzIGRlcHJlY2F0ZWQhIERvIG5vdCB1c2UgaXQuJyk7XG5cbiAgICBpZiAoZ2V0U2Nyb2xsU3RhdGUoKSkge1xuICAgICAgZGlzYWJsZVBhZ2VTY3JvbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICAgIH1cbiAgfSxcbiAgZ2V0U3RhdGU6IGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIHRocm93RXJyb3IoJ1wiZ2V0U3RhdGVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJnZXRTY3JvbGxTdGF0ZVwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNnZXRzY3JvbGxzdGF0ZScpO1xuICAgIHJldHVybiBnZXRTY3JvbGxTdGF0ZSgpO1xuICB9LFxuICBnZXRXaWR0aDogZnVuY3Rpb24gZ2V0V2lkdGgoKSB7XG4gICAgdGhyb3dFcnJvcignXCJnZXRXaWR0aFwiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImdldFBhZ2VTY3JvbGxCYXJXaWR0aFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNnZXRwYWdlc2Nyb2xsYmFyd2lkdGgnKTtcbiAgICByZXR1cm4gZ2V0UGFnZVNjcm9sbEJhcldpZHRoKCk7XG4gIH0sXG4gIGdldEN1cnJlbnRXaWR0aDogZnVuY3Rpb24gZ2V0Q3VycmVudFdpZHRoKCkge1xuICAgIHRocm93RXJyb3IoJ1wiZ2V0Q3VycmVudFdpZHRoXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNnZXRjdXJyZW50cGFnZXNjcm9sbGJhcndpZHRoJyk7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgoKTtcbiAgfSxcbiAgc2V0U2Nyb2xsYWJsZVRhcmdldHM6IGZ1bmN0aW9uIHNldFNjcm9sbGFibGVUYXJnZXRzKHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1wic2V0U2Nyb2xsYWJsZVRhcmdldHNcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJhZGRTY3JvbGxhYmxlVGFyZ2V0XCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZHNjcm9sbGFibGV0YXJnZXRzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCh0YXJnZXQpO1xuICB9LFxuICBzZXRGaWxsR2FwU2VsZWN0b3JzOiBmdW5jdGlvbiBzZXRGaWxsR2FwU2VsZWN0b3JzKHNlbGVjdG9yKSB7XG4gICAgdGhyb3dFcnJvcignXCJzZXRGaWxsR2FwU2VsZWN0b3JzXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiYWRkRmlsbEdhcFNlbGVjdG9yXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZGZpbGxnYXBzZWxlY3RvcmZpbGxnYXBzZWxlY3RvcicpO1xuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0sXG4gIHNldEZpbGxHYXBUYXJnZXRzOiBmdW5jdGlvbiBzZXRGaWxsR2FwVGFyZ2V0cyh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNldEZpbGxHYXBUYXJnZXRzXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiYWRkRmlsbEdhcFRhcmdldFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNhZGRmaWxsZ2FwdGFyZ2V0ZmlsbGdhcHRhcmdldCcpO1xuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQodGFyZ2V0KTtcbiAgfSxcbiAgY2xlYXJRdWV1ZTogZnVuY3Rpb24gY2xlYXJRdWV1ZSgpIHtcbiAgICB0aHJvd0Vycm9yKCdcImNsZWFyUXVldWVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJjbGVhclF1ZXVlU2Nyb2xsTG9ja3NcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjY2xlYXJxdWV1ZXNjcm9sbGxvY2tzJyk7XG4gICAgY2xlYXJRdWV1ZVNjcm9sbExvY2tzKCk7XG4gIH1cbn07XG5cbnZhciBzY3JvbGxMb2NrID0gX29iamVjdFNwcmVhZCh7XG4gIGRpc2FibGVQYWdlU2Nyb2xsOiBkaXNhYmxlUGFnZVNjcm9sbCxcbiAgZW5hYmxlUGFnZVNjcm9sbDogZW5hYmxlUGFnZVNjcm9sbCxcbiAgZ2V0U2Nyb2xsU3RhdGU6IGdldFNjcm9sbFN0YXRlLFxuICBjbGVhclF1ZXVlU2Nyb2xsTG9ja3M6IGNsZWFyUXVldWVTY3JvbGxMb2NrcyxcbiAgZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGg6IHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoLFxuICBnZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGg6IHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aCxcbiAgZ2V0UGFnZVNjcm9sbEJhcldpZHRoOiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGgsXG4gIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGg6IGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgsXG4gIGFkZFNjcm9sbGFibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVNlbGVjdG9yLFxuICByZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3I6IHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVTZWxlY3RvcixcbiAgYWRkU2Nyb2xsYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCxcbiAgcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldCxcbiAgYWRkTG9ja2FibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvcixcbiAgYWRkTG9ja2FibGVUYXJnZXQ6IHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0LFxuICBhZGRGaWxsR2FwU2VsZWN0b3I6IHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcixcbiAgcmVtb3ZlRmlsbEdhcFNlbGVjdG9yOiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwU2VsZWN0b3IsXG4gIGFkZEZpbGxHYXBUYXJnZXQ6IHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQsXG4gIHJlbW92ZUZpbGxHYXBUYXJnZXQ6IHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBUYXJnZXQsXG4gIHNldEZpbGxHYXBNZXRob2Q6IHNjcm9sbF9sb2NrX3NldEZpbGxHYXBNZXRob2QsXG4gIHJlZmlsbEdhcHM6IHJlZmlsbEdhcHMsXG4gIF9zdGF0ZTogc3RhdGVcbn0sIGRlcHJlY2F0ZWRNZXRob2RzKTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2Nyb2xsX2xvY2sgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChzY3JvbGxMb2NrKTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pW1wiZGVmYXVsdFwiXTtcbn0pOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB0aHJvdHRsZSBmcm9tIFwibG9kYXNoLnRocm90dGxlXCI7XG5cbmltcG9ydCBcIi4vY29tcG9uZW50LmNzc1wiO1xuXG4vLyBHbG9zc2FyeTpcbi8vIGl0ZW0gLSBpcyB0aGUgZWxlbWVudCB3aGljaCBjb250YWlucyBib3RoIHRoZSBjb250cm9sIGFuZCB0aGUgcGFuZWwgLSB0aGVzZSBhcmUgYWRqYWNlbnRcbi8vIGNvbnRyb2wgLSBpbnRlcmFjdGl2ZSBlbGVtZW50IHRoYXQgY29udHJvbHMgc2hvd2luZyBhbmQgaGlkaW5nIG9mIGRyb3Bkb3duIG9yIHBhbmVsXG4vLyBwYW5lbCAtIGNvbnRhaW5lciBmb3IgbWVnYW5hdiBjb250ZW50XG4vLyBkcm9wZG93biAtIGNvbnRhaW5lciBmb3IgdG9wIGxldmVsIGl0ZW1zIG9uIG1vYmlsZVxuLy8gY2xlYXIgLSByZXR1cm4gdG8gaW5pdGlhbCBzdGF0ZVxuLy8gdGVhcmRvd24gLSByZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyAoZm9yIGV4YW1wbGUgd2hlbiByZW1vdmluZyBub2RlcylcblxuaW1wb3J0IHsgcXVlcnlJZCwgcXVlcnlJZEFsbCB9IGZyb20gXCIuLi9kb20tcXVlcnlcIjtcblxuaW1wb3J0IE1lZ2FuYXZDb250cm9sIGZyb20gXCIuLi9NZWdhbmF2Q29udHJvbC9jb21wb25lbnRcIjtcblxuaW1wb3J0IE1lZ2FuYXZDb250cm9sTW9iaWxlRHJvcGRvd24gZnJvbSBcIi4uL01lZ2FuYXZDb250cm9sTW9iaWxlRHJvcGRvd24vY29tcG9uZW50XCI7XG5pbXBvcnQgTW9iaWxlUGFuZWxPcGVuQ2xpY2sgZnJvbSBcIi4uL01lZ2FuYXZDb250cm9sTW9iaWxlUGFuZWxPcGVuL2NvbXBvbmVudFwiO1xuaW1wb3J0IE1vYmlsZVBhbmVsQ2xvc2VDbGljayBmcm9tIFwiLi4vTWVnYW5hdkNvbnRyb2xNb2JpbGVQYW5lbENsb3NlL2NvbXBvbmVudFwiO1xuXG4vLyBDbG9zZSBtZW51IHdoZW4gdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB2aWV3cG9ydFxuY29uc3Qgd2luZG93T25CbHVyID0gKGNsb3NlQWxsKSA9PiB7XG4gIHdpbmRvdy5vbmJsdXIgPSAoKSA9PiBjbG9zZUFsbCgpO1xuICByZXR1cm4geyB0ZWFyZG93bjogKCkgPT4gKHdpbmRvdy5vbmJsdXIgPSBudWxsKSB9O1xufTtcblxuLy8gQ2xvc2UgbWVudSB3aGVuIGNsaWNrL3RhcCBvdXRzaWRlIG9mIG5hdlxuY29uc3QgZG9jdW1lbnRDbGljayA9IChjbG9zZUFsbCkgPT4ge1xuICBjb25zdCBtZWdhbmF2ID0gcXVlcnlJZChcIm1lZ2FuYXZcIik7XG5cbiAgY29uc3QgY2xpY2tIYW5kbGVyID0gKGUpID0+IHtcbiAgICBpZiAobWVnYW5hdi5jb250YWlucyhlLnRhcmdldCkpIHJldHVybjtcbiAgICBjbG9zZUFsbCgpO1xuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbGlja0hhbmRsZXIpO1xuXG4gIHJldHVybiB7XG4gICAgdGVhcmRvd246ICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbGlja0hhbmRsZXIpLFxuICB9O1xufTtcblxuLy8gSW52ZXJ0IGZyb20gdHJhbnNwYXJlbnQgdG8gd2hpdGVcbmNvbnN0IGRvY3VtZW50U2Nyb2xsID0gKHRoZW1lTmFtZSkgPT4ge1xuICBpZiAodGhlbWVOYW1lICE9PSBcInRyYW5zcGFyZW50VG9XaGl0ZVwiKSByZXR1cm4geyB0ZWFyZG93bjogKCkgPT4ge30gfTtcblxuICBjb25zdCBtZWdhbmF2ID0gcXVlcnlJZChcIm1lZ2FuYXZcIik7XG4gIGNvbnN0IG5hdkl0ZW1zID0gcXVlcnlJZEFsbChcIm1lZ2FuYXYtbGlua1wiKTtcbiAgY29uc3QgY29udHJvbE1vYmlsZURyb3Bkb3duTWVudSA9IHF1ZXJ5SWQoXG4gICAgXCJtZWdhbmF2LWNvbnRyb2wtbW9iaWxlLWRyb3Bkb3duLW1lbnVcIlxuICApO1xuICBjb25zdCBjb250cm9sTW9iaWxlRHJvcGRvd25DbG9zZSA9IHF1ZXJ5SWQoXG4gICAgXCJtZWdhbmF2LWNvbnRyb2wtbW9iaWxlLWRyb3Bkb3duLWNsb3NlXCJcbiAgKTtcbiAgY29uc3QgY29udHJvbHMgPSBxdWVyeUlkQWxsKFwibWVnYW5hdi1jb250cm9sXCIpO1xuICBjb25zdCBzaWduVXBCdG4gPSBxdWVyeUlkKFwibWVnYW5hdi1zaWduLXVwLWJ0blwiKTtcblxuICBjb25zdCBpbnZlcnRUZXh0Q29sbGVjdGlvbiA9IFtcbiAgICAuLi5BcnJheS5mcm9tKGNvbnRyb2xzKSxcbiAgICAuLi5BcnJheS5mcm9tKG5hdkl0ZW1zKSxcbiAgICBxdWVyeUlkKFwibWVnYW5hdi1sb2dvXCIpLFxuICBdO1xuXG4gIGNvbnN0IGludmVydE1vYmxlRHJvcGRvd25Db2xvciA9IChpbnZlcnQpID0+IHtcbiAgICBjb25zdCB3aGl0ZVRvQmxhY2sgPSBbXCJ1aS1pY29uLXdoaXRlXCIsIFwidWktaWNvbi1jb29sLWJsYWNrXCJdO1xuICAgIGNvbnN0IGJsYWNrVG9XaGl0ZSA9IFsuLi53aGl0ZVRvQmxhY2tdLnJldmVyc2UoKTtcblxuICAgIGlmIChpbnZlcnQpIHtcbiAgICAgIGNvbnRyb2xNb2JpbGVEcm9wZG93bk1lbnU/LmNsYXNzTGlzdC5yZXBsYWNlKC4uLndoaXRlVG9CbGFjayk7XG4gICAgICBjb250cm9sTW9iaWxlRHJvcGRvd25DbG9zZT8uY2xhc3NMaXN0LnJlcGxhY2UoLi4ud2hpdGVUb0JsYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbE1vYmlsZURyb3Bkb3duTWVudT8uY2xhc3NMaXN0LnJlcGxhY2UoLi4uYmxhY2tUb1doaXRlKTtcbiAgICAgIGNvbnRyb2xNb2JpbGVEcm9wZG93bkNsb3NlPy5jbGFzc0xpc3QucmVwbGFjZSguLi5ibGFja1RvV2hpdGUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpbnZlclNpZ251cEJ0bkNvbG9ycyA9IChpbnZlcnQpID0+IHtcbiAgICBpZiAoaW52ZXJ0KSB7XG4gICAgICBzaWduVXBCdG4/LmNsYXNzTGlzdC5yZXBsYWNlKFwiYmctd2hpdGVcIiwgXCJiZy1jb29sLWJsYWNrXCIpO1xuICAgICAgc2lnblVwQnRuPy5jbGFzc0xpc3QucmVwbGFjZShcInRleHQtY29vbC1ibGFja1wiLCBcInRleHQtd2hpdGVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNpZ25VcEJ0bj8uY2xhc3NMaXN0LnJlcGxhY2UoXCJiZy1jb29sLWJsYWNrXCIsIFwiYmctd2hpdGVcIik7XG4gICAgICBzaWduVXBCdG4/LmNsYXNzTGlzdC5yZXBsYWNlKFwidGV4dC13aGl0ZVwiLCBcInRleHQtY29vbC1ibGFja1wiKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9IHRocm90dGxlKCgpID0+IHtcbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiA1KSB7XG4gICAgICBtZWdhbmF2LmNsYXNzTGlzdC5yZXBsYWNlKFwiYmctdHJhbnNwYXJlbnRcIiwgXCJiZy13aGl0ZVwiKTtcbiAgICAgIGludmVyU2lnbnVwQnRuQ29sb3JzKHRydWUpO1xuICAgICAgaW52ZXJ0TW9ibGVEcm9wZG93bkNvbG9yKHRydWUpO1xuXG4gICAgICBpbnZlcnRUZXh0Q29sbGVjdGlvbi5mb3JFYWNoKChuKSA9PlxuICAgICAgICBuLmNsYXNzTGlzdC5yZXBsYWNlKFwidGV4dC13aGl0ZVwiLCBcInRleHQtY29vbC1ibGFja1wiKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVnYW5hdi5jbGFzc0xpc3QucmVwbGFjZShcImJnLXdoaXRlXCIsIFwiYmctdHJhbnNwYXJlbnRcIik7XG4gICAgICBpbnZlclNpZ251cEJ0bkNvbG9ycyhmYWxzZSk7XG4gICAgICBpbnZlcnRNb2JsZURyb3Bkb3duQ29sb3IoZmFsc2UpO1xuXG4gICAgICBpbnZlcnRUZXh0Q29sbGVjdGlvbi5mb3JFYWNoKChuKSA9PlxuICAgICAgICBuLmNsYXNzTGlzdC5yZXBsYWNlKFwidGV4dC1jb29sLWJsYWNrXCIsIFwidGV4dC13aGl0ZVwiKVxuICAgICAgKTtcbiAgICB9XG4gIH0sIDE1MCk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBzY3JvbGxIYW5kbGVyKTtcblxuICByZXR1cm4ge1xuICAgIHRlYXJkb3duOiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHNjcm9sbEhhbmRsZXIpLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWVnYW5hdih7IHRoZW1lTmFtZSB9ID0geyB0aGVtZU5hbWU6IG51bGwgfSkge1xuICBjb25zdCBjb250cm9scyA9IE1lZ2FuYXZDb250cm9sKCk7XG4gIGNvbnN0IHBhbmVsT3BlbkNvbnRyb2xzID0gTW9iaWxlUGFuZWxPcGVuQ2xpY2soKTtcbiAgY29uc3QgcGFuZWxDbG9zZUNvbnRyb2xzID0gTW9iaWxlUGFuZWxDbG9zZUNsaWNrKCk7XG5cbiAgY29uc3QgbW9iaWxlRHJvcGRvd25Db250cm9sID0gTWVnYW5hdkNvbnRyb2xNb2JpbGVEcm9wZG93bih7XG4gICAgY2xlYXJQYW5lbHM6ICgpID0+XG4gICAgICBbLi4ucGFuZWxPcGVuQ29udHJvbHMsIC4uLnBhbmVsQ2xvc2VDb250cm9sc10uZm9yRWFjaCgoaSkgPT4gaS5jbGVhcigpKSxcbiAgfSk7XG5cbiAgY29uc3QgY2xvc2VBbGwgPSAoKSA9PlxuICAgIFtcbiAgICAgIG1vYmlsZURyb3Bkb3duQ29udHJvbCxcbiAgICAgIC4uLnBhbmVsT3BlbkNvbnRyb2xzLFxuICAgICAgLi4ucGFuZWxDbG9zZUNvbnRyb2xzLFxuICAgICAgLi4uY29udHJvbHMsXG4gICAgXS5mb3JFYWNoKChpKSA9PiBpLmNsZWFyKCkpO1xuXG4gIGNvbnN0IHRlYXJkb3ducyA9IFtcbiAgICBkb2N1bWVudFNjcm9sbCh0aGVtZU5hbWUpLFxuICAgIGRvY3VtZW50Q2xpY2soY2xvc2VBbGwpLFxuICAgIHdpbmRvd09uQmx1cihjbG9zZUFsbCksXG4gICAgbW9iaWxlRHJvcGRvd25Db250cm9sLFxuICAgIC4uLmNvbnRyb2xzLFxuICAgIC4uLnBhbmVsT3BlbkNvbnRyb2xzLFxuICAgIC4uLnBhbmVsQ2xvc2VDb250cm9scyxcbiAgXS5tYXAoKGkpID0+IGkudGVhcmRvd24pO1xuXG4gIHJldHVybiAoKSA9PiB0ZWFyZG93bnMuZm9yRWFjaCgodGVhcmRvd24pID0+IHRlYXJkb3duKCkpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==