@ryanmorr/templar
Version:
A simple and versatile DOM templating engine
2 lines • 51.8 kB
JavaScript
/*! @ryanmorr/templar v2.0.0 | https://github.com/ryanmorr/templar */'use strict';function _typeof2(a){return _typeof2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof2(a)}function _typeof(a){return _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(a){return _typeof2(a)}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":_typeof2(a)},_typeof(a)}function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,c.key,c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),a}var frame,EventEmitter=/*#__PURE__*/function(){function a(){_classCallCheck(this,a),this.events={}}return _createClass(a,[{key:"on",value:function(a,b){var c=this.events[a];void 0===c&&(c=[],this.events[a]=c),c.push(b)}},{key:"remove",value:function(a,b){var c=this.events[a];if(void 0!==c)for(var d=0,e=c.length;d<e;d++)if(c[d]===b)return void c.splice(d,1)}},{key:"emit",value:function(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];var e=this.events[a];void 0!==e&&e.length&&e.forEach(function(a){return a.apply(void 0,c)})}}]),a}(),budget=null,batch=[];/*! @ryanmorr/schedule-render v2.0.1 | https://github.com/ryanmorr/schedule-render */function render(){if(frame=null,null==budget)for(;0<batch.length;)batch.shift().render()}function scheduleRender(c){return new Promise(function(a,b){frame||(frame=requestAnimationFrame(render)),batch.push({render:function(){return a(c())},cancel:b})})}var template=document.createElement("template"),htmlRe=/<[a-z][\s\S]*>/;function uid(){return Math.random().toString(36).substr(2,9)}function isHTML(a){return htmlRe.test(a)}function isTemplate(a){return"object"===_typeof(a)&&!0===a.templar}function getMatches(a,b,c){var d;for(a.global&&(a.lastIndex=0);d=a.exec(b);)c(d)}function parseHTML(a){return template.innerHTML=a,document.importNode(template.content,!0)}function wrapFragment(a,b){var c=document.createTextNode(""),d=document.createTextNode("");return c.templarId=d.templarId=b,a.insertBefore(c,a.firstChild),a.appendChild(d),a}function getTemplateNodes(a,b){for(var c=[],d=a.firstChild,e=!1;d;)d.templarId!==b||e?d.templarId===b&&e&&(e=!1,c.push(d)):e=!0,e&&c.push(d),d=d.nextSibling;return c}function arrayToFrag(a){return a.reduce(function(a,b){return a.appendChild(getNode(b))&&a},document.createDocumentFragment())}function resolveNode(a){return 11===a.nodeType?Array.from(a.childNodes):a}function clear(a,b){Array.isArray(b)?b.forEach(function(b){return a.removeChild(b)}):a.removeChild(b)}function getNode(a,b){return isTemplate(a)?a:null==a?document.createTextNode(""):("number"==typeof a&&(a+=""),"string"==typeof a?!1===b&&isHTML(a)?parseHTML(a):document.createTextNode(a):Array.isArray(a)?arrayToFrag(a):a)}function insertBefore(a,b,c){isTemplate(b)?(b.unmount(),a.insertBefore(b.frag,c),b._setRoot(a)):a.insertBefore(b,c)}function replace(a,b,c){isTemplate(b)?(b.unmount(),a.replaceChild(b.frag,c),b._setRoot(a)):a.replaceChild(b,c)}function patchNode(a,b,c,d,e){if("number"==typeof c&&(c+=""),3===b.nodeType&&"string"==typeof c&&!isHTML(c))return b.data=c,b;var f=getNode(c,d),g=resolveNode(f);return isTemplate(b)?(b.unmount(),insertBefore(a,f,e)):Array.isArray(b)?0===b.length?insertBefore(a,f,e):1===b.length?replace(a,f,b[0]):(clear(a,b),insertBefore(a,f,e)):replace(a,f,b),g}function patchAttribute(a,b,c,d){if(!("style"===b))b.startsWith("on")&&("function"==typeof c||"function"==typeof d)?(b=b.slice(2).toLowerCase(),null==d?a.removeEventListener(b,c):null==c&&a.addEventListener(b,d)):"form"!==b&&"list"!==b&&b in a?a[b]=null==d?"":d:null==d||!1===d?a.removeAttribute(b):a.setAttribute(b,d);else if("string"==typeof d)a.style.cssText=d;else for(var e in d){var f=null==d||null==d[e]?"":d[e];"-"===e[0]?a.style.setProperty(e,f):a.style[e]=f}}var matcherRe=/\{\{\s*&?(.+?)\s*\}\}/g,nodeContentRe=/\{\{\s*(.+?)\s*\}\}|((?:(?!(?:\{\{\s*(.+?)\s*\}\})).)+)/g;function hasInterpolation(a){return-1!==a.indexOf("{{")}function interpolate(a,b){return a.replace(matcherRe,function(a,c){return b[c]}).trim()}function getTokens(a){var b=[];return getMatches(matcherRe,a,function(a){return b.push(a[1])}),b}function addBinding(a,b,c){b in a||(a[b]=[]),a[b].push(c)}function attributeBinding(a,b,c,d){var e=null,f=getTokens(d),g=c.startsWith("on");g&&(b[c]=null,b.removeAttribute(c));var h=function(){var h=e;e=g||d==="{{"+f[0]+"}}"?a.data[f[0]]:interpolate(d,a.data);e===h||(patchAttribute(b,c,h,e),a.events.emit("attributechange",b,h,e))};return function(){f.every(function(b){return b in a.data})&&(document.contains(b)?scheduleRender(h):h())}}function nodeBinding(a,b,c,d,e){var f=null,g=function(){if(f=a.data[d],f!==b){var g=c.parentNode;b=patchNode(g,b,f,e,c),a.events.emit("change",g)}};return function(){d in a.data&&(document.contains(c)?scheduleRender(g):g())}}function parseAttribute(a,b,c,d,e){var f=attributeBinding(a,b,d,e);getTokens(e).forEach(function(a){return addBinding(c,a,f)})}function parseNode(a,b,c){var d=document.createDocumentFragment();return getMatches(nodeContentRe,b.data,function(b){if(null!=b[1]){var e=b[1],f=!1;"&"===e[0]&&(f=!0,e=e.substr(1));var g=document.createTextNode(""),h=document.createTextNode(""),i=nodeBinding(a,g,h,e,f);addBinding(c,e,i),d.appendChild(g),d.appendChild(h)}else null!=b[2]&&d.appendChild(document.createTextNode(b[2]))}),d}function parseTemplate(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:{};return Array.from(b).reduce(function(b,c){if(3===c.nodeType)hasInterpolation(c.data)&&c.replaceWith(parseNode(a,c,b));else if(1===c.nodeType){for(var d,e=0,f=c.attributes.length;e<f;e++)d=c.attributes[e],hasInterpolation(d.value)&&parseAttribute(a,c,b,d.name,d.value);c.hasChildNodes()&&parseTemplate(a,c.childNodes,b)}return b},c)}var Templar=/*#__PURE__*/function(){function a(b,c){_classCallCheck(this,a),this.id=uid(),this.templar=!0,this.data={};var d=parseHTML(b.trim());this.root=this.frag=wrapFragment(d,this.id),this.bindings=parseTemplate(this,d.childNodes),this.events=new EventEmitter,this.mounted=!1,c&&this.set(c)}return _createClass(a,[{key:"mount",value:function(a){this.isMounted()&&this.unmount(),a.appendChild(this.frag),this._setRoot(a)}},{key:"unmount",value:function(){var a=this;this.isMounted()&&(getTemplateNodes(this.getRoot(),this.id).forEach(function(b){a.frag.appendChild(b)}),this.root=this.frag,this.mounted=!1,this.events.emit("unmount"))}},{key:"get",value:function(a){return a in this.data?this.data[a]:null}},{key:"set",value:function(a,b){var c=this;return"string"==typeof a?void(this.data[a]=b,this.bindings[a].forEach(function(a){return a()})):void Object.keys(a).forEach(function(b){return c.set(b,a[b])})}},{key:"on",value:function(a,b){var c=this;return this.events.on(a,b),function(){return c.events.remove(a,b)}}},{key:"query",value:function(a){var b=this.getRoot();if(b===this.frag)return Array.from(b.querySelectorAll(a));var c=getTemplateNodes(b,this.id);return Array.from(b.querySelectorAll(a)).filter(function(a){return c.some(function(b){return b===a||!!(1===b.nodeType&&b.contains(a))})})}},{key:"getRoot",value:function(){return this.root}},{key:"isMounted",value:function(){return this.mounted}},{key:"_setRoot",value:function(a){this.root=a,this.mounted=!0,this.events.emit("mount",a)}}]),a}();function templar(a,b){return new Templar(a,b)}module.exports=templar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhci5janMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9Acnlhbm1vcnIvc2NoZWR1bGUtcmVuZGVyL2Rpc3Qvc2NoZWR1bGUtcmVuZGVyLmVzbS5qcyIsIi4uL3NyYy9ldmVudC1lbWl0dGVyLmpzIiwiLi4vc3JjL3V0aWwuanMiLCIuLi9zcmMvcGF0Y2guanMiLCIuLi9zcmMvcGFyc2VyLmpzIiwiLi4vc3JjL3RlbXBsYXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIEByeWFubW9yci9zY2hlZHVsZS1yZW5kZXIgdjIuMC4xIHwgaHR0cHM6Ly9naXRodWIuY29tL3J5YW5tb3JyL3NjaGVkdWxlLXJlbmRlciAqL3ZhciBmcmFtZSxzdGFydCxidWRnZXQ9bnVsbCxiYXRjaD1bXSxCUk9XU0VSX1JFTkRFUl9USU1FPTY7ZnVuY3Rpb24gcmVuZGVyKCl7aWYoZnJhbWU9bnVsbCxudWxsPT1idWRnZXQpZm9yKDswPGJhdGNoLmxlbmd0aDspYmF0Y2guc2hpZnQoKS5yZW5kZXIoKTtlbHNle3N0YXJ0PXBlcmZvcm1hbmNlLm5vdygpO2RvIGJhdGNoLnNoaWZ0KCkucmVuZGVyKCk7d2hpbGUoMDxiYXRjaC5sZW5ndGgmJnBlcmZvcm1hbmNlLm5vdygpLXN0YXJ0PGJ1ZGdldCk7MDxiYXRjaC5sZW5ndGgmJihmcmFtZT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyKSl9fWZ1bmN0aW9uIGZwcyhhKXtidWRnZXQ9XCJudW1iZXJcIj09dHlwZW9mIGE/MWUzL2EtQlJPV1NFUl9SRU5ERVJfVElNRTpudWxsfWZ1bmN0aW9uIGNsZWFyKCl7Zm9yKGZyYW1lJiZjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZSk7MDxiYXRjaC5sZW5ndGg7KWJhdGNoLnNoaWZ0KCkuY2FuY2VsKCl9ZnVuY3Rpb24gc2NoZWR1bGVSZW5kZXIoYSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGIsYyl7ZnJhbWV8fChmcmFtZT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyKSksYmF0Y2gucHVzaCh7cmVuZGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGIoYSgpKX0sY2FuY2VsOmN9KX0pfWV4cG9ydHtjbGVhcixmcHMsc2NoZWR1bGVSZW5kZXJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2ljMk5vWldSMWJHVXRjbVZ1WkdWeUxtVnpiUzVxY3lJc0luTnZkWEpqWlhNaU9sc2lMaTR2YzNKakwzTmphR1ZrZFd4bExYSmxibVJsY2k1cWN5SmRMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpzWlhRZ1puSmhiV1U3WEhKY2JteGxkQ0J6ZEdGeWREdGNjbHh1YkdWMElHSjFaR2RsZENBOUlHNTFiR3c3WEhKY2JtTnZibk4wSUdKaGRHTm9JRDBnVzEwN1hISmNibHh5WEc0dkx5QkNjbTkzYzJWeUozTWdjbVZ4ZFdseVpTQmhjbTkxYm1RZ05tMXpJSFJ2SUhKbGJtUmxjaUJoSUdaeVlXMWxYSEpjYmk4dklHaDBkSEJ6T2k4dlpHVjJaV3h2Y0dWeWN5NW5iMjluYkdVdVkyOXRMM2RsWWk5bWRXNWtZVzFsYm5SaGJITXZjR1Z5Wm05eWJXRnVZMlV2Y21GcGJDTmhibWx0WVhScGIyNWNjbHh1WTI5dWMzUWdRbEpQVjFORlVsOVNSVTVFUlZKZlZFbE5SU0E5SURZN1hISmNibHh5WEc1bWRXNWpkR2x2YmlCeVpXNWtaWElvS1NCN1hISmNiaUFnSUNCbWNtRnRaU0E5SUc1MWJHdzdYSEpjYmlBZ0lDQnBaaUFvWW5Wa1oyVjBJRDA5SUc1MWJHd3BJSHRjY2x4dUlDQWdJQ0FnSUNCM2FHbHNaU0FvWW1GMFkyZ3ViR1Z1WjNSb0lENGdNQ2tnWW1GMFkyZ3VjMmhwWm5Rb0tTNXlaVzVrWlhJb0tUdGNjbHh1SUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdjM1JoY25RZ1BTQndaWEptYjNKdFlXNWpaUzV1YjNjb0tUdGNjbHh1SUNBZ0lDQWdJQ0JrYnlCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdKaGRHTm9Mbk5vYVdaMEtDa3VjbVZ1WkdWeUtDazdYSEpjYmlBZ0lDQWdJQ0FnZlNCM2FHbHNaU0FvWW1GMFkyZ3ViR1Z1WjNSb0lENGdNQ0FtSmlBb0tIQmxjbVp2Y20xaGJtTmxMbTV2ZHlncElDMGdjM1JoY25RcElEd2dZblZrWjJWMEtTazdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tHSmhkR05vTG14bGJtZDBhQ0ErSURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1puSmhiV1VnUFNCeVpYRjFaWE4wUVc1cGJXRjBhVzl1Um5KaGJXVW9jbVZ1WkdWeUtUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JuMWNjbHh1WEhKY2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCbWNITW9kbUZzZFdVcElIdGNjbHh1SUNBZ0lHSjFaR2RsZENBOUlDaDBlWEJsYjJZZ2RtRnNkV1VnUFQwOUlDZHVkVzFpWlhJbktTQS9JQ2d4TURBd0lDOGdkbUZzZFdVcElDMGdRbEpQVjFORlVsOVNSVTVFUlZKZlZFbE5SU0E2SUc1MWJHdzdYSEpjYm4xY2NseHVYSEpjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJqYkdWaGNpZ3BJSHRjY2x4dUlDQWdJR2xtSUNobWNtRnRaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lHTmhibU5sYkVGdWFXMWhkR2x2YmtaeVlXMWxLR1p5WVcxbEtUdGNjbHh1SUNBZ0lIMWNjbHh1SUNBZ0lIZG9hV3hsSUNoaVlYUmphQzVzWlc1bmRHZ2dQaUF3S1NCaVlYUmphQzV6YUdsbWRDZ3BMbU5oYm1ObGJDZ3BPMXh5WEc1OVhISmNibHh5WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnYzJOb1pXUjFiR1ZTWlc1a1pYSW9ZMkZzYkdKaFkyc3BJSHRjY2x4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVUhKdmJXbHpaU2dvY21WemIyeDJaU3dnY21WcVpXTjBLU0E5UGlCN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0NGbWNtRnRaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JtY21GdFpTQTlJSEpsY1hWbGMzUkJibWx0WVhScGIyNUdjbUZ0WlNoeVpXNWtaWElwTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0JpWVhSamFDNXdkWE5vS0h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WdVpHVnlPaUFvS1NBOVBpQnlaWE52YkhabEtHTmhiR3hpWVdOcktDa3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpZVzVqWld3NklISmxhbVZqZEZ4eVhHNGdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdmU2s3WEhKY2JuMWNjbHh1SWwwc0ltNWhiV1Z6SWpwYkltWnlZVzFsSWl3aWMzUmhjblFpTENKaWRXUm5aWFFpTENKaVlYUmphQ0lzSWtKU1QxZFRSVkpmVWtWT1JFVlNYMVJKVFVVaUxDSnlaVzVrWlhJaUxDSnNaVzVuZEdnaUxDSnphR2xtZENJc0luQmxjbVp2Y20xaGJtTmxJaXdpYm05M0lpd2ljbVZ4ZFdWemRFRnVhVzFoZEdsdmJrWnlZVzFsSWl3aVpuQnpJaXdpZG1Gc2RXVWlMQ0pqYkdWaGNpSXNJbU5oYm1ObGJFRnVhVzFoZEdsdmJrWnlZVzFsSWl3aVkyRnVZMlZzSWl3aWMyTm9aV1IxYkdWU1pXNWtaWElpTENKallXeHNZbUZqYXlJc0lsQnliMjFwYzJVaUxDSnlaWE52YkhabElpd2ljbVZxWldOMElpd2ljSFZ6YUNKZExDSnRZWEJ3YVc1bmN5STZJbmRHUVVGSlFTeERRVUZCUVN4TlFVTkJReXhOUVVOQlF5eE5RVUZOTEVOQlFVY3NTMEZEVUVNc1MwRkJTeXhEUVVGSExFZEJTVkpETEcxQ1FVRnRRaXhEUVVGSExFVkJSVFZDTEZGQlFWTkRMRU5CUVVGQkxFMUJRVlFzUlVGQmEwSXNTVUZEWkV3c1MwRkJTeXhEUVVGSExFdEJRMDBzU1VGQlZrVXNSVUZCUVVFc1dVRkRjMElzUTBGQlprTXNRMEZCUVVFc1MwRkJTeXhEUVVGRFJ5eFJRVUZaU0N4TFFVRkxMRU5CUVVOSkxFdEJRVTVLTEVkQlFXTkZMRTFCUVdSR0xFOUJRM1JDTEVOQlEwaEdMRXRCUVVzc1EwRkJSMDhzVjBGQlZ5eERRVUZEUXl4SFFVRmFSQ3hGUVVSTUxFZEJSME5NTEVOQlFVRkJMRXRCUVVzc1EwRkJRMGtzUzBGQlRrb3NSMEZCWTBVc1RVRkJaRVlzVTBGRGIwSXNRMEZCWmtFc1EwRkJRVUVzUzBGQlN5eERRVUZEUnl4TlFVRk9TQ3hGUVVGelFrc3NWMEZCVnl4RFFVRkRReXhIUVVGYVJDeEhRVUZ2UWxBc1MwRkJjRUpQTEVOQlFUWkNUaXhSUVVONlF5eERRVUZtUXl4RFFVRkJRU3hMUVVGTExFTkJRVU5ITEUxQlRGQXNSMEZOUTA0c1MwRkJTeXhEUVVGSFZTeHhRa0ZCY1VJc1EwRkJRMHdzVFVGQlJDeERRVTQ1UWl4SFFWZEtMRkZCUVZOTkxFTkJRVUZCTEVkQlFWUXNRMEZCWVVNc1EwRkJZaXhEUVVGdlFpeERRVU4yUWxZc1RVRkJUU3hEUVVGeFFpeFJRVUZxUWl4UlFVRlBWU3hEUVVGQlFTeERRVUZRTEVOQlFUaENMRWxCUVU5QkxFTkJRVkFzUTBGQlowSlNMRzFDUVVFNVF5eERRVUZ2UlN4TFFVZHNSaXhSUVVGblFsTXNRMEZCUVVFc1MwRkJhRUlzUlVGQmQwSXNTMEZEYUVKaUxFdEJSR2RDTEVWQlJXaENZeXh2UWtGQmIwSXNRMEZCUTJRc1MwRkJSQ3hEUVVaS0xFTkJTVVVzUTBGQlprY3NRMEZCUVVFc1MwRkJTeXhEUVVGRFJ5eE5RVXBQTEVWQlNVdElMRXRCUVVzc1EwRkJRMGtzUzBGQlRrb3NSMEZCWTFrc1RVRkJaRm9zUjBGSGRFSXNVVUZCVTJFc1EwRkJRVUVzWTBGQlZDeERRVUYzUWtNc1EwRkJlRUlzUTBGQmEwTXNUMEZET1VJc1NVRkJTVU1zUTBGQlFVRXNUMEZCU2l4RFFVRlpMRk5CUVVORExFTkJRVVFzUTBGQlZVTXNRMEZCVml4RFFVRnhRaXhEUVVNdlFuQkNMRXRCUkN0Q0xFZEJSV2hEUVN4TFFVRkxMRU5CUVVkVkxIRkNRVUZ4UWl4RFFVRkRUQ3hOUVVGRUxFTkJSa2NzUlVGSmNFTkdMRXRCUVVzc1EwRkJRMnRDTEVsQlFVNXNRaXhEUVVGWExFTkJRMUJGTEUxQlFVMHNRMEZCUlN4cFFrRkJUV01zUTBGQlFVRXNRMEZCVHl4RFFVRkRSaXhEUVVGUkxFVkJRVlFzUTBGRVpDeERRVUZCTEVOQlJWQkdMRTFCUVUwc1EwRkJSVXNzUTBGR1JDeERRVUZZYWtJc1EwRktSeXhEUVVGQkluMD1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmV2ZW50cyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIG9uKG5hbWUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgbGV0IGNhbGxiYWNrcyA9IHRoaXMuZXZlbnRzW25hbWVdO1xyXG4gICAgICAgIGlmIChjYWxsYmFja3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjYWxsYmFja3MgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHNbbmFtZV0gPSBjYWxsYmFja3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUobmFtZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLmV2ZW50c1tuYW1lXTtcclxuICAgICAgICBpZiAoY2FsbGJhY2tzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXSA9PT0gY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbWl0KG5hbWUsIC4uLmFyZ3MpIHtcclxuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLmV2ZW50c1tuYW1lXTtcclxuICAgICAgICBpZiAoY2FsbGJhY2tzICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKC4uLmFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xyXG5jb25zdCBodG1sUmUgPSAvPFthLXpdW1xcc1xcU10qPi87XHJcbmNvbnN0IGVzY2FwZUhUTUxSZSA9IC9bPD4mXCInXS9nO1xyXG5jb25zdCBlc2NhcGVIVE1MTWFwID0ge1xyXG4gICAgJzwnOiAnJmx0OycsXHJcbiAgICAnPic6ICcmZ3Q7JyxcclxuICAgICcmJzogJyZhbXA7JyxcclxuICAgICdcIic6ICcmIzM5OycsXHJcbiAgICAnXFwnJzogJyZxdW90OydcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1aWQoKSB7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihvYmopIHtcclxuICAgIHJldHVybiB7fS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUwoc3RyKSB7XHJcbiAgICByZXR1cm4gaHRtbFJlLnRlc3Qoc3RyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVtcGxhdGUob2JqKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLnRlbXBsYXIgPT09IHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXRjaGVzKHJlLCBzdHIsIGZuKSB7XHJcbiAgICBsZXQgbWF0Y2hlcztcclxuICAgIGlmIChyZS5nbG9iYWwpIHtcclxuICAgICAgICByZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKChtYXRjaGVzID0gcmUuZXhlYyhzdHIpKSkge1xyXG4gICAgICAgIGZuKG1hdGNoZXMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSFRNTChzdHIpIHtcclxuICAgIGlmIChzdHIgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZShlc2NhcGVIVE1MUmUsIChjKSA9PiBlc2NhcGVIVE1MTWFwW2NdIHx8ICcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhUTUwoaHRtbCkge1xyXG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgIHJldHVybiBkb2N1bWVudC5pbXBvcnROb2RlKHRlbXBsYXRlLmNvbnRlbnQsIHRydWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gd3JhcEZyYWdtZW50KGZyYWcsIGlkKSB7XHJcbiAgICBjb25zdCBmaXJzdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcclxuICAgIGNvbnN0IGxhc3QgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XHJcbiAgICBmaXJzdC50ZW1wbGFySWQgPSBsYXN0LnRlbXBsYXJJZCA9IGlkO1xyXG4gICAgZnJhZy5pbnNlcnRCZWZvcmUoZmlyc3QsIGZyYWcuZmlyc3RDaGlsZCk7XHJcbiAgICBmcmFnLmFwcGVuZENoaWxkKGxhc3QpO1xyXG4gICAgcmV0dXJuIGZyYWc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wbGF0ZU5vZGVzKHJvb3QsIGlkKSB7XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xyXG4gICAgbGV0IG5vZGUgPSByb290LmZpcnN0Q2hpbGQsIGlzVHBsID0gZmFsc2U7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICAgIGlmIChub2RlLnRlbXBsYXJJZCA9PT0gaWQgJiYgIWlzVHBsKSB7XHJcbiAgICAgICAgICAgIGlzVHBsID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudGVtcGxhcklkID09PSBpZCAmJiBpc1RwbCkge1xyXG4gICAgICAgICAgICBpc1RwbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNUcGwpIHtcclxuICAgICAgICAgICAgZWxlbWVudHMucHVzaChub2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWxlbWVudHM7XHJcbn1cclxuIiwiaW1wb3J0IHsgaXNIVE1MLCBpc1RlbXBsYXRlLCBwYXJzZUhUTUwgfSBmcm9tICcuL3V0aWwnO1xyXG5cclxuZnVuY3Rpb24gYXJyYXlUb0ZyYWcobm9kZXMpIHtcclxuICAgIHJldHVybiBub2Rlcy5yZWR1Y2UoKGZyYWcsIG5vZGUpID0+IGZyYWcuYXBwZW5kQ2hpbGQoZ2V0Tm9kZShub2RlKSkgJiYgZnJhZywgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZU5vZGUobm9kZSkge1xyXG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDExKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBub2RlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbGVhcihwYXJlbnQsIGVsZW1lbnQpIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XHJcbiAgICAgICAgZWxlbWVudC5mb3JFYWNoKChub2RlKSA9PiBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5vZGUodmFsdWUsIGVzY2FwZSkge1xyXG4gICAgaWYgKGlzVGVtcGxhdGUodmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGlmIChlc2NhcGUgPT09IGZhbHNlICYmIGlzSFRNTCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSFRNTCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gYXJyYXlUb0ZyYWcodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50LCBub2RlLCByZWZlcmVuY2VOb2RlKSB7XHJcbiAgICBpZiAoaXNUZW1wbGF0ZShub2RlKSkge1xyXG4gICAgICAgIG5vZGUudW5tb3VudCgpO1xyXG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZS5mcmFnLCByZWZlcmVuY2VOb2RlKTtcclxuICAgICAgICBub2RlLl9zZXRSb290KHBhcmVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmZXJlbmNlTm9kZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2UocGFyZW50LCBub2RlLCByZWZlcmVuY2VOb2RlKSB7XHJcbiAgICBpZiAoaXNUZW1wbGF0ZShub2RlKSkge1xyXG4gICAgICAgIG5vZGUudW5tb3VudCgpO1xyXG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZS5mcmFnLCByZWZlcmVuY2VOb2RlKTtcclxuICAgICAgICBub2RlLl9zZXRSb290KHBhcmVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZSwgcmVmZXJlbmNlTm9kZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaE5vZGUocGFyZW50LCBvbGROb2RlLCBuZXdWYWx1ZSwgZXNjYXBlLCBtYXJrZXIpIHtcclxuICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSBTdHJpbmcobmV3VmFsdWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9sZE5vZGUubm9kZVR5cGUgPT09IDMgJiYgdHlwZW9mIG5ld1ZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNIVE1MKG5ld1ZhbHVlKSkge1xyXG4gICAgICAgIG9sZE5vZGUuZGF0YSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIHJldHVybiBvbGROb2RlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV3Tm9kZSA9IGdldE5vZGUobmV3VmFsdWUsIGVzY2FwZSk7XHJcbiAgICBjb25zdCByZXNvbHZlZE5vZGUgPSByZXNvbHZlTm9kZShuZXdOb2RlKTtcclxuICAgIGlmIChpc1RlbXBsYXRlKG9sZE5vZGUpKSB7XHJcbiAgICAgICAgb2xkTm9kZS51bm1vdW50KCk7XHJcbiAgICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudCwgbmV3Tm9kZSwgbWFya2VyKTtcclxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvbGROb2RlKSkge1xyXG4gICAgICAgIGlmIChvbGROb2RlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdOb2RlLCBtYXJrZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob2xkTm9kZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmVwbGFjZShwYXJlbnQsIG5ld05vZGUsIG9sZE5vZGVbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNsZWFyKHBhcmVudCwgb2xkTm9kZSk7XHJcbiAgICAgICAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIG5ld05vZGUsIG1hcmtlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXBsYWNlKHBhcmVudCwgbmV3Tm9kZSwgb2xkTm9kZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzb2x2ZWROb2RlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgb2xkVmFsLCBuZXdWYWwpIHtcclxuICAgIGlmIChuYW1lID09PSAnc3R5bGUnKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IG5ld1ZhbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdWYWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gbmV3VmFsID09IG51bGwgfHwgbmV3VmFsW2tleV0gPT0gbnVsbCA/ICcnIDogbmV3VmFsW2tleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5WzBdID09PSAnLScpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGtleSwgc3R5bGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlW2tleV0gPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCdvbicpICYmICh0eXBlb2Ygb2xkVmFsID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBuZXdWYWwgPT09ICdmdW5jdGlvbicpKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAobmV3VmFsID09IG51bGwpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIG9sZFZhbCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvbGRWYWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbmV3VmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG5hbWUgIT09ICdmb3JtJyAmJiBuYW1lICE9PSAnbGlzdCcgJiYgbmFtZSBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgZWxlbWVudFtuYW1lXSA9IG5ld1ZhbCA9PSBudWxsID8gJycgOiBuZXdWYWw7XHJcbiAgICB9IGVsc2UgaWYgKG5ld1ZhbCA9PSBudWxsIHx8IG5ld1ZhbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgbmV3VmFsKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBzY2hlZHVsZVJlbmRlciB9IGZyb20gJ0ByeWFubW9yci9zY2hlZHVsZS1yZW5kZXInO1xyXG5pbXBvcnQgeyBwYXRjaE5vZGUsIHBhdGNoQXR0cmlidXRlIH0gZnJvbSAnLi9wYXRjaCc7XHJcbmltcG9ydCB7IGdldE1hdGNoZXMgfSBmcm9tICcuL3V0aWwnO1xyXG5cclxuY29uc3QgbWF0Y2hlclJlID0gL1xce1xce1xccyomPyguKz8pXFxzKlxcfVxcfS9nO1xyXG5jb25zdCBub2RlQ29udGVudFJlID0gL1xce1xce1xccyooLis/KVxccypcXH1cXH18KCg/Oig/ISg/Olxce1xce1xccyooLis/KVxccypcXH1cXH0pKS4pKykvZztcclxuXHJcbmZ1bmN0aW9uIGhhc0ludGVycG9sYXRpb24oc3RyKSB7XHJcbiAgICByZXR1cm4gc3RyLmluZGV4T2YoJ3t7JykgIT09IC0xO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh0cGwsIGRhdGEpIHtcclxuICAgIHJldHVybiB0cGwucmVwbGFjZShtYXRjaGVyUmUsIChhbGwsIHRva2VuKSA9PiBkYXRhW3Rva2VuXSkudHJpbSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUb2tlbnModmFsdWUpIHtcclxuICAgIGNvbnN0IHRva2VucyA9IFtdO1xyXG4gICAgZ2V0TWF0Y2hlcyhtYXRjaGVyUmUsIHZhbHVlLCAobWF0Y2hlcykgPT4gdG9rZW5zLnB1c2gobWF0Y2hlc1sxXSkpO1xyXG4gICAgcmV0dXJuIHRva2VucztcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkQmluZGluZyhiaW5kaW5ncywgdG9rZW4sIGJpbmRpbmcpIHtcclxuICAgIGlmICghKHRva2VuIGluIGJpbmRpbmdzKSkge1xyXG4gICAgICAgIGJpbmRpbmdzW3Rva2VuXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgYmluZGluZ3NbdG9rZW5dLnB1c2goYmluZGluZyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGF0dHJpYnV0ZUJpbmRpbmcodHBsLCBub2RlLCBhdHRyLCB0ZXh0KSB7XHJcbiAgICBsZXQgdmFsdWUgPSBudWxsO1xyXG4gICAgY29uc3QgdG9rZW5zID0gZ2V0VG9rZW5zKHRleHQpO1xyXG4gICAgY29uc3QgaXNFdmVudCA9IGF0dHIuc3RhcnRzV2l0aCgnb24nKTtcclxuICAgIGlmIChpc0V2ZW50KSB7XHJcbiAgICAgICAgbm9kZVthdHRyXSA9IG51bGw7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZW5kZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB2YWx1ZSA9IGlzRXZlbnQgfHwgdGV4dCA9PT0gKCd7eycgKyB0b2tlbnNbMF0gKyAnfX0nKSA/IHRwbC5kYXRhW3Rva2Vuc1swXV0gOiBpbnRlcnBvbGF0ZSh0ZXh0LCB0cGwuZGF0YSk7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBvbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhdGNoQXR0cmlidXRlKG5vZGUsIGF0dHIsIG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICAgICAgdHBsLmV2ZW50cy5lbWl0KCdhdHRyaWJ1dGVjaGFuZ2UnLCBub2RlLCBvbGRWYWx1ZSwgdmFsdWUpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRva2Vucy5ldmVyeSgodG9rZW4pID0+IHRva2VuIGluIHRwbC5kYXRhKSkge1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuY29udGFpbnMobm9kZSkpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKHJlbmRlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5vZGVCaW5kaW5nKHRwbCwgbm9kZSwgbWFya2VyLCB0b2tlbiwgZXNjYXBlKSB7XHJcbiAgICBsZXQgdmFsdWUgPSBudWxsO1xyXG4gICAgY29uc3QgcmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICAgIHZhbHVlID0gdHBsLmRhdGFbdG9rZW5dO1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbm9kZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IG1hcmtlci5wYXJlbnROb2RlO1xyXG4gICAgICAgIG5vZGUgPSBwYXRjaE5vZGUocGFyZW50LCBub2RlLCB2YWx1ZSwgZXNjYXBlLCBtYXJrZXIpO1xyXG4gICAgICAgIHRwbC5ldmVudHMuZW1pdCgnY2hhbmdlJywgcGFyZW50KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgIGlmICh0b2tlbiBpbiB0cGwuZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuY29udGFpbnMobWFya2VyKSkge1xyXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIocmVuZGVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGUodHBsLCBub2RlLCBiaW5kaW5ncywgbmFtZSwgdmFsdWUpIHtcclxuICAgIGNvbnN0IGJpbmRpbmcgPSBhdHRyaWJ1dGVCaW5kaW5nKHRwbCwgbm9kZSwgbmFtZSwgdmFsdWUpO1xyXG4gICAgZ2V0VG9rZW5zKHZhbHVlKS5mb3JFYWNoKCh0b2tlbikgPT4gYWRkQmluZGluZyhiaW5kaW5ncywgdG9rZW4sIGJpbmRpbmcpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VOb2RlKHRwbCwgbm9kZSwgYmluZGluZ3MpIHtcclxuICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcbiAgICBnZXRNYXRjaGVzKG5vZGVDb250ZW50UmUsIG5vZGUuZGF0YSwgKG1hdGNoZXMpID0+IHtcclxuICAgICAgICBpZiAobWF0Y2hlc1sxXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCB0b2tlbiA9IG1hdGNoZXNbMV0sIGVzY2FwZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodG9rZW5bMF0gPT09ICcmJykge1xyXG4gICAgICAgICAgICAgICAgZXNjYXBlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YnN0aXR1dGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcclxuICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IG5vZGVCaW5kaW5nKHRwbCwgc3Vic3RpdHV0ZSwgbWFya2VyLCB0b2tlbiwgZXNjYXBlKTtcclxuICAgICAgICAgICAgYWRkQmluZGluZyhiaW5kaW5ncywgdG9rZW4sIGJpbmRpbmcpO1xyXG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKHN1YnN0aXR1dGUpO1xyXG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKG1hcmtlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVzWzJdICE9IG51bGwpIHtcclxuICAgICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtYXRjaGVzWzJdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnJhZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGVtcGxhdGUodHBsLCBub2RlcywgYmluZGluZ3MgPSB7fSkge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20obm9kZXMpLnJlZHVjZSgoYmluZGluZ3MsIG5vZGUpID0+IHtcclxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICBpZiAoaGFzSW50ZXJwb2xhdGlvbihub2RlLmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLnJlcGxhY2VXaXRoKHBhcnNlTm9kZSh0cGwsIG5vZGUsIGJpbmRpbmdzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IG5vZGUuYXR0cmlidXRlc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChoYXNJbnRlcnBvbGF0aW9uKGF0dHIudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VBdHRyaWJ1dGUodHBsLCBub2RlLCBiaW5kaW5ncywgYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcclxuICAgICAgICAgICAgICAgIHBhcnNlVGVtcGxhdGUodHBsLCBub2RlLmNoaWxkTm9kZXMsIGJpbmRpbmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYmluZGluZ3M7XHJcbiAgICB9LCBiaW5kaW5ncyk7XHJcbn1cclxuIiwiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBwYXJzZVRlbXBsYXRlIH0gZnJvbSAnLi9wYXJzZXInO1xyXG5pbXBvcnQgeyBwYXJzZUhUTUwsIHVpZCwgd3JhcEZyYWdtZW50LCBnZXRUZW1wbGF0ZU5vZGVzIH0gZnJvbSAnLi91dGlsJztcclxuXHJcbmNsYXNzIFRlbXBsYXIge1xyXG4gICAgY29uc3RydWN0b3IodHBsLCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5pZCA9IHVpZCgpO1xyXG4gICAgICAgIHRoaXMudGVtcGxhciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kYXRhID0ge307XHJcbiAgICAgICAgY29uc3QgZnJhZyA9IHBhcnNlSFRNTCh0cGwudHJpbSgpKTtcclxuICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLmZyYWcgPSB3cmFwRnJhZ21lbnQoZnJhZywgdGhpcy5pZCk7XHJcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IHBhcnNlVGVtcGxhdGUodGhpcywgZnJhZy5jaGlsZE5vZGVzKTtcclxuICAgICAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbW91bnQocm9vdCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTW91bnRlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5tb3VudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByb290LmFwcGVuZENoaWxkKHRoaXMuZnJhZyk7XHJcbiAgICAgICAgdGhpcy5fc2V0Um9vdChyb290KTtcclxuICAgIH1cclxuXHJcbiAgICB1bm1vdW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTW91bnRlZCgpKSB7XHJcbiAgICAgICAgICAgIGdldFRlbXBsYXRlTm9kZXModGhpcy5nZXRSb290KCksIHRoaXMuaWQpLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhZy5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuZnJhZztcclxuICAgICAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoJ3VubW91bnQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KHRva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIHRva2VuIGluIHRoaXMuZGF0YSA/IHRoaXMuZGF0YVt0b2tlbl0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCh0b2tlbiwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0b2tlbikuZm9yRWFjaCgobmFtZSkgPT4gdGhpcy5zZXQobmFtZSwgdG9rZW5bbmFtZV0pKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGFbdG9rZW5dID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5iaW5kaW5nc1t0b2tlbl0uZm9yRWFjaCgoYmluZGluZykgPT4gYmluZGluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICBvbihuYW1lLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLm9uKG5hbWUsIGNhbGxiYWNrKTtcclxuICAgICAgICByZXR1cm4gKCkgPT4gdGhpcy5ldmVudHMucmVtb3ZlKG5hbWUsIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWVyeShzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmdldFJvb3QoKTtcclxuICAgICAgICBpZiAocm9vdCA9PT0gdGhpcy5mcmFnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0cGxOb2RlcyA9IGdldFRlbXBsYXRlTm9kZXMocm9vdCwgdGhpcy5pZCk7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuZmlsdGVyKChub2RlKSA9PiB0cGxOb2Rlcy5zb21lKCh0cGxOb2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0cGxOb2RlID09PSBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHBsTm9kZS5ub2RlVHlwZSA9PT0gMSAmJiB0cGxOb2RlLmNvbnRhaW5zKG5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJvb3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpc01vdW50ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW91bnRlZDtcclxuICAgIH1cclxuXHJcbiAgICBfc2V0Um9vdChyb290KSB7XHJcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdDtcclxuICAgICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoJ21vdW50Jywgcm9vdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRlbXBsYXIodHBsLCBkYXRhKSB7XHJcbiAgICByZXR1cm4gbmV3IFRlbXBsYXIodHBsLCBkYXRhKTtcclxufVxyXG4iXSwibmFtZXMiOlsiZnJhbWUiLCJFdmVudEVtaXR0ZXIiLCJldmVudHMiLCJuYW1lIiwiY2FsbGJhY2siLCJjYWxsYmFja3MiLCJwdXNoIiwiaSIsImxlbiIsImxlbmd0aCIsInNwbGljZSIsImFyZ3MiLCJmb3JFYWNoIiwiYnVkZ2V0IiwiYmF0Y2giLCJyZW5kZXIiLCJzaGlmdCIsInNjaGVkdWxlUmVuZGVyIiwiYSIsIlByb21pc2UiLCJiIiwiYyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbmNlbCIsInRlbXBsYXRlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaHRtbFJlIiwidWlkIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyIiwiaXNIVE1MIiwic3RyIiwidGVzdCIsImlzVGVtcGxhdGUiLCJvYmoiLCJfdHlwZW9mIiwidGVtcGxhciIsImdldE1hdGNoZXMiLCJyZSIsImZuIiwibWF0Y2hlcyIsImdsb2JhbCIsImxhc3RJbmRleCIsImV4ZWMiLCJwYXJzZUhUTUwiLCJodG1sIiwiaW5uZXJIVE1MIiwiaW1wb3J0Tm9kZSIsImNvbnRlbnQiLCJ3cmFwRnJhZ21lbnQiLCJmcmFnIiwiaWQiLCJmaXJzdCIsImNyZWF0ZVRleHROb2RlIiwibGFzdCIsInRlbXBsYXJJZCIsImluc2VydEJlZm9yZSIsImZpcnN0Q2hpbGQiLCJhcHBlbmRDaGlsZCIsImdldFRlbXBsYXRlTm9kZXMiLCJyb290IiwiZWxlbWVudHMiLCJub2RlIiwiaXNUcGwiLCJuZXh0U2libGluZyIsImFycmF5VG9GcmFnIiwibm9kZXMiLCJyZWR1Y2UiLCJnZXROb2RlIiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsInJlc29sdmVOb2RlIiwibm9kZVR5cGUiLCJBcnJheSIsImZyb20iLCJjaGlsZE5vZGVzIiwiY2xlYXIiLCJwYXJlbnQiLCJlbGVtZW50IiwiaXNBcnJheSIsInJlbW92ZUNoaWxkIiwidmFsdWUiLCJlc2NhcGUiLCJyZWZlcmVuY2VOb2RlIiwidW5tb3VudCIsIl9zZXRSb290IiwicmVwbGFjZSIsInJlcGxhY2VDaGlsZCIsInBhdGNoTm9kZSIsIm9sZE5vZGUiLCJuZXdWYWx1ZSIsIm1hcmtlciIsImRhdGEiLCJuZXdOb2RlIiwicmVzb2x2ZWROb2RlIiwicGF0Y2hBdHRyaWJ1dGUiLCJvbGRWYWwiLCJuZXdWYWwiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJ0b0xvd2VyQ2FzZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwic3R5bGUiLCJjc3NUZXh0Iiwia2V5Iiwic2V0UHJvcGVydHkiLCJtYXRjaGVyUmUiLCJub2RlQ29udGVudFJlIiwiaGFzSW50ZXJwb2xhdGlvbiIsImluZGV4T2YiLCJpbnRlcnBvbGF0ZSIsInRwbCIsImFsbCIsInRva2VuIiwidHJpbSIsImdldFRva2VucyIsInRva2VucyIsImFkZEJpbmRpbmciLCJiaW5kaW5ncyIsImJpbmRpbmciLCJhdHRyaWJ1dGVCaW5kaW5nIiwiYXR0ciIsInRleHQiLCJpc0V2ZW50Iiwib2xkVmFsdWUiLCJlbWl0IiwiZXZlcnkiLCJjb250YWlucyIsIm5vZGVCaW5kaW5nIiwicGFyZW50Tm9kZSIsInBhcnNlQXR0cmlidXRlIiwicGFyc2VOb2RlIiwic3Vic3RpdHV0ZSIsInBhcnNlVGVtcGxhdGUiLCJyZXBsYWNlV2l0aCIsImF0dHJpYnV0ZXMiLCJoYXNDaGlsZE5vZGVzIiwiVGVtcGxhciIsIm1vdW50ZWQiLCJzZXQiLCJpc01vdW50ZWQiLCJnZXRSb290IiwiX3RoaXMiLCJPYmplY3QiLCJrZXlzIiwiX3RoaXMyIiwib24iLCJfdGhpczMiLCJyZW1vdmUiLCJzZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ0cGxOb2RlcyIsImZpbHRlciIsInNvbWUiLCJ0cGxOb2RlIl0sIm1hcHBpbmdzIjoibzlCQUF5RkEsQ0FBQUEsTUNBcEVDLGlEQUNILHdCQUFBLE1BQ0xDLE9BQVMsbURBR2ZDLEVBQU1DLEVBQVUsSUFDWEMsQ0FBQUEsQ0FBUyxDQUFHLEtBQUtILE1BQUwsQ0FBWUMsQ0FBWixFQUNaRSxTQUFBQSxDQUZXLEdBR1hBLENBQVMsQ0FBRyxFQUhELE1BSU5ILE9BQU9DLEdBQVFFLENBSlQsRUFNZkEsQ0FBUyxDQUFDQyxJQUFWRCxDQUFlRCxDQUFmQyxpQ0FHR0Ys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