clientnode 4.0.1427 → 4.0.1429

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/Lock.js +100 -1
  2. package/dist/Logger.js +185 -1
  3. package/dist/Semaphore.js +65 -1
  4. package/dist/array.js +452 -1
  5. package/dist/cli.js +51 -1
  6. package/dist/constants.js +126 -1
  7. package/dist/context.js +40 -1
  8. package/dist/cookie.js +84 -1
  9. package/dist/data-transfer.js +216 -1
  10. package/dist/datetime.js +282 -1
  11. package/dist/domNode.js +331 -1
  12. package/dist/expression/evaluators.js +273 -1
  13. package/dist/expression/helper.js +97 -1
  14. package/dist/expression/index.js +26 -1
  15. package/dist/expression/indicator-functions.js +37 -1
  16. package/dist/expression/type.js +20 -0
  17. package/dist/filesystem.js +410 -1
  18. package/dist/function.js +75 -1
  19. package/dist/index.js +43 -1
  20. package/dist/indicators.js +121 -1
  21. package/dist/number.js +61 -1
  22. package/dist/object.js +934 -1
  23. package/dist/process.js +69 -1
  24. package/dist/property-types.js +115 -1
  25. package/dist/require.js +82 -1
  26. package/dist/scope.js +85 -1
  27. package/dist/string.js +806 -1
  28. package/dist/test-helper.js +341 -1
  29. package/dist/type.js +21 -1
  30. package/dist/utility.js +139 -1
  31. package/package.json +23 -21
  32. package/dist/Lock.d.ts +0 -39
  33. package/dist/Logger.d.ts +0 -102
  34. package/dist/Semaphore.d.ts +0 -29
  35. package/dist/array.d.ts +0 -150
  36. package/dist/bundle/Lock.js +0 -1
  37. package/dist/bundle/Logger.js +0 -1
  38. package/dist/bundle/Semaphore.js +0 -1
  39. package/dist/bundle/array.js +0 -1
  40. package/dist/bundle/cli.js +0 -1
  41. package/dist/bundle/constants.js +0 -1
  42. package/dist/bundle/context.js +0 -1
  43. package/dist/bundle/cookie.js +0 -1
  44. package/dist/bundle/data-transfer.js +0 -1
  45. package/dist/bundle/datetime.js +0 -1
  46. package/dist/bundle/domNode.js +0 -1
  47. package/dist/bundle/expression/evaluators.js +0 -1
  48. package/dist/bundle/expression/helper.js +0 -1
  49. package/dist/bundle/expression/index.js +0 -1
  50. package/dist/bundle/expression/indicator-functions.js +0 -1
  51. package/dist/bundle/expression/types.js +0 -1
  52. package/dist/bundle/filesystem.js +0 -1
  53. package/dist/bundle/function.js +0 -1
  54. package/dist/bundle/index.js +0 -1
  55. package/dist/bundle/indicators.js +0 -1
  56. package/dist/bundle/number.js +0 -1
  57. package/dist/bundle/object.js +0 -1
  58. package/dist/bundle/process.js +0 -1
  59. package/dist/bundle/property-types.js +0 -1
  60. package/dist/bundle/require.js +0 -1
  61. package/dist/bundle/scope.js +0 -1
  62. package/dist/bundle/string.js +0 -1
  63. package/dist/bundle/test-helper.js +0 -1
  64. package/dist/bundle/type.js +0 -1
  65. package/dist/bundle/utility.js +0 -1
  66. package/dist/cli.d.ts +0 -31
  67. package/dist/compatible/Lock.js +0 -1
  68. package/dist/compatible/Logger.js +0 -1
  69. package/dist/compatible/Semaphore.js +0 -1
  70. package/dist/compatible/array.js +0 -1
  71. package/dist/compatible/cli.js +0 -1
  72. package/dist/compatible/constants.js +0 -1
  73. package/dist/compatible/context.js +0 -1
  74. package/dist/compatible/cookie.js +0 -1
  75. package/dist/compatible/data-transfer.js +0 -1
  76. package/dist/compatible/datetime.js +0 -1
  77. package/dist/compatible/domNode.js +0 -1
  78. package/dist/compatible/expression/evaluators.js +0 -1
  79. package/dist/compatible/expression/helper.js +0 -1
  80. package/dist/compatible/expression/index.js +0 -1
  81. package/dist/compatible/expression/indicator-functions.js +0 -1
  82. package/dist/compatible/expression/types.js +0 -1
  83. package/dist/compatible/filesystem.js +0 -1
  84. package/dist/compatible/function.js +0 -1
  85. package/dist/compatible/index.js +0 -1
  86. package/dist/compatible/indicators.js +0 -1
  87. package/dist/compatible/number.js +0 -1
  88. package/dist/compatible/object.js +0 -1
  89. package/dist/compatible/process.js +0 -1
  90. package/dist/compatible/property-types.js +0 -1
  91. package/dist/compatible/require.js +0 -1
  92. package/dist/compatible/scope.js +0 -1
  93. package/dist/compatible/string.js +0 -1
  94. package/dist/compatible/test-helper.js +0 -1
  95. package/dist/compatible/type.js +0 -1
  96. package/dist/compatible/utility.js +0 -1
  97. package/dist/constants.d.ts +0 -99
  98. package/dist/context.d.ts +0 -9
  99. package/dist/cookie.d.ts +0 -31
  100. package/dist/data-transfer.d.ts +0 -45
  101. package/dist/datetime.d.ts +0 -37
  102. package/dist/domNode.d.ts +0 -82
  103. package/dist/expression/evaluators.d.ts +0 -55
  104. package/dist/expression/helper.d.ts +0 -4
  105. package/dist/expression/index.d.ts +0 -7
  106. package/dist/expression/indicator-functions.d.ts +0 -14
  107. package/dist/expression/types.d.ts +0 -70
  108. package/dist/expression/types.js +0 -1
  109. package/dist/filesystem.d.ts +0 -138
  110. package/dist/function.d.ts +0 -20
  111. package/dist/index.d.ts +0 -23
  112. package/dist/indicators.d.ts +0 -68
  113. package/dist/number.d.ts +0 -35
  114. package/dist/object.d.ts +0 -213
  115. package/dist/process.d.ts +0 -22
  116. package/dist/property-types.d.ts +0 -460
  117. package/dist/require.d.ts +0 -6
  118. package/dist/scope.d.ts +0 -44
  119. package/dist/string.d.ts +0 -299
  120. package/dist/test/Lock.d.ts +0 -1
  121. package/dist/test/Logger.d.ts +0 -1
  122. package/dist/test/Semaphore.d.ts +0 -1
  123. package/dist/test/array.d.ts +0 -1
  124. package/dist/test/cookie.d.ts +0 -1
  125. package/dist/test/data-transfer.d.ts +0 -1
  126. package/dist/test/datetime.d.ts +0 -1
  127. package/dist/test/domNode.d.ts +0 -1
  128. package/dist/test/expression/evaluators.d.ts +0 -1
  129. package/dist/test/expression/helper.d.ts +0 -1
  130. package/dist/test/expression/indicator-functions.d.ts +0 -1
  131. package/dist/test/filesystem.d.ts +0 -1
  132. package/dist/test/function.d.ts +0 -1
  133. package/dist/test/indicators.d.ts +0 -1
  134. package/dist/test/number.d.ts +0 -1
  135. package/dist/test/object.d.ts +0 -1
  136. package/dist/test/process.d.ts +0 -1
  137. package/dist/test/property-types.d.ts +0 -1
  138. package/dist/test/scope.d.ts +0 -1
  139. package/dist/test/string.d.ts +0 -1
  140. package/dist/test/utility.d.ts +0 -1
  141. package/dist/test-helper.d.ts +0 -143
  142. package/dist/type.d.ts +0 -211
  143. package/dist/utility.d.ts +0 -44
