HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/slenders/slenders.nl/wwwroot/js/site/vendor.js
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{1:function(t,e,i){i("yLV6"),t.exports=i("eCb9")},eCb9:function(t,e){!function(){"use strict";if("undefined"!=typeof window){var t=window.navigator.userAgent.match(/Edge\/(\d{2})\./),e=!!t&&16<=parseInt(t[1],10);if("objectFit"in document.documentElement.style==0||e){var i=function(t,e,i){var n,r,s,o,a;if((i=i.split(" ")).length<2&&(i[1]=i[0]),"x"===t)n=i[0],r=i[1],s="left",o="right",a=e.clientWidth;else{if("y"!==t)return;n=i[1],r=i[0],s="top",o="bottom",a=e.clientHeight}if(n!==s&&r!==s){if(n!==o&&r!==o)return"center"===n||"50%"===n?(e.style[s]="50%",void(e.style["margin-"+s]=a/-2+"px")):void(0<=n.indexOf("%")?(n=parseInt(n))<50?(e.style[s]=n+"%",e.style["margin-"+s]=a*(n/-100)+"px"):(n=100-n,e.style[o]=n+"%",e.style["margin-"+o]=a*(n/-100)+"px"):e.style[s]=n);e.style[o]="0"}else e.style[s]="0"},n=function(t){var e=t.dataset?t.dataset.objectFit:t.getAttribute("data-object-fit"),n=t.dataset?t.dataset.objectPosition:t.getAttribute("data-object-position");e=e||"cover",n=n||"50% 50%";var r=t.parentNode;return function(t){var e=window.getComputedStyle(t,null),i=e.getPropertyValue("position"),n=e.getPropertyValue("overflow"),r=e.getPropertyValue("display");i&&"static"!==i||(t.style.position="relative"),"hidden"!==n&&(t.style.overflow="hidden"),r&&"inline"!==r||(t.style.display="block"),0===t.clientHeight&&(t.style.height="100%"),-1===t.className.indexOf("object-fit-polyfill")&&(t.className=t.className+" object-fit-polyfill")}(r),function(t){var e=window.getComputedStyle(t,null),i={"max-width":"none","max-height":"none","min-width":"0px","min-height":"0px",top:"auto",right:"auto",bottom:"auto",left:"auto","margin-top":"0px","margin-right":"0px","margin-bottom":"0px","margin-left":"0px"};for(var n in i)e.getPropertyValue(n)!==i[n]&&(t.style[n]=i[n])}(t),t.style.position="absolute",t.style.width="auto",t.style.height="auto","scale-down"===e&&(e=t.clientWidth<r.clientWidth&&t.clientHeight<r.clientHeight?"none":"contain"),"none"===e?(i("x",t,n),void i("y",t,n)):"fill"===e?(t.style.width="100%",t.style.height="100%",i("x",t,n),void i("y",t,n)):(t.style.height="100%",void("cover"===e&&t.clientWidth>r.clientWidth||"contain"===e&&t.clientWidth<r.clientWidth?(t.style.top="0",t.style.marginTop="0",i("x",t,n)):(t.style.width="100%",t.style.height="auto",t.style.left="0",t.style.marginLeft="0",i("y",t,n))))},r=function(t){if(void 0===t||t instanceof Event)t=document.querySelectorAll("[data-object-fit]");else if(t&&t.nodeName)t=[t];else{if("object"!=typeof t||!t.length||!t[0].nodeName)return!1;t=t}for(var i=0;i<t.length;i++)if(t[i].nodeName){var r=t[i].nodeName.toLowerCase();if("img"===r){if(e)continue;t[i].complete?n(t[i]):t[i].addEventListener("load",(function(){n(this)}))}else"video"===r?0<t[i].readyState?n(t[i]):t[i].addEventListener("loadedmetadata",(function(){n(this)})):n(t[i])}return!0};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",r):r(),window.addEventListener("resize",r),window.objectFitPolyfill=r}else window.objectFitPolyfill=function(){return!1}}}()},yLV6:function(t,e,i){var n;!function(r,s,o,a){"use strict";var h,u=["","webkit","Moz","MS","ms","o"],c=s.createElement("div"),l="function",p=Math.round,f=Math.abs,d=Date.now;function v(t,e,i){return setTimeout(b(t,i),e)}function m(t,e,i){return!!Array.isArray(t)&&(g(t,i[e],i),!0)}function g(t,e,i){var n;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(n=0;n<t.length;)e.call(i,t[n],n,t),n++;else for(n in t)t.hasOwnProperty(n)&&e.call(i,t[n],n,t)}function y(t,e,i){var n="DEPRECATED METHOD: "+e+"\n"+i+" AT \n";return function(){var e=new Error("get-stack-trace"),i=e&&e.stack?e.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=r.console&&(r.console.warn||r.console.log);return s&&s.call(r.console,n,i),t.apply(this,arguments)}}h="function"!=typeof Object.assign?function(t){if(t===a||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),i=1;i<arguments.length;i++){var n=arguments[i];if(n!==a&&null!==n)for(var r in n)n.hasOwnProperty(r)&&(e[r]=n[r])}return e}:Object.assign;var T=y((function(t,e,i){for(var n=Object.keys(e),r=0;r<n.length;)(!i||i&&t[n[r]]===a)&&(t[n[r]]=e[n[r]]),r++;return t}),"extend","Use `assign`."),E=y((function(t,e){return T(t,e,!0)}),"merge","Use `assign`.");function w(t,e,i){var n,r=e.prototype;(n=t.prototype=Object.create(r)).constructor=t,n._super=r,i&&h(n,i)}function b(t,e){return function(){return t.apply(e,arguments)}}function x(t,e){return typeof t==l?t.apply(e&&e[0]||a,e):t}function I(t,e){return t===a?e:t}function A(t,e,i){g(_(e),(function(e){t.addEventListener(e,i,!1)}))}function C(t,e,i){g(_(e),(function(e){t.removeEventListener(e,i,!1)}))}function P(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function S(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function D(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var n=0;n<t.length;){if(i&&t[n][i]==e||!i&&t[n]===e)return n;n++}return-1}function N(t){return Array.prototype.slice.call(t,0)}function O(t,e,i){for(var n=[],r=[],s=0;s<t.length;){var o=e?t[s][e]:t[s];D(r,o)<0&&n.push(t[s]),r[s]=o,s++}return i&&(n=e?n.sort((function(t,i){return t[e]>i[e]})):n.sort()),n}function M(t,e){for(var i,n,r=e[0].toUpperCase()+e.slice(1),s=0;s<u.length;){if((n=(i=u[s])?i+r:e)in t)return n;s++}return a}var R=1;function z(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow||r}var X="ontouchstart"in r,Y=M(r,"PointerEvent")!==a,F=X&&/mobile|tablet|ip(ad|hone|od)|android/i.test(navigator.userAgent),W=25,L=1,j=2,k=4,q=8,H=1,V=2,U=4,G=8,Z=16,B=V|U,J=G|Z,$=B|J,K=["x","y"],Q=["clientX","clientY"];function tt(t,e){var i=this;this.manager=t,this.callback=e,this.element=t.element,this.target=t.options.inputTarget,this.domHandler=function(e){x(t.options.enable,[t])&&i.handler(e)},this.init()}function et(t,e,i){var n=i.pointers.length,r=i.changedPointers.length,s=e&L&&n-r==0,o=e&(k|q)&&n-r==0;i.isFirst=!!s,i.isFinal=!!o,s&&(t.session={}),i.eventType=e,function(t,e){var i=t.session,n=e.pointers,r=n.length;i.firstInput||(i.firstInput=it(e));r>1&&!i.firstMultiple?i.firstMultiple=it(e):1===r&&(i.firstMultiple=!1);var s=i.firstInput,o=i.firstMultiple,h=o?o.center:s.center,u=e.center=nt(n);e.timeStamp=d(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=at(h,u),e.distance=ot(h,u),function(t,e){var i=e.center,n=t.offsetDelta||{},r=t.prevDelta||{},s=t.prevInput||{};e.eventType!==L&&s.eventType!==k||(r=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},n=t.offsetDelta={x:i.x,y:i.y});e.deltaX=r.x+(i.x-n.x),e.deltaY=r.y+(i.y-n.y)}(i,e),e.offsetDirection=st(e.deltaX,e.deltaY);var c=rt(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=o?(l=o.pointers,p=n,ot(p[0],p[1],Q)/ot(l[0],l[1],Q)):1,e.rotation=o?function(t,e){return at(e[1],e[0],Q)+at(t[1],t[0],Q)}(o.pointers,n):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,function(t,e){var i,n,r,s,o=t.lastInterval||e,h=e.timeStamp-o.timeStamp;if(e.eventType!=q&&(h>W||o.velocity===a)){var u=e.deltaX-o.deltaX,c=e.deltaY-o.deltaY,l=rt(h,u,c);n=l.x,r=l.y,i=f(l.x)>f(l.y)?l.x:l.y,s=st(u,c),t.lastInterval=e}else i=o.velocity,n=o.velocityX,r=o.velocityY,s=o.direction;e.velocity=i,e.velocityX=n,e.velocityY=r,e.direction=s}(i,e);var l,p;var v=t.element;P(e.srcEvent.target,v)&&(v=e.srcEvent.target);e.target=v}(t,i),t.emit("hammer.input",i),t.recognize(i),t.session.prevInput=i}function it(t){for(var e=[],i=0;i<t.pointers.length;)e[i]={clientX:p(t.pointers[i].clientX),clientY:p(t.pointers[i].clientY)},i++;return{timeStamp:d(),pointers:e,center:nt(e),deltaX:t.deltaX,deltaY:t.deltaY}}function nt(t){var e=t.length;if(1===e)return{x:p(t[0].clientX),y:p(t[0].clientY)};for(var i=0,n=0,r=0;r<e;)i+=t[r].clientX,n+=t[r].clientY,r++;return{x:p(i/e),y:p(n/e)}}function rt(t,e,i){return{x:e/t||0,y:i/t||0}}function st(t,e){return t===e?H:f(t)>=f(e)?t<0?V:U:e<0?G:Z}function ot(t,e,i){i||(i=K);var n=e[i[0]]-t[i[0]],r=e[i[1]]-t[i[1]];return Math.sqrt(n*n+r*r)}function at(t,e,i){i||(i=K);var n=e[i[0]]-t[i[0]],r=e[i[1]]-t[i[1]];return 180*Math.atan2(r,n)/Math.PI}tt.prototype={handler:function(){},init:function(){this.evEl&&A(this.element,this.evEl,this.domHandler),this.evTarget&&A(this.target,this.evTarget,this.domHandler),this.evWin&&A(z(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(z(this.element),this.evWin,this.domHandler)}};var ht={mousedown:L,mousemove:j,mouseup:k},ut="mousedown",ct="mousemove mouseup";function lt(){this.evEl=ut,this.evWin=ct,this.pressed=!1,tt.apply(this,arguments)}w(lt,tt,{handler:function(t){var e=ht[t.type];e&L&&0===t.button&&(this.pressed=!0),e&j&&1!==t.which&&(e=k),this.pressed&&(e&k&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:"mouse",srcEvent:t}))}});var pt={pointerdown:L,pointermove:j,pointerup:k,pointercancel:q,pointerout:q},ft={2:"touch",3:"pen",4:"mouse",5:"kinect"},dt="pointerdown",vt="pointermove pointerup pointercancel";function mt(){this.evEl=dt,this.evWin=vt,tt.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}r.MSPointerEvent&&!r.PointerEvent&&(dt="MSPointerDown",vt="MSPointerMove MSPointerUp MSPointerCancel"),w(mt,tt,{handler:function(t){var e=this.store,i=!1,n=t.type.toLowerCase().replace("ms",""),r=pt[n],s=ft[t.pointerType]||t.pointerType,o="touch"==s,a=D(e,t.pointerId,"pointerId");r&L&&(0===t.button||o)?a<0&&(e.push(t),a=e.length-1):r&(k|q)&&(i=!0),a<0||(e[a]=t,this.callback(this.manager,r,{pointers:e,changedPointers:[t],pointerType:s,srcEvent:t}),i&&e.splice(a,1))}});var gt={touchstart:L,touchmove:j,touchend:k,touchcancel:q},yt="touchstart",Tt="touchstart touchmove touchend touchcancel";function Et(){this.evTarget=yt,this.evWin=Tt,this.started=!1,tt.apply(this,arguments)}function wt(t,e){var i=N(t.touches),n=N(t.changedTouches);return e&(k|q)&&(i=O(i.concat(n),"identifier",!0)),[i,n]}w(Et,tt,{handler:function(t){var e=gt[t.type];if(e===L&&(this.started=!0),this.started){var i=wt.call(this,t,e);e&(k|q)&&i[0].length-i[1].length==0&&(this.started=!1),this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:"touch",srcEvent:t})}}});var bt={touchstart:L,touchmove:j,touchend:k,touchcancel:q},xt="touchstart touchmove touchend touchcancel";function It(){this.evTarget=xt,this.targetIds={},tt.apply(this,arguments)}function At(t,e){var i=N(t.touches),n=this.targetIds;if(e&(L|j)&&1===i.length)return n[i[0].identifier]=!0,[i,i];var r,s,o=N(t.changedTouches),a=[],h=this.target;if(s=i.filter((function(t){return P(t.target,h)})),e===L)for(r=0;r<s.length;)n[s[r].identifier]=!0,r++;for(r=0;r<o.length;)n[o[r].identifier]&&a.push(o[r]),e&(k|q)&&delete n[o[r].identifier],r++;return a.length?[O(s.concat(a),"identifier",!0),a]:void 0}w(It,tt,{handler:function(t){var e=bt[t.type],i=At.call(this,t,e);i&&this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:"touch",srcEvent:t})}});var Ct=2500,Pt=25;function St(){tt.apply(this,arguments);var t=b(this.handler,this);this.touch=new It(this.manager,t),this.mouse=new lt(this.manager,t),this.primaryTouch=null,this.lastTouches=[]}function _t(t,e){t&L?(this.primaryTouch=e.changedPointers[0].identifier,Dt.call(this,e)):t&(k|q)&&Dt.call(this,e)}function Dt(t){var e=t.changedPointers[0];if(e.identifier===this.primaryTouch){var i={x:e.clientX,y:e.clientY};this.lastTouches.push(i);var n=this.lastTouches;setTimeout((function(){var t=n.indexOf(i);t>-1&&n.splice(t,1)}),Ct)}}function Nt(t){for(var e=t.srcEvent.clientX,i=t.srcEvent.clientY,n=0;n<this.lastTouches.length;n++){var r=this.lastTouches[n],s=Math.abs(e-r.x),o=Math.abs(i-r.y);if(s<=Pt&&o<=Pt)return!0}return!1}w(St,tt,{handler:function(t,e,i){var n="touch"==i.pointerType,r="mouse"==i.pointerType;if(!(r&&i.sourceCapabilities&&i.sourceCapabilities.firesTouchEvents)){if(n)_t.call(this,e,i);else if(r&&Nt.call(this,i))return;this.callback(t,e,i)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Ot=M(c.style,"touchAction"),Mt=Ot!==a,Rt="auto",zt="manipulation",Xt="none",Yt="pan-x",Ft="pan-y",Wt=function(){if(!Mt)return!1;var t={},e=r.CSS&&r.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach((function(i){t[i]=!e||r.CSS.supports("touch-action",i)})),t}();function Lt(t,e){this.manager=t,this.set(e)}Lt.prototype={set:function(t){"compute"==t&&(t=this.compute()),Mt&&this.manager.element.style&&Wt[t]&&(this.manager.element.style[Ot]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return g(this.manager.recognizers,(function(e){x(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))})),function(t){if(S(t,Xt))return Xt;var e=S(t,Yt),i=S(t,Ft);if(e&&i)return Xt;if(e||i)return e?Yt:Ft;if(S(t,zt))return zt;return Rt}(t.join(" "))},preventDefaults:function(t){var e=t.srcEvent,i=t.offsetDirection;if(this.manager.session.prevented)e.preventDefault();else{var n=this.actions,r=S(n,Xt)&&!Wt[Xt],s=S(n,Ft)&&!Wt[Ft],o=S(n,Yt)&&!Wt[Yt];if(r){var a=1===t.pointers.length,h=t.distance<2,u=t.deltaTime<250;if(a&&h&&u)return}if(!o||!s)return r||s&&i&B||o&&i&J?this.preventSrc(e):void 0}},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var jt=1,kt=2,qt=4,Ht=8,Vt=Ht,Ut=16;function Gt(t){this.options=h({},this.defaults,t||{}),this.id=R++,this.manager=null,this.options.enable=I(this.options.enable,!0),this.state=jt,this.simultaneous={},this.requireFail=[]}function Zt(t){return t&Ut?"cancel":t&Ht?"end":t&qt?"move":t&kt?"start":""}function Bt(t){return t==Z?"down":t==G?"up":t==V?"left":t==U?"right":""}function Jt(t,e){var i=e.manager;return i?i.get(t):t}function $t(){Gt.apply(this,arguments)}function Kt(){$t.apply(this,arguments),this.pX=null,this.pY=null}function Qt(){$t.apply(this,arguments)}function te(){Gt.apply(this,arguments),this._timer=null,this._input=null}function ee(){$t.apply(this,arguments)}function ie(){$t.apply(this,arguments)}function ne(){Gt.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function re(t,e){return(e=e||{}).recognizers=I(e.recognizers,re.defaults.preset),new se(t,e)}Gt.prototype={defaults:{},set:function(t){return h(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(m(t,"recognizeWith",this))return this;var e=this.simultaneous;return e[(t=Jt(t,this)).id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return m(t,"dropRecognizeWith",this)?this:(t=Jt(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(m(t,"requireFailure",this))return this;var e=this.requireFail;return-1===D(e,t=Jt(t,this))&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(m(t,"dropRequireFailure",this))return this;t=Jt(t,this);var e=D(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){var e=this,i=this.state;function n(i){e.manager.emit(i,t)}i<Ht&&n(e.options.event+Zt(i)),n(e.options.event),t.additionalEvent&&n(t.additionalEvent),i>=Ht&&n(e.options.event+Zt(i))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;t<this.requireFail.length;){if(!(this.requireFail[t].state&(32|jt)))return!1;t++}return!0},recognize:function(t){var e=h({},t);if(!x(this.options.enable,[this,e]))return this.reset(),void(this.state=32);this.state&(Vt|Ut|32)&&(this.state=jt),this.state=this.process(e),this.state&(kt|qt|Ht|Ut)&&this.tryEmit(e)},process:function(t){},getTouchAction:function(){},reset:function(){}},w($t,Gt,{defaults:{pointers:1},attrTest:function(t){var e=this.options.pointers;return 0===e||t.pointers.length===e},process:function(t){var e=this.state,i=t.eventType,n=e&(kt|qt),r=this.attrTest(t);return n&&(i&q||!r)?e|Ut:n||r?i&k?e|Ht:e&kt?e|qt:kt:32}}),w(Kt,$t,{defaults:{event:"pan",threshold:10,pointers:1,direction:$},getTouchAction:function(){var t=this.options.direction,e=[];return t&B&&e.push(Ft),t&J&&e.push(Yt),e},directionTest:function(t){var e=this.options,i=!0,n=t.distance,r=t.direction,s=t.deltaX,o=t.deltaY;return r&e.direction||(e.direction&B?(r=0===s?H:s<0?V:U,i=s!=this.pX,n=Math.abs(t.deltaX)):(r=0===o?H:o<0?G:Z,i=o!=this.pY,n=Math.abs(t.deltaY))),t.direction=r,i&&n>e.threshold&&r&e.direction},attrTest:function(t){return $t.prototype.attrTest.call(this,t)&&(this.state&kt||!(this.state&kt)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=Bt(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),w(Qt,$t,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[Xt]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&kt)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),w(te,Gt,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[Rt]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,n=t.distance<e.threshold,r=t.deltaTime>e.time;if(this._input=t,!n||!i||t.eventType&(k|q)&&!r)this.reset();else if(t.eventType&L)this.reset(),this._timer=v((function(){this.state=Vt,this.tryEmit()}),e.time,this);else if(t.eventType&k)return Vt;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===Vt&&(t&&t.eventType&k?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),w(ee,$t,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[Xt]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&kt)}}),w(ie,$t,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:B|J,pointers:1},getTouchAction:function(){return Kt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(B|J)?e=t.overallVelocity:i&B?e=t.overallVelocityX:i&J&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&k},emit:function(t){var e=Bt(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),w(ne,Gt,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[zt]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,n=t.distance<e.threshold,r=t.deltaTime<e.time;if(this.reset(),t.eventType&L&&0===this.count)return this.failTimeout();if(n&&r&&i){if(t.eventType!=k)return this.failTimeout();var s=!this.pTime||t.timeStamp-this.pTime<e.interval,o=!this.pCenter||ot(this.pCenter,t.center)<e.posThreshold;if(this.pTime=t.timeStamp,this.pCenter=t.center,o&&s?this.count+=1:this.count=1,this._input=t,0===this.count%e.taps)return this.hasRequireFailures()?(this._timer=v((function(){this.state=Vt,this.tryEmit()}),e.interval,this),kt):Vt}return 32},failTimeout:function(){return this._timer=v((function(){this.state=32}),this.options.interval,this),32},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==Vt&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),re.VERSION="2.0.7",re.defaults={domEvents:!1,touchAction:"compute",enable:!0,inputTarget:null,inputClass:null,preset:[[ee,{enable:!1}],[Qt,{enable:!1},["rotate"]],[ie,{direction:B}],[Kt,{direction:B},["swipe"]],[ne],[ne,{event:"doubletap",taps:2},["tap"]],[te]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};function se(t,e){var i;this.options=h({},re.defaults,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=new((i=this).options.inputClass||(Y?mt:F?It:X?St:lt))(i,et),this.touchAction=new Lt(this,this.options.touchAction),oe(this,!0),g(this.options.recognizers,(function(t){var e=this.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])}),this)}function oe(t,e){var i,n=t.element;n.style&&(g(t.options.cssProps,(function(r,s){i=M(n.style,s),e?(t.oldCssProps[i]=n.style[i],n.style[i]=r):n.style[i]=t.oldCssProps[i]||""})),e||(t.oldCssProps={}))}se.prototype={set:function(t){return h(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},stop:function(t){this.session.stopped=t?2:1},recognize:function(t){var e=this.session;if(!e.stopped){var i;this.touchAction.preventDefaults(t);var n=this.recognizers,r=e.curRecognizer;(!r||r&&r.state&Vt)&&(r=e.curRecognizer=null);for(var s=0;s<n.length;)i=n[s],2===e.stopped||r&&i!=r&&!i.canRecognizeWith(r)?i.reset():i.recognize(t),!r&&i.state&(kt|qt|Ht)&&(r=e.curRecognizer=i),s++}},get:function(t){if(t instanceof Gt)return t;for(var e=this.recognizers,i=0;i<e.length;i++)if(e[i].options.event==t)return e[i];return null},add:function(t){if(m(t,"add",this))return this;var e=this.get(t.options.event);return e&&this.remove(e),this.recognizers.push(t),t.manager=this,this.touchAction.update(),t},remove:function(t){if(m(t,"remove",this))return this;if(t=this.get(t)){var e=this.recognizers,i=D(e,t);-1!==i&&(e.splice(i,1),this.touchAction.update())}return this},on:function(t,e){if(t!==a&&e!==a){var i=this.handlers;return g(_(t),(function(t){i[t]=i[t]||[],i[t].push(e)})),this}},off:function(t,e){if(t!==a){var i=this.handlers;return g(_(t),(function(t){e?i[t]&&i[t].splice(D(i[t],e),1):delete i[t]})),this}},emit:function(t,e){this.options.domEvents&&function(t,e){var i=s.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e,e.target.dispatchEvent(i)}(t,e);var i=this.handlers[t]&&this.handlers[t].slice();if(i&&i.length){e.type=t,e.preventDefault=function(){e.srcEvent.preventDefault()};for(var n=0;n<i.length;)i[n](e),n++}},destroy:function(){this.element&&oe(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},h(re,{INPUT_START:L,INPUT_MOVE:j,INPUT_END:k,INPUT_CANCEL:q,STATE_POSSIBLE:jt,STATE_BEGAN:kt,STATE_CHANGED:qt,STATE_ENDED:Ht,STATE_RECOGNIZED:Vt,STATE_CANCELLED:Ut,STATE_FAILED:32,DIRECTION_NONE:H,DIRECTION_LEFT:V,DIRECTION_RIGHT:U,DIRECTION_UP:G,DIRECTION_DOWN:Z,DIRECTION_HORIZONTAL:B,DIRECTION_VERTICAL:J,DIRECTION_ALL:$,Manager:se,Input:tt,TouchAction:Lt,TouchInput:It,MouseInput:lt,PointerEventInput:mt,TouchMouseInput:St,SingleTouchInput:Et,Recognizer:Gt,AttrRecognizer:$t,Tap:ne,Pan:Kt,Swipe:ie,Pinch:Qt,Rotate:ee,Press:te,on:A,off:C,each:g,merge:E,extend:T,assign:h,inherit:w,bindFn:b,prefixed:M}),(void 0!==r?r:"undefined"!=typeof self?self:{}).Hammer=re,(n=function(){return re}.call(e,i,e,t))===a||(t.exports=n)}(window,document)}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0Rml0UG9seWZpbGwvZGlzdC9vYmplY3RGaXRQb2x5ZmlsbC5taW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hhbW1lcmpzL2hhbW1lci5qcyJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJ0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF0Y2giLCJuIiwicGFyc2VJbnQiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsInN0eWxlIiwibyIsImUiLCJpIiwibCIsImEiLCJkIiwic3BsaXQiLCJsZW5ndGgiLCJjbGllbnRXaWR0aCIsImNsaWVudEhlaWdodCIsImluZGV4T2YiLCJkYXRhc2V0Iiwib2JqZWN0Rml0IiwiZ2V0QXR0cmlidXRlIiwib2JqZWN0UG9zaXRpb24iLCJwYXJlbnROb2RlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImdldFByb3BlcnR5VmFsdWUiLCJwb3NpdGlvbiIsIm92ZXJmbG93IiwiZGlzcGxheSIsImhlaWdodCIsImNsYXNzTmFtZSIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCIsIndpZHRoIiwibWFyZ2luVG9wIiwibWFyZ2luTGVmdCIsIkV2ZW50IiwicXVlcnlTZWxlY3RvckFsbCIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJjb21wbGV0ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0aGlzIiwicmVhZHlTdGF0ZSIsIm9iamVjdEZpdFBvbHlmaWxsIiwiZXhwb3J0TmFtZSIsInVuZGVmaW5lZCIsImFzc2lnbiIsIlZFTkRPUl9QUkVGSVhFUyIsIlRFU1RfRUxFTUVOVCIsImNyZWF0ZUVsZW1lbnQiLCJUWVBFX0ZVTkNUSU9OIiwicm91bmQiLCJNYXRoIiwiYWJzIiwibm93IiwiRGF0ZSIsInNldFRpbWVvdXRDb250ZXh0IiwiZm4iLCJ0aW1lb3V0IiwiY29udGV4dCIsInNldFRpbWVvdXQiLCJiaW5kRm4iLCJpbnZva2VBcnJheUFyZyIsImFyZyIsIkFycmF5IiwiaXNBcnJheSIsImVhY2giLCJvYmoiLCJpdGVyYXRvciIsImZvckVhY2giLCJjYWxsIiwiaGFzT3duUHJvcGVydHkiLCJkZXByZWNhdGUiLCJtZXRob2QiLCJuYW1lIiwibWVzc2FnZSIsImRlcHJlY2F0aW9uTWVzc2FnZSIsIkVycm9yIiwic3RhY2siLCJyZXBsYWNlIiwibG9nIiwiY29uc29sZSIsIndhcm4iLCJhcHBseSIsImFyZ3VtZW50cyIsIk9iamVjdCIsInRhcmdldCIsIlR5cGVFcnJvciIsIm91dHB1dCIsImluZGV4Iiwic291cmNlIiwibmV4dEtleSIsImV4dGVuZCIsImRlc3QiLCJzcmMiLCJtZXJnZSIsImtleXMiLCJpbmhlcml0IiwiY2hpbGQiLCJiYXNlIiwicHJvcGVydGllcyIsImNoaWxkUCIsImJhc2VQIiwicHJvdG90eXBlIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJfc3VwZXIiLCJib29sT3JGbiIsInZhbCIsImFyZ3MiLCJpZlVuZGVmaW5lZCIsInZhbDEiLCJ2YWwyIiwiYWRkRXZlbnRMaXN0ZW5lcnMiLCJ0eXBlcyIsImhhbmRsZXIiLCJzcGxpdFN0ciIsInR5cGUiLCJyZW1vdmVFdmVudExpc3RlbmVycyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJoYXNQYXJlbnQiLCJub2RlIiwicGFyZW50IiwiaW5TdHIiLCJzdHIiLCJmaW5kIiwidHJpbSIsImluQXJyYXkiLCJmaW5kQnlLZXkiLCJ0b0FycmF5Iiwic2xpY2UiLCJ1bmlxdWVBcnJheSIsImtleSIsInNvcnQiLCJyZXN1bHRzIiwidmFsdWVzIiwicHVzaCIsImIiLCJwcmVmaXhlZCIsInByb3BlcnR5IiwicHJlZml4IiwicHJvcCIsImNhbWVsUHJvcCIsInRvVXBwZXJDYXNlIiwiX3VuaXF1ZUlkIiwiZ2V0V2luZG93Rm9yRWxlbWVudCIsImVsZW1lbnQiLCJkb2MiLCJvd25lckRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJwYXJlbnRXaW5kb3ciLCJTVVBQT1JUX1RPVUNIIiwiU1VQUE9SVF9QT0lOVEVSX0VWRU5UUyIsIlNVUFBPUlRfT05MWV9UT1VDSCIsInRlc3QiLCJDT01QVVRFX0lOVEVSVkFMIiwiSU5QVVRfU1RBUlQiLCJJTlBVVF9NT1ZFIiwiSU5QVVRfRU5EIiwiSU5QVVRfQ0FOQ0VMIiwiRElSRUNUSU9OX05PTkUiLCJESVJFQ1RJT05fTEVGVCIsIkRJUkVDVElPTl9SSUdIVCIsIkRJUkVDVElPTl9VUCIsIkRJUkVDVElPTl9ET1dOIiwiRElSRUNUSU9OX0hPUklaT05UQUwiLCJESVJFQ1RJT05fVkVSVElDQUwiLCJESVJFQ1RJT05fQUxMIiwiUFJPUFNfWFkiLCJQUk9QU19DTElFTlRfWFkiLCJJbnB1dCIsIm1hbmFnZXIiLCJjYWxsYmFjayIsInNlbGYiLCJvcHRpb25zIiwiaW5wdXRUYXJnZXQiLCJkb21IYW5kbGVyIiwiZXYiLCJlbmFibGUiLCJpbml0IiwiaW5wdXRIYW5kbGVyIiwiZXZlbnRUeXBlIiwiaW5wdXQiLCJwb2ludGVyc0xlbiIsInBvaW50ZXJzIiwiY2hhbmdlZFBvaW50ZXJzTGVuIiwiY2hhbmdlZFBvaW50ZXJzIiwiaXNGaXJzdCIsImlzRmluYWwiLCJzZXNzaW9uIiwicG9pbnRlcnNMZW5ndGgiLCJmaXJzdElucHV0Iiwic2ltcGxlQ2xvbmVJbnB1dERhdGEiLCJmaXJzdE11bHRpcGxlIiwib2Zmc2V0Q2VudGVyIiwiY2VudGVyIiwiZ2V0Q2VudGVyIiwidGltZVN0YW1wIiwiZGVsdGFUaW1lIiwiYW5nbGUiLCJnZXRBbmdsZSIsImRpc3RhbmNlIiwiZ2V0RGlzdGFuY2UiLCJvZmZzZXQiLCJvZmZzZXREZWx0YSIsInByZXZEZWx0YSIsInByZXZJbnB1dCIsIngiLCJkZWx0YVgiLCJ5IiwiZGVsdGFZIiwiY29tcHV0ZURlbHRhWFkiLCJvZmZzZXREaXJlY3Rpb24iLCJnZXREaXJlY3Rpb24iLCJvdmVyYWxsVmVsb2NpdHkiLCJnZXRWZWxvY2l0eSIsIm92ZXJhbGxWZWxvY2l0eVgiLCJvdmVyYWxsVmVsb2NpdHlZIiwic2NhbGUiLCJzdGFydCIsImVuZCIsInJvdGF0aW9uIiwiZ2V0Um90YXRpb24iLCJtYXhQb2ludGVycyIsInZlbG9jaXR5IiwidmVsb2NpdHlYIiwidmVsb2NpdHlZIiwiZGlyZWN0aW9uIiwibGFzdCIsImxhc3RJbnRlcnZhbCIsInYiLCJjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEiLCJzcmNFdmVudCIsImNvbXB1dGVJbnB1dERhdGEiLCJlbWl0IiwicmVjb2duaXplIiwiY2xpZW50WCIsImNsaWVudFkiLCJwMSIsInAyIiwicHJvcHMiLCJzcXJ0IiwiYXRhbjIiLCJQSSIsImV2RWwiLCJldlRhcmdldCIsImV2V2luIiwiZGVzdHJveSIsIk1PVVNFX0lOUFVUX01BUCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJNT1VTRV9FTEVNRU5UX0VWRU5UUyIsIk1PVVNFX1dJTkRPV19FVkVOVFMiLCJNb3VzZUlucHV0IiwicHJlc3NlZCIsImJ1dHRvbiIsIndoaWNoIiwicG9pbnRlclR5cGUiLCJQT0lOVEVSX0lOUFVUX01BUCIsInBvaW50ZXJkb3duIiwicG9pbnRlcm1vdmUiLCJwb2ludGVydXAiLCJwb2ludGVyY2FuY2VsIiwicG9pbnRlcm91dCIsIklFMTBfUE9JTlRFUl9UWVBFX0VOVU0iLCIyIiwiMyIsIjQiLCI1IiwiUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyIsIlBPSU5URVJfV0lORE9XX0VWRU5UUyIsIlBvaW50ZXJFdmVudElucHV0Iiwic3RvcmUiLCJwb2ludGVyRXZlbnRzIiwiTVNQb2ludGVyRXZlbnQiLCJQb2ludGVyRXZlbnQiLCJyZW1vdmVQb2ludGVyIiwiZXZlbnRUeXBlTm9ybWFsaXplZCIsImlzVG91Y2giLCJzdG9yZUluZGV4IiwicG9pbnRlcklkIiwic3BsaWNlIiwiU0lOR0xFX1RPVUNIX0lOUFVUX01BUCIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsInRvdWNoY2FuY2VsIiwiU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFMiLCJTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyIsIlNpbmdsZVRvdWNoSW5wdXQiLCJzdGFydGVkIiwibm9ybWFsaXplU2luZ2xlVG91Y2hlcyIsImFsbCIsInRvdWNoZXMiLCJjaGFuZ2VkIiwiY2hhbmdlZFRvdWNoZXMiLCJjb25jYXQiLCJUT1VDSF9JTlBVVF9NQVAiLCJUT1VDSF9UQVJHRVRfRVZFTlRTIiwiVG91Y2hJbnB1dCIsInRhcmdldElkcyIsImdldFRvdWNoZXMiLCJhbGxUb3VjaGVzIiwiaWRlbnRpZmllciIsInRhcmdldFRvdWNoZXMiLCJjaGFuZ2VkVGFyZ2V0VG91Y2hlcyIsImZpbHRlciIsInRvdWNoIiwiREVEVVBfVElNRU9VVCIsIkRFRFVQX0RJU1RBTkNFIiwiVG91Y2hNb3VzZUlucHV0IiwibW91c2UiLCJwcmltYXJ5VG91Y2giLCJsYXN0VG91Y2hlcyIsInJlY29yZFRvdWNoZXMiLCJldmVudERhdGEiLCJzZXRMYXN0VG91Y2giLCJsYXN0VG91Y2giLCJsdHMiLCJpc1N5bnRoZXRpY0V2ZW50IiwiZHgiLCJkeSIsImlucHV0RXZlbnQiLCJpbnB1dERhdGEiLCJpc01vdXNlIiwic291cmNlQ2FwYWJpbGl0aWVzIiwiZmlyZXNUb3VjaEV2ZW50cyIsIlBSRUZJWEVEX1RPVUNIX0FDVElPTiIsIk5BVElWRV9UT1VDSF9BQ1RJT04iLCJUT1VDSF9BQ1RJT05fQVVUTyIsIlRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT04iLCJUT1VDSF9BQ1RJT05fTk9ORSIsIlRPVUNIX0FDVElPTl9QQU5fWCIsIlRPVUNIX0FDVElPTl9QQU5fWSIsIlRPVUNIX0FDVElPTl9NQVAiLCJ0b3VjaE1hcCIsImNzc1N1cHBvcnRzIiwiQ1NTIiwic3VwcG9ydHMiLCJnZXRUb3VjaEFjdGlvblByb3BzIiwiVG91Y2hBY3Rpb24iLCJ2YWx1ZSIsInNldCIsImNvbXB1dGUiLCJhY3Rpb25zIiwidXBkYXRlIiwidG91Y2hBY3Rpb24iLCJyZWNvZ25pemVycyIsInJlY29nbml6ZXIiLCJnZXRUb3VjaEFjdGlvbiIsImhhc1BhblgiLCJoYXNQYW5ZIiwiY2xlYW5Ub3VjaEFjdGlvbnMiLCJqb2luIiwicHJldmVudERlZmF1bHRzIiwicHJldmVudGVkIiwicHJldmVudERlZmF1bHQiLCJoYXNOb25lIiwiaXNUYXBQb2ludGVyIiwiaXNUYXBNb3ZlbWVudCIsImlzVGFwVG91Y2hUaW1lIiwicHJldmVudFNyYyIsIlNUQVRFX1BPU1NJQkxFIiwiU1RBVEVfQkVHQU4iLCJTVEFURV9DSEFOR0VEIiwiU1RBVEVfRU5ERUQiLCJTVEFURV9SRUNPR05JWkVEIiwiU1RBVEVfQ0FOQ0VMTEVEIiwiUmVjb2duaXplciIsImRlZmF1bHRzIiwiaWQiLCJzdGF0ZSIsInNpbXVsdGFuZW91cyIsInJlcXVpcmVGYWlsIiwic3RhdGVTdHIiLCJkaXJlY3Rpb25TdHIiLCJnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyIiwib3RoZXJSZWNvZ25pemVyIiwiZ2V0IiwiQXR0clJlY29nbml6ZXIiLCJQYW5SZWNvZ25pemVyIiwicFgiLCJwWSIsIlBpbmNoUmVjb2duaXplciIsIlByZXNzUmVjb2duaXplciIsIl90aW1lciIsIl9pbnB1dCIsIlJvdGF0ZVJlY29nbml6ZXIiLCJTd2lwZVJlY29nbml6ZXIiLCJUYXBSZWNvZ25pemVyIiwicFRpbWUiLCJwQ2VudGVyIiwiY291bnQiLCJIYW1tZXIiLCJwcmVzZXQiLCJNYW5hZ2VyIiwicmVjb2duaXplV2l0aCIsImRyb3BSZWNvZ25pemVXaXRoIiwicmVxdWlyZUZhaWx1cmUiLCJkcm9wUmVxdWlyZUZhaWx1cmUiLCJoYXNSZXF1aXJlRmFpbHVyZXMiLCJjYW5SZWNvZ25pemVXaXRoIiwiZXZlbnQiLCJhZGRpdGlvbmFsRXZlbnQiLCJ0cnlFbWl0IiwiY2FuRW1pdCIsImlucHV0RGF0YUNsb25lIiwicmVzZXQiLCJwcm9jZXNzIiwiYXR0clRlc3QiLCJvcHRpb25Qb2ludGVycyIsImlzUmVjb2duaXplZCIsImlzVmFsaWQiLCJ0aHJlc2hvbGQiLCJkaXJlY3Rpb25UZXN0IiwiaGFzTW92ZWQiLCJpbk91dCIsInRpbWUiLCJ2YWxpZFBvaW50ZXJzIiwidmFsaWRNb3ZlbWVudCIsInZhbGlkVGltZSIsImNsZWFyVGltZW91dCIsInRhcHMiLCJpbnRlcnZhbCIsInBvc1RocmVzaG9sZCIsInZhbGlkVG91Y2hUaW1lIiwiZmFpbFRpbWVvdXQiLCJ2YWxpZEludGVydmFsIiwidmFsaWRNdWx0aVRhcCIsInRhcENvdW50IiwiVkVSU0lPTiIsImRvbUV2ZW50cyIsImlucHV0Q2xhc3MiLCJjc3NQcm9wcyIsInVzZXJTZWxlY3QiLCJ0b3VjaFNlbGVjdCIsInRvdWNoQ2FsbG91dCIsImNvbnRlbnRab29taW5nIiwidXNlckRyYWciLCJ0YXBIaWdobGlnaHRDb2xvciIsImhhbmRsZXJzIiwib2xkQ3NzUHJvcHMiLCJ0b2dnbGVDc3NQcm9wcyIsIml0ZW0iLCJhZGQiLCJzdG9wIiwiZm9yY2UiLCJzdG9wcGVkIiwiY3VyUmVjb2duaXplciIsImV4aXN0aW5nIiwicmVtb3ZlIiwib24iLCJldmVudHMiLCJvZmYiLCJkYXRhIiwiZ2VzdHVyZUV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJnZXN0dXJlIiwiZGlzcGF0Y2hFdmVudCIsInRyaWdnZXJEb21FdmVudCIsIlNUQVRFX0ZBSUxFRCIsIlRhcCIsIlBhbiIsIlN3aXBlIiwiUGluY2giLCJSb3RhdGUiLCJQcmVzcyJdLCJtYXBwaW5ncyI6IjhIQUFDLFdBQVcsYUFBYSxHQUFHLG9CQUFvQkEsT0FBTyxDQUFDLElBQUlDLEVBQUVELE9BQU9FLFVBQVVDLFVBQVVDLE1BQU0sbUJBQW1CQyxJQUFJSixHQUFHLElBQUlLLFNBQVNMLEVBQUUsR0FBRyxJQUFJLEdBQUssY0FBY00sU0FBU0MsZ0JBQWdCQyxPQUFPLEdBQUtKLEVBQUUsQ0FBQyxJQUFJSyxFQUFFLFNBQVNULEVBQUVVLEVBQUVDLEdBQUcsSUFBSVAsRUFBRUssRUFBRUcsRUFBRUMsRUFBRUMsRUFBRSxJQUFJSCxFQUFFQSxFQUFFSSxNQUFNLE1BQU1DLE9BQU8sSUFBSUwsRUFBRSxHQUFHQSxFQUFFLElBQUksTUFBTVgsRUFBRUks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aFosS0FBS29KLFFBQVUsR0FDZnBKLEtBQUs2SSxNQUFNaUUsVUFDWDlNLEtBQUt5RyxRQUFVLE9BeUN2QnBHLEVBQU80VixHQUFRLENBQ1g5TyxZQUFhQSxFQUNiQyxXQUFZQSxFQUNaQyxVQUFXQSxFQUNYQyxhQUFjQSxFQUVkNE0sZUFBZ0JBLEdBQ2hCQyxZQUFhQSxHQUNiQyxjQUFlQSxHQUNmQyxZQUFhQSxHQUNiQyxpQkFBa0JBLEdBQ2xCQyxnQkFBaUJBLEdBQ2pCOEYsYUFsckNlLEdBb3JDZjlTLGVBQWdCQSxFQUNoQkMsZUFBZ0JBLEVBQ2hCQyxnQkFBaUJBLEVBQ2pCQyxhQUFjQSxFQUNkQyxlQUFnQkEsRUFDaEJDLHFCQUFzQkEsRUFDdEJDLG1CQUFvQkEsRUFDcEJDLGNBQWVBLEVBRWZxTyxRQUFTQSxHQUNUbE8sTUFBT0EsR0FDUDJLLFlBQWFBLEdBRWJ6QyxXQUFZQSxHQUNaOUMsV0FBWUEsR0FDWmtCLGtCQUFtQkEsR0FDbkJ1QyxnQkFBaUJBLEdBQ2pCckIsaUJBQWtCQSxHQUVsQitFLFdBQVlBLEdBQ1pXLGVBQWdCQSxHQUNoQm1GLElBQUt6RSxHQUNMMEUsSUFBS25GLEdBQ0xvRixNQUFPNUUsR0FDUDZFLE1BQU9sRixHQUNQbUYsT0FBUS9FLEdBQ1JnRixNQUFPbkYsR0FFUG1FLEdBQUluVixFQUNKcVYsSUFBS2hWLEVBQ0xwRCxLQUFNQSxFQUNONkIsTUFBT0EsRUFDUEgsT0FBUUEsRUFDUjlDLE9BQVFBLEVBQ1JtRCxRQUFTQSxFQUNUcEMsT0FBUUEsRUFDUjZFLFNBQVVBLFVBS3NCLElBQVgvSSxFQUF5QkEsRUFBMEIsb0JBQVRrTCxLQUF1QkEsS0FBTyxJQUN0RjZOLE9BQVNBLElBR2hCLGFBQ0ksT0FBT0EsSUFDVixrQ0F0a0ZMLENBNmtGRy9ZLE9BQVFPIiwiZmlsZSI6Ii9qcy9zaXRlL3ZlbmRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cpe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZHsyfSlcXC4vKSxuPSEhdCYmMTY8PXBhcnNlSW50KHRbMV0sMTApO2lmKCEoXCJvYmplY3RGaXRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSE9ITEpfHxuKXt2YXIgbz1mdW5jdGlvbih0LGUsaSl7dmFyIG4sbyxsLGEsZDtpZigoaT1pLnNwbGl0KFwiIFwiKSkubGVuZ3RoPDImJihpWzFdPWlbMF0pLFwieFwiPT09dCluPWlbMF0sbz1pWzFdLGw9XCJsZWZ0XCIsYT1cInJpZ2h0XCIsZD1lLmNsaWVudFdpZHRoO2Vsc2V7aWYoXCJ5XCIhPT10KXJldHVybjtuPWlbMV0sbz1pWzBdLGw9XCJ0b3BcIixhPVwiYm90dG9tXCIsZD1lLmNsaWVudEhlaWdodH1pZihuIT09bCYmbyE9PWwpe2lmKG4hPT1hJiZvIT09YSlyZXR1cm5cImNlbnRlclwiPT09bnx8XCI1MCVcIj09PW4/KGUuc3R5bGVbbF09XCI1MCVcIix2b2lkKGUuc3R5bGVbXCJtYXJnaW4tXCIrbF09ZC8tMitcInB4XCIpKTp2b2lkKDA8PW4uaW5kZXhPZihcIiVcIik/KG49cGFyc2VJbnQobikpPDUwPyhlLnN0eWxlW2xdPW4rXCIlXCIsZS5zdHlsZVtcIm1hcmdpbi1cIitsXT1kKihuLy0xMDApK1wicHhcIik6KG49MTAwLW4sZS5zdHlsZVthXT1uK1wiJVwiLGUuc3R5bGVbXCJtYXJnaW4tXCIrYV09ZCoobi8tMTAwKStcInB4XCIpOmUuc3R5bGVbbF09bik7ZS5zdHlsZVthXT1cIjBcIn1lbHNlIGUuc3R5bGVbbF09XCIwXCJ9LGw9ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRhc2V0P3QuZGF0YXNldC5vYmplY3RGaXQ6dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW9iamVjdC1maXRcIiksaT10LmRhdGFzZXQ/dC5kYXRhc2V0Lm9iamVjdFBvc2l0aW9uOnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1vYmplY3QtcG9zaXRpb25cIik7ZT1lfHxcImNvdmVyXCIsaT1pfHxcIjUwJSA1MCVcIjt2YXIgbj10LnBhcmVudE5vZGU7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCksaT1lLmdldFByb3BlcnR5VmFsdWUoXCJwb3NpdGlvblwiKSxuPWUuZ2V0UHJvcGVydHlWYWx1ZShcIm92ZXJmbG93XCIpLG89ZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTtpJiZcInN0YXRpY1wiIT09aXx8KHQuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiKSxcImhpZGRlblwiIT09biYmKHQuc3R5bGUub3ZlcmZsb3c9XCJoaWRkZW5cIiksbyYmXCJpbmxpbmVcIiE9PW98fCh0LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiKSwwPT09dC5jbGllbnRIZWlnaHQmJih0LnN0eWxlLmhlaWdodD1cIjEwMCVcIiksLTE9PT10LmNsYXNzTmFtZS5pbmRleE9mKFwib2JqZWN0LWZpdC1wb2x5ZmlsbFwiKSYmKHQuY2xhc3NOYW1lPXQuY2xhc3NOYW1lK1wiIG9iamVjdC1maXQtcG9seWZpbGxcIil9KG4pLGZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCksaT17XCJtYXgtd2lkdGhcIjpcIm5vbmVcIixcIm1heC1oZWlnaHRcIjpcIm5vbmVcIixcIm1pbi13aWR0aFwiOlwiMHB4XCIsXCJtaW4taGVpZ2h0XCI6XCIwcHhcIix0b3A6XCJhdXRvXCIscmlnaHQ6XCJhdXRvXCIsYm90dG9tOlwiYXV0b1wiLGxlZnQ6XCJhdXRvXCIsXCJtYXJnaW4tdG9wXCI6XCIwcHhcIixcIm1hcmdpbi1yaWdodFwiOlwiMHB4XCIsXCJtYXJnaW4tYm90dG9tXCI6XCIwcHhcIixcIm1hcmdpbi1sZWZ0XCI6XCIwcHhcIn07Zm9yKHZhciBuIGluIGkpZS5nZXRQcm9wZXJ0eVZhbHVlKG4pIT09aVtuXSYmKHQuc3R5bGVbbl09aVtuXSl9KHQpLHQuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHQuc3R5bGUud2lkdGg9XCJhdXRvXCIsdC5zdHlsZS5oZWlnaHQ9XCJhdXRvXCIsXCJzY2FsZS1kb3duXCI9PT1lJiYoZT10LmNsaWVudFdpZHRoPG4uY2xpZW50V2lkdGgmJnQuY2xpZW50SGVpZ2h0PG4uY2xpZW50SGVpZ2h0P1wibm9uZVwiOlwiY29udGFpblwiKSxcIm5vbmVcIj09PWU/KG8oXCJ4XCIsdCxpKSx2b2lkIG8oXCJ5XCIsdCxpKSk6XCJmaWxsXCI9PT1lPyh0LnN0eWxlLndpZHRoPVwiMTAwJVwiLHQuc3R5bGUuaGVpZ2h0PVwiMTAwJVwiLG8oXCJ4XCIsdCxpKSx2b2lkIG8oXCJ5XCIsdCxpKSk6KHQuc3R5bGUuaGVpZ2h0PVwiMTAwJVwiLHZvaWQoXCJjb3ZlclwiPT09ZSYmdC5jbGllbnRXaWR0aD5uLmNsaWVudFdpZHRofHxcImNvbnRhaW5cIj09PWUmJnQuY2xpZW50V2lkdGg8bi5jbGllbnRXaWR0aD8odC5zdHlsZS50b3A9XCIwXCIsdC5zdHlsZS5tYXJnaW5Ub3A9XCIwXCIsbyhcInhcIix0LGkpKToodC5zdHlsZS53aWR0aD1cIjEwMCVcIix0LnN0eWxlLmhlaWdodD1cImF1dG9cIix0LnN0eWxlLmxlZnQ9XCIwXCIsdC5zdHlsZS5tYXJnaW5MZWZ0PVwiMFwiLG8oXCJ5XCIsdCxpKSkpKX0sZT1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10fHx0IGluc3RhbmNlb2YgRXZlbnQpdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtb2JqZWN0LWZpdF1cIik7ZWxzZSBpZih0JiZ0Lm5vZGVOYW1lKXQ9W3RdO2Vsc2V7aWYoXCJvYmplY3RcIiE9dHlwZW9mIHR8fCF0Lmxlbmd0aHx8IXRbMF0ubm9kZU5hbWUpcmV0dXJuITE7dD10fWZvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0ubm9kZU5hbWUpe3ZhciBpPXRbZV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihcImltZ1wiPT09aSl7aWYobiljb250aW51ZTt0W2VdLmNvbXBsZXRlP2wodFtlXSk6dFtlXS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLGZ1bmN0aW9uKCl7bCh0aGlzKX0pfWVsc2VcInZpZGVvXCI9PT1pPzA8dFtlXS5yZWFkeVN0YXRlP2wodFtlXSk6dFtlXS5hZGRFdmVudExpc3RlbmVyKFwibG9hZGVkbWV0YWRhdGFcIixmdW5jdGlvbigpe2wodGhpcyl9KTpsKHRbZV0pfXJldHVybiEwfTtcImxvYWRpbmdcIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixlKTplKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixlKSx3aW5kb3cub2JqZWN0Rml0UG9seWZpbGw9ZX1lbHNlIHdpbmRvdy5vYmplY3RGaXRQb2x5ZmlsbD1mdW5jdGlvbigpe3JldHVybiExfX19KCk7IiwiLyohIEhhbW1lci5KUyAtIHYyLjAuNyAtIDIwMTYtMDQtMjJcbiAqIGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IEpvcmlrIFRhbmdlbGRlcjtcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAqL1xuKGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIGV4cG9ydE5hbWUsIHVuZGVmaW5lZCkge1xuICAndXNlIHN0cmljdCc7XG5cbnZhciBWRU5ET1JfUFJFRklYRVMgPSBbJycsICd3ZWJraXQnLCAnTW96JywgJ01TJywgJ21zJywgJ28nXTtcbnZhciBURVNUX0VMRU1FTlQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxudmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nO1xuXG52YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIG5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIHNldCBhIHRpbWVvdXQgd2l0aCBhIGdpdmVuIHNjb3BlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBzZXRUaW1lb3V0Q29udGV4dChmbiwgdGltZW91dCwgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGJpbmRGbihmbiwgY29udGV4dCksIHRpbWVvdXQpO1xufVxuXG4vKipcbiAqIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSwgd2Ugd2FudCB0byBleGVjdXRlIHRoZSBmbiBvbiBlYWNoIGVudHJ5XG4gKiBpZiBpdCBhaW50IGFuIGFycmF5IHdlIGRvbid0IHdhbnQgdG8gZG8gYSB0aGluZy5cbiAqIHRoaXMgaXMgdXNlZCBieSBhbGwgdGhlIG1ldGhvZHMgdGhhdCBhY2NlcHQgYSBzaW5nbGUgYW5kIGFycmF5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfEFycmF5fSBhcmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBmblxuICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgIGVhY2goYXJnLCBjb250ZXh0W2ZuXSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogd2FsayBvYmplY3RzIGFuZCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICovXG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgaTtcblxuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLmZvckVhY2gpIHtcbiAgICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IG9iai5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIHdyYXAgYSBtZXRob2Qgd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHN0YWNrIHRyYWNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB3cmFwcGluZyB0aGUgc3VwcGxpZWQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gICAgdmFyIGRlcHJlY2F0aW9uTWVzc2FnZSA9ICdERVBSRUNBVEVEIE1FVEhPRDogJyArIG5hbWUgKyAnXFxuJyArIG1lc3NhZ2UgKyAnIEFUIFxcbic7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcignZ2V0LXN0YWNrLXRyYWNlJyk7XG4gICAgICAgIHZhciBzdGFjayA9IGUgJiYgZS5zdGFjayA/IGUuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFxzK2F0XFxzKy9nbSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxccypcXCgvZ20sICd7YW5vbnltb3VzfSgpQCcpIDogJ1Vua25vd24gU3RhY2sgVHJhY2UnO1xuXG4gICAgICAgIHZhciBsb2cgPSB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUud2FybiB8fCB3aW5kb3cuY29uc29sZS5sb2cpO1xuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgICBsb2cuY2FsbCh3aW5kb3cuY29uc29sZSwgZGVwcmVjYXRpb25NZXNzYWdlLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cbi8qKlxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHsuLi5PYmplY3R9IG9iamVjdHNfdG9fYXNzaWduXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0YXJnZXRcbiAqL1xudmFyIGFzc2lnbjtcbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xufSBlbHNlIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xufVxuXG4vKipcbiAqIGV4dGVuZCBvYmplY3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV1cbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xudmFyIGV4dGVuZCA9IGRlcHJlY2F0ZShmdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjLCBtZXJnZSkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc3JjKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgICAgICBpZiAoIW1lcmdlIHx8IChtZXJnZSAmJiBkZXN0W2tleXNbaV1dID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBkZXN0W2tleXNbaV1dID0gc3JjW2tleXNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59LCAnZXh0ZW5kJywgJ1VzZSBgYXNzaWduYC4nKTtcblxuLyoqXG4gKiBtZXJnZSB0aGUgdmFsdWVzIGZyb20gc3JjIGluIHRoZSBkZXN0LlxuICogbWVhbnMgdGhhdCBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZGVzdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiBieSBzcmNcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBkZXN0XG4gKi9cbnZhciBtZXJnZSA9IGRlcHJlY2F0ZShmdW5jdGlvbiBtZXJnZShkZXN0LCBzcmMpIHtcbiAgICByZXR1cm4gZXh0ZW5kKGRlc3QsIHNyYywgdHJ1ZSk7XG59LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIHNpbXBsZSBjbGFzcyBpbmhlcml0YW5jZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hpbGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc11cbiAqL1xuZnVuY3Rpb24gaW5oZXJpdChjaGlsZCwgYmFzZSwgcHJvcGVydGllcykge1xuICAgIHZhciBiYXNlUCA9IGJhc2UucHJvdG90eXBlLFxuICAgICAgICBjaGlsZFA7XG5cbiAgICBjaGlsZFAgPSBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2VQKTtcbiAgICBjaGlsZFAuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICBhc3NpZ24oY2hpbGRQLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbi8qKlxuICogc2ltcGxlIGZ1bmN0aW9uIGJpbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBiaW5kRm4oZm4sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYm91bmRGbigpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICogdGhpcyBmaXJzdCBpdGVtIGluIGFyZ3Mgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge0Jvb2xlYW58RnVuY3Rpb259IHZhbFxuICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gYm9vbE9yRm4odmFsLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gVFlQRV9GVU5DVElPTikge1xuICAgICAgICByZXR1cm4gdmFsLmFwcGx5KGFyZ3MgPyBhcmdzWzBdIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59XG5cbi8qKlxuICogdXNlIHRoZSB2YWwyIHdoZW4gdmFsMSBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSB7Kn0gdmFsMVxuICogQHBhcmFtIHsqfSB2YWwyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gaWZVbmRlZmluZWQodmFsMSwgdmFsMikge1xuICAgIHJldHVybiAodmFsMSA9PT0gdW5kZWZpbmVkKSA/IHZhbDIgOiB2YWwxO1xufVxuXG4vKipcbiAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnModGFyZ2V0LCB0eXBlcywgaGFuZGxlcikge1xuICAgIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiByZW1vdmVFdmVudExpc3RlbmVyIHdpdGggbXVsdGlwbGUgZXZlbnRzIGF0IG9uY2VcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRhcmdldCwgdHlwZXMsIGhhbmRsZXIpIHtcbiAgICBlYWNoKHNwbGl0U3RyKHR5cGVzKSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogZmluZCBpZiBhIG5vZGUgaXMgaW4gdGhlIGdpdmVuIHBhcmVudFxuICogQG1ldGhvZCBoYXNQYXJlbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudFxuICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAqL1xuZnVuY3Rpb24gaGFzUGFyZW50KG5vZGUsIHBhcmVudCkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIHNtYWxsIGluZGV4T2Ygd3JhcHBlclxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBpblN0cihzdHIsIGZpbmQpIHtcbiAgICByZXR1cm4gc3RyLmluZGV4T2YoZmluZCkgPiAtMTtcbn1cblxuLyoqXG4gKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybnMge0FycmF5fSB3b3Jkc1xuICovXG5mdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbn1cblxuLyoqXG4gKiBmaW5kIGlmIGEgYXJyYXkgY29udGFpbnMgdGhlIG9iamVjdCB1c2luZyBpbmRleE9mIG9yIGEgc2ltcGxlIHBvbHlGaWxsXG4gKiBAcGFyYW0ge0FycmF5fSBzcmNcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ZpbmRCeUtleV1cbiAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gKi9cbmZ1bmN0aW9uIGluQXJyYXkoc3JjLCBmaW5kLCBmaW5kQnlLZXkpIHtcbiAgICBpZiAoc3JjLmluZGV4T2YgJiYgIWZpbmRCeUtleSkge1xuICAgICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICgoZmluZEJ5S2V5ICYmIHNyY1tpXVtmaW5kQnlLZXldID09IGZpbmQpIHx8ICghZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxufVxuXG4vKipcbiAqIGNvbnZlcnQgYXJyYXktbGlrZSBvYmplY3RzIHRvIHJlYWwgYXJyYXlzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkob2JqKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaiwgMCk7XG59XG5cbi8qKlxuICogdW5pcXVlIGFycmF5IHdpdGggb2JqZWN0cyBiYXNlZCBvbiBhIGtleSAobGlrZSAnaWQnKSBvciBqdXN0IGJ5IHRoZSBhcnJheSdzIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5fSBzcmMgW3tpZDoxfSx7aWQ6Mn0se2lkOjF9XVxuICogQHBhcmFtIHtTdHJpbmd9IFtrZXldXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtzb3J0PUZhbHNlXVxuICogQHJldHVybnMge0FycmF5fSBbe2lkOjF9LHtpZDoyfV1cbiAqL1xuZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbCA9IGtleSA/IHNyY1tpXVtrZXldIDogc3JjW2ldO1xuICAgICAgICBpZiAoaW5BcnJheSh2YWx1ZXMsIHZhbCkgPCAwKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goc3JjW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbaV0gPSB2YWw7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoc29ydCkge1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydChmdW5jdGlvbiBzb3J0VW5pcXVlQXJyYXkoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhW2tleV0gPiBiW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIGdldCB0aGUgcHJlZml4ZWQgcHJvcGVydHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICogQHJldHVybnMge1N0cmluZ3xVbmRlZmluZWR9IHByZWZpeGVkXG4gKi9cbmZ1bmN0aW9uIHByZWZpeGVkKG9iaiwgcHJvcGVydHkpIHtcbiAgICB2YXIgcHJlZml4LCBwcm9wO1xuICAgIHZhciBjYW1lbFByb3AgPSBwcm9wZXJ0eVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBWRU5ET1JfUFJFRklYRVMubGVuZ3RoKSB7XG4gICAgICAgIHByZWZpeCA9IFZFTkRPUl9QUkVGSVhFU1tpXTtcbiAgICAgICAgcHJvcCA9IChwcmVmaXgpID8gcHJlZml4ICsgY2FtZWxQcm9wIDogcHJvcGVydHk7XG5cbiAgICAgICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogZ2V0IGEgdW5pcXVlIGlkXG4gKiBAcmV0dXJucyB7bnVtYmVyfSB1bmlxdWVJZFxuICovXG52YXIgX3VuaXF1ZUlkID0gMTtcbmZ1bmN0aW9uIHVuaXF1ZUlkKCkge1xuICAgIHJldHVybiBfdW5pcXVlSWQrKztcbn1cblxuLyoqXG4gKiBnZXQgdGhlIHdpbmRvdyBvYmplY3Qgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0RvY3VtZW50Vmlld3xXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvd0ZvckVsZW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgICByZXR1cm4gKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93IHx8IHdpbmRvdyk7XG59XG5cbnZhciBNT0JJTEVfUkVHRVggPSAvbW9iaWxlfHRhYmxldHxpcChhZHxob25lfG9kKXxhbmRyb2lkL2k7XG5cbnZhciBTVVBQT1JUX1RPVUNIID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7XG52YXIgU1VQUE9SVF9QT0lOVEVSX0VWRU5UUyA9IHByZWZpeGVkKHdpbmRvdywgJ1BvaW50ZXJFdmVudCcpICE9PSB1bmRlZmluZWQ7XG52YXIgU1VQUE9SVF9PTkxZX1RPVUNIID0gU1VQUE9SVF9UT1VDSCAmJiBNT0JJTEVfUkVHRVgudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxudmFyIElOUFVUX1RZUEVfVE9VQ0ggPSAndG91Y2gnO1xudmFyIElOUFVUX1RZUEVfUEVOID0gJ3Blbic7XG52YXIgSU5QVVRfVFlQRV9NT1VTRSA9ICdtb3VzZSc7XG52YXIgSU5QVVRfVFlQRV9LSU5FQ1QgPSAna2luZWN0JztcblxudmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcblxudmFyIElOUFVUX1NUQVJUID0gMTtcbnZhciBJTlBVVF9NT1ZFID0gMjtcbnZhciBJTlBVVF9FTkQgPSA0O1xudmFyIElOUFVUX0NBTkNFTCA9IDg7XG5cbnZhciBESVJFQ1RJT05fTk9ORSA9IDE7XG52YXIgRElSRUNUSU9OX0xFRlQgPSAyO1xudmFyIERJUkVDVElPTl9SSUdIVCA9IDQ7XG52YXIgRElSRUNUSU9OX1VQID0gODtcbnZhciBESVJFQ1RJT05fRE9XTiA9IDE2O1xuXG52YXIgRElSRUNUSU9OX0hPUklaT05UQUwgPSBESVJFQ1RJT05fTEVGVCB8IERJUkVDVElPTl9SSUdIVDtcbnZhciBESVJFQ1RJT05fVkVSVElDQUwgPSBESVJFQ1RJT05fVVAgfCBESVJFQ1RJT05fRE9XTjtcbnZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG5cbnZhciBQUk9QU19YWSA9IFsneCcsICd5J107XG52YXIgUFJPUFNfQ0xJRU5UX1hZID0gWydjbGllbnRYJywgJ2NsaWVudFknXTtcblxuLyoqXG4gKiBjcmVhdGUgbmV3IGlucHV0IHR5cGUgbWFuYWdlclxuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0lucHV0fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDtcblxuICAgIC8vIHNtYWxsZXIgd3JhcHBlciBhcm91bmQgdGhlIGhhbmRsZXIsIGZvciB0aGUgc2NvcGUgYW5kIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBtYW5hZ2VyLFxuICAgIC8vIHNvIHdoZW4gZGlzYWJsZWQgdGhlIGlucHV0IGV2ZW50cyBhcmUgY29tcGxldGVseSBieXBhc3NlZC5cbiAgICB0aGlzLmRvbUhhbmRsZXIgPSBmdW5jdGlvbihldikge1xuICAgICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVyKGV2KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcblxufVxuXG5JbnB1dC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2hvdWxkIGhhbmRsZSB0aGUgaW5wdXRFdmVudCBkYXRhIGFuZCB0cmlnZ2VyIHRoZSBjYWxsYmFja1xuICAgICAqIEB2aXJ0dWFsXG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIGFkZEV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBjYWxsZWQgYnkgdGhlIE1hbmFnZXIgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0SW5zdGFuY2UobWFuYWdlcikge1xuICAgIHZhciBUeXBlO1xuICAgIHZhciBpbnB1dENsYXNzID0gbWFuYWdlci5vcHRpb25zLmlucHV0Q2xhc3M7XG5cbiAgICBpZiAoaW5wdXRDbGFzcykge1xuICAgICAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMpIHtcbiAgICAgICAgVHlwZSA9IFBvaW50ZXJFdmVudElucHV0O1xuICAgIH0gZWxzZSBpZiAoU1VQUE9SVF9PTkxZX1RPVUNIKSB7XG4gICAgICAgIFR5cGUgPSBUb3VjaElucHV0O1xuICAgIH0gZWxzZSBpZiAoIVNVUFBPUlRfVE9VQ0gpIHtcbiAgICAgICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVHlwZSA9IFRvdWNoTW91c2VJbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyAoVHlwZSkobWFuYWdlciwgaW5wdXRIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBoYW5kbGUgaW5wdXQgZXZlbnRzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBpbnB1dEhhbmRsZXIobWFuYWdlciwgZXZlbnRUeXBlLCBpbnB1dCkge1xuICAgIHZhciBwb2ludGVyc0xlbiA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgY2hhbmdlZFBvaW50ZXJzTGVuID0gaW5wdXQuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgaXNGaXJzdCA9IChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcbiAgICB2YXIgaXNGaW5hbCA9IChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcblxuICAgIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gICAgaW5wdXQuaXNGaW5hbCA9ICEhaXNGaW5hbDtcblxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgIG1hbmFnZXIuc2Vzc2lvbiA9IHt9O1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSBldmVudCBpcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgZG9tRXZlbnRzXG4gICAgLy8gbGlrZSAndG91Y2hzdGFydCwgbW91c2V1cCwgcG9pbnRlcmRvd24nXG4gICAgaW5wdXQuZXZlbnRUeXBlID0gZXZlbnRUeXBlO1xuXG4gICAgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG4gICAgY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCk7XG5cbiAgICAvLyBlbWl0IHNlY3JldCBldmVudFxuICAgIG1hbmFnZXIuZW1pdCgnaGFtbWVyLmlucHV0JywgaW5wdXQpO1xuXG4gICAgbWFuYWdlci5yZWNvZ25pemUoaW5wdXQpO1xuICAgIG1hbmFnZXIuc2Vzc2lvbi5wcmV2SW5wdXQgPSBpbnB1dDtcbn1cblxuLyoqXG4gKiBleHRlbmQgdGhlIGRhdGEgd2l0aCBzb21lIHVzYWJsZSBwcm9wZXJ0aWVzIGxpa2Ugc2NhbGUsIHJvdGF0ZSwgdmVsb2NpdHkgZXRjXG4gKiBAcGFyYW0ge09iamVjdH0gbWFuYWdlclxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVJbnB1dERhdGEobWFuYWdlciwgaW5wdXQpIHtcbiAgICB2YXIgc2Vzc2lvbiA9IG1hbmFnZXIuc2Vzc2lvbjtcbiAgICB2YXIgcG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycztcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBzdG9yZSB0aGUgZmlyc3QgaW5wdXQgdG8gY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBhbmQgZGlyZWN0aW9uXG4gICAgaWYgKCFzZXNzaW9uLmZpcnN0SW5wdXQpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdElucHV0ID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH1cblxuICAgIC8vIHRvIGNvbXB1dGUgc2NhbGUgYW5kIHJvdGF0aW9uIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG11bHRpcGxlIHRvdWNoZXNcbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPiAxICYmICFzZXNzaW9uLmZpcnN0TXVsdGlwbGUpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpcnN0SW5wdXQgPSBzZXNzaW9uLmZpcnN0SW5wdXQ7XG4gICAgdmFyIGZpcnN0TXVsdGlwbGUgPSBzZXNzaW9uLmZpcnN0TXVsdGlwbGU7XG4gICAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuXG4gICAgdmFyIGNlbnRlciA9IGlucHV0LmNlbnRlciA9IGdldENlbnRlcihwb2ludGVycyk7XG4gICAgaW5wdXQudGltZVN0YW1wID0gbm93KCk7XG4gICAgaW5wdXQuZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gZmlyc3RJbnB1dC50aW1lU3RhbXA7XG5cbiAgICBpbnB1dC5hbmdsZSA9IGdldEFuZ2xlKG9mZnNldENlbnRlciwgY2VudGVyKTtcbiAgICBpbnB1dC5kaXN0YW5jZSA9IGdldERpc3RhbmNlKG9mZnNldENlbnRlciwgY2VudGVyKTtcblxuICAgIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgICBpbnB1dC5vZmZzZXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuXG4gICAgdmFyIG92ZXJhbGxWZWxvY2l0eSA9IGdldFZlbG9jaXR5KGlucHV0LmRlbHRhVGltZSwgaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVggPSBvdmVyYWxsVmVsb2NpdHkueDtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZID0gb3ZlcmFsbFZlbG9jaXR5Lnk7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5ID0gKGFicyhvdmVyYWxsVmVsb2NpdHkueCkgPiBhYnMob3ZlcmFsbFZlbG9jaXR5LnkpKSA/IG92ZXJhbGxWZWxvY2l0eS54IDogb3ZlcmFsbFZlbG9jaXR5Lnk7XG5cbiAgICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICAgIGlucHV0LnJvdGF0aW9uID0gZmlyc3RNdWx0aXBsZSA/IGdldFJvdGF0aW9uKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDA7XG5cbiAgICBpbnB1dC5tYXhQb2ludGVycyA9ICFzZXNzaW9uLnByZXZJbnB1dCA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6ICgoaW5wdXQucG9pbnRlcnMubGVuZ3RoID5cbiAgICAgICAgc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpO1xuXG4gICAgY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KTtcblxuICAgIC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG4gICAgdmFyIHRhcmdldCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICBpZiAoaGFzUGFyZW50KGlucHV0LnNyY0V2ZW50LnRhcmdldCwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBpbnB1dC5zcmNFdmVudC50YXJnZXQ7XG4gICAgfVxuICAgIGlucHV0LnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZURlbHRhWFkoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyO1xuICAgIHZhciBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSB8fCB7fTtcbiAgICB2YXIgcHJldklucHV0ID0gc2Vzc2lvbi5wcmV2SW5wdXQgfHwge307XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9TVEFSVCB8fCBwcmV2SW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9FTkQpIHtcbiAgICAgICAgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgPSB7XG4gICAgICAgICAgICB4OiBwcmV2SW5wdXQuZGVsdGFYIHx8IDAsXG4gICAgICAgICAgICB5OiBwcmV2SW5wdXQuZGVsdGFZIHx8IDBcbiAgICAgICAgfTtcblxuICAgICAgICBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhID0ge1xuICAgICAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgICAgICB5OiBjZW50ZXIueVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlucHV0LmRlbHRhWCA9IHByZXZEZWx0YS54ICsgKGNlbnRlci54IC0gb2Zmc2V0LngpO1xuICAgIGlucHV0LmRlbHRhWSA9IHByZXZEZWx0YS55ICsgKGNlbnRlci55IC0gb2Zmc2V0LnkpO1xufVxuXG4vKipcbiAqIHZlbG9jaXR5IGlzIGNhbGN1bGF0ZWQgZXZlcnkgeCBtc1xuICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgbGFzdCA9IHNlc3Npb24ubGFzdEludGVydmFsIHx8IGlucHV0LFxuICAgICAgICBkZWx0YVRpbWUgPSBpbnB1dC50aW1lU3RhbXAgLSBsYXN0LnRpbWVTdGFtcCxcbiAgICAgICAgdmVsb2NpdHksIHZlbG9jaXR5WCwgdmVsb2NpdHlZLCBkaXJlY3Rpb247XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0NBTkNFTCAmJiAoZGVsdGFUaW1lID4gQ09NUFVURV9JTlRFUlZBTCB8fCBsYXN0LnZlbG9jaXR5ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHZhciBkZWx0YVggPSBpbnB1dC5kZWx0YVggLSBsYXN0LmRlbHRhWDtcbiAgICAgICAgdmFyIGRlbHRhWSA9IGlucHV0LmRlbHRhWSAtIGxhc3QuZGVsdGFZO1xuXG4gICAgICAgIHZhciB2ID0gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIHZlbG9jaXR5WCA9IHYueDtcbiAgICAgICAgdmVsb2NpdHlZID0gdi55O1xuICAgICAgICB2ZWxvY2l0eSA9IChhYnModi54KSA+IGFicyh2LnkpKSA/IHYueCA6IHYueTtcbiAgICAgICAgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGRlbHRhWCwgZGVsdGFZKTtcblxuICAgICAgICBzZXNzaW9uLmxhc3RJbnRlcnZhbCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBsYXRlc3QgdmVsb2NpdHkgaW5mbyBpZiBpdCBkb2Vzbid0IG92ZXJ0YWtlIGEgbWluaW11bSBwZXJpb2RcbiAgICAgICAgdmVsb2NpdHkgPSBsYXN0LnZlbG9jaXR5O1xuICAgICAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICAgICAgdmVsb2NpdHlZID0gbGFzdC52ZWxvY2l0eVk7XG4gICAgICAgIGRpcmVjdGlvbiA9IGxhc3QuZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIGlucHV0LnZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gICAgaW5wdXQudmVsb2NpdHlYID0gdmVsb2NpdHlYO1xuICAgIGlucHV0LnZlbG9jaXR5WSA9IHZlbG9jaXR5WTtcbiAgICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG59XG5cbi8qKlxuICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBjbG9uZWRJbnB1dERhdGFcbiAqL1xuZnVuY3Rpb24gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpIHtcbiAgICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2xpZW50WFkgZm9yIHRoZSBjYWxjdWxhdGlvbnNcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBpbnB1dC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgICAgcG9pbnRlcnNbaV0gPSB7XG4gICAgICAgICAgICBjbGllbnRYOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRYKSxcbiAgICAgICAgICAgIGNsaWVudFk6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFkpXG4gICAgICAgIH07XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0aW1lU3RhbXA6IG5vdygpLFxuICAgICAgICBwb2ludGVyczogcG9pbnRlcnMsXG4gICAgICAgIGNlbnRlcjogZ2V0Q2VudGVyKHBvaW50ZXJzKSxcbiAgICAgICAgZGVsdGFYOiBpbnB1dC5kZWx0YVgsXG4gICAgICAgIGRlbHRhWTogaW5wdXQuZGVsdGFZXG4gICAgfTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBwb2ludGVyc1xuICogQHJldHVybiB7T2JqZWN0fSBjZW50ZXIgY29udGFpbnMgYHhgIGFuZCBgeWAgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBubyBuZWVkIHRvIGxvb3Agd2hlbiBvbmx5IG9uZSB0b3VjaFxuICAgIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcm91bmQocG9pbnRlcnNbMF0uY2xpZW50WCksXG4gICAgICAgICAgICB5OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRZKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciB4ID0gMCwgeSA9IDAsIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgcG9pbnRlcnNMZW5ndGgpIHtcbiAgICAgICAgeCArPSBwb2ludGVyc1tpXS5jbGllbnRYO1xuICAgICAgICB5ICs9IHBvaW50ZXJzW2ldLmNsaWVudFk7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByb3VuZCh4IC8gcG9pbnRlcnNMZW5ndGgpLFxuICAgICAgICB5OiByb3VuZCh5IC8gcG9pbnRlcnNMZW5ndGgpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm4ge09iamVjdH0gdmVsb2NpdHkgYHhgIGFuZCBgeWBcbiAqL1xuZnVuY3Rpb24gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCB4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAvIGRlbHRhVGltZSB8fCAwLFxuICAgICAgICB5OiB5IC8gZGVsdGFUaW1lIHx8IDBcbiAgICB9O1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGRpcmVjdGlvblxuICovXG5mdW5jdGlvbiBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAgIHJldHVybiBESVJFQ1RJT05fTk9ORTtcbiAgICB9XG5cbiAgICBpZiAoYWJzKHgpID49IGFicyh5KSkge1xuICAgICAgICByZXR1cm4geCA8IDAgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICB9XG4gICAgcmV0dXJuIHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMSB7eCwgeX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwMiB7eCwgeX1cbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBQUk9QU19YWTtcbiAgICB9XG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4ICogeCkgKyAoeSAqIHkpKTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge09iamVjdH0gcDFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMlxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICovXG5mdW5jdGlvbiBnZXRBbmdsZShwMSwgcDIsIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcykge1xuICAgICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cbiAgICB2YXIgeCA9IHAyW3Byb3BzWzBdXSAtIHAxW3Byb3BzWzBdXSxcbiAgICAgICAgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LCB4KSAqIDE4MCAvIE1hdGguUEk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJvdGF0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gZ2V0QW5nbGUoZW5kWzFdLCBlbmRbMF0sIFBST1BTX0NMSUVOVF9YWSkgKyBnZXRBbmdsZShzdGFydFsxXSwgc3RhcnRbMF0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAqIG5vIHNjYWxlIGlzIDEsIGFuZCBnb2VzIGRvd24gdG8gMCB3aGVuIHBpbmNoZWQgdG9nZXRoZXIsIGFuZCBiaWdnZXIgd2hlbiBwaW5jaGVkIG91dFxuICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICogQHJldHVybiB7TnVtYmVyfSBzY2FsZVxuICovXG5mdW5jdGlvbiBnZXRTY2FsZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIGdldERpc3RhbmNlKGVuZFswXSwgZW5kWzFdLCBQUk9QU19DTElFTlRfWFkpIC8gZ2V0RGlzdGFuY2Uoc3RhcnRbMF0sIHN0YXJ0WzFdLCBQUk9QU19DTElFTlRfWFkpO1xufVxuXG52YXIgTU9VU0VfSU5QVVRfTUFQID0ge1xuICAgIG1vdXNlZG93bjogSU5QVVRfU1RBUlQsXG4gICAgbW91c2Vtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIG1vdXNldXA6IElOUFVUX0VORFxufTtcblxudmFyIE1PVVNFX0VMRU1FTlRfRVZFTlRTID0gJ21vdXNlZG93bic7XG52YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG5cbi8qKlxuICogTW91c2UgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIE1vdXNlSW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IE1PVVNFX1dJTkRPV19FVkVOVFM7XG5cbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTsgLy8gbW91c2Vkb3duIHN0YXRlXG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KE1vdXNlSW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIE1FaGFuZGxlcihldikge1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIG9uIHN0YXJ0IHdlIHdhbnQgdG8gaGF2ZSB0aGUgbGVmdCBtb3VzZSBidXR0b24gZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgZXYuYnV0dG9uID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX01PVkUgJiYgZXYud2hpY2ggIT09IDEpIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IElOUFVUX0VORDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX01PVVNFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG52YXIgUE9JTlRFUl9JTlBVVF9NQVAgPSB7XG4gICAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICAgIHBvaW50ZXJtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHBvaW50ZXJ1cDogSU5QVVRfRU5ELFxuICAgIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgICBwb2ludGVyb3V0OiBJTlBVVF9DQU5DRUxcbn07XG5cbi8vIGluIElFMTAgdGhlIHBvaW50ZXIgdHlwZXMgaXMgZGVmaW5lZCBhcyBhbiBlbnVtXG52YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgICAyOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgIDM6IElOUFVUX1RZUEVfUEVOLFxuICAgIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgNTogSU5QVVRfVFlQRV9LSU5FQ1QgLy8gc2VlIGh0dHBzOi8vdHdpdHRlci5jb20vamFjb2Jyb3NzaS9zdGF0dXMvNDgwNTk2NDM4NDg5ODkwODE2XG59O1xuXG52YXIgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdwb2ludGVyZG93bic7XG52YXIgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ3BvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsJztcblxuLy8gSUUxMCBoYXMgcHJlZml4ZWQgc3VwcG9ydCwgYW5kIGNhc2Utc2Vuc2l0aXZlXG5pZiAod2luZG93Lk1TUG9pbnRlckV2ZW50ICYmICF3aW5kb3cuUG9pbnRlckV2ZW50KSB7XG4gICAgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdNU1BvaW50ZXJEb3duJztcbiAgICBQT0lOVEVSX1dJTkRPV19FVkVOVFMgPSAnTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBNU1BvaW50ZXJDYW5jZWwnO1xufVxuXG4vKipcbiAqIFBvaW50ZXIgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFBvaW50ZXJFdmVudElucHV0KCkge1xuICAgIHRoaXMuZXZFbCA9IFBPSU5URVJfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IFBPSU5URVJfV0lORE9XX0VWRU5UUztcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLnN0b3JlID0gKHRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHMgPSBbXSk7XG59XG5cbmluaGVyaXQoUG9pbnRlckV2ZW50SW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFBFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgICAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBldmVudFR5cGVOb3JtYWxpemVkID0gZXYudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ21zJywgJycpO1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gUE9JTlRFUl9JTlBVVF9NQVBbZXZlbnRUeXBlTm9ybWFsaXplZF07XG4gICAgICAgIHZhciBwb2ludGVyVHlwZSA9IElFMTBfUE9JTlRFUl9UWVBFX0VOVU1bZXYucG9pbnRlclR5cGVdIHx8IGV2LnBvaW50ZXJUeXBlO1xuXG4gICAgICAgIHZhciBpc1RvdWNoID0gKHBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfVE9VQ0gpO1xuXG4gICAgICAgIC8vIGdldCBpbmRleCBvZiB0aGUgZXZlbnQgaW4gdGhlIHN0b3JlXG4gICAgICAgIHZhciBzdG9yZUluZGV4ID0gaW5BcnJheShzdG9yZSwgZXYucG9pbnRlcklkLCAncG9pbnRlcklkJyk7XG5cbiAgICAgICAgLy8gc3RhcnQgYW5kIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgKGV2LmJ1dHRvbiA9PT0gMCB8fCBpc1RvdWNoKSkge1xuICAgICAgICAgICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChldik7XG4gICAgICAgICAgICAgICAgc3RvcmVJbmRleCA9IHN0b3JlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgICAgIHJlbW92ZVBvaW50ZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaXQgbm90IGZvdW5kLCBzbyB0aGUgcG9pbnRlciBoYXNuJ3QgYmVlbiBkb3duIChzbyBpdCdzIHByb2JhYmx5IGEgaG92ZXIpXG4gICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBldmVudCBpbiB0aGUgc3RvcmVcbiAgICAgICAgc3RvcmVbc3RvcmVJbmRleF0gPSBldjtcblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogc3RvcmUsXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IFtldl0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlbW92ZVBvaW50ZXIpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgICAgICAgc3RvcmUuc3BsaWNlKHN0b3JlSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbnZhciBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBTSU5HTEVfVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0JztcbnZhciBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG5cbi8qKlxuICogVG91Y2ggZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFNpbmdsZVRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU2luZ2xlVG91Y2hJbnB1dCwgSW5wdXQsIHtcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBURWhhbmRsZXIoZXYpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIHNob3VsZCB3ZSBoYW5kbGUgdGhlIHRvdWNoIGV2ZW50cz9cbiAgICAgICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTtcblxuICAgICAgICAvLyB3aGVuIGRvbmUsIHJlc2V0IHRoZSBzdGFydGVkIHN0YXRlXG4gICAgICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgdG91Y2hlc1swXS5sZW5ndGggLSB0b3VjaGVzWzFdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgdHlwZSwge1xuICAgICAgICAgICAgcG9pbnRlcnM6IHRvdWNoZXNbMF0sXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICogQHBhcmFtIHtOdW1iZXJ9IHR5cGUgZmxhZ1xuICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2luZ2xlVG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGwgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIGFsbCA9IHVuaXF1ZUFycmF5KGFsbC5jb25jYXQoY2hhbmdlZCksICdpZGVudGlmaWVyJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFthbGwsIGNoYW5nZWRdO1xufVxuXG52YXIgVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBUT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcblxuLyoqXG4gKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5mdW5jdGlvbiBUb3VjaElucHV0KCkge1xuICAgIHRoaXMuZXZUYXJnZXQgPSBUT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMudGFyZ2V0SWRzID0ge307XG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTVRFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgdHlwZSA9IFRPVUNIX0lOUFVUX01BUFtldi50eXBlXTtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBnZXRUb3VjaGVzLmNhbGwodGhpcywgZXYsIHR5cGUpO1xuICAgICAgICBpZiAoIXRvdWNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEB0aGlzIHtUb3VjaElucHV0fVxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKiBAcGFyYW0ge051bWJlcn0gdHlwZSBmbGFnXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfEFycmF5fSBbYWxsLCBjaGFuZ2VkXVxuICovXG5mdW5jdGlvbiBnZXRUb3VjaGVzKGV2LCB0eXBlKSB7XG4gICAgdmFyIGFsbFRvdWNoZXMgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciB0YXJnZXRJZHMgPSB0aGlzLnRhcmdldElkcztcblxuICAgIC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdG91Y2gsIHRoZSBwcm9jZXNzIGNhbiBiZSBzaW1wbGlmaWVkXG4gICAgaWYgKHR5cGUgJiAoSU5QVVRfU1RBUlQgfCBJTlBVVF9NT1ZFKSAmJiBhbGxUb3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0YXJnZXRJZHNbYWxsVG91Y2hlc1swXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBbYWxsVG91Y2hlcywgYWxsVG91Y2hlc107XG4gICAgfVxuXG4gICAgdmFyIGksXG4gICAgICAgIHRhcmdldFRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzID0gW10sXG4gICAgICAgIHRhcmdldCA9IHRoaXMudGFyZ2V0O1xuXG4gICAgLy8gZ2V0IHRhcmdldCB0b3VjaGVzIGZyb20gdG91Y2hlc1xuICAgIHRhcmdldFRvdWNoZXMgPSBhbGxUb3VjaGVzLmZpbHRlcihmdW5jdGlvbih0b3VjaCkge1xuICAgICAgICByZXR1cm4gaGFzUGFyZW50KHRvdWNoLnRhcmdldCwgdGFyZ2V0KTtcbiAgICB9KTtcblxuICAgIC8vIGNvbGxlY3QgdG91Y2hlc1xuICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCB0YXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGFyZ2V0SWRzW3RhcmdldFRvdWNoZXNbaV0uaWRlbnRpZmllcl0gPSB0cnVlO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIGNoYW5nZWQgdG91Y2hlcyB0byBvbmx5IGNvbnRhaW4gdG91Y2hlcyB0aGF0IGV4aXN0IGluIHRoZSBjb2xsZWN0ZWQgdGFyZ2V0IGlkc1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzLnB1c2goY2hhbmdlZFRvdWNoZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYW51cCByZW1vdmVkIHRvdWNoZXNcbiAgICAgICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgaWYgKCFjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAgIC8vIG1lcmdlIHRhcmdldFRvdWNoZXMgd2l0aCBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyBzbyBpdCBjb250YWlucyBBTEwgdG91Y2hlcywgaW5jbHVkaW5nICdlbmQnIGFuZCAnY2FuY2VsJ1xuICAgICAgICB1bmlxdWVBcnJheSh0YXJnZXRUb3VjaGVzLmNvbmNhdChjaGFuZ2VkVGFyZ2V0VG91Y2hlcyksICdpZGVudGlmaWVyJywgdHJ1ZSksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb21iaW5lZCB0b3VjaCBhbmQgbW91c2UgaW5wdXRcbiAqXG4gKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAqIFRoaXMgYmVjYXVzZSB0b3VjaCBkZXZpY2VzIGFsc28gZW1pdCBtb3VzZSBldmVudHMgd2hpbGUgZG9pbmcgYSB0b3VjaC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cblxudmFyIERFRFVQX1RJTUVPVVQgPSAyNTAwO1xudmFyIERFRFVQX0RJU1RBTkNFID0gMjU7XG5cbmZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dCgpIHtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdmFyIGhhbmRsZXIgPSBiaW5kRm4odGhpcy5oYW5kbGVyLCB0aGlzKTtcbiAgICB0aGlzLnRvdWNoID0gbmV3IFRvdWNoSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcbiAgICB0aGlzLm1vdXNlID0gbmV3IE1vdXNlSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcblxuICAgIHRoaXMucHJpbWFyeVRvdWNoID0gbnVsbDtcbiAgICB0aGlzLmxhc3RUb3VjaGVzID0gW107XG59XG5cbmluaGVyaXQoVG91Y2hNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRFdmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBUTUVoYW5kbGVyKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSkge1xuICAgICAgICB2YXIgaXNUb3VjaCA9IChpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCksXG4gICAgICAgICAgICBpc01vdXNlID0gKGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX01PVVNFKTtcblxuICAgICAgICBpZiAoaXNNb3VzZSAmJiBpbnB1dERhdGEuc291cmNlQ2FwYWJpbGl0aWVzICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiB3ZSdyZSBpbiBhIHRvdWNoIGV2ZW50LCByZWNvcmQgdG91Y2hlcyB0byAgZGUtZHVwZSBzeW50aGV0aWMgbW91c2UgZXZlbnRcbiAgICAgICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgICAgICAgIHJlY29yZFRvdWNoZXMuY2FsbCh0aGlzLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW91c2UgJiYgaXNTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGlucHV0RGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRvdWNoLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZS5kZXN0cm95KCk7XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlY29yZFRvdWNoZXMoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXI7XG4gICAgICAgIHNldExhc3RUb3VjaC5jYWxsKHRoaXMsIGV2ZW50RGF0YSk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0TGFzdFRvdWNoKGV2ZW50RGF0YSkge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF07XG5cbiAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5wcmltYXJ5VG91Y2gpIHtcbiAgICAgICAgdmFyIGxhc3RUb3VjaCA9IHt4OiB0b3VjaC5jbGllbnRYLCB5OiB0b3VjaC5jbGllbnRZfTtcbiAgICAgICAgdGhpcy5sYXN0VG91Y2hlcy5wdXNoKGxhc3RUb3VjaCk7XG4gICAgICAgIHZhciBsdHMgPSB0aGlzLmxhc3RUb3VjaGVzO1xuICAgICAgICB2YXIgcmVtb3ZlTGFzdFRvdWNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGx0cy5pbmRleE9mKGxhc3RUb3VjaCk7XG4gICAgICAgICAgICBpZiAoaSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbHRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2V0VGltZW91dChyZW1vdmVMYXN0VG91Y2gsIERFRFVQX1RJTUVPVVQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudChldmVudERhdGEpIHtcbiAgICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYLCB5ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICAgICAgdmFyIGR4ID0gTWF0aC5hYnMoeCAtIHQueCksIGR5ID0gTWF0aC5hYnMoeSAtIHQueSk7XG4gICAgICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgUFJFRklYRURfVE9VQ0hfQUNUSU9OID0gcHJlZml4ZWQoVEVTVF9FTEVNRU5ULnN0eWxlLCAndG91Y2hBY3Rpb24nKTtcbnZhciBOQVRJVkVfVE9VQ0hfQUNUSU9OID0gUFJFRklYRURfVE9VQ0hfQUNUSU9OICE9PSB1bmRlZmluZWQ7XG5cbi8vIG1hZ2ljYWwgdG91Y2hBY3Rpb24gdmFsdWVcbnZhciBUT1VDSF9BQ1RJT05fQ09NUFVURSA9ICdjb21wdXRlJztcbnZhciBUT1VDSF9BQ1RJT05fQVVUTyA9ICdhdXRvJztcbnZhciBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OID0gJ21hbmlwdWxhdGlvbic7IC8vIG5vdCBpbXBsZW1lbnRlZFxudmFyIFRPVUNIX0FDVElPTl9OT05FID0gJ25vbmUnO1xudmFyIFRPVUNIX0FDVElPTl9QQU5fWCA9ICdwYW4teCc7XG52YXIgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcbnZhciBUT1VDSF9BQ1RJT05fTUFQID0gZ2V0VG91Y2hBY3Rpb25Qcm9wcygpO1xuXG4vKipcbiAqIFRvdWNoIEFjdGlvblxuICogc2V0cyB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgb3IgdXNlcyB0aGUganMgYWx0ZXJuYXRpdmVcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbn1cblxuVG91Y2hBY3Rpb24ucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWUgb24gdGhlIGVsZW1lbnQgb3IgZW5hYmxlIHRoZSBwb2x5ZmlsbFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gZmluZCBvdXQgdGhlIHRvdWNoLWFjdGlvbiBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgaWYgKHZhbHVlID09IFRPVUNIX0FDVElPTl9DT01QVVRFKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE5BVElWRV9UT1VDSF9BQ1RJT04gJiYgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGUgJiYgVE9VQ0hfQUNUSU9OX01BUFt2YWx1ZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW1BSRUZJWEVEX1RPVUNIX0FDVElPTl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGlvbnMgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICoganVzdCByZS1zZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5IGJhc2VkIG9uIHRoZSByZWNvZ25pemVyJ3Mgc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIGNvbXB1dGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBlYWNoKHRoaXMubWFuYWdlci5yZWNvZ25pemVycywgZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICAgICAgaWYgKGJvb2xPckZuKHJlY29nbml6ZXIub3B0aW9ucy5lbmFibGUsIFtyZWNvZ25pemVyXSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zID0gYWN0aW9ucy5jb25jYXQocmVjb2duaXplci5nZXRUb3VjaEFjdGlvbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIGlucHV0IGN5Y2xlIGFuZCBwcm92aWRlcyB0aGUgcHJldmVudGluZyBvZiB0aGUgYnJvd3NlciBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0czogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHNyY0V2ZW50ID0gaW5wdXQuc3JjRXZlbnQ7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247XG5cbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGFjdGlvbiBkaWQgcHJldmVudGVkIG9uY2UgdGhpcyBzZXNzaW9uXG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucztcbiAgICAgICAgdmFyIGhhc05vbmUgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgICAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9ZXTtcbiAgICAgICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9QQU5fWF07XG5cbiAgICAgICAgaWYgKGhhc05vbmUpIHtcbiAgICAgICAgICAgIC8vZG8gbm90IHByZXZlbnQgZGVmYXVsdHMgaWYgdGhpcyBpcyBhIHRhcCBnZXN0dXJlXG5cbiAgICAgICAgICAgIHZhciBpc1RhcFBvaW50ZXIgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB2YXIgaXNUYXBNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgMjtcbiAgICAgICAgICAgIHZhciBpc1RhcFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IDI1MDtcblxuICAgICAgICAgICAgaWYgKGlzVGFwUG9pbnRlciAmJiBpc1RhcE1vdmVtZW50ICYmIGlzVGFwVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgICAgICAgLy8gYHBhbi14IHBhbi15YCBtZWFucyBicm93c2VyIGhhbmRsZXMgYWxsIHNjcm9sbGluZy9wYW5uaW5nLCBkbyBub3QgcHJldmVudFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc05vbmUgfHxcbiAgICAgICAgICAgIChoYXNQYW5ZICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB8fFxuICAgICAgICAgICAgKGhhc1BhblggJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmVudFNyYyhzcmNFdmVudCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbCBwcmV2ZW50RGVmYXVsdCB0byBwcmV2ZW50IHRoZSBicm93c2VyJ3MgZGVmYXVsdCBiZWhhdmlvciAoc2Nyb2xsaW5nIGluIG1vc3QgY2FzZXMpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNyY0V2ZW50XG4gICAgICovXG4gICAgcHJldmVudFNyYzogZnVuY3Rpb24oc3JjRXZlbnQpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIHdoZW4gdGhlIHRvdWNoQWN0aW9ucyBhcmUgY29sbGVjdGVkIHRoZXkgYXJlIG5vdCBhIHZhbGlkIHZhbHVlLCBzbyB3ZSBuZWVkIHRvIGNsZWFuIHRoaW5ncyB1cC4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbnNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zKSB7XG4gICAgLy8gbm9uZVxuICAgIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSk7XG5cbiAgICAvLyBpZiBib3RoIHBhbi14IGFuZCBwYW4teSBhcmUgc2V0IChkaWZmZXJlbnQgcmVjb2duaXplcnNcbiAgICAvLyBmb3IgZGlmZmVyZW50IGRpcmVjdGlvbnMsIGUuZy4gaG9yaXpvbnRhbCBwYW4gYnV0IHZlcnRpY2FsIHN3aXBlPylcbiAgICAvLyB3ZSBuZWVkIG5vbmUgKGFzIG90aGVyd2lzZSB3aXRoIHBhbi14IHBhbi15IGNvbWJpbmVkIG5vbmUgb2YgdGhlc2VcbiAgICAvLyByZWNvZ25pemVycyB3aWxsIHdvcmssIHNpbmNlIHRoZSBicm93c2VyIHdvdWxkIGhhbmRsZSBhbGwgcGFubmluZ1xuICAgIGlmIChoYXNQYW5YICYmIGhhc1BhblkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIC8vIHBhbi14IE9SIHBhbi15XG4gICAgaWYgKGhhc1BhblggfHwgaGFzUGFuWSkge1xuICAgICAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgICB9XG5cbiAgICAvLyBtYW5pcHVsYXRpb25cbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTikpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT047XG4gICAgfVxuXG4gICAgcmV0dXJuIFRPVUNIX0FDVElPTl9BVVRPO1xufVxuXG5mdW5jdGlvbiBnZXRUb3VjaEFjdGlvblByb3BzKCkge1xuICAgIGlmICghTkFUSVZFX1RPVUNIX0FDVElPTikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB0b3VjaE1hcCA9IHt9O1xuICAgIHZhciBjc3NTdXBwb3J0cyA9IHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5zdXBwb3J0cztcbiAgICBbJ2F1dG8nLCAnbWFuaXB1bGF0aW9uJywgJ3Bhbi15JywgJ3Bhbi14JywgJ3Bhbi14IHBhbi15JywgJ25vbmUnXS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCkge1xuXG4gICAgICAgIC8vIElmIGNzcy5zdXBwb3J0cyBpcyBub3Qgc3VwcG9ydGVkIGJ1dCB0aGVyZSBpcyBuYXRpdmUgdG91Y2gtYWN0aW9uIGFzc3VtZSBpdCBzdXBwb3J0c1xuICAgICAgICAvLyBhbGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBJRSAxMCBhbmQgMTEuXG4gICAgICAgIHRvdWNoTWFwW3ZhbF0gPSBjc3NTdXBwb3J0cyA/IHdpbmRvdy5DU1Muc3VwcG9ydHMoJ3RvdWNoLWFjdGlvbicsIHZhbCkgOiB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0b3VjaE1hcDtcbn1cblxuLyoqXG4gKiBSZWNvZ25pemVyIGZsb3cgZXhwbGFpbmVkOyAqXG4gKiBBbGwgcmVjb2duaXplcnMgaGF2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBQT1NTSUJMRSB3aGVuIGEgaW5wdXQgc2Vzc2lvbiBzdGFydHMuXG4gKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAqIEV4YW1wbGUgc2Vzc2lvbiBmb3IgbW91c2UtaW5wdXQ6IG1vdXNlZG93biAtPiBtb3VzZW1vdmUgLT4gbW91c2V1cFxuICpcbiAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAqIHdoaWNoIGRldGVybWluZXMgd2l0aCBzdGF0ZSBpdCBzaG91bGQgYmUuXG4gKlxuICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICogUE9TU0lCTEUgdG8gZ2l2ZSBpdCBhbm90aGVyIGNoYW5nZSBvbiB0aGUgbmV4dCBjeWNsZS5cbiAqXG4gKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gKiAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLStcbiAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgKy0tLS0tKy0tLS0tKyAgICAgICAgICAgICAgIHxcbiAqICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHxcbiAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSstLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kZWQvUmVjb2duaXplZFxuICovXG52YXIgU1RBVEVfUE9TU0lCTEUgPSAxO1xudmFyIFNUQVRFX0JFR0FOID0gMjtcbnZhciBTVEFURV9DSEFOR0VEID0gNDtcbnZhciBTVEFURV9FTkRFRCA9IDg7XG52YXIgU1RBVEVfUkVDT0dOSVpFRCA9IFNUQVRFX0VOREVEO1xudmFyIFNUQVRFX0NBTkNFTExFRCA9IDE2O1xudmFyIFNUQVRFX0ZBSUxFRCA9IDMyO1xuXG4vKipcbiAqIFJlY29nbml6ZXJcbiAqIEV2ZXJ5IHJlY29nbml6ZXIgbmVlZHMgdG8gZXh0ZW5kIGZyb20gdGhpcyBjbGFzcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMuaWQgPSB1bmlxdWVJZCgpO1xuXG4gICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcblxuICAgIC8vIGRlZmF1bHQgaXMgZW5hYmxlIHRydWVcbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlID0gaWZVbmRlZmluZWQodGhpcy5vcHRpb25zLmVuYWJsZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG5cbiAgICB0aGlzLnNpbXVsdGFuZW91cyA9IHt9O1xuICAgIHRoaXMucmVxdWlyZUZhaWwgPSBbXTtcbn1cblxuUmVjb2duaXplci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtSZWNvZ25pemVyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgdG91Y2hBY3Rpb24sIGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgYWJvdXQgdGhlIGRpcmVjdGlvbnMvZW5hYmxlZCBzdGF0ZVxuICAgICAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAncmVjb2duaXplV2l0aCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaW11bHRhbmVvdXMgPSB0aGlzLnNpbXVsdGFuZW91cztcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICAgICAgICBzaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXSA9IG90aGVyUmVjb2duaXplcjtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZWNvZ25pemVXaXRoKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSBzaW11bHRhbmVvdXMgbGluay4gaXQgZG9lc250IHJlbW92ZSB0aGUgbGluayBvbiB0aGUgb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgZHJvcFJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplciBjYW4gb25seSBydW4gd2hlbiBhbiBvdGhlciBpcyBmYWlsaW5nXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlcXVpcmVGYWlsID0gdGhpcy5yZXF1aXJlRmFpbDtcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoaW5BcnJheShyZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlcXVpcmVGYWlsLnB1c2gob3RoZXJSZWNvZ25pemVyKTtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZXF1aXJlRmFpbHVyZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZHJvcCB0aGUgcmVxdWlyZUZhaWx1cmUgbGluay4gaXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVxdWlyZUZhaWx1cmU6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHRoaXMucmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNSZXF1aXJlRmFpbHVyZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGggPiAwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGUgcmVjb2duaXplciBjYW4gcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNhblJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICByZXR1cm4gISF0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBZb3Ugc2hvdWxkIHVzZSBgdHJ5RW1pdGAgaW5zdGVhZCBvZiBgZW1pdGAgZGlyZWN0bHkgdG8gY2hlY2tcbiAgICAgKiB0aGF0IGFsbCB0aGUgbmVlZGVkIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQgYmVmb3JlIGVtaXR0aW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG4gICAgICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdChldmVudCwgaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJ3BhbnN0YXJ0JyBhbmQgJ3Bhbm1vdmUnXG4gICAgICAgIGlmIChzdGF0ZSA8IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCk7IC8vIHNpbXBsZSAnZXZlbnROYW1lJyBldmVudHNcblxuICAgICAgICBpZiAoaW5wdXQuYWRkaXRpb25hbEV2ZW50KSB7IC8vIGFkZGl0aW9uYWwgZXZlbnQocGFubGVmdCwgcGFucmlnaHQsIHBpbmNoaW4sIHBpbmNob3V0Li4uKVxuICAgICAgICAgICAgZW1pdChpbnB1dC5hZGRpdGlvbmFsRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFuZW5kIGFuZCBwYW5jYW5jZWxcbiAgICAgICAgaWYgKHN0YXRlID49IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmUgZmFpbHVyZSByZWNvZ25pemVycyBoYXMgZmFpbGVkLFxuICAgICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICAgKiBvdGhlcndpc2UsIHNldHVwIHRoZSBzdGF0ZSB0byBGQUlMRUQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgdHJ5RW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuRW1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpdCdzIGZhaWxpbmcgYW55d2F5XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbiB3ZSBlbWl0P1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNhbkVtaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMucmVxdWlyZUZhaWxbaV0uc3RhdGUgJiAoU1RBVEVfRkFJTEVEIHwgU1RBVEVfUE9TU0lCTEUpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSByZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIC8vIG1ha2UgYSBuZXcgY29weSBvZiB0aGUgaW5wdXREYXRhXG4gICAgICAgIC8vIHNvIHdlIGNhbiBjaGFuZ2UgdGhlIGlucHV0RGF0YSB3aXRob3V0IG1lc3NpbmcgdXAgdGhlIG90aGVyIHJlY29nbml6ZXJzXG4gICAgICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbih7fSwgaW5wdXREYXRhKTtcblxuICAgICAgICAvLyBpcyBpcyBlbmFibGVkIGFuZCBhbGxvdyByZWNvZ25pemluZz9cbiAgICAgICAgaWYgKCFib29sT3JGbih0aGlzLm9wdGlvbnMuZW5hYmxlLCBbdGhpcywgaW5wdXREYXRhQ2xvbmVdKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc2V0IHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX1JFQ09HTklaRUQgfCBTVEFURV9DQU5DRUxMRUQgfCBTVEFURV9GQUlMRUQpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5wcm9jZXNzKGlucHV0RGF0YUNsb25lKTtcblxuICAgICAgICAvLyB0aGUgcmVjb2duaXplciBoYXMgcmVjb2duaXplZCBhIGdlc3R1cmVcbiAgICAgICAgLy8gc28gdHJpZ2dlciBhbiBldmVudFxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCB8IFNUQVRFX0NBTkNFTExFRCkpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5RW1pdChpbnB1dERhdGFDbG9uZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgcmVjb2duaXplclxuICAgICAqIHRoZSBhY3R1YWwgcmVjb2duaXppbmcgaGFwcGVucyBpbiB0aGlzIG1ldGhvZFxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqIEByZXR1cm5zIHtDb25zdH0gU1RBVEVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dERhdGEpIHsgfSwgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHByZWZlcnJlZCB0b3VjaC1hY3Rpb25cbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZ2VzdHVyZSBpc24ndCBhbGxvd2VkIHRvIHJlY29nbml6ZVxuICAgICAqIGxpa2Ugd2hlbiBhbm90aGVyIGlzIGJlaW5nIHJlY29nbml6ZWQgb3IgaXQgaXMgZGlzYWJsZWRcbiAgICAgKiBAdmlydHVhbFxuICAgICAqL1xuICAgIHJlc2V0OiBmdW5jdGlvbigpIHsgfVxufTtcblxuLyoqXG4gKiBnZXQgYSB1c2FibGUgc3RyaW5nLCB1c2VkIGFzIGV2ZW50IHBvc3RmaXhcbiAqIEBwYXJhbSB7Q29uc3R9IHN0YXRlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdGF0ZVxuICovXG5mdW5jdGlvbiBzdGF0ZVN0cihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZSAmIFNUQVRFX0NBTkNFTExFRCkge1xuICAgICAgICByZXR1cm4gJ2NhbmNlbCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgICAgIHJldHVybiAnZW5kJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfQ0hBTkdFRCkge1xuICAgICAgICByZXR1cm4gJ21vdmUnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9CRUdBTikge1xuICAgICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGRpcmVjdGlvbiBjb25zIHRvIHN0cmluZ1xuICogQHBhcmFtIHtDb25zdH0gZGlyZWN0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBkaXJlY3Rpb25TdHIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTikge1xuICAgICAgICByZXR1cm4gJ2Rvd24nO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9VUCkge1xuICAgICAgICByZXR1cm4gJ3VwJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fTEVGVCkge1xuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9SSUdIVCkge1xuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGdldCBhIHJlY29nbml6ZXIgYnkgbmFtZSBpZiBpdCBpcyBib3VuZCB0byBhIG1hbmFnZXJcbiAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IG90aGVyUmVjb2duaXplclxuICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gKiBAcmV0dXJucyB7UmVjb2duaXplcn1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHJlY29nbml6ZXIpIHtcbiAgICB2YXIgbWFuYWdlciA9IHJlY29nbml6ZXIubWFuYWdlcjtcbiAgICBpZiAobWFuYWdlcikge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5nZXQob3RoZXJSZWNvZ25pemVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG90aGVyUmVjb2duaXplcjtcbn1cblxuLyoqXG4gKiBUaGlzIHJlY29nbml6ZXIgaXMganVzdCB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgcmVjb2duaXplcnMuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gQXR0clJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KEF0dHJSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBBdHRyUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIGl0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVzIHZhbGlkIGlucHV0LCBsaWtlIGlucHV0LmRpc3RhbmNlID4gMTAuXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHJlY29nbml6ZWRcbiAgICAgKi9cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvblBvaW50ZXJzID0gdGhpcy5vcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICByZXR1cm4gb3B0aW9uUG9pbnRlcnMgPT09IDAgfHwgaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25Qb2ludGVycztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgaW5wdXQgYW5kIHJldHVybiB0aGUgc3RhdGUgZm9yIHRoZSByZWNvZ25pemVyXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMgeyp9IFN0YXRlXG4gICAgICovXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdmFyIGV2ZW50VHlwZSA9IGlucHV0LmV2ZW50VHlwZTtcblxuICAgICAgICB2YXIgaXNSZWNvZ25pemVkID0gc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEKTtcbiAgICAgICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTtcblxuICAgICAgICAvLyBvbiBjYW5jZWwgaW5wdXQgYW5kIHdlJ3ZlIHJlY29nbml6ZWQgYmVmb3JlLCByZXR1cm4gU1RBVEVfQ0FOQ0VMTEVEXG4gICAgICAgIGlmIChpc1JlY29nbml6ZWQgJiYgKGV2ZW50VHlwZSAmIElOUFVUX0NBTkNFTCB8fCAhaXNWYWxpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NBTkNFTExFRDtcbiAgICAgICAgfSBlbHNlIGlmIChpc1JlY29nbml6ZWQgfHwgaXNWYWxpZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0VOREVEO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghKHN0YXRlICYgU1RBVEVfQkVHQU4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0JFR0FOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0hBTkdFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFBhblxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gYW5kIG1vdmVkIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGFuUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5wWCA9IG51bGw7XG4gICAgdGhpcy5wWSA9IG51bGw7XG59XG5cbmluaGVyaXQoUGFuUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBhblJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3BhbicsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9BTExcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9ucztcbiAgICB9LFxuXG4gICAgZGlyZWN0aW9uVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9IGlucHV0LmRpc3RhbmNlO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gaW5wdXQuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdmFyIHkgPSBpbnB1dC5kZWx0YVk7XG5cbiAgICAgICAgLy8gbG9jayB0byBheGlzP1xuICAgICAgICBpZiAoIShkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gKHggPT09IDApID8gRElSRUNUSU9OX05PTkUgOiAoeCA8IDApID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgICAgICAgaGFzTW92ZWQgPSB4ICE9IHRoaXMucFg7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAoeSA9PT0gMCkgPyBESVJFQ1RJT05fTk9ORSA6ICh5IDwgMCkgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlZCA9IHkgIT0gdGhpcy5wWTtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0LmRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICByZXR1cm4gaGFzTW92ZWQgJiYgZGlzdGFuY2UgPiBvcHRpb25zLnRocmVzaG9sZCAmJiBkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbjtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBBdHRyUmVjb2duaXplci5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgICh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4gfHwgKCEodGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKSAmJiB0aGlzLmRpcmVjdGlvblRlc3QoaW5wdXQpKSk7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG5cbiAgICAgICAgdGhpcy5wWCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdGhpcy5wWSA9IGlucHV0LmRlbHRhWTtcblxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0LmRpcmVjdGlvbik7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUGluY2hcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVycyBhcmUgbW92aW5nIHRvd2FyZCAoem9vbS1pbikgb3IgYXdheSBmcm9tIGVhY2ggb3RoZXIgKHpvb20tb3V0KS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGluY2hSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUGluY2hSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdwaW5jaCcsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5zY2FsZSAhPT0gMSkge1xuICAgICAgICAgICAgdmFyIGluT3V0ID0gaW5wdXQuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnO1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgaW5PdXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQcmVzc1xuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gZm9yIHggbXMgd2l0aG91dCBhbnkgbW92ZW1lbnQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUHJlc3NSZWNvZ25pemVyKCkge1xuICAgIFJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG59XG5cbmluaGVyaXQoUHJlc3NSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQcmVzc1JlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3ByZXNzJyxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIHRpbWU6IDI1MSwgLy8gbWluaW1hbCB0aW1lIG9mIHRoZSBwb2ludGVyIHRvIGJlIHByZXNzZWRcbiAgICAgICAgdGhyZXNob2xkOiA5IC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fQVVUT107XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB2YXIgdmFsaWRUaW1lID0gaW5wdXQuZGVsdGFUaW1lID4gb3B0aW9ucy50aW1lO1xuXG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAoIXZhbGlkTW92ZW1lbnQgfHwgIXZhbGlkUG9pbnRlcnMgfHwgKGlucHV0LmV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmICF2YWxpZFRpbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLnRpbWUsIHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlucHV0ICYmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyAndXAnLCBpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogUm90YXRlXG4gKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlciBhcmUgbW92aW5nIGluIGEgY2lyY3VsYXIgbW90aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBSb3RhdGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUm90YXRlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFJvdGF0ZVJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3JvdGF0ZScsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnJvdGF0aW9uKSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgfHwgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBTd2lwZVxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIG1vdmluZyBmYXN0ICh2ZWxvY2l0eSksIHdpdGggZW5vdWdoIGRpc3RhbmNlIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gU3dpcGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU3dpcGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgU3dpcGVSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdzd2lwZScsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHZlbG9jaXR5OiAwLjMsXG4gICAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFBhblJlY29nbml6ZXIucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyk7XG4gICAgfSxcblxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHZlbG9jaXR5O1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYO1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiZcbiAgICAgICAgICAgIGlucHV0LmRpc3RhbmNlID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCAmJlxuICAgICAgICAgICAgaW5wdXQubWF4UG9pbnRlcnMgPT0gdGhpcy5vcHRpb25zLnBvaW50ZXJzICYmXG4gICAgICAgICAgICBhYnModmVsb2NpdHkpID4gdGhpcy5vcHRpb25zLnZlbG9jaXR5ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORDtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvblN0cihpbnB1dC5vZmZzZXREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb24sIGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEEgdGFwIGlzIGVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAqIGJldHdlZW4gdGhlIGdpdmVuIGludGVydmFsIGFuZCBwb3NpdGlvbi4gVGhlIGRlbGF5IG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgbXVsdGktdGFwcyB3aXRob3V0IGZpcmluZ1xuICogYSBzaW5nbGUgdGFwLlxuICpcbiAqIFRoZSBldmVudERhdGEgZnJvbSB0aGUgZW1pdHRlZCBldmVudCBjb250YWlucyB0aGUgcHJvcGVydHkgYHRhcENvdW50YCwgd2hpY2ggY29udGFpbnMgdGhlIGFtb3VudCBvZlxuICogbXVsdGktdGFwcyBiZWluZyByZWNvZ25pemVkLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFRhcFJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gcHJldmlvdXMgdGltZSBhbmQgY2VudGVyLFxuICAgIC8vIHVzZWQgZm9yIHRhcCBjb3VudGluZ1xuICAgIHRoaXMucFRpbWUgPSBmYWxzZTtcbiAgICB0aGlzLnBDZW50ZXIgPSBmYWxzZTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG4gICAgdGhpcy5jb3VudCA9IDA7XG59XG5cbmluaGVyaXQoVGFwUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICd0YXAnLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgdGFwczogMSxcbiAgICAgICAgaW50ZXJ2YWw6IDMwMCwgLy8gbWF4IHRpbWUgYmV0d2VlbiB0aGUgbXVsdGktdGFwIHRhcHNcbiAgICAgICAgdGltZTogMjUwLCAvLyBtYXggdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBkb3duIChsaWtlIGZpbmdlciBvbiB0aGUgc2NyZWVuKVxuICAgICAgICB0aHJlc2hvbGQ6IDksIC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgICAgIHBvc1RocmVzaG9sZDogMTAgLy8gYSBtdWx0aS10YXAgY2FuIGJlIGEgYml0IG9mZiB0aGUgaW5pdGlhbCBwb3NpdGlvblxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTl07XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICB2YXIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHZhciB2YWxpZFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IG9wdGlvbnMudGltZTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgaWYgKChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkgJiYgKHRoaXMuY291bnQgPT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAodmFsaWRNb3ZlbWVudCAmJiB2YWxpZFRvdWNoVGltZSAmJiB2YWxpZFBvaW50ZXJzKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2YWxpZEludGVydmFsID0gdGhpcy5wVGltZSA/IChpbnB1dC50aW1lU3RhbXAgLSB0aGlzLnBUaW1lIDwgb3B0aW9ucy5pbnRlcnZhbCkgOiB0cnVlO1xuICAgICAgICAgICAgdmFyIHZhbGlkTXVsdGlUYXAgPSAhdGhpcy5wQ2VudGVyIHx8IGdldERpc3RhbmNlKHRoaXMucENlbnRlciwgaW5wdXQuY2VudGVyKSA8IG9wdGlvbnMucG9zVGhyZXNob2xkO1xuXG4gICAgICAgICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgICAgICAgdGhpcy5wQ2VudGVyID0gaW5wdXQuY2VudGVyO1xuXG4gICAgICAgICAgICBpZiAoIXZhbGlkTXVsdGlUYXAgfHwgIXZhbGlkSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgICAgICAvLyBpZiB0YXAgY291bnQgbWF0Y2hlcyB3ZSBoYXZlIHJlY29nbml6ZWQgaXQsXG4gICAgICAgICAgICAvLyBlbHNlIGl0IGhhcyBiZWdhbiByZWNvZ25pemluZy4uLlxuICAgICAgICAgICAgdmFyIHRhcENvdW50ID0gdGhpcy5jb3VudCAlIG9wdGlvbnMudGFwcztcbiAgICAgICAgICAgIGlmICh0YXBDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGZhaWxpbmcgcmVxdWlyZW1lbnRzLCBpbW1lZGlhdGVseSB0cmlnZ2VyIHRoZSB0YXAgZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBvciB3YWl0IGFzIGxvbmcgYXMgdGhlIG11bHRpdGFwIGludGVydmFsIHRvIHRyaWdnZXJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIG9wdGlvbnMuaW50ZXJ2YWwsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIGZhaWxUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgICAgIH0sIHRoaXMub3B0aW9ucy5pbnRlcnZhbCwgdGhpcyk7XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRhcENvdW50ID0gdGhpcy5jb3VudDtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogU2ltcGxlIHdheSB0byBjcmVhdGUgYSBtYW5hZ2VyIHdpdGggYSBkZWZhdWx0IHNldCBvZiByZWNvZ25pemVycy5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVjb2duaXplcnMgPSBpZlVuZGVmaW5lZChvcHRpb25zLnJlY29nbml6ZXJzLCBIYW1tZXIuZGVmYXVsdHMucHJlc2V0KTtcbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogQGNvbnN0IHtzdHJpbmd9XG4gKi9cbkhhbW1lci5WRVJTSU9OID0gJzIuMC43JztcblxuLyoqXG4gKiBkZWZhdWx0IHNldHRpbmdzXG4gKiBAbmFtZXNwYWNlXG4gKi9cbkhhbW1lci5kZWZhdWx0cyA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgaWYgRE9NIGV2ZW50cyBhcmUgYmVpbmcgdHJpZ2dlcmVkLlxuICAgICAqIEJ1dCB0aGlzIGlzIHNsb3dlciBhbmQgdW51c2VkIGJ5IHNpbXBsZSBpbXBsZW1lbnRhdGlvbnMsIHNvIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBkb21FdmVudHM6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGZvciB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkvZmFsbGJhY2suXG4gICAgICogV2hlbiBzZXQgdG8gYGNvbXB1dGVgIGl0IHdpbGwgbWFnaWNhbGx5IHNldCB0aGUgY29ycmVjdCB2YWx1ZSBiYXNlZCBvbiB0aGUgYWRkZWQgcmVjb2duaXplcnMuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCBjb21wdXRlXG4gICAgICovXG4gICAgdG91Y2hBY3Rpb246IFRPVUNIX0FDVElPTl9DT01QVVRFLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZTogdHJ1ZSxcblxuICAgIC8qKlxuICAgICAqIEVYUEVSSU1FTlRBTCBGRUFUVVJFIC0tIGNhbiBiZSByZW1vdmVkL2NoYW5nZWRcbiAgICAgKiBDaGFuZ2UgdGhlIHBhcmVudCBpbnB1dCB0YXJnZXQgZWxlbWVudC5cbiAgICAgKiBJZiBOdWxsLCB0aGVuIGl0IGlzIGJlaW5nIHNldCB0aGUgdG8gbWFpbiBlbGVtZW50LlxuICAgICAqIEB0eXBlIHtOdWxsfEV2ZW50VGFyZ2V0fVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dFRhcmdldDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIGZvcmNlIGFuIGlucHV0IGNsYXNzXG4gICAgICogQHR5cGUge051bGx8RnVuY3Rpb259XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuICAgIGlucHV0Q2xhc3M6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHJlY29nbml6ZXIgc2V0dXAgd2hlbiBjYWxsaW5nIGBIYW1tZXIoKWBcbiAgICAgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIgdGhlc2Ugd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgKi9cbiAgICBwcmVzZXQ6IFtcbiAgICAgICAgLy8gUmVjb2duaXplckNsYXNzLCBvcHRpb25zLCBbcmVjb2duaXplV2l0aCwgLi4uXSwgW3JlcXVpcmVGYWlsdXJlLCAuLi5dXG4gICAgICAgIFtSb3RhdGVSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX1dLFxuICAgICAgICBbUGluY2hSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX0sIFsncm90YXRlJ11dLFxuICAgICAgICBbU3dpcGVSZWNvZ25pemVyLCB7ZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTH1dLFxuICAgICAgICBbUGFuUmVjb2duaXplciwge2RpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUx9LCBbJ3N3aXBlJ11dLFxuICAgICAgICBbVGFwUmVjb2duaXplcl0sXG4gICAgICAgIFtUYXBSZWNvZ25pemVyLCB7ZXZlbnQ6ICdkb3VibGV0YXAnLCB0YXBzOiAyfSwgWyd0YXAnXV0sXG4gICAgICAgIFtQcmVzc1JlY29nbml6ZXJdXG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqIFNvbWUgQ1NTIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgd29ya2luZyBvZiBIYW1tZXIuXG4gICAgICogQWRkIHRoZW0gdG8gdGhpcyBtZXRob2QgYW5kIHRoZXkgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyLlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKi9cbiAgICBjc3NQcm9wczoge1xuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZSB0aGUgV2luZG93cyBQaG9uZSBncmlwcGVycyB3aGVuIHByZXNzaW5nIGFuIGVsZW1lbnQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGhlIGRlZmF1bHQgY2FsbG91dCBzaG93biB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldC5cbiAgICAgICAgICogT24gaU9TLCB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldCBzdWNoIGFzIGEgbGluaywgU2FmYXJpIGRpc3BsYXlzXG4gICAgICAgICAqIGEgY2FsbG91dCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLiBUaGlzIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGNhbGxvdXQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHpvb21pbmcgaXMgZW5hYmxlZC4gVXNlZCBieSBJRTEwPlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGF0IGFuIGVudGlyZSBlbGVtZW50IHNob3VsZCBiZSBkcmFnZ2FibGUgaW5zdGVhZCBvZiBpdHMgY29udGVudHMuIE1haW5seSBmb3IgZGVza3RvcCBicm93c2Vycy5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyRHJhZzogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPdmVycmlkZXMgdGhlIGhpZ2hsaWdodCBjb2xvciBzaG93biB3aGVuIHRoZSB1c2VyIHRhcHMgYSBsaW5rIG9yIGEgSmF2YVNjcmlwdFxuICAgICAgICAgKiBjbGlja2FibGUgZWxlbWVudCBpbiBpT1MuIFRoaXMgcHJvcGVydHkgb2JleXMgdGhlIGFscGhhIHZhbHVlLCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdyZ2JhKDAsMCwwLDApJ1xuICAgICAgICAgKi9cbiAgICAgICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsMCwwLDApJ1xuICAgIH1cbn07XG5cbnZhciBTVE9QID0gMTtcbnZhciBGT1JDRURfU1RPUCA9IDI7XG5cbi8qKlxuICogTWFuYWdlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgSGFtbWVyLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCA9IHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCB8fCBlbGVtZW50O1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuaW5wdXQgPSBjcmVhdGVJbnB1dEluc3RhbmNlKHRoaXMpO1xuICAgIHRoaXMudG91Y2hBY3Rpb24gPSBuZXcgVG91Y2hBY3Rpb24odGhpcywgdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKTtcblxuICAgIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIHRydWUpO1xuXG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgdmFyIHJlY29nbml6ZXIgPSB0aGlzLmFkZChuZXcgKGl0ZW1bMF0pKGl0ZW1bMV0pKTtcbiAgICAgICAgaXRlbVsyXSAmJiByZWNvZ25pemVyLnJlY29nbml6ZVdpdGgoaXRlbVsyXSk7XG4gICAgICAgIGl0ZW1bM10gJiYgcmVjb2duaXplci5yZXF1aXJlRmFpbHVyZShpdGVtWzNdKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBPcHRpb25zIHRoYXQgbmVlZCBhIGxpdHRsZSBtb3JlIHNldHVwXG4gICAgICAgIGlmIChvcHRpb25zLnRvdWNoQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmlucHV0VGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBldmVudCBsaXN0ZW5lcnMgYW5kIHJlaW5pdGlhbGl6ZVxuICAgICAgICAgICAgdGhpcy5pbnB1dC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0LnRhcmdldCA9IG9wdGlvbnMuaW5wdXRUYXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAqIFRoaXMgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZCwgd2hlbiBhIG5ldyBbaW5wdXRdc3RhcnQgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogV2hlbiBmb3JjZWQsIHRoZSByZWNvZ25pemVyIGN5Y2xlIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcnVuIHRoZSByZWNvZ25pemVycyFcbiAgICAgKiBjYWxsZWQgYnkgdGhlIGlucHV0SGFuZGxlciBmdW5jdGlvbiBvbiBldmVyeSBtb3ZlbWVudCBvZiB0aGUgcG9pbnRlcnMgKHRvdWNoZXMpXG4gICAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdG9wcGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW4gdGhlIHRvdWNoLWFjdGlvbiBwb2x5ZmlsbFxuICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnByZXZlbnREZWZhdWx0cyhpbnB1dERhdGEpO1xuXG4gICAgICAgIHZhciByZWNvZ25pemVyO1xuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuXG4gICAgICAgIC8vIHRoaXMgaG9sZHMgdGhlIHJlY29nbml6ZXIgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgICAvLyBzbyB0aGUgcmVjb2duaXplcidzIHN0YXRlIG5lZWRzIHRvIGJlIEJFR0FOLCBDSEFOR0VELCBFTkRFRCBvciBSRUNPR05JWkVEXG4gICAgICAgIC8vIGlmIG5vIHJlY29nbml6ZXIgaXMgZGV0ZWN0aW5nIGEgdGhpbmcsIGl0IGlzIHNldCB0byBgbnVsbGBcbiAgICAgICAgdmFyIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXI7XG5cbiAgICAgICAgLy8gcmVzZXQgd2hlbiB0aGUgbGFzdCByZWNvZ25pemVyIGlzIHJlY29nbml6ZWRcbiAgICAgICAgLy8gb3Igd2hlbiB3ZSdyZSBpbiBhIG5ldyBzZXNzaW9uXG4gICAgICAgIGlmICghY3VyUmVjb2duaXplciB8fCAoY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkpIHtcbiAgICAgICAgICAgIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHJlY29nbml6ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVjb2duaXplciA9IHJlY29nbml6ZXJzW2ldO1xuXG4gICAgICAgICAgICAvLyBmaW5kIG91dCBpZiB3ZSBhcmUgYWxsb3dlZCB0cnkgdG8gcmVjb2duaXplIHRoZSBpbnB1dCBmb3IgdGhpcyBvbmUuXG4gICAgICAgICAgICAvLyAxLiAgIGFsbG93IGlmIHRoZSBzZXNzaW9uIGlzIE5PVCBmb3JjZWQgc3RvcHBlZCAoc2VlIHRoZSAuc3RvcCgpIG1ldGhvZClcbiAgICAgICAgICAgIC8vIDIuICAgYWxsb3cgaWYgd2Ugc3RpbGwgaGF2ZW4ndCByZWNvZ25pemVkIGEgZ2VzdHVyZSBpbiB0aGlzIHNlc3Npb24sIG9yIHRoZSB0aGlzIHJlY29nbml6ZXIgaXMgdGhlIG9uZVxuICAgICAgICAgICAgLy8gICAgICB0aGF0IGlzIGJlaW5nIHJlY29nbml6ZWQuXG4gICAgICAgICAgICAvLyAzLiAgIGFsbG93IGlmIHRoZSByZWNvZ25pemVyIGlzIGFsbG93ZWQgdG8gcnVuIHNpbXVsdGFuZW91cyB3aXRoIHRoZSBjdXJyZW50IHJlY29nbml6ZWQgcmVjb2duaXplci5cbiAgICAgICAgICAgIC8vICAgICAgdGhpcyBjYW4gYmUgc2V0dXAgd2l0aCB0aGUgYHJlY29nbml6ZVdpdGgoKWAgbWV0aG9kIG9uIHRoZSByZWNvZ25pemVyLlxuICAgICAgICAgICAgaWYgKHNlc3Npb24uc3RvcHBlZCAhPT0gRk9SQ0VEX1NUT1AgJiYgKCAvLyAxXG4gICAgICAgICAgICAgICAgICAgICFjdXJSZWNvZ25pemVyIHx8IHJlY29nbml6ZXIgPT0gY3VyUmVjb2duaXplciB8fCAvLyAyXG4gICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXIuY2FuUmVjb2duaXplV2l0aChjdXJSZWNvZ25pemVyKSkpIHsgLy8gM1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplKGlucHV0RGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29nbml6ZXIgaGFzIGJlZW4gcmVjb2duaXppbmcgdGhlIGlucHV0IGFzIGEgdmFsaWQgZ2VzdHVyZSwgd2Ugd2FudCB0byBzdG9yZSB0aGlzIG9uZSBhcyB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuICAgICAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyICYmIHJlY29nbml6ZXIuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQpKSB7XG4gICAgICAgICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IHJlY29nbml6ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2V0IGEgcmVjb2duaXplciBieSBpdHMgZXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TnVsbH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKHJlY29nbml6ZXIgaW5zdGFuY2VvZiBSZWNvZ25pemVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb2duaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyZWNvZ25pemVyc1tpXS5vcHRpb25zLmV2ZW50ID09IHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGFkZCBhIHJlY29nbml6ZXIgdG8gdGhlIG1hbmFnZXJcbiAgICAgKiBleGlzdGluZyByZWNvZ25pemVycyB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgd2lsbCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TWFuYWdlcn1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdhZGQnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmdcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdGhpcy5nZXQocmVjb2duaXplci5vcHRpb25zLmV2ZW50KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZShleGlzdGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2duaXplcik7XG4gICAgICAgIHJlY29nbml6ZXIubWFuYWdlciA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHJlY29nbml6ZXI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhIHJlY29nbml6ZXIgYnkgbmFtZSBvciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7TWFuYWdlcn1cbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdyZW1vdmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvZ25pemVyID0gdGhpcy5nZXQocmVjb2duaXplcik7XG5cbiAgICAgICAgLy8gbGV0J3MgbWFrZSBzdXJlIHRoaXMgcmVjb2duaXplciBleGlzdHNcbiAgICAgICAgaWYgKHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHJlY29nbml6ZXJzLCByZWNvZ25pemVyKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIGV2ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgZXZlbnQsIGxlYXZlIGVtaXQgYmxhbmsgdG8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaGFuZGxlcl1cbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihldmVudHMsIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlcnNbZXZlbnRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gJiYgaGFuZGxlcnNbZXZlbnRdLnNwbGljZShpbkFycmF5KGhhbmRsZXJzW2V2ZW50XSwgaGFuZGxlciksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGVtaXQgZXZlbnQgdG8gdGhlIGxpc3RlbmVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgLy8gd2UgYWxzbyB3YW50IHRvIHRyaWdnZXIgZG9tIGV2ZW50c1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgICAgICAgdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGhhbmRsZXJzLCBzbyBza2lwIGl0IGFsbFxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuICAgICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEudHlwZSA9IGV2ZW50O1xuICAgICAgICBkYXRhLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBkYXRhLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaGFuZGxlcnNbaV0oZGF0YSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZGVzdHJveSB0aGUgbWFuYWdlciBhbmQgdW5iaW5kcyBhbGwgZXZlbnRzXG4gICAgICogaXQgZG9lc24ndCB1bmJpbmQgZG9tIGV2ZW50cywgdGhhdCBpcyB0aGUgdXNlciBvd24gcmVzcG9uc2liaWxpdHlcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ICYmIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICB9XG59O1xuXG4vKipcbiAqIGFkZC9yZW1vdmUgdGhlIGNzcyBwcm9wZXJ0aWVzIGFzIGRlZmluZWQgaW4gbWFuYWdlci5vcHRpb25zLmNzc1Byb3BzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNzc1Byb3BzKG1hbmFnZXIsIGFkZCkge1xuICAgIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIGlmICghZWxlbWVudC5zdHlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwcm9wO1xuICAgIGVhY2gobWFuYWdlci5vcHRpb25zLmNzc1Byb3BzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBwcm9wID0gcHJlZml4ZWQoZWxlbWVudC5zdHlsZSwgbmFtZSk7XG4gICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW3Byb3BdO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gfHwgJyc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWFkZCkge1xuICAgICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzID0ge307XG4gICAgfVxufVxuXG4vKipcbiAqIHRyaWdnZXIgZG9tIGV2ZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyaWdnZXJEb21FdmVudChldmVudCwgZGF0YSkge1xuICAgIHZhciBnZXN0dXJlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBnZXN0dXJlRXZlbnQuaW5pdEV2ZW50KGV2ZW50LCB0cnVlLCB0cnVlKTtcbiAgICBnZXN0dXJlRXZlbnQuZ2VzdHVyZSA9IGRhdGE7XG4gICAgZGF0YS50YXJnZXQuZGlzcGF0Y2hFdmVudChnZXN0dXJlRXZlbnQpO1xufVxuXG5hc3NpZ24oSGFtbWVyLCB7XG4gICAgSU5QVVRfU1RBUlQ6IElOUFVUX1NUQVJULFxuICAgIElOUFVUX01PVkU6IElOUFVUX01PVkUsXG4gICAgSU5QVVRfRU5EOiBJTlBVVF9FTkQsXG4gICAgSU5QVVRfQ0FOQ0VMOiBJTlBVVF9DQU5DRUwsXG5cbiAgICBTVEFURV9QT1NTSUJMRTogU1RBVEVfUE9TU0lCTEUsXG4gICAgU1RBVEVfQkVHQU46IFNUQVRFX0JFR0FOLFxuICAgIFNUQVRFX0NIQU5HRUQ6IFNUQVRFX0NIQU5HRUQsXG4gICAgU1RBVEVfRU5ERUQ6IFNUQVRFX0VOREVELFxuICAgIFNUQVRFX1JFQ09HTklaRUQ6IFNUQVRFX1JFQ09HTklaRUQsXG4gICAgU1RBVEVfQ0FOQ0VMTEVEOiBTVEFURV9DQU5DRUxMRUQsXG4gICAgU1RBVEVfRkFJTEVEOiBTVEFURV9GQUlMRUQsXG5cbiAgICBESVJFQ1RJT05fTk9ORTogRElSRUNUSU9OX05PTkUsXG4gICAgRElSRUNUSU9OX0xFRlQ6IERJUkVDVElPTl9MRUZULFxuICAgIERJUkVDVElPTl9SSUdIVDogRElSRUNUSU9OX1JJR0hULFxuICAgIERJUkVDVElPTl9VUDogRElSRUNUSU9OX1VQLFxuICAgIERJUkVDVElPTl9ET1dOOiBESVJFQ1RJT05fRE9XTixcbiAgICBESVJFQ1RJT05fSE9SSVpPTlRBTDogRElSRUNUSU9OX0hPUklaT05UQUwsXG4gICAgRElSRUNUSU9OX1ZFUlRJQ0FMOiBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgRElSRUNUSU9OX0FMTDogRElSRUNUSU9OX0FMTCxcblxuICAgIE1hbmFnZXI6IE1hbmFnZXIsXG4gICAgSW5wdXQ6IElucHV0LFxuICAgIFRvdWNoQWN0aW9uOiBUb3VjaEFjdGlvbixcblxuICAgIFRvdWNoSW5wdXQ6IFRvdWNoSW5wdXQsXG4gICAgTW91c2VJbnB1dDogTW91c2VJbnB1dCxcbiAgICBQb2ludGVyRXZlbnRJbnB1dDogUG9pbnRlckV2ZW50SW5wdXQsXG4gICAgVG91Y2hNb3VzZUlucHV0OiBUb3VjaE1vdXNlSW5wdXQsXG4gICAgU2luZ2xlVG91Y2hJbnB1dDogU2luZ2xlVG91Y2hJbnB1dCxcblxuICAgIFJlY29nbml6ZXI6IFJlY29nbml6ZXIsXG4gICAgQXR0clJlY29nbml6ZXI6IEF0dHJSZWNvZ25pemVyLFxuICAgIFRhcDogVGFwUmVjb2duaXplcixcbiAgICBQYW46IFBhblJlY29nbml6ZXIsXG4gICAgU3dpcGU6IFN3aXBlUmVjb2duaXplcixcbiAgICBQaW5jaDogUGluY2hSZWNvZ25pemVyLFxuICAgIFJvdGF0ZTogUm90YXRlUmVjb2duaXplcixcbiAgICBQcmVzczogUHJlc3NSZWNvZ25pemVyLFxuXG4gICAgb246IGFkZEV2ZW50TGlzdGVuZXJzLFxuICAgIG9mZjogcmVtb3ZlRXZlbnRMaXN0ZW5lcnMsXG4gICAgZWFjaDogZWFjaCxcbiAgICBtZXJnZTogbWVyZ2UsXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgaW5oZXJpdDogaW5oZXJpdCxcbiAgICBiaW5kRm46IGJpbmRGbixcbiAgICBwcmVmaXhlZDogcHJlZml4ZWRcbn0pO1xuXG4vLyB0aGlzIHByZXZlbnRzIGVycm9ycyB3aGVuIEhhbW1lciBpcyBsb2FkZWQgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRFxuLy8gIHN0eWxlIGxvYWRlciBidXQgYnkgc2NyaXB0IHRhZywgbm90IGJ5IHRoZSBsb2FkZXIuXG52YXIgZnJlZUdsb2JhbCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6ICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5mcmVlR2xvYmFsLkhhbW1lciA9IEhhbW1lcjtcblxuaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEhhbW1lcjtcbiAgICB9KTtcbn0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gSGFtbWVyO1xufSBlbHNlIHtcbiAgICB3aW5kb3dbZXhwb3J0TmFtZV0gPSBIYW1tZXI7XG59XG5cbn0pKHdpbmRvdywgZG9jdW1lbnQsICdIYW1tZXInKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=