summaryrefslogtreecommitdiffstats
path: root/afm-client/dist.prod/opa/AFBclient.min.js
blob: d608b42325c4d172f50785f9d1d5c3a02ff928c2 (plain)
1
2
!function(){"use strict";function e(e){var t=[],a=[];this.getId=function(){return e.sliderid},this.getCbHandle=function(){return e.cbhandle},this.getView=function(n){return n||(n=0),e.value[n]===t[n]?a[n]:(t[n]=e.value[n],e.formatter?a[n]=e.formatter(e.value[n],e.ctrlhandle):a[n]=e.value[n],a[n])},this.updateClass=function(t,a){e.updateClass(t,a)},this.forceRefresh=function(t){e.forceRefresh(t)},this.getValue=function(t){return t||(t=0),e.value[t]},this.getRelative=function(t){return t||(t=0),e.relative[t]},this.setValue=function(t,a){a||(a=0),e.setValue(t,a)},this.setDisable=function(t){e.setDisable(t)}}var t=angular.module("RangeSlider",[]);t.directive("rangeSlider",["$log","$document","$timeout",function(t,a,n){function i(t,i,s,l){t.initWidget=function(e){e.byStep&&(t.byStep=parseInt(e.byStep)),e.notMore&&(t.notMore=parseInt(e.notMore)),e.notLess&&(t.notLess=parseInt(e.notLess)),e.id&&(t.sliderid=e.id),void 0!==e.value&&(t.value=e.value,t.forceRefresh(50))},t.forceRefresh=function(e){var a=t.value;t.value=[void 0,void 0],n(function(){t.setValue(a[0],0),t.dual&&t.setValue(a[1],1)},e)},t.updateClass=function(e,t){t?i.addClass(e):i.removeClass(e)},t.setDisable=function(e){e?(i.addClass("disable"),t.handles[0].css("visibility","hidden"),t.dual&&t.handles[1].css("visibility","hidden")):(i.removeClass("disable"),t.handles[0].css("visibility","visible"),t.dual&&t.handles[1].css("visibility","visible"))},t.normalize=function(e){var a,n=t.notMore-t.notLess,i=e*n;if(t.byStep>0){var s=(i-i%t.byStep)/t.byStep,l=i%t.byStep,o=l>=.5*t.byStep?t.byStep:0;return a=s*t.byStep+o+t.notLess}if(t.byStep<0){var r=Math.pow(10,-1*t.byStep);return a=t.notLess+parseInt(i*r)/r}return i},t.getValue=function(e,a){t.vertical?t.relative[a]=(e-t.bounds.handles[a].getBoundingClientRect().height)/(t.bounds.bar.getBoundingClientRect().height-t.bounds.handles[a].getBoundingClientRect().height):t.relative[a]=e/(t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[a].getBoundingClientRect().width);var n=t.normalize(t.relative[a]);n!==t.value[a]&&(n<t.startValue&&(n=t.startValue),n>t.stopValue&&(n=t.stopValue),t.formatter?t.viewValue=t.formatter(n,t.ctrlhandle):t.viewValue=n,t.displays[a]&&t.displays[a].html(t.viewValue),t.value[a]=n,l&&l.$setViewValue(t.viewValue),t.$apply(),n>t.startValue&&n<t.stopValue&&t.translate(e,a))},t.setStart=function(e){var a;e>t.value[0]&&(t.dual?t.setValue(e,1):t.setValue(e,0)),t.vertical?(a=t.bounds.bar.getBoundingClientRect().height*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("height",a+"px")):(a=t.bounds.bar.getBoundingClientRect().width*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("width",a+"px")),t.startValue=e},t.setStop=function(e){var a;e<t.value[0]&&(t.dual?t.setValue(e,1):t.setValue(e,0)),t.vertical?(a=t.bounds.bar.getBoundingClientRect().height*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("height",a+"px")):(a=t.bounds.bar.getBoundingClientRect().width*(e-t.notLess)/(t.notMore-t.notLess),t.stop.css({right:0,width:t.bounds.bar.getBoundingClientRect().width-a+"px"})),t.stopValue=e},t.translate=function(e,a){var n;if(t.vertical){var i=t.bounds.bar.getBoundingClientRect().height-e;if(t.handles[a].css({"-webkit-transform":"translateY("+i+"px)","-moz-transform":"translateY("+i+"px)","-ms-transform":"translateY("+i+"px)","-o-transform":"translateY("+i+"px)",transform:"translateY("+i+"px)"}),t.dual){if(t.relative[1]&&t.relative[0]){var s=(t.relative[1]-t.relative[0])*t.bounds.bar.getBoundingClientRect().height;n=t.relative[0]*t.bounds.bar.getBoundingClientRect().height,t.slider.css({bottom:n+"px",height:s+"px"})}}else t.slider.css("height",e+"px")}else if(t.handles[a].css({"-webkit-transform":"translateX("+e+"px)","-moz-transform":"translateX("+e+"px)","-ms-transform":"translateX("+e+"px)","-o-transform":"translateX("+e+"px)",transform:"translateX("+e+"px)"}),t.dual){if(t.relative[1]&&t.relative[0]){var l=(t.relative[1]-t.relative[0])*t.bounds.bar.getBoundingClientRect().width;n=t.relative[0]*t.bounds.bar.getBoundingClientRect().width,t.slider.css({left:n+"px",width:l+"px"})}}else t.slider.css("width",e+"px")},t.setValue=function(e,a){var n;e!==t.value[a]&&(void 0===e&&(e=0),e>t.notMore&&(e=t.notMore),e<t.notLess&&(e=t.notLess),t.vertical?(t.relative[a]=(e-t.notLess)/(t.notMore-t.notLess),0===a&&(n=t.relative[a]*t.bounds.bar.getBoundingClientRect().height+t.bounds.handles[a].getBoundingClientRect().height/2),1===a&&(n=t.relative[a]*t.bounds.bar.getBoundingClientRect().height)):(t.relative[a]=(e-t.notLess)/(t.notMore-t.notLess),n=t.relative[a]*(t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[a].getBoundingClientRect().width)),t.translate(n,a),t.value[a]=e,t.formatter?t.viewValue=t.formatter(e,void 0):t.viewValue=e,l&&l.$setViewValue(t.viewValue),t.displays[a]&&t.displays[a].html(t.viewValue))},t.keydown=function(e){switch(e.keyCode){case 39:case 38:t.byStep>0&&t.$apply(t.setValue(t.value[t.actif]+t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]+1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 37:case 40:t.byStep>0&&t.$apply(t.setValue(t.value[t.actif]-t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]-1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 27:t.handles[t.actif][0].blur()}},t.moveHandle=function(e,a,n){var i;t.vertical?(i=t.bounds.bar.getBoundingClientRect().bottom-n,i>t.bounds.bar.getBoundingClientRect().height&&(i=t.bounds.bar.getBoundingClientRect().height),i<t.bounds.handles[e].getBoundingClientRect().height&&(i=t.bounds.handles[e].getBoundingClientRect().height)):(i=a-t.bounds.bar.getBoundingClientRect().left,0>i&&(i=0),a+t.bounds.handles[e].getBoundingClientRect().width>t.bounds.bar.getBoundingClientRect().right&&(i=t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[e].getBoundingClientRect().width)),t.getValue(i,e),t.dual&&t.value[0]>t.value[1]&&(0===e?t.setValue(t.value[0],1):t.setValue(t.value[1],0))},t.focusCB=function(e){e?a.on("keydown",t.keydown):a.unbind("keydown",t.keydown)},t.touchBarCB=function(e){var a,n=0,i=e.changedTouches,s=t.value[n];if(e.preventDefault(),t.dual){a=t.vertical?(i[0].pageY-t.bounds.bar.getBoundingClientRect().bottom)/t.bounds.bar.getBoundingClientRect().height:(i[0].pageX-t.bounds.bar.getBoundingClientRect().left)/t.bounds.bar.getBoundingClientRect().width;var l=Math.abs(a-t.relative[0]),o=Math.abs(a-t.relative[1]);l>o&&(n=1)}t.moveHandle(n,i[0].pageX,i[0].pageY),t.callback&&s!==t.value[n]&&t.callback(t.value[n],t.ctrlhandle)},t.touchHandleCB=function(e,n){function s(e){e.preventDefault();for(var a=e.changedTouches,i=0;i<a.length;i++)t.moveHandle(n,a[i].pageX,a[i].pageY)}function l(e){a.unbind("touchmove",s),a.unbind("touchend",l),i.on("touchstart",t.touchBarCB),t.callback&&o!==t.value[n]&&t.callback(t.value[n],t.ctrlhandle)}var o=t.value[n];e.preventDefault(),a.on("touchmove",s),a.on("touchend",l),i.unbind("touchstart",t.touchBarCB)},t.handleCB=function(e,n){function i(e){t.moveHandle(n,e.clientX,e.clientY)}function l(){a.unbind("mousemove",i),a.unbind("mouseup",l),t.callback&&o!==t.value[n]&&t.callback(t.value[n],t.ctrlhandle)}if(!s.automatic){var o=t.value[n];e.preventDefault(),a.on("mousemove",i),a.on("mouseup",l),t.handles[n][0].focus(),t.actif=n}},t.find=function(e,t){var a;a=t?t[0].querySelector(e):i[0].querySelector(e);var n=angular.element(a);return n},t.initialSettings=function(e){var a;t.value=[],t.relative=[],null===t.precision&&(a=(""+t.byStep).match(/\.([\d]*)/),t.precision=a&&a[1]?a[1].length:0),i.on("touchstart",t.touchBarCB),t.handles[0].on("touchstart",function(e){t.touchHandleCB(e,0)}),t.dual&&(t.handles[1].addClass("range-slider-handle"),t.handles[1].on("touchstart",function(e){t.touchHandleCB(e,1)}),t.initvalues||t.setValue(e[1],1)),t.initvalues?t.initWidget(t.initvalues):t.setValue(e[0],0)},t.init=function(){if(t.sliderid=s.id||"slider-"+parseInt(1e3*Math.random()),t.startValue=-(1/0),t.stopValue=1/0,t.byStep=parseInt(s.byStep)||1,t.vertical=s.vertical||!1,t.dual=s.dualHandles||!1,t.trigger_input_change=!1,t.notMore=parseInt(s.notMore)||100,t.notLess=parseInt(s.notLess)||0,t.vertical&&i.addClass("vertical-range"),t.handles=[t.find(".handle-min"),t.find(".handle-max")],t.bar=i,t.slider=t.find(".range-slider-active-segment"),t.start=t.find(".ibz-range-slider-start"),t.stop=t.find(".ibz-range-slider-stop"),t.disable=s.disable||!1,t.ctrlhandle=new e(t),t.bounds={bar:i[0],handles:[t.handles[0][0],t.handles[1][0]]},"true"===s.disable&&t.setDisable(!0),s.displayTarget)switch(s.displayTarget){case!0:case"handle":t.displays=t.handles,t.handles[0].addClass("ibz-range-slider-display"),t.dual&&t.handles[1].addClass("ibz-range-slider-display");break;default:t.displays=[a.getElementById(s.displayTarget)]}else t.displays=[];if(s.initial){var n=s.initial.split(",");t.initial=[void 0!==n[0]?parseInt(n[0]):t.notLess,void 0!==n[1]?parseInt(n[1]):t.notMore]}else t.initial=[t.ngModel,t.ngModel];t.$watch("startAt",function(){t.value<t.startAt,t.startAt&&t.setStart(t.startAt)}),t.$watch("stopAt",function(){t.value>t.stopAt,t.stopAt&&t.setStop(t.stopAt)}),t.initialSettings(t.initial)},t.init(),t.$watch("inithook",function(){t.inithook&&t.inithook(t.ctrlhandle)}),t.$watch("initvalues",function(){t.initvalues&&t.initWidget(t.initvalues)}),t.$watch("ngModel",function(e){t.setValue(e,0)})}var s='<div class="ibz-range-slider range-slider" title="{{title}}"data-slider><span class="range-slider-handle handle-min" ng-mousedown="handleCB($event,0)" ng-focus="focusCB(true)" ng-blur="focusCB(false)" role="slider" tabindex="0"></span><span class="handle-max" ng-mousedown="handleCB($event,1)" ng-focus="focusCB(true)" ng-blur="focusCB(false)" role="slider" tabindex="0"></span><span class="range-slider-active-segment"></span><span class="ibz-range-slider-start" ></span> <span class="ibz-range-slider-stop"></span> <input id={{sliderid}} type="hidden"></div>';return{restrict:"E",scope:{startAt:"=",stopAt:"=",callback:"=",formatter:"=",inithook:"=",cbhandle:"=",initvalues:"=",ngModel:"="},require:"?ngModel",template:s,replace:!0,link:i}}])}(),function(){"use strict";var e='<div class="afb-monitor" ng-click="getping()"><span class="afb-refresh-token"  >afb://{{hostname}}:{{httpdport}}</span><i class="{{icon}}"></i></div>';angular.module("TokenRefresh",["AppConfig","ModalNotification"]).directive("tokenRefresh",["$timeout","$http","$location","Notification","AppConfig",function(t,a,n,i,s){function l(e,l,o){e.logged=void 0,e.online=function(){l.addClass("online"),l.removeClass("offline"),e.logged=!0},e.offline=function(){l.addClass("offline"),l.removeClass("online"),e.logged=!1},e.onerror=function(t,a,n){e.logged!==!1&&(i.warning({message:"AppFramework Binder Lost",delay:5e3}),e.offline()),e.status=0},e.onsuccess=function(t,a,n,l){t.request.token&&(s.session.token=t.request.token),t.request.uuid&&(s.session.uuid=t.request.uuid),t.request.timeout&&(s.session.timeout=t.request.timeout),e.logged!==!0&&(i.success({message:"AppFramework Binder Back to Live",delay:3e3}),e.online(),e.callback&&e.callback()),e.status=1},e.getping=function(){var n=a.get(s.session.ping+"?token="+s.session.token);n.success(e.onsuccess),n.error(e.onerror),t(e.getping,1e3*s.session.pingrate)},e.refresh=function(){var n=a.get(s.session.refresh+"?token="+s.session.token);n.success(e.onsuccess),n.error(e.onerror),t(e.refresh,250*s.session.timeout)},e.tkcreate=function(){var t=a.get(s.session.create+"?token="+s.session.initial);t.success(e.onsuccess),t.error(e.onerror)},e.icon=o.icon||"fi-lightbulb",e.hostname=n.host(),e.httpdport=n.port(),e.autolog=JSON.parse(o.autolog||!1),e.autolog&&e.tkcreate(),t(e.getping,1e3*s.session.pingrate),t(e.refresh,250*s.session.timeout)}return{template:e,scope:{callback:"="},restrict:"E",link:l}}])}(),function(){"use strict";var e='<div class="tip-modal-popup"><i class="{{icon}}"></i><span>{{tip}}</span></span></div>';angular.module("ModalNotification",[]).directive("tipModal",["$timeout",function(t){function a(e,a,n){function i(){function a(){e.show&&e.modal.css({opacity:1,visibility:"visible"})}e.show=!0,e.timeout=t(a,e.delay)}function s(){e.show=!1,e.modal.css({opacity:0,visibility:"hidden"})}e.parent=a.parent(),e.modal=a.find("div"),e.icon=n.icon||"fi-lightbulb",e.parent.addClass("as-modal-tip"),e.parent.bind("click",s),e.parent.bind("focus",i),e.parent.bind("mouseover",i),e.parent.bind("mouseleave",s),e.parent.bind("blur",s),e.delay=n.delay||1e3}return{restrict:"E",template:e,link:a,scope:{tip:"="}}}])}(),function(){"use strict";var e='<span title="Goto: {{href}}" ng-click="clicked()"><i class="{{icon}}"></i><span>{{label}}</span></span>';angular.module("LinkButton",[]).directive("linkButton",["$location",function(t){function a(e,a,n){e.clicked=function(){n.query?t.path(n.href).search(n.query):t.path(n.href)},e.icon=n.icon||"fi-link",e.label=n.label||"Jump",e.href=n.href||"/home",a.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:a,scope:{}}}])}(),function(){"use strict";function e(e,t,a){var n=new XMLHttpRequest,i=new FormData;n.upload.onprogress=function(t){var a=Math.round(t.lengthComputable?100*t.loaded/t.total:0);e.slider&&e.slider.setValue(a)},n.onload=function(){e.divElem.addClass("success"),e.divElem.removeClass("error");var t={status:n.status,headers:n.getAllResponseHeaders()};e.callback(t)},n.onerror=function(){e.divElem.addClass("error"),e.divElem.removeClass("success")},n.onabort=function(){e.divElem.addClass("error"),e.divElem.removeClass("success");var t={status:n.status,headers:n.getAllResponseHeaders()};e.callback(t)},this.postfile=function(e){n.open("POST",e,!0),n.send(i)};for(var s=0;s<t.length;s++)if(this.file=t[s],this.basename=this.file.name.split("/").reverse()[0],isNaN(this.file.size)||this.file.size>1024*e.maxsize)setTimeout(a,100);else{var l=new FileReader;l.readAsArrayBuffer(this.file),l.onload=a,i.append(e.name,this.file,this.file.name)}}var t='<input type="file" name="{{name}}-input" onchange="angular.element(this).scope().UpLoadFile(this.files)" accept="{{mimetype}}" style="display:none"><div class="upload-file" ng-click="imgClicked()"><i class="{{icon}}"></i> <span>{{label}}</span><range-slider ng-show="!noslider" id="{{name}}-slider" automatic=true inithook="SliderInitCB"></range-slider></div>',a='<span class="modal-text">Upload Application <b>{{appname}}</b> ?</span><div><img ng-src="{{icon}}"><submit-button icon="fi-x" label="Cancel" clicked="abandon"></submit-button><submit-button icon="fi-like" label="Install" clicked="success"></submit-button> </div>',n='<span class="modal-text">Invalid Application <b>{{appname}}</b> ?</span><div><img ng-src="{{icon}}"><submit-button icon="fi-x" label="Close" clicked="abandon"></submit-button></div>';angular.module("UploadFiles",["AppConfig","ModalNotification","RangeSlider"]).directive("uploadAppli",["AppConfig","JQemu","Notification","ModalFactory","$timeout",function(i,s,l,o,r){function u(t,s,l){if(t.inputElem=s.find("input"),t.divElem=s.find("div"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var u,c,d,p=function(){u.postfile(l.posturl+"?token="+i.session.token),t.modal.deactivate(),r(function(){t.modal.destroy()},1e3)},f=function(){t.modal.deactivate(),r(function(){t.modal.destroy()},1e3)},g=function(e){if(e){var i=new JSZip(e.target.result),s=i.file("icon_128.png");s?(c=window.URL.createObjectURL(new Blob([s.asArrayBuffer()],{type:"image"})),d=a):(c=t.isnotvalid,d=n)}else u.file.size>1024*t.maxsize&&(c=t.istoobig,d=n),isNaN(u.file.size)&&(c=t.isnotvalid,d=n);var l={animationIn:"slideInFromTop",contentScope:{success:p,abandon:f,icon:c,appname:u.basename},template:d};t.modal=new o(l),t.modal.activate()};u=new e(t,s,g)},t.name=l.name||"appli",t.category=l.category||"appli",t.mimetype=l.accept||".wgt",t.maxsize=l.maxsize||1e5,t.regexp=new RegExp(l.accept+".*","i"),t.icon=l.icon||"fi-upload",t.label=l.label||"Upload",l.thumbnail?t.isnotvalid=i.paths[t.category]+l.isnotvalid:t.isnotvalid=i.paths[t.category]+"w3c-widget.png",l.istoobig?t.istoobig=i.paths[t.category]+l.istoobig:t.istoobig=i.paths[t.category]+"istoobig.png",t.noslider=l.noslider||!1,!l.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:u,scope:{callback:"="}}}])}(),function(){"use strict";var e='<tip-modal tip="tip"></tip-modal><label for="{{name}}-intext">{{label}} <i ng-show="required" ng-click="ToBeDefined" class="required {{status}} fi-checkbox" title="Free Value But Mandatory Argument" alt="?"> &nbsp; </i></label><input  type="{{type}}" id="{{name}}-intext" placeholder="{{placeholder}}"  class="status-{{status}}" ng-model="value" ng-blur="validate()" ng-focus="selected()"  ng-model-options="{ updateOn: \'default blur\', debounce: {default: 500, blur: 0} }"><alert data-ng-show="!valid&&errmsg">{{errmsg}}</alert>',t=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;angular.module("InputText",["JQueryEmu"]).directive("inputText",["JQemu",function(a){function n(e,n,i){e.error=!1,e.valid=!1,e.status="untouch",e.input=n.find("input"),e.required=0,"required"in i&&(e.required=1,n.addClass("required")),e.selected=function(){e.error=!1,e.errmsg=!1,e.status="touch"},e.validate=function(){e.parent.removeClass("ng-pristine"),e.value?(e.error=!1,e.value=e.value.trim(),"nospace"in i&&(e.value=e.value.replace(/\s/g,"")),"lowercase"in i&&(e.value=e.value.toLowerCase()),"minlen"in i&&e.value.length<i.minlen&&(e.status="invalid",e.errmsg=e.name+": Mininum Lengh= "+i.minlen+" Characters",e.error=!0),"email"in i&&(t.test(e.value)||(e.status="invalid",e.errmsg="invalid email address",e.error=!0))):e.required&&(e.status="invalid",e.errmsg=e.name+": Required Attribute",e.error=!0),e.error?(e.required&&e.valid&&(e.valid=!1,e.l4acounter.validated>0&&e.l4acounter.validated--),e.callback(i.name,null,e.done)):(e.required&&!e.valid&&e.l4acounter.validated++,e.status="valid",e.valid=!0,e.callback(i.name,e.value,e.done))},e.done=function(t){for(var a in t)e[a]=t[a]},e.label=i.label,e.name=i.name,e.placeholder=i.placeholder,e.type=i.type||"text",e.tip=i.tip,e.parent=a.parent(n,"FORM"),"email"in i&&(i.lowercase=!0,i.nospace=!0,i.minlen=6),e.required&&(e.l4acounter=e.parent.data("l4acounter"),e.l4acounter?e.l4acounter.required++:(e.l4acounter={required:1,validated:0},e.parent.data("l4acounter",e.l4acounter))),e.$watch("value",function(){e.value&&e.validate()})}return{restrict:"E",template:e,link:n,scope:{callback:"=",value:"="}}}])}(),function(){"use strict";var e='<input-text  class="password" tip="{{tip1}}"  placeholder="{{place1}}"label="{{label1}}" callback="valid1" name="{{name}}-1" value="pass1" required minlen="{{minlen}}" type="password" ></input-text><input-text  class="password" tip="tip2"  placeholder="{{place2}}"label="{{label2}}" callback="valid2" name="{{name}}-2" value="pass2" required minlen="{{minlen}}" type="password" > </input-text>';angular.module("InputPassword",[]).directive("inputPassword",function(){function t(e,t,a){e.valid1=function(t,a){e.firstpwd=a},e.valid2=function(t,n,i){e.firstpwd!==n?i({valid:!1,status:"invalid",errmsg:"both password should match"}):e.callback(a.name,n)},e.done=function(t){for(var a in t)e[a]=t[a]},e.name=a.name,e.label1=a.label||"Password",e.label2=a.label||"Password Verification",e.place1=a.placeholder1||"User Password",e.tip1=a.tip||"Choose a Password",e.place2=a.placeholder1||"Password Verification",e.tip2=a.tip||"Confirme your Password",e.minlen=a.minlen||10,"required"in a&&(e.required="required")}return{restrict:"E",template:e,link:t,scope:{callback:"="}}})}(),function(){"use strict";var e='<div  ng-click="clicked()"><i class="{{icon}}"></i><span>{{label}}</span></div>';angular.module("SubmitButton",[]).directive("submitButton",function(){function t(e,t,a){e.icon=a.icon||"fi-foot",e.label=a.label||"Next",t.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:t,scope:{clicked:"="}}})}(),function(){"use strict";var e='<div  ng-click="clicked()"><img ng-src="{{icon}}"><span>{{label}}</span></div>',t='<b class="close-button" ng-click="close()">×</b><img ng-src="{{icon}}"><span class="modal-text">Application <b>{{label}}</b></span><ul class="vertical icon-left primary menu-bar"><li class=start-{{runstatus}}><a ng-click=action("start")><i class="fi-check"> Start</i></a></li><li class=stop-{{runstatus}}><a ng-click=action("stop")><i class="fi-x"> Stop</i></a></li><li><a ng-click=action("info")><i class="fi-info"> Info</i></a></li><li class=start-{{runstatus}}><a ng-click=action("uninstall")><i class="fi-x"> Uninstall</i></a></li></ul>',a='<b class="close-button" ng-click="close()">×</b><img ng-src="{{icon}}"><span class="modal-text">Application <b>{{label}}</b></span><ul class="vertical icon-left"><li><i class="fi-paperclip"> Name : {{detail.name}} </i></li><li><i class="fi-info"> Description {{detail.description}}</i></li><li><i class="fi-torso"> Author : {{detail.author}}</i></li></ul>';angular.module("AppliButton",[]).directive("appliButton",["AppConfig","AppCall","ModalFactory","Notification","$timeout","$window","$location",function(n,i,s,l,o,r,u){function c(e,c,d){e.runstatus="stop",e.clicked=function(){var n=function(t,a){l.error({message:"Fail /api/afm-main"+t+"="+e.label+" RunID="+e.appID,delay:5e3}),c.addClass("fail"),c.removeClass("success"),e.callback(e.appID,t,a)},d=function(t,a){c.removeClass("fail"),e.runID=a.data.response.runid,e.callback(e.appID,t,a)},p=function(){e.modal.deactivate(),o(function(){e.modal.destroy()},1e3)},f=function(t){switch(t){case"start":if("stop"!==e.runstatus)return;i.get("afm-main","start",{id:e.appID,mode:"remote"},function(a){return 200!==a.status||"AJB_reply"!==a.data.jtype?void n("start",a):(e.runstatus="start",d(t,a),void(a.data.response.uri&&r.open(a.data.response.uri.replace("%h",u.host()))))});break;case"stop":if("start"!==e.runstatus)return;i.get("afm-main","terminate",{runid:e.runID},function(a){return 200!==a.status||"AJB_reply"!==a.data.jtype?void n("stop",a):(e.runstatus="stop",void d(t,a))});break;case"info":i.get("afm-main","detail",{id:e.appID},function(t){if(200!==t.status||"AJB_reply"!==t.data.jtype)return void n("detail",t);var i={id:"appliInfoMenu",animationIn:"slideInFromTop",contentScope:{close:p,icon:e.icon,label:e.appID,detail:t.data.response},template:a};e.modal=new s(i),e.modal.activate()});break;case"uninstall":if("stop"!==e.runstatus)return;i.get("afm-main","uninstall",{id:e.appID},function(e){return 200!==e.status||"AJB_reply"!==e.data.jtype?void n("uninstall",e):void d(t,e)})}p()},g={id:"appliActionMenu",animationIn:"slideInFromTop",contentScope:{action:f,runstatus:e.runstatus,close:p,icon:e.icon,label:e.label},template:t};e.modal=new s(g),e.modal.activate()},d.handle&&e.store[d.handle].name?(e.icon=n.paths.icons+d.handle,e.label=e.store[d.handle].name,e.appID=d.handle):(e.icon=n.paths.icons+"w3c-ico.png",e.label=d.handle),c.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:c,scope:{callback:"=",store:"="}}}])}(),function(){"use strict";angular.module("DashboardModule",["SubmitButton","TokenRefresh","AppliButton"]).controller("DashboardController",["AppCall","Notification",function(e,t){var a=this;a.uuid="none",a.token="none",a.session="none",a.status="err-no",a.appliIDs=[],a.appliStore={},a.AppliCB=function(e,t,n){a.request=t,a.errcode=n.status,n.data&&(a.response=n.data),"uninstall"==t&&a.GetRunnables()},a.GetRunnables=function(){e.get("afm-main","runnables",{},function(e){if(a.request="/api/afm-main/runnable",a.response=e.data,a.errcode=e.status,200===e.status){if("AJB_reply"!==e.data.request.jtype&&"runnables"!==e.data.request.api)return void t.error({message:"Invalid Respond to /opa/afm-main/runnable response.data="+e.data,delay:5e3});for(var n=[],i=e.data.response.runnables,s=0;s<i.length;s++)n[s]=i[s].id,a.appliStore[i[s].id]=i[s];a.appliIDs=n}})},a.FileUploaded=function(e){a.request="/api/afm-main/install",a.response=e.headers,a.errcode=e.status,a.GetRunnables()},a.AutoStart=function(){a.GetRunnables()}}])}(),function(){"use strict";angular.module("JQueryEmu",[]).factory("JQemu",function(){var e=function(e,t){for(var a=e,n=t.toUpperCase();a[0];){if(n===a[0].tagName)return a;a=a.parent()}},t=function(e,t,a){for(var n=a.toLowerCase(),i=t.toLowerCase()+"Name",s=e.children();s[0];){if(n===s[0][i])return s;s=s.next()}},a=function(e,t){for(var a=t.toLowerCase(),n=e.children();n[0];){if(n.hasClass(a))return n;n=n.next()}},n={FindInParent:e,FindByTag:t,FindByClass:a};return n})}();var foundationRoutes=[{name:"Dashboard",url:"/dashboard",controller:"DashboardController as ctrl",animationIn:"slideInRight",path:"pages/Dashboard/Dashboard.html"}];!function(){"use strict";angular.module("AppConfig",[]).factory("AppConfig",["urlquery",function(e){var t={paths:{image:"images/",icons:"/icons/",avatar:"images/avatars/",audio:"images/audio/",appli:"images/appli/"},myapi:{token:"/api/myplugin/xxxx"},session:{create:"/api/token/create",refresh:"/api/token/refresh",check:"/api/token/check",reset:"/api/token/reset",ping:"/api/token/check",initial:e.token||"123456789",timeout:3600,pingrate:15,uuid:"",token:""}};return t}]).factory("AppCall",["$http","AppConfig",function(e,t){var a={get:function(a,n,i,s){i.token=t.session.token,e.get("/api/"+a+"/"+n,{params:i}).then(s,s)}};return a}])}(),function(){"use strict";function e(){var e={};return location.search.substr(1).split("&").forEach(function(t){var a=t.split("=")[0],n=decodeURIComponent(t.split("=")[1]);a in e?e[a].push(n):e[a]=[n]}),e}function t(e,t,a){e.otherwise("/dashboard"),t.html5Mode(!0).hashPrefix("!")}function a(){FastClick.attach(document.body)}angular.module("AFBclient",["ui.router","ngAnimate","foundation","foundation.dynamicRouting","foundation.dynamicRouting.animations","ui-notification","AppConfig","JQueryEmu","DashboardModule","UploadFiles","LinkButton","TokenRefresh","RangeSlider","ModalNotification"]).value("urlquery",e()).config(t).run(a),t.$inject=["$urlRouterProvider","$locationProvider"],angular.module("foundation").run(["$templateCache",function(e){e.put("components/modal/modal.html",'<div\n  class="modal-overlay"\n  ng-click="hideOverlay()">\n  <aside\n    class="modal"\n    ng-click="$event.stopPropagation();"\n    ng-transclude>\n  </aside>\n</div>\n')}])}(),function(){angular.module("AFBclient").run(["$templateCache",function(e){e.put("pages/Dashboard/Dashboard.html",'<h3><img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px"> Application Framework Manager Simple Client</h3><div class="button-box box-content"><appli-button ng-repeat="appliID in ctrl.appliIDs" store="ctrl.appliStore" handle="{{appliID}}" callback="ctrl.AppliCB"></appli-button><upload-appli class="ibz-right" label="Upload" icon="fi-upload" posturl="/api/afm-main/install" callback="ctrl.FileUploaded" title="Upload AGL App"></upload-appli></div><div class="message-box box-content vertical grid-frame"><div class="response"><span class="grid-content noscroll req {{ctrl.status}}">req= {{ctrl.request}}</span> <span class="grid-content noscroll res {{ctrl.status}}">res= {{ctrl.response}}</span> <span class="grid-content noscroll status {{ctrl.status}}">status= {{ctrl.errcode}}</span></div></div><token-refresh autolog="true" callback="ctrl.AutoStart"></token-refresh>')}])}();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpZGdldHMvUmFuZ2VTbGlkZXJzL1JhbmdlU2xpZGVyTW9kLmpzIiwid2lkZ2V0cy9Ob3RpZmljYXRpb25zL1Rva2VuUmVmcmVzaFN2Yy5qcyIsIndpZGdldHMvTm90aWZpY2F0aW9ucy9Nb2RhbE5vdGlmaWNhdGlvbi5qcyIsIndpZGdldHMvTmF2aWdhdGlvbi9MaW5rQnV0dG9uLmpzIiwid2lkZ2V0cy9Gb3JtSW5wdXQvVXBsb2FkQXBwbGkuanMiLCJ3aWRnZXRzL0Zvcm1JbnB1dC9JbnB1dFRleHQuanMiLCJ3aWRnZXRzL0Zvcm1JbnB1dC9JbnB1dFBhc3N3b3JkLmpzIiwid2lkZ2V0cy9BY3Rpb25CdXR0b25zL1N1Ym1pdEJ1dHRvbi5qcyIsIndpZGdldHMvQWN0aW9uQnV0dG9ucy9BcHBsaUJ1dHRvbi5qcyIsInBhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmRNb2R1bGUuanMiLCJzZXJ2aWNlcy9KUXVlcnlFbXUuanMiLCJldGMvcm91dGVzLmpzIiwiZXRjL0FwcENvbmZpZy5qcyIsImFwcC5qcyIsInBhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmQuanMiXSwibmFtZXMiOlsiUmFuZ2VTbGlkZXJIYW5kbGUiLCJzY29wZSIsImludGVybmFscyIsImV4dGVybmFscyIsInRoaXMiLCJnZXRJZCIsInNsaWRlcmlkIiwiZ2V0Q2JIYW5kbGUiLCJjYmhhbmRsZSIsImdldFZpZXciLCJoYW5kbGUiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImN0cmxoYW5kbGUiLCJ1cGRhdGVDbGFzcyIsImNsYXNzZSIsInN0YXR1cyIsImZvcmNlUmVmcmVzaCIsInRpbWVyIiwiZ2V0VmFsdWUiLCJnZXRSZWxhdGl2ZSIsInJlbGF0aXZlIiwic2V0VmFsdWUiLCJzZXREaXNhYmxlIiwiZmxhZyIsIlJhbmdlU2xpZGVyIiwiYW5ndWxhciIsIm1vZHVsZSIsImRpcmVjdGl2ZSIsIiRsb2ciLCIkZG9jdW1lbnQiLCIkdGltZW91dCIsImxpbmsiLCJlbGVtZW50IiwiYXR0cnMiLCJtb2RlbCIsImluaXRXaWRnZXQiLCJpbml0dmFsdWVzIiwiYnlTdGVwIiwicGFyc2VJbnQiLCJub3RNb3JlIiwibm90TGVzcyIsImlkIiwidW5kZWZpbmVkIiwiZHVhbCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJkaXNhYmxlZCIsImhhbmRsZXMiLCJjc3MiLCJub3JtYWxpemUiLCJyZXN1bHQiLCJyYW5nZSIsInBvaW50IiwibW9kIiwicmVtIiwicm91bmQiLCJwb3dlciIsIk1hdGgiLCJwb3ciLCJvZmZzZXQiLCJ2ZXJ0aWNhbCIsImJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImJhciIsIndpZHRoIiwibmV3dmFsdWUiLCJzdGFydFZhbHVlIiwic3RvcFZhbHVlIiwidmlld1ZhbHVlIiwiZGlzcGxheXMiLCJodG1sIiwiJHNldFZpZXdWYWx1ZSIsIiRhcHBseSIsInRyYW5zbGF0ZSIsInNldFN0YXJ0Iiwic3RhcnQiLCJzZXRTdG9wIiwic3RvcCIsInJpZ2h0Iiwidm9mZnNldCIsIi13ZWJraXQtdHJhbnNmb3JtIiwiLW1vei10cmFuc2Zvcm0iLCItbXMtdHJhbnNmb3JtIiwiLW8tdHJhbnNmb3JtIiwidHJhbnNmb3JtIiwic2xpZGVyIiwiYm90dG9tIiwibGVmdCIsImtleWRvd24iLCJlIiwia2V5Q29kZSIsImFjdGlmIiwiY2FsbGJhY2siLCJibHVyIiwibW92ZUhhbmRsZSIsImNsaWVudFgiLCJjbGllbnRZIiwiZm9jdXNDQiIsImluc2lkZSIsIm9uIiwidW5iaW5kIiwidG91Y2hCYXJDQiIsImV2ZW50IiwidG91Y2hlcyIsImNoYW5nZWRUb3VjaGVzIiwib2xkdmFsdWUiLCJwcmV2ZW50RGVmYXVsdCIsInBhZ2VZIiwicGFnZVgiLCJkaXN0YW5jZTAiLCJhYnMiLCJkaXN0YW5jZTEiLCJ0b3VjaEhhbmRsZUNCIiwidG91Y2hldnQiLCJ0b3VjaG1vdmUiLCJpZHgiLCJsZW5ndGgiLCJ0b3VjaGVuZCIsImhhbmRsZUNCIiwiY2xpY2tldmVudCIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJhdXRvbWF0aWMiLCJmb2N1cyIsImZpbmQiLCJzZWxlY3QiLCJlbGVtIiwiZG9tZWxlbSIsInF1ZXJ5U2VsZWN0b3IiLCJhbmdlbGVtIiwiaW5pdGlhbFNldHRpbmdzIiwiaW5pdGlhbCIsImRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdCIsInByZWNpc2lvbiIsIm1hdGNoIiwiZXZ0IiwiaW5pdCIsInJhbmRvbSIsIkluZmluaXR5IiwiZHVhbEhhbmRsZXMiLCJ0cmlnZ2VyX2lucHV0X2NoYW5nZSIsImRpc2FibGUiLCJkaXNwbGF5VGFyZ2V0IiwiZ2V0RWxlbWVudEJ5SWQiLCJzcGxpdCIsIm5nTW9kZWwiLCIkd2F0Y2giLCJzdGFydEF0Iiwic3RvcEF0IiwiaW5pdGhvb2siLCJuZXdWYWx1ZSIsInRlbXBsYXRlIiwicmVzdHJpY3QiLCJyZXF1aXJlIiwicmVwbGFjZSIsIiRodHRwIiwiJGxvY2F0aW9uIiwiTm90aWZpY2F0aW9uIiwiQXBwQ29uZmlnIiwibXltZXRob2RzIiwibG9nZ2VkIiwib25saW5lIiwib2ZmbGluZSIsIm9uZXJyb3IiLCJkYXRhIiwiZXJyY29kZSIsImhlYWRlcnMiLCJ3YXJuaW5nIiwibWVzc2FnZSIsImRlbGF5Iiwib25zdWNjZXNzIiwiY29uZmlnIiwicmVxdWVzdCIsInRva2VuIiwic2Vzc2lvbiIsInV1aWQiLCJ0aW1lb3V0Iiwic3VjY2VzcyIsImdldHBpbmciLCJoYW5kbGVyIiwiZ2V0IiwicGluZyIsImVycm9yIiwicGluZ3JhdGUiLCJyZWZyZXNoIiwidGtjcmVhdGUiLCJjcmVhdGUiLCJpY29uIiwiaG9zdG5hbWUiLCJob3N0IiwiaHR0cGRwb3J0IiwicG9ydCIsImF1dG9sb2ciLCJKU09OIiwicGFyc2UiLCJ0bXBsIiwiZGlzcGxheSIsImFjdGlvbiIsInNob3ciLCJtb2RhbCIsIm9wYWNpdHkiLCJ2aXNpYmlsaXR5IiwiY2xvc2UiLCJwYXJlbnQiLCJiaW5kIiwidGlwIiwiY2xpY2tlZCIsInF1ZXJ5IiwicGF0aCIsImhyZWYiLCJzZWFyY2giLCJsYWJlbCIsInRvTG93ZXJDYXNlIiwiTG9hZEZpbGVTdmMiLCJmaWxlcyIsImZpbGVDQiIsInhtbFJlcSIsIlhNTEh0dHBSZXF1ZXN0IiwieGZvcm0iLCJGb3JtRGF0YSIsInVwbG9hZCIsIm9ucHJvZ3Jlc3MiLCJwcm9ncmVzcyIsImxlbmd0aENvbXB1dGFibGUiLCJsb2FkZWQiLCJ0b3RhbCIsIm9ubG9hZCIsImRpdkVsZW0iLCJyZXNwb25zZSIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsIm9uYWJvcnQiLCJwb3N0ZmlsZSIsInBvc3R1cmwiLCJvcGVuIiwic2VuZCIsImkiLCJmaWxlIiwiYmFzZW5hbWUiLCJuYW1lIiwicmV2ZXJzZSIsImlzTmFOIiwic2l6ZSIsIm1heHNpemUiLCJzZXRUaW1lb3V0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0FycmF5QnVmZmVyIiwiYXBwZW5kIiwidG1wbEFwcGxpIiwidG1wbE1vZGFsIiwidG1wbEVycm9yIiwiSlFlbXUiLCJNb2RhbEZhY3RvcnkiLCJpbnB1dEVsZW0iLCJpbWdDbGlja2VkIiwiY2xpY2siLCJTbGlkZXJJbml0Q0IiLCJVcExvYWRGaWxlIiwiYXBwaWNvbiIsImRlYWN0aXZhdGUiLCJkZXN0cm95IiwiYWJhbmRvbiIsInJlYWRlckNCIiwiemlwYXBwIiwiSlNaaXAiLCJ0YXJnZXQiLCJ0aHVtYm5haWwiLCJ3aW5kb3ciLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJCbG9iIiwiYXNBcnJheUJ1ZmZlciIsInR5cGUiLCJpc25vdHZhbGlkIiwiaXN0b29iaWciLCJhbmltYXRpb25JbiIsImNvbnRlbnRTY29wZSIsImFwcG5hbWUiLCJhY3RpdmF0ZSIsImNhdGVnb3J5IiwibWltZXR5cGUiLCJhY2NlcHQiLCJyZWdleHAiLCJSZWdFeHAiLCJwYXRocyIsIm5vc2xpZGVyIiwiVHlwZUVycm9yIiwiZW1haWxwYXRlcm4iLCJ2YWxpZCIsImlucHV0IiwicmVxdWlyZWQiLCJzZWxlY3RlZCIsImVycm1zZyIsInZhbGlkYXRlIiwidHJpbSIsIm1pbmxlbiIsInRlc3QiLCJsNGFjb3VudGVyIiwidmFsaWRhdGVkIiwiZG9uZSIsInBsYWNlaG9sZGVyIiwibG93ZXJjYXNlIiwibm9zcGFjZSIsInZhbGlkMSIsImZpcnN0cHdkIiwidmFsaWQyIiwibGFiZWwxIiwibGFiZWwyIiwicGxhY2UxIiwicGxhY2Vob2xkZXIxIiwidGlwMSIsInBsYWNlMiIsInRpcDIiLCJ0bXBsRGV0YWlsIiwiQXBwQ2FsbCIsIiR3aW5kb3ciLCJydW5zdGF0dXMiLCJub3RpZnlFcnJvciIsImFwcElEIiwibm90aWZ5U3VjY2VzcyIsInJ1bklEIiwicnVuaWQiLCJjbG9zZU1vZGFsIiwiYWN0aW9uTW9kYWwiLCJtb2RlIiwianR5cGUiLCJ1cmkiLCJkZXRhaWwiLCJzdG9yZSIsImljb25zIiwiY29udHJvbGxlciIsImFwcGxpSURzIiwiYXBwbGlTdG9yZSIsIkFwcGxpQ0IiLCJhcHBsaUlEIiwiR2V0UnVubmFibGVzIiwiYXBpIiwicnVubmFibGVzIiwiRmlsZVVwbG9hZGVkIiwiQXV0b1N0YXJ0IiwiZmFjdG9yeSIsIkZpbmRJblBhcmVudCIsInNlbGVjdG9yIiwidG9VcHBlckNhc2UiLCJ0YWdOYW1lIiwiRmluZEJ5VGFnIiwidGFnIiwiY2hpbGRyZW4iLCJuZXh0IiwiRmluZEJ5Q2xhc3MiLCJoYXNDbGFzcyIsIm15TWV0aG9kcyIsImZvdW5kYXRpb25Sb3V0ZXMiLCJ1cmwiLCJ1cmxxdWVyeSIsIm15Q29uZmlnIiwiaW1hZ2UiLCJhdmF0YXIiLCJhdWRpbyIsImFwcGxpIiwibXlhcGkiLCJjaGVjayIsInJlc2V0IiwibXlDYWxscyIsInBsdWdpbiIsInBhcmFtcyIsInRoZW4iLCJQYXJzZVF1ZXJ5U3RyaW5nIiwicWQiLCJsb2NhdGlvbiIsInN1YnN0ciIsImZvckVhY2giLCJpdGVtIiwiayIsInYiLCJkZWNvZGVVUklDb21wb25lbnQiLCJwdXNoIiwiJHVybFByb3ZpZGVyIiwiJGxvY2F0aW9uUHJvdmlkZXIiLCJvdGhlcndpc2UiLCJodG1sNU1vZGUiLCJoYXNoUHJlZml4IiwicnVuIiwiRmFzdENsaWNrIiwiYXR0YWNoIiwiZG9jdW1lbnQiLCJib2R5IiwiJGluamVjdCIsIiR0ZW1wbGF0ZUNhY2hlIiwicHV0Il0sIm1hcHBpbmdzIjoiQ0FrREEsV0FDQSxZQUlBLFNBQUFBLEdBQUFDLEdBQ0EsR0FBQUMsTUFDQUMsSUFFQUMsTUFBQUMsTUFBQSxXQUNBLE1BQUFKLEdBQUFLLFVBR0FGLEtBQUFHLFlBQUEsV0FDQSxNQUFBTixHQUFBTyxVQUdBSixLQUFBSyxRQUFBLFNBQUFDLEdBSUEsTUFIQUEsS0FBQUEsRUFBQSxHQUdBVCxFQUFBVSxNQUFBRCxLQUFBUixFQUFBUSxHQUFBUCxFQUFBTyxJQUdBUixFQUFBUSxHQUFBVCxFQUFBVSxNQUFBRCxHQUNBVCxFQUFBVyxVQUFBVCxFQUFBTyxHQUFBVCxFQUFBVyxVQUFBWCxFQUFBVSxNQUFBRCxHQUFBVCxFQUFBWSxZQUNBVixFQUFBTyxHQUFBVCxFQUFBVSxNQUFBRCxHQUVBUCxFQUFBTyxLQUdBTixLQUFBVSxZQUFBLFNBQUFDLEVBQUFDLEdBQ0FmLEVBQUFhLFlBQUFDLEVBQUFDLElBR0FaLEtBQUFhLGFBQUEsU0FBQUMsR0FDQWpCLEVBQUFnQixhQUFBQyxJQUdBZCxLQUFBZSxTQUFBLFNBQUFULEdBRUEsTUFEQUEsS0FBQUEsRUFBQSxHQUNBVCxFQUFBVSxNQUFBRCxJQUdBTixLQUFBZ0IsWUFBQSxTQUFBVixHQUVBLE1BREFBLEtBQUFBLEVBQUEsR0FDQVQsRUFBQW9CLFNBQUFYLElBR0FOLEtBQUFrQixTQUFBLFNBQUFYLEVBQUFELEdBQ0FBLElBQUFBLEVBQUEsR0FDQVQsRUFBQXFCLFNBQUFYLEVBQUFELElBR0FOLEtBQUFtQixXQUFBLFNBQUFDLEdBQ0F2QixFQUFBc0IsV0FBQUMsSUFwREEsR0FBQUMsR0FBQUMsUUFBQUMsT0FBQSxpQkF3REFGLEdBQUFHLFVBQUEsZUFBQSxPQUFBLFlBQUEsV0FBQSxTQUFBQyxFQUFBQyxFQUFBQyxHQVlBLFFBQUFDLEdBQUEvQixFQUFBZ0MsRUFBQUMs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c0NvbnRlbnQiOlsiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKiBcbiAqIHJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL21vdXNlb3ZlclxuICogXG4gKiB1c2FnZTogXG5Vc2FnZSAgPHJhbmdlLXNsaWRlcj5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgPHJhbmdlLXNsaWRlclxuICAgICAgaWQ9XCJteS1zbGlkZXItbmFtZVwiICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2UgYXMgYW4gYXJndW1lbnQgdG8gY2FsbGJhY2tcbiAgICAgIGNsYXNzPVwibXktY3VzdG9tLWNsYXNzXCIgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgY2xhc3MgaXMgaWJ6LXJhbmdlLXNsaWRlclxuICAgICAgcGxhY2Vob2xkZXI9XCJUcmFjayBEYXRlIFNlbGVjdGlvblwiICAgICAgLy8gcGxhY2UgaG9sZGVyIGZvciBkYXRlIHJlYWRvbmx5IGlucHV0IHpvbmVcblxuICAgICAgPCEtLSBGb3VuZGF0aW9uIGNsYXNzZXMgLS0+XG4gICAgICBjbGFzcz1cInJhZGl1c1wiICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBadXJiIGZvdW5kYXRpb24gZG9jIGZvciBmdXJ0aGVyIGluZm8uXG4gICAgICBjbGFzcz1cImliei1oYW5kbGUtZGlzcGxheVwiICAgICAgICAgICAgICAvLyBpbmNyZWFzZSBoYW5kbGUgd2lkdGggdG8gaG9sZCBzbGlkZXIgY3VycmVudCB2YWx1ZVxuXG4gICAgICA8IS0tIEFuZ3VsYXIgU2NvcGUgVmFyaWFibGVzIC0tPlxuICAgICAgY2FsbGJhY2s9XCJteUNhbGxCYWNrXCIgICAgICAgICAgICAgICAgICAgIC8vICRzY29wZS5teUNhbGxCYWNrKHNsaWRlcmhhbmRsZSkgaXMgY2FsbGVkIHdoZW4gZXZlciBzbGlkZXIgaGFuZGxlIGJsdXJcbiAgICAgIGZvcm1hdHRlcj1cIlNsaWRlckZvcm1hdENCXCIgICAgICAgICAgICAgICAvLyAkc2NvcGUubXlGb3JtYXR0ZXIodmFsdWUsIHNsaWRlcmlkKSB3aGVuIGV4aXN0IGlzIGNhbGwgd2hlbiBldmVyIHNsaWRlciBoYW5kbGUgbW92ZXMuIFNob3VsZCByZXR1cm4gZXh0ZXJuYWwgZm9ybSBvZiBzbGlkZXIgdmFsdWUuXG4gICAgICBuZy1tb2RlbD1cInh4eHh4eFwiICAgICAgICAgICAgICAgICAgICAgICAgLy8geHh4IE11c3QgYmUgZGVmaW5lZCwgc2NyaXB0IHdpbGwgc3RvcmUgYSBuZXcgUmFuZ2VyT2JqZWN0IHdpdGhpbiBwcm92aWRlZCBuZy1tb2RlbCB2YXJpYWJsZS5cbiAgICAgIHN0YXJ0LWF0PVwiU2NvcGVWYXJcIiAgICAgICAgICAgICAgICAgICAgICAvLyBEeW5hbWljIGxpbWl0YXRpb24gd2hlbiBzbGlkZXIgaXMgY29uc3RyYWlucyBieSBhbiBleHRlcm5hbCBjb21wb25hbnQgW2V4OiBjaGVjayBpbi9vdXRdXG4gICAgICBzdG9wLWF0PVwiU2NvcGVWYXJcIiAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbSBidXQgZm9yIGVuZC5cblxuICAgICAgPCEtLSBBbmd1bGFyIERpcmVjdGl2ZSBBdHRyaWJ1dGVzIC0tPlxuICAgICAgbm90LWxlc3M9XCJpbnRlZ2VyXCIgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeGVkIHN0YXJ0aW5nIHZhbHVlIGZvciBzbGlkZXIgW2RlZmF1bHQgMF1cbiAgICAgIG5vdC1tb3JlPVwiaW50ZWdlclwiICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBlbmQgdmFsdWUgZm9yIHNsaWRlcnMgW2RlZmF1bHQgMTAwXVxuICAgICAgYnktc3RlcD1cIistaW50ZWdlclwiICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGJ5LXN0ZXAgaXMgPjAgdGhlbiBzbGlkZXIgdXNlIGl0IGFzIHN0ZXAtdmFsdWUsIHdoZW4gbmVnYXRpdmUgdXNlIGl0IGZvciBkZWNpbWFsIHByZWNpc2lvblxuICAgICAgZGlzcGxheS10YXJnZXQ9XCJoYW5kbGVcIiAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgc2xpZGVyIGV4dGVybmFsIGZvcm1hdGVkIHZhbHVlIGluIHRoZSBoYW5kbGUgW3JlcXVpcmVyIGNhbHNzPVwiaWJ6LWhhbmRsZS1kaXNwbGF5XCJdXG4gICAgICBkdWFsLWhhbmRsZXM9J3RydWUnICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNlY29uZCBoYW5kbGUgdG8gc2xpZGVyIGZvciBtaW4vbWF4IHJhbmdlXG4gICAgICBpbml0aWFsPSd2YWx1ZXxbc3RhcnQvc3RvcF0nICAgICAgICAgICAgIC8vIHNsaWRlciBpbml0aWFsIHZhbHVlIFtkdWFsLWhhbmRsZXNdIG1heSBoYXZlIGluaXRpYWwgdmFsdWVzXG4gICAvPjwvcmFuZ2Utc2xpZGVyPlxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmFuZ2VTbGlkZXIgPSBhbmd1bGFyLm1vZHVsZSgnUmFuZ2VTbGlkZXInLFtdKTtcblxuZnVuY3Rpb24gUmFuZ2VTbGlkZXJIYW5kbGUgKHNjb3BlKSB7XG4gICAgdmFyIGludGVybmFscyA9IFtdO1xuICAgIHZhciBleHRlcm5hbHMgPSBbXTtcblxuICAgIHRoaXMuZ2V0SWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNjb3BlLnNsaWRlcmlkO1xuICAgIH07XG5cbiAgICB0aGlzLmdldENiSGFuZGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzY29wZS5jYmhhbmRsZTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRWaWV3PSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuXG4gICAgICAgIC8vIGlmIHZhbHVlIGRpZCBub3QgY2hhbmdlIHJldHVybiBjdXJyZW50IGV4dGVybmFsIHJlcHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChzY29wZS52YWx1ZVtoYW5kbGVdID09PSBpbnRlcm5hbHNbaGFuZGxlXSkgcmV0dXJuIGV4dGVybmFsc1toYW5kbGVdO1xuXG4gICAgICAgIC8vIGJ1aWxkIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIGFuZCBzYXZlIGl0IGZvciBmdXJ0aGVyIHJlcXVlc3RzXG4gICAgICAgIGludGVybmFsc1toYW5kbGVdID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcbiAgICAgICAgaWYgKHNjb3BlLmZvcm1hdHRlcikgZXh0ZXJuYWxzW2hhbmRsZV0gPSBzY29wZS5mb3JtYXR0ZXIoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgIGVsc2UgIGV4dGVybmFsc1toYW5kbGVdID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcblxuICAgICAgICByZXR1cm4gZXh0ZXJuYWxzW2hhbmRsZV07XG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NlLCBzdGF0dXMpIHtcbiAgICAgICBzY29wZS51cGRhdGVDbGFzcyAoY2xhc3NlLCBzdGF0dXMpO1xuICAgIH07XG5cbiAgICB0aGlzLmZvcmNlUmVmcmVzaCA9IGZ1bmN0aW9uICh0aW1lcikge1xuICAgICAgIHNjb3BlLmZvcmNlUmVmcmVzaCh0aW1lcik7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0VmFsdWU9IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgaWYgKCFoYW5kbGUpIGhhbmRsZSA9IDA7XG4gICAgICAgIHJldHVybiBzY29wZS52YWx1ZVtoYW5kbGVdO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFJlbGF0aXZlPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuICAgICAgICByZXR1cm4gc2NvcGUucmVsYXRpdmVbaGFuZGxlXTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRWYWx1ZT0gZnVuY3Rpb24gKHZhbHVlLCBoYW5kbGUpIHtcbiAgICAgICAgaWYgKCFoYW5kbGUpIGhhbmRsZSA9IDA7XG4gICAgICAgIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwgaGFuZGxlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXREaXNhYmxlPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICBzY29wZS5zZXREaXNhYmxlKGZsYWcpO1xuICAgIH07XG59XG5cblJhbmdlU2xpZGVyLmRpcmVjdGl2ZSgncmFuZ2VTbGlkZXInLCBbXCIkbG9nXCIsIFwiJGRvY3VtZW50XCIsIFwiJHRpbWVvdXRcIiwgZnVuY3Rpb24gKCRsb2csICRkb2N1bWVudCwgJHRpbWVvdXQpIHtcblxuICAgIHZhciB0ZW1wbGF0ZT0gJzxkaXYgY2xhc3M9XCJpYnotcmFuZ2Utc2xpZGVyIHJhbmdlLXNsaWRlclwiIHRpdGxlPVwie3t0aXRsZX19XCJkYXRhLXNsaWRlcj4nK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwicmFuZ2Utc2xpZGVyLWhhbmRsZSBoYW5kbGUtbWluXCIgbmctbW91c2Vkb3duPVwiaGFuZGxlQ0IoJGV2ZW50LDApXCIgbmctZm9jdXM9XCJmb2N1c0NCKHRydWUpXCIgbmctYmx1cj1cImZvY3VzQ0IoZmFsc2UpXCIgcm9sZT1cInNsaWRlclwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj4nK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaGFuZGxlLW1heFwiIG5nLW1vdXNlZG93bj1cImhhbmRsZUNCKCRldmVudCwxKVwiIG5nLWZvY3VzPVwiZm9jdXNDQih0cnVlKVwiIG5nLWJsdXI9XCJmb2N1c0NCKGZhbHNlKVwiIHJvbGU9XCJzbGlkZXJcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInJhbmdlLXNsaWRlci1hY3RpdmUtc2VnbWVudFwiPjwvc3Bhbj4nK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaWJ6LXJhbmdlLXNsaWRlci1zdGFydFwiID48L3NwYW4+ICcrXG4gICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJpYnotcmFuZ2Utc2xpZGVyLXN0b3BcIj48L3NwYW4+ICcrXG4gICAgICAgICAgICAgICAgICAnPGlucHV0IGlkPXt7c2xpZGVyaWR9fSB0eXBlPVwiaGlkZGVuXCI+JytcbiAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuXG5cbiAgICBmdW5jdGlvbiBsaW5rIChzY29wZSwgZWxlbWVudCwgYXR0cnMsIG1vZGVsKSB7XG4gICAgICAgIC8vIGZ1bGwgaW5pdGlhbGlzYXRpb24gb2Ygc2xpZGVyIGZyb20gYSBzaW5nbGUgb2JqZWN0XG4gICAgICAgIHNjb3BlLmluaXRXaWRnZXQgPSBmdW5jdGlvbiAoaW5pdHZhbHVlcykge1xuXG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy5ieVN0ZXApICBzY29wZS5ieVN0ZXAgID0gcGFyc2VJbnQoaW5pdHZhbHVlcy5ieVN0ZXApO1xuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMubm90TW9yZSkgc2NvcGUubm90TW9yZSA9IHBhcnNlSW50KGluaXR2YWx1ZXMubm90TW9yZSk7XG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy5ub3RMZXNzKSBzY29wZS5ub3RMZXNzID0gcGFyc2VJbnQoaW5pdHZhbHVlcy5ub3RMZXNzKTtcbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLmlkKSAgICAgIHNjb3BlLnNsaWRlcmlkPSBpbml0dmFsdWVzLmlkO1xuXG4gICAgICAgICAgICAvLyBodWdlbHkgYnV0IGluIHNvbWUgY2FzZSBET00gaXMgbm90IGZpbmlzaCB3aGVuIHdlIHRyeSB0byBzZXQgdmFsdWVzICEhIVxuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMudmFsdWUgIT09IHVuZGVmaW5lZCkgICB7XG4gICAgICAgICAgICAgICAgc2NvcGUudmFsdWUgPSBpbml0dmFsdWVzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNjb3BlLmZvcmNlUmVmcmVzaCAoNTApOyAvLyB3YWl0IDUwbXMgZm9yIERPTSB0byBiZSByZWFkeVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gcmVjb21wdXRlIHNsaWRlIHBvc2l0aW9uaW5nXG4gICAgICAgIHNjb3BlLmZvcmNlUmVmcmVzaCA9IGZ1bmN0aW9uICh0aW1lcikge1xuICAgICAgICAgICB2YXIgdmFsdWUgPSBzY29wZS52YWx1ZTtcbiAgICAgICAgICAgc2NvcGUudmFsdWUgPSBbdW5kZWZpbmVkLHVuZGVmaW5lZF07XG4gICAgICAgICAgICR0aW1lb3V0IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgIHNjb3BlLnNldFZhbHVlKHZhbHVlWzBdLDApO1xuICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpICBzY29wZS5zZXRWYWx1ZSh2YWx1ZVsxXSwxKTtcbiAgICAgICAgICAgfSwgdGltZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGhhbmRsZXIgdG8gY2hhbmdlIGNsYXNzIGZyb20gc2xpZGVyIGhhbmRsZVxuICAgICAgICBzY29wZS51cGRhdGVDbGFzcyA9IGZ1bmN0aW9uIChjbGFzc2UsIHN0YXR1cykge1xuXG4gICAgICAgICAgICBpZiAoc3RhdHVzKSBlbGVtZW50LmFkZENsYXNzIChjbGFzc2UpO1xuICAgICAgICAgICAgZWxzZSAgZWxlbWVudC5yZW1vdmVDbGFzcyAoY2xhc3NlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5zZXREaXNhYmxlID0gZnVuY3Rpb24gKGRpc2FibGVkKSB7XG5cbiAgICAgICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MgKFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzBdLmNzcyAoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzFdLmNzcyAoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MgKFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzBdLmNzcyAoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHNjb3BlLmhhbmRsZXNbMV0uY3NzICgndmlzaWJpbGl0eScsJ3Zpc2libGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzO1xuICAgICAgICAgICAgdmFyIHBvaW50ID0gdmFsdWUgKiByYW5nZTtcblxuICAgICAgICAgICAgLy8gaWYgc3RlcCBpcyBwb3NpdGl2ZSBsZXQncyByb3VuZCBzdGVwIGJ5IHN0ZXBcbiAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPiAgMCkge1xuICAgICAgICAgICAgICAgIHZhciBtb2QgPSAocG9pbnQgLSAocG9pbnQgJSBzY29wZS5ieVN0ZXApKSAvIHNjb3BlLmJ5U3RlcDtcbiAgICAgICAgICAgICAgICB2YXIgcmVtID0gcG9pbnQgJSBzY29wZS5ieVN0ZXA7XG5cbiAgICAgICAgICAgICAgICB2YXIgcm91bmQgPSAocmVtID49IHNjb3BlLmJ5U3RlcCAqIDAuNSA/IHNjb3BlLmJ5U3RlcCA6IDApO1xuICAgICAgICAgICAgICAgIHJlc3VsdD0gKG1vZCAqIHNjb3BlLmJ5U3RlcCArIHJvdW5kKSArIHNjb3BlLm5vdExlc3M7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyAoXCJyYW5nZT0lZCB2YWx1ZT0lZCBwb2ludD0lZCBtb2Q9JWQgcmVtPSVkIHJvdW5kPSVkIHJlc3VsdD0lZFwiLCByYW5nZSwgdmFsdWUsIHBvaW50LCBtb2QsIHJlbSwgcm91bmQsIHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBzdGVwIGlzIG5lZ2F0aXZlIHJldHVybiByb3VuZCB0byBhc2tlZCBkZWNpbWFsXG4gICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwIDwgIDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcG93ZXIgID0gIE1hdGgucG93ICgxMCwoc2NvcGUuYnlTdGVwICogLTEpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBzY29wZS5ub3RMZXNzICsgcGFyc2VJbnQgKHBvaW50ICogcG93ZXIpIC8gcG93ZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBzdGVwIGlzIG51bGwgcmV0dXJuIGZ1bGwgdmFsdWVcbiAgICAgICAgICAgIHJldHVybiBwb2ludDtcbiAgICAgICB9O1xuXG4gICAgICAgIC8vIHJldHVybiBjdXJyZW50IHZhbHVlXG4gICAgICAgIHNjb3BlLmdldFZhbHVlID0gZnVuY3Rpb24gKG9mZnNldCwgaGFuZGxlKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdID0gKG9mZnNldCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSAvIChzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucmVsYXRpdmVbaGFuZGxlXSA9IG9mZnNldCAvICAoc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV3dmFsdWUgPSBzY29wZS5ub3JtYWxpemUgKHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0pO1xuXG5cbiAgICAgICAgICAgIC8vIGlmIGludGVybmFsIHZhbHVlIGNoYW5nZSB1cGRhdGUgb3IgbW9kZWxcbiAgICAgICAgICAgIGlmIChuZXd2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkge1xuICAgICAgICAgICAgICAgIGlmIChuZXd2YWx1ZSA8IHNjb3BlLnN0YXJ0VmFsdWUpIG5ld3ZhbHVlPXNjb3BlLnN0YXJ0VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG5ld3ZhbHVlID4gc2NvcGUuc3RvcFZhbHVlKSAgbmV3dmFsdWU9c2NvcGUuc3RvcFZhbHVlO1xuXG5cbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IHNjb3BlLmZvcm1hdHRlciAobmV3dmFsdWUsIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IG5ld3ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZGlzcGxheXNbaGFuZGxlXSkge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5c1toYW5kbGVdLmh0bWwgKHNjb3BlLnZpZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlW2hhbmRsZV0gPSBuZXd2YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWwpIG1vZGVsLiRzZXRWaWV3VmFsdWUgKHNjb3BlLnZpZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld3ZhbHVlID4gc2NvcGUuc3RhcnRWYWx1ZSAmJiBuZXd2YWx1ZSA8IHNjb3BlLnN0b3BWYWx1ZSkgc2NvcGUudHJhbnNsYXRlKG9mZnNldCwgaGFuZGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4gICAgICAgIHNjb3BlLnNldFN0YXJ0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBzY29wZS52YWx1ZVswXSkge1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuZHVhbCkgc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDApO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAqICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBzY29wZS5zdGFydC5jc3MoJ2hlaWdodCcsb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKiAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RhcnQuY3NzKCd3aWR0aCcsb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0VmFsdWU9IHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLnNldFN0b3AgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IHNjb3BlLnZhbHVlWzBdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZS5kdWFsKSBzY29wZS5zZXRWYWx1ZSAodmFsdWUsMCk7XG4gICAgICAgICAgICAgICAgZWxzZSBzY29wZS5zZXRWYWx1ZSAodmFsdWUsMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICogKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXJ0LmNzcygnaGVpZ2h0JyxvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAqICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBzY29wZS5zdG9wLmNzcyh7J3JpZ2h0JzogMCwgJ3dpZHRoJzogKHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggIC0gb2Zmc2V0KSArICdweCd9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUuc3RvcFZhbHVlPSB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS50cmFuc2xhdGUgPSBmdW5jdGlvbiAob2Zmc2V0LCBoYW5kbGUpIHtcbiAgICAgICAgICAgIHZhciBzdGFydDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFrZSBoYW5kbGUgc2l6ZSBpbiBhY2NvdW50IHRvIGNvbXB1dGUgbWlkZGxlXG4gICAgICAgICAgICAgICAgdmFyIHZvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIG9mZnNldDtcblxuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbaGFuZGxlXS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW1vei10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyB2b2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctby10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJ1xuICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBpZiAoIXNjb3BlLmR1YWwpIHNjb3BlLnNsaWRlci5jc3MoJ2hlaWdodCcsIG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcGUucmVsYXRpdmVbMV0gJiYgc2NvcGUucmVsYXRpdmVbMF0pIHtcbiAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gKHNjb3BlLnJlbGF0aXZlWzFdIC0gc2NvcGUucmVsYXRpdmVbMF0pICogIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgIHN0YXJ0ICA9IChzY29wZS5yZWxhdGl2ZVswXSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgc2NvcGUuc2xpZGVyLmNzcyAoeydib3R0b20nOiBzdGFydCsncHgnLCdoZWlnaHQnOiBoZWlnaHQgKyAncHgnfSk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1toYW5kbGVdLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tb3otdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1vLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuZHVhbCkgc2NvcGUuc2xpZGVyLmNzcygnd2lkdGgnLG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjb3BlLnJlbGF0aXZlWzFdICYmIHNjb3BlLnJlbGF0aXZlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IChzY29wZS5yZWxhdGl2ZVsxXSAtIHNjb3BlLnJlbGF0aXZlWzBdKSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChzY29wZS5yZWxhdGl2ZVswXSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2xpZGVyLmNzcyAoeydsZWZ0Jzogc3RhcnQrJ3B4Jywnd2lkdGgnOiB3aWR0aCArICdweCd9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gcG9zaXRpb24gaGFuZGxlIG9uIHRoZSBiYXIgZGVwZW5kaW5nIGEgZ2l2ZW4gdmFsdWVcbiAgICAgICAgc2NvcGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUgLCBoYW5kbGUpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQ7XG5cbiAgICAgICAgICAgIC8vIGlmIHZhbHVlIGRpZCBub3QgY2hhbmdlIGlnbm9yZVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBzY29wZS52YWx1ZVtoYW5kbGVdKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgICB2YWx1ZT0wO1xuICAgICAgICAgICAgaWYgKHZhbHVlID4gc2NvcGUubm90TW9yZSkgdmFsdWU9c2NvcGUubm90TW9yZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IHNjb3BlLm5vdExlc3MpIHZhbHVlPXNjb3BlLm5vdExlc3M7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gPSAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSA9PT0gMCkgb2Zmc2V0ID0gKHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gKiBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgKyBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodC8yO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT09IDEpIG9mZnNldCA9IHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gKiBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdID0gKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gKiAgKHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUudHJhbnNsYXRlIChvZmZzZXQsaGFuZGxlKTtcbiAgICAgICAgICAgIHNjb3BlLnZhbHVlW2hhbmRsZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLmZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gY2FsbCB0aHJvdWdoIHNldFZhbHVlIHdlIGRvIG5vdCBwYXNzIGNiSGFuZGxlXG4gICAgICAgICAgICAgICAgc2NvcGUudmlld1ZhbHVlID0gc2NvcGUuZm9ybWF0dGVyICh2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUudmlld1ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb2RlbCkgbW9kZWwuJHNldFZpZXdWYWx1ZSggc2NvcGUudmlld1ZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLmRpc3BsYXlzW2hhbmRsZV0pIHtcbiAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5c1toYW5kbGVdLmh0bWwgKHNjb3BlLnZpZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cblxuICAgICAgICAvLyBNaW5pbWFsIGtleXN0cm9rZSBoYW5kbGluZyB0byBjbG9zZSBwaWNrZXIgd2l0aCBFU0MgW3Njb3BlLmFjdGlmIGlzIGN1cnJlbnQgaGFuZGxlIGluZGV4XVxuICAgICAgICBzY29wZS5rZXlkb3duPSAgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgICAgIHN3aXRjaChlLmtleUNvZGUpe1xuICAgICAgICAgICAgICAgIGNhc2UgMzk6IC8vIFJpZ2h0XG4gICAgICAgICAgICAgICAgY2FzZSAzODogLy8gdXBcbiAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPiAwKSBzY29wZS4kYXBwbHkoc2NvcGUuc2V0VmFsdWUgKChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0rc2NvcGUuYnlTdGVwKSwgc2NvcGUuYWN0aWYpKTtcbiAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPCAwKSBzY29wZS4kYXBwbHkoc2NvcGUuc2V0VmFsdWUgKChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0rKDEgLyBNYXRoLnBvdygxMCwgc2NvcGUuYnlTdGVwKi0xKSkpLHNjb3BlLmFjdGlmKSk7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2spICBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6IC8vIGxlZnRcbiAgICAgICAgICAgICAgICBjYXNlIDQwOiAvLyBkb3duXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPiAwKSBzY29wZS4kYXBwbHkoc2NvcGUuc2V0VmFsdWUgKChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0gLSBzY29wZS5ieVN0ZXApLCBzY29wZS5hY3RpZikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwIDwgMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdIC0gKDEgLyBNYXRoLnBvdygxMCwgc2NvcGUuYnlTdGVwKi0xKSkpLHNjb3BlLmFjdGlmKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjaykgIHNjb3BlLmNhbGxiYWNrIChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI3OiAvLyBlc2NcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1tzY29wZS5hY3RpZl1bMF0uYmx1cigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLm1vdmVIYW5kbGUgPSBmdW5jdGlvbiAoaGFuZGxlLCBjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSBjbGllbnRZO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSBvZmZzZXQgPSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gY2xpZW50WCAtIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGlmICgoY2xpZW50WCArIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpID4gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLmdldFZhbHVlICAob2Zmc2V0LCBoYW5kbGUpO1xuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGR1YWwgaGFuZGxlIHRvIGNyb3NzXG4gICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCAmJiBzY29wZS52YWx1ZSBbMF0gPiBzY29wZS52YWx1ZVsxXSkge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT09IDApIHNjb3BlLnNldFZhbHVlIChzY29wZS52YWx1ZVswXSAsIDEpO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2NvcGUuc2V0VmFsdWUoc2NvcGUudmFsdWVbMV0sMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cblxuICAgICAgICBzY29wZS5mb2N1c0NCID0gZnVuY3Rpb24gKGluc2lkZSkge1xuICAgICAgICAgICAgaWYgKGluc2lkZSkge1xuICAgICAgICAgICAgICAgICRkb2N1bWVudC5vbigna2V5ZG93bicsc2NvcGUua2V5ZG93bik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ2tleWRvd24nLHNjb3BlLmtleWRvd24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGJhciB3YXMgdG91Y2ggbGV0IG1vdmUgaGFuZGxlIHRvIHRoaXMgcG9pbnRcbiAgICAgICAgc2NvcGUudG91Y2hCYXJDQiA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZT0wO1xuICAgICAgICAgICAgdmFyIHJlbGF0aXZlO1xuICAgICAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcztcbiAgICAgICAgICAgIHZhciBvbGR2YWx1ZSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdHdvIGhhbmRsZXMgc2VsZWN0IGNsb3Nlc3Qgb25lIGZyb20gdG91Y2ggcG9pbnRcbiAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSByZWxhdGl2ZSA9ICh0b3VjaGVzWzBdLnBhZ2VZIC0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20pIC8gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxzZSByZWxhdGl2ZT0gKHRvdWNoZXNbMF0ucGFnZVggLSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpIC8gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZTAgPSBNYXRoLmFicyhyZWxhdGl2ZSAtIHNjb3BlLnJlbGF0aXZlWzBdKTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UxID0gTWF0aC5hYnMocmVsYXRpdmUgLSBzY29wZS5yZWxhdGl2ZVsxXSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlMSA8IGRpc3RhbmNlMCkgaGFuZGxlPTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1vdmUgaGFuZGxlIHRvIG5ldyBwbGFjZVxuICAgICAgICAgICAgc2NvcGUubW92ZUhhbmRsZSAoaGFuZGxlLHRvdWNoZXNbMF0ucGFnZVgsIHRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrICYmIG9sZHZhbHVlICE9PSBzY29wZS52YWx1ZVtoYW5kbGVdKSBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaGFuZGxlIHdhcyB0b3VjaCBhbmQgZHJhZ1xuICAgICAgICBzY29wZS50b3VjaEhhbmRsZUNCID0gZnVuY3Rpb24gKHRvdWNoZXZ0LCBoYW5kbGUpIHtcbiAgICAgICAgICAgIHZhciBvbGR2YWx1ZSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG5cbiAgICAgICAgICAgIHRvdWNoZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ3RvdWNobW92ZScsdG91Y2htb3ZlKTtcbiAgICAgICAgICAgICRkb2N1bWVudC5vbigndG91Y2hlbmQnICx0b3VjaGVuZCk7XG4gICAgICAgICAgICBlbGVtZW50LnVuYmluZCgndG91Y2hzdGFydCcsIHNjb3BlLnRvdWNoQmFyQ0IpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiB0b3VjaG1vdmUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgdG91Y2hlcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vdmVIYW5kbGUgKGhhbmRsZSx0b3VjaGVzW2lkeF0ucGFnZVgsIHRvdWNoZXNbaWR4XS5wYWdlWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0b3VjaGVuZChldmVudCkge1xuICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgndG91Y2htb3ZlJyx0b3VjaG1vdmUpO1xuICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgndG91Y2hlbmQnICx0b3VjaGVuZCk7XG4gICAgICAgICAgICAgICBlbGVtZW50Lm9uKCd0b3VjaHN0YXJ0Jywgc2NvcGUudG91Y2hCYXJDQik7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBjaGFuZ2Ugbm90aWZ5IGFwcGxpY2F0aW9uIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrICYmIG9sZHZhbHVlICE9PSBzY29wZS52YWx1ZVtoYW5kbGVdKSBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuaGFuZGxlQ0IgPSBmdW5jdGlvbiAoY2xpY2tldmVudCwgaGFuZGxlKSB7XG5cbiAgICAgICAgICAgIGlmIChhdHRycy5hdXRvbWF0aWMpIHJldHVybjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG9sZHZhbHVlID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG1vdXNlIGV2ZW50IHRvIHRyYWNrIGhhbmRsZVxuICAgICAgICAgICAgY2xpY2tldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ21vdXNlbW92ZScsbW91c2Vtb3ZlKTtcbiAgICAgICAgICAgICRkb2N1bWVudC5vbignbW91c2V1cCcsIG1vdXNldXApO1xuICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1toYW5kbGVdWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICBzY29wZS5hY3RpZj1oYW5kbGU7XG5cbiAgICAgICAgICAgIC8vIHNsaWRlciBoYW5kbGUgaXMgbW92aW5nXG4gICAgICAgICAgICBmdW5jdGlvbiBtb3VzZW1vdmUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5tb3ZlSGFuZGxlIChoYW5kbGUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBtb3VzZSBpcyB1cCBkYW5zIGxlYXZlIHNsaWRlciBzZW5kIHJlc2l6ZSBldmVudHNcbiAgICAgICAgICAgIGZ1bmN0aW9uIG1vdXNldXAoKSB7XG4gICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgnbW91c2Vtb3ZlJywgbW91c2Vtb3ZlKTtcbiAgICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCdtb3VzZXVwJywgbW91c2V1cCk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBjaGFuZ2Ugbm90aWZ5IGFwcGxpY2F0aW9uIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrICYmIG9sZHZhbHVlICE9PSBzY29wZS52YWx1ZVtoYW5kbGVdKSBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc2ltdWxhdGUganF1ZXJ5IGZpbmQgYnkgY2xhc3NlcyBjYXBhYmlsaXRpZXMgW3dhcm5pbmcgb25seSByZXR1cm4gMXN0IGVsZW1lbnRzXVxuICAgICAgICBzY29wZS5maW5kID0gZnVuY3Rpb24gKHNlbGVjdCwgZWxlbSkge1xuICAgICAgICAgICAgdmFyIGRvbWVsZW07XG5cbiAgICAgICAgICAgIGlmIChlbGVtKSBkb21lbGVtID0gZWxlbVswXS5xdWVyeVNlbGVjdG9yKHNlbGVjdCk7XG4gICAgICAgICAgICBlbHNlIGRvbWVsZW0gPSBlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0KTtcblxuICAgICAgICAgICAgdmFyIGFuZ2VsZW0gPSBhbmd1bGFyLmVsZW1lbnQoZG9tZWxlbSk7XG4gICAgICAgICAgICByZXR1cm4gKGFuZ2VsZW0pO1xuICAgICAgICB9O1xuXG5cblxuICAgICAgICBzY29wZS5pbml0aWFsU2V0dGluZ3MgPSBmdW5jdGlvbiAoaW5pdGlhbCkge1xuICAgICAgICAgICAgdmFyIGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdDtcbiAgICAgICAgICAgIHNjb3BlLnZhbHVlPVtdOyAgLy8gc3RvcmUgbG93L2hlaWdodCB2YWx1ZSB3aGVuIHR3byBoYW5kbGVzXG4gICAgICAgICAgICBzY29wZS5yZWxhdGl2ZT1bXTtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLnByZWNpc2lvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdCA9ICgnJyArIHNjb3BlLmJ5U3RlcCkubWF0Y2goL1xcLihbXFxkXSopLyk7XG4gICAgICAgICAgICAgICAgc2NvcGUucHJlY2lzaW9uID0gZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0ICYmIGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdFsxXSA/IGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdFsxXS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwb3NpdGlvbiBoYW5kbGUgdG8gaW5pdGlhbCB2YWx1ZShzKVxuICAgICAgICAgICAgZWxlbWVudC5vbigndG91Y2hzdGFydCcsIHNjb3BlLnRvdWNoQmFyQ0IpO1xuICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1swXS5vbigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGV2dCl7c2NvcGUudG91Y2hIYW5kbGVDQihldnQsMCk7fSk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgc2xpZGVyIGhhcyB0d28gaGFuZGxlcyBsb3cvaGlnaHRcbiAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1sxXS5hZGRDbGFzcygncmFuZ2Utc2xpZGVyLWhhbmRsZScpO1xuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMV0ub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldnQpe3Njb3BlLnRvdWNoSGFuZGxlQ0IoZXZ0LDEpO30pO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuaW5pdHZhbHVlcykgc2NvcGUuc2V0VmFsdWUgKGluaXRpYWxbMV0sMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gaW5pdHN0YXRlIG9iamVjdCBhcHBseSBpdFxuICAgICAgICAgICAgaWYgKHNjb3BlLmluaXR2YWx1ZXMpIHNjb3BlLmluaXRXaWRnZXQgKHNjb3BlLmluaXR2YWx1ZXMpO1xuICAgICAgICAgICAgZWxzZSAgIHNjb3BlLnNldFZhbHVlIChpbml0aWFsWzBdLDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5zbGlkZXJpZCAgID0gYXR0cnMuaWQgfHwgXCJzbGlkZXItXCIgKyBwYXJzZUludCAoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICAgICAgICAgICAgc2NvcGUuc3RhcnRWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgIHNjb3BlLnN0b3BWYWx1ZSAgPSBJbmZpbml0eTtcbiAgICAgICAgICAgIHNjb3BlLmJ5U3RlcCAgID0gcGFyc2VJbnQoYXR0cnMuYnlTdGVwKSB8fCAxO1xuICAgICAgICAgICAgc2NvcGUudmVydGljYWwgPSBhdHRycy52ZXJ0aWNhbCAgIHx8IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUuZHVhbCAgICAgPSBhdHRycy5kdWFsSGFuZGxlc3x8IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUudHJpZ2dlcl9pbnB1dF9jaGFuZ2U9IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUubm90TW9yZSAgPSBwYXJzZUludChhdHRycy5ub3RNb3JlKSAgIHx8IDEwMDtcbiAgICAgICAgICAgIHNjb3BlLm5vdExlc3MgID0gcGFyc2VJbnQoYXR0cnMubm90TGVzcykgICB8fCAwO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIGVsZW1lbnQuYWRkQ2xhc3MoXCJ2ZXJ0aWNhbC1yYW5nZVwiKTtcblxuICAgICAgICAgICAgc2NvcGUuaGFuZGxlcz0gW3Njb3BlLmZpbmQoJy5oYW5kbGUtbWluJyksIHNjb3BlLmZpbmQoJy5oYW5kbGUtbWF4JyldO1xuICAgICAgICAgICAgc2NvcGUuYmFyICAgID0gZWxlbWVudDtcbiAgICAgICAgICAgIHNjb3BlLnNsaWRlciA9IHNjb3BlLmZpbmQoJy5yYW5nZS1zbGlkZXItYWN0aXZlLXNlZ21lbnQnKTtcbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0ICA9IHNjb3BlLmZpbmQoJy5pYnotcmFuZ2Utc2xpZGVyLXN0YXJ0Jyk7XG4gICAgICAgICAgICBzY29wZS5zdG9wICAgPSBzY29wZS5maW5kKCcuaWJ6LXJhbmdlLXNsaWRlci1zdG9wJyk7XG4gICAgICAgICAgICBzY29wZS5kaXNhYmxlPSBhdHRycy5kaXNhYmxlIHx8IGZhbHNlO1xuXG4gICAgICAgICAgICBzY29wZS5jdHJsaGFuZGxlID0gbmV3IFJhbmdlU2xpZGVySGFuZGxlIChzY29wZSk7XG5cbiAgICAgICAgICAgIC8vIHByZXBhcmUgRE9NIG9iamVjdCBwb2ludGVyIHRvIGNvbXB1dGUgc2l6ZSBkeW5hbWljYWxseVxuICAgICAgICAgICAgc2NvcGUuYm91bmRzID0ge1xuICAgICAgICAgICAgICAgIGJhciAgICA6IGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgaGFuZGxlczogW3Njb3BlLmhhbmRsZXNbMF1bMF0sIHNjb3BlLmhhbmRsZXNbMV1bMF1dXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYXR0cnMuZGlzYWJsZSA9PT0gJ3RydWUnKSBzY29wZS5zZXREaXNhYmxlKHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoYXR0cnMuZGlzcGxheVRhcmdldCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYXR0cnMuZGlzcGxheVRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRydWUgOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdoYW5kbGUnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BsYXlzID0gc2NvcGUuaGFuZGxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMF0uYWRkQ2xhc3MoJ2liei1yYW5nZS1zbGlkZXItZGlzcGxheScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHNjb3BlLmhhbmRsZXNbMV0uYWRkQ2xhc3MoJ2liei1yYW5nZS1zbGlkZXItZGlzcGxheScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5cyA9ICBbJGRvY3VtZW50LmdldEVsZW1lbnRCeUlkIChhdHRycy5kaXNwbGF5VGFyZ2V0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHNjb3BlLmRpc3BsYXlzPVtdO1xuXG4gICAgICAgICAgICAvLyBleHRyYWN0IGluaXRpYWwgdmFsdWVzIGZyb20gYXR0cnMgYW5kIHBhcnNlIGludG8gaW50XG4gICAgICAgICAgICBpZiAoIWF0dHJzLmluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5pbml0aWFsICA9IFtzY29wZS5uZ01vZGVsLCBzY29wZS5uZ01vZGVsXTsgLy8gaW5pdGlhbGl6ZSB0byBtb2RlbCB2YWx1ZXNcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGluaXRpYWwgID0gYXR0cnMuaW5pdGlhbC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgIHNjb3BlLmluaXRpYWwgPSBbXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxbMF0gIT09IHVuZGVmaW5lZCA/IHBhcnNlSW50IChpbml0aWFsWzBdKSA6IHNjb3BlLm5vdExlc3MsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxbMV0gIT09IHVuZGVmaW5lZCA/IHBhcnNlSW50IChpbml0aWFsWzFdKSA6IHNjb3BlLm5vdE1vcmVcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNb25pdG9yIGFueSBjaGFuZ2VzIG9uIHN0YXJ0L3N0b3AgZGF0ZXMuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ3N0YXJ0QXQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUudmFsdWUgPCBzY29wZS5zdGFydEF0ICkge1xuICAgICAgICAgICAgICAgICAgICAvL3Njb3BlLnNldFZhbHVlIChzY29wZS5zdGFydEF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnN0YXJ0QXQpIHNjb3BlLnNldFN0YXJ0IChzY29wZS5zdGFydEF0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ3N0b3BBdCcgLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUudmFsdWUgPiBzY29wZS5zdG9wQXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zY29wZS5zZXRWYWx1ZSAoc2NvcGUuc3RvcEF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnN0b3BBdCkgc2NvcGUuc2V0U3RvcCAoc2NvcGUuc3RvcEF0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBmaW5pc2ggd2lkZ2V0IGluaXRpYWxpc2F0aW9uXG4gICAgICAgICAgICBzY29wZS5pbml0aWFsU2V0dGluZ3MgKHNjb3BlLmluaXRpYWwpO1xuXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuaW5pdCgpO1xuICAgICAgICBcbiAgICAgICAgIC8vIHNsaWRlciBpcyByZWFkeSBwcm92aWRlIGNvbnRyb2wgaGFuZGxlIHRvIGFwcGxpY2F0aW9uIGNvbnRyb2xsZXJcbiAgICAgICAgc2NvcGUuJHdhdGNoICgnaW5pdGhvb2snLCBmdW5jdGlvbiAoKSB7ICAgICAgICAgLy8gaW5pdCBWYWx1ZXMgbWF5IGFycml2ZSBsYXRlXG4gICAgICAgICAgICBpZiAoc2NvcGUuaW5pdGhvb2spIHNjb3BlLmluaXRob29rIChzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2NvcGUuJHdhdGNoICgnaW5pdHZhbHVlcycsIGZ1bmN0aW9uICgpIHsgXHQvLyBpbml0IFZhbHVlcyBtYXkgYXJyaXZlIGxhdGVcbiAgICAgICAgICAgIGlmIChzY29wZS5pbml0dmFsdWVzKSBzY29wZS5pbml0V2lkZ2V0KHNjb3BlLmluaXR2YWx1ZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyB0d28td2F5IGJpbmRpbmcgaWYgbW9kZWwgdmFsdWUgY2hhbmdlc1xuICAgICAgICBzY29wZS4kd2F0Y2ggKCduZ01vZGVsJywgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgICAgc2NvcGUuc2V0VmFsdWUobmV3VmFsdWUsIDApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbnJldHVybiB7XG4gICAgcmVzdHJpY3Q6IFwiRVwiLCAgICAvLyByZXN0cmljdCB0byA8cmFuZ2Utc2xpZGVyPiBIVE1MIGVsZW1lbnQgbmFtZVxuICAgIHNjb3BlOiB7XG4gICAgICAgIHN0YXJ0QXQgIDonPScsICAvLyBGaXJzdCBhY2NlcHRhYmxlIGRhdGVcbiAgICAgICAgc3RvcEF0ICAgOic9JywgIC8vIExhc3QgYWNjZXB0YWJsZSBkYXRlXG4gICAgICAgIGNhbGxiYWNrIDonPScsICAvLyBDYWxsYmFjayB0byBhY3RpZiB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZFxuICAgICAgICBmb3JtYXR0ZXI6Jz0nLCAgLy8gQ2FsbGJhY2sgZm9yIGRyYWcgZXZlbnQgY2FsbCBlYWNoIHRpbWUgaW50ZXJuYWwgdmFsdWUgY2hhbmdlc1xuICAgICAgICBpbml0aG9vayA6Jz0nLCAgLy8gSG9vayBwb2ludCB0byBjb250cm9sIHNsaWRlciBmcm9tIEFQSVxuICAgICAgICBjYmhhbmRsZSA6Jz0nLCAgLy8gQXJndW1lbnQgYWRkZWQgdG8gZXZlcnkgY2FsbGJhY2tcbiAgICAgICAgaW5pdHZhbHVlczonPScsICAgLy8gSW5pdGlhbCB2YWx1ZXMgYXMgYSBzaW5nbGUgb2JqZWN0XG4gICAgICAgIG5nTW9kZWw6ICc9JyAgICAvLyB0aGUgbW9kZWwgdmFsdWVcbiAgICB9LFxuICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsXG4gICAgdGVtcGxhdGU6IHRlbXBsYXRlLCAvLyBodG1sIHRlbXBsYXRlIGlzIGJ1aWxkIGZyb20gSlNcbiAgICByZXBsYWNlOiB0cnVlLCAgICAgIC8vIHJlcGxhY2UgY3VycmVudCBkaXJlY3RpdmUgd2l0aCB0ZW1wbGF0ZSB3aGlsZSBpbmhlcml0aW5nIG9mIGNsYXNzXG4gICAgbGluazogbGluayAgICAgICAgICAvLyBwaWNrYWRhdGUgb2JqZWN0J3MgbWV0aG9kc1xufTtcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiUmFuZ2VTbGlkZXIgTG9hZGVkXCIpO1xuXG59KSgpOyIsIi8qXG4gYWxzYS1nYXRld2F5IC0tIHByb3ZpZGUgYSBSRVNUL0hUVFAgaW50ZXJmYWNlIHRvIEFMU0EtTWl4ZXJcblxuIENvcHlyaWdodCAoQykgMjAxNSwgRnVsdXAgQXIgRm9sbFxuXG4gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblxuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIGFsb25nIHdpdGggc2NvcGUgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLlxuXG4gUmVmZXJlbmNlczpcblxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRlbXBsYXRlID1cbiAgICAgICAgICAnPGRpdiBjbGFzcz1cImFmYi1tb25pdG9yXCIgbmctY2xpY2s9XCJnZXRwaW5nKClcIj4nICtcbiAgICAgICAgICc8c3BhbiBjbGFzcz1cImFmYi1yZWZyZXNoLXRva2VuXCIgID5hZmI6Ly97e2hvc3RuYW1lfX06e3todHRwZHBvcnR9fTwvc3Bhbj4nICtcbiAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgJzwvZGl2Pic7XG5cblxuLy8gc2NvcGUgbW9kdWxlIGlzIGxvYWQgc3RhdGljYWxseSBiZWZvcmUgYW55IHJvdXRlIGlzIGNhdGl2YXRlZFxuYW5ndWxhci5tb2R1bGUoJ1Rva2VuUmVmcmVzaCcsIFsnQXBwQ29uZmlnJywgJ01vZGFsTm90aWZpY2F0aW9uJ10pXG5cbiAgICAuZGlyZWN0aXZlICgndG9rZW5SZWZyZXNoJywgW1wiJHRpbWVvdXRcIiwgXCIkaHR0cFwiLCBcIiRsb2NhdGlvblwiLCBcIk5vdGlmaWNhdGlvblwiLCBcIkFwcENvbmZpZ1wiLCBmdW5jdGlvbigkdGltZW91dCwgJGh0dHAsICRsb2NhdGlvbiwgTm90aWZpY2F0aW9uLCBBcHBDb25maWcpIHtcblxuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgc2NvcGUubG9nZ2VkPXVuZGVmaW5lZDsgLy8gbmVpdGhlciB0aHUgbmVpdGhlciBmYWxzZVxuICAgICAgICAgXG4gICAgICAgIHNjb3BlLm9ubGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgICAgKFwib25saW5lXCIpO1xuICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyAoXCJvZmZsaW5lXCIpO1xuICAgICAgICAgICAgc2NvcGUubG9nZ2VkPXRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUub2ZmbGluZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBlbGVtLmFkZENsYXNzICAgIChcIm9mZmxpbmVcIik7XG4gICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcIm9ubGluZVwiKTtcbiAgICAgICAgICAgIHNjb3BlLmxvZ2dlZD1mYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLm9uZXJyb3IgPSBmdW5jdGlvbihkYXRhLCBlcnJjb2RlLCBoZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUubG9nZ2VkICE9PSBmYWxzZSkgIHtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24ud2FybmluZyAoe21lc3NhZ2U6IFwiQXBwRnJhbWV3b3JrIEJpbmRlciBMb3N0XCIsIGRlbGF5OiA1MDAwfSk7XG4gICAgICAgICAgICAgICAgc2NvcGUub2ZmbGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuc3RhdHVzID0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGRhdGEsIGVycmNvZGUsIGhlYWRlcnMsIGNvbmZpZykge1xuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50b2tlbikgQXBwQ29uZmlnLnNlc3Npb24udG9rZW4gPSBkYXRhLnJlcXVlc3QudG9rZW47XG4gICAgICAgICAgICBpZiAoZGF0YS5yZXF1ZXN0LnV1aWQpICBBcHBDb25maWcuc2Vzc2lvbi51dWlkICA9IGRhdGEucmVxdWVzdC51dWlkO1xuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50aW1lb3V0KSAgQXBwQ29uZmlnLnNlc3Npb24udGltZW91dCAgPSBkYXRhLnJlcXVlc3QudGltZW91dDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHNjb3BlLmxvZ2dlZCAhPT0gdHJ1ZSkgIHtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uc3VjY2VzcyAoe21lc3NhZ2U6IFwiQXBwRnJhbWV3b3JrIEJpbmRlciBCYWNrIHRvIExpdmVcIiwgZGVsYXk6IDMwMDB9KTtcbiAgICAgICAgICAgICAgICBzY29wZS5vbmxpbmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2spIHNjb3BlLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5zdGF0dXMgPSAxO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIEJpbmRlciBzdGF0dXNcbiAgICAgICAgc2NvcGUuZ2V0cGluZyA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9ICRodHRwLmdldChBcHBDb25maWcuc2Vzc2lvbi5waW5nKyc/dG9rZW49JysgQXBwQ29uZmlnLnNlc3Npb24udG9rZW4pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBwcm9jZXNzIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUub25zdWNjZXNzKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUub25lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIHJlc3RhcnQgYSBuZXcgdGltZXIgZm9yIG5leHQgcGluZ1xuICAgICAgICAgICAgJHRpbWVvdXQgKHNjb3BlLmdldHBpbmcsIEFwcENvbmZpZy5zZXNzaW9uLnBpbmdyYXRlKjEwMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgQmluZGVyIHN0YXR1c1xuICAgICAgICBzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9ICRodHRwLmdldChBcHBDb25maWcuc2Vzc2lvbi5yZWZyZXNoKyc/dG9rZW49JysgQXBwQ29uZmlnLnNlc3Npb24udG9rZW4pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBwcm9jZXNzIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUub25zdWNjZXNzKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUub25lcnJvcik7XG4gICAgICAgICAgICAvLyByZXN0YXJ0IGEgbmV3IHRpbWVyIGZvciBuZXh0IHJlZnJlc2ggdG8gMS80IG9mIHRpbWVvdXQgc2Vzc2lvblxuICAgICAgICAgICAgJHRpbWVvdXQgKHNjb3BlLnJlZnJlc2gsIEFwcENvbmZpZy5zZXNzaW9uLnRpbWVvdXQgKjI1MCk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBJbml0aWFsIGNvbm5lY3Rpb25cbiAgICAgICAgc2NvcGUudGtjcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gJGh0dHAuZ2V0KEFwcENvbmZpZy5zZXNzaW9uLmNyZWF0ZSsnP3Rva2VuPScrIEFwcENvbmZpZy5zZXNzaW9uLmluaXRpYWwpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBwcm9jZXNzIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUub25zdWNjZXNzKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUub25lcnJvcik7XG4gICAgICAgIH07XG4gXG4gICAgICAgIHNjb3BlLmljb24gICAgICA9IGF0dHJzLmljb24gICB8fCBcImZpLWxpZ2h0YnVsYlwiO1xuICAgICAgICBzY29wZS5ob3N0bmFtZSAgPSAkbG9jYXRpb24uaG9zdCgpO1xuICAgICAgICBzY29wZS5odHRwZHBvcnQgPSAkbG9jYXRpb24ucG9ydCgpO1xuICAgICAgICBzY29wZS5hdXRvbG9nICAgPSBKU09OLnBhcnNlKGF0dHJzLmF1dG9sb2cgfHwgZmFsc2UpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNjb3BlLmF1dG9sb2cpIHNjb3BlLnRrY3JlYXRlKCk7XG5cbiAgICAgICAgLy8gSW5pdCBwaW5nIGFuZCByZWZyZXNoIHByb2Nlc3NcbiAgICAgICAgJHRpbWVvdXQgKHNjb3BlLmdldHBpbmcsIEFwcENvbmZpZy5zZXNzaW9uLnBpbmdyYXRlKjEwMDApO1xuICAgICAgICAkdGltZW91dCAoc2NvcGUucmVmcmVzaCwgQXBwQ29uZmlnLnNlc3Npb24udGltZW91dCAqMjUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6IFwiPVwiXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIGxpbms6IG15bWV0aG9kc1xuICAgIH07XG59XSk7XG5cbn0pKCk7XG5jb25zb2xlLmxvZyAoXCJUb2tlbiBSZWZyZXNoIExvYWRlZFwiKTtcblxuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKiBcbiAqIHJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL21vdXNlb3ZlclxuICogXG4gKiB1c2FnZTogXG4gKiBcbiAqIHRpcE1vZGFsOiBsaXN0ZW4gZXZlbnQgZnJvbSBlbGVtLnBhcmVudCgpIHRvIGRpc3BsYXkgdGlwLW1vZGFsXG4gKiAgICAgIDxkaXYgY2xhc3M9XCJ4eHh4XCI+XG4gKiAgICAgICAgICA8dGlwLW1vZGFsIHRpcD14eHh4PjwvdGlwLW1vZGFsPlxuICogICAgICAgICAgPGlucHV0LXRleHQgLi4uLj48L2lucHV0LXRleHQ+XG4gKiAgICAgIDwvZGl2PlxuICogICAgICBcbiAqIE5vdGU6IHVzZSBDU1MudmlzaWJpbGl0eSB0byBhdm9pZCBkaXNwbGF5IGZsaWNrZXJpbmcgYXQgaW5pdGlhbCBkaXNwbGF5LlxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRtcGwgPSAnPGRpdiBjbGFzcz1cInRpcC1tb2RhbC1wb3B1cFwiPicgK1xuICAgICAgICAgICAgJzxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+JyArXG4gICAgICAgICAgICAnPHNwYW4+e3t0aXB9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L3NwYW4+PC9kaXY+JyA7XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnTW9kYWxOb3RpZmljYXRpb24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ3RpcE1vZGFsJywgW1wiJHRpbWVvdXRcIiwgZnVuY3Rpb24gKCR0aW1lb3V0KSB7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudCA9IGVsZW0ucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsICAgID0gZWxlbS5maW5kKFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkgdGlwIGRpc3BsYXkgdG8gYXZvaWQgYmxpbmtpbmcgd2hlbiBtb3ZpbmcgbW91c2UgZmFzdFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkaXNwbGF5ICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFjdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnNob3cpIHNjb3BlLm1vZGFsLmNzcyh7b3BhY2l0eTogMSwgdmlzaWJpbGl0eTondmlzaWJsZSd9KTsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2hvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS50aW1lb3V0ID0gJHRpbWVvdXQoYWN0aW9uLCBzY29wZS5kZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsb3NlICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzY29wZS5zaG93ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuY3NzKHtvcGFjaXR5OiAwLCB2aXNpYmlsaXR5OidoaWRkZW4nfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWp1c3QgaWNvbiBvciB1c2UgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pY29uICA9IGF0dHJzLmljb24gfHwgJ2ZpLWxpZ2h0YnVsYic7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgUGFyZW50IGVsZW1lbnQgdG8gZ2V0IG1vdXNlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5hZGRDbGFzcyAoJ2FzLW1vZGFsLXRpcCcpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnY2xpY2snLCBjbG9zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdmb2N1cycsIGRpc3BsYXkpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnbW91c2VvdmVyJywgZGlzcGxheSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdtb3VzZWxlYXZlJywgY2xvc2UpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnYmx1cicsIGNsb3NlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmRlbGF5ID0gYXR0cnMuZGVsYXkgfHwgMTAwMDsgLy8gd2FpdCAxcyBiZWZvcmUgZGlzcGxheWluZyB0aXBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge3RpcDogXCI9XCJ9IC8vIHRpcCBtYXkgbm90IGJlIGRlZmluZWQgd2hlbiB3aWRnZXQgaXMgZGlzcGxheVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG59KSgpO1xuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbCA9ICc8c3BhbiB0aXRsZT1cIkdvdG86IHt7aHJlZn19XCIgbmctY2xpY2s9XCJjbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L3NwYW4+JztcblxuXG4gICAgYW5ndWxhci5tb2R1bGUoJ0xpbmtCdXR0b24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ2xpbmtCdXR0b24nLCBbXCIkbG9jYXRpb25cIiwgZnVuY3Rpb24gKCRsb2NhdGlvbikge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcblxuICAgICAgICAgICAgICAgICAgICBzY29wZS5jbGlja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJzLnF1ZXJ5KSAkbG9jYXRpb24ucGF0aChhdHRycy5ocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJGxvY2F0aW9uLnBhdGgoYXR0cnMuaHJlZikuc2VhcmNoKGF0dHJzLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhanVzdCBpY29uIG9yIHVzZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmljb24gPSBhdHRycy5pY29uICAgfHwgJ2ZpLWxpbmsnO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IGF0dHJzLmxhYmVsIHx8ICdKdW1wJztcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaHJlZiAgPSBhdHRycy5ocmVmICB8fCAnL2hvbWUnO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGxhYmVsIGFzIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgKHNjb3BlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG59KSgpO1xuIiwiXG4vKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLi5cbiAqIFxuICogUmVmZXJlbmNlOlxuICogICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvRmlsZVJlYWRlciBcbiAqICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Vc2luZ19maWxlc19mcm9tX3dlYl9hcHBsaWNhdGlvbnMjVXNpbmdfaGlkZGVuX2ZpbGVfaW5wdXRfZWxlbWVudHNfdXNpbmdfdGhlX2NsaWNrJTI4JTI5X21ldGhvZFxuICogICBodHRwczovL3VuY29ya2Vkc3R1ZGlvcy5jb20vYmxvZy9tdWx0aXBhcnRmb3JtZGF0YS1maWxlLXVwbG9hZC13aXRoLWFuZ3VsYXJqc1xuICogICBodHRwczovL3d3dy50ZXJsaWNpLmNvbS8yMDE1LzA1LzE2L3VwbG9hZGluZy1maWxlcy1sb2NhbGx5Lmh0bWxcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL25lcnZnaC9hbmd1bGFyLWZpbGUtdXBsb2FkL2Jsb2IvbWFzdGVyL3NyYy9zZXJ2aWNlcy9GaWxlVXBsb2FkZXIuanNcbiAqICAgaHR0cHM6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWxcbiAqICAgaHR0cDovL29uZWh1bmdyeW1pbmQuY29tL3ppcC1wYXJzaW5nLWpzemlwLWFuZ3VsYXIvXG4gKiAgIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTUzNDE5MTIvaG93LXRvLWdvLWZyb20tYmxvYi10by1hcnJheWJ1ZmZlclxuICogICBcbiAqICAgQnVnczogemlwIGZpbGUgc2VudCBldmVuIHdoZW4gZmxhZyBhcyBpbnZhbGlkIFxuICovXG5cbiBcblxuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG1wbEFwcGxpID0gJzxpbnB1dCB0eXBlPVwiZmlsZVwiIG5hbWU9XCJ7e25hbWV9fS1pbnB1dFwiIG9uY2hhbmdlPVwiYW5ndWxhci5lbGVtZW50KHRoaXMpLnNjb3BlKCkuVXBMb2FkRmlsZSh0aGlzLmZpbGVzKVwiIGFjY2VwdD1cInt7bWltZXR5cGV9fVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+JytcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidXBsb2FkLWZpbGVcIiBuZy1jbGljaz1cImltZ0NsaWNrZWQoKVwiPicgK1xuICAgICAgICAgICAgJzxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+IDxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8cmFuZ2Utc2xpZGVyIG5nLXNob3c9XCIhbm9zbGlkZXJcIiBpZD1cInt7bmFtZX19LXNsaWRlclwiIGF1dG9tYXRpYz10cnVlIGluaXRob29rPVwiU2xpZGVySW5pdENCXCI+PC9yYW5nZS1zbGlkZXI+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICBcbnZhciB0bXBsTW9kYWwgPSAnPHNwYW4gY2xhc3M9XCJtb2RhbC10ZXh0XCI+VXBsb2FkIEFwcGxpY2F0aW9uIDxiPnt7YXBwbmFtZX19PC9iPiA/PC9zcGFuPicgK1xuICAgICAgICAgICAgJzxkaXY+JytcbiAgICAgICAgICAgICc8aW1nIG5nLXNyYz1cInt7aWNvbn19XCI+JyArXG4gICAgICAgICAgICAnPHN1Ym1pdC1idXR0b24gaWNvbj1cImZpLXhcIiBsYWJlbD1cIkNhbmNlbFwiIGNsaWNrZWQ9XCJhYmFuZG9uXCI+PC9zdWJtaXQtYnV0dG9uPicrXG4gICAgICAgICAgICAnPHN1Ym1pdC1idXR0b24gaWNvbj1cImZpLWxpa2VcIiBsYWJlbD1cIkluc3RhbGxcIiBjbGlja2VkPVwic3VjY2Vzc1wiPjwvc3VibWl0LWJ1dHRvbj4gJyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICBcbnZhciB0bXBsRXJyb3IgPSAnPHNwYW4gY2xhc3M9XCJtb2RhbC10ZXh0XCI+SW52YWxpZCBBcHBsaWNhdGlvbiA8Yj57e2FwcG5hbWV9fTwvYj4gPzwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8ZGl2PicrXG4gICAgICAgICAgICAnPGltZyBuZy1zcmM9XCJ7e2ljb259fVwiPicgK1xuICAgICAgICAgICAgJzxzdWJtaXQtYnV0dG9uIGljb249XCJmaS14XCIgbGFiZWw9XCJDbG9zZVwiIGNsaWNrZWQ9XCJhYmFuZG9uXCI+PC9zdWJtaXQtYnV0dG9uPicrXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICBcblxuLy8gU2VydmljZSBDcmVhdGUgeGZvcm0gaW5zZXJ0IGZpbGVzIGluIGFuZCBQb3N0IGl0IHRvIHVybFxuZnVuY3Rpb24gTG9hZEZpbGVTdmMgKHNjb3BlLCBmaWxlcywgZmlsZUNCKSB7XG4gICAgdmFyIHhtbFJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHZhciB4Zm9ybSAgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgc2xpZGVyIGR1cmluZyBVcGxvYWRcbiAgICB4bWxSZXEudXBsb2FkLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIHByb2dyZXNzID0gTWF0aC5yb3VuZChldmVudC5sZW5ndGhDb21wdXRhYmxlID8gZXZlbnQubG9hZGVkICogMTAwIC8gZXZlbnQudG90YWwgOiAwKTtcbiAgICAgICAgaWYgKHNjb3BlLnNsaWRlcikgc2NvcGUuc2xpZGVyLnNldFZhbHVlIChwcm9ncmVzcyk7XG4gICAgfTtcblxuICAgIC8vIFVwbG9hZCBpcyBmaW5pc2ggbGV0J3Mgbm90aWZ5IGNvbnRyb2xlciBjYWxsYmFja1xuICAgIHhtbFJlcS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjb3BlLmRpdkVsZW0uYWRkQ2xhc3MgKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgc2NvcGUuZGl2RWxlbS5yZW1vdmVDbGFzcyAoXCJlcnJvclwiKTtcbiAgICAgICAgdmFyIHJlc3BvbnNlID17XG4gICAgICAgICAgICBzdGF0dXMgOiB4bWxSZXEuc3RhdHVzLFxuICAgICAgICAgICAgaGVhZGVyczogeG1sUmVxLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIFxuICAgICAgICB9O1xuICAgICAgICBzY29wZS5jYWxsYmFjayAocmVzcG9uc2UpO1xuICAgIH07XG5cbiAgICB4bWxSZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NvcGUuZGl2RWxlbS5hZGRDbGFzcyAoXCJlcnJvclwiKTtcbiAgICAgICAgc2NvcGUuZGl2RWxlbS5yZW1vdmVDbGFzcyAoXCJzdWNjZXNzXCIpO1xuICAgIH07XG5cbiAgICB4bWxSZXEub25hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NvcGUuZGl2RWxlbS5hZGRDbGFzcyAoXCJlcnJvclwiKTtcbiAgICAgICAgc2NvcGUuZGl2RWxlbS5yZW1vdmVDbGFzcyAoXCJzdWNjZXNzXCIpO1xuICAgICAgICB2YXIgcmVzcG9uc2UgPXtcbiAgICAgICAgICAgIHN0YXR1cyA6IHhtbFJlcS5zdGF0dXMsXG4gICAgICAgICAgICBoZWFkZXJzOiB4bWxSZXEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgXG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLmNhbGxiYWNrIChyZXNwb25zZSk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnBvc3RmaWxlID0gZnVuY3Rpb24ocG9zdHVybCkgeyBcbiAgICAgICAgLy8gZXZlcnl0aGluZyBsb29rcyBPSyBsZXQncyBQb3N0IGl0XG4gICAgICAgIHhtbFJlcS5vcGVuKFwiUE9TVFwiLCBwb3N0dXJsICwgdHJ1ZSk7XG4gICAgICAgIHhtbFJlcS5zZW5kKHhmb3JtKTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmZpbGUgPSBmaWxlc1tpXTtcbiAgICAgICAgLy8gVW5rbm93IFR5cGUgISEhIGlmICghdGhpcy5maWxlLnR5cGUubWF0Y2goc2NvcGUubWltZXR5cGUpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zb2xlLmxvZyAoXCJTZWxlY3RlZCBmaWxlPVwiICsgdGhpcy5maWxlLm5hbWUgKyBcIiBzaXplPVwiKyB0aGlzLmZpbGUuc2l6ZS8xMDI0ICsgXCIgVHlwZT1cIisgdGhpcy5maWxlLnR5cGUpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5iYXNlbmFtZT0gdGhpcy5maWxlLm5hbWUuc3BsaXQoJy8nKS5yZXZlcnNlKClbMF07XG5cbiAgICAgICAgLy8gRmlsZSB0byB1cGxvYWQgaXMgdG9vIGJpZ1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5maWxlLnNpemUpIHx8IHRoaXMuZmlsZS5zaXplID4gc2NvcGUubWF4c2l6ZSoxMDI0KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0IChmaWxlQ0IsMTAwKTsgIC8vIE9uIGVycm9yIGFzeW5jaHJvbm91cyBjYWxsYmFjayB3aXRob3V0IGFyZ3VtZW50XG4gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLy8gSWYgRmlsZSBpcyByZWFkYWJsZSBsZXQncyByZWFkIGl0XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcih0aGlzLmZpbGUpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZpbGVDQjtcblxuICAgICAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBpcyBPSyBsZXQncyBhZGQgZmlsZSB0byB4Zm9ybVxuICAgICAgICAgICAgeGZvcm0uYXBwZW5kKHNjb3BlLm5hbWUsIHRoaXMuZmlsZSwgdGhpcy5maWxlLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5hbmd1bGFyLm1vZHVsZSgnVXBsb2FkRmlsZXMnLFsnQXBwQ29uZmlnJywgJ01vZGFsTm90aWZpY2F0aW9uJywgJ1JhbmdlU2xpZGVyJ10pXG5cbi5kaXJlY3RpdmUoJ3VwbG9hZEFwcGxpJywgW1wiQXBwQ29uZmlnXCIsIFwiSlFlbXVcIiwgXCJOb3RpZmljYXRpb25cIiwgXCJNb2RhbEZhY3RvcnlcIiwgXCIkdGltZW91dFwiLCBmdW5jdGlvbihBcHBDb25maWcsICBKUWVtdSwgTm90aWZpY2F0aW9uLCBNb2RhbEZhY3RvcnksICR0aW1lb3V0KSB7XG4gICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgICBcbiAgICAgICAgLy8gZ2V0IHdpZGdldCBpbWFnZSBoYW5kbGUgZnJvbSB0ZW1wbGF0ZVxuICAgICAgICBzY29wZS5pbnB1dEVsZW0gID0gZWxlbS5maW5kKCdpbnB1dCcpO1xuICAgICAgICBzY29wZS5kaXZFbGVtICAgID0gZWxlbS5maW5kKCdkaXYnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEltYWdlIHdhcyBja2ljayBsZXQncyBzaW11bGF0ZSBhbiBpbnB1dCAoZmlsZSkgY2xpY2tcbiAgICAgICAgc2NvcGUuaW1nQ2xpY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLmlucHV0RWxlbVswXS5jbGljaygpOyAvLyBXYXJuaW5nIEFuZ3VsYXIgVHJpZ2dlckV2ZW50IGRvZXMgbm90IHdvcmshISFcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNsaWRlciBjb250cm9sIGhhbmRsZSByZWdpc3RyYXRpb24gYWZ0ZXIgY3JlYXRpb25cbiAgICAgICAgc2NvcGUuU2xpZGVySW5pdENCPWZ1bmN0aW9uIChzbGlkZXIpIHtcbiAgICAgICAgICAgc2NvcGUuc2xpZGVyPSBzbGlkZXI7IFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVXBsb2FkIGlzIGRlbGVnYXRlZCB0byBhIHNoYXJlZCBmdW5jdGlvblxuICAgICAgICBzY29wZS5VcExvYWRGaWxlPWZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgICAgdmFyIGhhbmRsZTsgXG4gICAgICAgICAgICB2YXIgYXBwaWNvbjtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIExvb2tzIE9LIGxldCdzIFBvc3QgWGZvcm0vRmlsZVxuICAgICAgICAgICAgICAgIGhhbmRsZS5wb3N0ZmlsZShhdHRycy5wb3N0dXJsICsgXCI/dG9rZW49XCIgKyBBcHBDb25maWcuc2Vzc2lvbi50b2tlbik7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5tb2RhbC5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgJHRpbWVvdXQgKGZ1bmN0aW9uKCkge3Njb3BlLm1vZGFsLmRlc3Ryb3koKTt9LCAxMDAwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBhYmFuZG9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICR0aW1lb3V0IChmdW5jdGlvbigpIHtzY29wZS5tb2RhbC5kZXN0cm95KCk7fSwgMTAwMCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciByZWFkZXJDQiA9IGZ1bmN0aW9uICh1cGxvYWQpIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZpbGUgdXBsb2FkIGZhaWwgaGFuZGxlIGVycm9yXG4gICAgICAgICAgICAgICAgaWYgKCEgdXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuZmlsZS5zaXplID4gc2NvcGUubWF4c2l6ZSoxMDI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBpY29uID0gc2NvcGUuaXN0b29iaWc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0gdG1wbEVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oaGFuZGxlLmZpbGUuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGljb24gPSBzY29wZS5pc25vdHZhbGlkOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPSB0bXBsRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB6aXBhcHAgPSBuZXcgSlNaaXAgKHVwbG9hZC50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRodW1ibmFpbCA9IHppcGFwcC5maWxlKFwiaWNvbl8xMjgucG5nXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlzIHdlIGhhdmUgYSB0aHVtYm5haWwgd2l0aGluIGxvYWRlZCBaaXBmaWxlXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGh1bWJuYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJUaGlzIGlzIG5vdCBhIHZhbGlkIEFwcGxpY2F0aW9uIEZyYW1ld29yayBBUFBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBpY29uID0gc2NvcGUuaXNub3R2YWxpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPSB0bXBsRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2NvcGUuaW1nRWxlbVswXS5zcmMgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdGh1bWJuYWlsLmFzQXJyYXlCdWZmZXIoKV0sIHt0eXBlOiBcImltYWdlXCJ9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBpY29uID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RodW1ibmFpbC5hc0FycmF5QnVmZmVyKCldLCB7dHlwZTogXCJpbWFnZVwifSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0bXBsTW9kYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tL2FwcHMvZG9jcy8jIS9hbmd1bGFyLW1vZHVsZXNcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25JbjogJ3NsaWRlSW5Gcm9tVG9wJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFNjb3BlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIDogc3VjY2VzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFiYW5kb24gOiBhYmFuZG9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbiAgICA6IGFwcGljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBuYW1lIDogaGFuZGxlLmJhc2VuYW1lXG4gICAgICAgICAgICAgICAgICAgIH0sIHRlbXBsYXRlIDogdGVtcGxhdGVcbiAgICAgICAgICAgICAgICB9OyBcbiAgICAgICAgICAgICAgICAvLyBQb3B1cCBNb2RhbCB0byByZW5kZXIgYXBwbGljYXRpb24gZGF0YVxuICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsID0gbmV3IE1vZGFsRmFjdG9yeShjb25maWcpO1xuICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsLmFjdGl2YXRlICgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gTG9hZCBmaWxlIHdpdGhpbiBicm93c2VyIGFuZCBpZiBPSyBjYWxsIHJlYWRlckNCXG4gICAgICAgICAgICBoYW5kbGUgPSBuZXcgTG9hZEZpbGVTdmMgKHNjb3BlLCBmaWxlcywgcmVhZGVyQ0IpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cgKGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbGxpemUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBhdHRyaWJ1dGVzIHZhbHVlc1xuICAgICAgICBzY29wZS5uYW1lPSBhdHRycy5uYW1lIHx8ICdhcHBsaSc7XG4gICAgICAgIHNjb3BlLmNhdGVnb3J5PSBhdHRycy5jYXRlZ29yeSAgfHwgJ2FwcGxpJztcbiAgICAgICAgc2NvcGUubWltZXR5cGU9IChhdHRycy5hY2NlcHQgfHwgJy53Z3QnKTtcbiAgICAgICAgc2NvcGUubWF4c2l6ZSA9IGF0dHJzLm1heHNpemUgfHwgMTAwMDAwOyAvLyBkZWZhdWx0IG1heCBzaXplIDEwME1CXG4gICAgICAgIHNjb3BlLnJlZ2V4cCAgPSBuZXcgUmVnRXhwIChhdHRycy5hY2NlcHQrICcuKicsJ2knKTtcbiAgICAgICAgc2NvcGUuaWNvbiAgICA9IGF0dHJzLmljb24gfHwgJ2ZpLXVwbG9hZCc7XG4gICAgICAgIHNjb3BlLmxhYmVsICAgPSBhdHRycy5sYWJlbCB8fCAnVXBsb2FkJztcbiAgICAgICAgXG4gICAgICAgIGlmIChhdHRycy50aHVtYm5haWwpIHNjb3BlLmlzbm90dmFsaWQ9IEFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAgYXR0cnMuaXNub3R2YWxpZDtcbiAgICAgICAgZWxzZSAgc2NvcGUuaXNub3R2YWxpZD1BcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgJ3czYy13aWRnZXQucG5nJztcblxuICAgICAgICBpZiAoYXR0cnMuaXN0b29iaWcpIHNjb3BlLmlzdG9vYmlnPSBBcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLmlzdG9vYmlnO1xuICAgICAgICBlbHNlICBzY29wZS5pc3Rvb2JpZz1BcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgJ2lzdG9vYmlnLnBuZyc7XG4gICAgICAgIHNjb3BlLm5vc2xpZGVyID0gYXR0cnMubm9zbGlkZXIgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKCFhdHRycy5wb3N0dXJsKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaWxlLXVwbG9hZCAlcyBwb3N0dXJsPS9hcGkveHh4eC94eHh4IHJlcXVpcmVkJywgc2NvcGUuYXR0cnMpOyAgICAgICAgICAgIFxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICB0ZW1wbGF0ZTogdG1wbEFwcGxpLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbiAgICBcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiVXBsb2FkRmlsZSBMb2FkZWRcIik7XG59KSgpO1xuIiwiXG4vKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLi5cbiAqL1xuXG5cblxuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG1wbCA9ICc8dGlwLW1vZGFsIHRpcD1cInRpcFwiPjwvdGlwLW1vZGFsPicgK1xuICAgICAgICAgICAnPGxhYmVsIGZvcj1cInt7bmFtZX19LWludGV4dFwiPnt7bGFiZWx9fSA8aSBuZy1zaG93PVwicmVxdWlyZWRcIiBuZy1jbGljaz1cIlRvQmVEZWZpbmVkXCIgJyArXG4gICAgICAgICAgICdjbGFzcz1cInJlcXVpcmVkIHt7c3RhdHVzfX0gZmktY2hlY2tib3hcIiB0aXRsZT1cIkZyZWUgVmFsdWUgQnV0IE1hbmRhdG9yeSBBcmd1bWVudFwiIGFsdD1cIj9cIj4gJm5ic3A7IDwvaT48L2xhYmVsPicrICAgICAgICAgIFxuICAgICAgICAgICAnPGlucHV0ICcrXG4gICAgICAgICAgICcgdHlwZT1cInt7dHlwZX19XCIgaWQ9XCJ7e25hbWV9fS1pbnRleHRcIiBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiICBjbGFzcz1cInN0YXR1cy17e3N0YXR1c319XCInK1xuICAgICAgICAgICAnIG5nLW1vZGVsPVwidmFsdWVcIiBuZy1ibHVyPVwidmFsaWRhdGUoKVwiIG5nLWZvY3VzPVwic2VsZWN0ZWQoKVwiICcrXG4gICAgICAgICAgICcgbmctbW9kZWwtb3B0aW9ucz1cInsgdXBkYXRlT246IFxcJ2RlZmF1bHQgYmx1clxcJywgZGVib3VuY2U6IHtkZWZhdWx0OiA1MDAsIGJsdXI6IDB9IH1cIicgK1xuICAgICAgICAgICAnPjxhbGVydCBkYXRhLW5nLXNob3c9XCIhdmFsaWQmJmVycm1zZ1wiPnt7ZXJybXNnfX08L2FsZXJ0Pic7XG5cbnZhciBlbWFpbHBhdGVybiA9IC9eKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXStcXC4pK1tePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl17Mix9KSQvaTtcblxuYW5ndWxhci5tb2R1bGUoJ0lucHV0VGV4dCcsWydKUXVlcnlFbXUnXSlcblxuLmRpcmVjdGl2ZSgnaW5wdXRUZXh0JywgW1wiSlFlbXVcIiwgZnVuY3Rpb24oSlFlbXUpIHtcbiAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBhdCAxc3QgcmVuZGVyaW5nXG4gICAgc2NvcGUuZXJyb3IgID0gZmFsc2U7XG4gICAgc2NvcGUudmFsaWQgID0gZmFsc2U7XG4gICAgc2NvcGUuc3RhdHVzID0gJ3VudG91Y2gnO1xuICAgXG4gICAgc2NvcGUuaW5wdXQgPSBlbGVtLmZpbmQgKFwiaW5wdXRcIik7XG4gICAgc2NvcGUucmVxdWlyZWQgPSAwO1xuICAgIFxuICAgIC8vIHJlcXVpcmVyIGlzIHVzZSB0byBpbmNyZW1lbnQgcmVxdWVzdGVkIGNvdW50ZXJcbiAgICBpZiAoXCJyZXF1aXJlZFwiIGluIGF0dHJzKSB7XG4gICAgICAgIHNjb3BlLnJlcXVpcmVkID0gMTtcbiAgICAgICAgZWxlbS5hZGRDbGFzcyAoXCJyZXF1aXJlZFwiKTtcbiAgICB9XG4gICAgICAgXG4gICAgIC8vIHVzZXIgZW50ZXIgaW5wdXQgcmVzZXQgZXJyb3Igc3RhdHVzXG4gICAgIHNjb3BlLnNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzY29wZS5lcnJvcj1mYWxzZTsgXG4gICAgICAgIHNjb3BlLmVycm1zZz1mYWxzZTsgXG4gICAgICAgIHNjb3BlLnN0YXR1cyA9ICd0b3VjaCc7XG4gICAgIH07ICAgXG4gICAgICAgICAgICBcbiAgICAgc2NvcGUudmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICBcbiAgICAgICAgIC8vIGdldCB2YWx1ZSBmcm9tIGlucHV0IGZpZWxkIGJ5cGFzc2luZyBBbmd1bGFyIG5nLW1vZGVsXG4gICAgICAgICBjb25zb2xlLmxvZyAoXCJDbGlja2VkIElucHV0VGV4dCBuYW1lPSVzIHZhbHVlPSVzIHZhbGlkPSVzXCIsIHNjb3BlLm5hbWUsIHNjb3BlLnZhbHVlLCBzY29wZS52YWxpZCk7ICAgICAgICBcblxuICAgICAgICAgLy8gZm9ybSBpcyBub3QgdW50b3VjaGVkIGFueW1vcmVcbiAgICAgICAgIHNjb3BlLnBhcmVudC5yZW1vdmVDbGFzcyAoXCJuZy1wcmlzdGluZVwiKTtcblxuICAgICAgICAgLy8gaWYgdmFsdWUgbm90IG51bGwgY2xlYW4gdXAgc3RyaW5nXG4gICAgICAgICBpZiAoc2NvcGUudmFsdWUpIHtcbiAgICAgICAgICAgICBzY29wZS5lcnJvcj1mYWxzZTsgXG4gICAgICAgICAgICAvLyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxsaW5nIHNwYWNlXG4gICAgICAgICAgICBzY29wZS52YWx1ZSA9IHNjb3BlLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgIFxuICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBzcGFjZSBpcyBub3QgYWxsb3dlZFxuICAgICAgICAgICAgaWYgKCdub3NwYWNlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgc2NvcGUudmFsdWU9c2NvcGUudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKTsgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgICAgIGlmICgnbG93ZXJjYXNlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgc2NvcGUudmFsdWUgPSBzY29wZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgXG4gICAgICAgICAgICAvLyBjaGVjayBtaW5pbXVtIGxlbmdodFxuICAgICAgICAgICAgaWYgKFwibWlubGVuXCIgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgaWYgKHNjb3BlLnZhbHVlLmxlbmd0aCA8IGF0dHJzLm1pbmxlbikge1xuICAgICAgICAgICAgICAgICBzY29wZS5zdGF0dXM9J2ludmFsaWQnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJtc2c9c2NvcGUubmFtZSArICc6IE1pbmludW0gTGVuZ2g9ICcgKyBhdHRycy5taW5sZW4gKyAnIENoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJvcj10cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoIWVtYWlscGF0ZXJuLnRlc3QgKHNjb3BlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXR1cz0naW52YWxpZCc7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJybXNnPSdpbnZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9yPXRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgICBzY29wZS5zdGF0dXM9J2ludmFsaWQnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJtc2c9c2NvcGUubmFtZSArICc6IFJlcXVpcmVkIEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICAgICAgIHNjb3BlLmVycm9yPXRydWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgIC8vIElmIGxvY2FsIGNvbnRyb2wgZmFpbCBsZXQncyByZWZ1c2UgaW5wdXRcbiAgICAgICAgIGlmIChzY29wZS5lcnJvcikge1xuICAgICAgICAgICAgIGlmIChzY29wZS5yZXF1aXJlZCAmJiBzY29wZS52YWxpZCkge1xuICAgICAgICAgICAgICAgICBzY29wZS52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICBpZiAoc2NvcGUubDRhY291bnRlci52YWxpZGF0ZWQgPiAwKSBzY29wZS5sNGFjb3VudGVyLnZhbGlkYXRlZCAtLTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIHVzZSBjYWxsIHRvIHVwZGF0ZSBmb3JtIHNjb3BlIG9uIGZvcm0gY29tcGxldGVuZXNzXG4gICAgICAgICAgICAgc2NvcGUuY2FsbGJhY2sgKGF0dHJzLm5hbWUsIG51bGwsIHNjb3BlLmRvbmUpO1xuICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgLy8gbG9jYWxjaGVjayBpcyBPSyBiYWNrdXAgbWF5IG5ldmVydGhlbGVzcyBjaGFuZ2Ugc3RhdHVzIHRvIGZhbHNlXG4gICAgICAgICAgICBpZiAoc2NvcGUucmVxdWlyZWQgICYmICFzY29wZS52YWxpZCkgc2NvcGUubDRhY291bnRlci52YWxpZGF0ZWQgKys7XG4gICAgICAgICAgICBzY29wZS5zdGF0dXM9J3ZhbGlkJztcbiAgICAgICAgICAgIHNjb3BlLnZhbGlkPXRydWU7XG4gICAgICAgICAgICBzY29wZS5jYWxsYmFjayAoYXR0cnMubmFtZSwgc2NvcGUudmFsdWUsIHNjb3BlLmRvbmUpO1xuICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGNvbnRyb2xsZXIgdG8gdXBkYXRlIHdpZGdldCBzdGF0dXNcbiAgICAgc2NvcGUuZG9uZT1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgIGNvbnNvbGUubG9nIChcIlRleHQtSW5wdXQgQ2FsbGJhY2sgSUQ9XCIrIGF0dHJzLm5hbWUgKyBcIiBkYXRhPVwiLCBkYXRhKTtcbiAgICAgICBmb3IgKHZhciBpIGluIGRhdGEpIHNjb3BlW2ldID0gZGF0YVtpXTsgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIEV4cG9ydCBzb21lIGF0dHJpYnV0ZXMgd2l0aGluIGRpcmVjdGl2ZSBzY29wZSBmb3IgdGVtcGxhdGVcbiAgICAgc2NvcGUubGFiZWwgICAgICAgPSBhdHRycy5sYWJlbDtcbiAgICAgc2NvcGUubmFtZSAgICAgICAgPSBhdHRycy5uYW1lO1xuICAgICBzY29wZS5wbGFjZWhvbGRlciA9IGF0dHJzLnBsYWNlaG9sZGVyO1xuICAgICBzY29wZS50eXBlICAgICAgICA9IGF0dHJzLnR5cGUgfHwgXCJ0ZXh0XCI7XG4gICAgIHNjb3BlLnRpcCAgICAgICAgID0gYXR0cnMudGlwO1xuXG4gICAgIC8vIHNlYXJjaCBmb3IgZm9ybSB3aXRoaW4gcGFyZW50IGVsZW1udHNcbiAgICAgc2NvcGUucGFyZW50ID0gSlFlbXUucGFyZW50IChlbGVtLCBcIkZPUk1cIik7XG5cbiAgICAgLy8gZW1haWwgZW5mb3JjZSBsb3dlcmNhc2UgYW5kIG5vc3BhY2UgICBcbiAgICAgaWYgKFwiZW1haWxcIiBpbiBhdHRycykge1xuICAgICAgICBhdHRycy5sb3dlcmNhc2U9dHJ1ZTsgXG4gICAgICAgIGF0dHJzLm5vc3BhY2U9dHJ1ZTsgXG4gICAgICAgIGF0dHJzLm1pbmxlbj02OyBcbiAgICAgfVxuXG4gICAgIGlmIChzY29wZS5yZXF1aXJlZCkge1xuICAgICAgICAgc2NvcGUubDRhY291bnRlciA9IHNjb3BlLnBhcmVudC5kYXRhIChcImw0YWNvdW50ZXJcIik7XG4gICAgICAgICBpZiAoIXNjb3BlLmw0YWNvdW50ZXIpIHsgXG4gICAgICAgICAgICBzY29wZS5sNGFjb3VudGVyID0gIHtyZXF1aXJlZDoxLCB2YWxpZGF0ZWQ6MH07XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkIFwiK3Njb3BlLm5hbWUrXCIgaXMgcmVxdWlyZWQgKDFzdClcIik7XG4gICAgICAgICAgICBzY29wZS5wYXJlbnQuZGF0YSAoXCJsNGFjb3VudGVyXCIsIHNjb3BlLmw0YWNvdW50ZXIpOyBcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZCBcIitzY29wZS5uYW1lK1wiIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICAgICAgIHNjb3BlLmw0YWNvdW50ZXIucmVxdWlyZWQgKys7XG4gICAgICAgICB9XG4gICAgIH1cbiAgICAgICAgIFxuICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gZWFjaCB0aW1lIGNvbnRyb2xlciB1cGRhdGUgdmFsdWVcbiAgICAgc2NvcGUuJHdhdGNoICgndmFsdWUnLCBmdW5jdGlvbigpe1xuICAgICAgICAgaWYoc2NvcGUudmFsdWUpIHNjb3BlLnZhbGlkYXRlKCk7IH1cbiAgICAgKTtcbiAgICBcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogJz0nLFxuICAgICAgICAgICAgdmFsdWU6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiSW5wdXRUZXh0IExvYWRlZFwiKTtcbn0pKCk7XG4iLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5cbihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIHRtcGwgPSAnPGlucHV0LXRleHQgIGNsYXNzPVwicGFzc3dvcmRcIiB0aXA9XCJ7e3RpcDF9fVwiICBwbGFjZWhvbGRlcj1cInt7cGxhY2UxfX1cIicgK1xuICAgICAgICAgICAnbGFiZWw9XCJ7e2xhYmVsMX19XCIgY2FsbGJhY2s9XCJ2YWxpZDFcIiBuYW1lPVwie3tuYW1lfX0tMVwiIHZhbHVlPVwicGFzczFcIiByZXF1aXJlZCBtaW5sZW49XCJ7e21pbmxlbn19XCIgdHlwZT1cInBhc3N3b3JkXCIgPicgK1xuICAgICAgICAgICAnPC9pbnB1dC10ZXh0PicgKyBcbiAgICAgICAgICAgJzxpbnB1dC10ZXh0ICBjbGFzcz1cInBhc3N3b3JkXCIgdGlwPVwidGlwMlwiICBwbGFjZWhvbGRlcj1cInt7cGxhY2UyfX1cIicgK1xuICAgICAgICAgICAnbGFiZWw9XCJ7e2xhYmVsMn19XCIgY2FsbGJhY2s9XCJ2YWxpZDJcIiBuYW1lPVwie3tuYW1lfX0tMlwiIHZhbHVlPVwicGFzczJcIiByZXF1aXJlZCBtaW5sZW49XCJ7e21pbmxlbn19XCIgdHlwZT1cInBhc3N3b3JkXCIgPiAnK1xuICAgICAgICAgICAnPC9pbnB1dC10ZXh0Pic7XG5cbmFuZ3VsYXIubW9kdWxlKCdJbnB1dFBhc3N3b3JkJyxbXSlcblxuLmRpcmVjdGl2ZSgnaW5wdXRQYXNzd29yZCcsIGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICBcbiAgICBzY29wZS52YWxpZDEgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgY29uc29sZS5sb2cgKFwiQ2xpY2tlZCBJbnB1dFBhc3N3b3JkMSBuYW1lPSVzIHZhbHVlPSVzXCIsIG5hbWUsIHZhbHVlKTsgICAgICAgIFxuICAgICAgICBzY29wZS5maXJzdHB3ZCA9IHZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgc2NvcGUudmFsaWQyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkb25lKSB7ICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2cgKFwiQ2xpY2tlZCBJbnB1dFBhc3N3b3JkMiBuYW1lPSVzIHZhbHVlPSVzXCIsIG5hbWUsIHZhbHVlKTsgICAgICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWYgYm90aCBwYXNzd2QgZXF1YWwgdGhlbiBjYWxsIGZvcm0gQ0JcbiAgICAgICAgaWYgKHNjb3BlLmZpcnN0cHdkICE9PSB2YWx1ZSkge1xuICAgICAgICAgIGRvbmUoe3ZhbGlkOiBmYWxzZSwgc3RhdHVzOiAnaW52YWxpZCcsIGVycm1zZzogXCJib3RoIHBhc3N3b3JkIHNob3VsZCBtYXRjaFwifSk7ICBcbiAgICAgICAgfSBlbHNlIHsgIFxuICAgICAgICAgIHNjb3BlLmNhbGxiYWNrIChhdHRycy5uYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGNvbnRyb2xsZXIgdG8gdXBkYXRlIHdpZGdldCBzdGF0dXNcbiAgICAgc2NvcGUuZG9uZT1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgIGNvbnNvbGUubG9nIChcIlRleHQtSW5wdXQgQ2FsbGJhY2sgSUQ9XCIrIGF0dHJzLm5hbWUgKyBcIiBkYXRhPVwiLCBkYXRhKTtcbiAgICAgICBmb3IgKHZhciBpIGluIGRhdGEpIHNjb3BlW2ldID0gZGF0YVtpXTsgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIEV4cG9ydCBzb21lIGF0dHJpYnV0ZXMgd2l0aGluIGRpcmVjdGl2ZSBzY29wZSBmb3IgdGVtcGxhdGVcbiAgICAgc2NvcGUubmFtZSAgID0gYXR0cnMubmFtZTtcbiAgICAgc2NvcGUubGFiZWwxID0gYXR0cnMubGFiZWwgfHwgJ1Bhc3N3b3JkJztcbiAgICAgc2NvcGUubGFiZWwyID0gYXR0cnMubGFiZWwgfHwgJ1Bhc3N3b3JkIFZlcmlmaWNhdGlvbic7XG4gICAgIHNjb3BlLnBsYWNlMSA9IGF0dHJzLnBsYWNlaG9sZGVyMSB8fCAnVXNlciBQYXNzd29yZCc7XG4gICAgIHNjb3BlLnRpcDEgICA9IGF0dHJzLnRpcCB8fCAnQ2hvb3NlIGEgUGFzc3dvcmQnO1xuICAgICBzY29wZS5wbGFjZTIgPSBhdHRycy5wbGFjZWhvbGRlcjEgfHwgJ1Bhc3N3b3JkIFZlcmlmaWNhdGlvbic7XG4gICAgIHNjb3BlLnRpcDIgICA9IGF0dHJzLnRpcCAgICB8fCAnQ29uZmlybWUgeW91ciBQYXNzd29yZCc7XG4gICAgIHNjb3BlLm1pbmxlbiA9IGF0dHJzLm1pbmxlbiB8fCAxMDtcbiAgICAgXG4gICAgIGlmIChcInJlcXVpcmVkXCIgaW4gYXR0cnMpIHNjb3BlLnJlcXVpcmVkID0gJ3JlcXVpcmVkJztcbiAgICAgICAgIFxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgY2FsbGJhY2sgOiAnPScsXG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5cbmNvbnNvbGUubG9nIChcIklucHV0UGFzc3dvcmQgTG9hZGVkXCIpO1xufSkoKTtcbiIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICogXG4gKiBCdWdzOiBJbnB1dCB3aXRoIENhbGxiYWNrIFNIT1VMRCBCRSBnZXQgJ3JlcXVpcmVkJyBjbGFzc1xuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRtcGwgPSAnPGRpdiAgbmctY2xpY2s9XCJjbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ1N1Ym1pdEJ1dHRvbicsIFtdKVxuICAgICAgICAgICAgLmRpcmVjdGl2ZSgnc3VibWl0QnV0dG9uJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFqdXN0IGljb24gb3IgdXNlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiA9IGF0dHJzLmljb24gfHwgJ2ZpLWZvb3QnO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IGF0dHJzLmxhYmVsIHx8ICdOZXh0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBsYWJlbCBhcyBjbGFzc1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzIChzY29wZS5sYWJlbC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGU6IGNsaWNrZWQgaW4gaW1wb3J0ZWQgYW5kIHdoZW4gdGVtcGxhdGUgaXMgY2xpY2tlZFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGNhbGwgY2xpY2tlZCBtZXRob2QgcGFzc2VkIGluIHBhcmFtLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge2NsaWNrZWQgOiAnPSd9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xufSkoKTtcbiIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICogXG4gKiBCdWdzOiBJbnB1dCB3aXRoIENhbGxiYWNrIFNIT1VMRCBCRSBnZXQgJ3JlcXVpcmVkJyBjbGFzc1xuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRtcGxBcHBsaSA9ICc8ZGl2ICBuZy1jbGljaz1cImNsaWNrZWQoKVwiPicgK1xuICAgICAgICAgICAgJzxpbWcgbmctc3JjPVwie3tpY29ufX1cIj4nICtcbiAgICAgICAgICAgICc8c3Bhbj57e2xhYmVsfX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICBcbiAgICB2YXIgdG1wbE1vZGFsID0gXG4gICAgICAgICAgICAnPGIgY2xhc3M9XCJjbG9zZS1idXR0b25cIiBuZy1jbGljaz1cImNsb3NlKClcIj7DlzwvYj4nICtcbiAgICAgICAgICAgICc8aW1nIG5nLXNyYz1cInt7aWNvbn19XCI+JyArXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtb2RhbC10ZXh0XCI+QXBwbGljYXRpb24gPGI+e3tsYWJlbH19PC9iPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8dWwgY2xhc3M9XCJ2ZXJ0aWNhbCBpY29uLWxlZnQgcHJpbWFyeSBtZW51LWJhclwiPicgK1xuICAgICAgICAgICAgJzxsaSBjbGFzcz1zdGFydC17e3J1bnN0YXR1c319PjxhIG5nLWNsaWNrPWFjdGlvbihcInN0YXJ0XCIpPjxpIGNsYXNzPVwiZmktY2hlY2tcIj4gU3RhcnQ8L2k+PC9hPjwvbGk+JyArXG4gICAgICAgICAgICAnPGxpIGNsYXNzPXN0b3Ate3tydW5zdGF0dXN9fT48YSBuZy1jbGljaz1hY3Rpb24oXCJzdG9wXCIpPjxpIGNsYXNzPVwiZmkteFwiPiBTdG9wPC9pPjwvYT48L2xpPicgK1xuICAgICAgICAgICAgJzxsaT48YSBuZy1jbGljaz1hY3Rpb24oXCJpbmZvXCIpPjxpIGNsYXNzPVwiZmktaW5mb1wiPiBJbmZvPC9pPjwvYT48L2xpPicgK1xuICAgICAgICAgICAgJzxsaSBjbGFzcz1zdGFydC17e3J1bnN0YXR1c319PjxhIG5nLWNsaWNrPWFjdGlvbihcInVuaW5zdGFsbFwiKT48aSBjbGFzcz1cImZpLXhcIj4gVW5pbnN0YWxsPC9pPjwvYT48L2xpPicgK1xuICAgICAgICAgICAgJzwvdWw+JyArXG4gICAgICAgICAgICAnJztcbiAgICBcbiAgICB2YXIgdG1wbERldGFpbCA9IFxuICAgICAgICAgICAgJzxiIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgbmctY2xpY2s9XCJjbG9zZSgpXCI+w5c8L2I+JyArXG4gICAgICAgICAgICAnPGltZyBuZy1zcmM9XCJ7e2ljb259fVwiPicgK1xuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwibW9kYWwtdGV4dFwiPkFwcGxpY2F0aW9uIDxiPnt7bGFiZWx9fTwvYj48L3NwYW4+JyArXG4gICAgICAgICAgICAnPHVsIGNsYXNzPVwidmVydGljYWwgaWNvbi1sZWZ0XCI+JyArXG4gICAgICAgICAgICAnPGxpPjxpIGNsYXNzPVwiZmktcGFwZXJjbGlwXCI+IE5hbWUgOiB7e2RldGFpbC5uYW1lfX0gPC9pPjwvbGk+JyArXG4gICAgICAgICAgICAnPGxpPjxpIGNsYXNzPVwiZmktaW5mb1wiPiBEZXNjcmlwdGlvbiB7e2RldGFpbC5kZXNjcmlwdGlvbn19PC9pPjwvbGk+JyArXG4gICAgICAgICAgICAnPGxpPjxpIGNsYXNzPVwiZmktdG9yc29cIj4gQXV0aG9yIDoge3tkZXRhaWwuYXV0aG9yfX08L2k+PC9saT4nICtcbiAgICAgICAgICAgICc8L3VsPicgK1xuICAgICAgICAgICAgJyc7XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnQXBwbGlCdXR0b24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ2FwcGxpQnV0dG9uJywgW1wiQXBwQ29uZmlnXCIsIFwiQXBwQ2FsbFwiLCBcIk1vZGFsRmFjdG9yeVwiLCBcIk5vdGlmaWNhdGlvblwiLCBcIiR0aW1lb3V0XCIsIFwiJHdpbmRvd1wiLCBcIiRsb2NhdGlvblwiLCBmdW5jdGlvbiAoQXBwQ29uZmlnLCBBcHBDYWxsLCBNb2RhbEZhY3RvcnksIE5vdGlmaWNhdGlvbiwgJHRpbWVvdXQsICR3aW5kb3csICRsb2NhdGlvbikge1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5ydW5zdGF0dXMgPSBcInN0b3BcIjtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuY2xpY2tlZCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vdGlmeUVycm9yID0gZnVuY3Rpb24oYWN0aW9uLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5lcnJvciAoe21lc3NhZ2U6IFwiRmFpbCAvYXBpL2FmbS1tYWluXCIgKyBhY3Rpb24gKyBcIj1cIiArIHNjb3BlLmxhYmVsICsgXCIgUnVuSUQ9XCIrIHNjb3BlLmFwcElELCBkZWxheTogNTAwMH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgKFwiZmFpbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcInN1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLmFwcElELCBhY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3RpZnlTdWNjZXNzID0gZnVuY3Rpb24gKGFjdGlvbiwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcImZhaWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUucnVuSUQgPSByZXNwb25zZS5kYXRhLnJlc3BvbnNlLnJ1bmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmNhbGxiYWNrIChzY29wZS5hcHBJRCwgYWN0aW9uLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvc2VNb2RhbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIk1vZGFsIENsb3NpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aW1lb3V0IChmdW5jdGlvbigpIHtzY29wZS5tb2RhbC5kZXN0cm95KCk7fSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uTW9kYWwgPSBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJNb2RhbCBBY3Rpb249JXNcIiwgYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0YXJ0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUucnVuc3RhdHVzICE9PSBcInN0b3BcIikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwiYWZtLW1haW5cIiwgXCJzdGFydFwiLCB7aWQ6IHNjb3BlLmFwcElELCBtb2RlOiBcInJlbW90ZVwifSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDAgfHwgcmVzcG9uc2UuZGF0YS5qdHlwZSAhPT0gXCJBSkJfcmVwbHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvciAoXCJzdGFydFwiLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUucnVuc3RhdHVzPVwic3RhcnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlTdWNjZXNzIChhY3Rpb24sIHJlc3BvbnNlKTtcblx0XHRcdFx0XHRpZihyZXNwb25zZS5kYXRhLnJlc3BvbnNlLnVyaSlcblx0XHRcdFx0XHRcdCR3aW5kb3cub3BlbihyZXNwb25zZS5kYXRhLnJlc3BvbnNlLnVyaS5yZXBsYWNlKFwiJWhcIiwgJGxvY2F0aW9uLmhvc3QoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RvcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnJ1bnN0YXR1cyAhPT0gXCJzdGFydFwiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcImFmbS1tYWluXCIsIFwidGVybWluYXRlXCIsIHtydW5pZDogc2NvcGUucnVuSUR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCB8fCByZXNwb25zZS5kYXRhLmp0eXBlICE9PSBcIkFKQl9yZXBseVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yIChcInN0b3BcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnJ1bnN0YXR1cz1cInN0b3BcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlTdWNjZXNzIChhY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJhZm0tbWFpblwiLCBcImRldGFpbFwiLCB7aWQ6IHNjb3BlLmFwcElEfSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDAgfHwgcmVzcG9uc2UuZGF0YS5qdHlwZSAhPT0gXCJBSkJfcmVwbHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvciAoXCJkZXRhaWxcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBodHRwOi8vZm91bmRhdGlvbi56dXJiLmNvbS9hcHBzL2RvY3MvIyEvYW5ndWxhci1tb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdhcHBsaUluZm9NZW51JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uSW46ICdzbGlkZUluRnJvbVRvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTY29wZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgICA6IGNsb3NlTW9kYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uICAgIDogc2NvcGUuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsICAgOiBzY29wZS5hcHBJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbCAgOiByZXNwb25zZS5kYXRhLnJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRlbXBsYXRlIDogdG1wbERldGFpbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVwIE1vZGFsIHRvIHJlbmRlciBhcHBsaWNhdGlvbiBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwgPSBuZXcgTW9kYWxGYWN0b3J5KGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuYWN0aXZhdGUgKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInVuaW5zdGFsbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnJ1bnN0YXR1cyAhPT0gXCJzdG9wXCIpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcImFmbS1tYWluXCIsIFwidW5pbnN0YWxsXCIsIHtpZDogc2NvcGUuYXBwSUR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCB8fCByZXNwb25zZS5kYXRhLmp0eXBlICE9PSBcIkFKQl9yZXBseVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yIChcInVuaW5zdGFsbFwiLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5U3VjY2VzcyAoYWN0aW9uLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJBY3Rpb25Nb2RhbCB1bmtub3duIGFjdGlvbj1bJXNdXCIsIGFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VNb2RhbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tL2FwcHMvZG9jcy8jIS9hbmd1bGFyLW1vZHVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdhcHBsaUFjdGlvbk1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbkluOiAnc2xpZGVJbkZyb21Ub3AnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTY29wZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gICA6IGFjdGlvbk1vZGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5zdGF0dXM6IHNjb3BlLnJ1bnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgICAgOiBjbG9zZU1vZGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uICAgICA6IHNjb3BlLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsICAgIDogc2NvcGUubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ZW1wbGF0ZSAgOiB0bXBsTW9kYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9wdXAgTW9kYWwgdG8gcmVuZGVyIGFwcGxpY2F0aW9uIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsID0gbmV3IE1vZGFsRmFjdG9yeShjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuYWN0aXZhdGUgKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIEFwcElEK1N0b3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRycy5oYW5kbGUgJiYgc2NvcGUuc3RvcmUgW2F0dHJzLmhhbmRsZV0ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiAgPSBBcHBDb25maWcucGF0aHMuaWNvbnMgKyBhdHRycy5oYW5kbGU7IC8vc2NvcGUuc3RvcmUgW2F0dHJzLmhhbmRsZV0ubmFtZS50b0xvd2VyQ2FzZSgpICsgJy1pY28ucG5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsID0gc2NvcGUuc3RvcmUgW2F0dHJzLmhhbmRsZV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmFwcElEPSBhdHRycy5oYW5kbGU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiAgPSBBcHBDb25maWcucGF0aHMuaWNvbnMgKyAndzNjLWljby5wbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsID0gYXR0cnMuaGFuZGxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbGFiZWwgYXMgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAoc2NvcGUubGFiZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiBjbGlja2VkIGluIGltcG9ydGVkIGFuZCB3aGVuIHRlbXBsYXRlIGlzIGNsaWNrZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBjYWxsIGNsaWNrZWQgbWV0aG9kIHBhc3NlZCBpbiBwYXJhbS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRtcGxBcHBsaSxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge2NhbGxiYWNrOiAnPScsIHN0b3JlOiAnPSd9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1dKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFdBUk5JTkc6IG1ha2Ugc3VyZSB0aGFuIGFwcC9mcm9udGVuZC9zZXJ2aWNlcy9BcHBDb25maWcuanMgbWF0Y2ggeW91ciBzZXJ2ZXJcblxuLy8gbGlzdCBhbGwgcmVwZW5kZW5jaWVzIHdpdGhpbiB0aGUgcGFnZSArIGNvbnRyb2xlciBpZiBuZWVkZWRcbmFuZ3VsYXIubW9kdWxlKCdEYXNoYm9hcmRNb2R1bGUnLCBbJ1N1Ym1pdEJ1dHRvbicsICdUb2tlblJlZnJlc2gnLCAnQXBwbGlCdXR0b24nXSlcblxuICAuY29udHJvbGxlcignRGFzaGJvYXJkQ29udHJvbGxlcicsIFtcIkFwcENhbGxcIiwgXCJOb3RpZmljYXRpb25cIiwgZnVuY3Rpb24gKEFwcENhbGwsIE5vdGlmaWNhdGlvbikge1xuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzOyAvLyBJIGhhdGUgSmF2YVNjcmlwdFxuICAgICAgICBzY29wZS51dWlkICAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS50b2tlbiAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zZXNzaW9uPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zdGF0dXMgPVwiZXJyLW5vXCI7XG4gICAgICAgIHNjb3BlLmFwcGxpSURzID1bXTsgLy8gYXJyYXkgdG8gaG9sZCBhcHBsaWNhdGlvbnMgSURcbiAgICAgICAgc2NvcGUuYXBwbGlTdG9yZT17fTsgLy8gYXJyYXkgdG8gaG9sZCBhcHBsaWNhdGlvbnMganNvbiBkZXNjcmlwdGlvblxuXG4gICAgICAgXG4gICAgICAgIHNjb3BlLkFwcGxpQ0IgPSBmdW5jdGlvbihhcHBsaUlELCBhY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gQWN0aW9uIGlzIGRvbmUgd2l0aGluIFdpZGdldCBDb250cm9sbGVyIG9ubHkgdXBkYXRlIGRlYnVnIFVJIHpvbmVcbiAgICAgICAgICAgICAgICBzY29wZS5yZXF1ZXN0ICA9IGFjdGlvbjsgXG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyY29kZSAgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHNjb3BlLnJlc3BvbnNlID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPbiBhcHAgd2FzIHJlbW92ZWQgbGV0J3MgdXBkYXRlIHJ1bm5hYmxlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFwidW5pbnN0YWxsXCIpICBzY29wZS5HZXRSdW5uYWJsZXMoKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLkdldFJ1bm5hYmxlcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiRGFzaGJvYXJkIEdldFJ1bm5hYmxlc1wiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwiYWZtLW1haW5cIiwgXCJydW5uYWJsZXNcIiwgey8qcXVlcnkqL30sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGRlYnVnIFVJIHpvbmVcbiAgICAgICAgICAgICAgICBzY29wZS5yZXF1ZXN0ICA9IFwiL2FwaS9hZm0tbWFpbi9ydW5uYWJsZVwiOyBcbiAgICAgICAgICAgICAgICBzY29wZS5yZXNwb25zZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyY29kZSAgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIkhvb3AgR2V0UnVubmFibGUgZmFpbGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSBmcm9tIEJpbmRlclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJlcXVlc3QuanR5cGUgIT09IFwiQUpCX3JlcGx5XCIgJiYgcmVzcG9uc2UuZGF0YS5yZXF1ZXN0LmFwaSAhPT0gXCJydW5uYWJsZXNcIikge1xuICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLmVycm9yICh7bWVzc2FnZTogXCJJbnZhbGlkIFJlc3BvbmQgdG8gL29wYS9hZm0tbWFpbi9ydW5uYWJsZSByZXNwb25zZS5kYXRhPVwiK3Jlc3BvbnNlLmRhdGEsIGRlbGF5OiA1MDAwfSk7IFxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBsb29wIG9uIHJ1bm5hYmxlIGFwcGxpY2F0aW9uIHRvIHByZXBhcmUgZm9yIGRpc3BsYXlcbiAgICAgICAgICAgICAgICB2YXIgIGFwcGxpSURzPVtdO1xuICAgICAgICAgICAgICAgIHZhciAgcnVubmFibGVzID0gcmVzcG9uc2UuZGF0YS5yZXNwb25zZS5ydW5uYWJsZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4PTA7IGlkeCA8IHJ1bm5hYmxlcy5sZW5ndGg7IGlkeCArKykge1xuICAgICAgICAgICAgICAgICAgICBhcHBsaUlEc1tpZHhdID0gcnVubmFibGVzIFtpZHhdLmlkO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5hcHBsaVN0b3JlIFtydW5uYWJsZXMgW2lkeF0uaWRdID0gIHJ1bm5hYmxlcyBbaWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2NvcGUuYXBwbGlJRHMgPSBhcHBsaUlEczsgLy8gYXZvaWQgcGFydGlhbCB1cGRhdGUgdG8gbGltaXQgVUkgcmVmcmVzaFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5GaWxlVXBsb2FkZWQgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcImZpbGUgVXBsb2FkZWRcIik7XG4gICAgICAgICAgICAvLyBDYW5ub3QgZGlzcGxheSBwb3N0IHJlc3VsdHMgYXMgR2V0UnVubmFibGUgd2lsbCBvdmVybG9hZCB0aGVtIGF5bmNocm9ub3VzbHlcbiAgICAgICAgICAgIHNjb3BlLnJlcXVlc3QgID0gXCIvYXBpL2FmbS1tYWluL2luc3RhbGxcIjsgXG4gICAgICAgICAgICBzY29wZS5yZXNwb25zZSA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICBzY29wZS5lcnJjb2RlICA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBsb29rcyBPSyB1cGRhdGUgYXBwIGxpc3RcbiAgICAgICAgICAgIHNjb3BlLkdldFJ1bm5hYmxlcygpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2NvcGUuQXV0b1N0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiQXV0b1N0YXJ0IHJlcXVlc3RpbmcgQXBwcyBsaXN0XCIpO1xuICAgICAgICAgICAgc2NvcGUuR2V0UnVubmFibGVzKCk7XG4gICAgICAgIH07XG4gICAgICAgICAgXG4gICB9XSk7XG5cbmNvbnNvbGUubG9nIChcIkRhc2hib2FyZCBDb250cm9sbGVyIExvYWRlZFwiKTtcbn0pKCk7ICIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKiBcbiAqIFVzYWdlOlxuICogXG4gKiAgIC8vIG1vdXNlIGV2ZW50IHByb2JhYmx5IHBvaW50IG9uIGljb24gYW5kIG5vdCBvbiBidXR0b24gZGl2XG4gKiAgIC4uLiBuZy1jbGljaz1cIkxvY2tDaGFubmVsKCRldmVudClcbiAgICAgdmFyIHRhcmdldD0gYW5ndWxhci5lbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICB2YXIgYnV0dG9uPSBKUWVtdS5GaW5kSW5QYXJlbnQgKHRhcmdldCwgJ2RpdicpO1xuICogXG4gKi9cblxuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuXG4gICAgICAgICAgXG4gICAgLy8gX2FsbCBtb2R1bGVzIG9ubHkgcmVmZXJlbmNlIGRlcGVuZGVuY2llc1xuICAgIGFuZ3VsYXIubW9kdWxlKCdKUXVlcnlFbXUnLCBbXSlcblxuICAgICAgICAgICAgLy8gRmFjdG9yeSBpcyBhIHNpbmdsZXRvbiBhbmQgc2hhcmUgaXRzIGNvbnRleHQgd2l0aGluIGFsbCBpbnN0YW5jZXMuXG4gICAgICAgICAgICAuZmFjdG9yeSgnSlFlbXUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgRmluZEluUGFyZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoID0gc2VsZWN0b3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PT0gcGFyZW50WzBdLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gSFRNTERpdkVsZW1lbnQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgIEZpbmRCeVRhZz0gZnVuY3Rpb24gKGVsZW1lbnQsIHRhZywgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHNlbGVjdG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlICAgPSB0YWcudG9Mb3dlckNhc2UoKSsgXCJOYW1lXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoID09PSBjaGlsZHJlblswXVt0eXBlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEhUTUxEaXZFbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgIEZpbmRCeUNsYXNzPSBmdW5jdGlvbiAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHNlbGVjdG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uaGFzQ2xhc3Moc2VhcmNoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEhUTUxEaXZFbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBteU1ldGhvZHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIEZpbmRJblBhcmVudDogRmluZEluUGFyZW50LFxuICAgICAgICAgICAgICAgICAgICBGaW5kQnlUYWc6IEZpbmRCeVRhZyxcbiAgICAgICAgICAgICAgICAgICAgRmluZEJ5Q2xhc3M6IEZpbmRCeUNsYXNzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBteU1ldGhvZHM7XG4gICAgICAgICAgICB9KTtcblxufSkoKTsiLCJ2YXIgZm91bmRhdGlvblJvdXRlcyA9IFt7XCJuYW1lXCI6XCJEYXNoYm9hcmRcIixcInVybFwiOlwiL2Rhc2hib2FyZFwiLFwiY29udHJvbGxlclwiOlwiRGFzaGJvYXJkQ29udHJvbGxlciBhcyBjdHJsXCIsXCJhbmltYXRpb25JblwiOlwic2xpZGVJblJpZ2h0XCIsXCJwYXRoXCI6XCJwYWdlcy9EYXNoYm9hcmQvRGFzaGJvYXJkLmh0bWxcIn1dOyBcbiIsIihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8gX2FsbCBtb2R1bGVzIG9ubHkgcmVmZXJlbmNlIGRlcGVuZGVuY2llc1xuICAgIGFuZ3VsYXIubW9kdWxlKCdBcHBDb25maWcnLCBbXSlcbiAgICBcbiAgICAgICAgICAgIC8vIEZhY3RvcnkgaXMgYSBzaW5nbGV0b24gYW5kIHNoYXJlIGl0cyBjb250ZXh0IHdpdGhpbiBhbGwgaW5zdGFuY2VzLlxuICAgICAgICAgICAgLmZhY3RvcnkoJ0FwcENvbmZpZycsIFtcInVybHF1ZXJ5XCIsIGZ1bmN0aW9uICh1cmxxdWVyeSkge1xuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cgKFwiVVJMPVwiKyAkbG9jYXRpb24udXJsKCkgKyBcIiBRdWVyeT1cIiArIGxvY2F0aW9uLmhyZWYrIFwiIHdpbmRvdz1cIiArIGRvY3VtZW50LnJlZmVycmVyKTtcblxuICAgICAgICAgICAgICAgIHZhciBteUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHBhdGhzOiB7IC8vIFdhcm5pbmcgcGF0aHMgc2hvdWxkIGVuZCB3aXRoIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIDogJ2ltYWdlcy8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMgOiAnL2ljb25zLycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXI6ICdpbWFnZXMvYXZhdGFycy8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gOiAnaW1hZ2VzL2F1ZGlvLycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBsaSA6ICdpbWFnZXMvYXBwbGkvJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgbXlhcGk6IHsgLy8gV2FybmluZyBwYXRocyBzaG91bGQgZW5kIHdpdGggL1xuICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICcvYXBpL215cGx1Z2luL3h4eHgnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiB7IC8vIFRob3NlIGRhdGEgYXJlIHVwZGF0ZWQgYnkgc2Vzc2lvbiBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSAgOiAnL2FwaS90b2tlbi9jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoIDogJy9hcGkvdG9rZW4vcmVmcmVzaCcsXG4gICAgICAgICAgICAgICAgICAgICAgIGNoZWNrICAgOiAnL2FwaS90b2tlbi9jaGVjaycsXG4gICAgICAgICAgICAgICAgICAgICAgIHJlc2V0ICAgOiAnL2FwaS90b2tlbi9yZXNldCcsXG4gICAgICAgICAgICAgICAgICAgICAgIHBpbmcgICAgOiAnL2FwaS90b2tlbi9jaGVjaycsXG4gICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgOiB1cmxxdWVyeS50b2tlbiB8fCAnMTIzNDU2Nzg5JywgIC8vIHR5cGljYWwgZGV2IGluaXRpYWwgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA6IDM2MDAsICAgICAgICAgLy8gdGltZW91dCBpcyB1cGRhdGVkIGNsaWVudCBzZXNzaW4gY29udGV4dCBjcmVhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICBwaW5ncmF0ZTogMTUsICAgICAgICAgICAvLyBQaW5nIHJhdGUgdG8gY2hlY2sgaWYgc2VydmVyIGlzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgICAgICAgICAgICAgIHV1aWQgICAgOiAnJywgICAgICAgICAgIC8vIHV1aWQgbWFwIHdpdGggY29va2llIG9yIGxvbmcgdGVybSBzZXNzaW9uIGFjY2VzcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gICA6ICcnICAgICAgICAgICAgLy8gd2lsbCBiZSByZXR1cm5lZCBmcm9tIGF1dGhlbnRpY2F0aW9uICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBteUNvbmZpZztcbiAgICAgICAgICAgIH1dKVxuXG4gICAgICAgICAgICAvLyBGYWN0b3J5IGlzIGEgc2luZ2xldG9uIGFuZCBzaGFyZSBpdHMgY29udGV4dCB3aXRoaW4gYWxsIGluc3RhbmNlcy5cbiAgICAgICAgICAgIC5mYWN0b3J5KCdBcHBDYWxsJywgW1wiJGh0dHBcIiwgXCJBcHBDb25maWdcIiwgZnVuY3Rpb24gKCRodHRwLCBBcHBDb25maWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXlDYWxscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0IDogZnVuY3Rpb24ocGx1Z2luLCBhY3Rpb24sIHF1ZXJ5LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkudG9rZW4gPSBBcHBDb25maWcuc2Vzc2lvbi50b2tlbjsgLy8gYWRkIHRva2VuIHRvIHByb3ZpZGVkIHF1ZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAkaHR0cC5nZXQoJy9hcGkvJyArIHBsdWdpbiArICcvJyArIGFjdGlvbiAsIHtwYXJhbXM6IHF1ZXJ5fSkudGhlbiAoY2FsbGJhY2ssIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXlDYWxscztcbiAgICAgICAgICAgIH1dKTtcbiAgICBcbiBcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgXG4gICAgZnVuY3Rpb24gIFBhcnNlUXVlcnlTdHJpbmcgKCkge1xuICAgICAgdmFyIHFkID0ge307XG4gICAgICBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICB2YXIgayA9IGl0ZW0uc3BsaXQoXCI9XCIpWzBdO1xuICAgICAgICAgIHZhciB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0uc3BsaXQoXCI9XCIpWzFdKTsgXG4gICAgICAgICAgaWYgKGsgaW4gcWQpIHFkW2tdLnB1c2godik7IGVsc2UgcWRba10gPSBbdl07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxZDtcbiAgICB9XG5cbiAgYW5ndWxhci5tb2R1bGUoJ0FGQmNsaWVudCcsIFsgLy8gV2FybmluZzogQXBwbmFtZSBzaG91bGQgZml0IHdpdGggZ3VscGZpbGUuanMgJiBpbmRleC5odG1sXG4gICAgJ3VpLnJvdXRlcicsXG4gICAgJ25nQW5pbWF0ZScsXG5cbiAgICAvL2ZvdW5kYXRpb25cbiAgICAnZm91bmRhdGlvbicsXG4gICAgJ2ZvdW5kYXRpb24uZHluYW1pY1JvdXRpbmcnLFxuICAgICdmb3VuZGF0aW9uLmR5bmFtaWNSb3V0aW5nLmFuaW1hdGlvbnMnLFxuICAgIFxuICAgIC8vIGV4dGVybmFsIGNvbXBvbmVudHNcbiAgICAndWktbm90aWZpY2F0aW9uJyxcbiAgICBcbiAgICAvLyBBcHBsaWNhdGlvbiBDb21wb25lbnRzXG4gICAgJ0FwcENvbmZpZycsXG4gICAgJ0pRdWVyeUVtdScsXG4gICAgJ0Rhc2hib2FyZE1vZHVsZScsXG4gICAgJ1VwbG9hZEZpbGVzJyxcbiAgICAnTGlua0J1dHRvbicsXG4gICAgJ1Rva2VuUmVmcmVzaCcsXG4gICAgJ1JhbmdlU2xpZGVyJyxcbiAgICAnTW9kYWxOb3RpZmljYXRpb24nXG4gIF0pXG4gICAgLnZhbHVlICgndXJscXVlcnknLCBQYXJzZVF1ZXJ5U3RyaW5nKCkpXG4gICAgLmNvbmZpZyhjb25maWcpXG4gICAgLnJ1bihydW4pXG4gIDtcblxuICBjb25maWcuJGluamVjdCA9IFsnJHVybFJvdXRlclByb3ZpZGVyJywgJyRsb2NhdGlvblByb3ZpZGVyJ107XG4gIFxuICBmdW5jdGlvbiBjb25maWcoJHVybFByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlciwgQXBwQ29uZmlnKSB7XG4gICAgJHVybFByb3ZpZGVyLm90aGVyd2lzZSgnL2Rhc2hib2FyZCcpO1xuXG4gICAgLy8gaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvZXJyb3IvJGxvY2F0aW9uL25vYmFzZVxuICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKS5oYXNoUHJlZml4KCchJyk7XG4gICAgXG4gIH1cblxuICBmdW5jdGlvbiBydW4oKSB7XG4gICAgRmFzdENsaWNrLmF0dGFjaChkb2N1bWVudC5ib2R5KTtcbiAgfVxuICBcbi8vIEZvbmRhdGlvbi1hcHAudGVtcGxhdGUgaXMgbm90IGluY2x1ZGVkIGNvcnJlY3RseSBieSBndWxwIFxuLy8gSW5jbHVkZSBoZXJlIG1pc3NpbmcgdGVtcGxhdGVzIGZyb20gZm91bmRhdGlvbi1hcHBzL2Rpc3QvanMvZm91bmRhdGlvbi1hcHBzLXRlbXBsYXRlcy5qc1xuYW5ndWxhci5tb2R1bGUoJ2ZvdW5kYXRpb24nKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7XG4gICR0ZW1wbGF0ZUNhY2hlLnB1dCgnY29tcG9uZW50cy9tb2RhbC9tb2RhbC5odG1sJyxcbiAgICAnPGRpdlxcbicgK1xuICAgICcgIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXFxuJyArXG4gICAgJyAgbmctY2xpY2s9XCJoaWRlT3ZlcmxheSgpXCI+XFxuJyArXG4gICAgJyAgPGFzaWRlXFxuJyArXG4gICAgJyAgICBjbGFzcz1cIm1vZGFsXCJcXG4nICtcbiAgICAnICAgIG5nLWNsaWNrPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiXFxuJyArXG4gICAgJyAgICBuZy10cmFuc2NsdWRlPlxcbicgK1xuICAgICcgIDwvYXNpZGU+XFxuJyArXG4gICAgJzwvZGl2PlxcbicgK1xuICAgICcnKTtcbn1dKTtcblxuY29uc29sZS5sb2cgKFwib3BhPUFGQmNsaWVudCBMb2FkZWRcIik7XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge2FuZ3VsYXIubW9kdWxlKCdBRkJjbGllbnQnKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7JHRlbXBsYXRlQ2FjaGUucHV0KCdwYWdlcy9EYXNoYm9hcmQvRGFzaGJvYXJkLmh0bWwnLFxuICAgICc8aDM+PGltZyBjbGFzcz1cImxvZ29cIiBzcmM9XCJpbWFnZXMvbG9nby90cmlza2VsX2lvdF9iemh4MjUwLnBuZ1wiIGFsdD1cIklvVC5iemggTG9nb1wiIHN0eWxlPVwiaGVpZ2h0OjE1MHB4XCI+IEFwcGxpY2F0aW9uIEZyYW1ld29yayBNYW5hZ2VyIFNpbXBsZSBDbGllbnQ8L2gzPjxkaXYgY2xhc3M9XCJidXR0b24tYm94IGJveC1jb250ZW50XCI+PGFwcGxpLWJ1dHRvbiBuZy1yZXBlYXQ9XCJhcHBsaUlEIGluIGN0cmwuYXBwbGlJRHNcIiBzdG9yZT1cImN0cmwuYXBwbGlTdG9yZVwiIGhhbmRsZT1cInt7YXBwbGlJRH19XCIgY2FsbGJhY2s9XCJjdHJsLkFwcGxpQ0JcIj48L2FwcGxpLWJ1dHRvbj48dXBsb2FkLWFwcGxpIGNsYXNzPVwiaWJ6LXJpZ2h0XCIgbGFiZWw9XCJVcGxvYWRcIiBpY29uPVwiZmktdXBsb2FkXCIgcG9zdHVybD1cIi9hcGkvYWZtLW1haW4vaW5zdGFsbFwiIGNhbGxiYWNrPVwiY3RybC5GaWxlVXBsb2FkZWRcIiB0aXRsZT1cIlVwbG9hZCBBR0wgQXBwXCI+PC91cGxvYWQtYXBwbGk+PC9kaXY+PGRpdiBjbGFzcz1cIm1lc3NhZ2UtYm94IGJveC1jb250ZW50IHZlcnRpY2FsIGdyaWQtZnJhbWVcIj48ZGl2IGNsYXNzPVwicmVzcG9uc2VcIj48c3BhbiBjbGFzcz1cImdyaWQtY29udGVudCBub3Njcm9sbCByZXEge3tjdHJsLnN0YXR1c319XCI+cmVxPSB7e2N0cmwucmVxdWVzdH19PC9zcGFuPiA8c3BhbiBjbGFzcz1cImdyaWQtY29udGVudCBub3Njcm9sbCByZXMge3tjdHJsLnN0YXR1c319XCI+cmVzPSB7e2N0cmwucmVzcG9uc2V9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJncmlkLWNvbnRlbnQgbm9zY3JvbGwgc3RhdHVzIHt7Y3RybC5zdGF0dXN9fVwiPnN0YXR1cz0ge3tjdHJsLmVycmNvZGV9fTwvc3Bhbj48L2Rpdj48L2Rpdj48dG9rZW4tcmVmcmVzaCBhdXRvbG9nPVwidHJ1ZVwiIGNhbGxiYWNrPVwiY3RybC5BdXRvU3RhcnRcIj48L3Rva2VuLXJlZnJlc2g+Jyk7fV0pO1xufSkoKTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==