package/dist/domNode.js CHANGED
@@ -1 +1,331 @@
1
- "use strict";if("undefined"!=typeof module&&null!==module&&"undefined"!==eval("typeof require")&&null!==eval("require")&&"main"in eval("require")&&"undefined"!==eval("typeof require.main")&&null!==eval("require.main")){var ORIGINAL_MAIN_MODULE=module;module!==eval("require.main")&&"paths"in module&&"paths"in eval("require.main")&&"undefined"!=typeof __dirname&&null!==__dirname&&(module.paths=eval("require.main.paths").concat(module.paths.filter(function(path){return eval("require.main.paths").includes(path)})))}if(null==window)var window="undefined"==typeof global||null===global?{}:global;!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@babel/runtime/helpers/asyncToGenerator"),require("@babel/runtime/helpers/extends"),require("@babel/runtime/regenerator"));else if("function"==typeof define&&define.amd)define(["@babel/runtime/helpers/asyncToGenerator","@babel/runtime/helpers/extends","@babel/runtime/regenerator"],t);else{var n="object"==typeof exports?t(require("@babel/runtime/helpers/asyncToGenerator"),require("@babel/runtime/helpers/extends"),require("@babel/runtime/regenerator")):t(e["@babel/runtime/helpers/asyncToGenerator"],e["@babel/runtime/helpers/extends"],e["@babel/runtime/regenerator"]);for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(this,function(__WEBPACK_EXTERNAL_MODULE__11__,__WEBPACK_EXTERNAL_MODULE__3__,__WEBPACK_EXTERNAL_MODULE__12__){return function(){var __webpack_modules__=[,function(e,t,n){n.d(t,{NOOP:function(){return l},globalContext:function(){return u}});var r,o,i=n(5);e=n.hmd(e);var u="undefined"==typeof globalThis?void 0===window?void 0===n.g?e:Object.prototype.hasOwnProperty.call(n.g,"window")?n.g.window:n.g:window:globalThis;u.fetch=u.fetch?u.fetch.bind(u):null!==(r=null==(o=(0,i.optionalRequire)("node-fetch"))?void 0:o.default)&&void 0!==r?r:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return i.currentImport?(0,i.currentImport)("node-fetch").then(function(e){var n;return(n=e).default.apply(n,t)}):null};var l=function(){}},,function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__3__},function(e,t,n){n.d(t,{isFunction:function(){return r}});var r=function(e){return Boolean(e)&&["[object AsyncFunction]","[object Function]"].includes({}.toString.call(e))}},function(module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{currentImport:function(){return currentImport},optionalRequire:function(){return optionalRequire}});var currentRequire=eval("typeof require === 'undefined' ? null : require"),currentOptionalImport=null;try{currentOptionalImport=eval("typeof import === 'undefined' ? null : import")}catch(e){}var currentImport=currentOptionalImport,optionalRequire=function(e){try{return currentRequire?currentRequire(e):null}catch(e){return null}},clearRequireCache=function(e){void 0===e&&(e=(null==currentRequire?void 0:currentRequire.cache)||__webpack_require__.c);for(var t={},n=0,r=Object.entries(e);n<r.length;n++){var o=r[n],i=o[0],u=o[1];t[i]=u,delete e[i]}return t},restoreRequireCache=function(e,t){void 0===e&&(e=(null==currentRequire?void 0:currentRequire.cache)||__webpack_require__.c),clearRequireCache();for(var n=0,r=Object.entries(t);n<r.length;n++){var o=r[n],i=o[0],u=o[1];e[i]=u}},isolatedRequire=function(e,t){void 0===t&&(t=currentRequire||__webpack_require__(6));var n=clearRequireCache(t.cache);try{return t(e)}catch(e){throw e}finally{restoreRequireCache(t.cache,n)}}},function(e){function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=function(){return[]},t.resolve=t,t.id=6,e.exports=t},,,,,function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__11__},function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__12__},,,function(e,t,n){n.d(t,{timeout:function(){return i}});var r=n(1),o=n(4),i=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var i,u,l=r.NOOP,a=0,c=!1,d=0,f=t;d<f.length;d++){var s=f[d];"number"!=typeof s||isNaN(s)?"boolean"==typeof s?c=s:(0,o.isFunction)(s)&&(l=s):a=s}var _=new Promise(function(e,t){i=t,u=e}),p=function(){var e;(e=l).call.apply(e,[_].concat(t)),u(!1)},m=2147483647;if(a<=m)_.timeoutID=setTimeout(p,a);else{var v=Math.floor(a/m),b=a%m,y=function(){v>0?(v-=1,_.timeoutID=setTimeout(y,m)):_.timeoutID=setTimeout(p,b)};y()}return _.clear=function(){Object.prototype.hasOwnProperty.call(_,"timeoutID")&&(clearTimeout(_.timeoutID),(c?i:u)(!0))},_}},,,,,,,,,,,,function(e,t,n){n.r(t),n.d(t,{MANUAL_SCROLL_EVENT_NAMES:function(){return y},SCROLL_EVENT_NAMES:function(){return h},STOP_AUTO_SCROLLING:function(){return b},closest:function(){return E},createDomNodes:function(){return _},fade:function(){return p},fadeIn:function(){return m},fadeOut:function(){return v},getAll:function(){return N},getParents:function(){return q},getText:function(){return O},interruptableScrollTo:function(){return g},isEquivalent:function(){return T},isHidden:function(){return x},onDocumentReady:function(){return D},replace:function(){return A},scrollTo:function(){return w},unwrap:function(){return C},wrap:function(){return L}});var r=n(11),o=n.n(r),i=n(3),u=n.n(i),l=n(12),a=n.n(l),c=n(1),d=n(15);function f(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate 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 n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var _=function(e){var t=document.createElement("div");return t.innerHTML=e,1===t.childNodes.length?t.childNodes[0].cloneNode(!0):t},p=function(e,t,n){void 0===t&&(t=200),void 0===n&&(n=!0);var r=e.style.transition,o=e.style.visibility,i=e.style.opacity,u=e.hasAttribute("style");n?(e.style.visibility="hidden",e.style.opacity="0",e.style.transition="visibility 0s "+String(t)+"ms, opacity "+String(t)+"ms linear"):(e.style.visibility="visible",e.style.opacity="1",e.style.transition="opacity "+String(t)+"ms linear");var l=c.NOOP,a=!1,f=new Promise(function(n){l=function(){e.style.transition=r,a=!0,n()},(0,d.timeout)(t).then(l)});return f.clear=function(){a||(e.style.transition="none",l())},f.resetStyles=function(){u?(e.style.transition=r,e.style.visibility=o,e.style.opacity=i):e.removeAttribute("style")},f},m=function(e,t){return void 0===t&&(t=200),p(e,t,!1)},v=function(e,t){return void 0===t&&(t=200),p(e,t)},b={value:c.NOOP},y=["DOMMouseScroll","keydown","mousedown","mousewheel","wheel","touchstart","touchmove"],h=["scroll"].concat(y),g=function(e){if(void 0===e&&(e={}),c.globalContext.document&&c.globalContext.window){var t=c.globalContext.document,n=t.body,r=c.globalContext.window;e.containerDomNode&&!("getBoundingClientRect"in e.containerDomNode)&&"parentElement"in e.containerDomNode&&(e.containerDomNode=e.containerDomNode.parentElement),e.targetDomNode&&!("getBoundingClientRect"in e.targetDomNode)&&"parentElement"in e.targetDomNode&&(e.targetDomNode=e.targetDomNode.parentElement);var o,i,l=u()({targetDomNode:n,containerDomNode:r,durationInMilliseconds:500,offset:u()({top:0,left:0},e.offset||{}),interruptOnManualScroll:!0},e),a=l.containerDomNode===r,d=a?r.scrollY||t.documentElement.scrollTop:l.containerDomNode.scrollTop,f=a?r.scrollX||t.documentElement.scrollLeft:l.containerDomNode.scrollLeft;if(a){var s=l.targetDomNode.getBoundingClientRect();o=s.top+(r.scrollY||t.documentElement.scrollTop)-l.offset.top,i=s.left+(r.scrollX||t.documentElement.scrollLeft)-l.offset.left}else o=l.targetDomNode.offsetTop-l.containerDomNode.offsetTop-l.offset.top,i=l.targetDomNode.offsetLeft-l.containerDomNode.offsetLeft-l.offset.left;var _=o-d,p=i-f;if(0!==_||0!==p){var m=null,v=null;if(l.interruptOnManualScroll){b.value=function(){v&&(cancelAnimationFrame(v),v=null);for(var e=0,o=[n,t.querySelector("html"),r];e<o.length;e++)for(var i=o[e],u=0,l=y;u<l.length;u++){var a=l[u];null==i||i.removeEventListener(a,b.value)}b.value=c.NOOP};for(var h=0,g=[n,t.querySelector("html"),r];h<g.length;h++)for(var w=g[h],N=0,E=y;N<E.length;N++){var q=E[N];null==w||w.addEventListener(q,b.value,{passive:!0})}}var O=function(e){m||(m=e);var t,n=e-m,o=Math.min(n/l.durationInMilliseconds,1),i=(t=o)<.5?2*t*t:(4-2*t)*t-1,u=d+_*i,c=f+p*i;a?r.scrollTo(c,u):(l.containerDomNode.scrollTop=u,l.containerDomNode.scrollLeft=c),o<1?v=requestAnimationFrame(O):b.value()};v=requestAnimationFrame(O)}}},w=function(e,t){var n;void 0===e&&(e=null),void 0===t&&(t="smooth"),e&&!("getBoundingClientRect"in e)&&(e=e.parentElement);var r=e?e.getBoundingClientRect():{left:0,top:0},o=r.left,i=r.top;null==(n=c.globalContext.window)||n.scrollTo({left:o,top:i,behavior:t})},N=function(e){if(!c.globalContext.document)return[];for(var t=[],n=c.globalContext.document.createTreeWalker(e,NodeFilter.SHOW_ALL,null),r=n.currentNode;r;)t.push(r),r=n.nextNode();return t},E=function(e,t,n){var r;return void 0===n&&(n=!1),"closest"in e&&!n?e.closest(t):(null==(r=e.parentElement)?void 0:r.closest(t))||null},q=function(e){for(var t=[];e.parentNode;)t.push(e.parentNode),e=e.parentNode;return t},O=function(e,t){if(void 0===t&&(t=!1),e.nodeType===Node.TEXT_NODE){var n,r=null==(n=e.nodeValue)?void 0:n.trim();if(r)return[r]}for(var o,i=[],u=f(e.childNodes);!(o=u()).done;){var l=o.value;(t||l.nodeType===Node.TEXT_NODE)&&i.push.apply(i,O(l))}return i},T=function(e,t,n){if(void 0===n&&(n=!1),e===t)return!0;if(!e||!t)return!1;if(!c.globalContext.document)throw new Error("Missing document in global context.");for(var r=c.globalContext.document.createElement.bind(c.globalContext.document),o=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,i={first:e,second:t},u={first:r("dummy"),second:r("dummy")},l=0,a=Object.entries(i);l<a.length;l++){var d=a[l],f=d[0],s=d[1];if("string"==typeof s)if(n||s.startsWith("<")&&s.endsWith(">")&&s.length>=3||o.test(s))u[f]=_(s);else{var p=document.querySelector(s);if(!p)return!1;u[f]=p.cloneNode(!0)}else{if(!("cloneNode"in s))return!1;u[f]=s.cloneNode(!0)}}return u.first.normalize(),u.second.normalize(),u.first.isEqualNode(u.second)},x=function(e){var t;return!(null!=(t=c.globalContext.document)&&t.contains(e))||"none"===e.style.display||"INPUT"===e.nodeName&&"hidden"===e.getAttribute("type")||["contents","inline"].includes(e.style.display)&&(!("innerHTML"in e)||""===e.innerHTML.trim())||"0px"===e.style.height&&"0px"===e.style.width||Boolean(e.parentElement)&&x(e.parentElement)},D=function(e){return new Promise(function(t){o()(a().mark(function n(){return a().wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(!["complete","interactive"].includes(document.readyState)){n.next=2;break}return n.next=1,(0,d.timeout)();case 1:t(),null==e||e(),n.next=3;break;case 2:document.addEventListener("DOMContentLoaded",function(){t(),null==e||e()});case 3:case"end":return n.stop()}},n)}))()})},A=function(e,t,n){void 0===n&&(n=!1);for(var r,o=f([].concat(t).reverse());!(r=o()).done;){var i,u=r.value;n&&u.nodeType===Node.TEXT_NODE&&""===(null==(i=u.nodeValue)?void 0:i.trim())||e.after(u)}e.remove()},L=function(e,t){var n=e.length?Array.from(e):[e],r=n[0];r.parentNode&&r.parentNode.insertBefore(t,r);for(var o,i=f(n);!(o=i()).done;){var u=o.value;t.appendChild(u)}},C=function(e){for(var t=e.parentNode,n=[],r=0,o=Array.from(e.childNodes);r<o.length;r++){var i=o[r];n.push(i),t&&t.insertBefore(i,e)}return t&&t.removeChild(e),n}}],__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var n=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](n,n.exports,__webpack_require__),n.loaded=!0,n.exports}__webpack_require__.c=__webpack_module_cache__,__webpack_require__.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=function(e,t){for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(27);return __webpack_exports__}()});
1
+ // #!/usr/bin/env babel-node
2
+ // -*- coding: utf-8 -*-
3
+ /** @module domNode */
4
+ 'use strict';
5
+
6
+ /* !
7
+ region header
8
+ [Project page](https://torben.website/clientnode)
9
+
10
+ Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
11
+
12
+ License
13
+ -------
14
+
15
+ This library written by Torben Sickert stands under a creative commons
16
+ naming 3.0 unported license.
17
+ See https://creativecommons.org/licenses/by/3.0/deed.de
18
+ endregion
19
+ */
20
+ import "core-js/modules/es.array.includes.js";
21
+ import "core-js/modules/es.array.push.js";
22
+ import { globalContext, NOOP } from "./context.js";
23
+ import { timeout } from "./utility.js";
24
+ export const createDomNodes = html => {
25
+ const domNodeWrapper = document.createElement('div');
26
+ domNodeWrapper.innerHTML = html;
27
+ if (domNodeWrapper.childNodes.length === 1)
28
+ /*
29
+ NOTE: We need to clone the nested child to decouple it from its
30
+ parent node.
31
+ */
32
+ return domNodeWrapper.childNodes[0].cloneNode(true);
33
+ return domNodeWrapper;
34
+ };
35
+ export const fade = (domNode, intervalInMilliseconds = 200, out = true) => {
36
+ const transitionBackup = domNode.style.transition;
37
+ const visibleBackup = domNode.style.visibility;
38
+ const opacityBackup = domNode.style.opacity;
39
+ const hadStyleAttribute = domNode.hasAttribute('style');
40
+ if (out) {
41
+ domNode.style.visibility = 'hidden';
42
+ domNode.style.opacity = '0';
43
+ domNode.style.transition = `visibility 0s ${String(intervalInMilliseconds)}ms, ` + `opacity ${String(intervalInMilliseconds)}ms linear`;
44
+ } else {
45
+ domNode.style.visibility = 'visible';
46
+ domNode.style.opacity = '1';
47
+ domNode.style.transition = `opacity ${String(intervalInMilliseconds)}ms linear`;
48
+ }
49
+ let clearTimeoutAndResetDomNode = NOOP;
50
+ let resolved = false;
51
+ const promise = new Promise(resolve => {
52
+ clearTimeoutAndResetDomNode = () => {
53
+ domNode.style.transition = transitionBackup;
54
+ resolved = true;
55
+ resolve();
56
+ };
57
+ void timeout(intervalInMilliseconds).then(clearTimeoutAndResetDomNode);
58
+ });
59
+ promise.clear = () => {
60
+ if (!resolved) {
61
+ domNode.style.transition = 'none';
62
+ clearTimeoutAndResetDomNode();
63
+ }
64
+ };
65
+ promise.resetStyles = () => {
66
+ if (hadStyleAttribute) {
67
+ domNode.style.transition = transitionBackup;
68
+ domNode.style.visibility = visibleBackup;
69
+ domNode.style.opacity = opacityBackup;
70
+ } else domNode.removeAttribute('style');
71
+ };
72
+ return promise;
73
+ };
74
+ export const fadeIn = (domNode, intervalInMilliseconds = 200) => fade(domNode, intervalInMilliseconds, false);
75
+ export const fadeOut = (domNode, intervalInMilliseconds = 200) => fade(domNode, intervalInMilliseconds);
76
+ export const STOP_AUTO_SCROLLING = {
77
+ value: NOOP
78
+ };
79
+ export const MANUAL_SCROLL_EVENT_NAMES = ['DOMMouseScroll', 'keydown', 'mousedown', 'mousewheel', 'wheel', 'touchstart', 'touchmove'];
80
+ export const SCROLL_EVENT_NAMES = ['scroll'].concat(MANUAL_SCROLL_EVENT_NAMES);
81
+ /**
82
+ * Smoothly scrolls both horizontally and vertically to a target DOM node.
83
+ * Cancels instantly if the user interacts with the mouse, touch, or keys.
84
+ * @param givenOptions - Configuration options.
85
+ * @param givenOptions.targetDomNode - The DOM node you want to scroll to.
86
+ * @param givenOptions.containerDomNode - The scrollable parent.
87
+ * @param givenOptions.durationInMilliseconds - Animation duration in
88
+ * milliseconds.
89
+ * @param givenOptions.interruptOnManualScroll - Whether to stop the animation
90
+ * if the user starts to scroll manually.
91
+ * @param givenOptions.offset - Pixel offsets.
92
+ * @param givenOptions.offset.top - Vertical offset in pixels.
93
+ * @param givenOptions.offset.left - Horizontal offset in pixels.
94
+ */
95
+ export const interruptableScrollTo = (givenOptions = {}) => {
96
+ if (!(globalContext.document && globalContext.window)) return;
97
+ const document = globalContext.document;
98
+ const body = document.body;
99
+ const window = globalContext.window;
100
+ if (givenOptions.containerDomNode && !('getBoundingClientRect' in givenOptions.containerDomNode) && 'parentElement' in givenOptions.containerDomNode) givenOptions.containerDomNode = givenOptions.containerDomNode.parentElement;
101
+ if (givenOptions.targetDomNode && !('getBoundingClientRect' in givenOptions.targetDomNode) && 'parentElement' in givenOptions.targetDomNode) givenOptions.targetDomNode = givenOptions.targetDomNode.parentElement;
102
+ const options = {
103
+ targetDomNode: body,
104
+ containerDomNode: window,
105
+ durationInMilliseconds: 500,
106
+ offset: {
107
+ top: 0,
108
+ left: 0,
109
+ ...(givenOptions.offset || {})
110
+ },
111
+ interruptOnManualScroll: true,
112
+ ...givenOptions
113
+ };
114
+ const isWindow = options.containerDomNode === window;
115
+
116
+ // 1. Get current starting scroll positions
117
+ const startY = isWindow ? window.scrollY || document.documentElement.scrollTop : options.containerDomNode.scrollTop;
118
+ const startX = isWindow ? window.scrollX || document.documentElement.scrollLeft : options.containerDomNode.scrollLeft;
119
+
120
+ // 2. Calculate targetDomNode positions for both axes
121
+ let targetY;
122
+ let targetX;
123
+ if (isWindow) {
124
+ const rect = options.targetDomNode.getBoundingClientRect();
125
+ targetY = rect.top + (window.scrollY || document.documentElement.scrollTop) - options.offset.top;
126
+ targetX = rect.left + (window.scrollX || document.documentElement.scrollLeft) - options.offset.left;
127
+ } else {
128
+ // Relative to the scrollable parent container
129
+ targetY = options.targetDomNode.offsetTop - options.containerDomNode.offsetTop - options.offset.top;
130
+ targetX = options.targetDomNode.offsetLeft - options.containerDomNode.offsetLeft - options.offset.left;
131
+ }
132
+ const distanceY = targetY - startY;
133
+ const distanceX = targetX - startX;
134
+
135
+ // If no movement is needed, exit immediately
136
+ if (distanceY === 0 && distanceX === 0) return;
137
+ let startTime = null;
138
+ let animationFrameId = null;
139
+
140
+ // Easing function
141
+ const easeInOutQuad = time => time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time;
142
+ if (options.interruptOnManualScroll) {
143
+ // 3. Define the interrupt / teardown system
144
+ STOP_AUTO_SCROLLING.value = () => {
145
+ if (animationFrameId) {
146
+ cancelAnimationFrame(animationFrameId);
147
+ animationFrameId = null;
148
+ }
149
+ for (const node of [body, document.querySelector('html'), window]) for (const name of MANUAL_SCROLL_EVENT_NAMES) node?.removeEventListener(name, STOP_AUTO_SCROLLING.value);
150
+ STOP_AUTO_SCROLLING.value = NOOP;
151
+ };
152
+ for (const node of [body, document.querySelector('html'), window]) for (const name of MANUAL_SCROLL_EVENT_NAMES) node?.addEventListener(name, STOP_AUTO_SCROLLING.value, {
153
+ passive: true
154
+ });
155
+ }
156
+
157
+ // 4. Multi-axis animation loop
158
+ const step = currentTime => {
159
+ if (!startTime) startTime = currentTime;
160
+ const progress = currentTime - startTime;
161
+ const timeRatio = Math.min(progress / options.durationInMilliseconds, 1);
162
+ const easedRatio = easeInOutQuad(timeRatio);
163
+
164
+ // Linearly interpolate the positions based on eased progress.
165
+ const nextY = startY + distanceY * easedRatio;
166
+ const nextX = startX + distanceX * easedRatio;
167
+
168
+ // Apply scroll to window or container.
169
+ if (isWindow) window.scrollTo(nextX, nextY);else {
170
+ ;
171
+ options.containerDomNode.scrollTop = nextY;
172
+ options.containerDomNode.scrollLeft = nextX;
173
+ }
174
+ if (timeRatio < 1) animationFrameId = requestAnimationFrame(step);else STOP_AUTO_SCROLLING.value();
175
+ };
176
+ animationFrameId = requestAnimationFrame(step);
177
+ };
178
+ /**
179
+ * Scrolls to the given DomNode's location or tio of the page.
180
+ * @param targetDomNode - DomNode to scroll to. If not given, scrolls to the
181
+ * top of the page.
182
+ * @param behavior - Scroll behavior to use.
183
+ */
184
+ export const scrollTo = (targetDomNode = null, behavior = 'smooth') => {
185
+ if (targetDomNode && !('getBoundingClientRect' in targetDomNode)) targetDomNode = targetDomNode.parentElement;
186
+ const {
187
+ left,
188
+ top
189
+ } = targetDomNode ? targetDomNode.getBoundingClientRect() : {
190
+ left: 0,
191
+ top: 0
192
+ };
193
+ globalContext.window?.scrollTo({
194
+ left,
195
+ top,
196
+ behavior
197
+ });
198
+ };
199
+ export const getAll = root => {
200
+ if (!globalContext.document) return [];
201
+ const nodes = [];
202
+ // SHOW_ALL includes elements, text, and comments
203
+ const walker = globalContext.document.createTreeWalker(root, NodeFilter.SHOW_ALL, null);
204
+ let currentNode = walker.currentNode;
205
+ while (currentNode) {
206
+ nodes.push(currentNode);
207
+ currentNode = walker.nextNode();
208
+ }
209
+ return nodes;
210
+ };
211
+ export const closest = (node, selector, startWithParent = false) => 'closest' in node && !startWithParent ? node.closest(selector) : node.parentElement?.closest(selector) || null;
212
+ export const getParents = node => {
213
+ const result = [];
214
+ while (node.parentNode) {
215
+ result.push(node.parentNode);
216
+ node = node.parentNode;
217
+ }
218
+ return result;
219
+ };
220
+ export const getText = (root, recursive = false) => {
221
+ if (root.nodeType === Node.TEXT_NODE) {
222
+ const content = root.nodeValue?.trim();
223
+ if (content) return [content];
224
+ }
225
+ const result = [];
226
+ for (const domNode of root.childNodes) if (recursive || domNode.nodeType === Node.TEXT_NODE) result.push(...getText(domNode));
227
+ return result;
228
+ };
229
+ /**
230
+ * Checks whether given html or text strings are equal.
231
+ * @param first - First html, selector to dom node or text to compare.
232
+ * @param second - Second html, selector to dom node or text to compare.
233
+ * @param forceHTMLString - Indicates whether given contents are
234
+ * interpreted as html string (otherwise automatic detection will be
235
+ * triggered).
236
+ * @returns Returns true if both dom representations are equivalent.
237
+ */
238
+ export const isEquivalent = (first, second, forceHTMLString = false) => {
239
+ if (first === second) return true;
240
+ if (!(first && second)) return false;
241
+ if (!globalContext.document) throw new Error('Missing document in global context.');
242
+ const createElement = globalContext.document.createElement.bind(globalContext.document);
243
+ const determineHTMLPattern = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;
244
+ const inputs = {
245
+ first,
246
+ second
247
+ };
248
+ const domNodes = {
249
+ first: createElement('dummy'),
250
+ second: createElement('dummy')
251
+ };
252
+
253
+ /*
254
+ NOTE: Assume that strings that start "<" and end with ">" are mark up
255
+ and skip the more expensive regular expression check.
256
+ */
257
+ for (const [type, html] of Object.entries(inputs)) if (typeof html === 'string') {
258
+ if (forceHTMLString || html.startsWith('<') && html.endsWith('>') && html.length >= 3 || determineHTMLPattern.test(html)) domNodes[type] = createDomNodes(html);else {
259
+ const domNode = document.querySelector(html);
260
+ if (domNode)
261
+ /*
262
+ NOTE: We copy the node tree to not manipulate the
263
+ original dom node by normalizing it afterward.
264
+ */
265
+ domNodes[type] = domNode.cloneNode(true);else return false;
266
+ }
267
+ } else if ('cloneNode' in html) domNodes[type] = html.cloneNode(true);else return false;
268
+ domNodes.first.normalize();
269
+ domNodes.second.normalize();
270
+ return domNodes.first.isEqualNode(domNodes.second);
271
+ };
272
+ /**
273
+ * Checks whether the given dom node is visible or takes space in the document
274
+ * flow.
275
+ * Elements with visibility: hidden or opacity: 0 are considered to be visible,
276
+ * since they still consume space in the layout. During animations that hide an
277
+ * element, the element is considered to be visible until the end of the
278
+ * animation.
279
+ * @param domNode - To inspect.
280
+ * @returns A boolean indicating the visibility.
281
+ */
282
+ export const isHidden = domNode => !globalContext.document?.contains(domNode) || domNode.style.display === 'none' || domNode.nodeName === 'INPUT' && domNode.getAttribute('type') === 'hidden' || ['contents', 'inline'].includes(domNode.style.display) && (!('innerHTML' in domNode) || domNode.innerHTML.trim() === '') || domNode.style.height === '0px' && domNode.style.width === '0px' || Boolean(domNode.parentElement) && isHidden(domNode.parentElement);
283
+ export const onDocumentReady = callback => new Promise(resolve => void (async () => {
284
+ // See if document object model is already available.
285
+ if (['complete', 'interactive'].includes(document.readyState)) {
286
+ // Call on next available tick.
287
+ await timeout();
288
+ resolve();
289
+ callback?.();
290
+ } else document.addEventListener('DOMContentLoaded', () => {
291
+ resolve();
292
+ callback?.();
293
+ });
294
+ })());
295
+
296
+ /**
297
+ * Replaces a given dom node with given nodes.
298
+ * @param domNodeToReplace - Node to replace its children.
299
+ * @param replacementDomNodes - Node or array of nodes to use as replacement.
300
+ * @param skipEmptyTextNodes - Configures whether to trim text.
301
+ */
302
+ export const replace = (domNodeToReplace, replacementDomNodes, skipEmptyTextNodes = false) => {
303
+ for (const replacement of [].concat(replacementDomNodes).reverse()) if (!(skipEmptyTextNodes && replacement.nodeType === Node.TEXT_NODE && replacement.nodeValue?.trim() === '')) domNodeToReplace.after(replacement);
304
+ domNodeToReplace.remove();
305
+ };
306
+ export const wrap = (domNodes, wrapper) => {
307
+ const domNodeList = domNodes.length ? Array.from(domNodes) : [domNodes];
308
+
309
+ // Use the first element's position as the anchor point
310
+ const first = domNodeList[0];
311
+ if (first.parentNode) first.parentNode.insertBefore(wrapper, first);
312
+ for (const domNode of domNodeList) wrapper.appendChild(domNode);
313
+ };
314
+ /**
315
+ * Moves the content of a given dom node one level up and removes the given
316
+ * node.
317
+ * @param domNode - Node to unwrap.
318
+ * @returns List of unwrapped nodes.
319
+ */
320
+ export const unwrap = domNode => {
321
+ const parent = domNode.parentNode;
322
+ const result = [];
323
+ // NOTE: We need to use "Array.from" to copy the list.
324
+ for (const childNode of Array.from(domNode.childNodes)) {
325
+ result.push(childNode);
326
+ if (parent) parent.insertBefore(childNode, domNode);
327
+ }
328
+ if (parent) parent.removeChild(domNode);
329
+ return result;
330
+ };
331
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2RvbU5vZGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gIyEvdXNyL2Jpbi9lbnYgYmFiZWwtbm9kZVxuLy8gLSotIGNvZGluZzogdXRmLTggLSotXG4vKiogQG1vZHVsZSBkb21Ob2RlICovXG4ndXNlIHN0cmljdCdcbi8qICFcbiAgICByZWdpb24gaGVhZGVyXG4gICAgW1Byb2plY3QgcGFnZV0oaHR0cHM6Ly90b3JiZW4ud2Vic2l0ZS9jbGllbnRub2RlKVxuXG4gICAgQ29weXJpZ2h0IFRvcmJlbiBTaWNrZXJ0IChpbmZvW1wifmF0flwiXXRvcmJlbi53ZWJzaXRlKSAxNi4xMi4yMDEyXG5cbiAgICBMaWNlbnNlXG4gICAgLS0tLS0tLVxuXG4gICAgVGhpcyBsaWJyYXJ5IHdyaXR0ZW4gYnkgVG9yYmVuIFNpY2tlcnQgc3RhbmRzIHVuZGVyIGEgY3JlYXRpdmUgY29tbW9uc1xuICAgIG5hbWluZyAzLjAgdW5wb3J0ZWQgbGljZW5zZS5cbiAgICBTZWUgaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC9kZWVkLmRlXG4gICAgZW5kcmVnaW9uXG4qL1xuaW1wb3J0IHR5cGUge1xuICAgIEdpdmVuSW50ZXJydXB0YWJsZVNjcm9sbFRvT3B0aW9ucyxcbiAgICBJbnRlcnJ1cHRhYmxlU2Nyb2xsVG9PcHRpb25zLFxuICAgIEtub3duRXZlbnROYW1lLFxuICAgIE1hcHBpbmdcbn0gZnJvbSAnLi90eXBlJ1xuXG5pbXBvcnQge2dsb2JhbENvbnRleHQsIE5PT1B9IGZyb20gJy4vY29udGV4dCdcbmltcG9ydCB7dGltZW91dH0gZnJvbSAnLi91dGlsaXR5J1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRG9tTm9kZXMgPSA8VHlwZSBleHRlbmRzIE5vZGUgPSBOb2RlPihcbiAgICBodG1sOiBzdHJpbmdcbik6IFR5cGUgPT4ge1xuICAgIGNvbnN0IGRvbU5vZGVXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBkb21Ob2RlV3JhcHBlci5pbm5lckhUTUwgPSBodG1sXG5cbiAgICBpZiAoZG9tTm9kZVdyYXBwZXIuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEpXG4gICAgICAgIC8qXG4gICAgICAgICAgICBOT1RFOiBXZSBuZWVkIHRvIGNsb25lIHRoZSBuZXN0ZWQgY2hpbGQgdG8gZGVjb3VwbGUgaXQgZnJvbSBpdHNcbiAgICAgICAgICAgIHBhcmVudCBub2RlLlxuICAgICAgICAqL1xuICAgICAgICByZXR1cm4gZG9tTm9kZVdyYXBwZXIuY2hpbGROb2Rlc1swXS5jbG9uZU5vZGUodHJ1ZSkgYXMgVHlwZVxuXG4gICAgcmV0dXJuIGRvbU5vZGVXcmFwcGVyIGFzIHVua25vd24gYXMgVHlwZVxufVxuXG5leHBvcnQgY29uc3QgZmFkZSA9IChcbiAgICBkb21Ob2RlOiBIVE1MRWxlbWVudCwgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyA9IDIwMCwgb3V0ID0gdHJ1ZVxuKSA9PiB7XG4gICAgY29uc3QgdHJhbnNpdGlvbkJhY2t1cCA9IGRvbU5vZGUuc3R5bGUudHJhbnNpdGlvblxuICAgIGNvbnN0IHZpc2libGVCYWNrdXAgPSBkb21Ob2RlLnN0eWxlLnZpc2liaWxpdHlcbiAgICBjb25zdCBvcGFjaXR5QmFja3VwID0gZG9tTm9kZS5zdHlsZS5vcGFjaXR5XG4gICAgY29uc3QgaGFkU3R5bGVBdHRyaWJ1dGUgPSBkb21Ob2RlLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKVxuXG4gICAgaWYgKG91dCkge1xuICAgICAgICBkb21Ob2RlLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJ1xuICAgICAgICBkb21Ob2RlLnN0eWxlLm9wYWNpdHkgPSAnMCdcbiAgICAgICAgZG9tTm9kZS5zdHlsZS50cmFuc2l0aW9uID1cbiAgICAgICAgICAgIGB2aXNpYmlsaXR5IDBzICR7U3RyaW5nKGludGVydmFsSW5NaWxsaXNlY29uZHMpfW1zLCBgICtcbiAgICAgICAgICAgIGBvcGFjaXR5ICR7U3RyaW5nKGludGVydmFsSW5NaWxsaXNlY29uZHMpfW1zIGxpbmVhcmBcbiAgICB9IGVsc2Uge1xuICAgICAgICBkb21Ob2RlLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSdcbiAgICAgICAgZG9tTm9kZS5zdHlsZS5vcGFjaXR5ID0gJzEnXG4gICAgICAgIGRvbU5vZGUuc3R5bGUudHJhbnNpdGlvbiA9XG4gICAgICAgICAgICBgb3BhY2l0eSAke1N0cmluZyhpbnRlcnZhbEluTWlsbGlzZWNvbmRzKX1tcyBsaW5lYXJgXG4gICAgfVxuXG4gICAgbGV0IGNsZWFyVGltZW91dEFuZFJlc2V0RG9tTm9kZSA9IE5PT1BcbiAgICBsZXQgcmVzb2x2ZWQgPSBmYWxzZVxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXRBbmRSZXNldERvbU5vZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBkb21Ob2RlLnN0eWxlLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uQmFja3VwXG5cbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZVxuICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgICAgdm9pZCB0aW1lb3V0KGludGVydmFsSW5NaWxsaXNlY29uZHMpLnRoZW4oY2xlYXJUaW1lb3V0QW5kUmVzZXREb21Ob2RlKVxuICAgIH0pIGFzXG4gICAgICAgIFByb21pc2U8dm9pZD4gJlxuICAgICAgICB7XG4gICAgICAgICAgICBjbGVhcjogKCkgPT4gdm9pZFxuICAgICAgICAgICAgcmVzZXRTdHlsZXM6ICgpID0+IHZvaWRcbiAgICAgICAgfVxuXG4gICAgcHJvbWlzZS5jbGVhciA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnXG4gICAgICAgICAgICBjbGVhclRpbWVvdXRBbmRSZXNldERvbU5vZGUoKVxuICAgICAgICB9XG4gICAgfVxuICAgIHByb21pc2UucmVzZXRTdHlsZXMgPSAoKSA9PiB7XG4gICAgICAgIGlmIChoYWRTdHlsZUF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS50cmFuc2l0aW9uID0gdHJhbnNpdGlvbkJhY2t1cFxuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gdmlzaWJsZUJhY2t1cFxuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eUJhY2t1cFxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGRvbU5vZGUucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2Vcbn1cbmV4cG9ydCBjb25zdCBmYWRlSW4gPSAoZG9tTm9kZTogSFRNTEVsZW1lbnQsIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSAyMDApID0+XG4gICAgZmFkZShkb21Ob2RlLCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBmYWxzZSlcbmV4cG9ydCBjb25zdCBmYWRlT3V0ID0gKGRvbU5vZGU6IEhUTUxFbGVtZW50LCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gMjAwKSA9PlxuICAgIGZhZGUoZG9tTm9kZSwgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcylcblxuZXhwb3J0IGNvbnN0IFNUT1BfQVVUT19TQ1JPTExJTkcgPSB7dmFsdWU6IE5PT1B9XG5leHBvcnQgY29uc3QgTUFOVUFMX1NDUk9MTF9FVkVOVF9OQU1FUzogQXJyYXk8S25vd25FdmVudE5hbWU+ID0gW1xuICAgICdET01Nb3VzZVNjcm9sbCcsXG5cbiAgICAna2V5ZG93bicsXG5cbiAgICAnbW91c2Vkb3duJyxcbiAgICAnbW91c2V3aGVlbCcsXG4gICAgJ3doZWVsJyxcblxuICAgICd0b3VjaHN0YXJ0JyxcbiAgICAndG91Y2htb3ZlJ1xuXVxuZXhwb3J0IGNvbnN0IFNDUk9MTF9FVkVOVF9OQU1FUzogQXJyYXk8S25vd25FdmVudE5hbWU+ID1cbiAgICAoWydzY3JvbGwnXSBhcyBBcnJheTxLbm93bkV2ZW50TmFtZT4pLmNvbmNhdChNQU5VQUxfU0NST0xMX0VWRU5UX05BTUVTKVxuLyoqXG4gKiBTbW9vdGhseSBzY3JvbGxzIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5IHRvIGEgdGFyZ2V0IERPTSBub2RlLlxuICogQ2FuY2VscyBpbnN0YW50bHkgaWYgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIG1vdXNlLCB0b3VjaCwgb3Iga2V5cy5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLnRhcmdldERvbU5vZGUgLSBUaGUgRE9NIG5vZGUgeW91IHdhbnQgdG8gc2Nyb2xsIHRvLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5jb250YWluZXJEb21Ob2RlIC0gVGhlIHNjcm9sbGFibGUgcGFyZW50LlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5kdXJhdGlvbkluTWlsbGlzZWNvbmRzIC0gQW5pbWF0aW9uIGR1cmF0aW9uIGluXG4gKiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmludGVycnVwdE9uTWFudWFsU2Nyb2xsIC0gV2hldGhlciB0byBzdG9wIHRoZSBhbmltYXRpb25cbiAqIGlmIHRoZSB1c2VyIHN0YXJ0cyB0byBzY3JvbGwgbWFudWFsbHkuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLm9mZnNldCAtIFBpeGVsIG9mZnNldHMuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLm9mZnNldC50b3AgLSBWZXJ0aWNhbCBvZmZzZXQgaW4gcGl4ZWxzLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5vZmZzZXQubGVmdCAtIEhvcml6b250YWwgb2Zmc2V0IGluIHBpeGVscy5cbiAqL1xuZXhwb3J0IGNvbnN0IGludGVycnVwdGFibGVTY3JvbGxUbyA9IChcbiAgICBnaXZlbk9wdGlvbnM6IEdpdmVuSW50ZXJydXB0YWJsZVNjcm9sbFRvT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgICBpZiAoIShnbG9iYWxDb250ZXh0LmRvY3VtZW50ICYmIGdsb2JhbENvbnRleHQud2luZG93KSlcbiAgICAgICAgcmV0dXJuXG5cbiAgICBjb25zdCBkb2N1bWVudDogSFRNTERvY3VtZW50ID0gZ2xvYmFsQ29udGV4dC5kb2N1bWVudFxuICAgIGNvbnN0IGJvZHk6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuYm9keVxuICAgIGNvbnN0IHdpbmRvdzogV2luZG93ID0gZ2xvYmFsQ29udGV4dC53aW5kb3dcblxuICAgIGlmIChcbiAgICAgICAgZ2l2ZW5PcHRpb25zLmNvbnRhaW5lckRvbU5vZGUgJiZcbiAgICAgICAgISgnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JyBpbiBnaXZlbk9wdGlvbnMuY29udGFpbmVyRG9tTm9kZSkgJiZcbiAgICAgICAgJ3BhcmVudEVsZW1lbnQnIGluIGdpdmVuT3B0aW9ucy5jb250YWluZXJEb21Ob2RlXG4gICAgKVxuICAgICAgICBnaXZlbk9wdGlvbnMuY29udGFpbmVyRG9tTm9kZSA9XG4gICAgICAgICAgICBnaXZlbk9wdGlvbnMuY29udGFpbmVyRG9tTm9kZS5wYXJlbnRFbGVtZW50XG4gICAgaWYgKFxuICAgICAgICBnaXZlbk9wdGlvbnMudGFyZ2V0RG9tTm9kZSAmJlxuICAgICAgICAhKCdnZXRCb3VuZGluZ0NsaWVudFJlY3QnIGluIGdpdmVuT3B0aW9ucy50YXJnZXREb21Ob2RlKSAmJlxuICAgICAgICAncGFyZW50RWxlbWVudCcgaW4gZ2l2ZW5PcHRpb25zLnRhcmdldERvbU5vZGVcbiAgICApXG4gICAgICAgIGdpdmVuT3B0aW9ucy50YXJnZXREb21Ob2RlID0gZ2l2ZW5PcHRpb25zLnRhcmdldERvbU5vZGUucGFyZW50RWxlbWVudFxuXG4gICAgY29uc3Qgb3B0aW9uczogSW50ZXJydXB0YWJsZVNjcm9sbFRvT3B0aW9ucyA9IHtcbiAgICAgICAgdGFyZ2V0RG9tTm9kZTogYm9keSxcbiAgICAgICAgY29udGFpbmVyRG9tTm9kZTogd2luZG93LFxuICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiA1MDAsXG4gICAgICAgIG9mZnNldDoge1xuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIC4uLmdpdmVuT3B0aW9ucy5vZmZzZXQgfHwge31cbiAgICAgICAgfSxcbiAgICAgICAgaW50ZXJydXB0T25NYW51YWxTY3JvbGw6IHRydWUsXG4gICAgICAgIC4uLmdpdmVuT3B0aW9ucyBhcyBQYXJ0aWFsPEludGVycnVwdGFibGVTY3JvbGxUb09wdGlvbnM+XG4gICAgfVxuXG4gICAgY29uc3QgaXNXaW5kb3cgPSBvcHRpb25zLmNvbnRhaW5lckRvbU5vZGUgPT09IHdpbmRvd1xuXG4gICAgLy8gMS4gR2V0IGN1cnJlbnQgc3RhcnRpbmcgc2Nyb2xsIHBvc2l0aW9uc1xuICAgIGNvbnN0IHN0YXJ0WSA9IGlzV2luZG93ID9cbiAgICAgICAgKHdpbmRvdy5zY3JvbGxZIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApIDpcbiAgICAgICAgKG9wdGlvbnMuY29udGFpbmVyRG9tTm9kZSBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsVG9wXG4gICAgY29uc3Qgc3RhcnRYID0gaXNXaW5kb3cgP1xuICAgICAgICAod2luZG93LnNjcm9sbFggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQpIDpcbiAgICAgICAgKG9wdGlvbnMuY29udGFpbmVyRG9tTm9kZSBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdFxuXG4gICAgLy8gMi4gQ2FsY3VsYXRlIHRhcmdldERvbU5vZGUgcG9zaXRpb25zIGZvciBib3RoIGF4ZXNcbiAgICBsZXQgdGFyZ2V0WVxuICAgIGxldCB0YXJnZXRYXG5cbiAgICBpZiAoaXNXaW5kb3cpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IG9wdGlvbnMudGFyZ2V0RG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICB0YXJnZXRZID1cbiAgICAgICAgICAgIHJlY3QudG9wICtcbiAgICAgICAgICAgICh3aW5kb3cuc2Nyb2xsWSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSAtXG4gICAgICAgICAgICBvcHRpb25zLm9mZnNldC50b3BcbiAgICAgICAgdGFyZ2V0WCA9XG4gICAgICAgICAgICByZWN0LmxlZnQgK1xuICAgICAgICAgICAgKHdpbmRvdy5zY3JvbGxYIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0KSAtXG4gICAgICAgICAgICBvcHRpb25zLm9mZnNldC5sZWZ0XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVsYXRpdmUgdG8gdGhlIHNjcm9sbGFibGUgcGFyZW50IGNvbnRhaW5lclxuICAgICAgICB0YXJnZXRZID1cbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRhcmdldERvbU5vZGUub2Zmc2V0VG9wIC1cbiAgICAgICAgICAgICAgICAob3B0aW9ucy5jb250YWluZXJEb21Ob2RlIGFzIEhUTUxFbGVtZW50KS5vZmZzZXRUb3BcbiAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgb3B0aW9ucy5vZmZzZXQudG9wXG4gICAgICAgIHRhcmdldFggPVxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudGFyZ2V0RG9tTm9kZS5vZmZzZXRMZWZ0IC1cbiAgICAgICAgICAgICAgICAob3B0aW9ucy5jb250YWluZXJEb21Ob2RlIGFzIEhUTUxFbGVtZW50KS5vZmZzZXRMZWZ0XG4gICAgICAgICAgICApIC1cbiAgICAgICAgICAgIG9wdGlvbnMub2Zmc2V0LmxlZnRcbiAgICB9XG5cbiAgICBjb25zdCBkaXN0YW5jZVkgPSB0YXJnZXRZIC0gc3RhcnRZXG4gICAgY29uc3QgZGlzdGFuY2VYID0gdGFyZ2V0WCAtIHN0YXJ0WFxuXG4gICAgLy8gSWYgbm8gbW92ZW1lbnQgaXMgbmVlZGVkLCBleGl0IGltbWVkaWF0ZWx5XG4gICAgaWYgKGRpc3RhbmNlWSA9PT0gMCAmJiBkaXN0YW5jZVggPT09IDApXG4gICAgICAgIHJldHVyblxuXG4gICAgbGV0IHN0YXJ0VGltZTogbnVsbCB8IG51bWJlciA9IG51bGxcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVsbCB8IG51bWJlciA9IG51bGxcblxuICAgIC8vIEVhc2luZyBmdW5jdGlvblxuICAgIGNvbnN0IGVhc2VJbk91dFF1YWQgPSAodGltZTogbnVtYmVyKSA9PlxuICAgICAgICB0aW1lIDwgMC41ID8gMiAqIHRpbWUgKiB0aW1lIDogLTEgKyAoNCAtIDIgKiB0aW1lKSAqIHRpbWVcblxuICAgIGlmIChvcHRpb25zLmludGVycnVwdE9uTWFudWFsU2Nyb2xsKSB7XG4gICAgICAgIC8vIDMuIERlZmluZSB0aGUgaW50ZXJydXB0IC8gdGVhcmRvd24gc3lzdGVtXG4gICAgICAgIFNUT1BfQVVUT19TQ1JPTExJTkcudmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGFuaW1hdGlvbkZyYW1lSWQpXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBbXG4gICAgICAgICAgICAgICAgYm9keSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpLCB3aW5kb3dcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE1BTlVBTF9TQ1JPTExfRVZFTlRfTkFNRVMpXG4gICAgICAgICAgICAgICAgICAgIG5vZGU/LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgU1RPUF9BVVRPX1NDUk9MTElORy52YWx1ZSlcblxuICAgICAgICAgICAgU1RPUF9BVVRPX1NDUk9MTElORy52YWx1ZSA9IE5PT1BcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBbXG4gICAgICAgICAgICBib2R5LCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJyksIHdpbmRvd1xuICAgICAgICBdKVxuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE1BTlVBTF9TQ1JPTExfRVZFTlRfTkFNRVMpXG4gICAgICAgICAgICAgICAgbm9kZT8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgbmFtZSwgU1RPUF9BVVRPX1NDUk9MTElORy52YWx1ZSwge3Bhc3NpdmU6IHRydWV9XG4gICAgICAgICAgICAgICAgKVxuICAgIH1cblxuICAgIC8vIDQuIE11bHRpLWF4aXMgYW5pbWF0aW9uIGxvb3BcbiAgICBjb25zdCBzdGVwID0gKGN1cnJlbnRUaW1lOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFzdGFydFRpbWUpXG4gICAgICAgICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZVxuXG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWVcbiAgICAgICAgY29uc3QgdGltZVJhdGlvID1cbiAgICAgICAgICAgIE1hdGgubWluKHByb2dyZXNzIC8gb3B0aW9ucy5kdXJhdGlvbkluTWlsbGlzZWNvbmRzLCAxKVxuXG4gICAgICAgIGNvbnN0IGVhc2VkUmF0aW8gPSBlYXNlSW5PdXRRdWFkKHRpbWVSYXRpbylcblxuICAgICAgICAvLyBMaW5lYXJseSBpbnRlcnBvbGF0ZSB0aGUgcG9zaXRpb25zIGJhc2VkIG9uIGVhc2VkIHByb2dyZXNzLlxuICAgICAgICBjb25zdCBuZXh0WSA9IHN0YXJ0WSArIChkaXN0YW5jZVkgKiBlYXNlZFJhdGlvKVxuICAgICAgICBjb25zdCBuZXh0WCA9IHN0YXJ0WCArIChkaXN0YW5jZVggKiBlYXNlZFJhdGlvKVxuXG4gICAgICAgIC8vIEFwcGx5IHNjcm9sbCB0byB3aW5kb3cgb3IgY29udGFpbmVyLlxuICAgICAgICBpZiAoaXNXaW5kb3cpXG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8obmV4dFgsIG5leHRZKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIDsob3B0aW9ucy5jb250YWluZXJEb21Ob2RlIGFzIEhUTUxFbGVtZW50KS5zY3JvbGxUb3AgPSBuZXh0WVxuICAgICAgICAgICAgOyhvcHRpb25zLmNvbnRhaW5lckRvbU5vZGUgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQgPSBuZXh0WFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWVSYXRpbyA8IDEpXG4gICAgICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIFNUT1BfQVVUT19TQ1JPTExJTkcudmFsdWUoKVxuICAgIH1cblxuICAgIGFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcClcbn1cbi8qKlxuICogU2Nyb2xscyB0byB0aGUgZ2l2ZW4gRG9tTm9kZSdzIGxvY2F0aW9uIG9yIHRpbyBvZiB0aGUgcGFnZS5cbiAqIEBwYXJhbSB0YXJnZXREb21Ob2RlIC0gRG9tTm9kZSB0byBzY3JvbGwgdG8uIElmIG5vdCBnaXZlbiwgc2Nyb2xscyB0byB0aGVcbiAqIHRvcCBvZiB0aGUgcGFnZS5cbiAqIEBwYXJhbSBiZWhhdmlvciAtIFNjcm9sbCBiZWhhdmlvciB0byB1c2UuXG4gKi9cbmV4cG9ydCBjb25zdCBzY3JvbGxUbyA9IChcbiAgICB0YXJnZXREb21Ob2RlOiBOb2RlIHwgbnVsbCA9IG51bGwsXG4gICAgYmVoYXZpb3I6IFNjcm9sbFRvT3B0aW9uc1snYmVoYXZpb3InXSA9ICdzbW9vdGgnXG4pID0+IHtcbiAgICBpZiAodGFyZ2V0RG9tTm9kZSAmJiAhKCdnZXRCb3VuZGluZ0NsaWVudFJlY3QnIGluIHRhcmdldERvbU5vZGUpKVxuICAgICAgICB0YXJnZXREb21Ob2RlID0gdGFyZ2V0RG9tTm9kZS5wYXJlbnRFbGVtZW50XG5cbiAgICBjb25zdCB7bGVmdCwgdG9wfSA9IHRhcmdldERvbU5vZGUgP1xuICAgICAgICAodGFyZ2V0RG9tTm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6XG4gICAgICAgIHtsZWZ0OiAwLCB0b3A6IDB9XG5cbiAgICBnbG9iYWxDb250ZXh0LndpbmRvdz8uc2Nyb2xsVG8oe2xlZnQsIHRvcCwgYmVoYXZpb3J9KVxufVxuXG5leHBvcnQgY29uc3QgZ2V0QWxsID0gKHJvb3Q6IE5vZGUpID0+IHtcbiAgICBpZiAoIWdsb2JhbENvbnRleHQuZG9jdW1lbnQpXG4gICAgICAgIHJldHVybiBbXVxuXG4gICAgY29uc3Qgbm9kZXM6IEFycmF5PE5vZGU+ID0gW11cbiAgICAvLyBTSE9XX0FMTCBpbmNsdWRlcyBlbGVtZW50cywgdGV4dCwgYW5kIGNvbW1lbnRzXG4gICAgY29uc3Qgd2Fsa2VyID1cbiAgICAgICAgZ2xvYmFsQ29udGV4dC5kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJvb3QsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwpXG5cbiAgICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gd2Fsa2VyLmN1cnJlbnROb2RlXG4gICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgICAgIG5vZGVzLnB1c2goY3VycmVudE5vZGUpXG4gICAgICAgIGN1cnJlbnROb2RlID0gd2Fsa2VyLm5leHROb2RlKClcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZXNcbn1cbmV4cG9ydCBjb25zdCBjbG9zZXN0ID0gKFxuICAgIG5vZGU6IE5vZGUsIHNlbGVjdG9yOiBzdHJpbmcsIHN0YXJ0V2l0aFBhcmVudCA9IGZhbHNlXG4pOiBFbGVtZW50IHwgbnVsbCA9PlxuICAgICdjbG9zZXN0JyBpbiBub2RlICYmICFzdGFydFdpdGhQYXJlbnQgP1xuICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5jbG9zZXN0KHNlbGVjdG9yKSA6XG4gICAgICAgIG5vZGUucGFyZW50RWxlbWVudD8uY2xvc2VzdChzZWxlY3RvcikgfHwgbnVsbFxuZXhwb3J0IGNvbnN0IGdldFBhcmVudHMgPSAobm9kZTogTm9kZSk6IEFycmF5PE5vZGU+ID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PE5vZGU+ID0gW11cbiAgICB3aGlsZSAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbmV4cG9ydCBjb25zdCBnZXRUZXh0ID0gKHJvb3Q6IE5vZGUsIHJlY3Vyc2l2ZSA9IGZhbHNlKTogQXJyYXk8c3RyaW5nPiA9PiB7XG4gICAgaWYgKHJvb3Qubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSByb290Lm5vZGVWYWx1ZT8udHJpbSgpXG4gICAgICAgIGlmIChjb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuIFtjb250ZW50XVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8c3RyaW5nPiA9IFtdXG4gICAgZm9yIChjb25zdCBkb21Ob2RlIG9mIHJvb3QuY2hpbGROb2RlcylcbiAgICAgICAgaWYgKHJlY3Vyc2l2ZSB8fCBkb21Ob2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLmdldFRleHQoZG9tTm9kZSkpXG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIGh0bWwgb3IgdGV4dCBzdHJpbmdzIGFyZSBlcXVhbC5cbiAqIEBwYXJhbSBmaXJzdCAtIEZpcnN0IGh0bWwsIHNlbGVjdG9yIHRvIGRvbSBub2RlIG9yIHRleHQgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBzZWNvbmQgLSBTZWNvbmQgaHRtbCwgc2VsZWN0b3IgdG8gZG9tIG5vZGUgb3IgdGV4dCB0byBjb21wYXJlLlxuICogQHBhcmFtIGZvcmNlSFRNTFN0cmluZyAtIEluZGljYXRlcyB3aGV0aGVyIGdpdmVuIGNvbnRlbnRzIGFyZVxuICogaW50ZXJwcmV0ZWQgYXMgaHRtbCBzdHJpbmcgKG90aGVyd2lzZSBhdXRvbWF0aWMgZGV0ZWN0aW9uIHdpbGwgYmVcbiAqIHRyaWdnZXJlZCkuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgYm90aCBkb20gcmVwcmVzZW50YXRpb25zIGFyZSBlcXVpdmFsZW50LlxuICovXG5leHBvcnQgY29uc3QgaXNFcXVpdmFsZW50ID0gKFxuICAgIGZpcnN0OiBOb2RlIHwgc3RyaW5nLCBzZWNvbmQ6IE5vZGUgfCBzdHJpbmcsIGZvcmNlSFRNTFN0cmluZyA9IGZhbHNlXG4pOiBib29sZWFuID0+IHtcbiAgICBpZiAoZmlyc3QgPT09IHNlY29uZClcbiAgICAgICAgcmV0dXJuIHRydWVcblxuICAgIGlmICghKGZpcnN0ICYmIHNlY29uZCkpXG4gICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKCFnbG9iYWxDb250ZXh0LmRvY3VtZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZG9jdW1lbnQgaW4gZ2xvYmFsIGNvbnRleHQuJylcblxuICAgIGNvbnN0IGNyZWF0ZUVsZW1lbnQgPVxuICAgICAgICBnbG9iYWxDb250ZXh0LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChnbG9iYWxDb250ZXh0LmRvY3VtZW50KVxuXG4gICAgY29uc3QgZGV0ZXJtaW5lSFRNTFBhdHRlcm4gPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkL1xuICAgIGNvbnN0IGlucHV0czogTWFwcGluZzxOb2RlIHwgc3RyaW5nPiA9IHtmaXJzdCwgc2Vjb25kfVxuICAgIGNvbnN0IGRvbU5vZGVzOiBNYXBwaW5nPE5vZGU+ID0ge1xuICAgICAgICBmaXJzdDogY3JlYXRlRWxlbWVudCgnZHVtbXknKSxcbiAgICAgICAgc2Vjb25kOiBjcmVhdGVFbGVtZW50KCdkdW1teScpXG4gICAgfVxuXG4gICAgLypcbiAgICAgICAgTk9URTogQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IFwiPFwiIGFuZCBlbmQgd2l0aCBcIj5cIiBhcmUgbWFyayB1cFxuICAgICAgICBhbmQgc2tpcCB0aGUgbW9yZSBleHBlbnNpdmUgcmVndWxhciBleHByZXNzaW9uIGNoZWNrLlxuICAgICovXG4gICAgZm9yIChjb25zdCBbdHlwZSwgaHRtbF0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXRzKSlcbiAgICAgICAgaWYgKHR5cGVvZiBodG1sID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmb3JjZUhUTUxTdHJpbmcgfHxcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGh0bWwuc3RhcnRzV2l0aCgnPCcpICYmXG4gICAgICAgICAgICAgICAgICAgIGh0bWwuZW5kc1dpdGgoJz4nKSAmJlxuICAgICAgICAgICAgICAgICAgICBodG1sLmxlbmd0aCA+PSAzIHx8XG4gICAgICAgICAgICAgICAgICAgIGRldGVybWluZUhUTUxQYXR0ZXJuLnRlc3QoaHRtbClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgZG9tTm9kZXNbdHlwZV0gPSBjcmVhdGVEb21Ob2RlcyhodG1sKVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG9tTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaHRtbClcbiAgICAgICAgICAgICAgICBpZiAoZG9tTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IFdlIGNvcHkgdGhlIG5vZGUgdHJlZSB0byBub3QgbWFuaXB1bGF0ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsIGRvbSBub2RlIGJ5IG5vcm1hbGl6aW5nIGl0IGFmdGVyd2FyZC5cbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZXNbdHlwZV0gPSBkb21Ob2RlLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCdjbG9uZU5vZGUnIGluIGh0bWwpXG4gICAgICAgICAgICBkb21Ob2Rlc1t0eXBlXSA9IGh0bWwuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgZG9tTm9kZXMuZmlyc3Qubm9ybWFsaXplKClcbiAgICBkb21Ob2Rlcy5zZWNvbmQubm9ybWFsaXplKClcblxuICAgIHJldHVybiBkb21Ob2Rlcy5maXJzdC5pc0VxdWFsTm9kZSgoZG9tTm9kZXMuc2Vjb25kKSlcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGRvbSBub2RlIGlzIHZpc2libGUgb3IgdGFrZXMgc3BhY2UgaW4gdGhlIGRvY3VtZW50XG4gKiBmbG93LlxuICogRWxlbWVudHMgd2l0aCB2aXNpYmlsaXR5OiBoaWRkZW4gb3Igb3BhY2l0eTogMCBhcmUgY29uc2lkZXJlZCB0byBiZSB2aXNpYmxlLFxuICogc2luY2UgdGhleSBzdGlsbCBjb25zdW1lIHNwYWNlIGluIHRoZSBsYXlvdXQuIER1cmluZyBhbmltYXRpb25zIHRoYXQgaGlkZSBhblxuICogZWxlbWVudCwgdGhlIGVsZW1lbnQgaXMgY29uc2lkZXJlZCB0byBiZSB2aXNpYmxlIHVudGlsIHRoZSBlbmQgb2YgdGhlXG4gKiBhbmltYXRpb24uXG4gKiBAcGFyYW0gZG9tTm9kZSAtIFRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgdmlzaWJpbGl0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzSGlkZGVuID0gKGRvbU5vZGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiA9PlxuICAgICFnbG9iYWxDb250ZXh0LmRvY3VtZW50Py5jb250YWlucyhkb21Ob2RlKSB8fFxuXG4gICAgZG9tTm9kZS5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHxcblxuICAgIGRvbU5vZGUubm9kZU5hbWUgPT09ICdJTlBVVCcgJiZcbiAgICBkb21Ob2RlLmdldEF0dHJpYnV0ZSgndHlwZScpID09PSAnaGlkZGVuJyB8fFxuXG4gICAgWydjb250ZW50cycsICdpbmxpbmUnXS5pbmNsdWRlcyhkb21Ob2RlLnN0eWxlLmRpc3BsYXkpICYmXG4gICAgKCEoJ2lubmVySFRNTCcgaW4gZG9tTm9kZSkgfHwgZG9tTm9kZS5pbm5lckhUTUwudHJpbSgpID09PSAnJykgfHxcblxuICAgIGRvbU5vZGUuc3R5bGUuaGVpZ2h0ID09PSAnMHB4JyAmJlxuICAgIGRvbU5vZGUuc3R5bGUud2lkdGggPT09ICcwcHgnIHx8XG5cbiAgICBCb29sZWFuKGRvbU5vZGUucGFyZW50RWxlbWVudCkgJiZcbiAgICBpc0hpZGRlbihkb21Ob2RlLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpXG5cbmV4cG9ydCBjb25zdCBvbkRvY3VtZW50UmVhZHkgPSAoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgZG9jdW1lbnQgb2JqZWN0IG1vZGVsIGlzIGFscmVhZHkgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKFsnY29tcGxldGUnLCAnaW50ZXJhY3RpdmUnXS5pbmNsdWRlcyhkb2N1bWVudC5yZWFkeVN0YXRlKSkge1xuICAgICAgICAgICAgICAgIC8vIENhbGwgb24gbmV4dCBhdmFpbGFibGUgdGljay5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aW1lb3V0KClcbiAgICAgICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICAgICAgICBjYWxsYmFjaz8uKClcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz8uKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9KSgpXG4gICAgKVxuXG4vKipcbiAqIFJlcGxhY2VzIGEgZ2l2ZW4gZG9tIG5vZGUgd2l0aCBnaXZlbiBub2Rlcy5cbiAqIEBwYXJhbSBkb21Ob2RlVG9SZXBsYWNlIC0gTm9kZSB0byByZXBsYWNlIGl0cyBjaGlsZHJlbi5cbiAqIEBwYXJhbSByZXBsYWNlbWVudERvbU5vZGVzIC0gTm9kZSBvciBhcnJheSBvZiBub2RlcyB0byB1c2UgYXMgcmVwbGFjZW1lbnQuXG4gKiBAcGFyYW0gc2tpcEVtcHR5VGV4dE5vZGVzIC0gQ29uZmlndXJlcyB3aGV0aGVyIHRvIHRyaW0gdGV4dC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxhY2UgPSAoXG4gICAgZG9tTm9kZVRvUmVwbGFjZTogSFRNTEVsZW1lbnQsXG4gICAgcmVwbGFjZW1lbnREb21Ob2RlczogQXJyYXk8Tm9kZT4gfCBOb2RlLFxuICAgIHNraXBFbXB0eVRleHROb2RlcyA9IGZhbHNlXG4pID0+IHtcbiAgICBmb3IgKFxuICAgICAgICBjb25zdCByZXBsYWNlbWVudCBvZlxuICAgICAgICAoW10gYXMgQXJyYXk8Tm9kZT4pLmNvbmNhdChyZXBsYWNlbWVudERvbU5vZGVzKS5yZXZlcnNlKClcbiAgICApXG4gICAgICAgIGlmICghKFxuICAgICAgICAgICAgc2tpcEVtcHR5VGV4dE5vZGVzICYmXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQubm9kZVZhbHVlPy50cmltKCkgPT09ICcnXG4gICAgICAgICAgICApXG4gICAgICAgICkpXG4gICAgICAgICAgICBkb21Ob2RlVG9SZXBsYWNlLmFmdGVyKHJlcGxhY2VtZW50KVxuXG4gICAgZG9tTm9kZVRvUmVwbGFjZS5yZW1vdmUoKVxufVxuXG5leHBvcnQgY29uc3Qgd3JhcCA9IChcbiAgICBkb21Ob2RlczogTm9kZSB8IE5vZGVMaXN0T2Y8Tm9kZT4sIHdyYXBwZXI6IEhUTUxFbGVtZW50XG4pID0+IHtcbiAgICBjb25zdCBkb21Ob2RlTGlzdCA9IChkb21Ob2RlcyBhcyBOb2RlTGlzdE9mPE5vZGU+KS5sZW5ndGggP1xuICAgICAgICBBcnJheS5mcm9tKGRvbU5vZGVzIGFzIE5vZGVMaXN0T2Y8Tm9kZT4pIDpcbiAgICAgICAgW2RvbU5vZGVzIGFzIE5vZGVdXG5cbiAgICAvLyBVc2UgdGhlIGZpcnN0IGVsZW1lbnQncyBwb3NpdGlvbiBhcyB0aGUgYW5jaG9yIHBvaW50XG4gICAgY29uc3QgZmlyc3QgPSBkb21Ob2RlTGlzdFswXVxuXG4gICAgaWYgKGZpcnN0LnBhcmVudE5vZGUpXG4gICAgICAgIGZpcnN0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGZpcnN0KVxuXG4gICAgZm9yIChjb25zdCBkb21Ob2RlIG9mIGRvbU5vZGVMaXN0KVxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGRvbU5vZGUpXG59XG4vKipcbiAqIE1vdmVzIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gZG9tIG5vZGUgb25lIGxldmVsIHVwIGFuZCByZW1vdmVzIHRoZSBnaXZlblxuICogbm9kZS5cbiAqIEBwYXJhbSBkb21Ob2RlIC0gTm9kZSB0byB1bndyYXAuXG4gKiBAcmV0dXJucyBMaXN0IG9mIHVud3JhcHBlZCBub2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVud3JhcCA9IChkb21Ob2RlOiBIVE1MRWxlbWVudCk6IEFycmF5PENoaWxkTm9kZT4gPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGRvbU5vZGUucGFyZW50Tm9kZVxuXG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxDaGlsZE5vZGU+ID0gW11cbiAgICAvLyBOT1RFOiBXZSBuZWVkIHRvIHVzZSBcIkFycmF5LmZyb21cIiB0byBjb3B5IHRoZSBsaXN0LlxuICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIEFycmF5LmZyb20oZG9tTm9kZS5jaGlsZE5vZGVzKSkge1xuICAgICAgICByZXN1bHQucHVzaChjaGlsZE5vZGUpXG5cbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLCBkb21Ob2RlKVxuICAgIH1cblxuICAgIGlmIChwYXJlbnQpXG4gICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChkb21Ob2RlKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQUFBO0FBcUJBLFNBQVEsYUFBYSxFQUFFLElBQUk7QUFDM0IsU0FBUSxPQUFPO0FBRWYsT0FBTyxNQUFNLGNBQWMsR0FDdkIsSUFBWSxJQUNMO0VBQ1AsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7RUFDcEQsY0FBYyxDQUFDLFNBQVMsR0FBRyxJQUFJO0VBRS9CLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztJQUN0QztBQUNSO0FBQ0E7QUFDQTtJQUNRLE9BQU8sY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO0VBRXZELE9BQU8sY0FBYztBQUN6QixDQUFDO0FBRUQsT0FBTyxNQUFNLElBQUksR0FBRyxDQUNoQixPQUFvQixFQUFF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