summaryrefslogtreecommitdiffstats
path: root/afm-client/dist.prod/opa/AFBclient.min.js
blob: 06359607f8cf276326fb1a6d72435652adc1ccb3 (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",["$log","$window","$timeout","$location","Notification","AppConfig","AppCall",function(t,a,n,i,s,l,o){function r(e,r,u){e.logged=void 0,a.onbeforeunload=function(){o.get("token","reset",{},function(){t.log("OPA exit")})},e.online=function(){r.addClass("online"),r.removeClass("offline"),e.logged=!0},e.offline=function(){r.addClass("offline"),r.removeClass("online"),e.logged=!1},e.onerror=function(){e.logged!==!1&&(s.warning({message:"AppFramework Binder Lost",delay:5e3}),e.offline()),e.status=0},e.onsuccess=function(t){t.request.token&&(l.session.token=t.request.token),t.request.uuid&&(l.session.uuid=t.request.uuid),t.request.timeout&&(l.session.timeout=t.request.timeout),e.logged!==!0&&(s.success({message:"AppFramework Binder Back to Live",delay:3e3}),e.online(),e.callback&&e.callback(t)),e.status=1},e.getping=function(){o.get("token","ping",{},function(t){200===t.status?e.onsuccess(t.data):e.onerror(),n(e.getping,1e3*l.session.pingrate)})},e.refresh=function(){o.get("token","refresh",{},function(t){200===t.status?e.onsuccess(t.data):e.onerror(),n(e.refresh,250*l.session.timeout)})},e.tkcreate=function(){o.get("token","create",{token:l.session.initial},function(t){200===t.status?e.onsuccess(t.data):e.onerror()})},e.icon=u.icon||"fi-lightbulb",e.hostname=i.host(),e.httpdport=i.port(),e.autolog=JSON.parse(u.autolog||!1),e.autolog&&e.tkcreate(),n(e.getping,1e3*l.session.pingrate),n(e.refresh,250*l.session.timeout)}return{template:e,scope:{callback:"="},restrict:"E",link:r}}])}(),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 appli-menu-start"><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 appli-menu-info"><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","urlquery",function(n,i,s,l,o,r,u,c){function d(e,d,p){e.runstatus="stop",e.runmode=c.runmode||"auto",e.clicked=function(){var n=function(t,a){l.error({message:"Fail /api/afm-main"+t+"="+e.label+" RunID="+e.appID,delay:5e3}),d.addClass("fail"),d.removeClass("success"),e.callback(e.appID,t,a)},c=function(t,a){d.removeClass("fail"),e.runID=a.data.response.runid,e.callback(e.appID,t,a)},p=function(){e.modApp.deactivate(),o(function(){e.modApp.destroy()},1e3)},f=function(){e.modInfo.deactivate(),o(function(){e.modInfo.destroy()},1e3)},g=function(t){switch(t){case"start":if("stop"!==e.runstatus)return;i.get("afm-main","start",{id:e.appID,mode:e.runmode},function(a){return 200!==a.status||"AJB_reply"!==a.data.jtype?void n("start",a):(e.runstatus="start",c(t,a),void(a.data.response.uri&&(e.winapp=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",e.winapp&&(e.winapp.close(),e.winapp=!1),void c(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={animationIn:"slideInFromTop",contentScope:{close:f,icon:e.icon,label:e.appID,detail:t.data.response},template:a};e.modInfo=new s(i),e.modInfo.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 c(t,e)})}p()},m={animationIn:"slideInFromTop",contentScope:{action:g,runstatus:e.runstatus,close:p,icon:e.icon,label:e.label},template:t};e.modApp=new s(m),e.modApp.activate()},p.handle&&e.store[p.handle].name?(e.icon=n.paths.icons+p.handle,e.label=e.store[p.handle].name,e.appID=p.handle):(e.icon=n.paths.icons+"w3c-ico.png",e.label=p.handle),d.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:d,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/"},session:{initial:e.token||"123456789",timeout:3600,pingrate:15,uuid:"",token:""}};return t}]).factory("AppCall",["$http","AppConfig","$log",function(e,t,a){var n={get:function(a,n,i,s){i.token||(i.token=t.session.token),e.get("/api/"+a+"/"+n,{params:i}).then(s,s)}};return n}])}(),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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpZGdldHMvUmFuZ2VTbGlkZXJzL1JhbmdlU2xpZGVyTW9kLmpzIiwid2lkZ2V0cy9Ob3RpZmljYXRpb25zL1Rva2VuUmVmcmVzaFN2Yy5qcyIsIndpZGdldHMvTm90aWZpY2F0aW9ucy9Nb2RhbE5vdGlmaWNhdGlvbi5qcyIsIndpZGdldHMvTmF2aWdhdGlvbi9MaW5rQnV0dG9uLmpzIiwid2lkZ2V0cy9Gb3JtSW5wdXQvVXBsb2FkQXBwbGkuanMiLCJ3aWRnZXRzL0Zvcm1JbnB1dC9JbnB1dFRleHQuanMiLCJ3aWRnZXRzL0Zvcm1JbnB1dC9JbnB1dFBhc3N3b3JkLmpzIiwid2lkZ2V0cy9BY3Rpb25CdXR0b25zL1N1Ym1pdEJ1dHRvbi5qcyIsIndpZGdldHMvQWN0aW9uQnV0dG9ucy9BcHBsaUJ1dHRvbi5qcyIsInBhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmRNb2R1bGUuanMiLCJzZXJ2aWNlcy9KUXVlcnlFbXUuanMiLCJldGMvcm91dGVzLmpzIiwiZXRjL0FwcENvbmZpZy5qcyIsImFwcC5qcyIsInBhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmQuanMiXSwibmFtZXMiOlsiUmFuZ2VTbGlkZXJIYW5kbGUiLCJzY29wZSIsImludGVybmFscyIsImV4dGVybmFscyIsInRoaXMiLCJnZXRJZCIsInNsaWRlcmlkIiwiZ2V0Q2JIYW5kbGUiLCJjYmhhbmRsZSIsImdldFZpZXciLCJoYW5kbGUiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImN0cmxoYW5kbGUiLCJ1cGRhdGVDbGFzcyIsImNsYXNzZSIsInN0YXR1cyIsImZvcmNlUmVmcmVzaCIsInRpbWVyIiwiZ2V0VmFsdWUiLCJnZXRSZWxhdGl2ZSIsInJlbGF0aXZlIiwic2V0VmFsdWUiLCJzZXREaXNhYmxlIiwiZmxhZyIsIlJhbmdlU2xpZGVyIiwiYW5ndWxhciIsIm1vZHVsZSIsImRpcmVjdGl2ZSIsIiRsb2ciLCIkZG9jdW1lbnQiLCIkdGltZW91dCIsImxpbmsiLCJlbGVtZW50IiwiYXR0cnMiLCJtb2RlbCIsImluaXRXaWRnZXQiLCJpbml0dmFsdWVzIiwiYnlTdGVwIiwicGFyc2VJbnQiLCJub3RNb3JlIiwibm90TGVzcyIsImlkIiwidW5kZWZpbmVkIiwiZHVhbCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJkaXNhYmxlZCIsImhhbmRsZXMiLCJjc3MiLCJub3JtYWxpemUiLCJyZXN1bHQiLCJyYW5nZSIsInBvaW50IiwibW9kIiwicmVtIiwicm91bmQiLCJwb3dlciIsIk1hdGgiLCJwb3ciLCJvZmZzZXQiLCJ2ZXJ0aWNhbCIsImJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImJhciIsIndpZHRoIiwibmV3dmFsdWUiLCJzdGFydFZhbHVlIiwic3RvcFZhbHVlIiwidmlld1ZhbHVlIiwiZGlzcGxheXMiLCJodG1sIiwiJHNldFZpZXdWYWx1ZSIsIiRhcHBseSIsInRyYW5zbGF0ZSIsInNldFN0YXJ0Iiwic3RhcnQiLCJzZXRTdG9wIiwic3RvcCIsInJpZ2h0Iiwidm9mZnNldCIsIi13ZWJraXQtdHJhbnNmb3JtIiwiLW1vei10cmFuc2Zvcm0iLCItbXMtdHJhbnNmb3JtIiwiLW8tdHJhbnNmb3JtIiwidHJhbnNmb3JtIiwic2xpZGVyIiwiYm90dG9tIiwibGVmdCIsImtleWRvd24iLCJlIiwia2V5Q29kZSIsImFjdGlmIiwiY2FsbGJhY2siLCJibHVyIiwibW92ZUhhbmRsZSIsImNsaWVudFgiLCJjbGllbnRZIiwiZm9jdXNDQiIsImluc2lkZSIsIm9uIiwidW5iaW5kIiwidG91Y2hCYXJDQiIsImV2ZW50IiwidG91Y2hlcyIsImNoYW5nZWRUb3VjaGVzIiwib2xkdmFsdWUiLCJwcmV2ZW50RGVmYXVsdCIsInBhZ2VZIiwicGFnZVgiLCJkaXN0YW5jZTAiLCJhYnMiLCJkaXN0YW5jZTEiLCJ0b3VjaEhhbmRsZUNCIiwidG91Y2hldnQiLCJ0b3VjaG1vdmUiLCJpZHgiLCJsZW5ndGgiLCJ0b3VjaGVuZCIsImhhbmRsZUNCIiwiY2xpY2tldmVudCIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJhdXRvbWF0aWMiLCJmb2N1cyIsImZpbmQiLCJzZWxlY3QiLCJlbGVtIiwiZG9tZWxlbSIsInF1ZXJ5U2VsZWN0b3IiLCJhbmdlbGVtIiwiaW5pdGlhbFNldHRpbmdzIiwiaW5pdGlhbCIsImRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdCIsInByZWNpc2lvbiIsIm1hdGNoIiwiZXZ0IiwiaW5pdCIsInJhbmRvbSIsIkluZmluaXR5IiwiZHVhbEhhbmRsZXMiLCJ0cmlnZ2VyX2lucHV0X2NoYW5nZSIsImRpc2FibGUiLCJkaXNwbGF5VGFyZ2V0IiwiZ2V0RWxlbWVudEJ5SWQiLCJzcGxpdCIsIm5nTW9kZWwiLCIkd2F0Y2giLCJzdGFydEF0Iiwic3RvcEF0IiwiaW5pdGhvb2siLCJuZXdWYWx1ZSIsInRlbXBsYXRlIiwicmVzdHJpY3QiLCJyZXF1aXJlIiwicmVwbGFjZSIsIiR3aW5kb3ciLCIkbG9jYXRpb24iLCJOb3RpZmljYXRpb24iLCJBcHBDb25maWciLCJBcHBDYWxsIiwibXltZXRob2RzIiwibG9nZ2VkIiwib25iZWZvcmV1bmxvYWQiLCJnZXQiLCJsb2ciLCJvbmxpbmUiLCJvZmZsaW5lIiwib25lcnJvciIsIndhcm5pbmciLCJtZXNzYWdlIiwiZGVsYXkiLCJvbnN1Y2Nlc3MiLCJqcmVzcCIsInJlcXVlc3QiLCJ0b2tlbiIsInNlc3Npb24iLCJ1dWlkIiwidGltZW91dCIsInN1Y2Nlc3MiLCJnZXRwaW5nIiwiZGF0YSIsInBpbmdyYXRlIiwicmVmcmVzaCIsInRrY3JlYXRlIiwiaWNvbiIsImhvc3RuYW1lIiwiaG9zdCIsImh0dHBkcG9ydCIsInBvcnQiLCJhdXRvbG9nIiwiSlNPTiIsInBhcnNlIiwidG1wbCIsImRpc3BsYXkiLCJhY3Rpb24iLCJzaG93IiwibW9kYWwiLCJvcGFjaXR5IiwidmlzaWJpbGl0eSIsImNsb3NlIiwicGFyZW50IiwiYmluZCIsInRpcCIsImNsaWNrZWQiLCJxdWVyeSIsInBhdGgiLCJocmVmIiwic2VhcmNoIiwibGFiZWwiLCJ0b0xvd2VyQ2FzZSIsIkxvYWRGaWxlU3ZjIiwiZmlsZXMiLCJmaWxlQ0IiLCJ4bWxSZXEiLCJYTUxIdHRwUmVxdWVzdCIsInhmb3JtIiwiRm9ybURhdGEiLCJ1cGxvYWQiLCJvbnByb2dyZXNzIiwicHJvZ3Jlc3MiLCJsZW5ndGhDb21wdXRhYmxlIiwibG9hZGVkIiwidG90YWwiLCJvbmxvYWQiLCJkaXZFbGVtIiwicmVzcG9uc2UiLCJoZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwib25hYm9ydCIsInBvc3RmaWxlIiwicG9zdHVybCIsIm9wZW4iLCJzZW5kIiwiaSIsImZpbGUiLCJiYXNlbmFtZSIsIm5hbWUiLCJyZXZlcnNlIiwiaXNOYU4iLCJzaXplIiwibWF4c2l6ZSIsInNldFRpbWVvdXQiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJhcHBlbmQiLCJ0bXBsQXBwbGkiLCJ0bXBsTW9kYWwiLCJ0bXBsRXJyb3IiLCJKUWVtdSIsIk1vZGFsRmFjdG9yeSIsImlucHV0RWxlbSIsImltZ0NsaWNrZWQiLCJjbGljayIsIlNsaWRlckluaXRDQiIsIlVwTG9hZEZpbGUiLCJhcHBpY29uIiwiZGVhY3RpdmF0ZSIsImRlc3Ryb3kiLCJhYmFuZG9uIiwicmVhZGVyQ0IiLCJ6aXBhcHAiLCJKU1ppcCIsInRhcmdldCIsInRodW1ibmFpbCIsIndpbmRvdyIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJhc0FycmF5QnVmZmVyIiwidHlwZSIsImlzbm90dmFsaWQiLCJpc3Rvb2JpZyIsImNvbmZpZyIsImFuaW1hdGlvbkluIiwiY29udGVudFNjb3BlIiwiYXBwbmFtZSIsImFjdGl2YXRlIiwiY2F0ZWdvcnkiLCJtaW1ldHlwZSIsImFjY2VwdCIsInJlZ2V4cCIsIlJlZ0V4cCIsInBhdGhzIiwibm9zbGlkZXIiLCJUeXBlRXJyb3IiLCJlbWFpbHBhdGVybiIsImVycm9yIiwidmFsaWQiLCJpbnB1dCIsInJlcXVpcmVkIiwic2VsZWN0ZWQiLCJlcnJtc2ciLCJ2YWxpZGF0ZSIsInRyaW0iLCJtaW5sZW4iLCJ0ZXN0IiwibDRhY291bnRlciIsInZhbGlkYXRlZCIsImRvbmUiLCJwbGFjZWhvbGRlciIsImxvd2VyY2FzZSIsIm5vc3BhY2UiLCJ2YWxpZDEiLCJmaXJzdHB3ZCIsInZhbGlkMiIsImxhYmVsMSIsImxhYmVsMiIsInBsYWNlMSIsInBsYWNlaG9sZGVyMSIsInRpcDEiLCJwbGFjZTIiLCJ0aXAyIiwidG1wbERldGFpbCIsInVybHF1ZXJ5IiwicnVuc3RhdHVzIiwicnVubW9kZSIsIm5vdGlmeUVycm9yIiwiYXBwSUQiLCJub3RpZnlTdWNjZXNzIiwicnVuSUQiLCJydW5pZCIsImNsb3NlTW9kQXBwIiwibW9kQXBwIiwiY2xvc2VNb2RJbmZvIiwibW9kSW5mbyIsImFjdGlvbk1vZGFsIiwibW9kZSIsImp0eXBlIiwidXJpIiwid2luYXBwIiwiZGV0YWlsIiwic3RvcmUiLCJpY29ucyIsImNvbnRyb2xsZXIiLCJhcHBsaUlEcyIsImFwcGxpU3RvcmUiLCJBcHBsaUNCIiwiYXBwbGlJRCIsImVycmNvZGUiLCJHZXRSdW5uYWJsZXMiLCJhcGkiLCJydW5uYWJsZXMiLCJGaWxlVXBsb2FkZWQiLCJBdXRvU3RhcnQiLCJmYWN0b3J5IiwiRmluZEluUGFyZW50Iiwic2VsZWN0b3IiLCJ0b1VwcGVyQ2FzZSIsInRhZ05hbWUiLCJGaW5kQnlUYWciLCJ0YWciLCJjaGlsZHJlbiIsIm5leHQiLCJGaW5kQnlDbGFzcyIsImhhc0NsYXNzIiwibXlNZXRob2RzIiwiZm91bmRhdGlvblJvdXRlcyIsInVybCIsIm15Q29uZmlnIiwiaW1hZ2UiLCJhdmF0YXIiLCJhdWRpbyIsImFwcGxpIiwiJGh0dHAiLCJteUNhbGxzIiwicGx1Z2luIiwicGFyYW1zIiwidGhlbiIsIlBhcnNlUXVlcnlTdHJpbmciLCJxZCIsImxvY2F0aW9uIiwic3Vic3RyIiwiZm9yRWFjaCIsIml0ZW0iLCJrIiwidiIsImRlY29kZVVSSUNvbXBvbmVudCIsInB1c2giLCIkdXJsUHJvdmlkZXIiLCIkbG9jYXRpb25Qcm92aWRlciIsIm90aGVyd2lzZSIsImh0bWw1TW9kZSIsImhhc2hQcmVmaXgiLCJydW4iLCJGYXN0Q2xpY2siLCJhdHRhY2giLCJkb2N1bWVudCIsImJvZHkiLCIkaW5qZWN0IiwiJHRlbXBsYXRlQ2FjaGUiLCJwdXQiXSwibWFwcGluZ3MiOiJDQWtEQSxXQUNBLFlBSUEsU0FBQUEsR0FBQUMsR0FDQSxHQUFBQyxNQUNBQyxJQUVBQyxNQUFBQyxNQUFBLFdBQ0EsTUFBQUosR0FBQUssVUFHQUYsS0FBQUcsWUFBQSxXQUNBLE1BQUFOLEdBQUFPLFVBR0FKLEtBQUFLLFFBQUEsU0FBQUMsR0FJQSxNQUhBQSxLQUFBQSxFQUFBLEdBR0FULEVBQUFVLE1BQUFELEtBQUFSLEVBQUFRLEdBQUFQLEVBQUFPLElBR0FSLEVBQUFRLEdBQUFULEVBQUFVLE1BQUFELEdBQ0FULEVBQUFXLFVBQUFULEVBQUFPLEdBQUFULEVBQUFXLFVBQUFYLEVBQUFVLE1BQUFELEdBQUFULEVBQUFZLFlBQ0FWLEVBQUFPLEdBQUFULEVBQUFVLE1BQUFELEdBRUFQLEVBQUFPLEtBR0FOLEtBQUFVLFlBQUEsU0FBQUMsRUFBQUMsR0FDQWYsRUFBQWEsWUFBQUMsRUFBQUMsSUFHQVosS0FBQWEsYUFBQSxTQUFBQyxHQUNBakIsRUFBQWdCLGFBQUFDLElBR0FkLEtBQUFlLFNBQUEsU0FBQVQsR0FFQSxNQURBQSxLQUFBQSxFQUFBLEdBQ0FULEVBQUFVLE1BQUFELElBR0FOLEtBQUFnQixZQUFBLFNBQUFWLEdBRUEsTUFEQUEsS0FBQUEsRUFBQSxHQUNBVCxFQUFBb0IsU0FBQVgsSUFHQU4sS0FBQWtCLFNBQUEsU0FBQVgsRUFBQUQsR0FDQUEsSUFBQUEsRUFBQSxHQUNBVCxFQUFBcUIsU0FBQVgsRUFBQUQsSUFHQU4sS0FBQW1CLFdBQUEsU0FBQUMsR0FDQXZCLEVBQUFzQixXQUFBQyxJQXBEQSxHQUFBQyxHQUFBQyxRQUFBQyxPQUFBLGlCQXdEQUYsR0FBQUcsVUFBQSxlQUFBLE9BQUEsWUFBQSxXQUFBLFNBQUFDLEVBQUFDLEVB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QSxpQkFBQSxTQUFBTSxHQUNBQSxFQUFBQyxJQUFBLDhCQUNBLHFMQzFEQSxXQUFBL1csUUFBQUMsT0FBQSxhQUFBdVcsS0FBQSxpQkFBQSxTQUFBTSxHQUFBQSxFQUFBQyxJQUFBLGlDQUNBIiwiZmlsZSI6IkFGQmNsaWVudC5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiAqIFxuICogQnVnczogSW5wdXQgd2l0aCBDYWxsYmFjayBTSE9VTEQgQkUgZ2V0ICdyZXF1aXJlZCcgY2xhc3NcbiAqIFxuICogcmVmOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvbW91c2VvdmVyXG4gKiBcbiAqIHVzYWdlOiBcblVzYWdlICA8cmFuZ2Utc2xpZGVyPlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICA8cmFuZ2Utc2xpZGVyXG4gICAgICBpZD1cIm15LXNsaWRlci1uYW1lXCIgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVzZSBhcyBhbiBhcmd1bWVudCB0byBjYWxsYmFja1xuICAgICAgY2xhc3M9XCJteS1jdXN0b20tY2xhc3NcIiAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBjbGFzcyBpcyBpYnotcmFuZ2Utc2xpZGVyXG4gICAgICBwbGFjZWhvbGRlcj1cIlRyYWNrIERhdGUgU2VsZWN0aW9uXCIgICAgICAvLyBwbGFjZSBob2xkZXIgZm9yIGRhdGUgcmVhZG9ubHkgaW5wdXQgem9uZVxuXG4gICAgICA8IS0tIEZvdW5kYXRpb24gY2xhc3NlcyAtLT5cbiAgICAgIGNsYXNzPVwicmFkaXVzXCIgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIFp1cmIgZm91bmRhdGlvbiBkb2MgZm9yIGZ1cnRoZXIgaW5mby5cbiAgICAgIGNsYXNzPVwiaWJ6LWhhbmRsZS1kaXNwbGF5XCIgICAgICAgICAgICAgIC8vIGluY3JlYXNlIGhhbmRsZSB3aWR0aCB0byBob2xkIHNsaWRlciBjdXJyZW50IHZhbHVlXG5cbiAgICAgIDwhLS0gQW5ndWxhciBTY29wZSBWYXJpYWJsZXMgLS0+XG4gICAgICBjYWxsYmFjaz1cIm15Q2FsbEJhY2tcIiAgICAgICAgICAgICAgICAgICAgLy8gJHNjb3BlLm15Q2FsbEJhY2soc2xpZGVyaGFuZGxlKSBpcyBjYWxsZWQgd2hlbiBldmVyIHNsaWRlciBoYW5kbGUgYmx1clxuICAgICAgZm9ybWF0dGVyPVwiU2xpZGVyRm9ybWF0Q0JcIiAgICAgICAgICAgICAgIC8vICRzY29wZS5teUZvcm1hdHRlcih2YWx1ZSwgc2xpZGVyaWQpIHdoZW4gZXhpc3QgaXMgY2FsbCB3aGVuIGV2ZXIgc2xpZGVyIGhhbmRsZSBtb3Zlcy4gU2hvdWxkIHJldHVybiBleHRlcm5hbCBmb3JtIG9mIHNsaWRlciB2YWx1ZS5cbiAgICAgIG5nLW1vZGVsPVwieHh4eHh4XCIgICAgICAgICAgICAgICAgICAgICAgICAvLyB4eHggTXVzdCBiZSBkZWZpbmVkLCBzY3JpcHQgd2lsbCBzdG9yZSBhIG5ldyBSYW5nZXJPYmplY3Qgd2l0aGluIHByb3ZpZGVkIG5nLW1vZGVsIHZhcmlhYmxlLlxuICAgICAgc3RhcnQtYXQ9XCJTY29wZVZhclwiICAgICAgICAgICAgICAgICAgICAgIC8vIER5bmFtaWMgbGltaXRhdGlvbiB3aGVuIHNsaWRlciBpcyBjb25zdHJhaW5zIGJ5IGFuIGV4dGVybmFsIGNvbXBvbmFudCBbZXg6IGNoZWNrIGluL291dF1cbiAgICAgIHN0b3AtYXQ9XCJTY29wZVZhclwiICAgICAgICAgICAgICAgICAgICAgICAvLyBJZGVtIGJ1dCBmb3IgZW5kLlxuXG4gICAgICA8IS0tIEFuZ3VsYXIgRGlyZWN0aXZlIEF0dHJpYnV0ZXMgLS0+XG4gICAgICBub3QtbGVzcz1cImludGVnZXJcIiAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZWQgc3RhcnRpbmcgdmFsdWUgZm9yIHNsaWRlciBbZGVmYXVsdCAwXVxuICAgICAgbm90LW1vcmU9XCJpbnRlZ2VyXCIgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeGVkIGVuZCB2YWx1ZSBmb3Igc2xpZGVycyBbZGVmYXVsdCAxMDBdXG4gICAgICBieS1zdGVwPVwiKy1pbnRlZ2VyXCIgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYnktc3RlcCBpcyA+MCB0aGVuIHNsaWRlciB1c2UgaXQgYXMgc3RlcC12YWx1ZSwgd2hlbiBuZWdhdGl2ZSB1c2UgaXQgZm9yIGRlY2ltYWwgcHJlY2lzaW9uXG4gICAgICBkaXNwbGF5LXRhcmdldD1cImhhbmRsZVwiICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSBzbGlkZXIgZXh0ZXJuYWwgZm9ybWF0ZWQgdmFsdWUgaW4gdGhlIGhhbmRsZSBbcmVxdWlyZXIgY2Fsc3M9XCJpYnotaGFuZGxlLWRpc3BsYXlcIl1cbiAgICAgIGR1YWwtaGFuZGxlcz0ndHJ1ZScgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGEgc2Vjb25kIGhhbmRsZSB0byBzbGlkZXIgZm9yIG1pbi9tYXggcmFuZ2VcbiAgICAgIGluaXRpYWw9J3ZhbHVlfFtzdGFydC9zdG9wXScgICAgICAgICAgICAgLy8gc2xpZGVyIGluaXRpYWwgdmFsdWUgW2R1YWwtaGFuZGxlc10gbWF5IGhhdmUgaW5pdGlhbCB2YWx1ZXNcbiAgIC8+PC9yYW5nZS1zbGlkZXI+XG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbnZhciBSYW5nZVNsaWRlciA9IGFuZ3VsYXIubW9kdWxlKCdSYW5nZVNsaWRlcicsW10pO1xuXG5mdW5jdGlvbiBSYW5nZVNsaWRlckhhbmRsZSAoc2NvcGUpIHtcbiAgICB2YXIgaW50ZXJuYWxzID0gW107XG4gICAgdmFyIGV4dGVybmFscyA9IFtdO1xuXG4gICAgdGhpcy5nZXRJZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2NvcGUuc2xpZGVyaWQ7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0Q2JIYW5kbGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNjb3BlLmNiaGFuZGxlO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFZpZXc9IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgaWYgKCFoYW5kbGUpIGhhbmRsZSA9IDA7XG5cbiAgICAgICAgLy8gaWYgdmFsdWUgZGlkIG5vdCBjaGFuZ2UgcmV0dXJuIGN1cnJlbnQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25cbiAgICAgICAgaWYgKHNjb3BlLnZhbHVlW2hhbmRsZV0gPT09IGludGVybmFsc1toYW5kbGVdKSByZXR1cm4gZXh0ZXJuYWxzW2hhbmRsZV07XG5cbiAgICAgICAgLy8gYnVpbGQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gYW5kIHNhdmUgaXQgZm9yIGZ1cnRoZXIgcmVxdWVzdHNcbiAgICAgICAgaW50ZXJuYWxzW2hhbmRsZV0gPSBzY29wZS52YWx1ZVtoYW5kbGVdO1xuICAgICAgICBpZiAoc2NvcGUuZm9ybWF0dGVyKSBleHRlcm5hbHNbaGFuZGxlXSA9IHNjb3BlLmZvcm1hdHRlcihzY29wZS52YWx1ZVtoYW5kbGVdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgZWxzZSAgZXh0ZXJuYWxzW2hhbmRsZV0gPSBzY29wZS52YWx1ZVtoYW5kbGVdO1xuXG4gICAgICAgIHJldHVybiBleHRlcm5hbHNbaGFuZGxlXTtcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVDbGFzcyA9IGZ1bmN0aW9uIChjbGFzc2UsIHN0YXR1cykge1xuICAgICAgIHNjb3BlLnVwZGF0ZUNsYXNzIChjbGFzc2UsIHN0YXR1cyk7XG4gICAgfTtcblxuICAgIHRoaXMuZm9yY2VSZWZyZXNoID0gZnVuY3Rpb24gKHRpbWVyKSB7XG4gICAgICAgc2NvcGUuZm9yY2VSZWZyZXNoKHRpbWVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRWYWx1ZT0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAoIWhhbmRsZSkgaGFuZGxlID0gMDtcbiAgICAgICAgcmV0dXJuIHNjb3BlLnZhbHVlW2hhbmRsZV07XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0UmVsYXRpdmU9IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgaWYgKCFoYW5kbGUpIGhhbmRsZSA9IDA7XG4gICAgICAgIHJldHVybiBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFZhbHVlPSBmdW5jdGlvbiAodmFsdWUsIGhhbmRsZSkge1xuICAgICAgICBpZiAoIWhhbmRsZSkgaGFuZGxlID0gMDtcbiAgICAgICAgc2NvcGUuc2V0VmFsdWUgKHZhbHVlLCBoYW5kbGUpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldERpc2FibGU9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHNjb3BlLnNldERpc2FibGUoZmxhZyk7XG4gICAgfTtcbn1cblxuUmFuZ2VTbGlkZXIuZGlyZWN0aXZlKCdyYW5nZVNsaWRlcicsIFtcIiRsb2dcIiwgXCIkZG9jdW1lbnRcIiwgXCIkdGltZW91dFwiLCBmdW5jdGlvbiAoJGxvZywgJGRvY3VtZW50LCAkdGltZW91dCkge1xuXG4gICAgdmFyIHRlbXBsYXRlPSAnPGRpdiBjbGFzcz1cImliei1yYW5nZS1zbGlkZXIgcmFuZ2Utc2xpZGVyXCIgdGl0bGU9XCJ7e3RpdGxlfX1cImRhdGEtc2xpZGVyPicrXG4gICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJyYW5nZS1zbGlkZXItaGFuZGxlIGhhbmRsZS1taW5cIiBuZy1tb3VzZWRvd249XCJoYW5kbGVDQigkZXZlbnQsMClcIiBuZy1mb2N1cz1cImZvY3VzQ0IodHJ1ZSlcIiBuZy1ibHVyPVwiZm9jdXNDQihmYWxzZSlcIiByb2xlPVwic2xpZGVyXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPicrXG4gICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJoYW5kbGUtbWF4XCIgbmctbW91c2Vkb3duPVwiaGFuZGxlQ0IoJGV2ZW50LDEpXCIgbmctZm9jdXM9XCJmb2N1c0NCKHRydWUpXCIgbmctYmx1cj1cImZvY3VzQ0IoZmFsc2UpXCIgcm9sZT1cInNsaWRlclwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj4nK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwicmFuZ2Utc2xpZGVyLWFjdGl2ZS1zZWdtZW50XCI+PC9zcGFuPicrXG4gICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJpYnotcmFuZ2Utc2xpZGVyLXN0YXJ0XCIgPjwvc3Bhbj4gJytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImliei1yYW5nZS1zbGlkZXItc3RvcFwiPjwvc3Bhbj4gJytcbiAgICAgICAgICAgICAgICAgICc8aW5wdXQgaWQ9e3tzbGlkZXJpZH19IHR5cGU9XCJoaWRkZW5cIj4nK1xuICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XG5cblxuICAgIGZ1bmN0aW9uIGxpbmsgKHNjb3BlLCBlbGVtZW50LCBhdHRycywgbW9kZWwpIHtcbiAgICAgICAgLy8gZnVsbCBpbml0aWFsaXNhdGlvbiBvZiBzbGlkZXIgZnJvbSBhIHNpbmdsZSBvYmplY3RcbiAgICAgICAgc2NvcGUuaW5pdFdpZGdldCA9IGZ1bmN0aW9uIChpbml0dmFsdWVzKSB7XG5cbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLmJ5U3RlcCkgIHNjb3BlLmJ5U3RlcCAgPSBwYXJzZUludChpbml0dmFsdWVzLmJ5U3RlcCk7XG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy5ub3RNb3JlKSBzY29wZS5ub3RNb3JlID0gcGFyc2VJbnQoaW5pdHZhbHVlcy5ub3RNb3JlKTtcbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLm5vdExlc3MpIHNjb3BlLm5vdExlc3MgPSBwYXJzZUludChpbml0dmFsdWVzLm5vdExlc3MpO1xuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMuaWQpICAgICAgc2NvcGUuc2xpZGVyaWQ9IGluaXR2YWx1ZXMuaWQ7XG5cbiAgICAgICAgICAgIC8vIGh1Z2VseSBidXQgaW4gc29tZSBjYXNlIERPTSBpcyBub3QgZmluaXNoIHdoZW4gd2UgdHJ5IHRvIHNldCB2YWx1ZXMgISEhXG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSAgIHtcbiAgICAgICAgICAgICAgICBzY29wZS52YWx1ZSA9IGluaXR2YWx1ZXMudmFsdWU7XG4gICAgICAgICAgICAgICAgc2NvcGUuZm9yY2VSZWZyZXNoICg1MCk7IC8vIHdhaXQgNTBtcyBmb3IgRE9NIHRvIGJlIHJlYWR5XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiByZWNvbXB1dGUgc2xpZGUgcG9zaXRpb25pbmdcbiAgICAgICAgc2NvcGUuZm9yY2VSZWZyZXNoID0gZnVuY3Rpb24gKHRpbWVyKSB7XG4gICAgICAgICAgIHZhciB2YWx1ZSA9IHNjb3BlLnZhbHVlO1xuICAgICAgICAgICBzY29wZS52YWx1ZSA9IFt1bmRlZmluZWQsdW5kZWZpbmVkXTtcbiAgICAgICAgICAgJHRpbWVvdXQgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgc2NvcGUuc2V0VmFsdWUodmFsdWVbMF0sMCk7XG4gICAgICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkgIHNjb3BlLnNldFZhbHVlKHZhbHVlWzFdLDEpO1xuICAgICAgICAgICB9LCB0aW1lcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaGFuZGxlciB0byBjaGFuZ2UgY2xhc3MgZnJvbSBzbGlkZXIgaGFuZGxlXG4gICAgICAgIHNjb3BlLnVwZGF0ZUNsYXNzID0gZnVuY3Rpb24gKGNsYXNzZSwgc3RhdHVzKSB7XG5cbiAgICAgICAgICAgIGlmIChzdGF0dXMpIGVsZW1lbnQuYWRkQ2xhc3MgKGNsYXNzZSk7XG4gICAgICAgICAgICBlbHNlICBlbGVtZW50LnJlbW92ZUNsYXNzIChjbGFzc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLnNldERpc2FibGUgPSBmdW5jdGlvbiAoZGlzYWJsZWQpIHtcblxuICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcyAoXCJkaXNhYmxlXCIpO1xuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMF0uY3NzICgndmlzaWJpbGl0eScsJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMV0uY3NzICgndmlzaWJpbGl0eScsJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDbGFzcyAoXCJkaXNhYmxlXCIpO1xuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMF0uY3NzICgndmlzaWJpbGl0eScsJ3Zpc2libGUnKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkgc2NvcGUuaGFuZGxlc1sxXS5jc3MgKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUubm9ybWFsaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgdmFyIHJhbmdlID0gc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3M7XG4gICAgICAgICAgICB2YXIgcG9pbnQgPSB2YWx1ZSAqIHJhbmdlO1xuXG4gICAgICAgICAgICAvLyBpZiBzdGVwIGlzIHBvc2l0aXZlIGxldCdzIHJvdW5kIHN0ZXAgYnkgc3RlcFxuICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA+ICAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1vZCA9IChwb2ludCAtIChwb2ludCAlIHNjb3BlLmJ5U3RlcCkpIC8gc2NvcGUuYnlTdGVwO1xuICAgICAgICAgICAgICAgIHZhciByZW0gPSBwb2ludCAlIHNjb3BlLmJ5U3RlcDtcblxuICAgICAgICAgICAgICAgIHZhciByb3VuZCA9IChyZW0gPj0gc2NvcGUuYnlTdGVwICogMC41ID8gc2NvcGUuYnlTdGVwIDogMCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0PSAobW9kICogc2NvcGUuYnlTdGVwICsgcm91bmQpICsgc2NvcGUubm90TGVzcztcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nIChcInJhbmdlPSVkIHZhbHVlPSVkIHBvaW50PSVkIG1vZD0lZCByZW09JWQgcm91bmQ9JWQgcmVzdWx0PSVkXCIsIHJhbmdlLCB2YWx1ZSwgcG9pbnQsIG1vZCwgcmVtLCByb3VuZCwgcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHN0ZXAgaXMgbmVnYXRpdmUgcmV0dXJuIHJvdW5kIHRvIGFza2VkIGRlY2ltYWxcbiAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPCAgMCkge1xuICAgICAgICAgICAgICAgIHZhciBwb3dlciAgPSAgTWF0aC5wb3cgKDEwLChzY29wZS5ieVN0ZXAgKiAtMSkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNjb3BlLm5vdExlc3MgKyBwYXJzZUludCAocG9pbnQgKiBwb3dlcikgLyBwb3dlcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHN0ZXAgaXMgbnVsbCByZXR1cm4gZnVsbCB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgICAgIH07XG5cbiAgICAgICAgLy8gcmV0dXJuIGN1cnJlbnQgdmFsdWVcbiAgICAgICAgc2NvcGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAob2Zmc2V0LCBoYW5kbGUpIHtcbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gPSAob2Zmc2V0IC0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIC8gKHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdID0gb2Zmc2V0IC8gIChzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXd2YWx1ZSA9IHNjb3BlLm5vcm1hbGl6ZSAoc2NvcGUucmVsYXRpdmVbaGFuZGxlXSk7XG5cblxuICAgICAgICAgICAgLy8gaWYgaW50ZXJuYWwgdmFsdWUgY2hhbmdlIHVwZGF0ZSBvciBtb2RlbFxuICAgICAgICAgICAgaWYgKG5ld3ZhbHVlICE9PSBzY29wZS52YWx1ZVtoYW5kbGVdKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld3ZhbHVlIDwgc2NvcGUuc3RhcnRWYWx1ZSkgbmV3dmFsdWU9c2NvcGUuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV3dmFsdWUgPiBzY29wZS5zdG9wVmFsdWUpICBuZXd2YWx1ZT1zY29wZS5zdG9wVmFsdWU7XG5cblxuICAgICAgICAgICAgICAgIGlmIChzY29wZS5mb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUudmlld1ZhbHVlID0gc2NvcGUuZm9ybWF0dGVyIChuZXd2YWx1ZSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUudmlld1ZhbHVlID0gbmV3dmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzY29wZS5kaXNwbGF5c1toYW5kbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BsYXlzW2hhbmRsZV0uaHRtbCAoc2NvcGUudmlld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAgICAgICAgICAgICAgc2NvcGUudmFsdWVbaGFuZGxlXSA9IG5ld3ZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChtb2RlbCkgbW9kZWwuJHNldFZpZXdWYWx1ZSAoc2NvcGUudmlld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3dmFsdWUgPiBzY29wZS5zdGFydFZhbHVlICYmIG5ld3ZhbHVlIDwgc2NvcGUuc3RvcFZhbHVlKSBzY29wZS50cmFuc2xhdGUob2Zmc2V0LCBoYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgc2NvcGUuc2V0U3RhcnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IHNjb3BlLnZhbHVlWzBdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZS5kdWFsKSBzY29wZS5zZXRWYWx1ZSAodmFsdWUsMCk7XG4gICAgICAgICAgICAgICAgZWxzZSBzY29wZS5zZXRWYWx1ZSAodmFsdWUsMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICogKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXJ0LmNzcygnaGVpZ2h0JyxvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAqICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBzY29wZS5zdGFydC5jc3MoJ3dpZHRoJyxvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUuc3RhcnRWYWx1ZT0gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuc2V0U3RvcCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgc2NvcGUudmFsdWVbMF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmR1YWwpIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwwKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKiAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RhcnQuY3NzKCdoZWlnaHQnLG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICogKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0b3AuY3NzKHsncmlnaHQnOiAwLCAnd2lkdGgnOiAoc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAgLSBvZmZzZXQpICsgJ3B4J30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY29wZS5zdG9wVmFsdWU9IHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChvZmZzZXQsIGhhbmRsZSkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAvLyB0YWtlIGhhbmRsZSBzaXplIGluIGFjY291bnQgdG8gY29tcHV0ZSBtaWRkbGVcbiAgICAgICAgICAgICAgICB2YXIgdm9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gb2Zmc2V0O1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1toYW5kbGVdLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyB2b2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctbW96LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyB2b2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctbXMtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1vLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyB2b2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknXG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIGlmICghc2NvcGUuZHVhbCkgc2NvcGUuc2xpZGVyLmNzcygnaGVpZ2h0Jywgb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICBlbHNlIGlmIChzY29wZS5yZWxhdGl2ZVsxXSAmJiBzY29wZS5yZWxhdGl2ZVswXSkge1xuICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSAoc2NvcGUucmVsYXRpdmVbMV0gLSBzY29wZS5yZWxhdGl2ZVswXSkgKiAgc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgc3RhcnQgID0gKHNjb3BlLnJlbGF0aXZlWzBdICogIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICBzY29wZS5zbGlkZXIuY3NzICh7J2JvdHRvbSc6IHN0YXJ0KydweCcsJ2hlaWdodCc6IGhlaWdodCArICdweCd9KTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzW2hhbmRsZV0uY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW1vei10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctbXMtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW8tdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICdweCknXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZS5kdWFsKSBzY29wZS5zbGlkZXIuY3NzKCd3aWR0aCcsb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcGUucmVsYXRpdmVbMV0gJiYgc2NvcGUucmVsYXRpdmVbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gKHNjb3BlLnJlbGF0aXZlWzFdIC0gc2NvcGUucmVsYXRpdmVbMF0pICogIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gKHNjb3BlLnJlbGF0aXZlWzBdICogIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5zbGlkZXIuY3NzICh7J2xlZnQnOiBzdGFydCsncHgnLCd3aWR0aCc6IHdpZHRoICsgJ3B4J30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBwb3NpdGlvbiBoYW5kbGUgb24gdGhlIGJhciBkZXBlbmRpbmcgYSBnaXZlbiB2YWx1ZVxuICAgICAgICBzY29wZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSAsIGhhbmRsZSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcblxuICAgICAgICAgICAgLy8gaWYgdmFsdWUgZGlkIG5vdCBjaGFuZ2UgaWdub3JlXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHNjb3BlLnZhbHVlW2hhbmRsZV0pIHJldHVybjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSAgIHZhbHVlPTA7XG4gICAgICAgICAgICBpZiAodmFsdWUgPiBzY29wZS5ub3RNb3JlKSB2YWx1ZT1zY29wZS5ub3RNb3JlO1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgc2NvcGUubm90TGVzcykgdmFsdWU9c2NvcGUubm90TGVzcztcblxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucmVsYXRpdmVbaGFuZGxlXSA9ICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlID09PSAwKSBvZmZzZXQgPSAoc2NvcGUucmVsYXRpdmVbaGFuZGxlXSAqIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSArIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LzI7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSA9PT0gMSkgb2Zmc2V0ID0gc2NvcGUucmVsYXRpdmVbaGFuZGxlXSAqIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gPSAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUucmVsYXRpdmVbaGFuZGxlXSAqICAoc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY29wZS50cmFuc2xhdGUgKG9mZnNldCxoYW5kbGUpO1xuICAgICAgICAgICAgc2NvcGUudmFsdWVbaGFuZGxlXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUuZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBjYWxsIHRocm91Z2ggc2V0VmFsdWUgd2UgZG8gbm90IHBhc3MgY2JIYW5kbGVcbiAgICAgICAgICAgICAgICBzY29wZS52aWV3VmFsdWUgPSBzY29wZS5mb3JtYXR0ZXIgKHZhbHVlLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY29wZS52aWV3VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vZGVsKSBtb2RlbC4kc2V0Vmlld1ZhbHVlKCBzY29wZS52aWV3VmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUuZGlzcGxheXNbaGFuZGxlXSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BsYXlzW2hhbmRsZV0uaHRtbCAoc2NvcGUudmlld1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4gICAgICAgIC8vIE1pbmltYWwga2V5c3Ryb2tlIGhhbmRsaW5nIHRvIGNsb3NlIHBpY2tlciB3aXRoIEVTQyBbc2NvcGUuYWN0aWYgaXMgY3VycmVudCBoYW5kbGUgaW5kZXhdXG4gICAgICAgIHNjb3BlLmtleWRvd249ICBmdW5jdGlvbihlKXtcblxuICAgICAgICAgICAgc3dpdGNoKGUua2V5Q29kZSl7XG4gICAgICAgICAgICAgICAgY2FzZSAzOTogLy8gUmlnaHRcbiAgICAgICAgICAgICAgICBjYXNlIDM4OiAvLyB1cFxuICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA+IDApIHNjb3BlLiRhcHBseShzY29wZS5zZXRWYWx1ZSAoKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXStzY29wZS5ieVN0ZXApLCBzY29wZS5hY3RpZikpO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA8IDApIHNjb3BlLiRhcHBseShzY29wZS5zZXRWYWx1ZSAoKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXSsoMSAvIE1hdGgucG93KDEwLCBzY29wZS5ieVN0ZXAqLTEpKSksc2NvcGUuYWN0aWYpKTtcbiAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjaykgIHNjb3BlLmNhbGxiYWNrIChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzNzogLy8gbGVmdFxuICAgICAgICAgICAgICAgIGNhc2UgNDA6IC8vIGRvd25cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA+IDApIHNjb3BlLiRhcHBseShzY29wZS5zZXRWYWx1ZSAoKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXSAtIHNjb3BlLmJ5U3RlcCksIHNjb3BlLmFjdGlmKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPCAwKSBzY29wZS4kYXBwbHkoc2NvcGUuc2V0VmFsdWUgKChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0gLSAoMSAvIE1hdGgucG93KDEwLCBzY29wZS5ieVN0ZXAqLTEpKSksc2NvcGUuYWN0aWYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrKSAgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjc6IC8vIGVzY1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzW3Njb3BlLmFjdGlmXVswXS5ibHVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUubW92ZUhhbmRsZSA9IGZ1bmN0aW9uIChoYW5kbGUsIGNsaWVudFgsIGNsaWVudFkpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIGNsaWVudFk7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBjbGllbnRYIC0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKChjbGllbnRYICsgc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkgPiBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUuZ2V0VmFsdWUgIChvZmZzZXQsIGhhbmRsZSk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZHVhbCBoYW5kbGUgdG8gY3Jvc3NcbiAgICAgICAgICAgIGlmIChzY29wZS5kdWFsICYmIHNjb3BlLnZhbHVlIFswXSA+IHNjb3BlLnZhbHVlWzFdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSA9PT0gMCkgc2NvcGUuc2V0VmFsdWUgKHNjb3BlLnZhbHVlWzBdICwgMSk7XG4gICAgICAgICAgICAgICAgZWxzZSBzY29wZS5zZXRWYWx1ZShzY29wZS52YWx1ZVsxXSwwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4gICAgICAgIHNjb3BlLmZvY3VzQ0IgPSBmdW5jdGlvbiAoaW5zaWRlKSB7XG4gICAgICAgICAgICBpZiAoaW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgJGRvY3VtZW50Lm9uKCdrZXlkb3duJyxzY29wZS5rZXlkb3duKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgna2V5ZG93bicsc2NvcGUua2V5ZG93bik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gYmFyIHdhcyB0b3VjaCBsZXQgbW92ZSBoYW5kbGUgdG8gdGhpcyBwb2ludFxuICAgICAgICBzY29wZS50b3VjaEJhckNCID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlPTA7XG4gICAgICAgICAgICB2YXIgcmVsYXRpdmU7XG4gICAgICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzO1xuICAgICAgICAgICAgdmFyIG9sZHZhbHVlID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSB0d28gaGFuZGxlcyBzZWxlY3QgY2xvc2VzdCBvbmUgZnJvbSB0b3VjaCBwb2ludFxuICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHJlbGF0aXZlID0gKHRvdWNoZXNbMF0ucGFnZVkgLSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSkgLyBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgICAgICBlbHNlIHJlbGF0aXZlPSAodG91Y2hlc1swXS5wYWdlWCAtIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgLyBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlMCA9IE1hdGguYWJzKHJlbGF0aXZlIC0gc2NvcGUucmVsYXRpdmVbMF0pO1xuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZTEgPSBNYXRoLmFicyhyZWxhdGl2ZSAtIHNjb3BlLnJlbGF0aXZlWzFdKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UxIDwgZGlzdGFuY2UwKSBoYW5kbGU9MTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbW92ZSBoYW5kbGUgdG8gbmV3IHBsYWNlXG4gICAgICAgICAgICBzY29wZS5tb3ZlSGFuZGxlIChoYW5kbGUsdG91Y2hlc1swXS5wYWdlWCwgdG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2sgJiYgb2xkdmFsdWUgIT09IHNjb3BlLnZhbHVlW2hhbmRsZV0pIHNjb3BlLmNhbGxiYWNrIChzY29wZS52YWx1ZVtoYW5kbGVdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBoYW5kbGUgd2FzIHRvdWNoIGFuZCBkcmFnXG4gICAgICAgIHNjb3BlLnRvdWNoSGFuZGxlQ0IgPSBmdW5jdGlvbiAodG91Y2hldnQsIGhhbmRsZSkge1xuICAgICAgICAgICAgdmFyIG9sZHZhbHVlID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcblxuICAgICAgICAgICAgdG91Y2hldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICRkb2N1bWVudC5vbigndG91Y2htb3ZlJyx0b3VjaG1vdmUpO1xuICAgICAgICAgICAgJGRvY3VtZW50Lm9uKCd0b3VjaGVuZCcgLHRvdWNoZW5kKTtcbiAgICAgICAgICAgIGVsZW1lbnQudW5iaW5kKCd0b3VjaHN0YXJ0Jywgc2NvcGUudG91Y2hCYXJDQik7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRvdWNobW92ZShldmVudCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcztcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCB0b3VjaGVzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUubW92ZUhhbmRsZSAoaGFuZGxlLHRvdWNoZXNbaWR4XS5wYWdlWCwgdG91Y2hlc1tpZHhdLnBhZ2VZKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRvdWNoZW5kKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCd0b3VjaG1vdmUnLHRvdWNobW92ZSk7XG4gICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCd0b3VjaGVuZCcgLHRvdWNoZW5kKTtcbiAgICAgICAgICAgICAgIGVsZW1lbnQub24oJ3RvdWNoc3RhcnQnLCBzY29wZS50b3VjaEJhckNCKTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlIGNoYW5nZSBub3RpZnkgYXBwbGljYXRpb24gY2FsbGJhY2tcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2sgJiYgb2xkdmFsdWUgIT09IHNjb3BlLnZhbHVlW2hhbmRsZV0pIHNjb3BlLmNhbGxiYWNrIChzY29wZS52YWx1ZVtoYW5kbGVdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5oYW5kbGVDQiA9IGZ1bmN0aW9uIChjbGlja2V2ZW50LCBoYW5kbGUpIHtcblxuICAgICAgICAgICAgaWYgKGF0dHJzLmF1dG9tYXRpYykgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgb2xkdmFsdWUgPSBzY29wZS52YWx1ZVtoYW5kbGVdO1xuICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbW91c2UgZXZlbnQgdG8gdHJhY2sgaGFuZGxlXG4gICAgICAgICAgICBjbGlja2V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICRkb2N1bWVudC5vbignbW91c2Vtb3ZlJyxtb3VzZW1vdmUpO1xuICAgICAgICAgICAgJGRvY3VtZW50Lm9uKCdtb3VzZXVwJywgbW91c2V1cCk7XG4gICAgICAgICAgICBzY29wZS5oYW5kbGVzW2hhbmRsZV1bMF0uZm9jdXMoKTtcbiAgICAgICAgICAgIHNjb3BlLmFjdGlmPWhhbmRsZTtcblxuICAgICAgICAgICAgLy8gc2xpZGVyIGhhbmRsZSBpcyBtb3ZpbmdcbiAgICAgICAgICAgIGZ1bmN0aW9uIG1vdXNlbW92ZShldmVudCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLm1vdmVIYW5kbGUgKGhhbmRsZSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1vdXNlIGlzIHVwIGRhbnMgbGVhdmUgc2xpZGVyIHNlbmQgcmVzaXplIGV2ZW50c1xuICAgICAgICAgICAgZnVuY3Rpb24gbW91c2V1cCgpIHtcbiAgICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCdtb3VzZW1vdmUnLCBtb3VzZW1vdmUpO1xuICAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ21vdXNldXAnLCBtb3VzZXVwKTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlIGNoYW5nZSBub3RpZnkgYXBwbGljYXRpb24gY2FsbGJhY2tcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2sgJiYgb2xkdmFsdWUgIT09IHNjb3BlLnZhbHVlW2hhbmRsZV0pIHNjb3BlLmNhbGxiYWNrIChzY29wZS52YWx1ZVtoYW5kbGVdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzaW11bGF0ZSBqcXVlcnkgZmluZCBieSBjbGFzc2VzIGNhcGFiaWxpdGllcyBbd2FybmluZyBvbmx5IHJldHVybiAxc3QgZWxlbWVudHNdXG4gICAgICAgIHNjb3BlLmZpbmQgPSBmdW5jdGlvbiAoc2VsZWN0LCBlbGVtKSB7XG4gICAgICAgICAgICB2YXIgZG9tZWxlbTtcblxuICAgICAgICAgICAgaWYgKGVsZW0pIGRvbWVsZW0gPSBlbGVtWzBdLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0KTtcbiAgICAgICAgICAgIGVsc2UgZG9tZWxlbSA9IGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcihzZWxlY3QpO1xuXG4gICAgICAgICAgICB2YXIgYW5nZWxlbSA9IGFuZ3VsYXIuZWxlbWVudChkb21lbGVtKTtcbiAgICAgICAgICAgIHJldHVybiAoYW5nZWxlbSk7XG4gICAgICAgIH07XG5cblxuXG4gICAgICAgIHNjb3BlLmluaXRpYWxTZXR0aW5ncyA9IGZ1bmN0aW9uIChpbml0aWFsKSB7XG4gICAgICAgICAgICB2YXIgZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0O1xuICAgICAgICAgICAgc2NvcGUudmFsdWU9W107ICAvLyBzdG9yZSBsb3cvaGVpZ2h0IHZhbHVlIHdoZW4gdHdvIGhhbmRsZXNcbiAgICAgICAgICAgIHNjb3BlLnJlbGF0aXZlPVtdO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUucHJlY2lzaW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0ID0gKCcnICsgc2NvcGUuYnlTdGVwKS5tYXRjaCgvXFwuKFtcXGRdKikvKTtcbiAgICAgICAgICAgICAgICBzY29wZS5wcmVjaXNpb24gPSBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHQgJiYgZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0WzFdID8gZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0WzFdLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIGhhbmRsZSB0byBpbml0aWFsIHZhbHVlKHMpXG4gICAgICAgICAgICBlbGVtZW50Lm9uKCd0b3VjaHN0YXJ0Jywgc2NvcGUudG91Y2hCYXJDQik7XG4gICAgICAgICAgICBzY29wZS5oYW5kbGVzWzBdLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24oZXZ0KXtzY29wZS50b3VjaEhhbmRsZUNCKGV2dCwwKTt9KTtcblxuICAgICAgICAgICAgLy8gdGhpcyBzbGlkZXIgaGFzIHR3byBoYW5kbGVzIGxvdy9oaWdodFxuICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzFdLmFkZENsYXNzKCdyYW5nZS1zbGlkZXItaGFuZGxlJyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1sxXS5vbigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGV2dCl7c2NvcGUudG91Y2hIYW5kbGVDQihldnQsMSk7fSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZS5pbml0dmFsdWVzKSBzY29wZS5zZXRWYWx1ZSAoaW5pdGlhbFsxXSwxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBpbml0c3RhdGUgb2JqZWN0IGFwcGx5IGl0XG4gICAgICAgICAgICBpZiAoc2NvcGUuaW5pdHZhbHVlcykgc2NvcGUuaW5pdFdpZGdldCAoc2NvcGUuaW5pdHZhbHVlcyk7XG4gICAgICAgICAgICBlbHNlICAgc2NvcGUuc2V0VmFsdWUgKGluaXRpYWxbMF0sMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLnNsaWRlcmlkICAgPSBhdHRycy5pZCB8fCBcInNsaWRlci1cIiArIHBhcnNlSW50IChNYXRoLnJhbmRvbSgpICogMTAwMCk7XG4gICAgICAgICAgICBzY29wZS5zdGFydFZhbHVlID0gLUluZmluaXR5O1xuICAgICAgICAgICAgc2NvcGUuc3RvcFZhbHVlICA9IEluZmluaXR5O1xuICAgICAgICAgICAgc2NvcGUuYnlTdGVwICAgPSBwYXJzZUludChhdHRycy5ieVN0ZXApIHx8IDE7XG4gICAgICAgICAgICBzY29wZS52ZXJ0aWNhbCA9IGF0dHJzLnZlcnRpY2FsICAgfHwgZmFsc2U7XG4gICAgICAgICAgICBzY29wZS5kdWFsICAgICA9IGF0dHJzLmR1YWxIYW5kbGVzfHwgZmFsc2U7XG4gICAgICAgICAgICBzY29wZS50cmlnZ2VyX2lucHV0X2NoYW5nZT0gZmFsc2U7XG4gICAgICAgICAgICBzY29wZS5ub3RNb3JlICA9IHBhcnNlSW50KGF0dHJzLm5vdE1vcmUpICAgfHwgMTAwO1xuICAgICAgICAgICAgc2NvcGUubm90TGVzcyAgPSBwYXJzZUludChhdHRycy5ub3RMZXNzKSAgIHx8IDA7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkgZWxlbWVudC5hZGRDbGFzcyhcInZlcnRpY2FsLXJhbmdlXCIpO1xuXG4gICAgICAgICAgICBzY29wZS5oYW5kbGVzPSBbc2NvcGUuZmluZCgnLmhhbmRsZS1taW4nKSwgc2NvcGUuZmluZCgnLmhhbmRsZS1tYXgnKV07XG4gICAgICAgICAgICBzY29wZS5iYXIgICAgPSBlbGVtZW50O1xuICAgICAgICAgICAgc2NvcGUuc2xpZGVyID0gc2NvcGUuZmluZCgnLnJhbmdlLXNsaWRlci1hY3RpdmUtc2VnbWVudCcpO1xuICAgICAgICAgICAgc2NvcGUuc3RhcnQgID0gc2NvcGUuZmluZCgnLmliei1yYW5nZS1zbGlkZXItc3RhcnQnKTtcbiAgICAgICAgICAgIHNjb3BlLnN0b3AgICA9IHNjb3BlLmZpbmQoJy5pYnotcmFuZ2Utc2xpZGVyLXN0b3AnKTtcbiAgICAgICAgICAgIHNjb3BlLmRpc2FibGU9IGF0dHJzLmRpc2FibGUgfHwgZmFsc2U7XG5cbiAgICAgICAgICAgIHNjb3BlLmN0cmxoYW5kbGUgPSBuZXcgUmFuZ2VTbGlkZXJIYW5kbGUgKHNjb3BlKTtcblxuICAgICAgICAgICAgLy8gcHJlcGFyZSBET00gb2JqZWN0IHBvaW50ZXIgdG8gY29tcHV0ZSBzaXplIGR5bmFtaWNhbGx5XG4gICAgICAgICAgICBzY29wZS5ib3VuZHMgPSB7XG4gICAgICAgICAgICAgICAgYmFyICAgIDogZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBoYW5kbGVzOiBbc2NvcGUuaGFuZGxlc1swXVswXSwgc2NvcGUuaGFuZGxlc1sxXVswXV1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChhdHRycy5kaXNhYmxlID09PSAndHJ1ZScpIHNjb3BlLnNldERpc2FibGUodHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmIChhdHRycy5kaXNwbGF5VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChhdHRycy5kaXNwbGF5VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdHJ1ZSA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2hhbmRsZScgOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGlzcGxheXMgPSBzY29wZS5oYW5kbGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1swXS5hZGRDbGFzcygnaWJ6LXJhbmdlLXNsaWRlci1kaXNwbGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkgc2NvcGUuaGFuZGxlc1sxXS5hZGRDbGFzcygnaWJ6LXJhbmdlLXNsaWRlci1kaXNwbGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BsYXlzID0gIFskZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKGF0dHJzLmRpc3BsYXlUYXJnZXQpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Ugc2NvcGUuZGlzcGxheXM9W107XG5cbiAgICAgICAgICAgIC8vIGV4dHJhY3QgaW5pdGlhbCB2YWx1ZXMgZnJvbSBhdHRycyBhbmQgcGFyc2UgaW50byBpbnRcbiAgICAgICAgICAgIGlmICghYXR0cnMuaW5pdGlhbCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLmluaXRpYWwgID0gW3Njb3BlLm5nTW9kZWwsIHNjb3BlLm5nTW9kZWxdOyAvLyBpbml0aWFsaXplIHRvIG1vZGVsIHZhbHVlc1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbCAgPSBhdHRycy5pbml0aWFsLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuaW5pdGlhbCA9IFtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFswXSAhPT0gdW5kZWZpbmVkID8gcGFyc2VJbnQgKGluaXRpYWxbMF0pIDogc2NvcGUubm90TGVzcyxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFsxXSAhPT0gdW5kZWZpbmVkID8gcGFyc2VJbnQgKGluaXRpYWxbMV0pIDogc2NvcGUubm90TW9yZVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1vbml0b3IgYW55IGNoYW5nZXMgb24gc3RhcnQvc3RvcCBkYXRlcy5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgnc3RhcnRBdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS52YWx1ZSA8IHNjb3BlLnN0YXJ0QXQgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2NvcGUuc2V0VmFsdWUgKHNjb3BlLnN0YXJ0QXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuc3RhcnRBdCkgc2NvcGUuc2V0U3RhcnQgKHNjb3BlLnN0YXJ0QXQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgnc3RvcEF0JyAsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS52YWx1ZSA+IHNjb3BlLnN0b3BBdCkge1xuICAgICAgICAgICAgICAgICAgICAvL3Njb3BlLnNldFZhbHVlIChzY29wZS5zdG9wQXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuc3RvcEF0KSBzY29wZS5zZXRTdG9wIChzY29wZS5zdG9wQXQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGZpbmlzaCB3aWRnZXQgaW5pdGlhbGlzYXRpb25cbiAgICAgICAgICAgIHNjb3BlLmluaXRpYWxTZXR0aW5ncyAoc2NvcGUuaW5pdGlhbCk7XG5cbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5pbml0KCk7XG4gICAgICAgIFxuICAgICAgICAgLy8gc2xpZGVyIGlzIHJlYWR5IHByb3ZpZGUgY29udHJvbCBoYW5kbGUgdG8gYXBwbGljYXRpb24gY29udHJvbGxlclxuICAgICAgICBzY29wZS4kd2F0Y2ggKCdpbml0aG9vaycsIGZ1bmN0aW9uICgpIHsgICAgICAgICAvLyBpbml0IFZhbHVlcyBtYXkgYXJyaXZlIGxhdGVcbiAgICAgICAgICAgIGlmIChzY29wZS5pbml0aG9vaykgc2NvcGUuaW5pdGhvb2sgKHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzY29wZS4kd2F0Y2ggKCdpbml0dmFsdWVzJywgZnVuY3Rpb24gKCkgeyBcdC8vIGluaXQgVmFsdWVzIG1heSBhcnJpdmUgbGF0ZVxuICAgICAgICAgICAgaWYgKHNjb3BlLmluaXR2YWx1ZXMpIHNjb3BlLmluaXRXaWRnZXQoc2NvcGUuaW5pdHZhbHVlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHR3by13YXkgYmluZGluZyBpZiBtb2RlbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIHNjb3BlLiR3YXRjaCAoJ25nTW9kZWwnLCBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgICBzY29wZS5zZXRWYWx1ZShuZXdWYWx1ZSwgMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxucmV0dXJuIHtcbiAgICByZXN0cmljdDogXCJFXCIsICAgIC8vIHJlc3RyaWN0IHRvIDxyYW5nZS1zbGlkZXI+IEhUTUwgZWxlbWVudCBuYW1lXG4gICAgc2NvcGU6IHtcbiAgICAgICAgc3RhcnRBdCAgOic9JywgIC8vIEZpcnN0IGFjY2VwdGFibGUgZGF0ZVxuICAgICAgICBzdG9wQXQgICA6Jz0nLCAgLy8gTGFzdCBhY2NlcHRhYmxlIGRhdGVcbiAgICAgICAgY2FsbGJhY2sgOic9JywgIC8vIENhbGxiYWNrIHRvIGFjdGlmIHdoZW4gYSBkYXRlIGlzIHNlbGVjdGVkXG4gICAgICAgIGZvcm1hdHRlcjonPScsICAvLyBDYWxsYmFjayBmb3IgZHJhZyBldmVudCBjYWxsIGVhY2ggdGltZSBpbnRlcm5hbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIGluaXRob29rIDonPScsICAvLyBIb29rIHBvaW50IHRvIGNvbnRyb2wgc2xpZGVyIGZyb20gQVBJXG4gICAgICAgIGNiaGFuZGxlIDonPScsICAvLyBBcmd1bWVudCBhZGRlZCB0byBldmVyeSBjYWxsYmFja1xuICAgICAgICBpbml0dmFsdWVzOic9JywgICAvLyBJbml0aWFsIHZhbHVlcyBhcyBhIHNpbmdsZSBvYmplY3RcbiAgICAgICAgbmdNb2RlbDogJz0nICAgIC8vIHRoZSBtb2RlbCB2YWx1ZVxuICAgIH0sXG4gICAgcmVxdWlyZTogJz9uZ01vZGVsJyxcbiAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsIC8vIGh0bWwgdGVtcGxhdGUgaXMgYnVpbGQgZnJvbSBKU1xuICAgIHJlcGxhY2U6IHRydWUsICAgICAgLy8gcmVwbGFjZSBjdXJyZW50IGRpcmVjdGl2ZSB3aXRoIHRlbXBsYXRlIHdoaWxlIGluaGVyaXRpbmcgb2YgY2xhc3NcbiAgICBsaW5rOiBsaW5rICAgICAgICAgIC8vIHBpY2thZGF0ZSBvYmplY3QncyBtZXRob2RzXG59O1xufV0pO1xuXG5jb25zb2xlLmxvZyAoXCJSYW5nZVNsaWRlciBMb2FkZWRcIik7XG5cbn0pKCk7IiwiLypcbiBhbHNhLWdhdGV3YXkgLS0gcHJvdmlkZSBhIFJFU1QvSFRUUCBpbnRlcmZhY2UgdG8gQUxTQS1NaXhlclxuXG4gQ29weXJpZ2h0IChDKSAyMDE1LCBGdWx1cCBBciBGb2xsXG5cbiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3JcbiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuXG4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cblxuIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gYWxvbmcgd2l0aCBzY29wZSBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuXG5cbiBSZWZlcmVuY2VzOlxuXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdGVtcGxhdGUgPVxuICAgICAgICAgICc8ZGl2IGNsYXNzPVwiYWZiLW1vbml0b3JcIiBuZy1jbGljaz1cImdldHBpbmcoKVwiPicgK1xuICAgICAgICAgJzxzcGFuIGNsYXNzPVwiYWZiLXJlZnJlc2gtdG9rZW5cIiAgPmFmYjovL3t7aG9zdG5hbWV9fTp7e2h0dHBkcG9ydH19PC9zcGFuPicgK1xuICAgICAgICAgJzxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+JyArXG4gICAgICAgICAnPC9kaXY+JztcblxuXG4vLyBzY29wZSBtb2R1bGUgaXMgbG9hZCBzdGF0aWNhbGx5IGJlZm9yZSBhbnkgcm91dGUgaXMgY2F0aXZhdGVkXG5hbmd1bGFyLm1vZHVsZSgnVG9rZW5SZWZyZXNoJywgWydBcHBDb25maWcnLCAnTW9kYWxOb3RpZmljYXRpb24nXSlcblxuICAgIC5kaXJlY3RpdmUgKCd0b2tlblJlZnJlc2gnLCBbXCIkbG9nXCIsIFwiJHdpbmRvd1wiLCBcIiR0aW1lb3V0XCIsIFwiJGxvY2F0aW9uXCIsIFwiTm90aWZpY2F0aW9uXCIsIFwiQXBwQ29uZmlnXCIsIFwiQXBwQ2FsbFwiLCBmdW5jdGlvbigkbG9nLCAkd2luZG93LCAkdGltZW91dCwgJGxvY2F0aW9uLCBOb3RpZmljYXRpb24sIEFwcENvbmZpZywgQXBwQ2FsbCkge1xuXG4gICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgICBzY29wZS5sb2dnZWQ9dW5kZWZpbmVkOyAvLyBuZWl0aGVyIHRodSBuZWl0aGVyIGZhbHNlXG4gICAgICAgIFxuICAgICAgICAkd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwidG9rZW5cIiwgXCJyZXNldFwiLCB7LypxdWVyeSovfSwgZnVuY3Rpb24gKCkgeyAgICBcbiAgICAgICAgICAgICRsb2cubG9nKFwiT1BBIGV4aXRcIik7ICAgICAgICAgICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgIHNjb3BlLm9ubGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgICAgKFwib25saW5lXCIpO1xuICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyAoXCJvZmZsaW5lXCIpO1xuICAgICAgICAgICAgc2NvcGUubG9nZ2VkPXRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUub2ZmbGluZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBlbGVtLmFkZENsYXNzICAgIChcIm9mZmxpbmVcIik7XG4gICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcIm9ubGluZVwiKTtcbiAgICAgICAgICAgIHNjb3BlLmxvZ2dlZD1mYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5sb2dnZWQgIT09IGZhbHNlKSAge1xuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi53YXJuaW5nICh7bWVzc2FnZTogXCJBcHBGcmFtZXdvcmsgQmluZGVyIExvc3RcIiwgZGVsYXk6IDUwMDB9KTtcbiAgICAgICAgICAgICAgICBzY29wZS5vZmZsaW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5zdGF0dXMgPSAwO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2NvcGUub25zdWNjZXNzID0gZnVuY3Rpb24oanJlc3ApIHtcbiAgICAgICAgICAgIGlmIChqcmVzcC5yZXF1ZXN0LnRva2VuKSBBcHBDb25maWcuc2Vzc2lvbi50b2tlbiA9IGpyZXNwLnJlcXVlc3QudG9rZW47XG4gICAgICAgICAgICBpZiAoanJlc3AucmVxdWVzdC51dWlkKSAgQXBwQ29uZmlnLnNlc3Npb24udXVpZCAgPSBqcmVzcC5yZXF1ZXN0LnV1aWQ7XG4gICAgICAgICAgICBpZiAoanJlc3AucmVxdWVzdC50aW1lb3V0KSAgQXBwQ29uZmlnLnNlc3Npb24udGltZW91dCAgPSBqcmVzcC5yZXF1ZXN0LnRpbWVvdXQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzY29wZS5sb2dnZWQgIT09IHRydWUpICB7XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnN1Y2Nlc3MgKHttZXNzYWdlOiBcIkFwcEZyYW1ld29yayBCaW5kZXIgQmFjayB0byBMaXZlXCIsIGRlbGF5OiAzMDAwfSk7XG4gICAgICAgICAgICAgICAgc2NvcGUub25saW5lKCk7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrKSBzY29wZS5jYWxsYmFjayhqcmVzcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5zdGF0dXMgPSAxO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIEJpbmRlciBzdGF0dXNcbiAgICAgICAgc2NvcGUuZ2V0cGluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJ0b2tlblwiLCBcInBpbmdcIiwgey8qcXVlcnkqL30sZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDIwMCkgc2NvcGUub25zdWNjZXNzIChyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgZWxzZSAgc2NvcGUub25lcnJvcigpO1xuICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQgYSBuZXcgdGltZXIgZm9yIG5leHQgcGluZ1xuICAgICAgICAgICAgICAgICR0aW1lb3V0IChzY29wZS5nZXRwaW5nLCBBcHBDb25maWcuc2Vzc2lvbi5waW5ncmF0ZSoxMDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgQmluZGVyIHN0YXR1c1xuICAgICAgICBzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcInRva2VuXCIsIFwicmVmcmVzaFwiLCB7LypxdWVyeSovfSxmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMjAwKSBzY29wZS5vbnN1Y2Nlc3MgKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICBlbHNlICBzY29wZS5vbmVycm9yKCk7XG4gICAgICAgICAgICAgICAgLy8gcmVzdGFydCBhIG5ldyB0aW1lciBmb3IgbmV4dCByZWZyZXNoXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQgKHNjb3BlLnJlZnJlc2gsIEFwcENvbmZpZy5zZXNzaW9uLnRpbWVvdXQgKjI1MCk7XG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIEluaXRpYWwgY29ubmVjdGlvblxuICAgICAgICBzY29wZS50a2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJ0b2tlblwiLCBcImNyZWF0ZVwiLCB7dG9rZW46IEFwcENvbmZpZy5zZXNzaW9uLmluaXRpYWx9LGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHNjb3BlLm9uc3VjY2VzcyAocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgIGVsc2UgIHNjb3BlLm9uZXJyb3IoKTtcbiAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICB9O1xuIFxuICAgICAgICBzY29wZS5pY29uICAgICAgPSBhdHRycy5pY29uICAgfHwgXCJmaS1saWdodGJ1bGJcIjtcbiAgICAgICAgc2NvcGUuaG9zdG5hbWUgID0gJGxvY2F0aW9uLmhvc3QoKTtcbiAgICAgICAgc2NvcGUuaHR0cGRwb3J0ID0gJGxvY2F0aW9uLnBvcnQoKTtcbiAgICAgICAgc2NvcGUuYXV0b2xvZyAgID0gSlNPTi5wYXJzZShhdHRycy5hdXRvbG9nIHx8IGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChzY29wZS5hdXRvbG9nKSBzY29wZS50a2NyZWF0ZSgpO1xuXG4gICAgICAgIC8vIEluaXQgcGluZyBhbmQgcmVmcmVzaCBwcm9jZXNzXG4gICAgICAgICR0aW1lb3V0IChzY29wZS5nZXRwaW5nLCBBcHBDb25maWcuc2Vzc2lvbi5waW5ncmF0ZSoxMDAwKTtcbiAgICAgICAgJHRpbWVvdXQgKHNjb3BlLnJlZnJlc2gsIEFwcENvbmZpZy5zZXNzaW9uLnRpbWVvdXQgKjI1MCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgY2FsbGJhY2sgOiBcIj1cIlxuICAgICAgICB9LFxuICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHNcbiAgICB9O1xufV0pO1xuXG59KSgpO1xuY29uc29sZS5sb2cgKFwiVG9rZW4gUmVmcmVzaCBMb2FkZWRcIik7XG5cbiIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICogXG4gKiBCdWdzOiBJbnB1dCB3aXRoIENhbGxiYWNrIFNIT1VMRCBCRSBnZXQgJ3JlcXVpcmVkJyBjbGFzc1xuICogXG4gKiByZWY6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9tb3VzZW92ZXJcbiAqIFxuICogdXNhZ2U6IFxuICogXG4gKiB0aXBNb2RhbDogbGlzdGVuIGV2ZW50IGZyb20gZWxlbS5wYXJlbnQoKSB0byBkaXNwbGF5IHRpcC1tb2RhbFxuICogICAgICA8ZGl2IGNsYXNzPVwieHh4eFwiPlxuICogICAgICAgICAgPHRpcC1tb2RhbCB0aXA9eHh4eD48L3RpcC1tb2RhbD5cbiAqICAgICAgICAgIDxpbnB1dC10ZXh0IC4uLi4+PC9pbnB1dC10ZXh0PlxuICogICAgICA8L2Rpdj5cbiAqICAgICAgXG4gKiBOb3RlOiB1c2UgQ1NTLnZpc2liaWxpdHkgdG8gYXZvaWQgZGlzcGxheSBmbGlja2VyaW5nIGF0IGluaXRpYWwgZGlzcGxheS5cbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB0bXBsID0gJzxkaXYgY2xhc3M9XCJ0aXAtbW9kYWwtcG9wdXBcIj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7dGlwfX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9zcGFuPjwvZGl2PicgO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ01vZGFsTm90aWZpY2F0aW9uJywgW10pXG4gICAgICAgICAgICAuZGlyZWN0aXZlKCd0aXBNb2RhbCcsIFtcIiR0aW1lb3V0XCIsIGZ1bmN0aW9uICgkdGltZW91dCkge1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQgPSBlbGVtLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5tb2RhbCAgICA9IGVsZW0uZmluZChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5IHRpcCBkaXNwbGF5IHRvIGF2b2lkIGJsaW5raW5nIHdoZW4gbW92aW5nIG1vdXNlIGZhc3RcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZGlzcGxheSAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5zaG93KSBzY29wZS5tb2RhbC5jc3Moe29wYWNpdHk6IDEsIHZpc2liaWxpdHk6J3Zpc2libGUnfSk7ICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnNob3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUudGltZW91dCA9ICR0aW1lb3V0KGFjdGlvbiwgc2NvcGUuZGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjbG9zZSAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2hvdyA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsLmNzcyh7b3BhY2l0eTogMCwgdmlzaWJpbGl0eTonaGlkZGVuJ30pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFqdXN0IGljb24gb3IgdXNlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiAgPSBhdHRycy5pY29uIHx8ICdmaS1saWdodGJ1bGInO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFBhcmVudCBlbGVtZW50IHRvIGdldCBtb3VzZSBldmVudFxuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYWRkQ2xhc3MgKCdhcy1tb2RhbC10aXAnKTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50LmJpbmQoJ2NsaWNrJywgY2xvc2UpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnZm9jdXMnLCBkaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50LmJpbmQoJ21vdXNlb3ZlcicsIGRpc3BsYXkpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnbW91c2VsZWF2ZScsIGNsb3NlKTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50LmJpbmQoJ2JsdXInLCBjbG9zZSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBzY29wZS5kZWxheSA9IGF0dHJzLmRlbGF5IHx8IDEwMDA7IC8vIHdhaXQgMXMgYmVmb3JlIGRpc3BsYXlpbmcgdGlwXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgICAgICAgICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IHt0aXA6IFwiPVwifSAvLyB0aXAgbWF5IG5vdCBiZSBkZWZpbmVkIHdoZW4gd2lkZ2V0IGlzIGRpc3BsYXlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfV0pO1xufSkoKTtcbiIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICogXG4gKiBCdWdzOiBJbnB1dCB3aXRoIENhbGxiYWNrIFNIT1VMRCBCRSBnZXQgJ3JlcXVpcmVkJyBjbGFzc1xuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRtcGwgPSAnPHNwYW4gdGl0bGU9XCJHb3RvOiB7e2hyZWZ9fVwiIG5nLWNsaWNrPVwiY2xpY2tlZCgpXCI+JyArXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJ7e2ljb259fVwiPjwvaT4nICtcbiAgICAgICAgICAgICc8c3Bhbj57e2xhYmVsfX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9zcGFuPic7XG5cblxuICAgIGFuZ3VsYXIubW9kdWxlKCdMaW5rQnV0dG9uJywgW10pXG4gICAgICAgICAgICAuZGlyZWN0aXZlKCdsaW5rQnV0dG9uJywgW1wiJGxvY2F0aW9uXCIsIGZ1bmN0aW9uICgkbG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuY2xpY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRycy5xdWVyeSkgJGxvY2F0aW9uLnBhdGgoYXR0cnMuaHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlICRsb2NhdGlvbi5wYXRoKGF0dHJzLmhyZWYpLnNlYXJjaChhdHRycy5xdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWp1c3QgaWNvbiBvciB1c2UgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pY29uID0gYXR0cnMuaWNvbiAgIHx8ICdmaS1saW5rJztcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUubGFiZWwgPSBhdHRycy5sYWJlbCB8fCAnSnVtcCc7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmhyZWYgID0gYXR0cnMuaHJlZiAgfHwgJy9ob21lJztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBsYWJlbCBhcyBjbGFzc1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzIChzY29wZS5sYWJlbC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge31cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfV0pO1xufSkoKTtcbiIsIlxuLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4uXG4gKiBcbiAqIFJlZmVyZW5jZTpcbiAqICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL0ZpbGVSZWFkZXIgXG4gKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVXNpbmdfZmlsZXNfZnJvbV93ZWJfYXBwbGljYXRpb25zI1VzaW5nX2hpZGRlbl9maWxlX2lucHV0X2VsZW1lbnRzX3VzaW5nX3RoZV9jbGljayUyOCUyOV9tZXRob2RcbiAqICAgaHR0cHM6Ly91bmNvcmtlZHN0dWRpb3MuY29tL2Jsb2cvbXVsdGlwYXJ0Zm9ybWRhdGEtZmlsZS11cGxvYWQtd2l0aC1hbmd1bGFyanNcbiAqICAgaHR0cHM6Ly93d3cudGVybGljaS5jb20vMjAxNS8wNS8xNi91cGxvYWRpbmctZmlsZXMtbG9jYWxseS5odG1sXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXJ2Z2gvYW5ndWxhci1maWxlLXVwbG9hZC9ibG9iL21hc3Rlci9zcmMvc2VydmljZXMvRmlsZVVwbG9hZGVyLmpzXG4gKiAgIGh0dHBzOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sXG4gKiAgIGh0dHA6Ly9vbmVodW5ncnltaW5kLmNvbS96aXAtcGFyc2luZy1qc3ppcC1hbmd1bGFyL1xuICogICBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1MzQxOTEyL2hvdy10by1nby1mcm9tLWJsb2ItdG8tYXJyYXlidWZmZXJcbiAqICAgXG4gKiAgIEJ1Z3M6IHppcCBmaWxlIHNlbnQgZXZlbiB3aGVuIGZsYWcgYXMgaW52YWxpZCBcbiAqL1xuXG4gXG5cbihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIHRtcGxBcHBsaSA9ICc8aW5wdXQgdHlwZT1cImZpbGVcIiBuYW1lPVwie3tuYW1lfX0taW5wdXRcIiBvbmNoYW5nZT1cImFuZ3VsYXIuZWxlbWVudCh0aGlzKS5zY29wZSgpLlVwTG9hZEZpbGUodGhpcy5maWxlcylcIiBhY2NlcHQ9XCJ7e21pbWV0eXBlfX1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPicrXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVwbG9hZC1maWxlXCIgbmctY2xpY2s9XCJpbWdDbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPiA8c3Bhbj57e2xhYmVsfX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPHJhbmdlLXNsaWRlciBuZy1zaG93PVwiIW5vc2xpZGVyXCIgaWQ9XCJ7e25hbWV9fS1zbGlkZXJcIiBhdXRvbWF0aWM9dHJ1ZSBpbml0aG9vaz1cIlNsaWRlckluaXRDQlwiPjwvcmFuZ2Utc2xpZGVyPicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgXG52YXIgdG1wbE1vZGFsID0gJzxzcGFuIGNsYXNzPVwibW9kYWwtdGV4dFwiPlVwbG9hZCBBcHBsaWNhdGlvbiA8Yj57e2FwcG5hbWV9fTwvYj4gPzwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8ZGl2PicrXG4gICAgICAgICAgICAnPGltZyBuZy1zcmM9XCJ7e2ljb259fVwiPicgK1xuICAgICAgICAgICAgJzxzdWJtaXQtYnV0dG9uIGljb249XCJmaS14XCIgbGFiZWw9XCJDYW5jZWxcIiBjbGlja2VkPVwiYWJhbmRvblwiPjwvc3VibWl0LWJ1dHRvbj4nK1xuICAgICAgICAgICAgJzxzdWJtaXQtYnV0dG9uIGljb249XCJmaS1saWtlXCIgbGFiZWw9XCJJbnN0YWxsXCIgY2xpY2tlZD1cInN1Y2Nlc3NcIj48L3N1Ym1pdC1idXR0b24+ICcgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgXG52YXIgdG1wbEVycm9yID0gJzxzcGFuIGNsYXNzPVwibW9kYWwtdGV4dFwiPkludmFsaWQgQXBwbGljYXRpb24gPGI+e3thcHBuYW1lfX08L2I+ID88L3NwYW4+JyArXG4gICAgICAgICAgICAnPGRpdj4nK1xuICAgICAgICAgICAgJzxpbWcgbmctc3JjPVwie3tpY29ufX1cIj4nICtcbiAgICAgICAgICAgICc8c3VibWl0LWJ1dHRvbiBpY29uPVwiZmkteFwiIGxhYmVsPVwiQ2xvc2VcIiBjbGlja2VkPVwiYWJhbmRvblwiPjwvc3VibWl0LWJ1dHRvbj4nK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgXG5cbi8vIFNlcnZpY2UgQ3JlYXRlIHhmb3JtIGluc2VydCBmaWxlcyBpbiBhbmQgUG9zdCBpdCB0byB1cmxcbmZ1bmN0aW9uIExvYWRGaWxlU3ZjIChzY29wZSwgZmlsZXMsIGZpbGVDQikge1xuICAgIHZhciB4bWxSZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgeGZvcm0gID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHNsaWRlciBkdXJpbmcgVXBsb2FkXG4gICAgeG1sUmVxLnVwbG9hZC5vbnByb2dyZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGgucm91bmQoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSA/IGV2ZW50LmxvYWRlZCAqIDEwMCAvIGV2ZW50LnRvdGFsIDogMCk7XG4gICAgICAgIGlmIChzY29wZS5zbGlkZXIpIHNjb3BlLnNsaWRlci5zZXRWYWx1ZSAocHJvZ3Jlc3MpO1xuICAgIH07XG5cbiAgICAvLyBVcGxvYWQgaXMgZmluaXNoIGxldCdzIG5vdGlmeSBjb250cm9sZXIgY2FsbGJhY2tcbiAgICB4bWxSZXEub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzY29wZS5kaXZFbGVtLmFkZENsYXNzIChcInN1Y2Nlc3NcIik7XG4gICAgICAgIHNjb3BlLmRpdkVsZW0ucmVtb3ZlQ2xhc3MgKFwiZXJyb3JcIik7XG4gICAgICAgIHZhciByZXNwb25zZSA9e1xuICAgICAgICAgICAgc3RhdHVzIDogeG1sUmVxLnN0YXR1cyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHhtbFJlcS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSBcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuY2FsbGJhY2sgKHJlc3BvbnNlKTtcbiAgICB9O1xuXG4gICAgeG1sUmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjb3BlLmRpdkVsZW0uYWRkQ2xhc3MgKFwiZXJyb3JcIik7XG4gICAgICAgIHNjb3BlLmRpdkVsZW0ucmVtb3ZlQ2xhc3MgKFwic3VjY2Vzc1wiKTtcbiAgICB9O1xuXG4gICAgeG1sUmVxLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjb3BlLmRpdkVsZW0uYWRkQ2xhc3MgKFwiZXJyb3JcIik7XG4gICAgICAgIHNjb3BlLmRpdkVsZW0ucmVtb3ZlQ2xhc3MgKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgdmFyIHJlc3BvbnNlID17XG4gICAgICAgICAgICBzdGF0dXMgOiB4bWxSZXEuc3RhdHVzLFxuICAgICAgICAgICAgaGVhZGVyczogeG1sUmVxLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIFxuICAgICAgICB9O1xuICAgICAgICBzY29wZS5jYWxsYmFjayAocmVzcG9uc2UpO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy5wb3N0ZmlsZSA9IGZ1bmN0aW9uKHBvc3R1cmwpIHsgXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgbG9va3MgT0sgbGV0J3MgUG9zdCBpdFxuICAgICAgICB4bWxSZXEub3BlbihcIlBPU1RcIiwgcG9zdHVybCAsIHRydWUpO1xuICAgICAgICB4bWxSZXEuc2VuZCh4Zm9ybSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5maWxlID0gZmlsZXNbaV07XG4gICAgICAgIC8vIFVua25vdyBUeXBlICEhISBpZiAoIXRoaXMuZmlsZS50eXBlLm1hdGNoKHNjb3BlLm1pbWV0eXBlKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc29sZS5sb2cgKFwiU2VsZWN0ZWQgZmlsZT1cIiArIHRoaXMuZmlsZS5uYW1lICsgXCIgc2l6ZT1cIisgdGhpcy5maWxlLnNpemUvMTAyNCArIFwiIFR5cGU9XCIrIHRoaXMuZmlsZS50eXBlKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYmFzZW5hbWU9IHRoaXMuZmlsZS5uYW1lLnNwbGl0KCcvJykucmV2ZXJzZSgpWzBdO1xuXG4gICAgICAgIC8vIEZpbGUgdG8gdXBsb2FkIGlzIHRvbyBiaWdcbiAgICAgICAgaWYgKGlzTmFOKHRoaXMuZmlsZS5zaXplKSB8fCB0aGlzLmZpbGUuc2l6ZSA+IHNjb3BlLm1heHNpemUqMTAyNCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCAoZmlsZUNCLDEwMCk7ICAvLyBPbiBlcnJvciBhc3luY2hyb25vdXMgY2FsbGJhY2sgd2l0aG91dCBhcmd1bWVudFxuICAgICAgICAgICAgXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIC8vIElmIEZpbGUgaXMgcmVhZGFibGUgbGV0J3MgcmVhZCBpdFxuICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIodGhpcy5maWxlKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmaWxlQ0I7XG5cbiAgICAgICAgICAgIC8vIGlmIGV2ZXJ5dGhpbmcgaXMgT0sgbGV0J3MgYWRkIGZpbGUgdG8geGZvcm1cbiAgICAgICAgICAgIHhmb3JtLmFwcGVuZChzY29wZS5uYW1lLCB0aGlzLmZpbGUsIHRoaXMuZmlsZS5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYW5ndWxhci5tb2R1bGUoJ1VwbG9hZEZpbGVzJyxbJ0FwcENvbmZpZycsICdNb2RhbE5vdGlmaWNhdGlvbicsICdSYW5nZVNsaWRlciddKVxuXG4uZGlyZWN0aXZlKCd1cGxvYWRBcHBsaScsIFtcIkFwcENvbmZpZ1wiLCBcIkpRZW11XCIsIFwiTm90aWZpY2F0aW9uXCIsIFwiTW9kYWxGYWN0b3J5XCIsIFwiJHRpbWVvdXRcIiwgZnVuY3Rpb24oQXBwQ29uZmlnLCAgSlFlbXUsIE5vdGlmaWNhdGlvbiwgTW9kYWxGYWN0b3J5LCAkdGltZW91dCkge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgXG4gICAgICAgIC8vIGdldCB3aWRnZXQgaW1hZ2UgaGFuZGxlIGZyb20gdGVtcGxhdGVcbiAgICAgICAgc2NvcGUuaW5wdXRFbGVtICA9IGVsZW0uZmluZCgnaW5wdXQnKTtcbiAgICAgICAgc2NvcGUuZGl2RWxlbSAgICA9IGVsZW0uZmluZCgnZGl2Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBJbWFnZSB3YXMgY2tpY2sgbGV0J3Mgc2ltdWxhdGUgYW4gaW5wdXQgKGZpbGUpIGNsaWNrXG4gICAgICAgIHNjb3BlLmltZ0NsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5pbnB1dEVsZW1bMF0uY2xpY2soKTsgLy8gV2FybmluZyBBbmd1bGFyIFRyaWdnZXJFdmVudCBkb2VzIG5vdCB3b3JrISEhXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBTbGlkZXIgY29udHJvbCBoYW5kbGUgcmVnaXN0cmF0aW9uIGFmdGVyIGNyZWF0aW9uXG4gICAgICAgIHNjb3BlLlNsaWRlckluaXRDQj1mdW5jdGlvbiAoc2xpZGVyKSB7XG4gICAgICAgICAgIHNjb3BlLnNsaWRlcj0gc2xpZGVyOyBcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwbG9hZCBpcyBkZWxlZ2F0ZWQgdG8gYSBzaGFyZWQgZnVuY3Rpb25cbiAgICAgICAgc2NvcGUuVXBMb2FkRmlsZT1mdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGU7IFxuICAgICAgICAgICAgdmFyIGFwcGljb247XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBzdWNjZXNzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBMb29rcyBPSyBsZXQncyBQb3N0IFhmb3JtL0ZpbGVcbiAgICAgICAgICAgICAgICBoYW5kbGUucG9zdGZpbGUoYXR0cnMucG9zdHVybCArIFwiP3Rva2VuPVwiICsgQXBwQ29uZmlnLnNlc3Npb24udG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICR0aW1lb3V0IChmdW5jdGlvbigpIHtzY29wZS5tb2RhbC5kZXN0cm95KCk7fSwgMTAwMCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgYWJhbmRvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAkdGltZW91dCAoZnVuY3Rpb24oKSB7c2NvcGUubW9kYWwuZGVzdHJveSgpO30sIDEwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgcmVhZGVyQ0IgPSBmdW5jdGlvbiAodXBsb2FkKSB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBGaWxlIHVwbG9hZCBmYWlsIGhhbmRsZSBlcnJvclxuICAgICAgICAgICAgICAgIGlmICghIHVwbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmZpbGUuc2l6ZSA+IHNjb3BlLm1heHNpemUqMTAyNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwaWNvbiA9IHNjb3BlLmlzdG9vYmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU9IHRtcGxFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGhhbmRsZS5maWxlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBpY29uID0gc2NvcGUuaXNub3R2YWxpZDsgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0gdG1wbEVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgemlwYXBwID0gbmV3IEpTWmlwICh1cGxvYWQudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aHVtYm5haWwgPSB6aXBhcHAuZmlsZShcImljb25fMTI4LnBuZ1wiKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpcyB3ZSBoYXZlIGEgdGh1bWJuYWlsIHdpdGhpbiBsb2FkZWQgWmlwZmlsZVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRodW1ibmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiVGhpcyBpcyBub3QgYSB2YWxpZCBBcHBsaWNhdGlvbiBGcmFtZXdvcmsgQVBQXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwaWNvbiA9IHNjb3BlLmlzbm90dmFsaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0gdG1wbEVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Njb3BlLmltZ0VsZW1bMF0uc3JjID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RodW1ibmFpbC5hc0FycmF5QnVmZmVyKCldLCB7dHlwZTogXCJpbWFnZVwifSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwaWNvbiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aHVtYm5haWwuYXNBcnJheUJ1ZmZlcigpXSwge3R5cGU6IFwiaW1hZ2VcIn0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdG1wbE1vZGFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBodHRwOi8vZm91bmRhdGlvbi56dXJiLmNvbS9hcHBzL2RvY3MvIyEvYW5ndWxhci1tb2R1bGVzXG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uSW46ICdzbGlkZUluRnJvbVRvcCcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTY29wZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA6IHN1Y2Nlc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBhYmFuZG9uIDogYWJhbmRvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb24gICAgOiBhcHBpY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbmFtZSA6IGhhbmRsZS5iYXNlbmFtZVxuICAgICAgICAgICAgICAgICAgICB9LCB0ZW1wbGF0ZSA6IHRlbXBsYXRlXG4gICAgICAgICAgICAgICAgfTsgXG4gICAgICAgICAgICAgICAgLy8gUG9wdXAgTW9kYWwgdG8gcmVuZGVyIGFwcGxpY2F0aW9uIGRhdGFcbiAgICAgICAgICAgICAgICBzY29wZS5tb2RhbCA9IG5ldyBNb2RhbEZhY3RvcnkoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBzY29wZS5tb2RhbC5hY3RpdmF0ZSAoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIExvYWQgZmlsZSB3aXRoaW4gYnJvd3NlciBhbmQgaWYgT0sgY2FsbCByZWFkZXJDQlxuICAgICAgICAgICAgaGFuZGxlID0gbmV3IExvYWRGaWxlU3ZjIChzY29wZSwgZmlsZXMsIHJlYWRlckNCKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWxsaXplIGRlZmF1bHQgdmFsdWVzIGZyb20gYXR0cmlidXRlcyB2YWx1ZXNcbiAgICAgICAgc2NvcGUubmFtZT0gYXR0cnMubmFtZSB8fCAnYXBwbGknO1xuICAgICAgICBzY29wZS5jYXRlZ29yeT0gYXR0cnMuY2F0ZWdvcnkgIHx8ICdhcHBsaSc7XG4gICAgICAgIHNjb3BlLm1pbWV0eXBlPSAoYXR0cnMuYWNjZXB0IHx8ICcud2d0Jyk7XG4gICAgICAgIHNjb3BlLm1heHNpemUgPSBhdHRycy5tYXhzaXplIHx8IDEwMDAwMDsgLy8gZGVmYXVsdCBtYXggc2l6ZSAxMDBNQlxuICAgICAgICBzY29wZS5yZWdleHAgID0gbmV3IFJlZ0V4cCAoYXR0cnMuYWNjZXB0KyAnLionLCdpJyk7XG4gICAgICAgIHNjb3BlLmljb24gICAgPSBhdHRycy5pY29uIHx8ICdmaS11cGxvYWQnO1xuICAgICAgICBzY29wZS5sYWJlbCAgID0gYXR0cnMubGFiZWwgfHwgJ1VwbG9hZCc7XG4gICAgICAgIFxuICAgICAgICBpZiAoYXR0cnMudGh1bWJuYWlsKSBzY29wZS5pc25vdHZhbGlkPSBBcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLmlzbm90dmFsaWQ7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzbm90dmFsaWQ9QXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICd3M2Mtd2lkZ2V0LnBuZyc7XG5cbiAgICAgICAgaWYgKGF0dHJzLmlzdG9vYmlnKSBzY29wZS5pc3Rvb2JpZz0gQXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc3Rvb2JpZztcbiAgICAgICAgZWxzZSAgc2NvcGUuaXN0b29iaWc9QXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICdpc3Rvb2JpZy5wbmcnO1xuICAgICAgICBzY29wZS5ub3NsaWRlciA9IGF0dHJzLm5vc2xpZGVyIHx8IGZhbHNlO1xuXG4gICAgICAgIGlmICghYXR0cnMucG9zdHVybCkgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZS11cGxvYWQgJXMgcG9zdHVybD0vYXBpL3h4eHgveHh4eCByZXF1aXJlZCcsIHNjb3BlLmF0dHJzKTsgICAgICAgICAgICBcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgdGVtcGxhdGU6IHRtcGxBcHBsaSxcbiAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgY2FsbGJhY2sgOiAnPSdcbiAgICAgICAgfVxuICAgIH07XG4gICAgXG59XSk7XG5cbmNvbnNvbGUubG9nIChcIlVwbG9hZEZpbGUgTG9hZGVkXCIpO1xufSkoKTtcbiIsIlxuLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4uXG4gKi9cblxuXG5cbihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIHRtcGwgPSAnPHRpcC1tb2RhbCB0aXA9XCJ0aXBcIj48L3RpcC1tb2RhbD4nICtcbiAgICAgICAgICAgJzxsYWJlbCBmb3I9XCJ7e25hbWV9fS1pbnRleHRcIj57e2xhYmVsfX0gPGkgbmctc2hvdz1cInJlcXVpcmVkXCIgbmctY2xpY2s9XCJUb0JlRGVmaW5lZFwiICcgK1xuICAgICAgICAgICAnY2xhc3M9XCJyZXF1aXJlZCB7e3N0YXR1c319IGZpLWNoZWNrYm94XCIgdGl0bGU9XCJGcmVlIFZhbHVlIEJ1dCBNYW5kYXRvcnkgQXJndW1lbnRcIiBhbHQ9XCI/XCI+ICZuYnNwOyA8L2k+PC9sYWJlbD4nKyAgICAgICAgICBcbiAgICAgICAgICAgJzxpbnB1dCAnK1xuICAgICAgICAgICAnIHR5cGU9XCJ7e3R5cGV9fVwiIGlkPVwie3tuYW1lfX0taW50ZXh0XCIgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlaG9sZGVyfX1cIiAgY2xhc3M9XCJzdGF0dXMte3tzdGF0dXN9fVwiJytcbiAgICAgICAgICAgJyBuZy1tb2RlbD1cInZhbHVlXCIgbmctYmx1cj1cInZhbGlkYXRlKClcIiBuZy1mb2N1cz1cInNlbGVjdGVkKClcIiAnK1xuICAgICAgICAgICAnIG5nLW1vZGVsLW9wdGlvbnM9XCJ7IHVwZGF0ZU9uOiBcXCdkZWZhdWx0IGJsdXJcXCcsIGRlYm91bmNlOiB7ZGVmYXVsdDogNTAwLCBibHVyOiAwfSB9XCInICtcbiAgICAgICAgICAgJz48YWxlcnQgZGF0YS1uZy1zaG93PVwiIXZhbGlkJiZlcnJtc2dcIj57e2Vycm1zZ319PC9hbGVydD4nO1xuXG52YXIgZW1haWxwYXRlcm4gPSAvXigoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFtePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdezIsfSkkL2k7XG5cbmFuZ3VsYXIubW9kdWxlKCdJbnB1dFRleHQnLFsnSlF1ZXJ5RW11J10pXG5cbi5kaXJlY3RpdmUoJ2lucHV0VGV4dCcsIFtcIkpRZW11XCIsIGZ1bmN0aW9uKEpRZW11KSB7XG4gICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgIFxuICAgIC8vIGRlZmF1bHQgdmFsdWUgYXQgMXN0IHJlbmRlcmluZ1xuICAgIHNjb3BlLmVycm9yICA9IGZhbHNlO1xuICAgIHNjb3BlLnZhbGlkICA9IGZhbHNlO1xuICAgIHNjb3BlLnN0YXR1cyA9ICd1bnRvdWNoJztcbiAgIFxuICAgIHNjb3BlLmlucHV0ID0gZWxlbS5maW5kIChcImlucHV0XCIpO1xuICAgIHNjb3BlLnJlcXVpcmVkID0gMDtcbiAgICBcbiAgICAvLyByZXF1aXJlciBpcyB1c2UgdG8gaW5jcmVtZW50IHJlcXVlc3RlZCBjb3VudGVyXG4gICAgaWYgKFwicmVxdWlyZWRcIiBpbiBhdHRycykge1xuICAgICAgICBzY29wZS5yZXF1aXJlZCA9IDE7XG4gICAgICAgIGVsZW0uYWRkQ2xhc3MgKFwicmVxdWlyZWRcIik7XG4gICAgfVxuICAgICAgIFxuICAgICAvLyB1c2VyIGVudGVyIGlucHV0IHJlc2V0IGVycm9yIHN0YXR1c1xuICAgICBzY29wZS5zZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NvcGUuZXJyb3I9ZmFsc2U7IFxuICAgICAgICBzY29wZS5lcnJtc2c9ZmFsc2U7IFxuICAgICAgICBzY29wZS5zdGF0dXMgPSAndG91Y2gnO1xuICAgICB9OyAgIFxuICAgICAgICAgICAgXG4gICAgIHNjb3BlLnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgXG4gICAgICAgICAvLyBnZXQgdmFsdWUgZnJvbSBpbnB1dCBmaWVsZCBieXBhc3NpbmcgQW5ndWxhciBuZy1tb2RlbFxuICAgICAgICAgY29uc29sZS5sb2cgKFwiQ2xpY2tlZCBJbnB1dFRleHQgbmFtZT0lcyB2YWx1ZT0lcyB2YWxpZD0lc1wiLCBzY29wZS5uYW1lLCBzY29wZS52YWx1ZSwgc2NvcGUudmFsaWQpOyAgICAgICAgXG5cbiAgICAgICAgIC8vIGZvcm0gaXMgbm90IHVudG91Y2hlZCBhbnltb3JlXG4gICAgICAgICBzY29wZS5wYXJlbnQucmVtb3ZlQ2xhc3MgKFwibmctcHJpc3RpbmVcIik7XG5cbiAgICAgICAgIC8vIGlmIHZhbHVlIG5vdCBudWxsIGNsZWFuIHVwIHN0cmluZ1xuICAgICAgICAgaWYgKHNjb3BlLnZhbHVlKSB7XG4gICAgICAgICAgICAgc2NvcGUuZXJyb3I9ZmFsc2U7IFxuICAgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsbGluZyBzcGFjZVxuICAgICAgICAgICAgc2NvcGUudmFsdWUgPSBzY29wZS52YWx1ZS50cmltKCk7XG4gICAgICAgICBcbiAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgc3BhY2UgaXMgbm90IGFsbG93ZWRcbiAgICAgICAgICAgIGlmICgnbm9zcGFjZScgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlPXNjb3BlLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgXG4gICAgICAgICAgICBpZiAoJ2xvd2VyY2FzZScgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlID0gc2NvcGUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgbWluaW11bSBsZW5naHRcbiAgICAgICAgICAgIGlmIChcIm1pbmxlblwiIGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgIGlmIChzY29wZS52YWx1ZS5sZW5ndGggPCBhdHRycy5taW5sZW4pIHtcbiAgICAgICAgICAgICAgICAgc2NvcGUuc3RhdHVzPSdpbnZhbGlkJztcbiAgICAgICAgICAgICAgICAgc2NvcGUuZXJybXNnPXNjb3BlLm5hbWUgKyAnOiBNaW5pbnVtIExlbmdoPSAnICsgYXR0cnMubWlubGVuICsgJyBDaGFyYWN0ZXJzJztcbiAgICAgICAgICAgICAgICAgc2NvcGUuZXJyb3I9dHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoJ2VtYWlsJyBpbiBhdHRycykge1xuICAgICAgICAgICAgaWYgKCFlbWFpbHBhdGVybi50ZXN0IChzY29wZS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5zdGF0dXM9J2ludmFsaWQnO1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm1zZz0naW52YWxpZCBlbWFpbCBhZGRyZXNzJztcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcj10cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgICAgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgc2NvcGUuc3RhdHVzPSdpbnZhbGlkJztcbiAgICAgICAgICAgICAgICAgc2NvcGUuZXJybXNnPXNjb3BlLm5hbWUgKyAnOiBSZXF1aXJlZCBBdHRyaWJ1dGUnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJvcj10cnVlOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAvLyBJZiBsb2NhbCBjb250cm9sIGZhaWwgbGV0J3MgcmVmdXNlIGlucHV0XG4gICAgICAgICBpZiAoc2NvcGUuZXJyb3IpIHtcbiAgICAgICAgICAgICBpZiAoc2NvcGUucmVxdWlyZWQgJiYgc2NvcGUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgc2NvcGUudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmw0YWNvdW50ZXIudmFsaWRhdGVkID4gMCkgc2NvcGUubDRhY291bnRlci52YWxpZGF0ZWQgLS07XG4gICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAvLyB1c2UgY2FsbCB0byB1cGRhdGUgZm9ybSBzY29wZSBvbiBmb3JtIGNvbXBsZXRlbmVzc1xuICAgICAgICAgICAgIHNjb3BlLmNhbGxiYWNrIChhdHRycy5uYW1lLCBudWxsLCBzY29wZS5kb25lKTtcbiAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgIC8vIGxvY2FsY2hlY2sgaXMgT0sgYmFja3VwIG1heSBuZXZlcnRoZWxlc3MgY2hhbmdlIHN0YXR1cyB0byBmYWxzZVxuICAgICAgICAgICAgaWYgKHNjb3BlLnJlcXVpcmVkICAmJiAhc2NvcGUudmFsaWQpIHNjb3BlLmw0YWNvdW50ZXIudmFsaWRhdGVkICsrO1xuICAgICAgICAgICAgc2NvcGUuc3RhdHVzPSd2YWxpZCc7XG4gICAgICAgICAgICBzY29wZS52YWxpZD10cnVlO1xuICAgICAgICAgICAgc2NvcGUuY2FsbGJhY2sgKGF0dHJzLm5hbWUsIHNjb3BlLnZhbHVlLCBzY29wZS5kb25lKTtcbiAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZnJvbSBjb250cm9sbGVyIHRvIHVwZGF0ZSB3aWRnZXQgc3RhdHVzXG4gICAgIHNjb3BlLmRvbmU9ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICBjb25zb2xlLmxvZyAoXCJUZXh0LUlucHV0IENhbGxiYWNrIElEPVwiKyBhdHRycy5uYW1lICsgXCIgZGF0YT1cIiwgZGF0YSk7XG4gICAgICAgZm9yICh2YXIgaSBpbiBkYXRhKSBzY29wZVtpXSA9IGRhdGFbaV07ICAgICAgICAgXG4gICAgIH07XG4gICAgIFxuICAgICAvLyBFeHBvcnQgc29tZSBhdHRyaWJ1dGVzIHdpdGhpbiBkaXJlY3RpdmUgc2NvcGUgZm9yIHRlbXBsYXRlXG4gICAgIHNjb3BlLmxhYmVsICAgICAgID0gYXR0cnMubGFiZWw7XG4gICAgIHNjb3BlLm5hbWUgICAgICAgID0gYXR0cnMubmFtZTtcbiAgICAgc2NvcGUucGxhY2Vob2xkZXIgPSBhdHRycy5wbGFjZWhvbGRlcjtcbiAgICAgc2NvcGUudHlwZSAgICAgICAgPSBhdHRycy50eXBlIHx8IFwidGV4dFwiO1xuICAgICBzY29wZS50aXAgICAgICAgICA9IGF0dHJzLnRpcDtcblxuICAgICAvLyBzZWFyY2ggZm9yIGZvcm0gd2l0aGluIHBhcmVudCBlbGVtbnRzXG4gICAgIHNjb3BlLnBhcmVudCA9IEpRZW11LnBhcmVudCAoZWxlbSwgXCJGT1JNXCIpO1xuXG4gICAgIC8vIGVtYWlsIGVuZm9yY2UgbG93ZXJjYXNlIGFuZCBub3NwYWNlICAgXG4gICAgIGlmIChcImVtYWlsXCIgaW4gYXR0cnMpIHtcbiAgICAgICAgYXR0cnMubG93ZXJjYXNlPXRydWU7IFxuICAgICAgICBhdHRycy5ub3NwYWNlPXRydWU7IFxuICAgICAgICBhdHRycy5taW5sZW49NjsgXG4gICAgIH1cblxuICAgICBpZiAoc2NvcGUucmVxdWlyZWQpIHtcbiAgICAgICAgIHNjb3BlLmw0YWNvdW50ZXIgPSBzY29wZS5wYXJlbnQuZGF0YSAoXCJsNGFjb3VudGVyXCIpO1xuICAgICAgICAgaWYgKCFzY29wZS5sNGFjb3VudGVyKSB7IFxuICAgICAgICAgICAgc2NvcGUubDRhY291bnRlciA9ICB7cmVxdWlyZWQ6MSwgdmFsaWRhdGVkOjB9O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZCBcIitzY29wZS5uYW1lK1wiIGlzIHJlcXVpcmVkICgxc3QpXCIpO1xuICAgICAgICAgICAgc2NvcGUucGFyZW50LmRhdGEgKFwibDRhY291bnRlclwiLCBzY29wZS5sNGFjb3VudGVyKTsgXG4gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmllbGQgXCIrc2NvcGUubmFtZStcIiBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgICAgICBzY29wZS5sNGFjb3VudGVyLnJlcXVpcmVkICsrO1xuICAgICAgICAgfVxuICAgICB9XG4gICAgICAgICBcbiAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIGVhY2ggdGltZSBjb250cm9sZXIgdXBkYXRlIHZhbHVlXG4gICAgIHNjb3BlLiR3YXRjaCAoJ3ZhbHVlJywgZnVuY3Rpb24oKXtcbiAgICAgICAgIGlmKHNjb3BlLnZhbHVlKSBzY29wZS52YWxpZGF0ZSgpOyB9XG4gICAgICk7XG4gICAgXG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6ICc9JyxcbiAgICAgICAgICAgIHZhbHVlOiAnPSdcbiAgICAgICAgfVxuICAgIH07XG59XSk7XG5cbmNvbnNvbGUubG9nIChcIklucHV0VGV4dCBMb2FkZWRcIik7XG59KSgpO1xuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB0bXBsID0gJzxpbnB1dC10ZXh0ICBjbGFzcz1cInBhc3N3b3JkXCIgdGlwPVwie3t0aXAxfX1cIiAgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlMX19XCInICtcbiAgICAgICAgICAgJ2xhYmVsPVwie3tsYWJlbDF9fVwiIGNhbGxiYWNrPVwidmFsaWQxXCIgbmFtZT1cInt7bmFtZX19LTFcIiB2YWx1ZT1cInBhc3MxXCIgcmVxdWlyZWQgbWlubGVuPVwie3ttaW5sZW59fVwiIHR5cGU9XCJwYXNzd29yZFwiID4nICtcbiAgICAgICAgICAgJzwvaW5wdXQtdGV4dD4nICsgXG4gICAgICAgICAgICc8aW5wdXQtdGV4dCAgY2xhc3M9XCJwYXNzd29yZFwiIHRpcD1cInRpcDJcIiAgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlMn19XCInICtcbiAgICAgICAgICAgJ2xhYmVsPVwie3tsYWJlbDJ9fVwiIGNhbGxiYWNrPVwidmFsaWQyXCIgbmFtZT1cInt7bmFtZX19LTJcIiB2YWx1ZT1cInBhc3MyXCIgcmVxdWlyZWQgbWlubGVuPVwie3ttaW5sZW59fVwiIHR5cGU9XCJwYXNzd29yZFwiID4gJytcbiAgICAgICAgICAgJzwvaW5wdXQtdGV4dD4nO1xuXG5hbmd1bGFyLm1vZHVsZSgnSW5wdXRQYXNzd29yZCcsW10pXG5cbi5kaXJlY3RpdmUoJ2lucHV0UGFzc3dvcmQnLCBmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgXG4gICAgc2NvcGUudmFsaWQxID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nIChcIkNsaWNrZWQgSW5wdXRQYXNzd29yZDEgbmFtZT0lcyB2YWx1ZT0lc1wiLCBuYW1lLCB2YWx1ZSk7ICAgICAgICBcbiAgICAgICAgc2NvcGUuZmlyc3Rwd2QgPSB2YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHNjb3BlLnZhbGlkMiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgZG9uZSkgeyAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nIChcIkNsaWNrZWQgSW5wdXRQYXNzd29yZDIgbmFtZT0lcyB2YWx1ZT0lc1wiLCBuYW1lLCB2YWx1ZSk7ICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIGlmIGJvdGggcGFzc3dkIGVxdWFsIHRoZW4gY2FsbCBmb3JtIENCXG4gICAgICAgIGlmIChzY29wZS5maXJzdHB3ZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICBkb25lKHt2YWxpZDogZmFsc2UsIHN0YXR1czogJ2ludmFsaWQnLCBlcnJtc2c6IFwiYm90aCBwYXNzd29yZCBzaG91bGQgbWF0Y2hcIn0pOyAgXG4gICAgICAgIH0gZWxzZSB7ICBcbiAgICAgICAgICBzY29wZS5jYWxsYmFjayAoYXR0cnMubmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZnJvbSBjb250cm9sbGVyIHRvIHVwZGF0ZSB3aWRnZXQgc3RhdHVzXG4gICAgIHNjb3BlLmRvbmU9ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICBjb25zb2xlLmxvZyAoXCJUZXh0LUlucHV0IENhbGxiYWNrIElEPVwiKyBhdHRycy5uYW1lICsgXCIgZGF0YT1cIiwgZGF0YSk7XG4gICAgICAgZm9yICh2YXIgaSBpbiBkYXRhKSBzY29wZVtpXSA9IGRhdGFbaV07ICAgICAgICAgXG4gICAgIH07XG4gICAgIFxuICAgICAvLyBFeHBvcnQgc29tZSBhdHRyaWJ1dGVzIHdpdGhpbiBkaXJlY3RpdmUgc2NvcGUgZm9yIHRlbXBsYXRlXG4gICAgIHNjb3BlLm5hbWUgICA9IGF0dHJzLm5hbWU7XG4gICAgIHNjb3BlLmxhYmVsMSA9IGF0dHJzLmxhYmVsIHx8ICdQYXNzd29yZCc7XG4gICAgIHNjb3BlLmxhYmVsMiA9IGF0dHJzLmxhYmVsIHx8ICdQYXNzd29yZCBWZXJpZmljYXRpb24nO1xuICAgICBzY29wZS5wbGFjZTEgPSBhdHRycy5wbGFjZWhvbGRlcjEgfHwgJ1VzZXIgUGFzc3dvcmQnO1xuICAgICBzY29wZS50aXAxICAgPSBhdHRycy50aXAgfHwgJ0Nob29zZSBhIFBhc3N3b3JkJztcbiAgICAgc2NvcGUucGxhY2UyID0gYXR0cnMucGxhY2Vob2xkZXIxIHx8ICdQYXNzd29yZCBWZXJpZmljYXRpb24nO1xuICAgICBzY29wZS50aXAyICAgPSBhdHRycy50aXAgICAgfHwgJ0NvbmZpcm1lIHlvdXIgUGFzc3dvcmQnO1xuICAgICBzY29wZS5taW5sZW4gPSBhdHRycy5taW5sZW4gfHwgMTA7XG4gICAgIFxuICAgICBpZiAoXCJyZXF1aXJlZFwiIGluIGF0dHJzKSBzY29wZS5yZXF1aXJlZCA9ICdyZXF1aXJlZCc7XG4gICAgICAgICBcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogJz0nLFxuICAgICAgICB9XG4gICAgfTtcbn0pO1xuXG5jb25zb2xlLmxvZyAoXCJJbnB1dFBhc3N3b3JkIExvYWRlZFwiKTtcbn0pKCk7XG4iLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiAqIFxuICogQnVnczogSW5wdXQgd2l0aCBDYWxsYmFjayBTSE9VTEQgQkUgZ2V0ICdyZXF1aXJlZCcgY2xhc3NcbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB0bXBsID0gJzxkaXYgIG5nLWNsaWNrPVwiY2xpY2tlZCgpXCI+JyArXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJ7e2ljb259fVwiPjwvaT4nICtcbiAgICAgICAgICAgICc8c3Bhbj57e2xhYmVsfX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcblxuICAgIGFuZ3VsYXIubW9kdWxlKCdTdWJtaXRCdXR0b24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ3N1Ym1pdEJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhanVzdCBpY29uIG9yIHVzZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmljb24gPSBhdHRycy5pY29uIHx8ICdmaS1mb290JztcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUubGFiZWwgPSBhdHRycy5sYWJlbCB8fCAnTmV4dCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbGFiZWwgYXMgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAoc2NvcGUubGFiZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiBjbGlja2VkIGluIGltcG9ydGVkIGFuZCB3aGVuIHRlbXBsYXRlIGlzIGNsaWNrZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBjYWxsIGNsaWNrZWQgbWV0aG9kIHBhc3NlZCBpbiBwYXJhbS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgICAgICAgICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IHtjbGlja2VkIDogJz0nfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbn0pKCk7XG4iLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiAqIFxuICogQnVnczogSW5wdXQgd2l0aCBDYWxsYmFjayBTSE9VTEQgQkUgZ2V0ICdyZXF1aXJlZCcgY2xhc3NcbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB0bXBsQXBwbGkgPSAnPGRpdiAgbmctY2xpY2s9XCJjbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aW1nIG5nLXNyYz1cInt7aWNvbn19XCI+JyArXG4gICAgICAgICAgICAnPHNwYW4+e3tsYWJlbH19PC9zcGFuPicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgXG4gICAgdmFyIHRtcGxNb2RhbCA9IFxuICAgICAgICAgICAgJzxiIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgbmctY2xpY2s9XCJjbG9zZSgpXCI+w5c8L2I+JyArXG4gICAgICAgICAgICAnPGltZyBuZy1zcmM9XCJ7e2ljb259fVwiPicgK1xuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwibW9kYWwtdGV4dFwiPkFwcGxpY2F0aW9uIDxiPnt7bGFiZWx9fTwvYj48L3NwYW4+JyArXG4gICAgICAgICAgICAnPHVsIGNsYXNzPVwidmVydGljYWwgaWNvbi1sZWZ0IHByaW1hcnkgbWVudS1iYXIgYXBwbGktbWVudS1zdGFydFwiPicgK1xuICAgICAgICAgICAgJzxsaSBjbGFzcz1zdGFydC17e3J1bnN0YXR1c319PjxhIG5nLWNsaWNrPWFjdGlvbihcInN0YXJ0XCIpPjxpIGNsYXNzPVwiZmktY2hlY2tcIj4gU3RhcnQ8L2k+PC9hPjwvbGk+JyArXG4gICAgICAgICAgICAnPGxpIGNsYXNzPXN0b3Ate3tydW5zdGF0dXN9fT48YSBuZy1jbGljaz1hY3Rpb24oXCJzdG9wXCIpPjxpIGNsYXNzPVwiZmkteFwiPiBTdG9wPC9pPjwvYT48L2xpPicgK1xuICAgICAgICAgICAgJzxsaT48YSBuZy1jbGljaz1hY3Rpb24oXCJpbmZvXCIpPjxpIGNsYXNzPVwiZmktaW5mb1wiPiBJbmZvPC9pPjwvYT48L2xpPicgK1xuICAgICAgICAgICAgJzxsaSBjbGFzcz1zdGFydC17e3J1bnN0YXR1c319PjxhIG5nLWNsaWNrPWFjdGlvbihcInVuaW5zdGFsbFwiKT48aSBjbGFzcz1cImZpLXhcIj4gVW5pbnN0YWxsPC9pPjwvYT48L2xpPicgK1xuICAgICAgICAgICAgJzwvdWw+JyArXG4gICAgICAgICAgICAnJztcbiAgICBcbiAgICB2YXIgdG1wbERldGFpbCA9IFxuICAgICAgICAgICAgJzxiIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgbmctY2xpY2s9XCJjbG9zZSgpXCI+w5c8L2I+JyArXG4gICAgICAgICAgICAnPGltZyBuZy1zcmM9XCJ7e2ljb259fVwiPicgK1xuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwibW9kYWwtdGV4dFwiPkFwcGxpY2F0aW9uIDxiPnt7bGFiZWx9fTwvYj48L3NwYW4+JyArXG4gICAgICAgICAgICAnPHVsIGNsYXNzPVwidmVydGljYWwgaWNvbi1sZWZ0IGFwcGxpLW1lbnUtaW5mb1wiPicgK1xuICAgICAgICAgICAgJzxsaT48aSBjbGFzcz1cImZpLXBhcGVyY2xpcFwiPiBOYW1lIDoge3tkZXRhaWwubmFtZX19IDwvaT48L2xpPicgK1xuICAgICAgICAgICAgJzxsaT48aSBjbGFzcz1cImZpLWluZm9cIj4gRGVzY3JpcHRpb24ge3tkZXRhaWwuZGVzY3JpcHRpb259fTwvaT48L2xpPicgK1xuICAgICAgICAgICAgJzxsaT48aSBjbGFzcz1cImZpLXRvcnNvXCI+IEF1dGhvciA6IHt7ZGV0YWlsLmF1dGhvcn19PC9pPjwvbGk+JyArXG4gICAgICAgICAgICAnPC91bD4nICtcbiAgICAgICAgICAgICcnO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ0FwcGxpQnV0dG9uJywgW10pXG4gICAgICAgICAgICAuZGlyZWN0aXZlKCdhcHBsaUJ1dHRvbicsIFtcIkFwcENvbmZpZ1wiLCBcIkFwcENhbGxcIiwgXCJNb2RhbEZhY3RvcnlcIiwgXCJOb3RpZmljYXRpb25cIiwgXCIkdGltZW91dFwiLCBcIiR3aW5kb3dcIiwgXCIkbG9jYXRpb25cIiwgXCJ1cmxxdWVyeVwiLCBmdW5jdGlvbiAoQXBwQ29uZmlnLCBBcHBDYWxsLCBNb2RhbEZhY3RvcnksIE5vdGlmaWNhdGlvbiwgJHRpbWVvdXQsICR3aW5kb3csICRsb2NhdGlvbiwgdXJscXVlcnkpIHtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucnVuc3RhdHVzID0gXCJzdG9wXCI7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnJ1bm1vZGUgICA9IHVybHF1ZXJ5LnJ1bm1vZGUgfHwgXCJhdXRvXCI7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmNsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3RpZnlFcnJvciA9IGZ1bmN0aW9uKGFjdGlvbiwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uZXJyb3IgKHttZXNzYWdlOiBcIkZhaWwgL2FwaS9hZm0tbWFpblwiICsgYWN0aW9uICsgXCI9XCIgKyBzY29wZS5sYWJlbCArIFwiIFJ1bklEPVwiKyBzY29wZS5hcHBJRCwgZGVsYXk6IDUwMDB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzIChcImZhaWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyAoXCJzdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmNhbGxiYWNrIChzY29wZS5hcHBJRCwgYWN0aW9uLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm90aWZ5U3VjY2VzcyA9IGZ1bmN0aW9uIChhY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyAoXCJmYWlsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnJ1bklEID0gcmVzcG9uc2UuZGF0YS5yZXNwb25zZS5ydW5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5jYWxsYmFjayAoc2NvcGUuYXBwSUQsIGFjdGlvbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb3NlTW9kQXBwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kQXBwLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGltZW91dCAoZnVuY3Rpb24oKSB7c2NvcGUubW9kQXBwLmRlc3Ryb3koKTt9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9zZU1vZEluZm8gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tb2RJbmZvLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGltZW91dCAoZnVuY3Rpb24oKSB7c2NvcGUubW9kSW5mby5kZXN0cm95KCk7fSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uTW9kYWwgPSBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJNb2RhbCBBY3Rpb249JXNcIiwgYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0YXJ0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUucnVuc3RhdHVzICE9PSBcInN0b3BcIikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwiYWZtLW1haW5cIiwgXCJzdGFydFwiLCB7aWQ6IHNjb3BlLmFwcElELCBtb2RlOiBzY29wZS5ydW5tb2RlfSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDAgfHwgcmVzcG9uc2UuZGF0YS5qdHlwZSAhPT0gXCJBSkJfcmVwbHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvciAoXCJzdGFydFwiLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUucnVuc3RhdHVzPVwic3RhcnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlTdWNjZXNzIChhY3Rpb24sIHJlc3BvbnNlKTtcblx0XHRcdFx0XHRpZihyZXNwb25zZS5kYXRhLnJlc3BvbnNlLnVyaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUud2luYXBwPSAkd2luZG93Lm9wZW4ocmVzcG9uc2UuZGF0YS5yZXNwb25zZS51cmkucmVwbGFjZShcIiVoXCIsICRsb2NhdGlvbi5ob3N0KCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RvcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnJ1bnN0YXR1cyAhPT0gXCJzdGFydFwiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcImFmbS1tYWluXCIsIFwidGVybWluYXRlXCIsIHtydW5pZDogc2NvcGUucnVuSUR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCB8fCByZXNwb25zZS5kYXRhLmp0eXBlICE9PSBcIkFKQl9yZXBseVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yIChcInN0b3BcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnJ1bnN0YXR1cz1cInN0b3BcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIHJlbW90ZSB3aW5kb3cgYXBwIHdhcyBvcGVuIGxldCdzIGNsb3NlIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLndpbmFwcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIkNsb3NpbmcgQXBwbGljYXRpb24gV2luZG93IGxhYmVsPSVzIGlkPSVzXCIsIHNjb3BlLmxhYmVsLCBzY29wZS5hcHBJRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUud2luYXBwLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUud2luYXBwPWZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlTdWNjZXNzIChhY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJhZm0tbWFpblwiLCBcImRldGFpbFwiLCB7aWQ6IHNjb3BlLmFwcElEfSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDAgfHwgcmVzcG9uc2UuZGF0YS5qdHlwZSAhPT0gXCJBSkJfcmVwbHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvciAoXCJkZXRhaWxcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBodHRwOi8vZm91bmRhdGlvbi56dXJiLmNvbS9hcHBzL2RvY3MvIyEvYW5ndWxhci1tb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uSW46ICdzbGlkZUluRnJvbVRvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTY29wZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgICA6IGNsb3NlTW9kSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24gICAgOiBzY29wZS5pY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgICA6IHNjb3BlLmFwcElELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsICA6IHJlc3BvbnNlLmRhdGEucmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGVtcGxhdGUgOiB0bXBsRGV0YWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9wdXAgTW9kYWwgdG8gcmVuZGVyIGFwcGxpY2F0aW9uIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tb2RJbmZvID0gbmV3IE1vZGFsRmFjdG9yeShjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZEluZm8uYWN0aXZhdGUgKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInVuaW5zdGFsbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnJ1bnN0YXR1cyAhPT0gXCJzdG9wXCIpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcImFmbS1tYWluXCIsIFwidW5pbnN0YWxsXCIsIHtpZDogc2NvcGUuYXBwSUR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCB8fCByZXNwb25zZS5kYXRhLmp0eXBlICE9PSBcIkFKQl9yZXBseVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yIChcInVuaW5zdGFsbFwiLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5U3VjY2VzcyAoYWN0aW9uLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJBY3Rpb25Nb2RhbCB1bmtub3duIGFjdGlvbj1bJXNdXCIsIGFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VNb2RBcHAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBodHRwOi8vZm91bmRhdGlvbi56dXJiLmNvbS9hcHBzL2RvY3MvIyEvYW5ndWxhci1tb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbkluOiAnc2xpZGVJbkZyb21Ub3AnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTY29wZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gICA6IGFjdGlvbk1vZGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5zdGF0dXM6IHNjb3BlLnJ1bnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgICAgOiBjbG9zZU1vZEFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbiAgICAgOiBzY29wZS5pY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCAgICA6IHNjb3BlLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGVtcGxhdGUgIDogdG1wbE1vZGFsXG4gICAgICAgICAgICAgICAgICAgICAgICB9OyBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVwIE1vZGFsIHRvIHJlbmRlciBhcHBsaWNhdGlvbiBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tb2RBcHAgPSBuZXcgTW9kYWxGYWN0b3J5KGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tb2RBcHAuYWN0aXZhdGUgKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIEFwcElEK1N0b3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRycy5oYW5kbGUgJiYgc2NvcGUuc3RvcmUgW2F0dHJzLmhhbmRsZV0ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiAgPSBBcHBDb25maWcucGF0aHMuaWNvbnMgKyBhdHRycy5oYW5kbGU7IC8vc2NvcGUuc3RvcmUgW2F0dHJzLmhhbmRsZV0ubmFtZS50b0xvd2VyQ2FzZSgpICsgJy1pY28ucG5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsID0gc2NvcGUuc3RvcmUgW2F0dHJzLmhhbmRsZV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmFwcElEPSBhdHRycy5oYW5kbGU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiAgPSBBcHBDb25maWcucGF0aHMuaWNvbnMgKyAndzNjLWljby5wbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsID0gYXR0cnMuaGFuZGxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbGFiZWwgYXMgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAoc2NvcGUubGFiZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiBjbGlja2VkIGluIGltcG9ydGVkIGFuZCB3aGVuIHRlbXBsYXRlIGlzIGNsaWNrZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBjYWxsIGNsaWNrZWQgbWV0aG9kIHBhc3NlZCBpbiBwYXJhbS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRtcGxBcHBsaSxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge2NhbGxiYWNrOiAnPScsIHN0b3JlOiAnPSd9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1dKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFdBUk5JTkc6IG1ha2Ugc3VyZSB0aGFuIGFwcC9mcm9udGVuZC9zZXJ2aWNlcy9BcHBDb25maWcuanMgbWF0Y2ggeW91ciBzZXJ2ZXJcblxuLy8gbGlzdCBhbGwgcmVwZW5kZW5jaWVzIHdpdGhpbiB0aGUgcGFnZSArIGNvbnRyb2xlciBpZiBuZWVkZWRcbmFuZ3VsYXIubW9kdWxlKCdEYXNoYm9hcmRNb2R1bGUnLCBbJ1N1Ym1pdEJ1dHRvbicsICdUb2tlblJlZnJlc2gnLCAnQXBwbGlCdXR0b24nXSlcblxuICAuY29udHJvbGxlcignRGFzaGJvYXJkQ29udHJvbGxlcicsIFtcIkFwcENhbGxcIiwgXCJOb3RpZmljYXRpb25cIiwgZnVuY3Rpb24gKEFwcENhbGwsIE5vdGlmaWNhdGlvbikge1xuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzOyAvLyBJIGhhdGUgSmF2YVNjcmlwdFxuICAgICAgICBzY29wZS51dWlkICAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS50b2tlbiAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zZXNzaW9uPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zdGF0dXMgPVwiZXJyLW5vXCI7XG4gICAgICAgIHNjb3BlLmFwcGxpSURzID1bXTsgLy8gYXJyYXkgdG8gaG9sZCBhcHBsaWNhdGlvbnMgSURcbiAgICAgICAgc2NvcGUuYXBwbGlTdG9yZT17fTsgLy8gYXJyYXkgdG8gaG9sZCBhcHBsaWNhdGlvbnMganNvbiBkZXNjcmlwdGlvblxuXG4gICAgICAgXG4gICAgICAgIHNjb3BlLkFwcGxpQ0IgPSBmdW5jdGlvbihhcHBsaUlELCBhY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gQWN0aW9uIGlzIGRvbmUgd2l0aGluIFdpZGdldCBDb250cm9sbGVyIG9ubHkgdXBkYXRlIGRlYnVnIFVJIHpvbmVcbiAgICAgICAgICAgICAgICBzY29wZS5yZXF1ZXN0ICA9IGFjdGlvbjsgXG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyY29kZSAgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHNjb3BlLnJlc3BvbnNlID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPbiBhcHAgd2FzIHJlbW92ZWQgbGV0J3MgdXBkYXRlIHJ1bm5hYmxlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSBcInVuaW5zdGFsbFwiKSAgc2NvcGUuR2V0UnVubmFibGVzKCk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5HZXRSdW5uYWJsZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIkRhc2hib2FyZCBHZXRSdW5uYWJsZXNcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcImFmbS1tYWluXCIsIFwicnVubmFibGVzXCIsIHsvKnF1ZXJ5Ki99LCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkZWJ1ZyBVSSB6b25lXG4gICAgICAgICAgICAgICAgc2NvcGUucmVxdWVzdCAgPSBcIi9hcGkvYWZtLW1haW4vcnVubmFibGVcIjsgXG4gICAgICAgICAgICAgICAgc2NvcGUucmVzcG9uc2UgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycmNvZGUgID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJIb29wIEdldFJ1bm5hYmxlIGZhaWxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgZnJvbSBCaW5kZXJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yZXF1ZXN0Lmp0eXBlICE9PSBcIkFKQl9yZXBseVwiICYmIHJlc3BvbnNlLmRhdGEucmVxdWVzdC5hcGkgIT09IFwicnVubmFibGVzXCIpIHtcbiAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5lcnJvciAoe21lc3NhZ2U6IFwiSW52YWxpZCBSZXNwb25kIHRvIC9vcGEvYWZtLW1haW4vcnVubmFibGUgcmVzcG9uc2UuZGF0YT1cIityZXNwb25zZS5kYXRhLCBkZWxheTogNTAwMH0pOyBcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gbG9vcCBvbiBydW5uYWJsZSBhcHBsaWNhdGlvbiB0byBwcmVwYXJlIGZvciBkaXNwbGF5XG4gICAgICAgICAgICAgICAgdmFyICBhcHBsaUlEcz1bXTtcbiAgICAgICAgICAgICAgICB2YXIgIHJ1bm5hYmxlcyA9IHJlc3BvbnNlLmRhdGEucmVzcG9uc2UucnVubmFibGVzO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeD0wOyBpZHggPCBydW5uYWJsZXMubGVuZ3RoOyBpZHggKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbGlJRHNbaWR4XSA9IHJ1bm5hYmxlcyBbaWR4XS5pZDtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuYXBwbGlTdG9yZSBbcnVubmFibGVzIFtpZHhdLmlkXSA9ICBydW5uYWJsZXMgW2lkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjb3BlLmFwcGxpSURzID0gYXBwbGlJRHM7IC8vIGF2b2lkIHBhcnRpYWwgdXBkYXRlIHRvIGxpbWl0IFVJIHJlZnJlc2hcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0pOyAgICAgICAgICAgIFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2NvcGUuRmlsZVVwbG9hZGVkID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJmaWxlIFVwbG9hZGVkXCIpO1xuICAgICAgICAgICAgLy8gQ2Fubm90IGRpc3BsYXkgcG9zdCByZXN1bHRzIGFzIEdldFJ1bm5hYmxlIHdpbGwgb3ZlcmxvYWQgdGhlbSBheW5jaHJvbm91c2x5XG4gICAgICAgICAgICBzY29wZS5yZXF1ZXN0ICA9IFwiL2FwaS9hZm0tbWFpbi9pbnN0YWxsXCI7IFxuICAgICAgICAgICAgc2NvcGUucmVzcG9uc2UgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgc2NvcGUuZXJyY29kZSAgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgbG9va3MgT0sgdXBkYXRlIGFwcCBsaXN0XG4gICAgICAgICAgICBzY29wZS5HZXRSdW5uYWJsZXMoKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLkF1dG9TdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIkF1dG9TdGFydCByZXF1ZXN0aW5nIEFwcHMgbGlzdFwiKTtcbiAgICAgICAgICAgIHNjb3BlLkdldFJ1bm5hYmxlcygpO1xuICAgICAgICB9O1xuICAgICAgICAgIFxuICAgfV0pO1xuXG5jb25zb2xlLmxvZyAoXCJEYXNoYm9hcmQgQ29udHJvbGxlciBMb2FkZWRcIik7XG59KSgpOyAiLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICogXG4gKiBVc2FnZTpcbiAqIFxuICogICAvLyBtb3VzZSBldmVudCBwcm9iYWJseSBwb2ludCBvbiBpY29uIGFuZCBub3Qgb24gYnV0dG9uIGRpdlxuICogICAuLi4gbmctY2xpY2s9XCJMb2NrQ2hhbm5lbCgkZXZlbnQpXG4gICAgIHZhciB0YXJnZXQ9IGFuZ3VsYXIuZWxlbWVudChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgdmFyIGJ1dHRvbj0gSlFlbXUuRmluZEluUGFyZW50ICh0YXJnZXQsICdkaXYnKTtcbiAqIFxuICovXG5cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cblxuICAgICAgICAgIFxuICAgIC8vIF9hbGwgbW9kdWxlcyBvbmx5IHJlZmVyZW5jZSBkZXBlbmRlbmNpZXNcbiAgICBhbmd1bGFyLm1vZHVsZSgnSlF1ZXJ5RW11JywgW10pXG5cbiAgICAgICAgICAgIC8vIEZhY3RvcnkgaXMgYSBzaW5nbGV0b24gYW5kIHNoYXJlIGl0cyBjb250ZXh0IHdpdGhpbiBhbGwgaW5zdGFuY2VzLlxuICAgICAgICAgICAgLmZhY3RvcnkoJ0pRZW11JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIEZpbmRJblBhcmVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHNlbGVjdG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT09IHBhcmVudFswXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEhUTUxEaXZFbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyICBGaW5kQnlUYWc9IGZ1bmN0aW9uIChlbGVtZW50LCB0YWcsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2ggPSBzZWxlY3Rvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSAgID0gdGFnLnRvTG93ZXJDYXNlKCkrIFwiTmFtZVwiO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlblswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PT0gY2hpbGRyZW5bMF1bdHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBIVE1MRGl2RWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyICBGaW5kQnlDbGFzcz0gZnVuY3Rpb24gKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2ggPSBzZWxlY3Rvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlblswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmhhc0NsYXNzKHNlYXJjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBIVE1MRGl2RWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIgbXlNZXRob2RzID0ge1xuICAgICAgICAgICAgICAgICAgICBGaW5kSW5QYXJlbnQ6IEZpbmRJblBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgRmluZEJ5VGFnOiBGaW5kQnlUYWcsXG4gICAgICAgICAgICAgICAgICAgIEZpbmRCeUNsYXNzOiBGaW5kQnlDbGFzc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbXlNZXRob2RzO1xuICAgICAgICAgICAgfSk7XG5cbn0pKCk7IiwidmFyIGZvdW5kYXRpb25Sb3V0ZXMgPSBbe1wibmFtZVwiOlwiRGFzaGJvYXJkXCIsXCJ1cmxcIjpcIi9kYXNoYm9hcmRcIixcImNvbnRyb2xsZXJcIjpcIkRhc2hib2FyZENvbnRyb2xsZXIgYXMgY3RybFwiLFwiYW5pbWF0aW9uSW5cIjpcInNsaWRlSW5SaWdodFwiLFwicGF0aFwiOlwicGFnZXMvRGFzaGJvYXJkL0Rhc2hib2FyZC5odG1sXCJ9XTsgXG4iLCIoZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIF9hbGwgbW9kdWxlcyBvbmx5IHJlZmVyZW5jZSBkZXBlbmRlbmNpZXNcbiAgICBhbmd1bGFyLm1vZHVsZSgnQXBwQ29uZmlnJywgW10pXG4gICAgXG4gICAgICAgICAgICAvLyBGYWN0b3J5IGlzIGEgc2luZ2xldG9uIGFuZCBzaGFyZSBpdHMgY29udGV4dCB3aXRoaW4gYWxsIGluc3RhbmNlcy5cbiAgICAgICAgICAgIC5mYWN0b3J5KCdBcHBDb25maWcnLCBbXCJ1cmxxdWVyeVwiLCBmdW5jdGlvbiAodXJscXVlcnkpIHtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nIChcIlVSTD1cIisgJGxvY2F0aW9uLnVybCgpICsgXCIgUXVlcnk9XCIgKyBsb2NhdGlvbi5ocmVmKyBcIiB3aW5kb3c9XCIgKyBkb2N1bWVudC5yZWZlcnJlcik7XG5cbiAgICAgICAgICAgICAgICB2YXIgbXlDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBwYXRoczogeyAvLyBXYXJuaW5nIHBhdGhzIHNob3VsZCBlbmQgd2l0aCAvXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSA6ICdpbWFnZXMvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zIDogJy9pY29ucy8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyOiAnaW1hZ2VzL2F2YXRhcnMvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIDogJ2ltYWdlcy9hdWRpby8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGkgOiAnaW1hZ2VzL2FwcGxpLydcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogeyAvLyBUaG9zZSBkYXRhIGFyZSB1cGRhdGVkIGJ5IHNlc3Npb24gc2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIDogdXJscXVlcnkudG9rZW4gfHwgJzEyMzQ1Njc4OScsICAvLyB0eXBpY2FsIGRldiBpbml0aWFsIHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgOiAzNjAwLCAgICAgICAgIC8vIHRpbWVvdXQgaXMgdXBkYXRlZCBjbGllbnQgc2Vzc2luIGNvbnRleHQgY3JlYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgcGluZ3JhdGU6IDE1LCAgICAgICAgICAgLy8gUGluZyByYXRlIHRvIGNoZWNrIGlmIHNlcnZlciBpcyBzdGlsbCBhbGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICB1dWlkICAgIDogJycsICAgICAgICAgICAvLyB1dWlkIG1hcCB3aXRoIGNvb2tpZSBvciBsb25nIHRlcm0gc2Vzc2lvbiBhY2Nlc3Mga2V5XG4gICAgICAgICAgICAgICAgICAgICAgIHRva2VuICAgOiAnJyAgICAgICAgICAgIC8vIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdGlvbiAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbXlDb25maWc7XG4gICAgICAgICAgICB9XSlcblxuICAgICAgICAgICAgLy8gRmFjdG9yeSBpcyBhIHNpbmdsZXRvbiBhbmQgc2hhcmUgaXRzIGNvbnRleHQgd2l0aGluIGFsbCBpbnN0YW5jZXMuXG4gICAgICAgICAgICAuZmFjdG9yeSgnQXBwQ2FsbCcsIFtcIiRodHRwXCIsIFwiQXBwQ29uZmlnXCIsIFwiJGxvZ1wiLCBmdW5jdGlvbiAoJGh0dHAsIEFwcENvbmZpZywgJGxvZykge1xuICAgICAgICAgICAgICAgIHZhciBteUNhbGxzID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQgOiBmdW5jdGlvbihwbHVnaW4sIGFjdGlvbiwgcXVlcnksIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXF1ZXJ5LnRva2VuKSBxdWVyeS50b2tlbiA9IEFwcENvbmZpZy5zZXNzaW9uLnRva2VuOyAvLyBhZGQgdG9rZW4gdG8gcHJvdmlkZWQgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICRodHRwLmdldCgnL2FwaS8nICsgcGx1Z2luICsgJy8nICsgYWN0aW9uICwge3BhcmFtczogcXVlcnl9KS50aGVuIChjYWxsYmFjaywgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBteUNhbGxzO1xuICAgICAgICAgICAgfV0pO1xuICAgIFxuIFxufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBcbiAgICBmdW5jdGlvbiAgUGFyc2VRdWVyeVN0cmluZyAoKSB7XG4gICAgICB2YXIgcWQgPSB7fTtcbiAgICAgIGxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSkuc3BsaXQoXCImXCIpLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgIHZhciBrID0gaXRlbS5zcGxpdChcIj1cIilbMF07XG4gICAgICAgICAgdmFyIHYgPSBkZWNvZGVVUklDb21wb25lbnQoaXRlbS5zcGxpdChcIj1cIilbMV0pOyBcbiAgICAgICAgICBpZiAoayBpbiBxZCkgcWRba10ucHVzaCh2KTsgZWxzZSBxZFtrXSA9IFt2XTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHFkO1xuICAgIH1cblxuICBhbmd1bGFyLm1vZHVsZSgnQUZCY2xpZW50JywgWyAvLyBXYXJuaW5nOiBBcHBuYW1lIHNob3VsZCBmaXQgd2l0aCBndWxwZmlsZS5qcyAmIGluZGV4Lmh0bWxcbiAgICAndWkucm91dGVyJyxcbiAgICAnbmdBbmltYXRlJyxcblxuICAgIC8vZm91bmRhdGlvblxuICAgICdmb3VuZGF0aW9uJyxcbiAgICAnZm91bmRhdGlvbi5keW5hbWljUm91dGluZycsXG4gICAgJ2ZvdW5kYXRpb24uZHluYW1pY1JvdXRpbmcuYW5pbWF0aW9ucycsXG4gICAgXG4gICAgLy8gZXh0ZXJuYWwgY29tcG9uZW50c1xuICAgICd1aS1ub3RpZmljYXRpb24nLFxuICAgIFxuICAgIC8vIEFwcGxpY2F0aW9uIENvbXBvbmVudHNcbiAgICAnQXBwQ29uZmlnJyxcbiAgICAnSlF1ZXJ5RW11JyxcbiAgICAnRGFzaGJvYXJkTW9kdWxlJyxcbiAgICAnVXBsb2FkRmlsZXMnLFxuICAgICdMaW5rQnV0dG9uJyxcbiAgICAnVG9rZW5SZWZyZXNoJyxcbiAgICAnUmFuZ2VTbGlkZXInLFxuICAgICdNb2RhbE5vdGlmaWNhdGlvbidcbiAgXSlcbiAgICAudmFsdWUgKCd1cmxxdWVyeScsIFBhcnNlUXVlcnlTdHJpbmcoKSlcbiAgICAuY29uZmlnKGNvbmZpZylcbiAgICAucnVuKHJ1bilcbiAgO1xuXG4gIGNvbmZpZy4kaW5qZWN0ID0gWyckdXJsUm91dGVyUHJvdmlkZXInLCAnJGxvY2F0aW9uUHJvdmlkZXInXTtcbiAgXG4gIGZ1bmN0aW9uIGNvbmZpZygkdXJsUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyLCBBcHBDb25maWcpIHtcbiAgICAkdXJsUHJvdmlkZXIub3RoZXJ3aXNlKCcvZGFzaGJvYXJkJyk7XG5cbiAgICAvLyBodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9lcnJvci8kbG9jYXRpb24vbm9iYXNlXG4gICAgJGxvY2F0aW9uUHJvdmlkZXIuaHRtbDVNb2RlKHRydWUpLmhhc2hQcmVmaXgoJyEnKTtcbiAgICBcbiAgfVxuXG4gIGZ1bmN0aW9uIHJ1bigpIHtcbiAgICBGYXN0Q2xpY2suYXR0YWNoKGRvY3VtZW50LmJvZHkpO1xuICB9XG4gIFxuLy8gRm9uZGF0aW9uLWFwcC50ZW1wbGF0ZSBpcyBub3QgaW5jbHVkZWQgY29ycmVjdGx5IGJ5IGd1bHAgXG4vLyBJbmNsdWRlIGhlcmUgbWlzc2luZyB0ZW1wbGF0ZXMgZnJvbSBmb3VuZGF0aW9uLWFwcHMvZGlzdC9qcy9mb3VuZGF0aW9uLWFwcHMtdGVtcGxhdGVzLmpzXG5hbmd1bGFyLm1vZHVsZSgnZm91bmRhdGlvbicpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHtcbiAgJHRlbXBsYXRlQ2FjaGUucHV0KCdjb21wb25lbnRzL21vZGFsL21vZGFsLmh0bWwnLFxuICAgICc8ZGl2XFxuJyArXG4gICAgJyAgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCJcXG4nICtcbiAgICAnICBuZy1jbGljaz1cImhpZGVPdmVybGF5KClcIj5cXG4nICtcbiAgICAnICA8YXNpZGVcXG4nICtcbiAgICAnICAgIGNsYXNzPVwibW9kYWxcIlxcbicgK1xuICAgICcgICAgbmctY2xpY2s9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCJcXG4nICtcbiAgICAnICAgIG5nLXRyYW5zY2x1ZGU+XFxuJyArXG4gICAgJyAgPC9hc2lkZT5cXG4nICtcbiAgICAnPC9kaXY+XFxuJyArXG4gICAgJycpO1xufV0pO1xuXG5jb25zb2xlLmxvZyAoXCJvcGE9QUZCY2xpZW50IExvYWRlZFwiKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7YW5ndWxhci5tb2R1bGUoJ0FGQmNsaWVudCcpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHskdGVtcGxhdGVDYWNoZS5wdXQoJ3BhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmQuaHRtbCcsXG4gICAgJzxoMz48aW1nIGNsYXNzPVwibG9nb1wiIHNyYz1cImltYWdlcy9sb2dvL3RyaXNrZWxfaW90X2J6aHgyNTAucG5nXCIgYWx0PVwiSW9ULmJ6aCBMb2dvXCIgc3R5bGU9XCJoZWlnaHQ6MTUwcHhcIj4gQXBwbGljYXRpb24gRnJhbWV3b3JrIE1hbmFnZXIgU2ltcGxlIENsaWVudDwvaDM+PGRpdiBjbGFzcz1cImJ1dHRvbi1ib3ggYm94LWNvbnRlbnRcIj48YXBwbGktYnV0dG9uIG5nLXJlcGVhdD1cImFwcGxpSUQgaW4gY3RybC5hcHBsaUlEc1wiIHN0b3JlPVwiY3RybC5hcHBsaVN0b3JlXCIgaGFuZGxlPVwie3thcHBsaUlEfX1cIiBjYWxsYmFjaz1cImN0cmwuQXBwbGlDQlwiPjwvYXBwbGktYnV0dG9uPjx1cGxvYWQtYXBwbGkgY2xhc3M9XCJpYnotcmlnaHRcIiBsYWJlbD1cIlVwbG9hZFwiIGljb249XCJmaS11cGxvYWRcIiBwb3N0dXJsPVwiL2FwaS9hZm0tbWFpbi9pbnN0YWxsXCIgY2FsbGJhY2s9XCJjdHJsLkZpbGVVcGxvYWRlZFwiIHRpdGxlPVwiVXBsb2FkIEFHTCBBcHBcIj48L3VwbG9hZC1hcHBsaT48L2Rpdj48ZGl2IGNsYXNzPVwibWVzc2FnZS1ib3ggYm94LWNvbnRlbnQgdmVydGljYWwgZ3JpZC1mcmFtZVwiPjxkaXYgY2xhc3M9XCJyZXNwb25zZVwiPjxzcGFuIGNsYXNzPVwiZ3JpZC1jb250ZW50IG5vc2Nyb2xsIHJlcSB7e2N0cmwuc3RhdHVzfX1cIj5yZXE9IHt7Y3RybC5yZXF1ZXN0fX08L3NwYW4+IDxzcGFuIGNsYXNzPVwiZ3JpZC1jb250ZW50IG5vc2Nyb2xsIHJlcyB7e2N0cmwuc3RhdHVzfX1cIj5yZXM9IHt7Y3RybC5yZXNwb25zZX19PC9zcGFuPiA8c3BhbiBjbGFzcz1cImdyaWQtY29udGVudCBub3Njcm9sbCBzdGF0dXMge3tjdHJsLnN0YXR1c319XCI+c3RhdHVzPSB7e2N0cmwuZXJyY29kZX19PC9zcGFuPjwvZGl2PjwvZGl2Pjx0b2tlbi1yZWZyZXNoIGF1dG9sb2c9XCJ0cnVlXCIgY2FsbGJhY2s9XCJjdHJsLkF1dG9TdGFydFwiPjwvdG9rZW4tcmVmcmVzaD4nKTt9XSk7XG59KSgpO1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9