diff --git a/webadmin/dist/js/index.js b/webadmin/dist/js/index.js index 7783220c9..4190d53b6 100644 --- a/webadmin/dist/js/index.js +++ b/webadmin/dist/js/index.js @@ -1,2 +1,2 @@ -"use strict";var app=angular.module("Application",["ngRoute","ngAnimate","angular-md5"]);app.config(["$routeProvider",function(e){e.when("/",{redirectTo:"/apps"}).when("/users",{controller:"UsersController",templateUrl:"views/users.html"}).when("/appstore",{controller:"AppStoreController",templateUrl:"views/appstore.html"}).when("/apps",{controller:"AppsController",templateUrl:"views/apps.html"}).when("/dns",{controller:"DnsController",templateUrl:"views/dns.html"}).when("/account",{controller:"AccountController",templateUrl:"views/account.html"}).when("/graphs",{controller:"GraphsController",templateUrl:"views/graphs.html"}).otherwise({redirectTo:"/"})}]);var ISTATES={ISTATE_PENDING_INSTALL:"pending_install",ISTATE_PENDING_CONFIGURE:"pending_configure",ISTATE_PENDING_UNINSTALL:"pending_uninstall",ISTATE_PENDING_RESTORE:"pending_restore",ISTATE_PENDING_UPDATE:"pending_update",ISTATE_ERROR:"error",ISTATE_INSTALLED:"installed"};app.filter("installationActive",function(){return function(e){return e===ISTATES.ISTATE_ERROR?!1:e===ISTATES.ISTATE_INSTALLED?!1:!0}}),app.filter("installationStateLabel",function(){return function(e){switch(e){case ISTATES.ISTATE_PENDING_INSTALL:return"Installing";case ISTATES.ISTATE_PENDING_CONFIGURE:return"Configuring";case ISTATES.ISTATE_PENDING_UNINSTALL:return"Uninstalling";case ISTATES.ISTATE_PENDING_RESTORE:return"Starting";case ISTATES.ISTATE_PENDING_UPDATE:return"Updating";case ISTATES.ISTATE_ERROR:return"Error";case ISTATES.ISTATE_INSTALLED:return"Running";default:return e}}}),app.filter("accessRestrictionLabel",function(){return function(e){return""===e?"public":"roleUser"===e?"private":"roleAdmin"===e?"private (Admins only)":e}}),app.directive("laterName",function(){return{restrict:"A",require:["?ngModel","^?form"],link:function(e,o,n,r){n.$set("name",n.laterName);var t=r[0],a=r[1];t&&a&&(t.$name=n.name,a.$addControl(t),e.$on("$destroy",function(){a.$removeControl(t)}))}}}),angular.module("Application").service("Client",["$http","md5",function(e,o){function n(e,o){Error.call(this),this.name=this.constructor.name,this.statusCode=e,this.message="string"==typeof o?o:JSON.stringify(o)}function r(e){return function(o,r){return 401===r?a.logout():void e(new n(r,o))}}function t(){this._ready=!1,this._configListener=[],this._readyListener=[],this._userInfo={username:null,email:null,admin:!1},this._token=null,this._clientId="cid-webadmin",this._clientSecret="unused",this._config={apiServerOrigin:null,webServerOrigin:null,fqdn:null,ip:null,revision:null,update:{box:null,apps:null},isDev:!1,progress:{},isCustomDomain:!1,developerMode:!1},this._installedApps=[],this.setToken(localStorage.token)}var a=null;return t.prototype.setReady=function(){this._ready||(this._ready=!0,this._readyListener.forEach(function(e){e()}))},t.prototype.onReady=function(e){this._ready&&e(),this._readyListener.push(e)},t.prototype.onConfig=function(e){this._configListener.push(e),e(this._config)},t.prototype.setUserInfo=function(e){this._userInfo.username=e.username,this._userInfo.email=e.email,this._userInfo.admin=!!e.admin,this._userInfo.gravatar="https://www.gravatar.com/avatar/"+o.createHash(e.email.toLowerCase())+".jpg?s=24&d=mm",this._userInfo.gravatarHuge="https://www.gravatar.com/avatar/"+o.createHash(e.email.toLowerCase())+".jpg?s=128&d=mm"},t.prototype.setConfig=function(e){this._config.apiServerOrigin=e.apiServerOrigin,this._config.webServerOrigin=e.webServerOrigin,this._config.version=e.version,this._config.fqdn=e.fqdn,this._config.ip=e.ip,this._config.revision=e.revision,this._config.update=e.update,this._config.isDev=e.isDev,this._config.progress=e.progress,this._config.progress=e.progress,this._config.isCustomDomain=e.isCustomDomain,this._config.developerMode=e.developerMode;var o=this;this._configListener.forEach(function(e){e(o._config)})},t.prototype.getInstalledApps=function(){return this._installedApps},t.prototype.getUserInfo=function(){return this._userInfo},t.prototype.getConfig=function(){return this._config},t.prototype.setToken=function(o){e.defaults.headers.common.Authorization="Bearer "+o,o?localStorage.token=o:localStorage.removeItem("token"),this._token=o},t.prototype.config=function(o){e.get("/api/v1/cloudron/config").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.userInfo=function(o){var t=this;e.get("/api/v1/profile").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):(t.setUserInfo(e),void o(null,e))}).error(r(o))},t.prototype.changeDeveloperMode=function(o,t,a){var s=this,i={password:t,enabled:o};e.post("/api/v1/developer",i).success(function(e,r){return 200!==r?a(new n(r,e)):(s._config.developerMode=o,void a(null))}).error(r(a))},t.prototype.installApp=function(o,t,a,s,i,p){var l=this,u={appStoreId:o,manifest:t,password:a,location:i.location,portBindings:i.portBindings,accessRestriction:i.accessRestriction};e.post("/api/v1/apps/install",u).success(function(e,o){return 202!==o||"object"!=typeof e?p(new n(o,e)):(e.manifest={title:s},l._installedApps.push(e),void p(null,e.id))}).error(r(p))},t.prototype.uninstallApp=function(o,t,a){var s={password:t};e.post("/api/v1/apps/"+o+"/uninstall",s).success(function(e,o){return 202!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.configureApp=function(o,t,a,s){var i={appId:o,password:t,location:a.location,portBindings:a.portBindings,accessRestriction:a.accessRestriction};e.post("/api/v1/apps/"+o+"/configure",i).success(function(e,o){return 202!==o?s(new n(o,e)):void s(null)}).error(r(s))},t.prototype.updateApp=function(o,t,a,s,i){e.post("/api/v1/apps/"+o+"/update",{manifest:t,password:s,portBindings:a}).success(function(e,o){return 202!==o?i(new n(o,e)):void i(null)}).error(r(i))},t.prototype.startApp=function(o,t){var a={};e.post("/api/v1/apps/"+o+"/start",a).success(function(e,o){return 202!==o?t(new n(o,e)):void t(null)}).error(r(t))},t.prototype.stopApp=function(o,t){var a={};e.post("/api/v1/apps/"+o+"/stop",a).success(function(e,o){return 202!==o?t(new n(o,e)):void t(null)}).error(r(t))},t.prototype.version=function(o){e.get("/api/v1/cloudron/status").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.isServerFirstTime=function(o){e.get("/api/v1/cloudron/status").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,!e.activated)}).error(r(o))},t.prototype.getNakedDomain=function(o){e.get("/api/v1/settings/naked_domain").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e.appid)}).error(r(o))},t.prototype.setNakedDomain=function(o,t){e.post("/api/v1/settings/naked_domain",{appid:o}).success(function(e,o){return 204!==o?t(new n(o)):void t(null)}).error(r(t))},t.prototype.getApps=function(o){e.get("/api/v1/apps").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e.apps)}).error(r(o))},t.prototype.getApp=function(e,o){var n=null;return this._installedApps.some(function(o){return o.id===e?(n=o,!0):!1}),n?o(null,n):o(new Error("App not found"))},t.prototype.getAppLogStream=function(e){var o=new EventSource("/api/v1/apps/"+e+"/logstream");return o},t.prototype.getAppLogUrl=function(e){return"/api/v1/apps/"+e+"/logs?access_token="+this._token},t.prototype.setAdmin=function(o,t,a){var s={username:o,admin:t};e.post("/api/v1/users/"+o+"/admin",s).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.createAdmin=function(o,t,a,s,i){var p={username:o,password:t,email:a},l=this;e.post("/api/v1/cloudron/activate?setupToken="+s,p).success(function(e,r){return 201!==r||"object"!=typeof e?i(new n(r,e)):(l.setToken(e.token),l.setUserInfo({username:o,email:a,admin:!0}),void i(null,e.activated))}).error(r(i))},t.prototype.listUsers=function(o){e.get("/api/v1/users").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.getOAuthClients=function(o){e.get("/api/v1/oauth/clients").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e.clients)}).error(r(o))},t.prototype.delTokensByClientId=function(o,t){e["delete"]("/api/v1/oauth/clients/"+o+"/tokens").success(function(e,o){return 204!==o?t(new n(o,e)):void t(null)}).error(r(t))},t.prototype.update=function(o,t){e.post("/api/v1/cloudron/update",{password:o}).success(function(e,o){return 202!==o||"object"!=typeof e?t(new n(o,e)):void t(null,e)}).error(r(t))},t.prototype.reboot=function(o){e.get("/api/v1/cloudron/reboot").success(function(e,r){return 202!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.backup=function(o){e.post("/api/v1/cloudron/backups").success(function(e,r){return 202!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.setCertificate=function(o,t,a){console.log("will set certificate");var s=new FormData;s.append("certificate",o),s.append("key",t),e.post("/api/v1/cloudron/certificate",s,{headers:{"Content-Type":void 0},transformRequest:angular.identity}).success(function(e,o){return 202!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.graphs=function(o,t,a){var s={params:{target:o,format:"json",from:t}};e.get("/api/v1/cloudron/graphs",s).success(function(e,o){return 200!==o||"object"!=typeof e?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.createUser=function(o,t,a){var s={username:o,email:t};e.post("/api/v1/users",s).success(function(e,o){return 201!==o||"object"!=typeof e?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.removeUser=function(o,t,a){var s={password:t};e({method:"DELETE",url:"/api/v1/users/"+o,data:s,headers:{"Content-Type":"application/json"}}).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.changePassword=function(o,t,a){var s={password:o,newPassword:t};e.post("/api/v1/users/"+this._userInfo.username+"/password",s).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.changeEmail=function(o,t,a){var s={password:t,email:o};e.put("/api/v1/users/"+this._userInfo.username,s).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.refreshConfig=function(e){var o=this;e="function"==typeof e?e:function(){},this.config(function(n,r){return n?e(n):(o.setConfig(r),void e(null))})},t.prototype.refreshInstalledApps=function(e){var o=this;e="function"==typeof e?e:function(){},this.getApps(function(n,r){if(n)return e(n);r.forEach(function(e){for(var n=!1,r=0;r=0;--t)r.some(function(e){return e.id===o._installedApps[t].id})||o._installedApps.splice(t,1);e(null)})},t.prototype.logout=function(){this.setToken(null),this._userInfo={},window.location.href="/api/v1/session/logout"},t.prototype.exchangeCodeForToken=function(o,t){var a={grant_type:"authorization_code",code:o,redirect_uri:window.location.origin,client_id:this._clientId,client_secret:this._clientSecret};e.post("/api/v1/oauth/token?response_type=token&client_id="+this._clientId,a).success(function(e,o){return 200!==o||"object"!=typeof e?t(new n(o,e)):void t(null,e.access_token)}).error(r(t))},a=new t}]),angular.module("Application").service("AppStore",["$http","Client",function(e,o){function n(e,o){Error.call(this),this.name=this.constructor.name,this.statusCode=e,this.message="string"==typeof o?o:JSON.stringify(o)}function r(){this._appsCache={}}return r.prototype.getApps=function(r){if(null===o.getConfig().apiServerOrigin)return r(new n(420,"Enhance Your Calm"));var t=this;e.get(o.getConfig().apiServerOrigin+"/api/v1/appstore/apps",{params:{boxVersion:o.getConfig().version}}).success(function(e,o){return 200!==o?r(new n(o,e)):(e.apps.forEach(function(e){t._appsCache[e.id]||(t._appsCache[e.id]=e)}),r(null,t._appsCache))}).error(function(e,o){return r(new n(o,e))})},r.prototype.getAppById=function(e,o){if(e in this._appsCache)return o(null,this._appsCache[e]);var r=this;this.getApps(function(t){return t?o(t):e in r._appsCache?o(null,r._appsCache[e]):void o(new n(404,"Not found"))})},r.prototype.getManifest=function(r,t){if(null===o.getConfig().apiServerOrigin)return t(new n(420,"Enhance Your Calm"));var a=o.getConfig().apiServerOrigin+"/api/v1/appstore/apps/"+r+"/manifest";console.log("Getting the manifest of ",r,a),e.get(a).success(function(e,o){return 200!==o?t(new n(o,e)):t(null,e)}).error(function(e,o){return t(new n(o,e))})},new r}]),angular.module("Application").controller("MainController",["$scope","$route","$interval","Client",function(e,o,n,r){e.initialized=!1,e.userInfo=r.getUserInfo(),e.config={},e.update={error:{},password:""},e.isActive=function(e){return o.current?0===o.current.$$route.originalPath.indexOf(e):!1},e.logout=function(o){o.stopPropagation(),e.initialized=!1,r.logout()},e.login=function(){var e=window.location.origin+"/login_callback.html",o="root,profile,apps,roleAdmin";window.location.href="/api/v1/oauth/dialog/authorize?response_type=code&client_id="+r._clientId+"&redirect_uri="+e+"&scope="+o},e.setup=function(){window.location.href="/error.html?errorCode=1"},e.error=function(e){console.error(e),window.location.href="/error.html"},e.showUpdateModal=function(o){e.update.error.password=null,e.update.password="",o.$setPristine(),o.$setUntouched(),$("#updateModal").modal("show")},e.doUpdate=function(){e.update.error.password=null,r.update(e.update.password,function(o){return o?void(403===o.statusCode?(e.update.error.password="Incorrect password",e.update.password=""):console.error("Unable to update.",o)):void(window.location.href="/update.html")})},e.backup=function(){$("#backupProgressModal").modal("show"),e.initialized=!1,r.backup(function(o){function n(){r.version(function(o){return o?window.setTimeout(n,1e3):($("#backupProgressModal").modal("hide"),void(e.initialized=!0))})}o&&console.error(o),window.setTimeout(n,5e3)})},r.isServerFirstTime(function(o,t){return o?e.error(o):t?e.setup():void(localStorage.token?r.refreshConfig(function(o){return o&&401===o.statusCode?e.login():o?e.error(o):(r.getConfig().progress.update&&(window.location.href="/update.html"),void r.userInfo(function(o){return o?e.error(o):void r.refreshInstalledApps(function(o){if(o)return e.error(o);var t=n(r.refreshInstalledApps.bind(r),2e3),a=n(r.refreshConfig.bind(r),5e3);e.$on("$destroy",function(){n.cancel(t),n.cancel(a)}),r.setReady(),e.config=r.getConfig(),e.initialized=!0})}))}):e.login())}),r.onConfig(function(e){e.progress.update&&(window.location.href="/update.html")}),["updateModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("AccountController",["$scope","$location","Client",function(e,o,n){function r(o){e.passwordchange.error.password=null,e.passwordchange.error.newPassword=null,e.passwordchange.error.newPasswordRepeat=null,e.passwordchange.password="",e.passwordchange.newPassword="",e.passwordchange.newPasswordRepeat="",o&&(o.$setPristine(),o.$setUntouched())}function t(o){e.emailchange.error.email=null,e.emailchange.error.password=null,e.emailchange.email="",e.emailchange.password="",o&&(o.$setPristine(),o.$setUntouched())}function a(){e.developerModeChange.error.password=null,e.developerModeChange.password="",e.developerModeChangeForm.$setPristine(),e.developerModeChangeForm.$setUntouched()}e.user=n.getUserInfo(),e.config=n.getConfig(),e.activeClients=[],e.tokenInUse=null,e.passwordchange={busy:!1,error:{},password:"",newPassword:"",newPasswordRepeat:""},e.emailchange={busy:!1,error:{},email:"",password:""},e.developerModeChange={busy:!1,error:{},password:""},e.doChangePassword=function(o){e.passwordchange.error.password=null,e.passwordchange.error.newPassword=null,e.passwordchange.error.newPasswordRepeat=null,e.passwordchange.busy=!0,n.changePassword(e.passwordchange.password,e.passwordchange.newPassword,function(n){return n?void(403===n.statusCode?(e.passwordchange.error.password=!0,e.passwordchange.password=""):console.error("Unable to change password.",n)):(e.passwordchange.busy=!1,r(o),void $("#passwordChangeModal").modal("hide"))})},e.doChangeEmail=function(o){e.emailchange.error.email=null,e.emailchange.error.password=null,e.emailchange.busy=!0,n.changeEmail(e.emailchange.email,e.emailchange.password,function(r){return r?void(403===r.statusCode?(e.emailchange.error.password=!0,e.emailchange.password=""):console.error("Unable to change email.",r)):(e.emailchange.busy=!1,t(o),n.userInfo(function(){}),void $("#emailChangeModal").modal("hide"))})},e.doChangeDeveloperMode=function(){e.developerModeChange.error.password=null,e.developerModeChange.busy=!0,n.changeDeveloperMode(!e.config.developerMode,e.developerModeChange.password,function(o){return o?void(403===o.statusCode?(e.developerModeChange.error.password=!0,e.developerModeChange.password=""):console.error("Unable to change password.",o)):(e.developerModeChange.busy=!1,a(),void $("#developerModeChangeModal").modal("hide"))})},e.showChangePassword=function(e){r(e),$("#passwordChangeModal").modal("show")},e.showChangeEmail=function(e){t(e),$("#emailChangeModal").modal("show")},e.showChangeDeveloperMode=function(){a(),$("#developerModeChangeModal").modal("show")},e.removeAccessTokens=function(e,o){n.delTokensByClientId(e.id,function(e){return e?console.error(e):void $(o.target).addClass("disabled")})},n.onReady(function(){e.tokenInUse=n._token,n.getOAuthClients(function(o,n){return o?console.error(o):void(e.activeClients=n)})}),["passwordChangeModal","emailChangeModal","developerModeChangeModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("AppsController",["$scope","$location","Client","AppStore",function(e,o,n,r){e.HOST_PORT_MIN=1024,e.HOST_PORT_MAX=65535,e.installedApps=n.getInstalledApps(),e.config=n.getConfig(),e.appconfigure={busy:!1,error:{},app:{},location:"",password:"",portBindings:{},accessRestriction:""},e.appuninstall={error:{},app:{},password:""},e.appupdate={error:{},app:{},password:"",manifest:{},portBindings:{}},e.reset=function(){e.appconfigure.error={},e.appconfigure.app={},e.appconfigure.location="",e.appconfigure.password="",e.appconfigure.portBindings={},e.appconfigure.accessRestriction="",e.config_form.$setPristine(),e.config_form.$setUntouched(),e.appuninstall.app={},e.appuninstall.error={},e.appuninstall.password="",e.uninstall_form.$setPristine(),e.uninstall_form.$setUntouched()},e.showConfigure=function(o){e.reset(),e.appconfigure.app=o,e.appconfigure.location=o.location,e.appconfigure.accessRestriction=o.accessRestriction,e.appconfigure.portBindingsInfo=o.manifest.tcpPorts,e.appconfigure.portBindings=angular.copy(o.portBindings),$("#appConfigureModal").modal("show")},e.doConfigure=function(){e.appconfigure.busy=!0,e.appconfigure.error.name=null,e.appconfigure.error.password=null,n.configureApp(e.appconfigure.app.id,e.appconfigure.password,{location:e.appconfigure.location,portBindings:e.appconfigure.portBindings,accessRestriction:e.appconfigure.accessRestriction},function(o){return o?(403===o.statusCode?(e.appconfigure.error.password="Wrong password provided.",e.appconfigure.password=""):e.appconfigure.error.name="App with the name "+e.appconfigure.app.name+" cannot be configured.",void(e.appconfigure.busy=!1)):(e.appconfigure.busy=!1,$("#appConfigureModal").modal("hide"),void e.reset())})},e.showUninstall=function(o){e.reset(),e.appuninstall.app=o,$("#appUninstallModal").modal("show")},e.doUninstall=function(){e.appuninstall.error.password=null,n.uninstallApp(e.appuninstall.app.id,e.appuninstall.password,function(o){return o?void(403===o.statusCode?(e.appuninstall.password="",e.appuninstall.error.password=!0):console.error(o)):($("#appUninstallModal").modal("hide"),void e.reset())})},e.showUpdate=function(o){e.appupdate.app=o,e.appupdate.error.password=null,r.getManifest(o.appStoreId,function(n,r){if(n)return console.error(n);e.appupdate.manifest=r;var t=angular.copy(o.portBindings),a=!1;for(var s in e.appupdate.manifest.tcpPorts)t[s]=e.appupdate.manifest.tcpPorts[s],e.appupdate.app.portBindings[s]||(t[s].isNew=!0,a=!0);for(s in e.appupdate.app.portBindings)e.appupdate.manifest.tcpPorts[s]||(t[s].isObsolete=!0,a=!0);e.appupdate.portBindings=a?t:{},$("#appUpdateModal").modal("show")})},e.doUpdate=function(o){e.appupdate.error.password=null;var r={};for(var t in e.appupdate.portBindings)e.appupdate.portBindings[t].isObsolete||(r[t]=e.appupdate.portBindings[t].hostPort);n.updateApp(e.appupdate.app.id,e.appupdate.manifest,r,e.appupdate.password,function(n){return n?void(403===n.statusCode?(e.appupdate.password="",e.appupdate.error.password=!0):console.error(n)):(e.appupdate.app={},e.appupdate.password="",o.$setPristine(),o.$setUntouched(),void $("#appUpdateModal").modal("hide"))})},e.cancel=function(){window.history.back()},["appConfigureModal","appUninstallModal","appUpdateModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("AppStoreController",["$scope","$location","$timeout","Client","AppStore",function(e,o,n,r,t){function a(){e.ready=!1,t.getApps(function(o,r){return o?(console.error(o),n(a,1e3)):(e.apps=r,void(e.ready=!0))})}r.onReady(function(){r.getUserInfo().admin||o.path("/")}),e.ready=!1,e.apps=[],e.config=r.getConfig(),e.appinstall={busy:!1,error:{},app:{},location:"",password:"",portBindings:{},accessRestriction:""},e.reset=function(){e.appinstall.app={},e.appinstall.location="",e.appinstall.password="",e.appinstall.portBindings={},e.appinstall.accessRestriction="",e.appinstall.error={},e.install_form.$setPristine(),e.install_form.$setUntouched()},e.showInstall=function(o){e.reset(),t.getManifest(o.id,function(n,r){if(n)return console.error(n);o.manifest=r,e.appinstall.app=o,e.appinstall.location=o.location,e.appinstall.portBindingsInfo=r.tcpPorts,e.appinstall.portBindings={},e.appinstall.accessRestriction=o.accessRestriction||"";for(var t in r.tcpPorts)e.appinstall.portBindings[t]=r.tcpPorts[t].defaultValue||0;$("#appInstallModal").modal("show")})},e.doInstall=function(){e.appinstall.busy=!0,e.appinstall.error.name=null,e.appinstall.error.password=null,e.appinstall.error.port=null,r.installApp(e.appinstall.app.id,e.appinstall.app.manifest,e.appinstall.password,e.appinstall.app.title,{location:e.appinstall.location,portBindings:e.appinstall.portBindings,accessRestriction:e.appinstall.accessRestriction},function(n){return n?(409===n.statusCode&&-1!==n.message.indexOf("is reserved")?e.appinstall.error.port="This port is already in use.":409===n.statusCode?e.appinstall.error.name="Application already exists.":403===n.statusCode?(e.appinstall.error.password="Wrong password provided.",e.appinstall.password=""):e.appinstall.error.name="App with the name "+e.appinstall.app.name+" cannot be installed.",void(e.appinstall.busy=!1)):(e.appinstall.busy=!1,$("#appInstallModal").modal("hide"),e.reset(),void o.path("/apps"))})},a(),["appInstallModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("DnsController",["$scope","$location","Client",function(e,o,n){n.onReady(function(){n.getUserInfo().admin||o.path("/")}),e.ready=!1,e.user=n.getUserInfo(),e.config=n.getConfig(),e.nakedDomainApp=null,e.certificateFile=null,e.certificateFileName="",e.keyFile=null,e.keyFileName="",e.setNakedDomain=function(){var o=e.nakedDomainApp?e.nakedDomainApp.id:"admin";n.setNakedDomain(o,function(e){return e?console.error("Error setting naked domain",e):void 0})},e.backup=function(){$("#backupProgressModal").modal("show"),e.$parent.initialized=!1,n.backup(function(o){function r(){n.version(function(o){return o?window.setTimeout(r,1e3):($("#backupProgressModal").modal("hide"),void(e.$parent.initialized=!0))})}o&&console.error(o),window.setTimeout(r,5e3)})},e.update=function(){$("#updateModal").modal("hide"),e.$parent.initialized=!1,n.update(function(e){e&&console.error(e),window.location.href="/update.html"})},document.getElementById("idCertificate").onchange=function(o){e.$apply(function(){e.certificateFile=o.target.files[0],e.certificateFileName=o.target.files[0].name})},document.getElementById("idKey").onchange=function(o){e.$apply(function(){e.keyFile=o.target.files[0],e.keyFileName=o.target.files[0].name})},e.setCertificate=function(){return console.log("Will set the certificate"),e.certificateFile?e.keyFile?void n.setCertificate(e.certificateFile,e.keyFile,function(e){return e?console.log(e):void window.setTimeout(window.location.reload.bind(window.location,!0),3e3)}):console.log("Key not set"):console.log("Certificate not set")},n.onConfig(function(){e.tokenInUse=n._token,n.getApps(function(o,r){o&&console.error("Error loading app list"),e.apps=r,n.getNakedDomain(function(o,n){if(o)return console.error(o);e.nakedDomainApp=null;for(var r=0;r',t=r+e.name+": "+new Number(n).toFixed(2)+"%
";return t}})}r.render()}function t(e,o,n){var r=[],t=[];o&&o.datapoints&&(r=o.datapoints.map(function(e){return{y:e[0],x:e[1]}})),n&&n.datapoints&&(t=n.datapoints.map(function(e){return{y:e[0],x:e[1]}}));{var a=new Rickshaw.Graph({element:document.querySelector("#"+e+"NetworkChart"),renderer:"area",width:580,height:250,series:[{color:"steelblue",data:r,name:"tx"},{color:"green",data:t,name:"rx"}]});new Rickshaw.Graph.Axis.Time({graph:a}),new Rickshaw.Graph.Axis.Y({graph:a,orientation:"left",tickFormat:Rickshaw.Fixtures.Number.formatKMBT,element:document.getElementById(e+"NetworkYAxis")}),new Rickshaw.Graph.HoverDetail({graph:a,formatter:function(e,o,n){var r='',t=r+e.name+": "+new Number(n/1024).toFixed(2)+"KB
";return t}})}a.render()}function a(e,o,n){var r=[],t=[];o&&o.datapoints&&(r=o.datapoints.map(function(e){return{y:e[0],x:e[1]}})),n&&n.datapoints&&(t=n.datapoints.map(function(e){return{y:e[0],x:e[1]}}));{var a=new Rickshaw.Graph({element:document.querySelector("#"+e+"DiskChart"),renderer:"area",width:580,height:250,min:0,max:32212254720,series:[{color:"steelblue",data:r,name:"apps"},{color:"green",data:t,name:"data"}]});new Rickshaw.Graph.Axis.Time({graph:a}),new Rickshaw.Graph.Axis.Y({graph:a,orientation:"left",tickFormat:Rickshaw.Fixtures.Number.formatKMBT,element:document.getElementById(e+"DiskYAxis")}),new Rickshaw.Graph.HoverDetail({graph:a,formatter:function(e,o,n){var r='',t=r+e.name+": "+new Number(n/1073741824).toFixed(2)+"GB
";return t}}),new Rickshaw.Graph.Legend({graph:a,element:document.getElementById(e+"DiskLegend")})}a.render()}n.getUserInfo().admin||o.path("/"),e.activeTab="day";var s="transformNull(scale(divideSeries(sumSeries(collectd.localhost.cpu-0.cpu-system,collectd.localhost.cpu-0.cpu-nice,collectd.localhost.cpu-0.cpu-user),sumSeries(collectd.localhost.cpu-0.cpu-idle,collectd.localhost.cpu-0.cpu-system,collectd.localhost.cpu-0.cpu-nice,collectd.localhost.cpu-0.cpu-user,collectd.localhost.cpu-0.cpu-wait)), 100), 0)",i="transformNull(collectd.localhost.interface-eth0.if_octets.tx, 0)",p="transformNull(collectd.localhost.interface-eth0.if_octets.rx, 0)",l="transformNull(collectd.localhost.df-loop0.df_complex-used, 0)",u="transformNull(collectd.localhost.df-loop1.df_complex-used, 0)";e.updateGraphs=function(){var o=e.activeTab,c="-24hours";switch(o){case"day":c="-24hours";break;case"month":c="-1month";break;case"year":c="-1year";break;default:console.log("internal errror")}n.graphs([s,i,p,l,u],c,function(e,n){return e?console.log(e):(r(o,n[0]),t(o,n[1],n[2]),void a(o,n[3],n[4]))})},n.onReady(e.updateGraphs)}]),angular.module("Application").controller("UsersController",["$scope","$location","Client",function(e,o,n){function r(){n.listUsers(function(o,n){return o?console.error("Unable to get user listing.",o):(e.users=n.users,void(e.ready=!0))})}n.onReady(function(){n.getUserInfo().admin||o.path("/")}),e.ready=!1,e.users=[],e.userInfo=n.getUserInfo(),e.userremove={busy:!1,error:{},userInfo:{},username:"",password:""},e.useradd={busy:!1,alreadyTaken:!1,error:{},username:"",email:""},e.isMe=function(e){return e.username===n.getUserInfo().username},e.isAdmin=function(e){return!!e.admin},e.toggleAdmin=function(e){n.setAdmin(e.username,!e.admin,function(o){return o?console.error(o):void(e.admin=!e.admin)})},e.doAdd=function(){e.useradd.alreadyTaken="",e.useradd.error.username=null,e.useradd.error.email=null,n.createUser(e.useradd.username,e.useradd.email,function(o){if(o&&409===o.statusCode)return e.useradd.alreadyTaken=e.username,console.error("Username already taken");if(o&&400===o.statusCode){if(-1!==o.message.indexOf("email"))return e.useradd.error.email="Invalid Email",void(e.useradd.email="");if(-1!==o.message.indexOf("username"))return e.useradd.error.username="Invalid Username",void(e.useradd.username="")}else o&&console.error("Unable to create user.",o),r(),$("#userAddModal").modal("hide")})},e.showUserRemove=function(o){e.userremove.error.username=null,e.userremove.error.password=null,e.userremove.userInfo=o,$("#userRemoveModal").modal("show")},e.doUserRemove=function(o){return e.userremove.error.username=null,e.userremove.error.password=null,e.userremove.username!==e.userremove.userInfo.username?(e.userremove.error.username="Username does not match",void(e.userremove.username="")):void n.removeUser(e.userremove.userInfo.id,e.userremove.password,function(n){return n&&403===n.statusCode?(e.userremove.error.password="Incorrect password",void(e.userremove.password="")):n?console.error("Unable to delete user.",n):(e.userremove.userInfo={},e.userremove.username="",e.userremove.password="",o.$setPristine(),o.$setUntouched(),$("#userRemoveModal").modal("hide"),void r())})},r(),["userAddModal","userRemoveModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIiwiY2xpZW50LmpzIiwiYXBwc3RvcmUuanMiLCJtYWluLmpzIiwiYWNjb3VudC5qcyIsImFwcHMuanMiLCJkbnMuanMiLCJncmFwaHMuanMiLCJ1c2Vycy5qcyJdLCJuYW1lcyI6WyJhcHAiLCJhbmd1bGFyIiwibW9kdWxlIiwiY29uZmlnIiwiJHJvdXRlUHJvdmlkZXIiLCJ3aGVuIiwicmVkaXJlY3RUbyIsImNvbnRyb2xsZXIiLCJ0ZW1wbGF0ZVVybCIsIm90aGVyd2lzZSIsIklTVEFURVMiLCJJU1RBVEVfUEVORElOR19JTlNUQUxMIiwiSVNUQVRFX1BFTkRJTkdfQ09ORklHVVJFIiwiSVNUQVRFX1BFTkRJTkdfVU5JTlNUQUxMIiwiSVNUQVRFX1BFTkRJTkdfUkVTVE9SRSIsIklTVEFURV9QRU5ESU5HX1VQREFURSIsIklTVEFURV9FUlJPUiIsIklTVEFURV9JTlNUQUxMRUQiLCJmaWx0ZXIiLCJpbnB1dCIsImRpcmVjdGl2ZSIsInJlc3RyaWN0IiwicmVxdWlyZSIsImxpbmsiLCJzY29wZSIsImVsZW0iLCJhdHRycyIsImN0cmxzIiwiJHNldCIsImxhdGVyTmFtZSIsIm1vZGVsQ3RybCIsImZvcm1DdHJsIiwiJG5hbWUiLCJuYW1lIiwiJGFkZENvbnRyb2wiLCIkb24iLCIkcmVtb3ZlQ29udHJvbCIsInNlcnZpY2UiLCIkaHR0cCIsIm1kNSIsIkNsaWVudEVycm9yIiwic3RhdHVzQ29kZSIsIm1lc3NhZ2UiLCJFcnJvciIsImNhbGwiLCJ0aGlzIiwiY29uc3RydWN0b3IiLCJKU09OIiwic3RyaW5naWZ5IiwiZGVmYXVsdEVycm9ySGFuZGxlciIsImNhbGxiYWNrIiwiZGF0YSIsInN0YXR1cyIsImNsaWVudCIsImxvZ291dCIsIkNsaWVudCIsIl9yZWFkeSIsIl9jb25maWdMaXN0ZW5lciIsIl9yZWFkeUxpc3RlbmVyIiwiX3VzZXJJbmZvIiwidXNlcm5hbWUiLCJlbWFpbCIsImFkbWluIiwiX3Rva2VuIiwiX2NsaWVudElkIiwiX2NsaWVudFNlY3JldCIsIl9jb25maWciLCJhcGlTZXJ2ZXJPcmlnaW4iLCJ3ZWJTZXJ2ZXJPcmlnaW4iLCJmcWRuIiwiaXAiLCJyZXZpc2lvbiIsInVwZGF0ZSIsImJveCIsImFwcHMiLCJpc0RldiIsInByb2dyZXNzIiwiaXNDdXN0b21Eb21haW4iLCJkZXZlbG9wZXJNb2RlIiwiX2luc3RhbGxlZEFwcHMiLCJzZXRUb2tlbiIsImxvY2FsU3RvcmFnZSIsInRva2VuIiwicHJvdG90eXBlIiwic2V0UmVhZHkiLCJmb3JFYWNoIiwib25SZWFkeSIsInB1c2giLCJvbkNvbmZpZyIsInNldFVzZXJJbmZvIiwidXNlckluZm8iLCJncmF2YXRhciIsImNyZWF0ZUhhc2giLCJ0b0xvd2VyQ2FzZSIsImdyYXZhdGFySHVnZSIsInNldENvbmZpZyIsInZlcnNpb24iLCJ0aGF0IiwiZ2V0SW5zdGFsbGVkQXBwcyIsImdldFVzZXJJbmZvIiwiZ2V0Q29uZmlnIiwiZGVmYXVsdHMiLCJoZWFkZXJzIiwiY29tbW9uIiwiQXV0aG9yaXphdGlvbiIsInJlbW92ZUl0ZW0iLCJnZXQiLCJzdWNjZXNzIiwiZXJyb3IiLCJjaGFuZ2VEZXZlbG9wZXJNb2RlIiwiZW5hYmxlZCIsInBhc3N3b3JkIiwicG9zdCIsImluc3RhbGxBcHAiLCJpZCIsIm1hbmlmZXN0IiwidGl0bGUiLCJhcHBTdG9yZUlkIiwibG9jYXRpb24iLCJwb3J0QmluZGluZ3MiLCJhY2Nlc3NSZXN0cmljdGlvbiIsInVuaW5zdGFsbEFwcCIsImFwcElkIiwiY29uZmlndXJlQXBwIiwidXBkYXRlQXBwIiwic3RhcnRBcHAiLCJzdG9wQXBwIiwiaXNTZXJ2ZXJGaXJzdFRpbWUiLCJhY3RpdmF0ZWQiLCJnZXROYWtlZERvbWFpbiIsImFwcGlkIiwic2V0TmFrZWREb21haW4iLCJnZXRBcHBzIiwiZ2V0QXBwIiwiYXBwRm91bmQiLCJzb21lIiwiZ2V0QXBwTG9nU3RyZWFtIiwic291cmNlIiwiRXZlbnRTb3VyY2UiLCJnZXRBcHBMb2dVcmwiLCJzZXRBZG1pbiIsInBheWxvYWQiLCJjcmVhdGVBZG1pbiIsInNldHVwVG9rZW4iLCJsaXN0VXNlcnMiLCJnZXRPQXV0aENsaWVudHMiLCJjbGllbnRzIiwiZGVsVG9rZW5zQnlDbGllbnRJZCIsInJlYm9vdCIsImJhY2t1cCIsInNldENlcnRpZmljYXRlIiwiY2VydGlmaWNhdGVGaWxlIiwia2V5RmlsZSIsImNvbnNvbGUiLCJsb2ciLCJmZCIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiQ29udGVudC1UeXBlIiwidW5kZWZpbmVkIiwidHJhbnNmb3JtUmVxdWVzdCIsImlkZW50aXR5IiwiZ3JhcGhzIiwidGFyZ2V0cyIsImZyb20iLCJwYXJhbXMiLCJ0YXJnZXQiLCJmb3JtYXQiLCJjcmVhdGVVc2VyIiwicmVtb3ZlVXNlciIsInVzZXJJZCIsIm1ldGhvZCIsInVybCIsImNoYW5nZVBhc3N3b3JkIiwiY3VycmVudFBhc3N3b3JkIiwibmV3UGFzc3dvcmQiLCJjaGFuZ2VFbWFpbCIsInB1dCIsInJlZnJlc2hDb25maWciLCJyZXN1bHQiLCJyZWZyZXNoSW5zdGFsbGVkQXBwcyIsImZvdW5kIiwiaSIsImxlbmd0aCIsImNvcHkiLCJzcGxpY2UiLCJ3aW5kb3ciLCJocmVmIiwiZXhjaGFuZ2VDb2RlRm9yVG9rZW4iLCJhdXRoQ29kZSIsImdyYW50X3R5cGUiLCJjb2RlIiwicmVkaXJlY3RfdXJpIiwib3JpZ2luIiwiY2xpZW50X2lkIiwiY2xpZW50X3NlY3JldCIsImFjY2Vzc190b2tlbiIsIkFwcFN0b3JlRXJyb3IiLCJBcHBTdG9yZSIsIl9hcHBzQ2FjaGUiLCJib3hWZXJzaW9uIiwiZ2V0QXBwQnlJZCIsImdldE1hbmlmZXN0IiwibWFuaWZlc3RVcmwiLCIkc2NvcGUiLCIkcm91dGUiLCIkaW50ZXJ2YWwiLCJpbml0aWFsaXplZCIsImlzQWN0aXZlIiwiY3VycmVudCIsIiQkcm91dGUiLCJvcmlnaW5hbFBhdGgiLCJpbmRleE9mIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJsb2dpbiIsImNhbGxiYWNrVVJMIiwic2V0dXAiLCJzaG93VXBkYXRlTW9kYWwiLCJmb3JtIiwiJHNldFByaXN0aW5lIiwiJHNldFVudG91Y2hlZCIsIiQiLCJtb2RhbCIsImRvVXBkYXRlIiwiY2hlY2tJZkRvbmUiLCJzZXRUaW1lb3V0IiwiaXNGaXJzdFRpbWUiLCJyZWZyZXNoQXBwc1RpbWVyIiwiYmluZCIsInJlZnJlc2hDb25maWdUaW1lciIsImNhbmNlbCIsIm9uIiwiZmluZCIsImZvY3VzIiwiJGxvY2F0aW9uIiwicGFzc3dvcmRDaGFuZ2VSZXNldCIsInBhc3N3b3JkY2hhbmdlIiwibmV3UGFzc3dvcmRSZXBlYXQiLCJlbWFpbENoYW5nZVJlc2V0IiwiZW1haWxjaGFuZ2UiLCJkZXZlbG9wZXJNb2RlQ2hhbmdlUmVzZXQiLCJkZXZlbG9wZXJNb2RlQ2hhbmdlIiwiZGV2ZWxvcGVyTW9kZUNoYW5nZUZvcm0iLCJ1c2VyIiwiYWN0aXZlQ2xpZW50cyIsInRva2VuSW5Vc2UiLCJidXN5IiwiZG9DaGFuZ2VQYXNzd29yZCIsImRvQ2hhbmdlRW1haWwiLCJkb0NoYW5nZURldmVsb3Blck1vZGUiLCJzaG93Q2hhbmdlUGFzc3dvcmQiLCJzaG93Q2hhbmdlRW1haWwiLCJzaG93Q2hhbmdlRGV2ZWxvcGVyTW9kZSIsInJlbW92ZUFjY2Vzc1Rva2VucyIsImFkZENsYXNzIiwiSE9TVF9QT1JUX01JTiIsIkhPU1RfUE9SVF9NQVgiLCJpbnN0YWxsZWRBcHBzIiwiYXBwY29uZmlndXJlIiwiYXBwdW5pbnN0YWxsIiwiYXBwdXBkYXRlIiwicmVzZXQiLCJjb25maWdfZm9ybSIsInVuaW5zdGFsbF9mb3JtIiwic2hvd0NvbmZpZ3VyZSIsInBvcnRCaW5kaW5nc0luZm8iLCJ0Y3BQb3J0cyIsImRvQ29uZmlndXJlIiwic2hvd1VuaW5zdGFsbCIsImRvVW5pbnN0YWxsIiwic2hvd1VwZGF0ZSIsInBvcnRzQ2hhbmdlZCIsImVudiIsImlzTmV3IiwiaXNPYnNvbGV0ZSIsImhvc3RQb3J0IiwiaGlzdG9yeSIsImJhY2siLCIkdGltZW91dCIsInJlZnJlc2giLCJyZWFkeSIsInBhdGgiLCJhcHBpbnN0YWxsIiwiaW5zdGFsbF9mb3JtIiwic2hvd0luc3RhbGwiLCJkZWZhdWx0VmFsdWUiLCJkb0luc3RhbGwiLCJwb3J0IiwibmFrZWREb21haW5BcHAiLCJjZXJ0aWZpY2F0ZUZpbGVOYW1lIiwia2V5RmlsZU5hbWUiLCIkcGFyZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIm9uY2hhbmdlIiwiJGFwcGx5IiwiZmlsZXMiLCJyZWxvYWQiLCJyZW5kZXJDcHUiLCJhY3RpdmVUYWIiLCJjcHVEYXRhIiwidHJhbnNmb3JtZWRDcHUiLCJkYXRhcG9pbnRzIiwibWFwIiwicG9pbnQiLCJ5IiwieCIsImNwdUdyYXBoIiwiUmlja3NoYXciLCJHcmFwaCIsImVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicmVuZGVyZXIiLCJ3aWR0aCIsImhlaWdodCIsIm1pbiIsIm1heCIsInNlcmllcyIsImNvbG9yIiwiQXhpcyIsIlRpbWUiLCJncmFwaCIsIlkiLCJvcmllbnRhdGlvbiIsInRpY2tGb3JtYXQiLCJGaXh0dXJlcyIsIk51bWJlciIsImZvcm1hdEtNQlQiLCJIb3ZlckRldGFpbCIsImZvcm1hdHRlciIsInN3YXRjaCIsImNvbnRlbnQiLCJ0b0ZpeGVkIiwicmVuZGVyIiwicmVuZGVyTmV0d29yayIsInR4RGF0YSIsInJ4RGF0YSIsInRyYW5zZm9ybWVkVHgiLCJ0cmFuc2Zvcm1lZFJ4IiwibmV0d29ya0dyYXBoIiwicmVuZGVyRGlzayIsImFwcHNVc2VkRGF0YSIsImRhdGFVc2VkRGF0YSIsInRyYW5zZm9ybWVkQXBwc1VzZWQiLCJ0cmFuc2Zvcm1lZERhdGFVc2VkIiwiZGlza0dyYXBoIiwiTGVnZW5kIiwiY3B1VXNhZ2VUYXJnZXQiLCJuZXR3b3JrVXNhZ2VUeFRhcmdldCIsIm5ldHdvcmtVc2FnZVJ4VGFyZ2V0IiwiZGlza1VzYWdlQXBwc1VzZWRUYXJnZXQiLCJkaXNrVXNhZ2VEYXRhVXNlZFRhcmdldCIsInVwZGF0ZUdyYXBocyIsInVzZXJzIiwidXNlcnJlbW92ZSIsInVzZXJhZGQiLCJhbHJlYWR5VGFrZW4iLCJpc01lIiwiaXNBZG1pbiIsInRvZ2dsZUFkbWluIiwiZG9BZGQiLCJzaG93VXNlclJlbW92ZSIsImRvVXNlclJlbW92ZSJdLCJtYXBwaW5ncyI6IkFBQUEsWUFLQSxJQUFBQSxLQUFBQyxRQUFBQyxPQUFBLGVBQUEsVUFBQSxZQUFBLGVBR0FGLEtBQUFHLFFBQUEsaUJBQUEsU0FBQUMsR0FDQUEsRUFBQUMsS0FBQSxLQUNBQyxXQUFBLFVBQ0FELEtBQUEsVUFDQUUsV0FBQSxrQkFDQUMsWUFBQSxxQkFDQUgsS0FBQSxhQUNBRSxXQUFBLHFCQUNBQyxZQUFBLHdCQUNBSCxLQUFBLFNBQ0FFLFdBQUEsaUJBQ0FDLFlBQUEsb0JBQ0FILEtBQUEsUUFDQUUsV0FBQSxnQkFDQUMsWUFBQSxtQkFDQUgsS0FBQSxZQUNBRSxXQUFBLG9CQUNBQyxZQUFBLHVCQUNBSCxLQUFBLFdBQ0FFLFdBQUEsbUJBQ0FDLFlBQUEsc0JBQ0FDLFdBQUFILFdBQUEsUUFJQSxJQUFBSSxVQUNBQyx1QkFBQSxrQkFDQUMseUJBQUEsb0JBQ0FDLHlCQUFBLG9CQUNBQyx1QkFBQSxrQkFDQUMsc0JBQUEsaUJBQ0FDLGFBQUEsUUFDQUMsaUJBQUEsWUFHQWpCLEtBQUFrQixPQUFBLHFCQUFBLFdBQ0EsTUFBQSxVQUFBQyxHQUNBLE1BQUFBLEtBQUFULFFBQUFNLGNBQUEsRUFDQUcsSUFBQVQsUUFBQU8sa0JBQUEsR0FDQSxLQUlBakIsSUFBQWtCLE9BQUEseUJBQUEsV0FDQSxNQUFBLFVBQUFDLEdBQ0EsT0FBQUEsR0FDQSxJQUFBVCxTQUFBQyx1QkFBQSxNQUFBLFlBQ0EsS0FBQUQsU0FBQUUseUJBQUEsTUFBQSxhQUNBLEtBQUFGLFNBQUFHLHlCQUFBLE1BQUEsY0FDQSxLQUFBSCxTQUFBSSx1QkFBQSxNQUFBLFVBQ0EsS0FBQUosU0FBQUssc0JBQUEsTUFBQSxVQUNBLEtBQUFMLFNBQUFNLGFBQUEsTUFBQSxPQUNBLEtBQUFOLFNBQUFPLGlCQUFBLE1BQUEsU0FDQSxTQUFB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QUFwUCxTQUFBLEtBR0FILEVBQUE2QyxRQUFBN0MsTUFBQSx5QkFBQUEsSUFFQWdHLEVBQUF1SixXQUFBelEsWUFDQWtILEVBQUF1SixXQUFBdlMsU0FBQSxHQUNBZ0osRUFBQXVKLFdBQUFwUCxTQUFBLEdBRUE0RyxFQUFBQyxlQUNBRCxFQUFBRSxnQkFFQUMsRUFBQSxvQkFBQUMsTUFBQSxZQUVBeUQsU0FhQUEsS0FHQSxlQUFBLG1CQUFBbk0sUUFBQSxTQUFBNkIsR0FDQTRHLEVBQUEsSUFBQTVHLEdBQUFzSCxHQUFBLGlCQUFBLFdBQ0FWLEVBQUFqTCxNQUFBNEwsS0FBQSxxQkFBQUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBhbmd1bGFyOmZhbHNlICovXG5cbi8vIGNyZWF0ZSBtYWluIGFwcGxpY2F0aW9uIG1vZHVsZVxudmFyIGFwcCA9IGFuZ3VsYXIubW9kdWxlKCdBcHBsaWNhdGlvbicsIFsnbmdSb3V0ZScsICduZ0FuaW1hdGUnLCAnYW5ndWxhci1tZDUnXSk7XG5cbi8vIHNldHVwIGFsbCBtYWpvciBhcHBsaWNhdGlvbiByb3V0ZXNcbmFwcC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIGZ1bmN0aW9uICgkcm91dGVQcm92aWRlcikge1xuICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy8nLCB7XG4gICAgICAgIHJlZGlyZWN0VG86ICcvYXBwcydcbiAgICB9KS53aGVuKCcvdXNlcnMnLCB7XG4gICAgICAgIGNvbnRyb2xsZXI6ICdVc2Vyc0NvbnRyb2xsZXInLFxuICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpZXdzL3VzZXJzLmh0bWwnXG4gICAgfSkud2hlbignL2FwcHN0b3JlJywge1xuICAgICAgICBjb250cm9sbGVyOiAnQXBwU3RvcmVDb250cm9sbGVyJyxcbiAgICAgICAgdGVtcGxhdGVVcmw6ICd2aWV3cy9hcHBzdG9yZS5odG1sJ1xuICAgIH0pLndoZW4oJy9hcHBzJywge1xuICAgICAgICBjb250cm9sbGVyOiAnQXBwc0NvbnRyb2xsZXInLFxuICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpZXdzL2FwcHMuaHRtbCdcbiAgICB9KS53aGVuKCcvZG5zJywge1xuICAgICAgICBjb250cm9sbGVyOiAnRG5zQ29udHJvbGxlcicsXG4gICAgICAgIHRlbXBsYXRlVXJsOiAndmlld3MvZG5zLmh0bWwnXG4gICAgfSkud2hlbignL2FjY291bnQnLCB7XG4gICAgICAgIGNvbnRyb2xsZXI6ICdBY2NvdW50Q29udHJvbGxlcicsXG4gICAgICAgIHRlbXBsYXRlVXJsOiAndmlld3MvYWNjb3VudC5odG1sJ1xuICAgIH0pLndoZW4oJy9ncmFwaHMnLCB7XG4gICAgICAgIGNvbnRyb2xsZXI6ICdHcmFwaHNDb250cm9sbGVyJyxcbiAgICAgICAgdGVtcGxhdGVVcmw6ICd2aWV3cy9ncmFwaHMuaHRtbCdcbiAgICB9KS5vdGhlcndpc2UoeyByZWRpcmVjdFRvOiAnLyd9KTtcbn1dKTtcblxuLy8ga2VlcCBpbiBzeW5jIHdpdGggYXBwZGIuanNcbnZhciBJU1RBVEVTID0ge1xuICAgIElTVEFURV9QRU5ESU5HX0lOU1RBTEw6ICdwZW5kaW5nX2luc3RhbGwnLFxuICAgIElTVEFURV9QRU5ESU5HX0NPTkZJR1VSRTogJ3BlbmRpbmdfY29uZmlndXJlJyxcbiAgICBJU1RBVEVfUEVORElOR19VTklOU1RBTEw6ICdwZW5kaW5nX3VuaW5zdGFsbCcsXG4gICAgSVNUQVRFX1BFTkRJTkdfUkVTVE9SRTogJ3BlbmRpbmdfcmVzdG9yZScsXG4gICAgSVNUQVRFX1BFTkRJTkdfVVBEQVRFOiAncGVuZGluZ191cGRhdGUnLFxuICAgIElTVEFURV9FUlJPUjogJ2Vycm9yJyxcbiAgICBJU1RBVEVfSU5TVEFMTEVEOiAnaW5zdGFsbGVkJ1xufTtcblxuYXBwLmZpbHRlcignaW5zdGFsbGF0aW9uQWN0aXZlJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gSVNUQVRFUy5JU1RBVEVfRVJST1IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGlucHV0ID09PSBJU1RBVEVTLklTVEFURV9JTlNUQUxMRUQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn0pO1xuXG5hcHAuZmlsdGVyKCdpbnN0YWxsYXRpb25TdGF0ZUxhYmVsJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHN3aXRjaCAoaW5wdXQpIHtcbiAgICAgICAgY2FzZSBJU1RBVEVTLklTVEFURV9QRU5ESU5HX0lOU1RBTEw6IHJldHVybiAnSW5zdGFsbGluZyc7XG4gICAgICAgIGNhc2UgSVNUQVRFUy5JU1RBVEVfUEVORElOR19DT05GSUdVUkU6IHJldHVybiAnQ29uZmlndXJpbmcnO1xuICAgICAgICBjYXNlIElTVEFURVMuSVNUQVRFX1BFTkRJTkdfVU5JTlNUQUxMOiByZXR1cm4gJ1VuaW5zdGFsbGluZyc7XG4gICAgICAgIGNhc2UgSVNUQVRFUy5JU1RBVEVfUEVORElOR19SRVNUT1JFOiByZXR1cm4gJ1N0YXJ0aW5nJztcbiAgICAgICAgY2FzZSBJU1RBVEVTLklTVEFURV9QRU5ESU5HX1VQREFURTogcmV0dXJuICdVcGRhdGluZyc7XG4gICAgICAgIGNhc2UgSVNUQVRFUy5JU1RBVEVfRVJST1I6IHJldHVybiAnRXJyb3InO1xuICAgICAgICBjYXNlIElTVEFURVMuSVNUQVRFX0lOU1RBTExFRDogcmV0dXJuICdSdW5uaW5nJztcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuXG5hcHAuZmlsdGVyKCdhY2Nlc3NSZXN0cmljdGlvbkxhYmVsJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gJycpIHJldHVybiAncHVibGljJztcbiAgICAgICAgaWYgKGlucHV0ID09PSAncm9sZVVzZXInKSByZXR1cm4gJ3ByaXZhdGUnO1xuICAgICAgICBpZiAoaW5wdXQgPT09ICdyb2xlQWRtaW4nKSByZXR1cm4gJ3ByaXZhdGUgKEFkbWlucyBvbmx5KSc7XG5cbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH07XG59KTtcblxuLy8gY3VzdG9tIGRpcmVjdGl2ZSBmb3IgZHluYW1pYyBuYW1lcyBpbiBmb3Jtc1xuLy8gU2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjM2MTY1NzgvaXNzdWUtcmVnaXN0ZXJpbmctZm9ybS1jb250cm9sLXdpdGgtaW50ZXJwb2xhdGVkLW5hbWUjYW5zd2VyLTIzNjE3NDAxXG5hcHAuZGlyZWN0aXZlKCdsYXRlck5hbWUnLCBmdW5jdGlvbiAoKSB7ICAgICAgICAgICAgICAgICAgIC8vICgyKVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIHJlcXVpcmU6IFsnP25nTW9kZWwnLCAnXj9mb3JtJ10sICAgICAgICAgICAgICAgICAgIC8vICgzKVxuICAgICAgICBsaW5rOiBmdW5jdGlvbiBwb3N0TGluayhzY29wZSwgZWxlbSwgYXR0cnMsIGN0cmxzKSB7XG4gICAgICAgICAgICBhdHRycy4kc2V0KCduYW1lJywgYXR0cnMubGF0ZXJOYW1lKTtcblxuICAgICAgICAgICAgdmFyIG1vZGVsQ3RybCA9IGN0cmxzWzBdOyAgICAgICAgICAgICAgICAgICAgICAvLyAoMylcbiAgICAgICAgICAgIHZhciBmb3JtQ3RybCAgPSBjdHJsc1sxXTsgICAgICAgICAgICAgICAgICAgICAgLy8gKDMpXG4gICAgICAgICAgICBpZiAobW9kZWxDdHJsICYmIGZvcm1DdHJsKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxDdHJsLiRuYW1lID0gYXR0cnMubmFtZTsgICAgICAgICAgICAgIC8vICg0KVxuICAgICAgICAgICAgICAgIGZvcm1DdHJsLiRhZGRDb250cm9sKG1vZGVsQ3RybCk7ICAgICAgICAgICAvLyAoMilcbiAgICAgICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ3RybC4kcmVtb3ZlQ29udHJvbChtb2RlbEN0cmwpOyAgICAvLyAoNSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIGFuZ3VsYXIgKi9cbi8qIGdsb2JhbCBFdmVudFNvdXJjZSAqL1xuXG5hbmd1bGFyLm1vZHVsZSgnQXBwbGljYXRpb24nKS5zZXJ2aWNlKCdDbGllbnQnLCBbJyRodHRwJywgJ21kNScsIGZ1bmN0aW9uICgkaHR0cCwgbWQ1KSB7XG4gICAgdmFyIGNsaWVudCA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBDbGllbnRFcnJvcihzdGF0dXNDb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIEVycm9yLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSA0MDEpIHJldHVybiBjbGllbnQubG9nb3V0KCk7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ2xpZW50KCkge1xuICAgICAgICB0aGlzLl9yZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jb25maWdMaXN0ZW5lciA9IFtdO1xuICAgICAgICB0aGlzLl9yZWFkeUxpc3RlbmVyID0gW107XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvID0ge1xuICAgICAgICAgICAgdXNlcm5hbWU6IG51bGwsXG4gICAgICAgICAgICBlbWFpbDogbnVsbCxcbiAgICAgICAgICAgIGFkbWluOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl90b2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NsaWVudElkID0gJ2NpZC13ZWJhZG1pbic7XG4gICAgICAgIHRoaXMuX2NsaWVudFNlY3JldCA9ICd1bnVzZWQnO1xuICAgICAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICAgICAgICBhcGlTZXJ2ZXJPcmlnaW46IG51bGwsXG4gICAgICAgICAgICB3ZWJTZXJ2ZXJPcmlnaW46IG51bGwsXG4gICAgICAgICAgICBmcWRuOiBudWxsLFxuICAgICAgICAgICAgaXA6IG51bGwsXG4gICAgICAgICAgICByZXZpc2lvbjogbnVsbCxcbiAgICAgICAgICAgIHVwZGF0ZTogeyBib3g6IG51bGwsIGFwcHM6IG51bGwgfSxcbiAgICAgICAgICAgIGlzRGV2OiBmYWxzZSxcbiAgICAgICAgICAgIHByb2dyZXNzOiB7fSxcbiAgICAgICAgICAgIGlzQ3VzdG9tRG9tYWluOiBmYWxzZSxcbiAgICAgICAgICAgIGRldmVsb3Blck1vZGU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2luc3RhbGxlZEFwcHMgPSBbXTtcblxuICAgICAgICB0aGlzLnNldFRva2VuKGxvY2FsU3RvcmFnZS50b2tlbik7XG4gICAgfVxuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5zZXRSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlYWR5KSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fcmVhZHkgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWFkeUxpc3RlbmVyLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5vblJlYWR5ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZWFkeSkgY2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fcmVhZHlMaXN0ZW5lci5wdXNoKGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5vbkNvbmZpZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9jb25maWdMaXN0ZW5lci5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5fY29uZmlnKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5zZXRVc2VySW5mbyA9IGZ1bmN0aW9uICh1c2VySW5mbykge1xuICAgICAgICAvLyBJbiBvcmRlciB0byBrZWVwIHRoZSBhbmd1bGFyIGJpbmRpbmdzIGFsaXZlLCBzZXQgZWFjaCBwcm9wZXJ0eSBpbmRpdmlkdWFsbHlcbiAgICAgICAgdGhpcy5fdXNlckluZm8udXNlcm5hbWUgPSB1c2VySW5mby51c2VybmFtZTtcbiAgICAgICAgdGhpcy5fdXNlckluZm8uZW1haWwgPSB1c2VySW5mby5lbWFpbDtcbiAgICAgICAgdGhpcy5fdXNlckluZm8uYWRtaW4gPSAhIXVzZXJJbmZvLmFkbWluO1xuICAgICAgICB0aGlzLl91c2VySW5mby5ncmF2YXRhciA9ICdodHRwczovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLycgKyBtZDUuY3JlYXRlSGFzaCh1c2VySW5mby5lbWFpbC50b0xvd2VyQ2FzZSgpKSArICcuanBnP3M9MjQmZD1tbSc7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvLmdyYXZhdGFySHVnZSA9ICdodHRwczovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLycgKyBtZDUuY3JlYXRlSGFzaCh1c2VySW5mby5lbWFpbC50b0xvd2VyQ2FzZSgpKSArICcuanBnP3M9MTI4JmQ9bW0nO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnNldENvbmZpZyA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgLy8gSW4gb3JkZXIgdG8ga2VlcCB0aGUgYW5ndWxhciBiaW5kaW5ncyBhbGl2ZSwgc2V0IGVhY2ggcHJvcGVydHkgaW5kaXZpZHVhbGx5IChUT0RPOiBqdXN0IHVzZSBhbmd1bGFyLmNvcHkgPylcbiAgICAgICAgdGhpcy5fY29uZmlnLmFwaVNlcnZlck9yaWdpbiA9IGNvbmZpZy5hcGlTZXJ2ZXJPcmlnaW47XG4gICAgICAgIHRoaXMuX2NvbmZpZy53ZWJTZXJ2ZXJPcmlnaW4gPSBjb25maWcud2ViU2VydmVyT3JpZ2luO1xuICAgICAgICB0aGlzLl9jb25maWcudmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uO1xuICAgICAgICB0aGlzLl9jb25maWcuZnFkbiA9IGNvbmZpZy5mcWRuO1xuICAgICAgICB0aGlzLl9jb25maWcuaXAgPSBjb25maWcuaXA7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5yZXZpc2lvbiA9IGNvbmZpZy5yZXZpc2lvbjtcbiAgICAgICAgdGhpcy5fY29uZmlnLnVwZGF0ZSA9IGNvbmZpZy51cGRhdGU7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5pc0RldiA9IGNvbmZpZy5pc0RldjtcbiAgICAgICAgdGhpcy5fY29uZmlnLnByb2dyZXNzID0gY29uZmlnLnByb2dyZXNzO1xuICAgICAgICB0aGlzLl9jb25maWcucHJvZ3Jlc3MgPSBjb25maWcucHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5pc0N1c3RvbURvbWFpbiA9IGNvbmZpZy5pc0N1c3RvbURvbWFpbjtcbiAgICAgICAgdGhpcy5fY29uZmlnLmRldmVsb3Blck1vZGUgPSBjb25maWcuZGV2ZWxvcGVyTW9kZTtcblxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5fY29uZmlnTGlzdGVuZXIuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRoYXQuX2NvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmdldEluc3RhbGxlZEFwcHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YWxsZWRBcHBzO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmdldFVzZXJJbmZvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlckluZm87XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZ2V0Q29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnNldFRva2VuID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICRodHRwLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uLkF1dGhvcml6YXRpb24gPSAnQmVhcmVyICcgKyB0b2tlbjtcbiAgICAgICAgaWYgKCF0b2tlbikgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3Rva2VuJyk7XG4gICAgICAgIGVsc2UgbG9jYWxTdG9yYWdlLnRva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuX3Rva2VuID0gdG9rZW47XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogUmVzdCBBUEkgd3JhcHBlcnNcbiAgICAgKi9cbiAgICBDbGllbnQucHJvdG90eXBlLmNvbmZpZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5nZXQoJy9hcGkvdjEvY2xvdWRyb24vY29uZmlnJykuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnVzZXJJbmZvID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICAkaHR0cC5nZXQoJy9hcGkvdjEvcHJvZmlsZScpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDAgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuXG4gICAgICAgICAgICAvLyBjYWNoZSB1c2VyIGluZm9cbiAgICAgICAgICAgIHRoYXQuc2V0VXNlckluZm8oZGF0YSk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuY2hhbmdlRGV2ZWxvcGVyTW9kZSA9IGZ1bmN0aW9uIChlbmFibGVkLCBwYXNzd29yZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIHZhciBkYXRhID0geyBwYXNzd29yZDogcGFzc3dvcmQsIGVuYWJsZWQ6IGVuYWJsZWQgfTtcbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9kZXZlbG9wZXInLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCkgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcblxuICAgICAgICAgICAgLy8gd2lsbCBnZXQgb3ZlcnJpZGVuIGFmdGVyIHBvbGxpbmcgZm9yIGNvbmZpZywgYnV0IGVuc3VyZXMgcXVpY2sgVUkgdXBkYXRlXG4gICAgICAgICAgICB0aGF0Ll9jb25maWcuZGV2ZWxvcGVyTW9kZSA9IGVuYWJsZWQ7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuaW5zdGFsbEFwcCA9IGZ1bmN0aW9uIChpZCwgbWFuaWZlc3QsIHBhc3N3b3JkLCB0aXRsZSwgY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBkYXRhID0geyBhcHBTdG9yZUlkOiBpZCwgbWFuaWZlc3Q6IG1hbmlmZXN0LCBwYXNzd29yZDogcGFzc3dvcmQsIGxvY2F0aW9uOiBjb25maWcubG9jYXRpb24sIHBvcnRCaW5kaW5nczogY29uZmlnLnBvcnRCaW5kaW5ncywgYWNjZXNzUmVzdHJpY3Rpb246IGNvbmZpZy5hY2Nlc3NSZXN0cmljdGlvbiB9O1xuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2FwcHMvaW5zdGFsbCcsIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcblxuICAgICAgICAgICAgLy8gcHV0IG5ldyBhcHAgd2l0aCBhbWVuZGVkIHRpdGxlIGluIGNhY2hlXG4gICAgICAgICAgICBkYXRhLm1hbmlmZXN0ID0geyB0aXRsZTogdGl0bGUgfTtcbiAgICAgICAgICAgIHRoYXQuX2luc3RhbGxlZEFwcHMucHVzaChkYXRhKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YS5pZCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS51bmluc3RhbGxBcHAgPSBmdW5jdGlvbiAoYXBwSWQsIHBhc3N3b3JkLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0YSA9IHsgcGFzc3dvcmQ6IHBhc3N3b3JkIH07XG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvYXBwcy8nICsgYXBwSWQgKyAnL3VuaW5zdGFsbCcsIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5jb25maWd1cmVBcHAgPSBmdW5jdGlvbiAoaWQsIHBhc3N3b3JkLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkYXRhID0geyBhcHBJZDogaWQsIHBhc3N3b3JkOiBwYXNzd29yZCwgbG9jYXRpb246IGNvbmZpZy5sb2NhdGlvbiwgcG9ydEJpbmRpbmdzOiBjb25maWcucG9ydEJpbmRpbmdzLCBhY2Nlc3NSZXN0cmljdGlvbjogY29uZmlnLmFjY2Vzc1Jlc3RyaWN0aW9uIH07XG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvYXBwcy8nICsgaWQgKyAnL2NvbmZpZ3VyZScsIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBcHAgPSBmdW5jdGlvbiAoaWQsIG1hbmlmZXN0LCBwb3J0QmluZGluZ3MsIHBhc3N3b3JkLCBjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2FwcHMvJyArIGlkICsgJy91cGRhdGUnLCB7IG1hbmlmZXN0OiBtYW5pZmVzdCwgcGFzc3dvcmQ6IHBhc3N3b3JkLCBwb3J0QmluZGluZ3M6IHBvcnRCaW5kaW5ncyB9KS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMikgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuc3RhcnRBcHAgPSBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkYXRhID0geyB9O1xuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2FwcHMvJyArIGlkICsgJy9zdGFydCcsIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5zdG9wQXBwID0gZnVuY3Rpb24gKGlkLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0YSA9IHsgfTtcbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9hcHBzLycgKyBpZCArICcvc3RvcCcsIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS52ZXJzaW9uID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLmdldCgnL2FwaS92MS9jbG91ZHJvbi9zdGF0dXMnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuaXNTZXJ2ZXJGaXJzdFRpbWUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAuZ2V0KCcvYXBpL3YxL2Nsb3Vkcm9uL3N0YXR1cycpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDAgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgIWRhdGEuYWN0aXZhdGVkKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmdldE5ha2VkRG9tYWluID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLmdldCgnL2FwaS92MS9zZXR0aW5ncy9uYWtlZF9kb21haW4nKVxuICAgICAgICAuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDAgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YS5hcHBpZCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5zZXROYWtlZERvbWFpbiA9IGZ1bmN0aW9uIChhcHBpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9zZXR0aW5ncy9uYWtlZF9kb21haW4nLCB7IGFwcGlkOiBhcHBpZCB9KS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwNCkgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZ2V0QXBwcyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5nZXQoJy9hcGkvdjEvYXBwcycpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEuYXBwcyk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5nZXRBcHAgPSBmdW5jdGlvbiAoYXBwSWQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBhcHBGb3VuZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2luc3RhbGxlZEFwcHMuc29tZShmdW5jdGlvbiAoYXBwKSB7XG4gICAgICAgICAgICBpZiAoYXBwLmlkID09PSBhcHBJZCkge1xuICAgICAgICAgICAgICAgIGFwcEZvdW5kID0gYXBwO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhcHBGb3VuZCkgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGFwcEZvdW5kKTtcbiAgICAgICAgZWxzZSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdBcHAgbm90IGZvdW5kJykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmdldEFwcExvZ1N0cmVhbSA9IGZ1bmN0aW9uIChhcHBJZCkge1xuICAgICAgICB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvYXBpL3YxL2FwcHMvJyArIGFwcElkICsgJy9sb2dzdHJlYW0nKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5nZXRBcHBMb2dVcmwgPSBmdW5jdGlvbiAoYXBwSWQpIHtcbiAgICAgICAgcmV0dXJuICcvYXBpL3YxL2FwcHMvJyArIGFwcElkICsgJy9sb2dzP2FjY2Vzc190b2tlbj0nICsgdGhpcy5fdG9rZW47XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuc2V0QWRtaW4gPSBmdW5jdGlvbiAodXNlcm5hbWUsIGFkbWluLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgICAgICAgIGFkbWluOiBhZG1pblxuICAgICAgICB9O1xuXG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvdXNlcnMvJyArIHVzZXJuYW1lICsgJy9hZG1pbicsIHBheWxvYWQpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjA0KSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5jcmVhdGVBZG1pbiA9IGZ1bmN0aW9uICh1c2VybmFtZSwgcGFzc3dvcmQsIGVtYWlsLCBzZXR1cFRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgICAgIGVtYWlsOiBlbWFpbFxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2Nsb3Vkcm9uL2FjdGl2YXRlP3NldHVwVG9rZW49JyArIHNldHVwVG9rZW4sIHBheWxvYWQpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuXG4gICAgICAgICAgICB0aGF0LnNldFRva2VuKGRhdGEudG9rZW4pO1xuICAgICAgICAgICAgdGhhdC5zZXRVc2VySW5mbyh7IHVzZXJuYW1lOiB1c2VybmFtZSwgZW1haWw6IGVtYWlsLCBhZG1pbjogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YS5hY3RpdmF0ZWQpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUubGlzdFVzZXJzID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLmdldCgnL2FwaS92MS91c2VycycpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDAgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5nZXRPQXV0aENsaWVudHMgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAuZ2V0KCcvYXBpL3YxL29hdXRoL2NsaWVudHMnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEuY2xpZW50cyk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5kZWxUb2tlbnNCeUNsaWVudElkID0gZnVuY3Rpb24gKGlkLCBjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5kZWxldGUoJy9hcGkvdjEvb2F1dGgvY2xpZW50cy8nICsgaWQgKyAnL3Rva2VucycpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDQpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChwYXNzd29yZCwgY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9jbG91ZHJvbi91cGRhdGUnLCB7IHBhc3N3b3JkOiBwYXNzd29yZCB9KS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUucmVib290ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLmdldCgnL2FwaS92MS9jbG91ZHJvbi9yZWJvb3QnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuYmFja3VwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvY2xvdWRyb24vYmFja3VwcycpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDIgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5zZXRDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uIChjZXJ0aWZpY2F0ZUZpbGUsIGtleUZpbGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd3aWxsIHNldCBjZXJ0aWZpY2F0ZScpO1xuXG4gICAgICAgIHZhciBmZCA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmZC5hcHBlbmQoJ2NlcnRpZmljYXRlJywgY2VydGlmaWNhdGVGaWxlKTtcbiAgICAgICAgZmQuYXBwZW5kKCdrZXknLCBrZXlGaWxlKTtcblxuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2Nsb3Vkcm9uL2NlcnRpZmljYXRlJywgZmQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogYW5ndWxhci5pZGVudGl0eVxuICAgICAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5ncmFwaHMgPSBmdW5jdGlvbiAodGFyZ2V0cywgZnJvbSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0cyxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6ICdqc29uJyxcbiAgICAgICAgICAgICAgICBmcm9tOiBmcm9tXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgJGh0dHAuZ2V0KCcvYXBpL3YxL2Nsb3Vkcm9uL2dyYXBocycsIGNvbmZpZykuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDAgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5jcmVhdGVVc2VyID0gZnVuY3Rpb24gKHVzZXJuYW1lLCBlbWFpbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgICBlbWFpbDogZW1haWxcbiAgICAgICAgfTtcblxuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL3VzZXJzJywgZGF0YSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnJlbW92ZVVzZXIgPSBmdW5jdGlvbiAodXNlcklkLCBwYXNzd29yZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmRcbiAgICAgICAgfTtcblxuICAgICAgICAkaHR0cCh7IG1ldGhvZDogJ0RFTEVURScsIHVybDogJy9hcGkvdjEvdXNlcnMvJyArIHVzZXJJZCwgZGF0YTogZGF0YSwgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH19KS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjA0KSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5jaGFuZ2VQYXNzd29yZCA9IGZ1bmN0aW9uIChjdXJyZW50UGFzc3dvcmQsIG5ld1Bhc3N3b3JkLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBjdXJyZW50UGFzc3dvcmQsXG4gICAgICAgICAgICBuZXdQYXNzd29yZDogbmV3UGFzc3dvcmRcbiAgICAgICAgfTtcblxuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL3VzZXJzLycgKyB0aGlzLl91c2VySW5mby51c2VybmFtZSArICcvcGFzc3dvcmQnLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjA0KSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5jaGFuZ2VFbWFpbCA9IGZ1bmN0aW9uIChlbWFpbCwgcGFzc3dvcmQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICAgIH07XG5cbiAgICAgICAgJGh0dHAucHV0KCcvYXBpL3YxL3VzZXJzLycgKyB0aGlzLl91c2VySW5mby51c2VybmFtZSwgZGF0YSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwNCkgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUucmVmcmVzaENvbmZpZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgY2FsbGJhY2sgPSB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICAgIHRoaXMuY29uZmlnKGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG5cbiAgICAgICAgICAgIHRoYXQuc2V0Q29uZmlnKHJlc3VsdCk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUucmVmcmVzaEluc3RhbGxlZEFwcHMgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIGNhbGxiYWNrID0gdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICB0aGlzLmdldEFwcHMoZnVuY3Rpb24gKGVycm9yLCBhcHBzKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGluc2VydCBvciB1cGRhdGUgbmV3IGFwcHNcbiAgICAgICAgICAgIGFwcHMuZm9yRWFjaChmdW5jdGlvbiAoYXBwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoYXQuX2luc3RhbGxlZEFwcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2luc3RhbGxlZEFwcHNbaV0uaWQgPT09IGFwcC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuY29weShhcHAsIHRoYXQuX2luc3RhbGxlZEFwcHNbZm91bmRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pbnN0YWxsZWRBcHBzLnB1c2goYXBwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBvbGQgZW50cmllcywgZ29pbmcgYmFja3dhcmRzIHRvIGFsbG93IHNwbGljaW5nXG4gICAgICAgICAgICBmb3IodmFyIGkgPSB0aGF0Ll9pbnN0YWxsZWRBcHBzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhcHBzLnNvbWUoZnVuY3Rpb24gKGVsZW0pIHsgcmV0dXJuIChlbGVtLmlkID09PSB0aGF0Ll9pbnN0YWxsZWRBcHBzW2ldLmlkKTsgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5faW5zdGFsbGVkQXBwcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5sb2dvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2V0VG9rZW4obnVsbCk7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvID0ge307XG5cbiAgICAgICAgLy8gbG9nb3V0IGZyb20gT0F1dGggc2Vzc2lvblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvYXBpL3YxL3Nlc3Npb24vbG9nb3V0JztcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5leGNoYW5nZUNvZGVGb3JUb2tlbiA9IGZ1bmN0aW9uIChhdXRoQ29kZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgICAgIGNvZGU6IGF1dGhDb2RlLFxuICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luLFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLl9jbGllbnRJZCxcbiAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuX2NsaWVudFNlY3JldFxuICAgICAgICB9O1xuXG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvb2F1dGgvdG9rZW4/cmVzcG9uc2VfdHlwZT10b2tlbiZjbGllbnRfaWQ9JyArIHRoaXMuX2NsaWVudElkLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YS5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIGNsaWVudCA9IG5ldyBDbGllbnQoKTtcbiAgICByZXR1cm4gY2xpZW50O1xufV0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5hbmd1bGFyLm1vZHVsZSgnQXBwbGljYXRpb24nKS5jb250cm9sbGVyKCdBcHBTdG9yZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnJHRpbWVvdXQnLCAnQ2xpZW50JywgJ0FwcFN0b3JlJywgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCAkdGltZW91dCwgQ2xpZW50LCBBcHBTdG9yZSkge1xuICAgIENsaWVudC5vblJlYWR5KGZ1bmN0aW9uICgpIHsgaWYgKCFDbGllbnQuZ2V0VXNlckluZm8oKS5hZG1pbikgJGxvY2F0aW9uLnBhdGgoJy8nKTsgfSk7XG5cbiAgICAkc2NvcGUucmVhZHkgPSBmYWxzZTtcbiAgICAkc2NvcGUuYXBwcyA9IFtdO1xuICAgICRzY29wZS5jb25maWcgPSBDbGllbnQuZ2V0Q29uZmlnKCk7XG5cbiAgICAkc2NvcGUuYXBwaW5zdGFsbCA9IHtcbiAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7fSxcbiAgICAgICAgYXBwOiB7fSxcbiAgICAgICAgbG9jYXRpb246ICcnLFxuICAgICAgICBwYXNzd29yZDogJycsXG4gICAgICAgIHBvcnRCaW5kaW5nczoge30sXG4gICAgICAgIGFjY2Vzc1Jlc3RyaWN0aW9uOiAnJ1xuICAgIH07XG5cbiAgICAkc2NvcGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuYXBwID0ge307XG4gICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmxvY2F0aW9uID0gJyc7XG4gICAgICAgICRzY29wZS5hcHBpbnN0YWxsLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICRzY29wZS5hcHBpbnN0YWxsLnBvcnRCaW5kaW5ncyA9IHt9O1xuICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5hY2Nlc3NSZXN0cmljdGlvbiA9ICcnO1xuICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5lcnJvciA9IHt9O1xuXG4gICAgICAgICRzY29wZS5pbnN0YWxsX2Zvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICRzY29wZS5pbnN0YWxsX2Zvcm0uJHNldFVudG91Y2hlZCgpO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2hvd0luc3RhbGwgPSBmdW5jdGlvbiAoYXBwKSB7XG4gICAgICAgICRzY29wZS5yZXNldCgpO1xuXG4gICAgICAgIEFwcFN0b3JlLmdldE1hbmlmZXN0KGFwcC5pZCwgZnVuY3Rpb24gKGVycm9yLCBtYW5pZmVzdCkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGFkZCBtYW5pZmVzdCB0byBhcHAgb2JqZWN0XG4gICAgICAgICAgICBhcHAubWFuaWZlc3QgPSBtYW5pZmVzdDtcblxuICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuYXBwID0gYXBwO1xuICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwubG9jYXRpb24gPSBhcHAubG9jYXRpb247XG4gICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5wb3J0QmluZGluZ3NJbmZvID0gbWFuaWZlc3QudGNwUG9ydHM7ICAgICAvLyBQb3J0YmluZGluZyBtYXAgb25seSBmb3IgaW5mb3JtYXRpb25cbiAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLnBvcnRCaW5kaW5ncyA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGFjdHVhbCBtb2RlbCBob2xkaW5nIHRoZSBlbnY6cG9ydCBwYWlyXG4gICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5hY2Nlc3NSZXN0cmljdGlvbiA9IGFwcC5hY2Nlc3NSZXN0cmljdGlvbiB8fCAnJztcblxuICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgcG9ydHNcbiAgICAgICAgICAgIGZvciAodmFyIGVudiBpbiBtYW5pZmVzdC50Y3BQb3J0cykge1xuICAgICAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLnBvcnRCaW5kaW5nc1tlbnZdID0gbWFuaWZlc3QudGNwUG9ydHNbZW52XS5kZWZhdWx0VmFsdWUgfHwgMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJCgnI2FwcEluc3RhbGxNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkc2NvcGUuZG9JbnN0YWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5idXN5ID0gdHJ1ZTtcbiAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuZXJyb3IubmFtZSA9IG51bGw7XG4gICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuZXJyb3IucG9ydCA9IG51bGw7XG5cbiAgICAgICAgQ2xpZW50Lmluc3RhbGxBcHAoJHNjb3BlLmFwcGluc3RhbGwuYXBwLmlkLCAkc2NvcGUuYXBwaW5zdGFsbC5hcHAubWFuaWZlc3QsICRzY29wZS5hcHBpbnN0YWxsLnBhc3N3b3JkLCAkc2NvcGUuYXBwaW5zdGFsbC5hcHAudGl0bGUsIHsgbG9jYXRpb246ICRzY29wZS5hcHBpbnN0YWxsLmxvY2F0aW9uLCBwb3J0QmluZGluZ3M6ICRzY29wZS5hcHBpbnN0YWxsLnBvcnRCaW5kaW5ncywgYWNjZXNzUmVzdHJpY3Rpb246ICRzY29wZS5hcHBpbnN0YWxsLmFjY2Vzc1Jlc3RyaWN0aW9uIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwOSAmJiBlcnJvci5tZXNzYWdlLmluZGV4T2YoJ2lzIHJlc2VydmVkJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmVycm9yLnBvcnQgPSAnVGhpcyBwb3J0IGlzIGFscmVhZHkgaW4gdXNlLic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDkpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuZXJyb3IubmFtZSA9ICdBcHBsaWNhdGlvbiBhbHJlYWR5IGV4aXN0cy4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmVycm9yLnBhc3N3b3JkID0gJ1dyb25nIHBhc3N3b3JkIHByb3ZpZGVkLic7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuZXJyb3IubmFtZSA9ICdBcHAgd2l0aCB0aGUgbmFtZSAnICsgJHNjb3BlLmFwcGluc3RhbGwuYXBwLm5hbWUgKyAnIGNhbm5vdCBiZSBpbnN0YWxsZWQuJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5idXN5ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICQoJyNhcHBJbnN0YWxsTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG4gICAgICAgICAgICAkc2NvcGUucmVzZXQoKTtcblxuICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9hcHBzJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgICAgICAkc2NvcGUucmVhZHkgPSBmYWxzZTtcblxuICAgICAgICBBcHBTdG9yZS5nZXRBcHBzKGZ1bmN0aW9uIChlcnJvciwgYXBwcykge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICR0aW1lb3V0KHJlZnJlc2gsIDEwMDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkc2NvcGUuYXBwcyA9IGFwcHM7XG4gICAgICAgICAgICAkc2NvcGUucmVhZHkgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoKCk7XG5cbiAgICAvLyBzZXR1cCBhbGwgdGhlIGRpYWxvZyBmb2N1cyBoYW5kbGluZ1xuICAgIFsnYXBwSW5zdGFsbE1vZGFsJ10uZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgJCgnIycgKyBpZCkub24oJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCh0aGlzKS5maW5kKFwiW2F1dG9mb2N1c106Zmlyc3RcIikuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmFuZ3VsYXIubW9kdWxlKCdBcHBsaWNhdGlvbicpLmNvbnRyb2xsZXIoJ01haW5Db250cm9sbGVyJywgWyckc2NvcGUnLCAnJHJvdXRlJywgJyRpbnRlcnZhbCcsICdDbGllbnQnLCBmdW5jdGlvbiAoJHNjb3BlLCAkcm91dGUsICRpbnRlcnZhbCwgQ2xpZW50KSB7XG4gICAgJHNjb3BlLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgJHNjb3BlLnVzZXJJbmZvID0gQ2xpZW50LmdldFVzZXJJbmZvKCk7XG4gICAgJHNjb3BlLmNvbmZpZyA9IHt9O1xuXG4gICAgJHNjb3BlLnVwZGF0ZSA9IHtcbiAgICAgICAgZXJyb3I6IHt9LFxuICAgICAgICBwYXNzd29yZDogJydcbiAgICB9O1xuXG4gICAgJHNjb3BlLmlzQWN0aXZlID0gZnVuY3Rpb24gKHVybCkge1xuICAgICAgICBpZiAoISRyb3V0ZS5jdXJyZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAkcm91dGUuY3VycmVudC4kJHJvdXRlLm9yaWdpbmFsUGF0aC5pbmRleE9mKHVybCkgPT09IDA7XG4gICAgfTtcblxuICAgICRzY29wZS5sb2dvdXQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICRzY29wZS5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICBDbGllbnQubG9nb3V0KCk7XG4gICAgfTtcblxuICAgICRzY29wZS5sb2dpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrVVJMID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArICcvbG9naW5fY2FsbGJhY2suaHRtbCc7XG4gICAgICAgIHZhciBzY29wZSA9ICdyb290LHByb2ZpbGUsYXBwcyxyb2xlQWRtaW4nO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvYXBpL3YxL29hdXRoL2RpYWxvZy9hdXRob3JpemU/cmVzcG9uc2VfdHlwZT1jb2RlJmNsaWVudF9pZD0nICsgQ2xpZW50Ll9jbGllbnRJZCArICcmcmVkaXJlY3RfdXJpPScgKyBjYWxsYmFja1VSTCArICcmc2NvcGU9JyArIHNjb3BlO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2V0dXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9lcnJvci5odG1sP2Vycm9yQ29kZT0xJztcbiAgICB9O1xuXG4gICAgJHNjb3BlLmVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZXJyb3IuaHRtbCc7XG4gICAgfTtcblxuICAgICRzY29wZS5zaG93VXBkYXRlTW9kYWwgPSBmdW5jdGlvbiAoZm9ybSkge1xuICAgICAgICAkc2NvcGUudXBkYXRlLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnVwZGF0ZS5wYXNzd29yZCA9ICcnO1xuXG4gICAgICAgIGZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgIGZvcm0uJHNldFVudG91Y2hlZCgpO1xuXG4gICAgICAgICQoJyN1cGRhdGVNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfTtcblxuICAgICRzY29wZS5kb1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJHNjb3BlLnVwZGF0ZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG5cbiAgICAgICAgQ2xpZW50LnVwZGF0ZSgkc2NvcGUudXBkYXRlLnBhc3N3b3JkLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVwZGF0ZS5lcnJvci5wYXNzd29yZCA9ICdJbmNvcnJlY3QgcGFzc3dvcmQnO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUudXBkYXRlLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIHVwZGF0ZS4nLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL3VwZGF0ZS5odG1sJztcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5iYWNrdXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJyNiYWNrdXBQcm9ncmVzc01vZGFsJykubW9kYWwoJ3Nob3cnKTtcblxuICAgICAgICAkc2NvcGUuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgICBDbGllbnQuYmFja3VwKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgLy8gVE9ETyB0aGlzIGRvZXMgbG9vayBsaWtlIHdlIHNob3VsZCB1c2UgcHJvZ3Jlc3MuanNvbj9cbiAgICAgICAgICAgIC8vIG5vdyBzdGFydCBxdWVyeVxuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tJZkRvbmUoKSB7XG4gICAgICAgICAgICAgICAgQ2xpZW50LnZlcnNpb24oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrSWZEb25lLCAxMDAwKTtcblxuICAgICAgICAgICAgICAgICAgICAkKCcjYmFja3VwUHJvZ3Jlc3NNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrSWZEb25lLCA1MDAwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIENsaWVudC5pc1NlcnZlckZpcnN0VGltZShmdW5jdGlvbiAoZXJyb3IsIGlzRmlyc3RUaW1lKSB7XG4gICAgICAgIGlmIChlcnJvcikgcmV0dXJuICRzY29wZS5lcnJvcihlcnJvcik7XG4gICAgICAgIGlmIChpc0ZpcnN0VGltZSkgcmV0dXJuICRzY29wZS5zZXR1cCgpO1xuXG4gICAgICAgIC8vIHdlIHVzZSB0aGUgY29uZmlnIHJlcXVlc3QgYXMgYW4gaW5kaWNhdG9yIGlmIHRoZSB0b2tlbiBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBwcm9iYWJseSBhdHRhY2ggc3VjaCBhIGhhbmRsZXIgZm9yIGVhY2ggcmVxdWVzdCwgYXMgdGhlIHRva2VuIGNhbiBnZXQgaW52YWxpZFxuICAgICAgICAvLyBhdCBhbnkgdGltZSFcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS50b2tlbikge1xuICAgICAgICAgICAgQ2xpZW50LnJlZnJlc2hDb25maWcoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMSkgcmV0dXJuICRzY29wZS5sb2dpbigpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuICRzY29wZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBhcmUgYWN0dWFsbHkgdXBkYXRlaW5nXG4gICAgICAgICAgICAgICAgaWYgKENsaWVudC5nZXRDb25maWcoKS5wcm9ncmVzcy51cGRhdGUpIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy91cGRhdGUuaHRtbCc7XG5cbiAgICAgICAgICAgICAgICBDbGllbnQudXNlckluZm8oZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gJHNjb3BlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICBDbGllbnQucmVmcmVzaEluc3RhbGxlZEFwcHMoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiAkc2NvcGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBraWNrIG9mZiBpbnN0YWxsZWQgYXBwcyBhbmQgY29uZmlnIHBvbGxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZyZXNoQXBwc1RpbWVyID0gJGludGVydmFsKENsaWVudC5yZWZyZXNoSW5zdGFsbGVkQXBwcy5iaW5kKENsaWVudCksIDIwMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZnJlc2hDb25maWdUaW1lciA9ICRpbnRlcnZhbChDbGllbnQucmVmcmVzaENvbmZpZy5iaW5kKENsaWVudCksIDUwMDApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKHJlZnJlc2hBcHBzVGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwocmVmcmVzaENvbmZpZ1RpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgbWFyayB0aGUgQ2xpZW50IHRvIGJlIHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQuc2V0UmVhZHkoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmNvbmZpZyA9IENsaWVudC5nZXRDb25maWcoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRzY29wZS5sb2dpbigpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyB3YWl0IHRpbGwgdGhlIHZpZXcgaGFzIGxvYWRlZCB1bnRpbCBzaG93aW5nIGEgbW9kYWwgZGlhbG9nXG4gICAgQ2xpZW50Lm9uQ29uZmlnKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm9ncmVzcy51cGRhdGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy91cGRhdGUuaHRtbCc7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHNldHVwIGFsbCB0aGUgZGlhbG9nIGZvY3VzIGhhbmRsaW5nXG4gICAgWyd1cGRhdGVNb2RhbCddLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICQoJyMnICsgaWQpLm9uKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykuZmluZChcIlthdXRvZm9jdXNdOmZpcnN0XCIpLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufV0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5hbmd1bGFyLm1vZHVsZSgnQXBwbGljYXRpb24nKS5jb250cm9sbGVyKCdBY2NvdW50Q29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICdDbGllbnQnLCBmdW5jdGlvbiAoJHNjb3BlLCAkbG9jYXRpb24sIENsaWVudCkge1xuICAgICRzY29wZS51c2VyID0gQ2xpZW50LmdldFVzZXJJbmZvKCk7XG4gICAgJHNjb3BlLmNvbmZpZyA9IENsaWVudC5nZXRDb25maWcoKTtcblxuICAgICRzY29wZS5hY3RpdmVDbGllbnRzID0gW107XG4gICAgJHNjb3BlLnRva2VuSW5Vc2UgPSBudWxsO1xuXG4gICAgJHNjb3BlLnBhc3N3b3JkY2hhbmdlID0ge1xuICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHt9LFxuICAgICAgICBwYXNzd29yZDogJycsXG4gICAgICAgIG5ld1Bhc3N3b3JkOiAnJyxcbiAgICAgICAgbmV3UGFzc3dvcmRSZXBlYXQ6ICcnXG4gICAgfTtcblxuICAgICRzY29wZS5lbWFpbGNoYW5nZSA9IHtcbiAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7fSxcbiAgICAgICAgZW1haWw6ICcnLFxuICAgICAgICBwYXNzd29yZDogJydcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2UgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIHBhc3N3b3JkOiAnJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwYXNzd29yZENoYW5nZVJlc2V0IChmb3JtKSB7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5lcnJvci5uZXdQYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5lcnJvci5uZXdQYXNzd29yZFJlcGVhdCA9IG51bGw7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5wYXNzd29yZCA9ICcnO1xuICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UubmV3UGFzc3dvcmQgPSAnJztcbiAgICAgICAgJHNjb3BlLnBhc3N3b3JkY2hhbmdlLm5ld1Bhc3N3b3JkUmVwZWF0ID0gJyc7XG5cbiAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgIGZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICBmb3JtLiRzZXRVbnRvdWNoZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtYWlsQ2hhbmdlUmVzZXQgKGZvcm0pIHtcbiAgICAgICAgJHNjb3BlLmVtYWlsY2hhbmdlLmVycm9yLmVtYWlsID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLmVtYWlsY2hhbmdlLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLmVtYWlsY2hhbmdlLmVtYWlsID0gJyc7XG4gICAgICAgICRzY29wZS5lbWFpbGNoYW5nZS5wYXNzd29yZCA9ICcnO1xuXG4gICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICBmb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAgICAgZm9ybS4kc2V0VW50b3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXZlbG9wZXJNb2RlQ2hhbmdlUmVzZXQgKCkge1xuICAgICAgICAkc2NvcGUuZGV2ZWxvcGVyTW9kZUNoYW5nZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlLnBhc3N3b3JkID0gJyc7XG5cbiAgICAgICAgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2VGb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAkc2NvcGUuZGV2ZWxvcGVyTW9kZUNoYW5nZUZvcm0uJHNldFVudG91Y2hlZCgpO1xuICAgIH1cblxuICAgICRzY29wZS5kb0NoYW5nZVBhc3N3b3JkID0gZnVuY3Rpb24gKGZvcm0pIHtcbiAgICAgICAgJHNjb3BlLnBhc3N3b3JkY2hhbmdlLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnBhc3N3b3JkY2hhbmdlLmVycm9yLm5ld1Bhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnBhc3N3b3JkY2hhbmdlLmVycm9yLm5ld1Bhc3N3b3JkUmVwZWF0ID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnBhc3N3b3JkY2hhbmdlLmJ1c3kgPSB0cnVlO1xuXG4gICAgICAgIENsaWVudC5jaGFuZ2VQYXNzd29yZCgkc2NvcGUucGFzc3dvcmRjaGFuZ2UucGFzc3dvcmQsICRzY29wZS5wYXNzd29yZGNoYW5nZS5uZXdQYXNzd29yZCwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5lcnJvci5wYXNzd29yZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5wYXNzd29yZCA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBjaGFuZ2UgcGFzc3dvcmQuJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICBwYXNzd29yZENoYW5nZVJlc2V0KGZvcm0pO1xuXG4gICAgICAgICAgICAkKCcjcGFzc3dvcmRDaGFuZ2VNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkc2NvcGUuZG9DaGFuZ2VFbWFpbCA9IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgICAgICRzY29wZS5lbWFpbGNoYW5nZS5lcnJvci5lbWFpbCA9IG51bGw7XG4gICAgICAgICRzY29wZS5lbWFpbGNoYW5nZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5lbWFpbGNoYW5nZS5idXN5ID0gdHJ1ZTtcblxuICAgICAgICBDbGllbnQuY2hhbmdlRW1haWwoJHNjb3BlLmVtYWlsY2hhbmdlLmVtYWlsLCAkc2NvcGUuZW1haWxjaGFuZ2UucGFzc3dvcmQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZW1haWxjaGFuZ2UuZXJyb3IucGFzc3dvcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZW1haWxjaGFuZ2UucGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gY2hhbmdlIGVtYWlsLicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkc2NvcGUuZW1haWxjaGFuZ2UuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgZW1haWxDaGFuZ2VSZXNldChmb3JtKTtcblxuICAgICAgICAgICAgLy8gZmV0Y2ggbmV3IGluZm8gaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgIENsaWVudC51c2VySW5mbyhmdW5jdGlvbiAoKSB7fSk7XG5cbiAgICAgICAgICAgICQoJyNlbWFpbENoYW5nZU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5kb0NoYW5nZURldmVsb3Blck1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2UuYnVzeSA9IHRydWU7XG5cbiAgICAgICAgQ2xpZW50LmNoYW5nZURldmVsb3Blck1vZGUoISRzY29wZS5jb25maWcuZGV2ZWxvcGVyTW9kZSwgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2UucGFzc3dvcmQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGV2ZWxvcGVyTW9kZUNoYW5nZS5lcnJvci5wYXNzd29yZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIGNoYW5nZSBwYXNzd29yZC4nLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2UuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgZGV2ZWxvcGVyTW9kZUNoYW5nZVJlc2V0KCk7XG5cbiAgICAgICAgICAgICQoJyNkZXZlbG9wZXJNb2RlQ2hhbmdlTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLnNob3dDaGFuZ2VQYXNzd29yZCA9IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgICAgIHBhc3N3b3JkQ2hhbmdlUmVzZXQoZm9ybSk7XG5cbiAgICAgICAgJCgnI3Bhc3N3b3JkQ2hhbmdlTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2hvd0NoYW5nZUVtYWlsID0gZnVuY3Rpb24gKGZvcm0pIHtcbiAgICAgICAgZW1haWxDaGFuZ2VSZXNldChmb3JtKTtcblxuICAgICAgICAkKCcjZW1haWxDaGFuZ2VNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfTtcblxuICAgICRzY29wZS5zaG93Q2hhbmdlRGV2ZWxvcGVyTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGV2ZWxvcGVyTW9kZUNoYW5nZVJlc2V0KCk7XG5cbiAgICAgICAgJCgnI2RldmVsb3Blck1vZGVDaGFuZ2VNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfTtcblxuICAgICRzY29wZS5yZW1vdmVBY2Nlc3NUb2tlbnMgPSBmdW5jdGlvbiAoY2xpZW50LCBldmVudCkge1xuICAgICAgICBDbGllbnQuZGVsVG9rZW5zQnlDbGllbnRJZChjbGllbnQuaWQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQub25SZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgICRzY29wZS50b2tlbkluVXNlID0gQ2xpZW50Ll90b2tlbjtcblxuICAgICAgICBDbGllbnQuZ2V0T0F1dGhDbGllbnRzKGZ1bmN0aW9uIChlcnJvciwgYWN0aXZlQ2xpZW50cykge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgICRzY29wZS5hY3RpdmVDbGllbnRzID0gYWN0aXZlQ2xpZW50cztcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXR1cCBhbGwgdGhlIGRpYWxvZyBmb2N1cyBoYW5kbGluZ1xuICAgIFsncGFzc3dvcmRDaGFuZ2VNb2RhbCcsICdlbWFpbENoYW5nZU1vZGFsJywgJ2RldmVsb3Blck1vZGVDaGFuZ2VNb2RhbCddLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICQoJyMnICsgaWQpLm9uKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykuZmluZChcIlthdXRvZm9jdXNdOmZpcnN0XCIpLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufV0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5hbmd1bGFyLm1vZHVsZSgnQXBwbGljYXRpb24nKS5jb250cm9sbGVyKCdBcHBzQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICdDbGllbnQnLCAnQXBwU3RvcmUnLCBmdW5jdGlvbiAoJHNjb3BlLCAkbG9jYXRpb24sIENsaWVudCwgQXBwU3RvcmUpIHtcbiAgICAkc2NvcGUuSE9TVF9QT1JUX01JTiA9IDEwMjQ7XG4gICAgJHNjb3BlLkhPU1RfUE9SVF9NQVggPSA2NTUzNTtcblxuICAgICRzY29wZS5pbnN0YWxsZWRBcHBzID0gQ2xpZW50LmdldEluc3RhbGxlZEFwcHMoKTtcbiAgICAkc2NvcGUuY29uZmlnID0gQ2xpZW50LmdldENvbmZpZygpO1xuXG4gICAgJHNjb3BlLmFwcGNvbmZpZ3VyZSA9IHtcbiAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7fSxcbiAgICAgICAgYXBwOiB7fSxcbiAgICAgICAgbG9jYXRpb246ICcnLFxuICAgICAgICBwYXNzd29yZDogJycsXG4gICAgICAgIHBvcnRCaW5kaW5nczoge30sXG4gICAgICAgIGFjY2Vzc1Jlc3RyaWN0aW9uOiAnJ1xuICAgIH07XG5cbiAgICAkc2NvcGUuYXBwdW5pbnN0YWxsID0ge1xuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIGFwcDoge30sXG4gICAgICAgIHBhc3N3b3JkOiAnJ1xuICAgIH07XG5cbiAgICAkc2NvcGUuYXBwdXBkYXRlID0ge1xuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIGFwcDoge30sXG4gICAgICAgIHBhc3N3b3JkOiAnJyxcbiAgICAgICAgbWFuaWZlc3Q6IHt9LFxuICAgICAgICBwb3J0QmluZGluZ3M6IHt9XG4gICAgfTtcblxuICAgICRzY29wZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5lcnJvciA9IHt9O1xuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmFwcCA9IHt9O1xuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmxvY2F0aW9uID0gJyc7XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUucGFzc3dvcmQgPSAnJztcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5wb3J0QmluZGluZ3MgPSB7fTtcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5hY2Nlc3NSZXN0cmljdGlvbiA9ICcnO1xuXG4gICAgICAgICRzY29wZS5jb25maWdfZm9ybS4kc2V0UHJpc3RpbmUoKTtcbiAgICAgICAgJHNjb3BlLmNvbmZpZ19mb3JtLiRzZXRVbnRvdWNoZWQoKTtcblxuICAgICAgICAkc2NvcGUuYXBwdW5pbnN0YWxsLmFwcCA9IHt9O1xuICAgICAgICAkc2NvcGUuYXBwdW5pbnN0YWxsLmVycm9yID0ge307XG4gICAgICAgICRzY29wZS5hcHB1bmluc3RhbGwucGFzc3dvcmQgPSAnJztcblxuICAgICAgICAkc2NvcGUudW5pbnN0YWxsX2Zvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICRzY29wZS51bmluc3RhbGxfZm9ybS4kc2V0VW50b3VjaGVkKCk7XG4gICAgfTtcblxuICAgICRzY29wZS5zaG93Q29uZmlndXJlID0gZnVuY3Rpb24gKGFwcCkge1xuICAgICAgICAkc2NvcGUucmVzZXQoKTtcblxuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmFwcCA9IGFwcDtcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5sb2NhdGlvbiA9IGFwcC5sb2NhdGlvbjtcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5hY2Nlc3NSZXN0cmljdGlvbiA9IGFwcC5hY2Nlc3NSZXN0cmljdGlvbjtcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5wb3J0QmluZGluZ3NJbmZvID0gYXBwLm1hbmlmZXN0LnRjcFBvcnRzOyAgICAgICAgIC8vIFBvcnRiaW5kaW5nIG1hcCBvbmx5IGZvciBpbmZvcm1hdGlvblxuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLnBvcnRCaW5kaW5ncyA9IGFuZ3VsYXIuY29weShhcHAucG9ydEJpbmRpbmdzKTsgICAgLy8gVGhpcyBpcyB0aGUgYWN0dWFsIG1vZGVsIGhvbGRpbmcgdGhlIGVudjpwb3J0IHBhaXJcblxuICAgICAgICAkKCcjYXBwQ29uZmlndXJlTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH07XG5cbiAgICAkc2NvcGUuZG9Db25maWd1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUuYnVzeSA9IHRydWU7XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUuZXJyb3IubmFtZSA9IG51bGw7XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuXG4gICAgICAgIENsaWVudC5jb25maWd1cmVBcHAoJHNjb3BlLmFwcGNvbmZpZ3VyZS5hcHAuaWQsICRzY29wZS5hcHBjb25maWd1cmUucGFzc3dvcmQsIHsgbG9jYXRpb246ICRzY29wZS5hcHBjb25maWd1cmUubG9jYXRpb24sIHBvcnRCaW5kaW5nczogJHNjb3BlLmFwcGNvbmZpZ3VyZS5wb3J0QmluZGluZ3MsIGFjY2Vzc1Jlc3RyaWN0aW9uOiAkc2NvcGUuYXBwY29uZmlndXJlLmFjY2Vzc1Jlc3RyaWN0aW9uIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmVycm9yLnBhc3N3b3JkID0gJ1dyb25nIHBhc3N3b3JkIHByb3ZpZGVkLic7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBjb25maWd1cmUucGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmVycm9yLm5hbWUgPSAnQXBwIHdpdGggdGhlIG5hbWUgJyArICRzY29wZS5hcHBjb25maWd1cmUuYXBwLm5hbWUgKyAnIGNhbm5vdCBiZSBjb25maWd1cmVkLic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmJ1c3kgPSBmYWxzZTtcblxuICAgICAgICAgICAgJCgnI2FwcENvbmZpZ3VyZU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblxuICAgICAgICAgICAgJHNjb3BlLnJlc2V0KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2hvd1VuaW5zdGFsbCA9IGZ1bmN0aW9uIChhcHApIHtcbiAgICAgICAgJHNjb3BlLnJlc2V0KCk7XG5cbiAgICAgICAgJHNjb3BlLmFwcHVuaW5zdGFsbC5hcHAgPSBhcHA7XG5cbiAgICAgICAgJCgnI2FwcFVuaW5zdGFsbE1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvVW5pbnN0YWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUuYXBwdW5pbnN0YWxsLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcblxuICAgICAgICBDbGllbnQudW5pbnN0YWxsQXBwKCRzY29wZS5hcHB1bmluc3RhbGwuYXBwLmlkLCAkc2NvcGUuYXBwdW5pbnN0YWxsLnBhc3N3b3JkLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcHVuaW5zdGFsbC5wYXNzd29yZCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwdW5pbnN0YWxsLmVycm9yLnBhc3N3b3JkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkKCcjYXBwVW5pbnN0YWxsTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG4gICAgICAgICAgICAkc2NvcGUucmVzZXQoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5zaG93VXBkYXRlID0gZnVuY3Rpb24gKGFwcCkge1xuICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLmFwcCA9IGFwcDtcbiAgICAgICAgJHNjb3BlLmFwcHVwZGF0ZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG5cbiAgICAgICAgQXBwU3RvcmUuZ2V0TWFuaWZlc3QoYXBwLmFwcFN0b3JlSWQsIGZ1bmN0aW9uIChlcnJvciwgbWFuaWZlc3QpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBBY3RpdmF0ZSBiZWxvdyB0d28gbGluZXMgZm9yIHRlc3RpbmcgdGhlIFVJXG4gICAgICAgICAgICAvLyBtYW5pZmVzdC50Y3BQb3J0c1snVEVTVF9IVFRQJ10gPSB7IHBvcnQ6IDEzMzcsIGRlc2NyaXB0aW9uOiAnSFRUUCBzZXJ2ZXInfTtcbiAgICAgICAgICAgIC8vIGFwcC5wb3J0QmluZGluZ3NbJ1RFU1RfU1NIJ10gPSB7IHBvcnQ6IDEzMzcsIGRlc2NyaXB0aW9uOiAnU1NIIHNlcnZlcid9O1xuXG4gICAgICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgICAgICAgICB2YXIgcG9ydEJpbmRpbmdzID0gYW5ndWxhci5jb3B5KGFwcC5wb3J0QmluZGluZ3MpO1xuICAgICAgICAgICAgdmFyIHBvcnRzQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBkZXRlY3QgbmV3IHBvcnRiaW5kaW5nc1xuICAgICAgICAgICAgZm9yICh2YXIgZW52IGluICRzY29wZS5hcHB1cGRhdGUubWFuaWZlc3QudGNwUG9ydHMpIHtcbiAgICAgICAgICAgICAgICBwb3J0QmluZGluZ3NbZW52XSA9ICRzY29wZS5hcHB1cGRhdGUubWFuaWZlc3QudGNwUG9ydHNbZW52XTtcbiAgICAgICAgICAgICAgICBpZiAoISRzY29wZS5hcHB1cGRhdGUuYXBwLnBvcnRCaW5kaW5nc1tlbnZdKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnRCaW5kaW5nc1tlbnZdLmlzTmV3ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcG9ydHNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGRldGVjdCBvYnNvbGV0ZSBwb3J0YmluZGluZ3NcbiAgICAgICAgICAgIGZvciAoZW52IGluICRzY29wZS5hcHB1cGRhdGUuYXBwLnBvcnRCaW5kaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICghJHNjb3BlLmFwcHVwZGF0ZS5tYW5pZmVzdC50Y3BQb3J0c1tlbnZdKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnRCaW5kaW5nc1tlbnZdLmlzT2Jzb2xldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwb3J0c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvcnRzQ2hhbmdlZCkgJHNjb3BlLmFwcHVwZGF0ZS5wb3J0QmluZGluZ3MgPSBwb3J0QmluZGluZ3M7XG4gICAgICAgICAgICBlbHNlICRzY29wZS5hcHB1cGRhdGUucG9ydEJpbmRpbmdzID0ge307XG5cbiAgICAgICAgICAgICQoJyNhcHBVcGRhdGVNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkc2NvcGUuZG9VcGRhdGUgPSBmdW5jdGlvbiAoZm9ybSkge1xuICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcblxuICAgICAgICB2YXIgcG9ydEJpbmRpbmdzID0ge307XG4gICAgICAgIGZvciAodmFyIGVudiBpbiAkc2NvcGUuYXBwdXBkYXRlLnBvcnRCaW5kaW5ncykge1xuICAgICAgICAgICAgaWYgKCRzY29wZS5hcHB1cGRhdGUucG9ydEJpbmRpbmdzW2Vudl0uaXNPYnNvbGV0ZSkgY29udGludWU7XG4gICAgICAgICAgICBwb3J0QmluZGluZ3NbZW52XSA9ICRzY29wZS5hcHB1cGRhdGUucG9ydEJpbmRpbmdzW2Vudl0uaG9zdFBvcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBDbGllbnQudXBkYXRlQXBwKCRzY29wZS5hcHB1cGRhdGUuYXBwLmlkLCAkc2NvcGUuYXBwdXBkYXRlLm1hbmlmZXN0LCBwb3J0QmluZGluZ3MsICRzY29wZS5hcHB1cGRhdGUucGFzc3dvcmQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHB1cGRhdGUuZXJyb3IucGFzc3dvcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRzY29wZS5hcHB1cGRhdGUuYXBwID0ge307XG4gICAgICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLnBhc3N3b3JkID0gJyc7XG5cbiAgICAgICAgICAgIGZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICBmb3JtLiRzZXRVbnRvdWNoZWQoKTtcblxuICAgICAgICAgICAgJCgnI2FwcFVwZGF0ZU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICB9O1xuXG4gICAgLy8gc2V0dXAgYWxsIHRoZSBkaWFsb2cgZm9jdXMgaGFuZGxpbmdcbiAgICBbJ2FwcENvbmZpZ3VyZU1vZGFsJywgJ2FwcFVuaW5zdGFsbE1vZGFsJywgJ2FwcFVwZGF0ZU1vZGFsJ10uZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgJCgnIycgKyBpZCkub24oJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCh0aGlzKS5maW5kKFwiW2F1dG9mb2N1c106Zmlyc3RcIikuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmFuZ3VsYXIubW9kdWxlKCdBcHBsaWNhdGlvbicpLmNvbnRyb2xsZXIoJ0Ruc0NvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnQ2xpZW50JywgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCBDbGllbnQpIHtcbiAgICBDbGllbnQub25SZWFkeShmdW5jdGlvbiAoKSB7IGlmICghQ2xpZW50LmdldFVzZXJJbmZvKCkuYWRtaW4pICRsb2NhdGlvbi5wYXRoKCcvJyk7IH0pO1xuXG4gICAgJHNjb3BlLnJlYWR5ID0gZmFsc2U7XG4gICAgJHNjb3BlLnVzZXIgPSBDbGllbnQuZ2V0VXNlckluZm8oKTtcbiAgICAkc2NvcGUuY29uZmlnID0gQ2xpZW50LmdldENvbmZpZygpO1xuICAgICRzY29wZS5uYWtlZERvbWFpbkFwcCA9IG51bGw7XG4gICAgJHNjb3BlLmNlcnRpZmljYXRlRmlsZSA9IG51bGw7XG4gICAgJHNjb3BlLmNlcnRpZmljYXRlRmlsZU5hbWUgPSAnJztcbiAgICAkc2NvcGUua2V5RmlsZSA9IG51bGw7XG4gICAgJHNjb3BlLmtleUZpbGVOYW1lID0gJyc7XG5cbiAgICAkc2NvcGUuc2V0TmFrZWREb21haW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcHBpZCA9ICRzY29wZS5uYWtlZERvbWFpbkFwcCA/ICRzY29wZS5uYWtlZERvbWFpbkFwcC5pZCA6ICdhZG1pbic7XG5cbiAgICAgICAgQ2xpZW50LnNldE5ha2VkRG9tYWluKGFwcGlkLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNldHRpbmcgbmFrZWQgZG9tYWluJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmJhY2t1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCgnI2JhY2t1cFByb2dyZXNzTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgICAgICAkc2NvcGUuJHBhcmVudC5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIENsaWVudC5iYWNrdXAoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBub3cgc3RhcnQgcXVlcnlcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrSWZEb25lKCkge1xuICAgICAgICAgICAgICAgIENsaWVudC52ZXJzaW9uKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChjaGVja0lmRG9uZSwgMTAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgJCgnI2JhY2t1cFByb2dyZXNzTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJHBhcmVudC5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrSWZEb25lLCA1MDAwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJyN1cGRhdGVNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cbiAgICAgICAgJHNjb3BlLiRwYXJlbnQuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgICBDbGllbnQudXBkYXRlKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL3VwZGF0ZS5odG1sJztcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpZENlcnRpZmljYXRlJykub25jaGFuZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkc2NvcGUuY2VydGlmaWNhdGVGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgICAgICAgICAgJHNjb3BlLmNlcnRpZmljYXRlRmlsZU5hbWUgPSBldmVudC50YXJnZXQuZmlsZXNbMF0ubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpZEtleScpLm9uY2hhbmdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJHNjb3BlLmtleUZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgICAgICAgICAkc2NvcGUua2V5RmlsZU5hbWUgPSBldmVudC50YXJnZXQuZmlsZXNbMF0ubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5zZXRDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1dpbGwgc2V0IHRoZSBjZXJ0aWZpY2F0ZScpO1xuXG4gICAgICAgIGlmICghJHNjb3BlLmNlcnRpZmljYXRlRmlsZSkgcmV0dXJuIGNvbnNvbGUubG9nKCdDZXJ0aWZpY2F0ZSBub3Qgc2V0Jyk7XG4gICAgICAgIGlmICghJHNjb3BlLmtleUZpbGUpIHJldHVybiBjb25zb2xlLmxvZygnS2V5IG5vdCBzZXQnKTtcblxuICAgICAgICBDbGllbnQuc2V0Q2VydGlmaWNhdGUoJHNjb3BlLmNlcnRpZmljYXRlRmlsZSwgJHNjb3BlLmtleUZpbGUsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY29uc29sZS5sb2coZXJyb3IpO1xuXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cubG9jYXRpb24ucmVsb2FkLmJpbmQod2luZG93LmxvY2F0aW9uLCB0cnVlKSwgMzAwMCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQub25Db25maWcoZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUudG9rZW5JblVzZSA9IENsaWVudC5fdG9rZW47XG5cbiAgICAgICAgQ2xpZW50LmdldEFwcHMoZnVuY3Rpb24gKGVycm9yLCBhcHBzKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgYXBwIGxpc3QnKTtcbiAgICAgICAgICAgICRzY29wZS5hcHBzID0gYXBwcztcblxuICAgICAgICAgICAgQ2xpZW50LmdldE5ha2VkRG9tYWluKGZ1bmN0aW9uIChlcnJvciwgYXBwaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgICAgICRzY29wZS5uYWtlZERvbWFpbkFwcCA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkc2NvcGUuYXBwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmFwcHNbaV0uaWQgPT09IGFwcGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubmFrZWREb21haW5BcHAgPSAkc2NvcGUuYXBwc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJHNjb3BlLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1dKTtcbiIsIi8qIGdsb2JhbDpSaWNrc2hhdzp0cnVlICovXG5cbid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuY29udHJvbGxlcignR3JhcGhzQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICdDbGllbnQnLCBmdW5jdGlvbiAoJHNjb3BlLCAkbG9jYXRpb24sIENsaWVudCkge1xuICAgIGlmICghQ2xpZW50LmdldFVzZXJJbmZvKCkuYWRtaW4pICRsb2NhdGlvbi5wYXRoKCcvJyk7XG5cbiAgICAkc2NvcGUuYWN0aXZlVGFiID0gJ2RheSc7XG5cbiAgICB2YXIgY3B1VXNhZ2VUYXJnZXQgPSAndHJhbnNmb3JtTnVsbCgnICtcbiAgICAnc2NhbGUoZGl2aWRlU2VyaWVzKCcgK1xuICAgICAgICAnc3VtU2VyaWVzKGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtc3lzdGVtLGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtbmljZSxjb2xsZWN0ZC5sb2NhbGhvc3QuY3B1LTAuY3B1LXVzZXIpLCcgK1xuICAgICAgICAnc3VtU2VyaWVzKGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtaWRsZSxjb2xsZWN0ZC5sb2NhbGhvc3QuY3B1LTAuY3B1LXN5c3RlbSxjb2xsZWN0ZC5sb2NhbGhvc3QuY3B1LTAuY3B1LW5pY2UsY29sbGVjdGQubG9jYWxob3N0LmNwdS0wLmNwdS11c2VyLGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtd2FpdCkpLCAxMDApLCAwKSc7XG5cbiAgICB2YXIgbmV0d29ya1VzYWdlVHhUYXJnZXQgPSAndHJhbnNmb3JtTnVsbChjb2xsZWN0ZC5sb2NhbGhvc3QuaW50ZXJmYWNlLWV0aDAuaWZfb2N0ZXRzLnR4LCAwKSc7XG4gICAgdmFyIG5ldHdvcmtVc2FnZVJ4VGFyZ2V0ID0gJ3RyYW5zZm9ybU51bGwoY29sbGVjdGQubG9jYWxob3N0LmludGVyZmFjZS1ldGgwLmlmX29jdGV0cy5yeCwgMCknO1xuXG4gICAgdmFyIGRpc2tVc2FnZUFwcHNVc2VkVGFyZ2V0ID0gJ3RyYW5zZm9ybU51bGwoY29sbGVjdGQubG9jYWxob3N0LmRmLWxvb3AwLmRmX2NvbXBsZXgtdXNlZCwgMCknO1xuICAgIHZhciBkaXNrVXNhZ2VEYXRhVXNlZFRhcmdldCA9ICd0cmFuc2Zvcm1OdWxsKGNvbGxlY3RkLmxvY2FsaG9zdC5kZi1sb29wMS5kZl9jb21wbGV4LXVzZWQsIDApJztcblxuICAgIGZ1bmN0aW9uIHJlbmRlckNwdShhY3RpdmVUYWIsIGNwdURhdGEpIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybWVkQ3B1ID0gWyBdO1xuXG4gICAgICAgIGlmIChjcHVEYXRhICYmIGNwdURhdGEuZGF0YXBvaW50cykgdHJhbnNmb3JtZWRDcHUgPSBjcHVEYXRhLmRhdGFwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4geyB5OiBwb2ludFswXSwgeDogcG9pbnRbMV0gfSB9KTtcblxuICAgICAgICB2YXIgY3B1R3JhcGggPSBuZXcgUmlja3NoYXcuR3JhcGgoe1xuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBhY3RpdmVUYWIgKyAnQ3B1Q2hhcnQnKSxcbiAgICAgICAgICAgIHJlbmRlcmVyOiAnYXJlYScsXG4gICAgICAgICAgICB3aWR0aDogNTgwLFxuICAgICAgICAgICAgaGVpZ2h0OiAyNTAsXG4gICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICAgIHNlcmllczogW3tcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3N0ZWVsYmx1ZScsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRDcHUsXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NwdSdcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjcHVYQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlRpbWUoeyBncmFwaDogY3B1R3JhcGggfSk7XG4gICAgICAgIHZhciBjcHVZQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlkoe1xuICAgICAgICAgICAgZ3JhcGg6IGNwdUdyYXBoLFxuICAgICAgICAgICAgb3JpZW50YXRpb246ICdsZWZ0JyxcbiAgICAgICAgICAgIHRpY2tGb3JtYXQ6IFJpY2tzaGF3LkZpeHR1cmVzLk51bWJlci5mb3JtYXRLTUJULFxuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlVGFiICsgJ0NwdVlBeGlzJyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjcHVIb3ZlckRldGFpbCA9IG5ldyBSaWNrc2hhdy5HcmFwaC5Ib3ZlckRldGFpbCh7XG4gICAgICAgICAgICBncmFwaDogY3B1R3JhcGgsXG4gICAgICAgICAgICBmb3JtYXR0ZXI6IGZ1bmN0aW9uKHNlcmllcywgeCwgeSkge1xuICAgICAgICAgICAgICAgIHZhciBzd2F0Y2ggPSAnPHNwYW4gY2xhc3M9XCJkZXRhaWxfc3dhdGNoXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAnICsgc2VyaWVzLmNvbG9yICsgJ1wiPjwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gc3dhdGNoICsgc2VyaWVzLm5hbWUgKyBcIjogXCIgKyBuZXcgTnVtYmVyKHkpLnRvRml4ZWQoMikgKyAnJTxicj4nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjcHVHcmFwaC5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW5kZXJOZXR3b3JrKGFjdGl2ZVRhYiwgdHhEYXRhLCByeERhdGEpIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybWVkVHggPSBbIF0sIHRyYW5zZm9ybWVkUnggPSBbIF07XG5cbiAgICAgICAgaWYgKHR4RGF0YSAmJiB0eERhdGEuZGF0YXBvaW50cykgdHJhbnNmb3JtZWRUeCA9IHR4RGF0YS5kYXRhcG9pbnRzLm1hcChmdW5jdGlvbiAocG9pbnQpIHsgcmV0dXJuIHsgeTogcG9pbnRbMF0sIHg6IHBvaW50WzFdIH0gfSk7XG4gICAgICAgIGlmIChyeERhdGEgJiYgcnhEYXRhLmRhdGFwb2ludHMpIHRyYW5zZm9ybWVkUnggPSByeERhdGEuZGF0YXBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50KSB7IHJldHVybiB7IHk6IHBvaW50WzBdLCB4OiBwb2ludFsxXSB9IH0pO1xuXG4gICAgICAgIHZhciBuZXR3b3JrR3JhcGggPSBuZXcgUmlja3NoYXcuR3JhcGgoe1xuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBhY3RpdmVUYWIgKyAnTmV0d29ya0NoYXJ0JyksXG4gICAgICAgICAgICByZW5kZXJlcjogJ2FyZWEnLFxuICAgICAgICAgICAgd2lkdGg6IDU4MCxcbiAgICAgICAgICAgIGhlaWdodDogMjUwLFxuICAgICAgICAgICAgc2VyaWVzOiBbIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3N0ZWVsYmx1ZScsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRUeCxcbiAgICAgICAgICAgICAgICBuYW1lOiAndHgnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY29sb3I6ICdncmVlbicsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRSeCxcbiAgICAgICAgICAgICAgICBuYW1lOiAncngnXG4gICAgICAgICAgICB9IF1cbiAgICAgICAgfSApO1xuXG4gICAgICAgIHZhciBuZXR3b3JrWEF4aXMgPSBuZXcgUmlja3NoYXcuR3JhcGguQXhpcy5UaW1lKHsgZ3JhcGg6IG5ldHdvcmtHcmFwaCB9KTtcbiAgICAgICAgdmFyIG5ldHdvcmtZQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlkoe1xuICAgICAgICAgICAgZ3JhcGg6IG5ldHdvcmtHcmFwaCxcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnbGVmdCcsXG4gICAgICAgICAgICB0aWNrRm9ybWF0OiBSaWNrc2hhdy5GaXh0dXJlcy5OdW1iZXIuZm9ybWF0S01CVCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZVRhYiArICdOZXR3b3JrWUF4aXMnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIG5ldHdvcmtIb3ZlckRldGFpbCA9IG5ldyBSaWNrc2hhdy5HcmFwaC5Ib3ZlckRldGFpbCh7XG4gICAgICAgICAgICBncmFwaDogbmV0d29ya0dyYXBoLFxuICAgICAgICAgICAgZm9ybWF0dGVyOiBmdW5jdGlvbihzZXJpZXMsIHgsIHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3dhdGNoID0gJzxzcGFuIGNsYXNzPVwiZGV0YWlsX3N3YXRjaFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogJyArIHNlcmllcy5jb2xvciArICdcIj48L3NwYW4+JztcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHN3YXRjaCArIHNlcmllcy5uYW1lICsgXCI6IFwiICsgbmV3IE51bWJlcih5LzEwMjQpLnRvRml4ZWQoMikgKyAnS0I8YnI+JztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV0d29ya0dyYXBoLnJlbmRlcigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbmRlckRpc2soYWN0aXZlVGFiLCBhcHBzVXNlZERhdGEsIGRhdGFVc2VkRGF0YSkge1xuICAgICAgICB2YXIgdHJhbnNmb3JtZWRBcHBzVXNlZCA9IFsgXSwgdHJhbnNmb3JtZWREYXRhVXNlZCA9IFsgXTtcblxuICAgICAgICBpZiAoYXBwc1VzZWREYXRhICYmIGFwcHNVc2VkRGF0YS5kYXRhcG9pbnRzKSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEFwcHNVc2VkID0gYXBwc1VzZWREYXRhLmRhdGFwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4geyB5OiBwb2ludFswXSwgeDogcG9pbnRbMV0gfTsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YVVzZWREYXRhICYmIGRhdGFVc2VkRGF0YS5kYXRhcG9pbnRzKSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZERhdGFVc2VkID0gZGF0YVVzZWREYXRhLmRhdGFwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4geyB5OiBwb2ludFswXSwgeDogcG9pbnRbMV0gfTsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlza0dyYXBoID0gbmV3IFJpY2tzaGF3LkdyYXBoKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgYWN0aXZlVGFiICsgJ0Rpc2tDaGFydCcpLFxuICAgICAgICAgICAgcmVuZGVyZXI6ICdhcmVhJyxcbiAgICAgICAgICAgIHdpZHRoOiA1ODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDI1MCxcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMzAgKiAxMDI0ICogMTAyNCAqIDEwMjQsIC8vIDMwZ2JcbiAgICAgICAgICAgIHNlcmllczogW3tcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3N0ZWVsYmx1ZScsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRBcHBzVXNlZCxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXBwcydcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB0cmFuc2Zvcm1lZERhdGFVc2VkLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgfSApO1xuXG4gICAgICAgIHZhciBkaXNrWEF4aXMgPSBuZXcgUmlja3NoYXcuR3JhcGguQXhpcy5UaW1lKHsgZ3JhcGg6IGRpc2tHcmFwaCB9KTtcbiAgICAgICAgdmFyIGRpc2tZQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlkoe1xuICAgICAgICAgICAgZ3JhcGg6IGRpc2tHcmFwaCxcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnbGVmdCcsXG4gICAgICAgICAgICB0aWNrRm9ybWF0OiBSaWNrc2hhdy5GaXh0dXJlcy5OdW1iZXIuZm9ybWF0S01CVCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZVRhYiArICdEaXNrWUF4aXMnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGRpc2tIb3ZlckRldGFpbCA9IG5ldyBSaWNrc2hhdy5HcmFwaC5Ib3ZlckRldGFpbCh7XG4gICAgICAgICAgICBncmFwaDogZGlza0dyYXBoLFxuICAgICAgICAgICAgZm9ybWF0dGVyOiBmdW5jdGlvbihzZXJpZXMsIHgsIHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3dhdGNoID0gJzxzcGFuIGNsYXNzPVwiZGV0YWlsX3N3YXRjaFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogJyArIHNlcmllcy5jb2xvciArICdcIj48L3NwYW4+JztcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHN3YXRjaCArIHNlcmllcy5uYW1lICsgXCI6IFwiICsgbmV3IE51bWJlcih5LygxMDI0ICogMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpICsgJ0dCPGJyPic7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBkaXNrTGVnZW5kID0gbmV3IFJpY2tzaGF3LkdyYXBoLkxlZ2VuZCh7XG4gICAgICAgICAgICBncmFwaDogZGlza0dyYXBoLFxuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlVGFiICsgJ0Rpc2tMZWdlbmQnKVxuICAgICAgICB9KTtcblxuICAgICAgICBkaXNrR3JhcGgucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgJHNjb3BlLnVwZGF0ZUdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjdGl2ZVRhYiA9ICRzY29wZS5hY3RpdmVUYWI7XG4gICAgICAgdmFyIGZyb20gPSAnLTI0aG91cnMnO1xuICAgICAgICBzd2l0Y2ggKGFjdGl2ZVRhYikge1xuICAgICAgICBjYXNlICdkYXknOiBmcm9tID0gJy0yNGhvdXJzJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbnRoJzogZnJvbSA9ICctMW1vbnRoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOiBmcm9tID0gJy0xeWVhcic7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiBjb25zb2xlLmxvZygnaW50ZXJuYWwgZXJycm9yJyk7XG4gICAgICAgIH1cblxuICAgICAgICBDbGllbnQuZ3JhcGhzKFsgY3B1VXNhZ2VUYXJnZXQsIG5ldHdvcmtVc2FnZVR4VGFyZ2V0LCBuZXR3b3JrVXNhZ2VSeFRhcmdldCwgZGlza1VzYWdlQXBwc1VzZWRUYXJnZXQsIGRpc2tVc2FnZURhdGFVc2VkVGFyZ2V0IF0sIGZyb20sIGZ1bmN0aW9uIChlcnJvciwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY29uc29sZS5sb2coZXJyb3IpO1xuXG4gICAgICAgICAgICByZW5kZXJDcHUoYWN0aXZlVGFiLCBkYXRhWzBdKTtcblxuICAgICAgICAgICAgcmVuZGVyTmV0d29yayhhY3RpdmVUYWIsIGRhdGFbMV0sIGRhdGFbMl0pO1xuXG4gICAgICAgICAgICByZW5kZXJEaXNrKGFjdGl2ZVRhYiwgZGF0YVszXSwgZGF0YVs0XSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQub25SZWFkeSgkc2NvcGUudXBkYXRlR3JhcGhzKTtcbn1dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuY29udHJvbGxlcignVXNlcnNDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGxvY2F0aW9uJywgJ0NsaWVudCcsIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgQ2xpZW50KSB7XG4gICAgQ2xpZW50Lm9uUmVhZHkoZnVuY3Rpb24gKCkgeyBpZiAoIUNsaWVudC5nZXRVc2VySW5mbygpLmFkbWluKSAkbG9jYXRpb24ucGF0aCgnLycpOyB9KTtcblxuICAgICRzY29wZS5yZWFkeSA9IGZhbHNlO1xuICAgICRzY29wZS51c2VycyA9IFtdO1xuICAgICRzY29wZS51c2VySW5mbyA9IENsaWVudC5nZXRVc2VySW5mbygpO1xuXG4gICAgJHNjb3BlLnVzZXJyZW1vdmUgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIHVzZXJJbmZvOiB7fSxcbiAgICAgICAgdXNlcm5hbWU6ICcnLFxuICAgICAgICBwYXNzd29yZDogJydcbiAgICB9O1xuXG4gICAgJHNjb3BlLnVzZXJhZGQgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBhbHJlYWR5VGFrZW46IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIHVzZXJuYW1lOiAnJyxcbiAgICAgICAgZW1haWw6ICcnXG4gICAgfTtcblxuICAgICRzY29wZS5pc01lID0gZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIudXNlcm5hbWUgPT09IENsaWVudC5nZXRVc2VySW5mbygpLnVzZXJuYW1lO1xuICAgIH07XG5cbiAgICAkc2NvcGUuaXNBZG1pbiA9IGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiAhIXVzZXIuYWRtaW47XG4gICAgfTtcblxuICAgICRzY29wZS50b2dnbGVBZG1pbiA9IGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIENsaWVudC5zZXRBZG1pbih1c2VyLnVzZXJuYW1lLCAhdXNlci5hZG1pbiwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgdXNlci5hZG1pbiA9ICF1c2VyLmFkbWluO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvQWRkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUudXNlcmFkZC5hbHJlYWR5VGFrZW4gPSAnJztcbiAgICAgICAgJHNjb3BlLnVzZXJhZGQuZXJyb3IudXNlcm5hbWUgPSBudWxsO1xuICAgICAgICAkc2NvcGUudXNlcmFkZC5lcnJvci5lbWFpbCA9IG51bGw7XG5cbiAgICAgICAgQ2xpZW50LmNyZWF0ZVVzZXIoJHNjb3BlLnVzZXJhZGQudXNlcm5hbWUsICRzY29wZS51c2VyYWRkLmVtYWlsLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXNDb2RlID09PSA0MDkpIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUudXNlcmFkZC5hbHJlYWR5VGFrZW4gPSAkc2NvcGUudXNlcm5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1VzZXJuYW1lIGFscmVhZHkgdGFrZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXNDb2RlID09PSA0MDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmRleE9mKCdlbWFpbCcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUudXNlcmFkZC5lcnJvci5lbWFpbCA9ICdJbnZhbGlkIEVtYWlsJztcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVzZXJhZGQuZW1haWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmRleE9mKCd1c2VybmFtZScpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUudXNlcmFkZC5lcnJvci51c2VybmFtZSA9ICdJbnZhbGlkIFVzZXJuYW1lJztcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVzZXJhZGQudXNlcm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBjcmVhdGUgdXNlci4nLCBlcnJvcik7XG5cbiAgICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgICAgICQoJyN1c2VyQWRkTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLnNob3dVc2VyUmVtb3ZlID0gZnVuY3Rpb24gKHVzZXJJbmZvKSB7XG4gICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnVzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAkc2NvcGUudXNlcnJlbW92ZS51c2VySW5mbyA9IHVzZXJJbmZvO1xuICAgICAgICAkKCcjdXNlclJlbW92ZU1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvVXNlclJlbW92ZSA9IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnVzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuXG4gICAgICAgIGlmICgkc2NvcGUudXNlcnJlbW92ZS51c2VybmFtZSAhPT0gJHNjb3BlLnVzZXJyZW1vdmUudXNlckluZm8udXNlcm5hbWUpIHtcbiAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnVzZXJuYW1lID0gJ1VzZXJuYW1lIGRvZXMgbm90IG1hdGNoJztcbiAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLnVzZXJuYW1lID0gJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBDbGllbnQucmVtb3ZlVXNlcigkc2NvcGUudXNlcnJlbW92ZS51c2VySW5mby5pZCwgJHNjb3BlLnVzZXJyZW1vdmUucGFzc3dvcmQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnBhc3N3b3JkID0gJ0luY29ycmVjdCBwYXNzd29yZCc7XG4gICAgICAgICAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUucGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gZGVsZXRlIHVzZXIuJywgZXJyb3IpO1xuXG4gICAgICAgICAgICAkc2NvcGUudXNlcnJlbW92ZS51c2VySW5mbyA9IHt9O1xuICAgICAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUudXNlcm5hbWUgPSAnJztcbiAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLnBhc3N3b3JkID0gJyc7XG5cbiAgICAgICAgICAgIGZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICBmb3JtLiRzZXRVbnRvdWNoZWQoKTtcblxuICAgICAgICAgICAgJCgnI3VzZXJSZW1vdmVNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cbiAgICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgIENsaWVudC5saXN0VXNlcnMoZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBnZXQgdXNlciBsaXN0aW5nLicsIGVycm9yKTtcblxuICAgICAgICAgICAgJHNjb3BlLnVzZXJzID0gcmVzdWx0LnVzZXJzO1xuICAgICAgICAgICAgJHNjb3BlLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaCgpO1xuXG4gICAgLy8gc2V0dXAgYWxsIHRoZSBkaWFsb2cgZm9jdXMgaGFuZGxpbmdcbiAgICBbJ3VzZXJBZGRNb2RhbCcsICd1c2VyUmVtb3ZlTW9kYWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAkKCcjJyArIGlkKS5vbignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJbYXV0b2ZvY3VzXTpmaXJzdFwiKS5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1dKTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file +"use strict";var app=angular.module("Application",["ngRoute","ngAnimate","angular-md5"]);app.config(["$routeProvider",function(e){e.when("/",{redirectTo:"/apps"}).when("/users",{controller:"UsersController",templateUrl:"views/users.html"}).when("/appstore",{controller:"AppStoreController",templateUrl:"views/appstore.html"}).when("/apps",{controller:"AppsController",templateUrl:"views/apps.html"}).when("/dns",{controller:"DnsController",templateUrl:"views/dns.html"}).when("/account",{controller:"AccountController",templateUrl:"views/account.html"}).when("/graphs",{controller:"GraphsController",templateUrl:"views/graphs.html"}).otherwise({redirectTo:"/"})}]);var ISTATES={ISTATE_PENDING_INSTALL:"pending_install",ISTATE_PENDING_CONFIGURE:"pending_configure",ISTATE_PENDING_UNINSTALL:"pending_uninstall",ISTATE_PENDING_RESTORE:"pending_restore",ISTATE_PENDING_UPDATE:"pending_update",ISTATE_ERROR:"error",ISTATE_INSTALLED:"installed"};app.filter("installationActive",function(){return function(e){return e===ISTATES.ISTATE_ERROR?!1:e===ISTATES.ISTATE_INSTALLED?!1:!0}}),app.filter("installationStateLabel",function(){return function(e){switch(e){case ISTATES.ISTATE_PENDING_INSTALL:return"Installing";case ISTATES.ISTATE_PENDING_CONFIGURE:return"Configuring";case ISTATES.ISTATE_PENDING_UNINSTALL:return"Uninstalling";case ISTATES.ISTATE_PENDING_RESTORE:return"Starting";case ISTATES.ISTATE_PENDING_UPDATE:return"Updating";case ISTATES.ISTATE_ERROR:return"Error";case ISTATES.ISTATE_INSTALLED:return"Running";default:return e}}}),app.filter("accessRestrictionLabel",function(){return function(e){return""===e?"public":"roleUser"===e?"private":"roleAdmin"===e?"private (Admins only)":e}}),app.directive("laterName",function(){return{restrict:"A",require:["?ngModel","^?form"],link:function(e,o,n,r){n.$set("name",n.laterName);var t=r[0],a=r[1];t&&a&&(t.$name=n.name,a.$addControl(t),e.$on("$destroy",function(){a.$removeControl(t)}))}}}),angular.module("Application").service("Client",["$http","md5",function(e,o){function n(e,o){Error.call(this),this.name=this.constructor.name,this.statusCode=e,this.message="string"==typeof o?o:JSON.stringify(o)}function r(e){return function(o,r){return 401===r?a.logout():void e(new n(r,o))}}function t(){this._ready=!1,this._configListener=[],this._readyListener=[],this._userInfo={username:null,email:null,admin:!1},this._token=null,this._clientId="cid-webadmin",this._clientSecret="unused",this._config={apiServerOrigin:null,webServerOrigin:null,fqdn:null,ip:null,revision:null,update:{box:null,apps:null},isDev:!1,progress:{},isCustomDomain:!1,developerMode:!1},this._installedApps=[],this.setToken(localStorage.token)}var a=null;return t.prototype.setReady=function(){this._ready||(this._ready=!0,this._readyListener.forEach(function(e){e()}))},t.prototype.onReady=function(e){this._ready&&e(),this._readyListener.push(e)},t.prototype.onConfig=function(e){this._configListener.push(e),e(this._config)},t.prototype.setUserInfo=function(e){this._userInfo.username=e.username,this._userInfo.email=e.email,this._userInfo.admin=!!e.admin,this._userInfo.gravatar="https://www.gravatar.com/avatar/"+o.createHash(e.email.toLowerCase())+".jpg?s=24&d=mm",this._userInfo.gravatarHuge="https://www.gravatar.com/avatar/"+o.createHash(e.email.toLowerCase())+".jpg?s=128&d=mm"},t.prototype.setConfig=function(e){this._config.apiServerOrigin=e.apiServerOrigin,this._config.webServerOrigin=e.webServerOrigin,this._config.version=e.version,this._config.fqdn=e.fqdn,this._config.ip=e.ip,this._config.revision=e.revision,this._config.update=e.update,this._config.isDev=e.isDev,this._config.progress=e.progress,this._config.progress=e.progress,this._config.isCustomDomain=e.isCustomDomain,this._config.developerMode=e.developerMode;var o=this;this._configListener.forEach(function(e){e(o._config)})},t.prototype.getInstalledApps=function(){return this._installedApps},t.prototype.getUserInfo=function(){return this._userInfo},t.prototype.getConfig=function(){return this._config},t.prototype.setToken=function(o){e.defaults.headers.common.Authorization="Bearer "+o,o?localStorage.token=o:localStorage.removeItem("token"),this._token=o},t.prototype.config=function(o){e.get("/api/v1/cloudron/config").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.userInfo=function(o){var t=this;e.get("/api/v1/profile").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):(t.setUserInfo(e),void o(null,e))}).error(r(o))},t.prototype.changeDeveloperMode=function(o,t,a){var s=this,i={password:t,enabled:o};e.post("/api/v1/developer",i).success(function(e,r){return 200!==r?a(new n(r,e)):(s._config.developerMode=o,void a(null))}).error(r(a))},t.prototype.installApp=function(o,t,a,s,i,p){var l=this,u={appStoreId:o,manifest:t,password:a,location:i.location,portBindings:i.portBindings,accessRestriction:i.accessRestriction};e.post("/api/v1/apps/install",u).success(function(e,o){return 202!==o||"object"!=typeof e?p(new n(o,e)):(e.manifest={title:s},l._installedApps.push(e),void p(null,e.id))}).error(r(p))},t.prototype.uninstallApp=function(o,t,a){var s={password:t};e.post("/api/v1/apps/"+o+"/uninstall",s).success(function(e,o){return 202!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.configureApp=function(o,t,a,s){var i={appId:o,password:t,location:a.location,portBindings:a.portBindings,accessRestriction:a.accessRestriction};e.post("/api/v1/apps/"+o+"/configure",i).success(function(e,o){return 202!==o?s(new n(o,e)):void s(null)}).error(r(s))},t.prototype.updateApp=function(o,t,a,s,i){e.post("/api/v1/apps/"+o+"/update",{manifest:t,password:s,portBindings:a}).success(function(e,o){return 202!==o?i(new n(o,e)):void i(null)}).error(r(i))},t.prototype.startApp=function(o,t){var a={};e.post("/api/v1/apps/"+o+"/start",a).success(function(e,o){return 202!==o?t(new n(o,e)):void t(null)}).error(r(t))},t.prototype.stopApp=function(o,t){var a={};e.post("/api/v1/apps/"+o+"/stop",a).success(function(e,o){return 202!==o?t(new n(o,e)):void t(null)}).error(r(t))},t.prototype.version=function(o){e.get("/api/v1/cloudron/status").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.isServerFirstTime=function(o){e.get("/api/v1/cloudron/status").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,!e.activated)}).error(r(o))},t.prototype.getNakedDomain=function(o){e.get("/api/v1/settings/naked_domain").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e.appid)}).error(r(o))},t.prototype.setNakedDomain=function(o,t){e.post("/api/v1/settings/naked_domain",{appid:o}).success(function(e,o){return 204!==o?t(new n(o)):void t(null)}).error(r(t))},t.prototype.getApps=function(o){e.get("/api/v1/apps").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e.apps)}).error(r(o))},t.prototype.getApp=function(e,o){var n=null;return this._installedApps.some(function(o){return o.id===e?(n=o,!0):!1}),n?o(null,n):o(new Error("App not found"))},t.prototype.getAppLogStream=function(e){var o=new EventSource("/api/v1/apps/"+e+"/logstream");return o},t.prototype.getAppLogUrl=function(e){return"/api/v1/apps/"+e+"/logs?access_token="+this._token},t.prototype.setAdmin=function(o,t,a){var s={username:o,admin:t};e.post("/api/v1/users/"+o+"/admin",s).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.createAdmin=function(o,t,a,s,i){var p={username:o,password:t,email:a},l=this;e.post("/api/v1/cloudron/activate?setupToken="+s,p).success(function(e,r){return 201!==r||"object"!=typeof e?i(new n(r,e)):(l.setToken(e.token),l.setUserInfo({username:o,email:a,admin:!0}),void i(null,e.activated))}).error(r(i))},t.prototype.listUsers=function(o){e.get("/api/v1/users").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.getOAuthClients=function(o){e.get("/api/v1/oauth/clients").success(function(e,r){return 200!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e.clients)}).error(r(o))},t.prototype.delTokensByClientId=function(o,t){e["delete"]("/api/v1/oauth/clients/"+o+"/tokens").success(function(e,o){return 204!==o?t(new n(o,e)):void t(null)}).error(r(t))},t.prototype.update=function(o,t){e.post("/api/v1/cloudron/update",{password:o}).success(function(e,o){return 202!==o||"object"!=typeof e?t(new n(o,e)):void t(null,e)}).error(r(t))},t.prototype.reboot=function(o){e.get("/api/v1/cloudron/reboot").success(function(e,r){return 202!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.backup=function(o){e.post("/api/v1/cloudron/backups").success(function(e,r){return 202!==r||"object"!=typeof e?o(new n(r,e)):void o(null,e)}).error(r(o))},t.prototype.setCertificate=function(o,t,a){console.log("will set certificate");var s=new FormData;s.append("certificate",o),s.append("key",t),e.post("/api/v1/cloudron/certificate",s,{headers:{"Content-Type":void 0},transformRequest:angular.identity}).success(function(e,o){return 202!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.graphs=function(o,t,a){var s={params:{target:o,format:"json",from:t}};e.get("/api/v1/cloudron/graphs",s).success(function(e,o){return 200!==o||"object"!=typeof e?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.createUser=function(o,t,a){var s={username:o,email:t};e.post("/api/v1/users",s).success(function(e,o){return 201!==o||"object"!=typeof e?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.removeUser=function(o,t,a){var s={password:t};e({method:"DELETE",url:"/api/v1/users/"+o,data:s,headers:{"Content-Type":"application/json"}}).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null)}).error(r(a))},t.prototype.changePassword=function(o,t,a){var s={password:o,newPassword:t};e.post("/api/v1/users/"+this._userInfo.username+"/password",s).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.changeEmail=function(o,t,a){var s={password:t,email:o};e.put("/api/v1/users/"+this._userInfo.username,s).success(function(e,o){return 204!==o?a(new n(o,e)):void a(null,e)}).error(r(a))},t.prototype.refreshConfig=function(e){var o=this;e="function"==typeof e?e:function(){},this.config(function(n,r){return n?e(n):(o.setConfig(r),void e(null))})},t.prototype.refreshInstalledApps=function(e){var o=this;e="function"==typeof e?e:function(){},this.getApps(function(n,r){if(n)return e(n);r.forEach(function(e){for(var n=!1,r=0;r=0;--t)r.some(function(e){return e.id===o._installedApps[t].id})||o._installedApps.splice(t,1);e(null)})},t.prototype.logout=function(){this.setToken(null),this._userInfo={},window.location.href="/api/v1/session/logout"},t.prototype.exchangeCodeForToken=function(o,t){var a={grant_type:"authorization_code",code:o,redirect_uri:window.location.origin,client_id:this._clientId,client_secret:this._clientSecret};e.post("/api/v1/oauth/token?response_type=token&client_id="+this._clientId,a).success(function(e,o){return 200!==o||"object"!=typeof e?t(new n(o,e)):void t(null,e.access_token)}).error(r(t))},a=new t}]),angular.module("Application").service("AppStore",["$http","Client",function(e,o){function n(e,o){Error.call(this),this.name=this.constructor.name,this.statusCode=e,this.message="string"==typeof o?o:JSON.stringify(o)}function r(){this._appsCache={}}return r.prototype.getApps=function(r){if(null===o.getConfig().apiServerOrigin)return r(new n(420,"Enhance Your Calm"));var t=this;e.get(o.getConfig().apiServerOrigin+"/api/v1/appstore/apps",{params:{boxVersion:o.getConfig().version}}).success(function(e,o){return 200!==o?r(new n(o,e)):(e.apps.forEach(function(e){t._appsCache[e.id]||(t._appsCache[e.id]=e)}),r(null,t._appsCache))}).error(function(e,o){return r(new n(o,e))})},r.prototype.getAppById=function(e,o){if(e in this._appsCache)return o(null,this._appsCache[e]);var r=this;this.getApps(function(t){return t?o(t):e in r._appsCache?o(null,r._appsCache[e]):void o(new n(404,"Not found"))})},r.prototype.getManifest=function(r,t){if(null===o.getConfig().apiServerOrigin)return t(new n(420,"Enhance Your Calm"));var a=o.getConfig().apiServerOrigin+"/api/v1/appstore/apps/"+r+"/manifest";console.log("Getting the manifest of ",r,a),e.get(a).success(function(e,o){return 200!==o?t(new n(o,e)):t(null,e)}).error(function(e,o){return t(new n(o,e))})},new r}]),angular.module("Application").controller("MainController",["$scope","$route","$interval","Client",function(e,o,n,r){e.initialized=!1,e.userInfo=r.getUserInfo(),e.config={},e.update={error:{},password:""},e.isActive=function(e){return o.current?0===o.current.$$route.originalPath.indexOf(e):!1},e.logout=function(o){o.stopPropagation(),e.initialized=!1,r.logout()},e.login=function(){var e=window.location.origin+"/login_callback.html",o="root,profile,apps,roleAdmin";window.location.href="/api/v1/oauth/dialog/authorize?response_type=code&client_id="+r._clientId+"&redirect_uri="+e+"&scope="+o},e.setup=function(){window.location.href="/error.html?errorCode=1"},e.error=function(e){console.error(e),window.location.href="/error.html"},e.showUpdateModal=function(o){e.update.error.password=null,e.update.password="",o.$setPristine(),o.$setUntouched(),$("#updateModal").modal("show")},e.doUpdate=function(){e.update.error.password=null,r.update(e.update.password,function(o){return o?void(403===o.statusCode?(e.update.error.password="Incorrect password",e.update.password=""):console.error("Unable to update.",o)):void(window.location.href="/update.html")})},e.backup=function(){$("#backupProgressModal").modal("show"),e.initialized=!1,r.backup(function(o){function n(){r.version(function(o){return o?window.setTimeout(n,1e3):($("#backupProgressModal").modal("hide"),void(e.initialized=!0))})}o&&console.error(o),window.setTimeout(n,5e3)})},r.isServerFirstTime(function(o,t){return o?e.error(o):t?e.setup():void(localStorage.token?r.refreshConfig(function(o){return o&&401===o.statusCode?e.login():o?e.error(o):(r.getConfig().progress.update&&(window.location.href="/update.html"),void r.userInfo(function(o){return o?e.error(o):void r.refreshInstalledApps(function(o){if(o)return e.error(o);var t=n(r.refreshInstalledApps.bind(r),2e3),a=n(r.refreshConfig.bind(r),5e3);e.$on("$destroy",function(){n.cancel(t),n.cancel(a)}),r.setReady(),e.config=r.getConfig(),e.initialized=!0})}))}):e.login())}),r.onConfig(function(e){e.progress.update&&(window.location.href="/update.html")}),["updateModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("AccountController",["$scope","$location","Client",function(e,o,n){function r(o){e.passwordchange.error.password=null,e.passwordchange.error.newPassword=null,e.passwordchange.error.newPasswordRepeat=null,e.passwordchange.password="",e.passwordchange.newPassword="",e.passwordchange.newPasswordRepeat="",o&&(o.$setPristine(),o.$setUntouched())}function t(o){e.emailchange.error.email=null,e.emailchange.error.password=null,e.emailchange.email="",e.emailchange.password="",o&&(o.$setPristine(),o.$setUntouched())}function a(){e.developerModeChange.error.password=null,e.developerModeChange.password="",e.developerModeChangeForm.$setPristine(),e.developerModeChangeForm.$setUntouched()}e.user=n.getUserInfo(),e.config=n.getConfig(),e.activeClients=[],e.tokenInUse=null,e.passwordchange={busy:!1,error:{},password:"",newPassword:"",newPasswordRepeat:""},e.emailchange={busy:!1,error:{},email:"",password:""},e.developerModeChange={busy:!1,error:{},password:""},e.doChangePassword=function(o){e.passwordchange.error.password=null,e.passwordchange.error.newPassword=null,e.passwordchange.error.newPasswordRepeat=null,e.passwordchange.busy=!0,n.changePassword(e.passwordchange.password,e.passwordchange.newPassword,function(n){return n?void(403===n.statusCode?(e.passwordchange.error.password=!0,e.passwordchange.password=""):console.error("Unable to change password.",n)):(e.passwordchange.busy=!1,r(o),void $("#passwordChangeModal").modal("hide"))})},e.doChangeEmail=function(o){e.emailchange.error.email=null,e.emailchange.error.password=null,e.emailchange.busy=!0,n.changeEmail(e.emailchange.email,e.emailchange.password,function(r){return r?void(403===r.statusCode?(e.emailchange.error.password=!0,e.emailchange.password=""):console.error("Unable to change email.",r)):(e.emailchange.busy=!1,t(o),n.userInfo(function(){}),void $("#emailChangeModal").modal("hide"))})},e.doChangeDeveloperMode=function(){e.developerModeChange.error.password=null,e.developerModeChange.busy=!0,n.changeDeveloperMode(!e.config.developerMode,e.developerModeChange.password,function(o){return o?void(403===o.statusCode?(e.developerModeChange.error.password=!0,e.developerModeChange.password=""):console.error("Unable to change password.",o)):(e.developerModeChange.busy=!1,a(),void $("#developerModeChangeModal").modal("hide"))})},e.showChangePassword=function(e){r(e),$("#passwordChangeModal").modal("show")},e.showChangeEmail=function(e){t(e),$("#emailChangeModal").modal("show")},e.showChangeDeveloperMode=function(){a(),$("#developerModeChangeModal").modal("show")},e.removeAccessTokens=function(e,o){n.delTokensByClientId(e.id,function(e){return e?console.error(e):void $(o.target).addClass("disabled")})},n.onReady(function(){e.tokenInUse=n._token,n.getOAuthClients(function(o,n){return o?console.error(o):void(e.activeClients=n)})}),["passwordChangeModal","emailChangeModal","developerModeChangeModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("AppsController",["$scope","$location","Client","AppStore",function(e,o,n,r){e.HOST_PORT_MIN=1024,e.HOST_PORT_MAX=65535,e.installedApps=n.getInstalledApps(),e.config=n.getConfig(),e.appconfigure={busy:!1,error:{},app:{},location:"",password:"",portBindings:{},accessRestriction:""},e.appuninstall={error:{},app:{},password:""},e.appupdate={error:{},app:{},password:"",manifest:{},portBindings:{}},e.reset=function(){e.appconfigure.error={},e.appconfigure.app={},e.appconfigure.location="",e.appconfigure.password="",e.appconfigure.portBindings={},e.appconfigure.accessRestriction="",e.config_form.$setPristine(),e.config_form.$setUntouched(),e.appuninstall.app={},e.appuninstall.error={},e.appuninstall.password="",e.uninstall_form.$setPristine(),e.uninstall_form.$setUntouched()},e.showConfigure=function(o){e.reset(),e.appconfigure.app=o,e.appconfigure.location=o.location,e.appconfigure.accessRestriction=o.accessRestriction,e.appconfigure.portBindingsInfo=o.manifest.tcpPorts,e.appconfigure.portBindings=angular.copy(o.portBindings),$("#appConfigureModal").modal("show")},e.doConfigure=function(){e.appconfigure.busy=!0,e.appconfigure.error.name=null,e.appconfigure.error.password=null,n.configureApp(e.appconfigure.app.id,e.appconfigure.password,{location:e.appconfigure.location,portBindings:e.appconfigure.portBindings,accessRestriction:e.appconfigure.accessRestriction},function(o){return o?(403===o.statusCode?(e.appconfigure.error.password="Wrong password provided.",e.appconfigure.password=""):e.appconfigure.error.name="App with the name "+e.appconfigure.app.name+" cannot be configured.",void(e.appconfigure.busy=!1)):(e.appconfigure.busy=!1,$("#appConfigureModal").modal("hide"),void e.reset())})},e.showUninstall=function(o){e.reset(),e.appuninstall.app=o,$("#appUninstallModal").modal("show")},e.doUninstall=function(){e.appuninstall.error.password=null,n.uninstallApp(e.appuninstall.app.id,e.appuninstall.password,function(o){return o?void(403===o.statusCode?(e.appuninstall.password="",e.appuninstall.error.password=!0):console.error(o)):($("#appUninstallModal").modal("hide"),void e.reset())})},e.showUpdate=function(o){e.appupdate.app=o,e.appupdate.error.password=null,r.getManifest(o.appStoreId,function(n,r){if(n)return console.error(n);e.appupdate.manifest=r;var t={},a={},s={},i=!1;for(var p in r.tcpPorts)t[p]=r.tcpPorts[p],o.portBindings[p]?a[p]=o.portBindings[p]:(t[p].isNew=!0,a[p]=r.tcpPorts[p].defaultValue||0,i=!0);for(p in o.portBindings)r.tcpPorts[p]||(s[p]=o.portBindings[p]);i?(e.appupdate.portBindingsInfo=t,e.appupdate.portBindings=a):(e.appupdate.portBindingsInfo={},e.appupdate.portBindings={}),e.appupdate.obsoletePortBindings=s,$("#appUpdateModal").modal("show")})},e.doUpdate=function(o){e.appupdate.error.password=null,n.updateApp(e.appupdate.app.id,e.appupdate.manifest,e.appupdate.portBindings,e.appupdate.password,function(n){return n?void(403===n.statusCode?(e.appupdate.password="",e.appupdate.error.password=!0):console.error(n)):(e.appupdate.app={},e.appupdate.password="",o.$setPristine(),o.$setUntouched(),void $("#appUpdateModal").modal("hide"))})},e.cancel=function(){window.history.back()},["appConfigureModal","appUninstallModal","appUpdateModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("AppStoreController",["$scope","$location","$timeout","Client","AppStore",function(e,o,n,r,t){function a(){e.ready=!1,t.getApps(function(o,r){return o?(console.error(o),n(a,1e3)):(e.apps=r,void(e.ready=!0))})}r.onReady(function(){r.getUserInfo().admin||o.path("/")}),e.ready=!1,e.apps=[],e.config=r.getConfig(),e.appinstall={busy:!1,error:{},app:{},location:"",password:"",portBindings:{},accessRestriction:""},e.reset=function(){e.appinstall.app={},e.appinstall.location="",e.appinstall.password="",e.appinstall.portBindings={},e.appinstall.accessRestriction="",e.appinstall.error={},e.install_form.$setPristine(),e.install_form.$setUntouched()},e.showInstall=function(o){e.reset(),t.getManifest(o.id,function(n,r){if(n)return console.error(n);o.manifest=r,e.appinstall.app=o,e.appinstall.location=o.location,e.appinstall.portBindingsInfo=r.tcpPorts,e.appinstall.portBindings={},e.appinstall.accessRestriction=o.accessRestriction||"";for(var t in r.tcpPorts)e.appinstall.portBindings[t]=r.tcpPorts[t].defaultValue||0;$("#appInstallModal").modal("show")})},e.doInstall=function(){e.appinstall.busy=!0,e.appinstall.error.name=null,e.appinstall.error.password=null,e.appinstall.error.port=null,r.installApp(e.appinstall.app.id,e.appinstall.app.manifest,e.appinstall.password,e.appinstall.app.title,{location:e.appinstall.location,portBindings:e.appinstall.portBindings,accessRestriction:e.appinstall.accessRestriction},function(n){return n?(409===n.statusCode&&-1!==n.message.indexOf("is reserved")?e.appinstall.error.port="This port is already in use.":409===n.statusCode?e.appinstall.error.name="Application already exists.":403===n.statusCode?(e.appinstall.error.password="Wrong password provided.",e.appinstall.password=""):e.appinstall.error.name="App with the name "+e.appinstall.app.name+" cannot be installed.",void(e.appinstall.busy=!1)):(e.appinstall.busy=!1,$("#appInstallModal").modal("hide"),e.reset(),void o.path("/apps"))})},a(),["appInstallModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]),angular.module("Application").controller("DnsController",["$scope","$location","Client",function(e,o,n){n.onReady(function(){n.getUserInfo().admin||o.path("/")}),e.ready=!1,e.user=n.getUserInfo(),e.config=n.getConfig(),e.nakedDomainApp=null,e.certificateFile=null,e.certificateFileName="",e.keyFile=null,e.keyFileName="",e.setNakedDomain=function(){var o=e.nakedDomainApp?e.nakedDomainApp.id:"admin";n.setNakedDomain(o,function(e){return e?console.error("Error setting naked domain",e):void 0})},e.backup=function(){$("#backupProgressModal").modal("show"),e.$parent.initialized=!1,n.backup(function(o){function r(){n.version(function(o){return o?window.setTimeout(r,1e3):($("#backupProgressModal").modal("hide"),void(e.$parent.initialized=!0))})}o&&console.error(o),window.setTimeout(r,5e3)})},e.update=function(){$("#updateModal").modal("hide"),e.$parent.initialized=!1,n.update(function(e){e&&console.error(e),window.location.href="/update.html"})},document.getElementById("idCertificate").onchange=function(o){e.$apply(function(){e.certificateFile=o.target.files[0],e.certificateFileName=o.target.files[0].name})},document.getElementById("idKey").onchange=function(o){e.$apply(function(){e.keyFile=o.target.files[0],e.keyFileName=o.target.files[0].name})},e.setCertificate=function(){return console.log("Will set the certificate"),e.certificateFile?e.keyFile?void n.setCertificate(e.certificateFile,e.keyFile,function(e){return e?console.log(e):void window.setTimeout(window.location.reload.bind(window.location,!0),3e3)}):console.log("Key not set"):console.log("Certificate not set")},n.onConfig(function(){e.tokenInUse=n._token,n.getApps(function(o,r){o&&console.error("Error loading app list"),e.apps=r,n.getNakedDomain(function(o,n){if(o)return console.error(o);e.nakedDomainApp=null;for(var r=0;r',t=r+e.name+": "+new Number(n).toFixed(2)+"%
";return t}})}r.render()}function t(e,o,n){var r=[],t=[];o&&o.datapoints&&(r=o.datapoints.map(function(e){return{y:e[0],x:e[1]}})),n&&n.datapoints&&(t=n.datapoints.map(function(e){return{y:e[0],x:e[1]}}));{var a=new Rickshaw.Graph({element:document.querySelector("#"+e+"NetworkChart"),renderer:"area",width:580,height:250,series:[{color:"steelblue",data:r,name:"tx"},{color:"green",data:t,name:"rx"}]});new Rickshaw.Graph.Axis.Time({graph:a}),new Rickshaw.Graph.Axis.Y({graph:a,orientation:"left",tickFormat:Rickshaw.Fixtures.Number.formatKMBT,element:document.getElementById(e+"NetworkYAxis")}),new Rickshaw.Graph.HoverDetail({graph:a,formatter:function(e,o,n){var r='',t=r+e.name+": "+new Number(n/1024).toFixed(2)+"KB
";return t}})}a.render()}function a(e,o,n){var r=[],t=[];o&&o.datapoints&&(r=o.datapoints.map(function(e){return{y:e[0],x:e[1]}})),n&&n.datapoints&&(t=n.datapoints.map(function(e){return{y:e[0],x:e[1]}}));{var a=new Rickshaw.Graph({element:document.querySelector("#"+e+"DiskChart"),renderer:"area",width:580,height:250,min:0,max:32212254720,series:[{color:"steelblue",data:r,name:"apps"},{color:"green",data:t,name:"data"}]});new Rickshaw.Graph.Axis.Time({graph:a}),new Rickshaw.Graph.Axis.Y({graph:a,orientation:"left",tickFormat:Rickshaw.Fixtures.Number.formatKMBT,element:document.getElementById(e+"DiskYAxis")}),new Rickshaw.Graph.HoverDetail({graph:a,formatter:function(e,o,n){var r='',t=r+e.name+": "+new Number(n/1073741824).toFixed(2)+"GB
";return t}}),new Rickshaw.Graph.Legend({graph:a,element:document.getElementById(e+"DiskLegend")})}a.render()}n.getUserInfo().admin||o.path("/"),e.activeTab="day";var s="transformNull(scale(divideSeries(sumSeries(collectd.localhost.cpu-0.cpu-system,collectd.localhost.cpu-0.cpu-nice,collectd.localhost.cpu-0.cpu-user),sumSeries(collectd.localhost.cpu-0.cpu-idle,collectd.localhost.cpu-0.cpu-system,collectd.localhost.cpu-0.cpu-nice,collectd.localhost.cpu-0.cpu-user,collectd.localhost.cpu-0.cpu-wait)), 100), 0)",i="transformNull(collectd.localhost.interface-eth0.if_octets.tx, 0)",p="transformNull(collectd.localhost.interface-eth0.if_octets.rx, 0)",l="transformNull(collectd.localhost.df-loop0.df_complex-used, 0)",u="transformNull(collectd.localhost.df-loop1.df_complex-used, 0)";e.updateGraphs=function(){var o=e.activeTab,c="-24hours";switch(o){case"day":c="-24hours";break;case"month":c="-1month";break;case"year":c="-1year";break;default:console.log("internal errror")}n.graphs([s,i,p,l,u],c,function(e,n){return e?console.log(e):(r(o,n[0]),t(o,n[1],n[2]),void a(o,n[3],n[4]))})},n.onReady(e.updateGraphs)}]),angular.module("Application").controller("UsersController",["$scope","$location","Client",function(e,o,n){function r(){n.listUsers(function(o,n){return o?console.error("Unable to get user listing.",o):(e.users=n.users,void(e.ready=!0))})}n.onReady(function(){n.getUserInfo().admin||o.path("/")}),e.ready=!1,e.users=[],e.userInfo=n.getUserInfo(),e.userremove={busy:!1,error:{},userInfo:{},username:"",password:""},e.useradd={busy:!1,alreadyTaken:!1,error:{},username:"",email:""},e.isMe=function(e){return e.username===n.getUserInfo().username},e.isAdmin=function(e){return!!e.admin},e.toggleAdmin=function(e){n.setAdmin(e.username,!e.admin,function(o){return o?console.error(o):void(e.admin=!e.admin)})},e.doAdd=function(){e.useradd.alreadyTaken="",e.useradd.error.username=null,e.useradd.error.email=null,n.createUser(e.useradd.username,e.useradd.email,function(o){if(o&&409===o.statusCode)return e.useradd.alreadyTaken=e.username,console.error("Username already taken");if(o&&400===o.statusCode){if(-1!==o.message.indexOf("email"))return e.useradd.error.email="Invalid Email",void(e.useradd.email="");if(-1!==o.message.indexOf("username"))return e.useradd.error.username="Invalid Username",void(e.useradd.username="")}else o&&console.error("Unable to create user.",o),r(),$("#userAddModal").modal("hide")})},e.showUserRemove=function(o){e.userremove.error.username=null,e.userremove.error.password=null,e.userremove.userInfo=o,$("#userRemoveModal").modal("show")},e.doUserRemove=function(o){return e.userremove.error.username=null,e.userremove.error.password=null,e.userremove.username!==e.userremove.userInfo.username?(e.userremove.error.username="Username does not match",void(e.userremove.username="")):void n.removeUser(e.userremove.userInfo.id,e.userremove.password,function(n){return n&&403===n.statusCode?(e.userremove.error.password="Incorrect password",void(e.userremove.password="")):n?console.error("Unable to delete user.",n):(e.userremove.userInfo={},e.userremove.username="",e.userremove.password="",o.$setPristine(),o.$setUntouched(),$("#userRemoveModal").modal("hide"),void r())})},r(),["userAddModal","userRemoveModal"].forEach(function(e){$("#"+e).on("shown.bs.modal",function(){$(this).find("[autofocus]:first").focus()})})}]); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIiwiY2xpZW50LmpzIiwiYXBwc3RvcmUuanMiLCJtYWluLmpzIiwiYWNjb3VudC5qcyIsImFwcHMuanMiLCJkbnMuanMiLCJncmFwaHMuanMiLCJ1c2Vycy5qcyJdLCJuYW1lcyI6WyJhcHAiLCJhbmd1bGFyIiwibW9kdWxlIiwiY29uZmlnIiwiJHJvdXRlUHJvdmlkZXIiLCJ3aGVuIiwicmVkaXJlY3RUbyIsImNvbnRyb2xsZXIiLCJ0ZW1wbGF0ZVVybCIsIm90aGVyd2lzZSIsIklTVEFURVMiLCJJU1RBVEVfUEVORElOR19JTlNUQUxMIiwiSVNUQVRFX1BFTkRJTkdfQ09ORklHVVJFIiwiSVNUQVRFX1BFTkRJTkdfVU5JTlNUQUxMIiwiSVNUQVRFX1BFTkRJTkdfUkVTVE9SRSIsIklTVEFURV9QRU5ESU5HX1VQREFURSIsIklTVEFURV9FUlJPUiIsIklTVEFURV9JTlNUQUxMRUQiLCJmaWx0ZXIiLCJpbnB1dCIsImRpcmVjdGl2ZSIsInJlc3RyaWN0IiwicmVxdWlyZSIsImxpbmsiLCJzY29wZSIsImVsZW0iLCJhdHRycyIsImN0cmxzIiwiJHNldCIsImxhdGVyTmFtZSIsIm1vZGVsQ3RybCIsImZvcm1DdHJsIiwiJG5hbWUiLCJuYW1lIiwiJGFkZENvbnRyb2wiLCIkb24iLCIkcmVtb3ZlQ29udHJvbCIsInNlcnZpY2UiLCIkaHR0cCIsIm1kNSIsIkNsaWVudEVycm9yIiwic3RhdHVzQ29kZSIsIm1lc3NhZ2UiLCJFcnJvciIsImNhbGwiLCJ0aGlzIiwiY29uc3RydWN0b3IiLCJKU09OIiwic3RyaW5naWZ5IiwiZGVmYXVsdEVycm9ySGFuZGxlciIsImNhbGxiYWNrIiwiZGF0YSIsInN0YXR1cyIsImNsaWVudCIsImxvZ291dCIsIkNsaWVudCIsIl9yZWFkeSIsIl9jb25maWdMaXN0ZW5lciIsIl9yZWFkeUxpc3RlbmVyIiwiX3VzZXJJbmZvIiwidXNlcm5hbWUiLCJlbWFpbCIsImFkbWluIiwiX3Rva2VuIiwiX2NsaWVudElkIiwiX2NsaWVudFNlY3JldCIsIl9jb25maWciLCJhcGlTZXJ2ZXJPcmlnaW4iLCJ3ZWJTZXJ2ZXJPcmlnaW4iLCJmcWRuIiwiaXAiLCJyZXZpc2lvbiIsInVwZGF0ZSIsImJveCIsImFwcHMiLCJpc0RldiIsInByb2dyZXNzIiwiaXNDdXN0b21Eb21haW4iLCJkZXZlbG9wZXJNb2RlIiwiX2luc3RhbGxlZEFwcHMiLCJzZXRUb2tlbiIsImxvY2FsU3RvcmFnZSIsInRva2VuIiwicHJvdG90eXBlIiwic2V0UmVhZHkiLCJmb3JFYWNoIiwib25SZWFkeSIsInB1c2giLCJvbkNvbmZpZyIsInNldFVzZXJJbmZvIiwidXNlckluZm8iLCJncmF2YXRhciIsImNyZWF0ZUhhc2giLCJ0b0xvd2VyQ2FzZSIsImdyYXZhdGFySHVnZSIsInNldENvbmZpZyIsInZlcnNpb24iLCJ0aGF0IiwiZ2V0SW5zdGFsbGVkQXBwcyIsImdldFVzZXJJbmZvIiwiZ2V0Q29uZmlnIiwiZGVmYXVsdHMiLCJoZWFkZXJzIiwiY29tbW9uIiwiQXV0aG9yaXphdGlvbiIsInJlbW92ZUl0ZW0iLCJnZXQiLCJzdWNjZXNzIiwiZXJyb3IiLCJjaGFuZ2VEZXZlbG9wZXJNb2RlIiwiZW5hYmxlZCIsInBhc3N3b3JkIiwicG9zdCIsImluc3RhbGxBcHAiLCJpZCIsIm1hbmlmZXN0IiwidGl0bGUiLCJhcHBTdG9yZUlkIiwibG9jYXRpb24iLCJwb3J0QmluZGluZ3MiLCJhY2Nlc3NSZXN0cmljdGlvbiIsInVuaW5zdGFsbEFwcCIsImFwcElkIiwiY29uZmlndXJlQXBwIiwidXBkYXRlQXBwIiwic3RhcnRBcHAiLCJzdG9wQXBwIiwiaXNTZXJ2ZXJGaXJzdFRpbWUiLCJhY3RpdmF0ZWQiLCJnZXROYWtlZERvbWFpbiIsImFwcGlkIiwic2V0TmFrZWREb21haW4iLCJnZXRBcHBzIiwiZ2V0QXBwIiwiYXBwRm91bmQiLCJzb21lIiwiZ2V0QXBwTG9nU3RyZWFtIiwic291cmNlIiwiRXZlbnRTb3VyY2UiLCJnZXRBcHBMb2dVcmwiLCJzZXRBZG1pbiIsInBheWxvYWQiLCJjcmVhdGVBZG1pbiIsInNldHVwVG9rZW4iLCJsaXN0VXNlcnMiLCJnZXRPQXV0aENsaWVudHMiLCJjbGllbnRzIiwiZGVsVG9rZW5zQnlDbGllbnRJZCIsInJlYm9vdCIsImJhY2t1cCIsInNldENlcnRpZmljYXRlIiwiY2VydGlmaWNhdGVGaWxlIiwia2V5RmlsZSIsImNvbnNvbGUiLCJsb2ciLCJmZCIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiQ29udGVudC1UeXBlIiwidW5kZWZpbmVkIiwidHJhbnNmb3JtUmVxdWVzdCIsImlkZW50aXR5IiwiZ3JhcGhzIiwidGFyZ2V0cyIsImZyb20iLCJwYXJhbXMiLCJ0YXJnZXQiLCJmb3JtYXQiLCJjcmVhdGVVc2VyIiwicmVtb3ZlVXNlciIsInVzZXJJZCIsIm1ldGhvZCIsInVybCIsImNoYW5nZVBhc3N3b3JkIiwiY3VycmVudFBhc3N3b3JkIiwibmV3UGFzc3dvcmQiLCJjaGFuZ2VFbWFpbCIsInB1dCIsInJlZnJlc2hDb25maWciLCJyZXN1bHQiLCJyZWZyZXNoSW5zdGFsbGVkQXBwcyIsImZvdW5kIiwiaSIsImxlbmd0aCIsImNvcHkiLCJzcGxpY2UiLCJ3aW5kb3ciLCJocmVmIiwiZXhjaGFuZ2VDb2RlRm9yVG9rZW4iLCJhdXRoQ29kZSIsImdyYW50X3R5cGUiLCJjb2RlIiwicmVkaXJlY3RfdXJpIiwib3JpZ2luIiwiY2xpZW50X2lkIiwiY2xpZW50X3NlY3JldCIsImFjY2Vzc190b2tlbiIsIkFwcFN0b3JlRXJyb3IiLCJBcHBTdG9yZSIsIl9hcHBzQ2FjaGUiLCJib3hWZXJzaW9uIiwiZ2V0QXBwQnlJZCIsImdldE1hbmlmZXN0IiwibWFuaWZlc3RVcmwiLCIkc2NvcGUiLCIkcm91dGUiLCIkaW50ZXJ2YWwiLCJpbml0aWFsaXplZCIsImlzQWN0aXZlIiwiY3VycmVudCIsIiQkcm91dGUiLCJvcmlnaW5hbFBhdGgiLCJpbmRleE9mIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJsb2dpbiIsImNhbGxiYWNrVVJMIiwic2V0dXAiLCJzaG93VXBkYXRlTW9kYWwiLCJmb3JtIiwiJHNldFByaXN0aW5lIiwiJHNldFVudG91Y2hlZCIsIiQiLCJtb2RhbCIsImRvVXBkYXRlIiwiY2hlY2tJZkRvbmUiLCJzZXRUaW1lb3V0IiwiaXNGaXJzdFRpbWUiLCJyZWZyZXNoQXBwc1RpbWVyIiwiYmluZCIsInJlZnJlc2hDb25maWdUaW1lciIsImNhbmNlbCIsIm9uIiwiZmluZCIsImZvY3VzIiwiJGxvY2F0aW9uIiwicGFzc3dvcmRDaGFuZ2VSZXNldCIsInBhc3N3b3JkY2hhbmdlIiwibmV3UGFzc3dvcmRSZXBlYXQiLCJlbWFpbENoYW5nZVJlc2V0IiwiZW1haWxjaGFuZ2UiLCJkZXZlbG9wZXJNb2RlQ2hhbmdlUmVzZXQiLCJkZXZlbG9wZXJNb2RlQ2hhbmdlIiwiZGV2ZWxvcGVyTW9kZUNoYW5nZUZvcm0iLCJ1c2VyIiwiYWN0aXZlQ2xpZW50cyIsInRva2VuSW5Vc2UiLCJidXN5IiwiZG9DaGFuZ2VQYXNzd29yZCIsImRvQ2hhbmdlRW1haWwiLCJkb0NoYW5nZURldmVsb3Blck1vZGUiLCJzaG93Q2hhbmdlUGFzc3dvcmQiLCJzaG93Q2hhbmdlRW1haWwiLCJzaG93Q2hhbmdlRGV2ZWxvcGVyTW9kZSIsInJlbW92ZUFjY2Vzc1Rva2VucyIsImFkZENsYXNzIiwiSE9TVF9QT1JUX01JTiIsIkhPU1RfUE9SVF9NQVgiLCJpbnN0YWxsZWRBcHBzIiwiYXBwY29uZmlndXJlIiwiYXBwdW5pbnN0YWxsIiwiYXBwdXBkYXRlIiwicmVzZXQiLCJjb25maWdfZm9ybSIsInVuaW5zdGFsbF9mb3JtIiwic2hvd0NvbmZpZ3VyZSIsInBvcnRCaW5kaW5nc0luZm8iLCJ0Y3BQb3J0cyIsImRvQ29uZmlndXJlIiwic2hvd1VuaW5zdGFsbCIsImRvVW5pbnN0YWxsIiwic2hvd1VwZGF0ZSIsIm9ic29sZXRlUG9ydEJpbmRpbmdzIiwibmV3UG9ydHMiLCJlbnYiLCJpc05ldyIsImRlZmF1bHRWYWx1ZSIsImhpc3RvcnkiLCJiYWNrIiwiJHRpbWVvdXQiLCJyZWZyZXNoIiwicmVhZHkiLCJwYXRoIiwiYXBwaW5zdGFsbCIsImluc3RhbGxfZm9ybSIsInNob3dJbnN0YWxsIiwiZG9JbnN0YWxsIiwicG9ydCIsIm5ha2VkRG9tYWluQXBwIiwiY2VydGlmaWNhdGVGaWxlTmFtZSIsImtleUZpbGVOYW1lIiwiJHBhcmVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJvbmNoYW5nZSIsIiRhcHBseSIsImZpbGVzIiwicmVsb2FkIiwicmVuZGVyQ3B1IiwiYWN0aXZlVGFiIiwiY3B1RGF0YSIsInRyYW5zZm9ybWVkQ3B1IiwiZGF0YXBvaW50cyIsIm1hcCIsInBvaW50IiwieSIsIngiLCJjcHVHcmFwaCIsIlJpY2tzaGF3IiwiR3JhcGgiLCJlbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInJlbmRlcmVyIiwid2lkdGgiLCJoZWlnaHQiLCJtaW4iLCJtYXgiLCJzZXJpZXMiLCJjb2xvciIsIkF4aXMiLCJUaW1lIiwiZ3JhcGgiLCJZIiwib3JpZW50YXRpb24iLCJ0aWNrRm9ybWF0IiwiRml4dHVyZXMiLCJOdW1iZXIiLCJmb3JtYXRLTUJUIiwiSG92ZXJEZXRhaWwiLCJmb3JtYXR0ZXIiLCJzd2F0Y2giLCJjb250ZW50IiwidG9GaXhlZCIsInJlbmRlciIsInJlbmRlck5ldHdvcmsiLCJ0eERhdGEiLCJyeERhdGEiLCJ0cmFuc2Zvcm1lZFR4IiwidHJhbnNmb3JtZWRSeCIsIm5ldHdvcmtHcmFwaCIsInJlbmRlckRpc2siLCJhcHBzVXNlZERhdGEiLCJkYXRhVXNlZERhdGEiLCJ0cmFuc2Zvcm1lZEFwcHNVc2VkIiwidHJhbnNmb3JtZWREYXRhVXNlZCIsImRpc2tHcmFwaCIsIkxlZ2VuZCIsImNwdVVzYWdlVGFyZ2V0IiwibmV0d29ya1VzYWdlVHhUYXJnZXQiLCJuZXR3b3JrVXNhZ2VSeFRhcmdldCIsImRpc2tVc2FnZUFwcHNVc2VkVGFyZ2V0IiwiZGlza1VzYWdlRGF0YVVzZWRUYXJnZXQiLCJ1cGRhdGVHcmFwaHMiLCJ1c2VycyIsInVzZXJyZW1vdmUiLCJ1c2VyYWRkIiwiYWxyZWFkeVRha2VuIiwiaXNNZSIsImlzQWRtaW4iLCJ0b2dnbGVBZG1pbiIsImRvQWRkIiwic2hvd1VzZXJSZW1vdmUiLCJkb1VzZXJSZW1vdmUiXSwibWFwcGluZ3MiOiJBQUFBLFlBS0EsSUFBQUEsS0FBQUMsUUFBQUMsT0FBQSxlQUFBLFVBQUEsWUFBQSxlQUdBRixLQUFBRyxRQUFBLGlCQUFBLFNBQUFDLEdBQ0FBLEVBQUFDLEtBQUEsS0FDQUMsV0FBQSxVQUNBRCxLQUFBLFVBQ0FFLFdBQUEsa0JBQ0FDLFlBQUEscUJBQ0FILEtBQUEsYUFDQUUsV0FBQSxxQkFDQUMsWUFBQSx3QkFDQUgsS0FBQSxTQUNBRSxXQUFBLGlCQUNBQyxZQUFBLG9CQUNBSCxLQUFBLFFBQ0FFLFdBQUEsZ0JBQ0FDLFlBQUEsbUJBQ0FILEtBQUEsWUFDQUUsV0FBQSxvQkFDQUMsWUFBQSx1QkFDQUgsS0FBQSxXQUNBRSxXQUFBLG1CQUNBQyxZQUFBLHNCQUNBQyxXQUFBSCxXQUFBLFFBSUEsSUFBQUksVUFDQUMsdUJBQUEsa0JBQ0FDLHlCQUFBLG9CQUNBQyx5QkFBQSxvQkFDQUMsdUJBQUEsa0JBQ0FDLHNCQUFBLGlCQUNBQyxhQUFBLFFBQ0FDLGlCQUFBLFlBR0FqQixLQUFBa0IsT0FBQSxxQkFBQSxXQUNBLE1BQUEsVUFBQUMsR0FDQSxNQUFBQSxLQUFBVCxRQUFBTSxjQUFBLEVBQ0FHLElBQUFULFFBQUFPLGtCQUFBLEdBQ0EsS0FJQWpCLElBQUFrQixPQUFBLHlCQUFBLFdBQ0EsTUFBQSxVQUFBQyxHQUNBLE9BQUFBLEdBQ0EsSUFBQVQsU0FBQUMsdUJBQUEsTUFBQSxZQUNBLEtBQUFELFNBQUFFLHlCQUFBLE1BQUEsYUFDQSxLQUFBRixTQUFBRyx5QkFBQSxNQUFBLGNBQ0EsS0FBQUgsU0FBQUksdUJBQUEsTUFBQSxVQUNBLEtBQUFKLFNBQUFLLHNCQUFBLE1BQUEsVUFDQSxLQUFBTCxTQUFBTSxhQUFBLE1BQUEsT0FDQSxLQUFBTixTQUFBTyxpQkFBQSxNQUFBLFNBQ0EsU0FBQSxNQUFB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QUFBLElBRUFnRyxFQUFBc0osV0FBQXhRLFlBQ0FrSCxFQUFBc0osV0FBQXRTLFNBQUEsR0FDQWdKLEVBQUFzSixXQUFBblAsU0FBQSxHQUVBNEcsRUFBQUMsZUFDQUQsRUFBQUUsZ0JBRUFDLEVBQUEsb0JBQUFDLE1BQUEsWUFFQXlELFNBYUFBLEtBR0EsZUFBQSxtQkFBQW5NLFFBQUEsU0FBQTZCLEdBQ0E0RyxFQUFBLElBQUE1RyxHQUFBc0gsR0FBQSxpQkFBQSxXQUNBVixFQUFBakwsTUFBQTRMLEtBQUEscUJBQUFDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgYW5ndWxhcjpmYWxzZSAqL1xuXG4vLyBjcmVhdGUgbWFpbiBhcHBsaWNhdGlvbiBtb2R1bGVcbnZhciBhcHAgPSBhbmd1bGFyLm1vZHVsZSgnQXBwbGljYXRpb24nLCBbJ25nUm91dGUnLCAnbmdBbmltYXRlJywgJ2FuZ3VsYXItbWQ1J10pO1xuXG4vLyBzZXR1cCBhbGwgbWFqb3IgYXBwbGljYXRpb24gcm91dGVzXG5hcHAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCBmdW5jdGlvbiAoJHJvdXRlUHJvdmlkZXIpIHtcbiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvJywge1xuICAgICAgICByZWRpcmVjdFRvOiAnL2FwcHMnXG4gICAgfSkud2hlbignL3VzZXJzJywge1xuICAgICAgICBjb250cm9sbGVyOiAnVXNlcnNDb250cm9sbGVyJyxcbiAgICAgICAgdGVtcGxhdGVVcmw6ICd2aWV3cy91c2Vycy5odG1sJ1xuICAgIH0pLndoZW4oJy9hcHBzdG9yZScsIHtcbiAgICAgICAgY29udHJvbGxlcjogJ0FwcFN0b3JlQ29udHJvbGxlcicsXG4gICAgICAgIHRlbXBsYXRlVXJsOiAndmlld3MvYXBwc3RvcmUuaHRtbCdcbiAgICB9KS53aGVuKCcvYXBwcycsIHtcbiAgICAgICAgY29udHJvbGxlcjogJ0FwcHNDb250cm9sbGVyJyxcbiAgICAgICAgdGVtcGxhdGVVcmw6ICd2aWV3cy9hcHBzLmh0bWwnXG4gICAgfSkud2hlbignL2RucycsIHtcbiAgICAgICAgY29udHJvbGxlcjogJ0Ruc0NvbnRyb2xsZXInLFxuICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpZXdzL2Rucy5odG1sJ1xuICAgIH0pLndoZW4oJy9hY2NvdW50Jywge1xuICAgICAgICBjb250cm9sbGVyOiAnQWNjb3VudENvbnRyb2xsZXInLFxuICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpZXdzL2FjY291bnQuaHRtbCdcbiAgICB9KS53aGVuKCcvZ3JhcGhzJywge1xuICAgICAgICBjb250cm9sbGVyOiAnR3JhcGhzQ29udHJvbGxlcicsXG4gICAgICAgIHRlbXBsYXRlVXJsOiAndmlld3MvZ3JhcGhzLmh0bWwnXG4gICAgfSkub3RoZXJ3aXNlKHsgcmVkaXJlY3RUbzogJy8nfSk7XG59XSk7XG5cbi8vIGtlZXAgaW4gc3luYyB3aXRoIGFwcGRiLmpzXG52YXIgSVNUQVRFUyA9IHtcbiAgICBJU1RBVEVfUEVORElOR19JTlNUQUxMOiAncGVuZGluZ19pbnN0YWxsJyxcbiAgICBJU1RBVEVfUEVORElOR19DT05GSUdVUkU6ICdwZW5kaW5nX2NvbmZpZ3VyZScsXG4gICAgSVNUQVRFX1BFTkRJTkdfVU5JTlNUQUxMOiAncGVuZGluZ191bmluc3RhbGwnLFxuICAgIElTVEFURV9QRU5ESU5HX1JFU1RPUkU6ICdwZW5kaW5nX3Jlc3RvcmUnLFxuICAgIElTVEFURV9QRU5ESU5HX1VQREFURTogJ3BlbmRpbmdfdXBkYXRlJyxcbiAgICBJU1RBVEVfRVJST1I6ICdlcnJvcicsXG4gICAgSVNUQVRFX0lOU1RBTExFRDogJ2luc3RhbGxlZCdcbn07XG5cbmFwcC5maWx0ZXIoJ2luc3RhbGxhdGlvbkFjdGl2ZScsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQgPT09IElTVEFURVMuSVNUQVRFX0VSUk9SKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gSVNUQVRFUy5JU1RBVEVfSU5TVEFMTEVEKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59KTtcblxuYXBwLmZpbHRlcignaW5zdGFsbGF0aW9uU3RhdGVMYWJlbCcsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBzd2l0Y2ggKGlucHV0KSB7XG4gICAgICAgIGNhc2UgSVNUQVRFUy5JU1RBVEVfUEVORElOR19JTlNUQUxMOiByZXR1cm4gJ0luc3RhbGxpbmcnO1xuICAgICAgICBjYXNlIElTVEFURVMuSVNUQVRFX1BFTkRJTkdfQ09ORklHVVJFOiByZXR1cm4gJ0NvbmZpZ3VyaW5nJztcbiAgICAgICAgY2FzZSBJU1RBVEVTLklTVEFURV9QRU5ESU5HX1VOSU5TVEFMTDogcmV0dXJuICdVbmluc3RhbGxpbmcnO1xuICAgICAgICBjYXNlIElTVEFURVMuSVNUQVRFX1BFTkRJTkdfUkVTVE9SRTogcmV0dXJuICdTdGFydGluZyc7XG4gICAgICAgIGNhc2UgSVNUQVRFUy5JU1RBVEVfUEVORElOR19VUERBVEU6IHJldHVybiAnVXBkYXRpbmcnO1xuICAgICAgICBjYXNlIElTVEFURVMuSVNUQVRFX0VSUk9SOiByZXR1cm4gJ0Vycm9yJztcbiAgICAgICAgY2FzZSBJU1RBVEVTLklTVEFURV9JTlNUQUxMRUQ6IHJldHVybiAnUnVubmluZyc7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuICAgIH07XG59KTtcblxuYXBwLmZpbHRlcignYWNjZXNzUmVzdHJpY3Rpb25MYWJlbCcsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQgPT09ICcnKSByZXR1cm4gJ3B1YmxpYyc7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gJ3JvbGVVc2VyJykgcmV0dXJuICdwcml2YXRlJztcbiAgICAgICAgaWYgKGlucHV0ID09PSAncm9sZUFkbWluJykgcmV0dXJuICdwcml2YXRlIChBZG1pbnMgb25seSknO1xuXG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9O1xufSk7XG5cbi8vIGN1c3RvbSBkaXJlY3RpdmUgZm9yIGR5bmFtaWMgbmFtZXMgaW4gZm9ybXNcbi8vIFNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIzNjE2NTc4L2lzc3VlLXJlZ2lzdGVyaW5nLWZvcm0tY29udHJvbC13aXRoLWludGVycG9sYXRlZC1uYW1lI2Fuc3dlci0yMzYxNzQwMVxuYXBwLmRpcmVjdGl2ZSgnbGF0ZXJOYW1lJywgZnVuY3Rpb24gKCkgeyAgICAgICAgICAgICAgICAgICAvLyAoMilcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICByZXF1aXJlOiBbJz9uZ01vZGVsJywgJ14/Zm9ybSddLCAgICAgICAgICAgICAgICAgICAvLyAoMylcbiAgICAgICAgbGluazogZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGVsZW0sIGF0dHJzLCBjdHJscykge1xuICAgICAgICAgICAgYXR0cnMuJHNldCgnbmFtZScsIGF0dHJzLmxhdGVyTmFtZSk7XG5cbiAgICAgICAgICAgIHZhciBtb2RlbEN0cmwgPSBjdHJsc1swXTsgICAgICAgICAgICAgICAgICAgICAgLy8gKDMpXG4gICAgICAgICAgICB2YXIgZm9ybUN0cmwgID0gY3RybHNbMV07ICAgICAgICAgICAgICAgICAgICAgIC8vICgzKVxuICAgICAgICAgICAgaWYgKG1vZGVsQ3RybCAmJiBmb3JtQ3RybCkge1xuICAgICAgICAgICAgICAgIG1vZGVsQ3RybC4kbmFtZSA9IGF0dHJzLm5hbWU7ICAgICAgICAgICAgICAvLyAoNClcbiAgICAgICAgICAgICAgICBmb3JtQ3RybC4kYWRkQ29udHJvbChtb2RlbEN0cmwpOyAgICAgICAgICAgLy8gKDIpXG4gICAgICAgICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUN0cmwuJHJlbW92ZUNvbnRyb2wobW9kZWxDdHJsKTsgICAgLy8gKDUpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBhbmd1bGFyICovXG4vKiBnbG9iYWwgRXZlbnRTb3VyY2UgKi9cblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuc2VydmljZSgnQ2xpZW50JywgWyckaHR0cCcsICdtZDUnLCBmdW5jdGlvbiAoJGh0dHAsIG1kNSkge1xuICAgIHZhciBjbGllbnQgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gQ2xpZW50RXJyb3Ioc3RhdHVzQ29kZSwgbWVzc2FnZSkge1xuICAgICAgICBFcnJvci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDAxKSByZXR1cm4gY2xpZW50LmxvZ291dCgpO1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENsaWVudCgpIHtcbiAgICAgICAgdGhpcy5fcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY29uZmlnTGlzdGVuZXIgPSBbXTtcbiAgICAgICAgdGhpcy5fcmVhZHlMaXN0ZW5lciA9IFtdO1xuICAgICAgICB0aGlzLl91c2VySW5mbyA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBudWxsLFxuICAgICAgICAgICAgZW1haWw6IG51bGwsXG4gICAgICAgICAgICBhZG1pbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLl9jbGllbnRJZCA9ICdjaWQtd2ViYWRtaW4nO1xuICAgICAgICB0aGlzLl9jbGllbnRTZWNyZXQgPSAndW51c2VkJztcbiAgICAgICAgdGhpcy5fY29uZmlnID0ge1xuICAgICAgICAgICAgYXBpU2VydmVyT3JpZ2luOiBudWxsLFxuICAgICAgICAgICAgd2ViU2VydmVyT3JpZ2luOiBudWxsLFxuICAgICAgICAgICAgZnFkbjogbnVsbCxcbiAgICAgICAgICAgIGlwOiBudWxsLFxuICAgICAgICAgICAgcmV2aXNpb246IG51bGwsXG4gICAgICAgICAgICB1cGRhdGU6IHsgYm94OiBudWxsLCBhcHBzOiBudWxsIH0sXG4gICAgICAgICAgICBpc0RldjogZmFsc2UsXG4gICAgICAgICAgICBwcm9ncmVzczoge30sXG4gICAgICAgICAgICBpc0N1c3RvbURvbWFpbjogZmFsc2UsXG4gICAgICAgICAgICBkZXZlbG9wZXJNb2RlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9pbnN0YWxsZWRBcHBzID0gW107XG5cbiAgICAgICAgdGhpcy5zZXRUb2tlbihsb2NhbFN0b3JhZ2UudG9rZW4pO1xuICAgIH1cblxuICAgIENsaWVudC5wcm90b3R5cGUuc2V0UmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZWFkeSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVhZHlMaXN0ZW5lci5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUub25SZWFkeSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5fcmVhZHkpIGNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX3JlYWR5TGlzdGVuZXIucHVzaChjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUub25Db25maWcgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fY29uZmlnTGlzdGVuZXIucHVzaChjYWxsYmFjayk7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMuX2NvbmZpZyk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuc2V0VXNlckluZm8gPSBmdW5jdGlvbiAodXNlckluZm8pIHtcbiAgICAgICAgLy8gSW4gb3JkZXIgdG8ga2VlcCB0aGUgYW5ndWxhciBiaW5kaW5ncyBhbGl2ZSwgc2V0IGVhY2ggcHJvcGVydHkgaW5kaXZpZHVhbGx5XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvLnVzZXJuYW1lID0gdXNlckluZm8udXNlcm5hbWU7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvLmVtYWlsID0gdXNlckluZm8uZW1haWw7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvLmFkbWluID0gISF1c2VySW5mby5hZG1pbjtcbiAgICAgICAgdGhpcy5fdXNlckluZm8uZ3JhdmF0YXIgPSAnaHR0cHM6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci8nICsgbWQ1LmNyZWF0ZUhhc2godXNlckluZm8uZW1haWwudG9Mb3dlckNhc2UoKSkgKyAnLmpwZz9zPTI0JmQ9bW0nO1xuICAgICAgICB0aGlzLl91c2VySW5mby5ncmF2YXRhckh1Z2UgPSAnaHR0cHM6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci8nICsgbWQ1LmNyZWF0ZUhhc2godXNlckluZm8uZW1haWwudG9Mb3dlckNhc2UoKSkgKyAnLmpwZz9zPTEyOCZkPW1tJztcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIC8vIEluIG9yZGVyIHRvIGtlZXAgdGhlIGFuZ3VsYXIgYmluZGluZ3MgYWxpdmUsIHNldCBlYWNoIHByb3BlcnR5IGluZGl2aWR1YWxseSAoVE9ETzoganVzdCB1c2UgYW5ndWxhci5jb3B5ID8pXG4gICAgICAgIHRoaXMuX2NvbmZpZy5hcGlTZXJ2ZXJPcmlnaW4gPSBjb25maWcuYXBpU2VydmVyT3JpZ2luO1xuICAgICAgICB0aGlzLl9jb25maWcud2ViU2VydmVyT3JpZ2luID0gY29uZmlnLndlYlNlcnZlck9yaWdpbjtcbiAgICAgICAgdGhpcy5fY29uZmlnLnZlcnNpb24gPSBjb25maWcudmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29uZmlnLmZxZG4gPSBjb25maWcuZnFkbjtcbiAgICAgICAgdGhpcy5fY29uZmlnLmlwID0gY29uZmlnLmlwO1xuICAgICAgICB0aGlzLl9jb25maWcucmV2aXNpb24gPSBjb25maWcucmV2aXNpb247XG4gICAgICAgIHRoaXMuX2NvbmZpZy51cGRhdGUgPSBjb25maWcudXBkYXRlO1xuICAgICAgICB0aGlzLl9jb25maWcuaXNEZXYgPSBjb25maWcuaXNEZXY7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5wcm9ncmVzcyA9IGNvbmZpZy5wcm9ncmVzcztcbiAgICAgICAgdGhpcy5fY29uZmlnLnByb2dyZXNzID0gY29uZmlnLnByb2dyZXNzO1xuICAgICAgICB0aGlzLl9jb25maWcuaXNDdXN0b21Eb21haW4gPSBjb25maWcuaXNDdXN0b21Eb21haW47XG4gICAgICAgIHRoaXMuX2NvbmZpZy5kZXZlbG9wZXJNb2RlID0gY29uZmlnLmRldmVsb3Blck1vZGU7XG5cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZ0xpc3RlbmVyLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aGF0Ll9jb25maWcpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5nZXRJbnN0YWxsZWRBcHBzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFsbGVkQXBwcztcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5nZXRVc2VySW5mbyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmdldENvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5zZXRUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAkaHR0cC5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vbi5BdXRob3JpemF0aW9uID0gJ0JlYXJlciAnICsgdG9rZW47XG4gICAgICAgIGlmICghdG9rZW4pIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2tlbicpO1xuICAgICAgICBlbHNlIGxvY2FsU3RvcmFnZS50b2tlbiA9IHRva2VuO1xuICAgICAgICB0aGlzLl90b2tlbiA9IHRva2VuO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFJlc3QgQVBJIHdyYXBwZXJzXG4gICAgICovXG4gICAgQ2xpZW50LnByb3RvdHlwZS5jb25maWcgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAuZ2V0KCcvYXBpL3YxL2Nsb3Vkcm9uL2NvbmZpZycpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDAgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS51c2VySW5mbyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgJGh0dHAuZ2V0KCcvYXBpL3YxL3Byb2ZpbGUnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcblxuICAgICAgICAgICAgLy8gY2FjaGUgdXNlciBpbmZvXG4gICAgICAgICAgICB0aGF0LnNldFVzZXJJbmZvKGRhdGEpO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmNoYW5nZURldmVsb3Blck1vZGUgPSBmdW5jdGlvbiAoZW5hYmxlZCwgcGFzc3dvcmQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICB2YXIgZGF0YSA9IHsgcGFzc3dvcmQ6IHBhc3N3b3JkLCBlbmFibGVkOiBlbmFibGVkIH07XG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvZGV2ZWxvcGVyJywgZGF0YSkuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDApIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG5cbiAgICAgICAgICAgIC8vIHdpbGwgZ2V0IG92ZXJyaWRlbiBhZnRlciBwb2xsaW5nIGZvciBjb25maWcsIGJ1dCBlbnN1cmVzIHF1aWNrIFVJIHVwZGF0ZVxuICAgICAgICAgICAgdGhhdC5fY29uZmlnLmRldmVsb3Blck1vZGUgPSBlbmFibGVkO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmluc3RhbGxBcHAgPSBmdW5jdGlvbiAoaWQsIG1hbmlmZXN0LCBwYXNzd29yZCwgdGl0bGUsIGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgZGF0YSA9IHsgYXBwU3RvcmVJZDogaWQsIG1hbmlmZXN0OiBtYW5pZmVzdCwgcGFzc3dvcmQ6IHBhc3N3b3JkLCBsb2NhdGlvbjogY29uZmlnLmxvY2F0aW9uLCBwb3J0QmluZGluZ3M6IGNvbmZpZy5wb3J0QmluZGluZ3MsIGFjY2Vzc1Jlc3RyaWN0aW9uOiBjb25maWcuYWNjZXNzUmVzdHJpY3Rpb24gfTtcbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9hcHBzL2luc3RhbGwnLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMiB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG5cbiAgICAgICAgICAgIC8vIHB1dCBuZXcgYXBwIHdpdGggYW1lbmRlZCB0aXRsZSBpbiBjYWNoZVxuICAgICAgICAgICAgZGF0YS5tYW5pZmVzdCA9IHsgdGl0bGU6IHRpdGxlIH07XG4gICAgICAgICAgICB0aGF0Ll9pbnN0YWxsZWRBcHBzLnB1c2goZGF0YSk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEuaWQpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUudW5pbnN0YWxsQXBwID0gZnVuY3Rpb24gKGFwcElkLCBwYXNzd29yZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7IHBhc3N3b3JkOiBwYXNzd29yZCB9O1xuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2FwcHMvJyArIGFwcElkICsgJy91bmluc3RhbGwnLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMikgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuY29uZmlndXJlQXBwID0gZnVuY3Rpb24gKGlkLCBwYXNzd29yZCwgY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0YSA9IHsgYXBwSWQ6IGlkLCBwYXNzd29yZDogcGFzc3dvcmQsIGxvY2F0aW9uOiBjb25maWcubG9jYXRpb24sIHBvcnRCaW5kaW5nczogY29uZmlnLnBvcnRCaW5kaW5ncywgYWNjZXNzUmVzdHJpY3Rpb246IGNvbmZpZy5hY2Nlc3NSZXN0cmljdGlvbiB9O1xuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2FwcHMvJyArIGlkICsgJy9jb25maWd1cmUnLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMikgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUudXBkYXRlQXBwID0gZnVuY3Rpb24gKGlkLCBtYW5pZmVzdCwgcG9ydEJpbmRpbmdzLCBwYXNzd29yZCwgY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9hcHBzLycgKyBpZCArICcvdXBkYXRlJywgeyBtYW5pZmVzdDogbWFuaWZlc3QsIHBhc3N3b3JkOiBwYXNzd29yZCwgcG9ydEJpbmRpbmdzOiBwb3J0QmluZGluZ3MgfSkuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDIpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnN0YXJ0QXBwID0gZnVuY3Rpb24gKGlkLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0YSA9IHsgfTtcbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9hcHBzLycgKyBpZCArICcvc3RhcnQnLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMikgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuc3RvcEFwcCA9IGZ1bmN0aW9uIChpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7IH07XG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvYXBwcy8nICsgaWQgKyAnL3N0b3AnLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMikgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUudmVyc2lvbiA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5nZXQoJy9hcGkvdjEvY2xvdWRyb24vc3RhdHVzJykuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmlzU2VydmVyRmlyc3RUaW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLmdldCgnL2FwaS92MS9jbG91ZHJvbi9zdGF0dXMnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsICFkYXRhLmFjdGl2YXRlZCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5nZXROYWtlZERvbWFpbiA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5nZXQoJy9hcGkvdjEvc2V0dGluZ3MvbmFrZWRfZG9tYWluJylcbiAgICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEuYXBwaWQpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuc2V0TmFrZWREb21haW4gPSBmdW5jdGlvbiAoYXBwaWQsIGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvc2V0dGluZ3MvbmFrZWRfZG9tYWluJywgeyBhcHBpZDogYXBwaWQgfSkuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDQpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmdldEFwcHMgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAuZ2V0KCcvYXBpL3YxL2FwcHMnKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhLmFwcHMpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZ2V0QXBwID0gZnVuY3Rpb24gKGFwcElkLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgYXBwRm91bmQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pbnN0YWxsZWRBcHBzLnNvbWUoZnVuY3Rpb24gKGFwcCkge1xuICAgICAgICAgICAgaWYgKGFwcC5pZCA9PT0gYXBwSWQpIHtcbiAgICAgICAgICAgICAgICBhcHBGb3VuZCA9IGFwcDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXBwRm91bmQpIHJldHVybiBjYWxsYmFjayhudWxsLCBhcHBGb3VuZCk7XG4gICAgICAgIGVsc2UgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignQXBwIG5vdCBmb3VuZCcpKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5nZXRBcHBMb2dTdHJlYW0gPSBmdW5jdGlvbiAoYXBwSWQpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2FwaS92MS9hcHBzLycgKyBhcHBJZCArICcvbG9nc3RyZWFtJyk7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZ2V0QXBwTG9nVXJsID0gZnVuY3Rpb24gKGFwcElkKSB7XG4gICAgICAgIHJldHVybiAnL2FwaS92MS9hcHBzLycgKyBhcHBJZCArICcvbG9ncz9hY2Nlc3NfdG9rZW49JyArIHRoaXMuX3Rva2VuO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnNldEFkbWluID0gZnVuY3Rpb24gKHVzZXJuYW1lLCBhZG1pbiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgICBhZG1pbjogYWRtaW5cbiAgICAgICAgfTtcblxuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL3VzZXJzLycgKyB1c2VybmFtZSArICcvYWRtaW4nLCBwYXlsb2FkKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwNCkgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuY3JlYXRlQWRtaW4gPSBmdW5jdGlvbiAodXNlcm5hbWUsIHBhc3N3b3JkLCBlbWFpbCwgc2V0dXBUb2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgICAgICBlbWFpbDogZW1haWxcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9jbG91ZHJvbi9hY3RpdmF0ZT9zZXR1cFRva2VuPScgKyBzZXR1cFRva2VuLCBwYXlsb2FkKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAxIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcblxuICAgICAgICAgICAgdGhhdC5zZXRUb2tlbihkYXRhLnRva2VuKTtcbiAgICAgICAgICAgIHRoYXQuc2V0VXNlckluZm8oeyB1c2VybmFtZTogdXNlcm5hbWUsIGVtYWlsOiBlbWFpbCwgYWRtaW46IHRydWUgfSk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEuYWN0aXZhdGVkKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmxpc3RVc2VycyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5nZXQoJy9hcGkvdjEvdXNlcnMnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZ2V0T0F1dGhDbGllbnRzID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLmdldCgnL2FwaS92MS9vYXV0aC9jbGllbnRzJykuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhLmNsaWVudHMpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZGVsVG9rZW5zQnlDbGllbnRJZCA9IGZ1bmN0aW9uIChpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgJGh0dHAuZGVsZXRlKCcvYXBpL3YxL29hdXRoL2NsaWVudHMvJyArIGlkICsgJy90b2tlbnMnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjA0KSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAocGFzc3dvcmQsIGNhbGxiYWNrKSB7XG4gICAgICAgICRodHRwLnBvc3QoJy9hcGkvdjEvY2xvdWRyb24vdXBkYXRlJywgeyBwYXNzd29yZDogcGFzc3dvcmQgfSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMiB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnJlYm9vdCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5nZXQoJy9hcGkvdjEvY2xvdWRyb24vcmVib290Jykuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMiB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmJhY2t1cCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL2Nsb3Vkcm9uL2JhY2t1cHMnKS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAyIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuc2V0Q2VydGlmaWNhdGUgPSBmdW5jdGlvbiAoY2VydGlmaWNhdGVGaWxlLCBrZXlGaWxlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zb2xlLmxvZygnd2lsbCBzZXQgY2VydGlmaWNhdGUnKTtcblxuICAgICAgICB2YXIgZmQgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZmQuYXBwZW5kKCdjZXJ0aWZpY2F0ZScsIGNlcnRpZmljYXRlRmlsZSk7XG4gICAgICAgIGZkLmFwcGVuZCgna2V5Jywga2V5RmlsZSk7XG5cbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS9jbG91ZHJvbi9jZXJ0aWZpY2F0ZScsIGZkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGFuZ3VsYXIuaWRlbnRpdHlcbiAgICAgICAgfSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMikgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZ3JhcGhzID0gZnVuY3Rpb24gKHRhcmdldHMsIGZyb20sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjb25maWcgPSB7XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldHMsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnanNvbicsXG4gICAgICAgICAgICAgICAgZnJvbTogZnJvbVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgICRodHRwLmdldCgnL2FwaS92MS9jbG91ZHJvbi9ncmFwaHMnLCBjb25maWcpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuY3JlYXRlVXNlciA9IGZ1bmN0aW9uICh1c2VybmFtZSwgZW1haWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICAgIH07XG5cbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS91c2VycycsIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gY2FsbGJhY2sobmV3IENsaWVudEVycm9yKHN0YXR1cywgZGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGRlZmF1bHRFcnJvckhhbmRsZXIoY2FsbGJhY2spKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVVc2VyID0gZnVuY3Rpb24gKHVzZXJJZCwgcGFzc3dvcmQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgICAgIH07XG5cbiAgICAgICAgJGh0dHAoeyBtZXRob2Q6ICdERUxFVEUnLCB1cmw6ICcvYXBpL3YxL3VzZXJzLycgKyB1c2VySWQsIGRhdGE6IGRhdGEsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9fSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwNCkgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuY2hhbmdlUGFzc3dvcmQgPSBmdW5jdGlvbiAoY3VycmVudFBhc3N3b3JkLCBuZXdQYXNzd29yZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICBwYXNzd29yZDogY3VycmVudFBhc3N3b3JkLFxuICAgICAgICAgICAgbmV3UGFzc3dvcmQ6IG5ld1Bhc3N3b3JkXG4gICAgICAgIH07XG5cbiAgICAgICAgJGh0dHAucG9zdCgnL2FwaS92MS91c2Vycy8nICsgdGhpcy5fdXNlckluZm8udXNlcm5hbWUgKyAnL3Bhc3N3b3JkJywgZGF0YSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwNCkgcmV0dXJuIGNhbGxiYWNrKG5ldyBDbGllbnRFcnJvcihzdGF0dXMsIGRhdGEpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KS5lcnJvcihkZWZhdWx0RXJyb3JIYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuY2hhbmdlRW1haWwgPSBmdW5jdGlvbiAoZW1haWwsIHBhc3N3b3JkLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgICAgIGVtYWlsOiBlbWFpbFxuICAgICAgICB9O1xuXG4gICAgICAgICRodHRwLnB1dCgnL2FwaS92MS91c2Vycy8nICsgdGhpcy5fdXNlckluZm8udXNlcm5hbWUsIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDQpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnJlZnJlc2hDb25maWcgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIGNhbGxiYWNrID0gdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICB0aGlzLmNvbmZpZyhmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGF0LnNldENvbmZpZyhyZXN1bHQpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnJlZnJlc2hJbnN0YWxsZWRBcHBzID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICBjYWxsYmFjayA9IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGNhbGxiYWNrIDogZnVuY3Rpb24gKCkge307XG5cbiAgICAgICAgdGhpcy5nZXRBcHBzKGZ1bmN0aW9uIChlcnJvciwgYXBwcykge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBpbnNlcnQgb3IgdXBkYXRlIG5ldyBhcHBzXG4gICAgICAgICAgICBhcHBzLmZvckVhY2goZnVuY3Rpb24gKGFwcCkge1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0Ll9pbnN0YWxsZWRBcHBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pbnN0YWxsZWRBcHBzW2ldLmlkID09PSBhcHAuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmNvcHkoYXBwLCB0aGF0Ll9pbnN0YWxsZWRBcHBzW2ZvdW5kXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5faW5zdGFsbGVkQXBwcy5wdXNoKGFwcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgb2xkIGVudHJpZXMsIGdvaW5nIGJhY2t3YXJkcyB0byBhbGxvdyBzcGxpY2luZ1xuICAgICAgICAgICAgZm9yKHZhciBpID0gdGhhdC5faW5zdGFsbGVkQXBwcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGlmICghYXBwcy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiAoZWxlbS5pZCA9PT0gdGhhdC5faW5zdGFsbGVkQXBwc1tpXS5pZCk7IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2luc3RhbGxlZEFwcHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUubG9nb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNldFRva2VuKG51bGwpO1xuICAgICAgICB0aGlzLl91c2VySW5mbyA9IHt9O1xuXG4gICAgICAgIC8vIGxvZ291dCBmcm9tIE9BdXRoIHNlc3Npb25cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2FwaS92MS9zZXNzaW9uL2xvZ291dCc7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuZXhjaGFuZ2VDb2RlRm9yVG9rZW4gPSBmdW5jdGlvbiAoYXV0aENvZGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG4gICAgICAgICAgICBjb2RlOiBhdXRoQ29kZSxcbiAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogd2luZG93LmxvY2F0aW9uLm9yaWdpbixcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5fY2xpZW50SWQsXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXRcbiAgICAgICAgfTtcblxuICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL3YxL29hdXRoL3Rva2VuP3Jlc3BvbnNlX3R5cGU9dG9rZW4mY2xpZW50X2lkPScgKyB0aGlzLl9jbGllbnRJZCwgZGF0YSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBjYWxsYmFjayhuZXcgQ2xpZW50RXJyb3Ioc3RhdHVzLCBkYXRhKSk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEuYWNjZXNzX3Rva2VuKTtcbiAgICAgICAgfSkuZXJyb3IoZGVmYXVsdEVycm9ySGFuZGxlcihjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBjbGllbnQgPSBuZXcgQ2xpZW50KCk7XG4gICAgcmV0dXJuIGNsaWVudDtcbn1dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuY29udHJvbGxlcignQXBwU3RvcmVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGxvY2F0aW9uJywgJyR0aW1lb3V0JywgJ0NsaWVudCcsICdBcHBTdG9yZScsIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgJHRpbWVvdXQsIENsaWVudCwgQXBwU3RvcmUpIHtcbiAgICBDbGllbnQub25SZWFkeShmdW5jdGlvbiAoKSB7IGlmICghQ2xpZW50LmdldFVzZXJJbmZvKCkuYWRtaW4pICRsb2NhdGlvbi5wYXRoKCcvJyk7IH0pO1xuXG4gICAgJHNjb3BlLnJlYWR5ID0gZmFsc2U7XG4gICAgJHNjb3BlLmFwcHMgPSBbXTtcbiAgICAkc2NvcGUuY29uZmlnID0gQ2xpZW50LmdldENvbmZpZygpO1xuXG4gICAgJHNjb3BlLmFwcGluc3RhbGwgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIGFwcDoge30sXG4gICAgICAgIGxvY2F0aW9uOiAnJyxcbiAgICAgICAgcGFzc3dvcmQ6ICcnLFxuICAgICAgICBwb3J0QmluZGluZ3M6IHt9LFxuICAgICAgICBhY2Nlc3NSZXN0cmljdGlvbjogJydcbiAgICB9O1xuXG4gICAgJHNjb3BlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmFwcCA9IHt9O1xuICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5sb2NhdGlvbiA9ICcnO1xuICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5wYXNzd29yZCA9ICcnO1xuICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5wb3J0QmluZGluZ3MgPSB7fTtcbiAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuYWNjZXNzUmVzdHJpY3Rpb24gPSAnJztcbiAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuZXJyb3IgPSB7fTtcblxuICAgICAgICAkc2NvcGUuaW5zdGFsbF9mb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAkc2NvcGUuaW5zdGFsbF9mb3JtLiRzZXRVbnRvdWNoZWQoKTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLnNob3dJbnN0YWxsID0gZnVuY3Rpb24gKGFwcCkge1xuICAgICAgICAkc2NvcGUucmVzZXQoKTtcblxuICAgICAgICBBcHBTdG9yZS5nZXRNYW5pZmVzdChhcHAuaWQsIGZ1bmN0aW9uIChlcnJvciwgbWFuaWZlc3QpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBhZGQgbWFuaWZlc3QgdG8gYXBwIG9iamVjdFxuICAgICAgICAgICAgYXBwLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG5cbiAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmFwcCA9IGFwcDtcbiAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmxvY2F0aW9uID0gYXBwLmxvY2F0aW9uO1xuICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwucG9ydEJpbmRpbmdzSW5mbyA9IG1hbmlmZXN0LnRjcFBvcnRzOyAgICAgLy8gUG9ydGJpbmRpbmcgbWFwIG9ubHkgZm9yIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5wb3J0QmluZGluZ3MgPSB7fTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBhY3R1YWwgbW9kZWwgaG9sZGluZyB0aGUgZW52OnBvcnQgcGFpclxuICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuYWNjZXNzUmVzdHJpY3Rpb24gPSBhcHAuYWNjZXNzUmVzdHJpY3Rpb24gfHwgJyc7XG5cbiAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IHBvcnRzXG4gICAgICAgICAgICBmb3IgKHZhciBlbnYgaW4gbWFuaWZlc3QudGNwUG9ydHMpIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5wb3J0QmluZGluZ3NbZW52XSA9IG1hbmlmZXN0LnRjcFBvcnRzW2Vudl0uZGVmYXVsdFZhbHVlIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICQoJyNhcHBJbnN0YWxsTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvSW5zdGFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuYnVzeSA9IHRydWU7XG4gICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmVycm9yLm5hbWUgPSBudWxsO1xuICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmVycm9yLnBvcnQgPSBudWxsO1xuXG4gICAgICAgIENsaWVudC5pbnN0YWxsQXBwKCRzY29wZS5hcHBpbnN0YWxsLmFwcC5pZCwgJHNjb3BlLmFwcGluc3RhbGwuYXBwLm1hbmlmZXN0LCAkc2NvcGUuYXBwaW5zdGFsbC5wYXNzd29yZCwgJHNjb3BlLmFwcGluc3RhbGwuYXBwLnRpdGxlLCB7IGxvY2F0aW9uOiAkc2NvcGUuYXBwaW5zdGFsbC5sb2NhdGlvbiwgcG9ydEJpbmRpbmdzOiAkc2NvcGUuYXBwaW5zdGFsbC5wb3J0QmluZGluZ3MsIGFjY2Vzc1Jlc3RyaWN0aW9uOiAkc2NvcGUuYXBwaW5zdGFsbC5hY2Nlc3NSZXN0cmljdGlvbiB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDkgJiYgZXJyb3IubWVzc2FnZS5pbmRleE9mKCdpcyByZXNlcnZlZCcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5lcnJvci5wb3J0ID0gJ1RoaXMgcG9ydCBpcyBhbHJlYWR5IGluIHVzZS4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDA5KSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmVycm9yLm5hbWUgPSAnQXBwbGljYXRpb24gYWxyZWFkeSBleGlzdHMuJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5lcnJvci5wYXNzd29yZCA9ICdXcm9uZyBwYXNzd29yZCBwcm92aWRlZC4nO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwaW5zdGFsbC5wYXNzd29yZCA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBpbnN0YWxsLmVycm9yLm5hbWUgPSAnQXBwIHdpdGggdGhlIG5hbWUgJyArICRzY29wZS5hcHBpbnN0YWxsLmFwcC5uYW1lICsgJyBjYW5ub3QgYmUgaW5zdGFsbGVkLic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHNjb3BlLmFwcGluc3RhbGwuYnVzeSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAkKCcjYXBwSW5zdGFsbE1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblxuICAgICAgICAgICAgJHNjb3BlLnJlc2V0KCk7XG5cbiAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCcvYXBwcycpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICAgICAgJHNjb3BlLnJlYWR5ID0gZmFsc2U7XG5cbiAgICAgICAgQXBwU3RvcmUuZ2V0QXBwcyhmdW5jdGlvbiAoZXJyb3IsIGFwcHMpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAkdGltZW91dChyZWZyZXNoLCAxMDAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHNjb3BlLmFwcHMgPSBhcHBzO1xuICAgICAgICAgICAgJHNjb3BlLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaCgpO1xuXG4gICAgLy8gc2V0dXAgYWxsIHRoZSBkaWFsb2cgZm9jdXMgaGFuZGxpbmdcbiAgICBbJ2FwcEluc3RhbGxNb2RhbCddLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICQoJyMnICsgaWQpLm9uKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykuZmluZChcIlthdXRvZm9jdXNdOmZpcnN0XCIpLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufV0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5hbmd1bGFyLm1vZHVsZSgnQXBwbGljYXRpb24nKS5jb250cm9sbGVyKCdNYWluQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRyb3V0ZScsICckaW50ZXJ2YWwnLCAnQ2xpZW50JywgZnVuY3Rpb24gKCRzY29wZSwgJHJvdXRlLCAkaW50ZXJ2YWwsIENsaWVudCkge1xuICAgICRzY29wZS5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICRzY29wZS51c2VySW5mbyA9IENsaWVudC5nZXRVc2VySW5mbygpO1xuICAgICRzY29wZS5jb25maWcgPSB7fTtcblxuICAgICRzY29wZS51cGRhdGUgPSB7XG4gICAgICAgIGVycm9yOiB7fSxcbiAgICAgICAgcGFzc3dvcmQ6ICcnXG4gICAgfTtcblxuICAgICRzY29wZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgaWYgKCEkcm91dGUuY3VycmVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gJHJvdXRlLmN1cnJlbnQuJCRyb3V0ZS5vcmlnaW5hbFBhdGguaW5kZXhPZih1cmwpID09PSAwO1xuICAgIH07XG5cbiAgICAkc2NvcGUubG9nb3V0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAkc2NvcGUuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgQ2xpZW50LmxvZ291dCgpO1xuICAgIH07XG5cbiAgICAkc2NvcGUubG9naW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYWxsYmFja1VSTCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyAnL2xvZ2luX2NhbGxiYWNrLmh0bWwnO1xuICAgICAgICB2YXIgc2NvcGUgPSAncm9vdCxwcm9maWxlLGFwcHMscm9sZUFkbWluJztcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2FwaS92MS9vYXV0aC9kaWFsb2cvYXV0aG9yaXplP3Jlc3BvbnNlX3R5cGU9Y29kZSZjbGllbnRfaWQ9JyArIENsaWVudC5fY2xpZW50SWQgKyAnJnJlZGlyZWN0X3VyaT0nICsgY2FsbGJhY2tVUkwgKyAnJnNjb3BlPScgKyBzY29wZTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLnNldHVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZXJyb3IuaHRtbD9lcnJvckNvZGU9MSc7XG4gICAgfTtcblxuICAgICRzY29wZS5lcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2Vycm9yLmh0bWwnO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2hvd1VwZGF0ZU1vZGFsID0gZnVuY3Rpb24gKGZvcm0pIHtcbiAgICAgICAgJHNjb3BlLnVwZGF0ZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS51cGRhdGUucGFzc3dvcmQgPSAnJztcblxuICAgICAgICBmb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICBmb3JtLiRzZXRVbnRvdWNoZWQoKTtcblxuICAgICAgICAkKCcjdXBkYXRlTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH07XG5cbiAgICAkc2NvcGUuZG9VcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRzY29wZS51cGRhdGUuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuXG4gICAgICAgIENsaWVudC51cGRhdGUoJHNjb3BlLnVwZGF0ZS5wYXNzd29yZCwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS51cGRhdGUuZXJyb3IucGFzc3dvcmQgPSAnSW5jb3JyZWN0IHBhc3N3b3JkJztcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVwZGF0ZS5wYXNzd29yZCA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byB1cGRhdGUuJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy91cGRhdGUuaHRtbCc7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkc2NvcGUuYmFja3VwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkKCcjYmFja3VwUHJvZ3Jlc3NNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cbiAgICAgICAgJHNjb3BlLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgICAgQ2xpZW50LmJhY2t1cChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBkb2VzIGxvb2sgbGlrZSB3ZSBzaG91bGQgdXNlIHByb2dyZXNzLmpzb24/XG4gICAgICAgICAgICAvLyBub3cgc3RhcnQgcXVlcnlcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrSWZEb25lKCkge1xuICAgICAgICAgICAgICAgIENsaWVudC52ZXJzaW9uKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChjaGVja0lmRG9uZSwgMTAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgJCgnI2JhY2t1cFByb2dyZXNzTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChjaGVja0lmRG9uZSwgNTAwMCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQuaXNTZXJ2ZXJGaXJzdFRpbWUoZnVuY3Rpb24gKGVycm9yLCBpc0ZpcnN0VGltZSkge1xuICAgICAgICBpZiAoZXJyb3IpIHJldHVybiAkc2NvcGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICBpZiAoaXNGaXJzdFRpbWUpIHJldHVybiAkc2NvcGUuc2V0dXAoKTtcblxuICAgICAgICAvLyB3ZSB1c2UgdGhlIGNvbmZpZyByZXF1ZXN0IGFzIGFuIGluZGljYXRvciBpZiB0aGUgdG9rZW4gaXMgc3RpbGwgdmFsaWRcbiAgICAgICAgLy8gVE9ETyB3ZSBzaG91bGQgcHJvYmFibHkgYXR0YWNoIHN1Y2ggYSBoYW5kbGVyIGZvciBlYWNoIHJlcXVlc3QsIGFzIHRoZSB0b2tlbiBjYW4gZ2V0IGludmFsaWRcbiAgICAgICAgLy8gYXQgYW55IHRpbWUhXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UudG9rZW4pIHtcbiAgICAgICAgICAgIENsaWVudC5yZWZyZXNoQ29uZmlnKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXNDb2RlID09PSA0MDEpIHJldHVybiAkc2NvcGUubG9naW4oKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiAkc2NvcGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIGFjdHVhbGx5IHVwZGF0ZWluZ1xuICAgICAgICAgICAgICAgIGlmIChDbGllbnQuZ2V0Q29uZmlnKCkucHJvZ3Jlc3MudXBkYXRlKSB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvdXBkYXRlLmh0bWwnO1xuXG4gICAgICAgICAgICAgICAgQ2xpZW50LnVzZXJJbmZvKGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuICRzY29wZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgQ2xpZW50LnJlZnJlc2hJbnN0YWxsZWRBcHBzKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gJHNjb3BlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2ljayBvZmYgaW5zdGFsbGVkIGFwcHMgYW5kIGNvbmZpZyBwb2xsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaEFwcHNUaW1lciA9ICRpbnRlcnZhbChDbGllbnQucmVmcmVzaEluc3RhbGxlZEFwcHMuYmluZChDbGllbnQpLCAyMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZyZXNoQ29uZmlnVGltZXIgPSAkaW50ZXJ2YWwoQ2xpZW50LnJlZnJlc2hDb25maWcuYmluZChDbGllbnQpLCA1MDAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbChyZWZyZXNoQXBwc1RpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKHJlZnJlc2hDb25maWdUaW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IG1hcmsgdGhlIENsaWVudCB0byBiZSByZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50LnNldFJlYWR5KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5jb25maWcgPSBDbGllbnQuZ2V0Q29uZmlnKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkc2NvcGUubG9naW4oKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gd2FpdCB0aWxsIHRoZSB2aWV3IGhhcyBsb2FkZWQgdW50aWwgc2hvd2luZyBhIG1vZGFsIGRpYWxvZ1xuICAgIENsaWVudC5vbkNvbmZpZyhmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcucHJvZ3Jlc3MudXBkYXRlKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvdXBkYXRlLmh0bWwnO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBzZXR1cCBhbGwgdGhlIGRpYWxvZyBmb2N1cyBoYW5kbGluZ1xuICAgIFsndXBkYXRlTW9kYWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAkKCcjJyArIGlkKS5vbignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJbYXV0b2ZvY3VzXTpmaXJzdFwiKS5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuY29udHJvbGxlcignQWNjb3VudENvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnQ2xpZW50JywgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCBDbGllbnQpIHtcbiAgICAkc2NvcGUudXNlciA9IENsaWVudC5nZXRVc2VySW5mbygpO1xuICAgICRzY29wZS5jb25maWcgPSBDbGllbnQuZ2V0Q29uZmlnKCk7XG5cbiAgICAkc2NvcGUuYWN0aXZlQ2xpZW50cyA9IFtdO1xuICAgICRzY29wZS50b2tlbkluVXNlID0gbnVsbDtcblxuICAgICRzY29wZS5wYXNzd29yZGNoYW5nZSA9IHtcbiAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7fSxcbiAgICAgICAgcGFzc3dvcmQ6ICcnLFxuICAgICAgICBuZXdQYXNzd29yZDogJycsXG4gICAgICAgIG5ld1Bhc3N3b3JkUmVwZWF0OiAnJ1xuICAgIH07XG5cbiAgICAkc2NvcGUuZW1haWxjaGFuZ2UgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIGVtYWlsOiAnJyxcbiAgICAgICAgcGFzc3dvcmQ6ICcnXG4gICAgfTtcblxuICAgICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlID0ge1xuICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHt9LFxuICAgICAgICBwYXNzd29yZDogJydcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFzc3dvcmRDaGFuZ2VSZXNldCAoZm9ybSkge1xuICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UuZXJyb3IubmV3UGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UuZXJyb3IubmV3UGFzc3dvcmRSZXBlYXQgPSBudWxsO1xuICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UucGFzc3dvcmQgPSAnJztcbiAgICAgICAgJHNjb3BlLnBhc3N3b3JkY2hhbmdlLm5ld1Bhc3N3b3JkID0gJyc7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5uZXdQYXNzd29yZFJlcGVhdCA9ICcnO1xuXG4gICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICBmb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAgICAgZm9ybS4kc2V0VW50b3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbWFpbENoYW5nZVJlc2V0IChmb3JtKSB7XG4gICAgICAgICRzY29wZS5lbWFpbGNoYW5nZS5lcnJvci5lbWFpbCA9IG51bGw7XG4gICAgICAgICRzY29wZS5lbWFpbGNoYW5nZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5lbWFpbGNoYW5nZS5lbWFpbCA9ICcnO1xuICAgICAgICAkc2NvcGUuZW1haWxjaGFuZ2UucGFzc3dvcmQgPSAnJztcblxuICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgZm9ybS4kc2V0UHJpc3RpbmUoKTtcbiAgICAgICAgICAgIGZvcm0uJHNldFVudG91Y2hlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGV2ZWxvcGVyTW9kZUNoYW5nZVJlc2V0ICgpIHtcbiAgICAgICAgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2UuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAkc2NvcGUuZGV2ZWxvcGVyTW9kZUNoYW5nZS5wYXNzd29yZCA9ICcnO1xuXG4gICAgICAgICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlRm9ybS4kc2V0UHJpc3RpbmUoKTtcbiAgICAgICAgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2VGb3JtLiRzZXRVbnRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAkc2NvcGUuZG9DaGFuZ2VQYXNzd29yZCA9IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5lcnJvci5uZXdQYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5lcnJvci5uZXdQYXNzd29yZFJlcGVhdCA9IG51bGw7XG4gICAgICAgICRzY29wZS5wYXNzd29yZGNoYW5nZS5idXN5ID0gdHJ1ZTtcblxuICAgICAgICBDbGllbnQuY2hhbmdlUGFzc3dvcmQoJHNjb3BlLnBhc3N3b3JkY2hhbmdlLnBhc3N3b3JkLCAkc2NvcGUucGFzc3dvcmRjaGFuZ2UubmV3UGFzc3dvcmQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UuZXJyb3IucGFzc3dvcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UucGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gY2hhbmdlIHBhc3N3b3JkLicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkc2NvcGUucGFzc3dvcmRjaGFuZ2UuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgcGFzc3dvcmRDaGFuZ2VSZXNldChmb3JtKTtcblxuICAgICAgICAgICAgJCgnI3Bhc3N3b3JkQ2hhbmdlTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvQ2hhbmdlRW1haWwgPSBmdW5jdGlvbiAoZm9ybSkge1xuICAgICAgICAkc2NvcGUuZW1haWxjaGFuZ2UuZXJyb3IuZW1haWwgPSBudWxsO1xuICAgICAgICAkc2NvcGUuZW1haWxjaGFuZ2UuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAkc2NvcGUuZW1haWxjaGFuZ2UuYnVzeSA9IHRydWU7XG5cbiAgICAgICAgQ2xpZW50LmNoYW5nZUVtYWlsKCRzY29wZS5lbWFpbGNoYW5nZS5lbWFpbCwgJHNjb3BlLmVtYWlsY2hhbmdlLnBhc3N3b3JkLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVtYWlsY2hhbmdlLmVycm9yLnBhc3N3b3JkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVtYWlsY2hhbmdlLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIGNoYW5nZSBlbWFpbC4nLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHNjb3BlLmVtYWlsY2hhbmdlLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIGVtYWlsQ2hhbmdlUmVzZXQoZm9ybSk7XG5cbiAgICAgICAgICAgIC8vIGZldGNoIG5ldyBpbmZvIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICBDbGllbnQudXNlckluZm8oZnVuY3Rpb24gKCkge30pO1xuXG4gICAgICAgICAgICAkKCcjZW1haWxDaGFuZ2VNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkc2NvcGUuZG9DaGFuZ2VEZXZlbG9wZXJNb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUuZGV2ZWxvcGVyTW9kZUNoYW5nZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlLmJ1c3kgPSB0cnVlO1xuXG4gICAgICAgIENsaWVudC5jaGFuZ2VEZXZlbG9wZXJNb2RlKCEkc2NvcGUuY29uZmlnLmRldmVsb3Blck1vZGUsICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlLnBhc3N3b3JkLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmRldmVsb3Blck1vZGVDaGFuZ2UuZXJyb3IucGFzc3dvcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGV2ZWxvcGVyTW9kZUNoYW5nZS5wYXNzd29yZCA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBjaGFuZ2UgcGFzc3dvcmQuJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRzY29wZS5kZXZlbG9wZXJNb2RlQ2hhbmdlLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIGRldmVsb3Blck1vZGVDaGFuZ2VSZXNldCgpO1xuXG4gICAgICAgICAgICAkKCcjZGV2ZWxvcGVyTW9kZUNoYW5nZU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5zaG93Q2hhbmdlUGFzc3dvcmQgPSBmdW5jdGlvbiAoZm9ybSkge1xuICAgICAgICBwYXNzd29yZENoYW5nZVJlc2V0KGZvcm0pO1xuXG4gICAgICAgICQoJyNwYXNzd29yZENoYW5nZU1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLnNob3dDaGFuZ2VFbWFpbCA9IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgICAgIGVtYWlsQ2hhbmdlUmVzZXQoZm9ybSk7XG5cbiAgICAgICAgJCgnI2VtYWlsQ2hhbmdlTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2hvd0NoYW5nZURldmVsb3Blck1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRldmVsb3Blck1vZGVDaGFuZ2VSZXNldCgpO1xuXG4gICAgICAgICQoJyNkZXZlbG9wZXJNb2RlQ2hhbmdlTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH07XG5cbiAgICAkc2NvcGUucmVtb3ZlQWNjZXNzVG9rZW5zID0gZnVuY3Rpb24gKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgQ2xpZW50LmRlbFRva2Vuc0J5Q2xpZW50SWQoY2xpZW50LmlkLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgJChldmVudC50YXJnZXQpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2xpZW50Lm9uUmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUudG9rZW5JblVzZSA9IENsaWVudC5fdG9rZW47XG5cbiAgICAgICAgQ2xpZW50LmdldE9BdXRoQ2xpZW50cyhmdW5jdGlvbiAoZXJyb3IsIGFjdGl2ZUNsaWVudHMpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAkc2NvcGUuYWN0aXZlQ2xpZW50cyA9IGFjdGl2ZUNsaWVudHM7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gc2V0dXAgYWxsIHRoZSBkaWFsb2cgZm9jdXMgaGFuZGxpbmdcbiAgICBbJ3Bhc3N3b3JkQ2hhbmdlTW9kYWwnLCAnZW1haWxDaGFuZ2VNb2RhbCcsICdkZXZlbG9wZXJNb2RlQ2hhbmdlTW9kYWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAkKCcjJyArIGlkKS5vbignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJbYXV0b2ZvY3VzXTpmaXJzdFwiKS5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuY29udHJvbGxlcignQXBwc0NvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnQ2xpZW50JywgJ0FwcFN0b3JlJywgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCBDbGllbnQsIEFwcFN0b3JlKSB7XG4gICAgJHNjb3BlLkhPU1RfUE9SVF9NSU4gPSAxMDI0O1xuICAgICRzY29wZS5IT1NUX1BPUlRfTUFYID0gNjU1MzU7XG5cbiAgICAkc2NvcGUuaW5zdGFsbGVkQXBwcyA9IENsaWVudC5nZXRJbnN0YWxsZWRBcHBzKCk7XG4gICAgJHNjb3BlLmNvbmZpZyA9IENsaWVudC5nZXRDb25maWcoKTtcblxuICAgICRzY29wZS5hcHBjb25maWd1cmUgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIGFwcDoge30sXG4gICAgICAgIGxvY2F0aW9uOiAnJyxcbiAgICAgICAgcGFzc3dvcmQ6ICcnLFxuICAgICAgICBwb3J0QmluZGluZ3M6IHt9LFxuICAgICAgICBhY2Nlc3NSZXN0cmljdGlvbjogJydcbiAgICB9O1xuXG4gICAgJHNjb3BlLmFwcHVuaW5zdGFsbCA9IHtcbiAgICAgICAgZXJyb3I6IHt9LFxuICAgICAgICBhcHA6IHt9LFxuICAgICAgICBwYXNzd29yZDogJydcbiAgICB9O1xuXG4gICAgJHNjb3BlLmFwcHVwZGF0ZSA9IHtcbiAgICAgICAgZXJyb3I6IHt9LFxuICAgICAgICBhcHA6IHt9LFxuICAgICAgICBwYXNzd29yZDogJycsXG4gICAgICAgIG1hbmlmZXN0OiB7fSxcbiAgICAgICAgcG9ydEJpbmRpbmdzOiB7fVxuICAgIH07XG5cbiAgICAkc2NvcGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUuZXJyb3IgPSB7fTtcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5hcHAgPSB7fTtcbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5sb2NhdGlvbiA9ICcnO1xuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUucG9ydEJpbmRpbmdzID0ge307XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUuYWNjZXNzUmVzdHJpY3Rpb24gPSAnJztcblxuICAgICAgICAkc2NvcGUuY29uZmlnX2Zvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICRzY29wZS5jb25maWdfZm9ybS4kc2V0VW50b3VjaGVkKCk7XG5cbiAgICAgICAgJHNjb3BlLmFwcHVuaW5zdGFsbC5hcHAgPSB7fTtcbiAgICAgICAgJHNjb3BlLmFwcHVuaW5zdGFsbC5lcnJvciA9IHt9O1xuICAgICAgICAkc2NvcGUuYXBwdW5pbnN0YWxsLnBhc3N3b3JkID0gJyc7XG5cbiAgICAgICAgJHNjb3BlLnVuaW5zdGFsbF9mb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAkc2NvcGUudW5pbnN0YWxsX2Zvcm0uJHNldFVudG91Y2hlZCgpO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2hvd0NvbmZpZ3VyZSA9IGZ1bmN0aW9uIChhcHApIHtcbiAgICAgICAgJHNjb3BlLnJlc2V0KCk7XG5cbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5hcHAgPSBhcHA7XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUubG9jYXRpb24gPSBhcHAubG9jYXRpb247XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUuYWNjZXNzUmVzdHJpY3Rpb24gPSBhcHAuYWNjZXNzUmVzdHJpY3Rpb247XG4gICAgICAgICRzY29wZS5hcHBjb25maWd1cmUucG9ydEJpbmRpbmdzSW5mbyA9IGFwcC5tYW5pZmVzdC50Y3BQb3J0czsgICAgICAgICAvLyBQb3J0YmluZGluZyBtYXAgb25seSBmb3IgaW5mb3JtYXRpb25cbiAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5wb3J0QmluZGluZ3MgPSBhbmd1bGFyLmNvcHkoYXBwLnBvcnRCaW5kaW5ncyk7ICAgIC8vIFRoaXMgaXMgdGhlIGFjdHVhbCBtb2RlbCBob2xkaW5nIHRoZSBlbnY6cG9ydCBwYWlyXG5cbiAgICAgICAgJCgnI2FwcENvbmZpZ3VyZU1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvQ29uZmlndXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmJ1c3kgPSB0cnVlO1xuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmVycm9yLm5hbWUgPSBudWxsO1xuICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLmVycm9yLnBhc3N3b3JkID0gbnVsbDtcblxuICAgICAgICBDbGllbnQuY29uZmlndXJlQXBwKCRzY29wZS5hcHBjb25maWd1cmUuYXBwLmlkLCAkc2NvcGUuYXBwY29uZmlndXJlLnBhc3N3b3JkLCB7IGxvY2F0aW9uOiAkc2NvcGUuYXBwY29uZmlndXJlLmxvY2F0aW9uLCBwb3J0QmluZGluZ3M6ICRzY29wZS5hcHBjb25maWd1cmUucG9ydEJpbmRpbmdzLCBhY2Nlc3NSZXN0cmljdGlvbjogJHNjb3BlLmFwcGNvbmZpZ3VyZS5hY2Nlc3NSZXN0cmljdGlvbiB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5lcnJvci5wYXNzd29yZCA9ICdXcm9uZyBwYXNzd29yZCBwcm92aWRlZC4nO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwY29uZmlndXJlLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5lcnJvci5uYW1lID0gJ0FwcCB3aXRoIHRoZSBuYW1lICcgKyAkc2NvcGUuYXBwY29uZmlndXJlLmFwcC5uYW1lICsgJyBjYW5ub3QgYmUgY29uZmlndXJlZC4nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICRzY29wZS5hcHBjb25maWd1cmUuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHNjb3BlLmFwcGNvbmZpZ3VyZS5idXN5ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICQoJyNhcHBDb25maWd1cmVNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cbiAgICAgICAgICAgICRzY29wZS5yZXNldCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLnNob3dVbmluc3RhbGwgPSBmdW5jdGlvbiAoYXBwKSB7XG4gICAgICAgICRzY29wZS5yZXNldCgpO1xuXG4gICAgICAgICRzY29wZS5hcHB1bmluc3RhbGwuYXBwID0gYXBwO1xuXG4gICAgICAgICQoJyNhcHBVbmluc3RhbGxNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfTtcblxuICAgICRzY29wZS5kb1VuaW5zdGFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJHNjb3BlLmFwcHVuaW5zdGFsbC5lcnJvci5wYXNzd29yZCA9IG51bGw7XG5cbiAgICAgICAgQ2xpZW50LnVuaW5zdGFsbEFwcCgkc2NvcGUuYXBwdW5pbnN0YWxsLmFwcC5pZCwgJHNjb3BlLmFwcHVuaW5zdGFsbC5wYXNzd29yZCwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHB1bmluc3RhbGwucGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcHVuaW5zdGFsbC5lcnJvci5wYXNzd29yZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJCgnI2FwcFVuaW5zdGFsbE1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblxuICAgICAgICAgICAgJHNjb3BlLnJlc2V0KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkc2NvcGUuc2hvd1VwZGF0ZSA9IGZ1bmN0aW9uIChhcHApIHtcbiAgICAgICAgJHNjb3BlLmFwcHVwZGF0ZS5hcHAgPSBhcHA7XG4gICAgICAgICRzY29wZS5hcHB1cGRhdGUuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuXG4gICAgICAgIEFwcFN0b3JlLmdldE1hbmlmZXN0KGFwcC5hcHBTdG9yZUlkLCBmdW5jdGlvbiAoZXJyb3IsIG1hbmlmZXN0KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgLy8gQWN0aXZhdGUgYmVsb3cgdHdvIGxpbmVzIGZvciB0ZXN0aW5nIHRoZSBVSVxuICAgICAgICAgICAgLy8gbWFuaWZlc3QudGNwUG9ydHNbJ1RFU1RfSFRUUCddID0geyBkZWZhdWx0VmFsdWU6IDEzMzcsIGRlc2NyaXB0aW9uOiAnSFRUUCBzZXJ2ZXInfTtcbiAgICAgICAgICAgIC8vIGFwcC5wb3J0QmluZGluZ3NbJ1RFU1RfU1NIJ10gPSAxMzM3O1xuXG4gICAgICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG5cbiAgICAgICAgICAgIHZhciBwb3J0QmluZGluZ3NJbmZvID0ge307ICAgICAgICAgIC8vIFBvcnRiaW5kaW5nIG1hcCBvbmx5IGZvciBpbmZvcm1hdGlvblxuICAgICAgICAgICAgdmFyIHBvcnRCaW5kaW5ncyA9IHt9OyAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYWN0dWFsIG1vZGVsIGhvbGRpbmcgdGhlIGVudjpwb3J0IHBhaXJcbiAgICAgICAgICAgIHZhciBvYnNvbGV0ZVBvcnRCaW5kaW5ncyA9IHt9OyAgICAgIC8vIEluZm8gbWFwIGZvciBvYnNvbGV0ZSBwb3J0IGJpbmRpbmdzLCB0aGlzIGlzIGZvciBkaXNwbGF5IHVzZSBvbmx5IGFuZCB0aHVzIG5vdCBpbiB0aGUgbW9kZWxcbiAgICAgICAgICAgIHZhciBuZXdQb3J0cyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBkZXRlY3QgbmV3IHBvcnRiaW5kaW5ncyBhbmQgY29weSBhbGwgZnJvbSBtYW5pZmVzdC50Y3BQb3J0c1xuICAgICAgICAgICAgZm9yICh2YXIgZW52IGluIG1hbmlmZXN0LnRjcFBvcnRzKSB7XG4gICAgICAgICAgICAgICAgcG9ydEJpbmRpbmdzSW5mb1tlbnZdID0gbWFuaWZlc3QudGNwUG9ydHNbZW52XTtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcC5wb3J0QmluZGluZ3NbZW52XSkge1xuICAgICAgICAgICAgICAgICAgICBwb3J0QmluZGluZ3NJbmZvW2Vudl0uaXNOZXcgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IGludGVnZXIgcG9ydCB2YWx1ZSBpbiBtb2RlbFxuICAgICAgICAgICAgICAgICAgICBwb3J0QmluZGluZ3NbZW52XSA9IG1hbmlmZXN0LnRjcFBvcnRzW2Vudl0uZGVmYXVsdFZhbHVlIHx8IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3UG9ydHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgY29weSB0aGUgaW50ZWdlciBwb3J0IHZhbHVlIGludG8gbW9kZWxcbiAgICAgICAgICAgICAgICAgICAgcG9ydEJpbmRpbmdzW2Vudl0gPSBhcHAucG9ydEJpbmRpbmdzW2Vudl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkZXRlY3Qgb2Jzb2xldGUgcG9ydGJpbmRpbmdzIChtYXBwaW5ncyBpbiBhcHAucG9ydEJpbmRpbmdzLCBidXQgbm90IGFueW1vcmUgaW4gbWFuaWZlc3QudGNwUG9ydHMpXG4gICAgICAgICAgICBmb3IgKGVudiBpbiBhcHAucG9ydEJpbmRpbmdzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYW5pZmVzdC50Y3BQb3J0c1tlbnZdKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ic29sZXRlUG9ydEJpbmRpbmdzW2Vudl0gPSBhcHAucG9ydEJpbmRpbmdzW2Vudl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBub3cgaW5qZWN0IHRoZSBtYXBzIGludG8gdGhlICRzY29wZSwgd2Ugb25seSBzaG93IHRob3NlIGlmIHBvcnRzIGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgaWYgKG5ld1BvcnRzKSB7XG4gICAgICAgICAgICAgICAgJHNjb3BlLmFwcHVwZGF0ZS5wb3J0QmluZGluZ3NJbmZvID0gcG9ydEJpbmRpbmdzSW5mbztcbiAgICAgICAgICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLnBvcnRCaW5kaW5ncyA9IHBvcnRCaW5kaW5ncztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJHNjb3BlLmFwcHVwZGF0ZS5wb3J0QmluZGluZ3NJbmZvID0ge307XG4gICAgICAgICAgICAgICAgJHNjb3BlLmFwcHVwZGF0ZS5wb3J0QmluZGluZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHNjb3BlLmFwcHVwZGF0ZS5vYnNvbGV0ZVBvcnRCaW5kaW5ncyA9IG9ic29sZXRlUG9ydEJpbmRpbmdzO1xuXG4gICAgICAgICAgICAkKCcjYXBwVXBkYXRlTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvVXBkYXRlID0gZnVuY3Rpb24gKGZvcm0pIHtcbiAgICAgICAgJHNjb3BlLmFwcHVwZGF0ZS5lcnJvci5wYXNzd29yZCA9IG51bGw7XG5cbiAgICAgICAgQ2xpZW50LnVwZGF0ZUFwcCgkc2NvcGUuYXBwdXBkYXRlLmFwcC5pZCwgJHNjb3BlLmFwcHVwZGF0ZS5tYW5pZmVzdCwgJHNjb3BlLmFwcHVwZGF0ZS5wb3J0QmluZGluZ3MsICRzY29wZS5hcHB1cGRhdGUucGFzc3dvcmQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHB1cGRhdGUuZXJyb3IucGFzc3dvcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRzY29wZS5hcHB1cGRhdGUuYXBwID0ge307XG4gICAgICAgICAgICAkc2NvcGUuYXBwdXBkYXRlLnBhc3N3b3JkID0gJyc7XG5cbiAgICAgICAgICAgIGZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICBmb3JtLiRzZXRVbnRvdWNoZWQoKTtcblxuICAgICAgICAgICAgJCgnI2FwcFVwZGF0ZU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICB9O1xuXG4gICAgLy8gc2V0dXAgYWxsIHRoZSBkaWFsb2cgZm9jdXMgaGFuZGxpbmdcbiAgICBbJ2FwcENvbmZpZ3VyZU1vZGFsJywgJ2FwcFVuaW5zdGFsbE1vZGFsJywgJ2FwcFVwZGF0ZU1vZGFsJ10uZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgJCgnIycgKyBpZCkub24oJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCh0aGlzKS5maW5kKFwiW2F1dG9mb2N1c106Zmlyc3RcIikuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmFuZ3VsYXIubW9kdWxlKCdBcHBsaWNhdGlvbicpLmNvbnRyb2xsZXIoJ0Ruc0NvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnQ2xpZW50JywgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCBDbGllbnQpIHtcbiAgICBDbGllbnQub25SZWFkeShmdW5jdGlvbiAoKSB7IGlmICghQ2xpZW50LmdldFVzZXJJbmZvKCkuYWRtaW4pICRsb2NhdGlvbi5wYXRoKCcvJyk7IH0pO1xuXG4gICAgJHNjb3BlLnJlYWR5ID0gZmFsc2U7XG4gICAgJHNjb3BlLnVzZXIgPSBDbGllbnQuZ2V0VXNlckluZm8oKTtcbiAgICAkc2NvcGUuY29uZmlnID0gQ2xpZW50LmdldENvbmZpZygpO1xuICAgICRzY29wZS5uYWtlZERvbWFpbkFwcCA9IG51bGw7XG4gICAgJHNjb3BlLmNlcnRpZmljYXRlRmlsZSA9IG51bGw7XG4gICAgJHNjb3BlLmNlcnRpZmljYXRlRmlsZU5hbWUgPSAnJztcbiAgICAkc2NvcGUua2V5RmlsZSA9IG51bGw7XG4gICAgJHNjb3BlLmtleUZpbGVOYW1lID0gJyc7XG5cbiAgICAkc2NvcGUuc2V0TmFrZWREb21haW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcHBpZCA9ICRzY29wZS5uYWtlZERvbWFpbkFwcCA/ICRzY29wZS5uYWtlZERvbWFpbkFwcC5pZCA6ICdhZG1pbic7XG5cbiAgICAgICAgQ2xpZW50LnNldE5ha2VkRG9tYWluKGFwcGlkLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNldHRpbmcgbmFrZWQgZG9tYWluJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmJhY2t1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCgnI2JhY2t1cFByb2dyZXNzTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgICAgICAkc2NvcGUuJHBhcmVudC5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIENsaWVudC5iYWNrdXAoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBub3cgc3RhcnQgcXVlcnlcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrSWZEb25lKCkge1xuICAgICAgICAgICAgICAgIENsaWVudC52ZXJzaW9uKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChjaGVja0lmRG9uZSwgMTAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgJCgnI2JhY2t1cFByb2dyZXNzTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJHBhcmVudC5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrSWZEb25lLCA1MDAwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJyN1cGRhdGVNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cbiAgICAgICAgJHNjb3BlLiRwYXJlbnQuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgICBDbGllbnQudXBkYXRlKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL3VwZGF0ZS5odG1sJztcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpZENlcnRpZmljYXRlJykub25jaGFuZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkc2NvcGUuY2VydGlmaWNhdGVGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgICAgICAgICAgJHNjb3BlLmNlcnRpZmljYXRlRmlsZU5hbWUgPSBldmVudC50YXJnZXQuZmlsZXNbMF0ubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpZEtleScpLm9uY2hhbmdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJHNjb3BlLmtleUZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgICAgICAgICAkc2NvcGUua2V5RmlsZU5hbWUgPSBldmVudC50YXJnZXQuZmlsZXNbMF0ubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICRzY29wZS5zZXRDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1dpbGwgc2V0IHRoZSBjZXJ0aWZpY2F0ZScpO1xuXG4gICAgICAgIGlmICghJHNjb3BlLmNlcnRpZmljYXRlRmlsZSkgcmV0dXJuIGNvbnNvbGUubG9nKCdDZXJ0aWZpY2F0ZSBub3Qgc2V0Jyk7XG4gICAgICAgIGlmICghJHNjb3BlLmtleUZpbGUpIHJldHVybiBjb25zb2xlLmxvZygnS2V5IG5vdCBzZXQnKTtcblxuICAgICAgICBDbGllbnQuc2V0Q2VydGlmaWNhdGUoJHNjb3BlLmNlcnRpZmljYXRlRmlsZSwgJHNjb3BlLmtleUZpbGUsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY29uc29sZS5sb2coZXJyb3IpO1xuXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cubG9jYXRpb24ucmVsb2FkLmJpbmQod2luZG93LmxvY2F0aW9uLCB0cnVlKSwgMzAwMCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQub25Db25maWcoZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUudG9rZW5JblVzZSA9IENsaWVudC5fdG9rZW47XG5cbiAgICAgICAgQ2xpZW50LmdldEFwcHMoZnVuY3Rpb24gKGVycm9yLCBhcHBzKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgYXBwIGxpc3QnKTtcbiAgICAgICAgICAgICRzY29wZS5hcHBzID0gYXBwcztcblxuICAgICAgICAgICAgQ2xpZW50LmdldE5ha2VkRG9tYWluKGZ1bmN0aW9uIChlcnJvciwgYXBwaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgICAgICRzY29wZS5uYWtlZERvbWFpbkFwcCA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkc2NvcGUuYXBwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmFwcHNbaV0uaWQgPT09IGFwcGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubmFrZWREb21haW5BcHAgPSAkc2NvcGUuYXBwc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJHNjb3BlLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1dKTtcbiIsIi8qIGdsb2JhbDpSaWNrc2hhdzp0cnVlICovXG5cbid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuY29udHJvbGxlcignR3JhcGhzQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICdDbGllbnQnLCBmdW5jdGlvbiAoJHNjb3BlLCAkbG9jYXRpb24sIENsaWVudCkge1xuICAgIGlmICghQ2xpZW50LmdldFVzZXJJbmZvKCkuYWRtaW4pICRsb2NhdGlvbi5wYXRoKCcvJyk7XG5cbiAgICAkc2NvcGUuYWN0aXZlVGFiID0gJ2RheSc7XG5cbiAgICB2YXIgY3B1VXNhZ2VUYXJnZXQgPSAndHJhbnNmb3JtTnVsbCgnICtcbiAgICAnc2NhbGUoZGl2aWRlU2VyaWVzKCcgK1xuICAgICAgICAnc3VtU2VyaWVzKGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtc3lzdGVtLGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtbmljZSxjb2xsZWN0ZC5sb2NhbGhvc3QuY3B1LTAuY3B1LXVzZXIpLCcgK1xuICAgICAgICAnc3VtU2VyaWVzKGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtaWRsZSxjb2xsZWN0ZC5sb2NhbGhvc3QuY3B1LTAuY3B1LXN5c3RlbSxjb2xsZWN0ZC5sb2NhbGhvc3QuY3B1LTAuY3B1LW5pY2UsY29sbGVjdGQubG9jYWxob3N0LmNwdS0wLmNwdS11c2VyLGNvbGxlY3RkLmxvY2FsaG9zdC5jcHUtMC5jcHUtd2FpdCkpLCAxMDApLCAwKSc7XG5cbiAgICB2YXIgbmV0d29ya1VzYWdlVHhUYXJnZXQgPSAndHJhbnNmb3JtTnVsbChjb2xsZWN0ZC5sb2NhbGhvc3QuaW50ZXJmYWNlLWV0aDAuaWZfb2N0ZXRzLnR4LCAwKSc7XG4gICAgdmFyIG5ldHdvcmtVc2FnZVJ4VGFyZ2V0ID0gJ3RyYW5zZm9ybU51bGwoY29sbGVjdGQubG9jYWxob3N0LmludGVyZmFjZS1ldGgwLmlmX29jdGV0cy5yeCwgMCknO1xuXG4gICAgdmFyIGRpc2tVc2FnZUFwcHNVc2VkVGFyZ2V0ID0gJ3RyYW5zZm9ybU51bGwoY29sbGVjdGQubG9jYWxob3N0LmRmLWxvb3AwLmRmX2NvbXBsZXgtdXNlZCwgMCknO1xuICAgIHZhciBkaXNrVXNhZ2VEYXRhVXNlZFRhcmdldCA9ICd0cmFuc2Zvcm1OdWxsKGNvbGxlY3RkLmxvY2FsaG9zdC5kZi1sb29wMS5kZl9jb21wbGV4LXVzZWQsIDApJztcblxuICAgIGZ1bmN0aW9uIHJlbmRlckNwdShhY3RpdmVUYWIsIGNwdURhdGEpIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybWVkQ3B1ID0gWyBdO1xuXG4gICAgICAgIGlmIChjcHVEYXRhICYmIGNwdURhdGEuZGF0YXBvaW50cykgdHJhbnNmb3JtZWRDcHUgPSBjcHVEYXRhLmRhdGFwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4geyB5OiBwb2ludFswXSwgeDogcG9pbnRbMV0gfSB9KTtcblxuICAgICAgICB2YXIgY3B1R3JhcGggPSBuZXcgUmlja3NoYXcuR3JhcGgoe1xuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBhY3RpdmVUYWIgKyAnQ3B1Q2hhcnQnKSxcbiAgICAgICAgICAgIHJlbmRlcmVyOiAnYXJlYScsXG4gICAgICAgICAgICB3aWR0aDogNTgwLFxuICAgICAgICAgICAgaGVpZ2h0OiAyNTAsXG4gICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICAgIHNlcmllczogW3tcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3N0ZWVsYmx1ZScsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRDcHUsXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NwdSdcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjcHVYQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlRpbWUoeyBncmFwaDogY3B1R3JhcGggfSk7XG4gICAgICAgIHZhciBjcHVZQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlkoe1xuICAgICAgICAgICAgZ3JhcGg6IGNwdUdyYXBoLFxuICAgICAgICAgICAgb3JpZW50YXRpb246ICdsZWZ0JyxcbiAgICAgICAgICAgIHRpY2tGb3JtYXQ6IFJpY2tzaGF3LkZpeHR1cmVzLk51bWJlci5mb3JtYXRLTUJULFxuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlVGFiICsgJ0NwdVlBeGlzJyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjcHVIb3ZlckRldGFpbCA9IG5ldyBSaWNrc2hhdy5HcmFwaC5Ib3ZlckRldGFpbCh7XG4gICAgICAgICAgICBncmFwaDogY3B1R3JhcGgsXG4gICAgICAgICAgICBmb3JtYXR0ZXI6IGZ1bmN0aW9uKHNlcmllcywgeCwgeSkge1xuICAgICAgICAgICAgICAgIHZhciBzd2F0Y2ggPSAnPHNwYW4gY2xhc3M9XCJkZXRhaWxfc3dhdGNoXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAnICsgc2VyaWVzLmNvbG9yICsgJ1wiPjwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gc3dhdGNoICsgc2VyaWVzLm5hbWUgKyBcIjogXCIgKyBuZXcgTnVtYmVyKHkpLnRvRml4ZWQoMikgKyAnJTxicj4nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjcHVHcmFwaC5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW5kZXJOZXR3b3JrKGFjdGl2ZVRhYiwgdHhEYXRhLCByeERhdGEpIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybWVkVHggPSBbIF0sIHRyYW5zZm9ybWVkUnggPSBbIF07XG5cbiAgICAgICAgaWYgKHR4RGF0YSAmJiB0eERhdGEuZGF0YXBvaW50cykgdHJhbnNmb3JtZWRUeCA9IHR4RGF0YS5kYXRhcG9pbnRzLm1hcChmdW5jdGlvbiAocG9pbnQpIHsgcmV0dXJuIHsgeTogcG9pbnRbMF0sIHg6IHBvaW50WzFdIH0gfSk7XG4gICAgICAgIGlmIChyeERhdGEgJiYgcnhEYXRhLmRhdGFwb2ludHMpIHRyYW5zZm9ybWVkUnggPSByeERhdGEuZGF0YXBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50KSB7IHJldHVybiB7IHk6IHBvaW50WzBdLCB4OiBwb2ludFsxXSB9IH0pO1xuXG4gICAgICAgIHZhciBuZXR3b3JrR3JhcGggPSBuZXcgUmlja3NoYXcuR3JhcGgoe1xuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBhY3RpdmVUYWIgKyAnTmV0d29ya0NoYXJ0JyksXG4gICAgICAgICAgICByZW5kZXJlcjogJ2FyZWEnLFxuICAgICAgICAgICAgd2lkdGg6IDU4MCxcbiAgICAgICAgICAgIGhlaWdodDogMjUwLFxuICAgICAgICAgICAgc2VyaWVzOiBbIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3N0ZWVsYmx1ZScsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRUeCxcbiAgICAgICAgICAgICAgICBuYW1lOiAndHgnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY29sb3I6ICdncmVlbicsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRSeCxcbiAgICAgICAgICAgICAgICBuYW1lOiAncngnXG4gICAgICAgICAgICB9IF1cbiAgICAgICAgfSApO1xuXG4gICAgICAgIHZhciBuZXR3b3JrWEF4aXMgPSBuZXcgUmlja3NoYXcuR3JhcGguQXhpcy5UaW1lKHsgZ3JhcGg6IG5ldHdvcmtHcmFwaCB9KTtcbiAgICAgICAgdmFyIG5ldHdvcmtZQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlkoe1xuICAgICAgICAgICAgZ3JhcGg6IG5ldHdvcmtHcmFwaCxcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnbGVmdCcsXG4gICAgICAgICAgICB0aWNrRm9ybWF0OiBSaWNrc2hhdy5GaXh0dXJlcy5OdW1iZXIuZm9ybWF0S01CVCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZVRhYiArICdOZXR3b3JrWUF4aXMnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIG5ldHdvcmtIb3ZlckRldGFpbCA9IG5ldyBSaWNrc2hhdy5HcmFwaC5Ib3ZlckRldGFpbCh7XG4gICAgICAgICAgICBncmFwaDogbmV0d29ya0dyYXBoLFxuICAgICAgICAgICAgZm9ybWF0dGVyOiBmdW5jdGlvbihzZXJpZXMsIHgsIHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3dhdGNoID0gJzxzcGFuIGNsYXNzPVwiZGV0YWlsX3N3YXRjaFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogJyArIHNlcmllcy5jb2xvciArICdcIj48L3NwYW4+JztcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHN3YXRjaCArIHNlcmllcy5uYW1lICsgXCI6IFwiICsgbmV3IE51bWJlcih5LzEwMjQpLnRvRml4ZWQoMikgKyAnS0I8YnI+JztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV0d29ya0dyYXBoLnJlbmRlcigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbmRlckRpc2soYWN0aXZlVGFiLCBhcHBzVXNlZERhdGEsIGRhdGFVc2VkRGF0YSkge1xuICAgICAgICB2YXIgdHJhbnNmb3JtZWRBcHBzVXNlZCA9IFsgXSwgdHJhbnNmb3JtZWREYXRhVXNlZCA9IFsgXTtcblxuICAgICAgICBpZiAoYXBwc1VzZWREYXRhICYmIGFwcHNVc2VkRGF0YS5kYXRhcG9pbnRzKSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEFwcHNVc2VkID0gYXBwc1VzZWREYXRhLmRhdGFwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4geyB5OiBwb2ludFswXSwgeDogcG9pbnRbMV0gfTsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YVVzZWREYXRhICYmIGRhdGFVc2VkRGF0YS5kYXRhcG9pbnRzKSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZERhdGFVc2VkID0gZGF0YVVzZWREYXRhLmRhdGFwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4geyB5OiBwb2ludFswXSwgeDogcG9pbnRbMV0gfTsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlza0dyYXBoID0gbmV3IFJpY2tzaGF3LkdyYXBoKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgYWN0aXZlVGFiICsgJ0Rpc2tDaGFydCcpLFxuICAgICAgICAgICAgcmVuZGVyZXI6ICdhcmVhJyxcbiAgICAgICAgICAgIHdpZHRoOiA1ODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDI1MCxcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMzAgKiAxMDI0ICogMTAyNCAqIDEwMjQsIC8vIDMwZ2JcbiAgICAgICAgICAgIHNlcmllczogW3tcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3N0ZWVsYmx1ZScsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRBcHBzVXNlZCxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXBwcydcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB0cmFuc2Zvcm1lZERhdGFVc2VkLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgfSApO1xuXG4gICAgICAgIHZhciBkaXNrWEF4aXMgPSBuZXcgUmlja3NoYXcuR3JhcGguQXhpcy5UaW1lKHsgZ3JhcGg6IGRpc2tHcmFwaCB9KTtcbiAgICAgICAgdmFyIGRpc2tZQXhpcyA9IG5ldyBSaWNrc2hhdy5HcmFwaC5BeGlzLlkoe1xuICAgICAgICAgICAgZ3JhcGg6IGRpc2tHcmFwaCxcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnbGVmdCcsXG4gICAgICAgICAgICB0aWNrRm9ybWF0OiBSaWNrc2hhdy5GaXh0dXJlcy5OdW1iZXIuZm9ybWF0S01CVCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZVRhYiArICdEaXNrWUF4aXMnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGRpc2tIb3ZlckRldGFpbCA9IG5ldyBSaWNrc2hhdy5HcmFwaC5Ib3ZlckRldGFpbCh7XG4gICAgICAgICAgICBncmFwaDogZGlza0dyYXBoLFxuICAgICAgICAgICAgZm9ybWF0dGVyOiBmdW5jdGlvbihzZXJpZXMsIHgsIHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3dhdGNoID0gJzxzcGFuIGNsYXNzPVwiZGV0YWlsX3N3YXRjaFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogJyArIHNlcmllcy5jb2xvciArICdcIj48L3NwYW4+JztcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHN3YXRjaCArIHNlcmllcy5uYW1lICsgXCI6IFwiICsgbmV3IE51bWJlcih5LygxMDI0ICogMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpICsgJ0dCPGJyPic7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBkaXNrTGVnZW5kID0gbmV3IFJpY2tzaGF3LkdyYXBoLkxlZ2VuZCh7XG4gICAgICAgICAgICBncmFwaDogZGlza0dyYXBoLFxuICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlVGFiICsgJ0Rpc2tMZWdlbmQnKVxuICAgICAgICB9KTtcblxuICAgICAgICBkaXNrR3JhcGgucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgJHNjb3BlLnVwZGF0ZUdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjdGl2ZVRhYiA9ICRzY29wZS5hY3RpdmVUYWI7XG4gICAgICAgdmFyIGZyb20gPSAnLTI0aG91cnMnO1xuICAgICAgICBzd2l0Y2ggKGFjdGl2ZVRhYikge1xuICAgICAgICBjYXNlICdkYXknOiBmcm9tID0gJy0yNGhvdXJzJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbnRoJzogZnJvbSA9ICctMW1vbnRoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOiBmcm9tID0gJy0xeWVhcic7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiBjb25zb2xlLmxvZygnaW50ZXJuYWwgZXJycm9yJyk7XG4gICAgICAgIH1cblxuICAgICAgICBDbGllbnQuZ3JhcGhzKFsgY3B1VXNhZ2VUYXJnZXQsIG5ldHdvcmtVc2FnZVR4VGFyZ2V0LCBuZXR3b3JrVXNhZ2VSeFRhcmdldCwgZGlza1VzYWdlQXBwc1VzZWRUYXJnZXQsIGRpc2tVc2FnZURhdGFVc2VkVGFyZ2V0IF0sIGZyb20sIGZ1bmN0aW9uIChlcnJvciwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gY29uc29sZS5sb2coZXJyb3IpO1xuXG4gICAgICAgICAgICByZW5kZXJDcHUoYWN0aXZlVGFiLCBkYXRhWzBdKTtcblxuICAgICAgICAgICAgcmVuZGVyTmV0d29yayhhY3RpdmVUYWIsIGRhdGFbMV0sIGRhdGFbMl0pO1xuXG4gICAgICAgICAgICByZW5kZXJEaXNrKGFjdGl2ZVRhYiwgZGF0YVszXSwgZGF0YVs0XSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQub25SZWFkeSgkc2NvcGUudXBkYXRlR3JhcGhzKTtcbn1dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ0FwcGxpY2F0aW9uJykuY29udHJvbGxlcignVXNlcnNDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGxvY2F0aW9uJywgJ0NsaWVudCcsIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgQ2xpZW50KSB7XG4gICAgQ2xpZW50Lm9uUmVhZHkoZnVuY3Rpb24gKCkgeyBpZiAoIUNsaWVudC5nZXRVc2VySW5mbygpLmFkbWluKSAkbG9jYXRpb24ucGF0aCgnLycpOyB9KTtcblxuICAgICRzY29wZS5yZWFkeSA9IGZhbHNlO1xuICAgICRzY29wZS51c2VycyA9IFtdO1xuICAgICRzY29wZS51c2VySW5mbyA9IENsaWVudC5nZXRVc2VySW5mbygpO1xuXG4gICAgJHNjb3BlLnVzZXJyZW1vdmUgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIHVzZXJJbmZvOiB7fSxcbiAgICAgICAgdXNlcm5hbWU6ICcnLFxuICAgICAgICBwYXNzd29yZDogJydcbiAgICB9O1xuXG4gICAgJHNjb3BlLnVzZXJhZGQgPSB7XG4gICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICBhbHJlYWR5VGFrZW46IGZhbHNlLFxuICAgICAgICBlcnJvcjoge30sXG4gICAgICAgIHVzZXJuYW1lOiAnJyxcbiAgICAgICAgZW1haWw6ICcnXG4gICAgfTtcblxuICAgICRzY29wZS5pc01lID0gZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIudXNlcm5hbWUgPT09IENsaWVudC5nZXRVc2VySW5mbygpLnVzZXJuYW1lO1xuICAgIH07XG5cbiAgICAkc2NvcGUuaXNBZG1pbiA9IGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiAhIXVzZXIuYWRtaW47XG4gICAgfTtcblxuICAgICRzY29wZS50b2dnbGVBZG1pbiA9IGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIENsaWVudC5zZXRBZG1pbih1c2VyLnVzZXJuYW1lLCAhdXNlci5hZG1pbiwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgdXNlci5hZG1pbiA9ICF1c2VyLmFkbWluO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvQWRkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkc2NvcGUudXNlcmFkZC5hbHJlYWR5VGFrZW4gPSAnJztcbiAgICAgICAgJHNjb3BlLnVzZXJhZGQuZXJyb3IudXNlcm5hbWUgPSBudWxsO1xuICAgICAgICAkc2NvcGUudXNlcmFkZC5lcnJvci5lbWFpbCA9IG51bGw7XG5cbiAgICAgICAgQ2xpZW50LmNyZWF0ZVVzZXIoJHNjb3BlLnVzZXJhZGQudXNlcm5hbWUsICRzY29wZS51c2VyYWRkLmVtYWlsLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXNDb2RlID09PSA0MDkpIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUudXNlcmFkZC5hbHJlYWR5VGFrZW4gPSAkc2NvcGUudXNlcm5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1VzZXJuYW1lIGFscmVhZHkgdGFrZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXNDb2RlID09PSA0MDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmRleE9mKCdlbWFpbCcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUudXNlcmFkZC5lcnJvci5lbWFpbCA9ICdJbnZhbGlkIEVtYWlsJztcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVzZXJhZGQuZW1haWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmRleE9mKCd1c2VybmFtZScpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUudXNlcmFkZC5lcnJvci51c2VybmFtZSA9ICdJbnZhbGlkIFVzZXJuYW1lJztcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVzZXJhZGQudXNlcm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBjcmVhdGUgdXNlci4nLCBlcnJvcik7XG5cbiAgICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgICAgICQoJyN1c2VyQWRkTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLnNob3dVc2VyUmVtb3ZlID0gZnVuY3Rpb24gKHVzZXJJbmZvKSB7XG4gICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnVzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAkc2NvcGUudXNlcnJlbW92ZS51c2VySW5mbyA9IHVzZXJJbmZvO1xuICAgICAgICAkKCcjdXNlclJlbW92ZU1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9O1xuXG4gICAgJHNjb3BlLmRvVXNlclJlbW92ZSA9IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnVzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUuZXJyb3IucGFzc3dvcmQgPSBudWxsO1xuXG4gICAgICAgIGlmICgkc2NvcGUudXNlcnJlbW92ZS51c2VybmFtZSAhPT0gJHNjb3BlLnVzZXJyZW1vdmUudXNlckluZm8udXNlcm5hbWUpIHtcbiAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnVzZXJuYW1lID0gJ1VzZXJuYW1lIGRvZXMgbm90IG1hdGNoJztcbiAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLnVzZXJuYW1lID0gJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBDbGllbnQucmVtb3ZlVXNlcigkc2NvcGUudXNlcnJlbW92ZS51c2VySW5mby5pZCwgJHNjb3BlLnVzZXJyZW1vdmUucGFzc3dvcmQsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLmVycm9yLnBhc3N3b3JkID0gJ0luY29ycmVjdCBwYXNzd29yZCc7XG4gICAgICAgICAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUucGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gZGVsZXRlIHVzZXIuJywgZXJyb3IpO1xuXG4gICAgICAgICAgICAkc2NvcGUudXNlcnJlbW92ZS51c2VySW5mbyA9IHt9O1xuICAgICAgICAgICAgJHNjb3BlLnVzZXJyZW1vdmUudXNlcm5hbWUgPSAnJztcbiAgICAgICAgICAgICRzY29wZS51c2VycmVtb3ZlLnBhc3N3b3JkID0gJyc7XG5cbiAgICAgICAgICAgIGZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICBmb3JtLiRzZXRVbnRvdWNoZWQoKTtcblxuICAgICAgICAgICAgJCgnI3VzZXJSZW1vdmVNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cbiAgICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgIENsaWVudC5saXN0VXNlcnMoZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBnZXQgdXNlciBsaXN0aW5nLicsIGVycm9yKTtcblxuICAgICAgICAgICAgJHNjb3BlLnVzZXJzID0gcmVzdWx0LnVzZXJzO1xuICAgICAgICAgICAgJHNjb3BlLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaCgpO1xuXG4gICAgLy8gc2V0dXAgYWxsIHRoZSBkaWFsb2cgZm9jdXMgaGFuZGxpbmdcbiAgICBbJ3VzZXJBZGRNb2RhbCcsICd1c2VyUmVtb3ZlTW9kYWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAkKCcjJyArIGlkKS5vbignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJbYXV0b2ZvY3VzXTpmaXJzdFwiKS5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1dKTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file diff --git a/webadmin/dist/views/apps.html b/webadmin/dist/views/apps.html index 943a7d409..e003261be 100644 --- a/webadmin/dist/views/apps.html +++ b/webadmin/dist/views/apps.html @@ -94,13 +94,21 @@